Update On Thu Jul 11 20:31:01 CEST 2024

This commit is contained in:
github-action[bot]
2024-07-11 20:31:01 +02:00
parent 5a06147e95
commit e20082c9c9
113 changed files with 14850 additions and 5393 deletions
+1
View File
@@ -699,3 +699,4 @@ Update On Sun Jul 7 20:30:22 CEST 2024
Update On Mon Jul 8 20:31:33 CEST 2024
Update On Tue Jul 9 20:32:39 CEST 2024
Update On Wed Jul 10 20:35:20 CEST 2024
Update On Thu Jul 11 20:30:51 CEST 2024
+3 -3
View File
@@ -893,7 +893,7 @@ dependencies = [
"num_cpus",
"objc",
"once_cell",
"open 5.2.0",
"open 5.3.0",
"parking_lot",
"percent-encoding",
"port_scanner",
@@ -3825,9 +3825,9 @@ dependencies = [
[[package]]
name = "open"
version = "5.2.0"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d2c909a3fce3bd80efef4cd1c6c056bd9376a8fe06fcfdbebaf32cb485a7e37"
checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3"
dependencies = [
"is-wsl",
"libc",
@@ -142,8 +142,8 @@ export const clash = () => {
});
};
const deleteConnections = async () => {
return (await buildRequest())(`/connections`, {
const deleteConnections = async (id?: string) => {
return (await buildRequest())(`/connections/${id}`, {
method: "DELETE",
});
};
+6 -11
View File
@@ -16,10 +16,9 @@
"@generouted/react-router": "1.19.6",
"@juggle/resize-observer": "3.4.0",
"@material/material-color-utilities": "0.3.0",
"@mui/icons-material": "5.16.0",
"@mui/lab": "5.0.0-alpha.171",
"@mui/material": "5.16.0",
"@mui/x-data-grid": "7.9.0",
"@mui/icons-material": "5.16.1",
"@mui/lab": "5.0.0-alpha.172",
"@mui/material": "5.16.1",
"@nyanpasu/interface": "workspace:^",
"@nyanpasu/ui": "workspace:^",
"@tauri-apps/api": "1.6.0",
@@ -30,41 +29,37 @@
"framer-motion": "12.0.0-alpha.0",
"i18next": "23.11.5",
"jotai": "2.9.0",
"material-react-table": "2.13.0",
"monaco-editor": "0.50.0",
"mui-color-input": "3.0.0",
"react": "18.3.1",
"react-dom": "18.3.1",
"react-error-boundary": "4.0.13",
"react-fast-marquee": "1.6.5",
"react-hook-form": "7.52.1",
"react-hook-form-mui": "7.0.1",
"react-i18next": "14.1.2",
"react-markdown": "9.0.1",
"react-router-dom": "6.24.1",
"react-transition-group": "4.4.5",
"react-virtuoso": "4.7.10",
"react-split-grid": "1.0.4",
"swr": "2.2.5",
"virtua": "0.33.2"
},
"devDependencies": {
"@emotion/babel-plugin": "11.11.0",
"@emotion/react": "11.11.4",
"@types/js-cookie": "3.0.6",
"@types/react": "18.3.3",
"@types/react-dom": "18.3.0",
"@types/react-transition-group": "4.4.10",
"@typescript-eslint/eslint-plugin": "7.16.0",
"@typescript-eslint/parser": "7.16.0",
"@vitejs/plugin-react": "4.3.1",
"@vitejs/plugin-react-swc": "3.7.0",
"clsx": "2.1.1",
"react-resizable-panels": "2.0.20",
"sass": "1.77.7",
"shiki": "1.10.3",
"tailwindcss-textshadow": "2.1.3",
"vite": "5.3.3",
"vite-plugin-monaco-editor": "1.1.3",
"vite-plugin-sass-dts": "1.3.22",
"vite-plugin-sass-dts": "1.3.24",
"vite-plugin-svgr": "4.2.0",
"vite-tsconfig-paths": "4.3.2"
}
@@ -0,0 +1,4 @@
:root {
--focus-border: transparent !important;
--separator-border: transparent !important;
}
@@ -1,12 +1,15 @@
import getSystem from "@/utils/get-system";
import Paper from "@mui/material/Paper";
import { appWindow } from "@tauri-apps/api/window";
import { ReactNode } from "react";
import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
import { ReactNode, useEffect } from "react";
import { LayoutControl } from "../layout/layout-control";
import styles from "./app-container.module.scss";
import AppDrawer from "./app-drawer";
import { alpha, useTheme } from "@mui/material";
import { Allotment } from "allotment";
import "allotment/dist/style.css";
import "./app-container.scss";
import DrawerContent from "./drawer-content";
const OS = getSystem();
@@ -24,6 +27,10 @@ export const AppContainer = ({
const { palette } = useTheme();
useEffect(() => {
console.log(isDrawer);
}, [isDrawer]);
return (
<Paper
square
@@ -38,33 +45,35 @@ export const AppContainer = ({
e.preventDefault();
}}
>
<PanelGroup autoSaveId="layout_sidebar" direction="horizontal">
<AppDrawer isDrawer={isDrawer} data-windrag />
{isDrawer && <AppDrawer data-windrag isDrawer />}
{!isDrawer && <PanelResizeHandle className={styles["resize-bar"]} />}
<Allotment separator proportionalLayout={false}>
{!isDrawer && (
<Allotment.Pane className="h-full" minSize={96} maxSize={260}>
<DrawerContent data-windrag />
</Allotment.Pane>
)}
<Panel order={2} minSize={50}>
<div className={styles.container}>
{OS === "windows" && (
<LayoutControl className="fixed right-6 top-1.5 !z-top" />
)}
{OS === "macos" && (
<div
className="fixed z-top left-6 top-3 h-8 w-[4.5rem] rounded-full"
style={{ backgroundColor: alpha(palette.primary.main, 0.1) }}
/>
)}
<Allotment.Pane visible={true} className={styles.container}>
{OS === "windows" && (
<LayoutControl className="fixed right-6 top-1.5 !z-top" />
)}
{OS === "macos" && (
<div
className={OS === "macos" ? "h-[2.75rem]" : "h-9"}
data-windrag
className="fixed z-top left-6 top-3 h-8 w-[4.5rem] rounded-full"
style={{ backgroundColor: alpha(palette.primary.main, 0.1) }}
/>
)}
{children}
</div>
</Panel>
</PanelGroup>
<div
className={OS === "macos" ? "h-[2.75rem]" : "h-9"}
data-windrag
/>
{children}
</Allotment.Pane>
</Allotment>
</Paper>
);
};
@@ -1,99 +1,17 @@
import { getRoutesWithIcon } from "@/utils/routes-utils";
import { MenuOpen } from "@mui/icons-material";
import { Backdrop, IconButton, alpha, useTheme } from "@mui/material";
import clsx from "clsx";
import { AnimatePresence, motion } from "framer-motion";
import { useCallback, useState } from "react";
import { Panel } from "react-resizable-panels";
import { useState } from "react";
import AnimatedLogo from "../layout/animated-logo";
import RouteListItem from "./modules/route-list-item";
import { classNames } from "@/utils";
import getSystem from "@/utils/get-system";
import { useNyanpasu } from "@nyanpasu/interface";
import { languageQuirks } from "@/utils/language";
import DrawerContent from "./drawer-content";
export const AppDrawer = ({ isDrawer }: { isDrawer?: boolean }) => {
export const AppDrawer = () => {
const { palette } = useTheme();
const routes = getRoutesWithIcon();
const [open, setOpen] = useState(false);
const { nyanpasuConfig } = useNyanpasu();
const [onlyIcon, setOnlyIcon] = useState(false);
const handleResize = useCallback(
(value?: number) => {
if (value) {
if (
value <
languageQuirks[nyanpasuConfig?.language ?? "en"].drawer.minWidth
) {
setOnlyIcon(true);
} else {
setOnlyIcon(false);
}
} else {
setOnlyIcon(false);
}
},
[nyanpasuConfig?.language],
);
const Content = ({ className }: { className?: string }) => {
return (
<div
className={clsx(
isDrawer ? ["max-w-60", "min-w-28"] : "w-full",
"p-4",
getSystem() === "macos" ? "pt-14" : "pt-8",
"h-full",
"flex",
"flex-col",
"gap-4",
className,
)}
style={{
backgroundColor: "var(--background-color-alpha)",
}}
data-windrag
>
<div className="flex items-center justify-center gap-4 mx-2">
<div className=" h-full max-w-28 max-h-28" data-windrag>
<AnimatedLogo className="w-full h-full" data-windrag />
</div>
{(isDrawer || !onlyIcon) && (
<div
className={classNames(
"text-lg font-bold mt-1 whitespace-pre-wrap",
isDrawer && "mr-1",
)}
data-windrag
>
{"Clash\nNyanpasu"}
</div>
)}
</div>
<div className="flex flex-col gap-2 overflow-y-auto scrollbar-hidden !overflow-x-hidden">
{Object.entries(routes).map(([name, { path, icon }]) => {
return (
<RouteListItem
key={name}
name={name}
path={path}
icon={icon}
onlyIcon={!isDrawer && onlyIcon}
/>
);
})}
</div>
</div>
);
};
const DrawerTitle = () => {
return (
<div
@@ -125,7 +43,7 @@ export const AppDrawer = ({ isDrawer }: { isDrawer?: boolean }) => {
);
};
return isDrawer ? (
return (
<>
<DrawerTitle />
@@ -154,27 +72,12 @@ export const AppDrawer = ({ isDrawer }: { isDrawer?: boolean }) => {
type: "tween",
}}
>
<Content />
<DrawerContent isDrawer className="max-w-64" />
</motion.div>
</div>
</AnimatePresence>
</Backdrop>
</>
) : (
<Panel
id="sidebar"
defaultSize={
languageQuirks[nyanpasuConfig?.language ?? "en"].drawer.minWidth
}
order={1}
minSize={languageQuirks[nyanpasuConfig?.language ?? "en"].drawer.minWidth}
collapsedSize={11}
maxSize={36}
onResize={handleResize}
collapsible
>
<Content />
</Panel>
);
};
@@ -0,0 +1,94 @@
import getSystem from "@/utils/get-system";
import clsx from "clsx";
import AnimatedLogo from "../layout/animated-logo";
import { getRoutesWithIcon } from "@/utils/routes-utils";
import RouteListItem from "./modules/route-list-item";
import { useCallback, useEffect, useRef, useState } from "react";
import { useSize } from "ahooks";
import { languageQuirks } from "@/utils/language";
import { useNyanpasu } from "@nyanpasu/interface";
export const DrawerContent = ({ className }: { className?: string }) => {
const [onlyIcon, setOnlyIcon] = useState(false);
const { nyanpasuConfig } = useNyanpasu();
const routes = getRoutesWithIcon();
const contentRef = useRef<HTMLDivElement | null>(null);
const size = useSize(contentRef.current);
const handleResize = useCallback(
(value?: number) => {
if (value) {
if (
value <
languageQuirks[nyanpasuConfig?.language ?? "en"].drawer.minWidth
) {
setOnlyIcon(true);
} else {
setOnlyIcon(false);
}
} else {
setOnlyIcon(false);
}
},
[nyanpasuConfig?.language],
);
useEffect(() => {
handleResize(size?.width);
}, [size?.width]);
return (
<div
ref={contentRef}
className={clsx(
"p-4",
getSystem() === "macos" ? "pt-14" : "pt-8",
"w-full",
"h-full",
"flex",
"flex-col",
"gap-4",
className,
)}
style={{
backgroundColor: "var(--background-color-alpha)",
}}
data-windrag
>
<div className="flex items-center justify-center gap-4 mx-2">
<div className=" h-full max-w-28 max-h-28" data-windrag>
<AnimatedLogo className="w-full h-full" data-windrag />
</div>
{!onlyIcon && (
<div
className="text-lg font-bold mt-1 mr-1 whitespace-pre-wrap"
data-windrag
>
{"Clash\nNyanpasu"}
</div>
)}
</div>
<div className="flex flex-col gap-2 overflow-y-auto scrollbar-hidden !overflow-x-hidden">
{Object.entries(routes).map(([name, { path, icon }]) => {
return (
<RouteListItem
key={name}
name={name}
path={path}
icon={icon}
onlyIcon={onlyIcon}
/>
);
})}
</div>
</div>
);
};
export default DrawerContent;
@@ -1,24 +1,37 @@
import parseTraffic from "@/utils/parse-traffic";
import { GridColDef, DataGrid } from "@mui/x-data-grid";
import { useClashWS, Connection } from "@nyanpasu/interface";
import {
MaterialReactTable,
useMaterialReactTable,
type MRT_ColumnDef,
} from "material-react-table";
import { useClashWS, Connection, useClash } from "@nyanpasu/interface";
import dayjs from "dayjs";
import { useRef, useMemo } from "react";
import { useTranslation } from "react-i18next";
import HeaderSearch from "./header-search";
import { useLockFn } from "ahooks";
import Cancel from "@mui/icons-material/Cancel";
import { IconButton } from "@mui/material";
import { containsSearchTerm } from "@/utils";
import ContentDisplay from "../base/content-display";
export type TableConnection = Connection.Item &
Connection.Metadata & {
downloadSpeed?: number;
uploadSpeed?: number;
};
export type TableConnection = Connection.Item & {
downloadSpeed?: number;
uploadSpeed?: number;
};
export interface TableMessage extends Omit<Connection.Response, "connections"> {
connections: TableConnection[];
}
export const ConnectionsTable = () => {
export const ConnectionsTable = ({ searchTerm }: { searchTerm?: string }) => {
const { t } = useTranslation();
const { deleteConnections } = useClash();
const closeConnect = useLockFn(async (id?: string) => {
await deleteConnections(id);
});
const {
connections: { latestMessage },
} = useClashWS();
@@ -32,7 +45,13 @@ export const ConnectionsTable = () => {
const updatedConnections: TableConnection[] = [];
result.connections?.forEach((connection) => {
const filteredConnections = searchTerm
? result.connections?.filter((connection) =>
containsSearchTerm(connection, searchTerm),
)
: result.connections;
filteredConnections?.forEach((connection) => {
const previousConnection = historyMessage.current?.connections.find(
(history) => history.id === connection.id,
);
@@ -45,14 +64,8 @@ export const ConnectionsTable = () => {
? connection.upload - previousConnection.upload
: 0;
const host = String(
connection.metadata.host || connection.metadata.destinationIP,
);
updatedConnections.push({
...connection,
...connection.metadata,
host,
downloadSpeed,
uploadSpeed,
});
@@ -63,103 +76,126 @@ export const ConnectionsTable = () => {
historyMessage.current = data;
return data;
}, [latestMessage?.data]);
}, [latestMessage?.data, searchTerm]);
const columns: GridColDef[] = [
const columns: MRT_ColumnDef<TableConnection>[] = [
{
field: "host",
headerName: t("Host"),
flex: 240,
minWidth: 240,
header: t("Actions"),
size: 80,
enableSorting: false,
enableGlobalFilter: false,
accessorFn: ({ id }) => (
<div className="w-full flex justify-center">
<IconButton
color="primary"
className="size-5"
onClick={closeConnect(id)}
>
<Cancel />
</IconButton>
</div>
),
},
{
field: "process",
headerName: t("Process"),
flex: 100,
minWidth: 100,
header: t("Host"),
size: 240,
accessorFn: ({ metadata }) => metadata.host || metadata.destinationIP,
},
{
field: "download",
headerName: t("Download"),
width: 88,
valueFormatter: (value) => parseTraffic(value).join(" "),
header: t("Process"),
size: 140,
accessorFn: ({ metadata }) => metadata.process,
},
{
field: "upload",
headerName: t("Upload"),
width: 88,
valueFormatter: (value) => parseTraffic(value).join(" "),
header: t("Download"),
size: 88,
accessorFn: ({ download }) => parseTraffic(download).join(" "),
},
{
field: "downloadSpeed",
headerName: t("DL Speed"),
width: 88,
valueFormatter: (value) => parseTraffic(value).join(" ") + "/s",
header: t("Upload"),
size: 88,
accessorFn: ({ upload }) => parseTraffic(upload).join(" "),
},
{
field: "uploadSpeed",
headerName: t("UL Speed"),
width: 88,
valueFormatter: (value) => parseTraffic(value).join(" ") + "/s",
header: t("DL Speed"),
size: 88,
accessorFn: ({ downloadSpeed }) =>
parseTraffic(downloadSpeed).join(" ") + "/s",
},
{
field: "chains",
headerName: t("Chains"),
flex: 360,
minWidth: 360,
valueFormatter: (value) => [...value].reverse().join(" / "),
header: t("UL Speed"),
size: 88,
accessorFn: ({ uploadSpeed }) =>
parseTraffic(uploadSpeed).join(" ") + "/s",
},
{
field: "rule",
headerName: "Rule",
flex: 300,
minWidth: 250,
header: t("Chains"),
size: 360,
accessorFn: ({ chains }) => [...chains].reverse().join(" / "),
},
{
field: "start",
headerName: t("Time"),
flex: 120,
minWidth: 100,
valueFormatter: (value) => dayjs(value).fromNow(),
header: "Rule",
size: 200,
accessorFn: ({ rule, rulePayload }) =>
rulePayload ? `${rule} (${rulePayload})` : rule,
},
{
field: "source",
headerName: "Source",
flex: 200,
minWidth: 130,
header: t("Time"),
size: 120,
accessorFn: ({ start }) => dayjs(start).fromNow(),
},
{
field: "destinationIP",
headerName: t("Destination IP"),
flex: 200,
minWidth: 130,
header: "Source",
size: 200,
accessorFn: ({ metadata: { sourceIP, sourcePort } }) =>
`${sourceIP}:${sourcePort}`,
},
{
field: "type",
headerName: t("Type"),
flex: 160,
minWidth: 100,
header: t("Destination"),
size: 200,
accessorFn: ({ metadata: { destinationIP, destinationPort } }) =>
`${destinationIP}:${destinationPort}`,
},
{
accessorKey: "type",
header: t("Type"),
size: 160,
},
];
return (
connectionsMessage?.connections && (
<DataGrid
rows={connectionsMessage.connections}
columns={columns}
density="compact"
autosizeOnMount
hideFooter
disableColumnFilter
disableColumnSelector
disableDensitySelector
sx={{ border: "none", "div:focus": { outline: "none !important" } }}
className="!absolute !h-full !w-full"
slots={{
toolbar: HeaderSearch,
}}
/>
)
const table = useMaterialReactTable({
columns,
data: connectionsMessage?.connections ?? [],
initialState: {
density: "compact",
},
defaultDisplayColumn: {
enableResizing: true,
},
enableTopToolbar: false,
enableColumnActions: false,
enablePagination: false,
enableBottomToolbar: false,
enableColumnResizing: true,
enableGlobalFilterModes: true,
enableColumnPinning: true,
muiTableContainerProps: {
sx: { minHeight: "100%" },
className: "!absolute !h-full !w-full",
},
enableRowVirtualization: true,
enableColumnVirtualization: true,
rowVirtualizerOptions: { overscan: 5 },
columnVirtualizerOptions: { overscan: 2 },
});
return connectionsMessage?.connections.length ? (
<MaterialReactTable table={table} />
) : (
<ContentDisplay
className="!absolute !h-full !w-full"
message="No Connection"
/>
);
};
@@ -1,9 +1,13 @@
import { FilledInputProps, Portal, alpha, useTheme } from "@mui/material";
import { GridToolbarQuickFilter } from "@mui/x-data-grid";
import { Fragment } from "react";
import {
FilledInputProps,
TextField,
TextFieldProps,
alpha,
useTheme,
} from "@mui/material";
import { useTranslation } from "react-i18next";
export const HeaderSearch = () => {
export const HeaderSearch = (props: TextFieldProps) => {
const { t } = useTranslation();
const { palette } = useTheme();
@@ -24,20 +28,17 @@ export const HeaderSearch = () => {
};
return (
<Fragment>
<Portal container={() => document.getElementById("filter-panel")}>
<GridToolbarQuickFilter
autoComplete="off"
spellCheck="false"
hiddenLabel
placeholder={t("Type to Filter")}
variant="filled"
className="!pb-0"
sx={{ input: { py: 1, fontSize: 14 } }}
InputProps={inputProps}
/>
</Portal>
</Fragment>
<TextField
autoComplete="off"
spellCheck="false"
hiddenLabel
placeholder={t("Type to Filter")}
variant="filled"
className="!pb-0"
sx={{ input: { py: 1, fontSize: 14 } }}
InputProps={inputProps}
{...props}
/>
);
};
@@ -1,83 +0,0 @@
import useSWR, { mutate } from "swr";
import { useLockFn } from "ahooks";
import {
getAxios,
getClashConfig,
getVersion,
updateConfigs,
} from "@/services/api";
import { getClashInfo, patchClashConfig } from "@/services/cmds";
export const useClash = () => {
const { data: clash, mutate: mutateClash } = useSWR(
"getClashConfig",
getClashConfig,
);
const { data: versionData, mutate: mutateVersion } = useSWR(
"getVersion",
getVersion,
);
const patchClash = useLockFn(async (patch: Partial<IConfigData>) => {
await updateConfigs(patch);
await patchClashConfig(patch);
mutateClash();
});
const version = versionData?.premium
? `${versionData.version} Premium`
: versionData?.meta
? `${versionData.version} Meta`
: versionData?.version || "-";
return {
clash,
version,
mutateClash,
mutateVersion,
patchClash,
};
};
export const useClashInfo = () => {
const { data: clashInfo, mutate: mutateInfo } = useSWR(
"getClashInfo",
getClashInfo,
);
const patchInfo = async (
patch: Partial<
Pick<IConfigData, "mixed-port" | "external-controller" | "secret">
>,
) => {
const hasInfo =
patch["mixed-port"] != null ||
patch["external-controller"] != null ||
patch.secret != null;
if (!hasInfo) return;
if (patch["mixed-port"]) {
const port = patch["mixed-port"];
if (port < 1000) {
throw new Error("The port should not < 1000");
}
if (port > 65536) {
throw new Error("The port should not > 65536");
}
}
await patchClashConfig(patch);
mutateInfo();
mutate("getClashConfig");
// 刷新接口
getAxios(true);
};
return {
clashInfo,
mutateInfo,
patchInfo,
};
};
@@ -1,20 +0,0 @@
import useSWR from "swr";
import { getVergeConfig, patchVergeConfig } from "@/services/cmds";
export const useVerge = () => {
const { data: verge, mutate: mutateVerge } = useSWR(
"getVergeConfig",
getVergeConfig,
);
const patchVerge = async (value: Partial<IVergeConfig>) => {
await patchVergeConfig(value);
mutateVerge();
};
return {
verge,
mutateVerge,
patchVerge,
};
};
@@ -1,66 +0,0 @@
import { useRef, useEffect } from "react";
export type WsMsgFn = (event: MessageEvent<any>) => void;
export interface WsOptions {
errorCount?: number; // default is 5
retryInterval?: number; // default is 2500
onError?: () => void;
}
export const useWebsocket = (onMessage: WsMsgFn, options?: WsOptions) => {
const wsRef = useRef<WebSocket | null>(null);
const timerRef = useRef<number | null>(null);
const disconnect = () => {
if (wsRef.current) {
wsRef.current.close();
wsRef.current = null;
}
if (timerRef.current) {
clearTimeout(timerRef.current);
}
};
const connect = (url: string) => {
let errorCount = options?.errorCount ?? 5;
const retryInterval = options?.retryInterval ?? 2500;
if (!url) return;
const connectHelper = () => {
disconnect();
const ws = new WebSocket(url);
wsRef.current = ws;
ws.addEventListener("message", onMessage);
ws.addEventListener("error", () => {
errorCount -= 1;
if (errorCount >= 0) {
timerRef.current = window.setTimeout(connectHelper, retryInterval);
} else {
disconnect();
options?.onError?.();
}
});
ws.addEventListener("close", () => {
// WebSocket connection closed, attempt to reconnect
timerRef.current = window.setTimeout(connectHelper, retryInterval);
});
};
connectHelper();
};
useEffect(() => {
// Cleanup on component unmount
return () => {
disconnect();
};
}, []);
return { connect, disconnect };
};
@@ -1,22 +1,32 @@
import CloseConnectionsButton from "@/components/connections/close-connections-button";
import ConnectionsTable from "@/components/connections/connections-table";
import HeaderSearch from "@/components/connections/header-search";
import { BasePage } from "@nyanpasu/ui";
import { useThrottle } from "ahooks";
import { useState } from "react";
import { useTranslation } from "react-i18next";
export const Connections = () => {
const { t } = useTranslation();
const [searchTerm, setSearchTerm] = useState<string>();
const throttledSearchTerm = useThrottle(searchTerm, { wait: 150 });
return (
<BasePage
title={t("Connections")}
full
header={
<div className=" max-h-96">
<div id="filter-panel" />
<div className="max-h-96">
<HeaderSearch
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
</div>
}
>
<ConnectionsTable />
<ConnectionsTable searchTerm={throttledSearchTerm} />
<CloseConnectionsButton />
</BasePage>
@@ -1,3 +1,5 @@
import { includes, isArray, isObject, isString, some } from "lodash-es";
/**
* classNames filter out falsy values and join the rest with a space
* @param classes - array of classes
@@ -11,3 +13,17 @@ export function classNames(...classes: any[]) {
export async function sleep(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
export const containsSearchTerm = (obj: any, term: string): boolean => {
if (!obj || !term) return false;
if (isString(obj)) {
return includes(obj.toLowerCase(), term.toLowerCase());
}
if (isObject(obj) || isArray(obj)) {
return some(obj, (value: any) => containsSearchTerm(value, term));
}
return false;
};
@@ -14,18 +14,18 @@ export const languageQuirks: {
} = {
zh: {
drawer: {
minWidth: 22,
minWidth: 180,
itemClassNames: "text-center",
},
},
en: {
drawer: {
minWidth: 26,
minWidth: 240,
},
},
ru: {
drawer: {
minWidth: 26,
minWidth: 240,
},
},
};
@@ -0,0 +1,23 @@
import { FC, ReactNode, memo } from "react";
export const Header: FC<{ title?: ReactNode; header?: ReactNode }> = memo(
function Header({
title,
header,
}: {
title?: ReactNode;
header?: ReactNode;
}) {
return (
<header className="pl-2 select-none" data-windrag>
<h1 className="mb-1 text-4xl font-medium" data-windrag>
{title}
</h1>
{header}
</header>
);
},
);
export default Header;
@@ -1,7 +1,7 @@
import { ReactNode, FC, CSSProperties, memo, useRef, useEffect } from "react";
import Typography from "@mui/material/Typography";
import { ReactNode, FC, CSSProperties, useRef, useEffect } from "react";
import { BaseErrorBoundary } from "./baseErrorBoundary";
import "./style.scss";
import Header from "./header";
interface Props {
title?: ReactNode;
@@ -12,26 +12,6 @@ interface Props {
children?: ReactNode;
}
const Header: FC<{ title?: ReactNode; header?: ReactNode }> = memo(
function Header({
title,
header,
}: {
title?: ReactNode;
header?: ReactNode;
}) {
return (
<header style={{ userSelect: "none" }} data-windrag>
<Typography variant="h4" component="h1" fontWeight={500} data-windrag>
{title}
</Typography>
{header}
</header>
);
},
);
export const BasePage: FC<Props> = ({
title,
header,
@@ -34,6 +34,8 @@
}
&.no-padding {
scrollbar-gutter: unset;
.MDYBasePage-content {
overflow: visible;
@@ -1,10 +1,10 @@
import { ReactNode, FC, memo } from "react";
import { ReactNode, FC } from "react";
import Divider from "@mui/material/Divider";
import Toolbar from "@mui/material/Toolbar";
import Typography from "@mui/material/Typography";
import { BaseErrorBoundary } from "../basePage/baseErrorBoundary";
import style from "./style.module.scss";
import { motion } from "framer-motion";
import Header from "../basePage/header";
interface Props {
title?: ReactNode;
@@ -18,26 +18,6 @@ interface Props {
flexReverse?: boolean;
}
const Header: FC<{ title?: ReactNode; header?: ReactNode }> = memo(
function Header({
title,
header,
}: {
title?: ReactNode;
header?: ReactNode;
}) {
return (
<header style={{ userSelect: "none" }} data-windrag>
<Typography variant="h4" component="h1" fontWeight={500} data-windrag>
{title}
</Typography>
{header}
</header>
);
},
);
export const SidePage: FC<Props> = ({
title,
header,
+3 -3
View File
@@ -5,9 +5,9 @@
"module": "index.ts",
"dependencies": {
"@material/material-color-utilities": "0.3.0",
"@mui/icons-material": "5.16.0",
"@mui/lab": "5.0.0-alpha.171",
"@mui/material": "5.16.0",
"@mui/icons-material": "5.16.1",
"@mui/lab": "5.0.0-alpha.172",
"@mui/material": "5.16.1",
"@radix-ui/react-dialog": "1.1.1",
"@tauri-apps/api": "1.6.0",
"@types/d3": "7.4.3",
+1 -1
View File
@@ -104,7 +104,7 @@
"stylelint-config-standard": "36.0.1",
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
"stylelint-order": "6.0.4",
"stylelint-scss": "6.4.0",
"stylelint-scss": "6.4.1",
"tailwindcss": "3.4.4",
"tsx": "4.16.2",
"typescript": "5.5.3"
+304 -130
View File
@@ -128,8 +128,8 @@ importers:
specifier: 6.0.4
version: 6.0.4(stylelint@16.6.1(typescript@5.5.3))
stylelint-scss:
specifier: 6.4.0
version: 6.4.0(stylelint@16.6.1(typescript@5.5.3))
specifier: 6.4.1
version: 6.4.1(stylelint@16.6.1(typescript@5.5.3))
tailwindcss:
specifier: 3.4.4
version: 3.4.4
@@ -186,17 +186,14 @@ importers:
specifier: 0.3.0
version: 0.3.0
'@mui/icons-material':
specifier: 5.16.0
version: 5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
specifier: 5.16.1
version: 5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/lab':
specifier: 5.0.0-alpha.171
version: 5.0.0-alpha.171(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
specifier: 5.0.0-alpha.172
version: 5.0.0-alpha.172(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material':
specifier: 5.16.0
version: 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/x-data-grid':
specifier: 7.9.0
version: 7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
specifier: 5.16.1
version: 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@nyanpasu/interface':
specifier: workspace:^
version: link:../interface
@@ -227,12 +224,15 @@ importers:
jotai:
specifier: 2.9.0
version: 2.9.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
material-react-table:
specifier: 2.13.0
version: 2.13.0(anywsq46gdagafemjlmocwrkqu)
monaco-editor:
specifier: 0.50.0
version: 0.50.0
mui-color-input:
specifier: 3.0.0
version: 3.0.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
version: 3.0.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
react:
specifier: npm:react@rc
version: 19.0.0-rc-df783f9ea1-20240708
@@ -245,12 +245,9 @@ importers:
react-fast-marquee:
specifier: 1.6.5
version: 1.6.5(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
react-hook-form:
specifier: 7.52.1
version: 7.52.1(react@19.0.0-rc-df783f9ea1-20240708)
react-hook-form-mui:
specifier: 7.0.1
version: 7.0.1(addvybcbawtwkjqnoojx6y4g5m)
version: 7.0.1(7cllkcphevtaad3vgre6vmruby)
react-i18next:
specifier: 14.1.2
version: 14.1.2(i18next@23.11.5)(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
@@ -260,12 +257,9 @@ importers:
react-router-dom:
specifier: 6.24.1
version: 6.24.1(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
react-transition-group:
specifier: 4.4.5
version: 4.4.5(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
react-virtuoso:
specifier: 4.7.10
version: 4.7.10(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
react-split-grid:
specifier: 1.0.4
version: 1.0.4(react@19.0.0-rc-df783f9ea1-20240708)
swr:
specifier: 2.2.5
version: 2.2.5(react@19.0.0-rc-df783f9ea1-20240708)
@@ -279,18 +273,12 @@ importers:
'@emotion/react':
specifier: 11.11.4
version: 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@types/js-cookie':
specifier: 3.0.6
version: 3.0.6
'@types/react':
specifier: npm:types-react@rc
version: types-react@19.0.0-rc.1
'@types/react-dom':
specifier: npm:types-react-dom@rc
version: types-react-dom@19.0.0-rc.1
'@types/react-transition-group':
specifier: 4.4.10
version: 4.4.10
'@typescript-eslint/eslint-plugin':
specifier: 7.16.0
version: 7.16.0(@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)
@@ -306,9 +294,6 @@ importers:
clsx:
specifier: 2.1.1
version: 2.1.1
react-resizable-panels:
specifier: 2.0.20
version: 2.0.20(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
sass:
specifier: 1.77.7
version: 1.77.7
@@ -325,8 +310,8 @@ importers:
specifier: npm:vite-plugin-monaco-editor-new@1.1.3
version: vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.50.0)
vite-plugin-sass-dts:
specifier: 1.3.22
version: 1.3.22(postcss@8.4.39)(prettier@3.3.2)(sass@1.77.7)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0))
specifier: 1.3.24
version: 1.3.24(postcss@8.4.39)(prettier@3.3.2)(sass@1.77.7)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0))
vite-plugin-svgr:
specifier: 4.2.0
version: 4.2.0(rollup@4.17.2)(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0))
@@ -340,14 +325,14 @@ importers:
specifier: 0.3.0
version: 0.3.0
'@mui/icons-material':
specifier: 5.16.0
version: 5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
specifier: 5.16.1
version: 5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/lab':
specifier: 5.0.0-alpha.171
version: 5.0.0-alpha.171(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
specifier: 5.0.0-alpha.172
version: 5.0.0-alpha.172(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material':
specifier: 5.16.0
version: 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
specifier: 5.16.1
version: 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@radix-ui/react-dialog':
specifier: 1.1.1
version: 1.1.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
@@ -1129,11 +1114,11 @@ packages:
'@types/react':
optional: true
'@mui/core-downloads-tracker@5.16.0':
resolution: {integrity: sha512-8SLffXYPRVpcZx5QzxNE8fytTqzp+IuU3deZbQWg/vSaTlDpR5YVrQ4qQtXTi5cRdhOufV5INylmwlKK+//nPw==}
'@mui/core-downloads-tracker@5.16.1':
resolution: {integrity: sha512-62Jq7ACYi/55Kjkh/nVfEL3F3ytTYTsdB8MGJ9iI+eRQv+Aoem5CPUAzQihUo25qqh1VkVu9/jQn3dFbyrXHgw==}
'@mui/icons-material@5.16.0':
resolution: {integrity: sha512-6ISoOhkp9w5gD0PEW9JklrcbyARDkFWNTBdwXZ1Oy5IGlyu9B0zG0hnUIe4H17IaF1Vgj6C8VI+v4tkSdK0veg==}
'@mui/icons-material@5.16.1':
resolution: {integrity: sha512-ogQPweYba4+5XZykilwxn2/oS78uwoQ0BVBpOhhCJo0ooZsqTTsalhzP2qD/RdGqMQ8xyXPz1sYM2djTruVVVA==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@mui/material': ^5.0.0
@@ -1143,8 +1128,8 @@ packages:
'@types/react':
optional: true
'@mui/lab@5.0.0-alpha.171':
resolution: {integrity: sha512-/ZRnx0wB7hWHMsy76AAUJREVHZ7v5kOKwgJKCQrqOcaPNyo3WiwtTqKaM4Pgj+2r7O10IrC6zOniq8kTRqVAlA==}
'@mui/lab@5.0.0-alpha.172':
resolution: {integrity: sha512-stpa3WTsDE1HamFR4eeS6Bhxalm+u9FhzzNph/PrDMdWSRBHlJs2mqvZ6FEoO22O7MOCwNMqbXTkvEwsyEf0ew==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -1161,8 +1146,8 @@ packages:
'@types/react':
optional: true
'@mui/material@5.16.0':
resolution: {integrity: sha512-DbR1NckTLpjt9Zut9EGQ70th86HfN0BYQgyYro6aXQrNfjzSwe3BJS1AyBQ5mJ7TdL6YVRqohfukxj9JlqZZUg==}
'@mui/material@5.16.1':
resolution: {integrity: sha512-BGTgJRb0d/hX9tus5CEb6N/Fo8pE4tYA+s9r4/S0PCrtZ3urCLXlTH4qrAvggQbiF1cYRAbHCkVHoQ+4Pdxl+w==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -1188,6 +1173,16 @@ packages:
'@types/react':
optional: true
'@mui/private-theming@5.16.1':
resolution: {integrity: sha512-2EGCKnAlq9vRIFj61jNWNXlKAxXp56577OVvsts7fAqRx+G1y6F+N7Q198SBaz8jYQeGKSz8ZMXK/M3FqjdEyw==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/react': npm:types-react@rc
react: npm:react@rc
peerDependenciesMeta:
'@types/react':
optional: true
'@mui/styled-engine@5.15.14':
resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==}
engines: {node: '>=12.0.0'}
@@ -1201,6 +1196,19 @@ packages:
'@emotion/styled':
optional: true
'@mui/styled-engine@5.16.1':
resolution: {integrity: sha512-JwWUBaYR8HHCFefSeos0z6JoTbu0MnjAuNHu4QoDgPxl2EE70XH38CsKay66Iy0QkNWmGTRXVU2sVFgUOPL/Dw==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.4.1
'@emotion/styled': ^11.3.0
react: npm:react@rc
peerDependenciesMeta:
'@emotion/react':
optional: true
'@emotion/styled':
optional: true
'@mui/system@5.16.0':
resolution: {integrity: sha512-9YbkC2m3+pNumAvubYv+ijLtog6puJ0fJ6rYfzfLCM47pWrw3m+30nXNM8zMgDaKL6vpfWJcCXm+LPaWBpy7sw==}
engines: {node: '>=12.0.0'}
@@ -1217,6 +1225,22 @@ packages:
'@types/react':
optional: true
'@mui/system@5.16.1':
resolution: {integrity: sha512-VaFcClC+uhvIEzhzcNmh9FRBvrG9IPjsOokhj6U1HPZsFnLzHV7AD7dJcT6LxWoiIZj9Ej0GK+MGh/b8+BtSlQ==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
'@emotion/styled': ^11.3.0
'@types/react': npm:types-react@rc
react: npm:react@rc
peerDependenciesMeta:
'@emotion/react':
optional: true
'@emotion/styled':
optional: true
'@types/react':
optional: true
'@mui/types@7.2.14':
resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==}
peerDependencies:
@@ -1225,6 +1249,14 @@ packages:
'@types/react':
optional: true
'@mui/types@7.2.15':
resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==}
peerDependencies:
'@types/react': npm:types-react@rc
peerDependenciesMeta:
'@types/react':
optional: true
'@mui/utils@5.16.0':
resolution: {integrity: sha512-kLLi5J1xY+mwtUlMb8Ubdxf4qFAA1+U7WPBvjM/qQ4CIwLCohNb0sHo1oYPufjSIH/Z9+dhVxD7dJlfGjd1AVA==}
engines: {node: '>=12.0.0'}
@@ -1235,19 +1267,51 @@ packages:
'@types/react':
optional: true
'@mui/x-data-grid@7.9.0':
resolution: {integrity: sha512-RkrVD+tfcR/h3j2p2uqohxA00C5tCJIV5gb5+2ap8XdM0Y8XMF81bB8UADWenU5W83UTErWvtU7n4gCl7hJO9g==}
'@mui/utils@5.16.1':
resolution: {integrity: sha512-4UQzK46tAEYs2xZv79hRiIc3GxZScd00kGPDadNrGztAEZlmSaUY8cb9ITd2xCiTfzsx5AN6DH8aaQ8QEKJQeQ==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/react': npm:types-react@rc
react: npm:react@rc
peerDependenciesMeta:
'@types/react':
optional: true
'@mui/x-date-pickers@7.9.0':
resolution: {integrity: sha512-GMDprioHlYmNle8Cbh6TxB4QThDGgqJxfH/R/p/5dNk+Tn5vB1gZSDMn3wVxItiEV6tDXbkyS5gPhSMVFDGvAA==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.9.0
'@emotion/styled': ^11.8.1
'@mui/material': ^5.15.14
date-fns: ^2.25.0 || ^3.2.0
date-fns-jalali: ^2.13.0-0 || ^3.2.0-0
dayjs: ^1.10.7
luxon: ^3.0.2
moment: ^2.29.4
moment-hijri: ^2.1.2
moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0
react: npm:react@rc
react-dom: npm:react-dom@rc
'@mui/x-internals@7.9.0':
resolution: {integrity: sha512-RJRrM6moaDZ8S11gDt8OKVclKm2v9khpIyLkpenNze+tT4dQYoU3liW5P2t31hA4Na/T6JQKNosB4qmB2TYfZw==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: npm:react@rc
peerDependenciesMeta:
'@emotion/react':
optional: true
'@emotion/styled':
optional: true
date-fns:
optional: true
date-fns-jalali:
optional: true
dayjs:
optional: true
luxon:
optional: true
moment:
optional: true
moment-hijri:
optional: true
moment-jalaali:
optional: true
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@@ -1830,6 +1894,30 @@ packages:
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
engines: {node: '>=10'}
'@tanstack/match-sorter-utils@8.15.1':
resolution: {integrity: sha512-PnVV3d2poenUM31ZbZi/yXkBu3J7kd5k2u51CGwwNojag451AjTH9N6n41yjXz2fpLeewleyLBmNS6+HcGDlXw==}
engines: {node: '>=12'}
'@tanstack/react-table@8.16.0':
resolution: {integrity: sha512-rKRjnt8ostqN2fercRVOIH/dq7MAmOENCMvVlKx6P9Iokhh6woBGnIZEkqsY/vEJf1jN3TqLOb34xQGLVRuhAg==}
engines: {node: '>=12'}
peerDependencies:
react: npm:react@rc
react-dom: npm:react-dom@rc
'@tanstack/react-virtual@3.3.0':
resolution: {integrity: sha512-QFxmTSZBniq15S0vSZ55P4ToXquMXwJypPXyX/ux7sYo6a2FX3/zWoRLLc4eIOGWTjvzqcIVNKhcuFb+OZL3aQ==}
peerDependencies:
react: npm:react@rc
react-dom: npm:react-dom@rc
'@tanstack/table-core@8.16.0':
resolution: {integrity: sha512-dCG8vQGk4js5v88/k83tTedWOwjGnIyONrKpHpfmSJB8jwFHl8GSu1sBBxbtACVAPtAQgwNxl0rw1d3RqRM1Tg==}
engines: {node: '>=12'}
'@tanstack/virtual-core@3.3.0':
resolution: {integrity: sha512-A0004OAa1FcUkPHeeGoKgBrAgjH+uHdDPrw1L7RpkwnODYqRvoilqsHPs8cyTjMg1byZBbiNpQAq2TlFLIaQag==}
'@taplo/core@0.1.1':
resolution: {integrity: sha512-BG/zLGf5wiNXGEVPvUAAX/4ilB3PwDUY2o0MV0y47mZbDZ9ad9UK/cIQsILat3bqbPJsALVbU6k3cskNZ3vAQg==}
@@ -2046,9 +2134,6 @@ packages:
'@types/http-cache-semantics@4.0.4':
resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
'@types/js-cookie@3.0.6':
resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==}
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
@@ -3594,6 +3679,10 @@ packages:
hast-util-whitespace@3.0.0:
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
highlight-words@1.2.2:
resolution: {integrity: sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==}
engines: {node: '>= 16', npm: '>= 8'}
hoist-non-react-statics@3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
@@ -4180,6 +4269,18 @@ packages:
resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
engines: {node: '>=10'}
material-react-table@2.13.0:
resolution: {integrity: sha512-ds4/cupDsXvoz8K8OpM3UqUyqKoAMkVdvmvP/+ovuWA23fPcjYvFFkUpBxtnZq5GKWM0+SZWzr14KQ1DgKCaFQ==}
engines: {node: '>=16'}
peerDependencies:
'@emotion/react': '>=11.11'
'@emotion/styled': '>=11.11'
'@mui/icons-material': '>=5.11'
'@mui/material': '>=5.13'
'@mui/x-date-pickers': '>=6.15.0'
react: npm:react@rc
react-dom: npm:react-dom@rc
mathml-tag-names@2.1.3:
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
@@ -4959,12 +5060,6 @@ packages:
'@types/react':
optional: true
react-resizable-panels@2.0.20:
resolution: {integrity: sha512-aMbK3VF8U+VBICG+rwhE0Rr/eFZaRzmNq3akBRL1TrayIpLXz7Rbok0//kYeWj6SQRsjcQ3f4eRplJicM+oL6w==}
peerDependencies:
react: npm:react@rc
react-dom: npm:react-dom@rc
react-router-dom@6.24.1:
resolution: {integrity: sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==}
engines: {node: '>=14.0.0'}
@@ -4978,6 +5073,11 @@ packages:
peerDependencies:
react: npm:react@rc
react-split-grid@1.0.4:
resolution: {integrity: sha512-RMEzFFnntgn+u5GFq+ognmv30CsTgrR97zB4RkMx2VSX9Sw8A7fjzCUfw/Avj7m8GCEw19GIjoUQGOQUOOjlcA==}
peerDependencies:
react: npm:react@rc
react-style-singleton@2.2.1:
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
engines: {node: '>=10'}
@@ -4994,13 +5094,6 @@ packages:
react: npm:react@rc
react-dom: npm:react-dom@rc
react-virtuoso@4.7.10:
resolution: {integrity: sha512-l+fnBf/G1Fp6pHCnhFq2Ra4lkZtT6c5XrS9rCS0OA6de7WGLZviCo0y61CUZZG79TeAw3L7O4czeNPiqh9CIrg==}
engines: {node: '>=10'}
peerDependencies:
react: npm:react@rc
react-dom: npm:react-dom@rc
react@19.0.0-rc-df783f9ea1-20240708:
resolution: {integrity: sha512-sEKaKkgwW0cbYIYhUJoTGNHlcXeJDATtiwwm13RoZgzCIRYkE38nOL1RGnY5xUqalXQS1jEObSJCQSeLLi5sEg==}
engines: {node: '>=0.10.0'}
@@ -5046,6 +5139,9 @@ packages:
remark-rehype@11.1.0:
resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==}
remove-accents@0.5.0:
resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==}
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
@@ -5054,9 +5150,6 @@ packages:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
reselect@4.1.8:
resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==}
reserved-words@0.1.2:
resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==}
@@ -5268,6 +5361,9 @@ packages:
space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
split-grid@1.0.11:
resolution: {integrity: sha512-ELtFtxc3r5we5GZfe6Fi0BFFxIi2M6BY1YEntBscKRDD3zx4JVHqx2VnTRSQu1BixCYSTH3MTjKd4esI2R7EgQ==}
split2@4.2.0:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'}
@@ -5390,8 +5486,8 @@ packages:
peerDependencies:
stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1
stylelint-scss@6.4.0:
resolution: {integrity: sha512-1BKRzh2TW38hZm/IWdvBVjlJRERB2zTiwm1xaOeDtUEmEKfxYMNr9THBQQtBV8wGxal/sN+TRsF7v9A5sqGI1A==}
stylelint-scss@6.4.1:
resolution: {integrity: sha512-+clI2bQC2FPOt06ZwUlXZZ95IO2C5bKTP0GLN1LNQPVvISfSNcgMKv/VTwym1mK9vnqhHbOk8lO4rj4nY7L9pw==}
engines: {node: '>=18.12.0'}
peerDependencies:
stylelint: ^16.0.2
@@ -5755,9 +5851,9 @@ packages:
peerDependencies:
monaco-editor: '>=0.45.0'
vite-plugin-sass-dts@1.3.22:
resolution: {integrity: sha512-N09ApMznYMh8o2ab1HgGxrGnLGk1GPAtS+iZdiZWeq6ftRrKVxYSY99yyaDC6mSHczreb/JAC5HbPhrTSHaPEg==}
engines: {node: 20.x}
vite-plugin-sass-dts@1.3.24:
resolution: {integrity: sha512-t6qxkC8seJJuYmlioKu2QFOJhJgIXwmAGbfOwmZ41QH1eqpqzgQkkXgWVLRf0DlO3FNMPn2y5bO9+R1N7LRgTA==}
engines: {node: '>=20'}
peerDependencies:
postcss: ^8
prettier: ^2.7 || ^3
@@ -6599,8 +6695,8 @@ snapshots:
dependencies:
'@babel/runtime': 7.24.7
'@floating-ui/react-dom': 2.0.9(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
'@mui/types': 7.2.14(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/types': 7.2.15(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@popperjs/core': 2.11.8
clsx: 2.1.1
prop-types: 15.8.1
@@ -6609,24 +6705,24 @@ snapshots:
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
'@mui/core-downloads-tracker@5.16.0': {}
'@mui/core-downloads-tracker@5.16.1': {}
'@mui/icons-material@5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
'@mui/icons-material@5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
react: 19.0.0-rc-df783f9ea1-20240708
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
'@mui/lab@5.0.0-alpha.171(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
'@mui/lab@5.0.0-alpha.172(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/system': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/types': 7.2.14(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/system': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/types': 7.2.15(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
clsx: 2.1.1
prop-types: 15.8.1
react: 19.0.0-rc-df783f9ea1-20240708
@@ -6636,14 +6732,14 @@ snapshots:
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@types/react': types-react@19.0.0-rc.1
'@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
'@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/core-downloads-tracker': 5.16.0
'@mui/system': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/types': 7.2.14(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/core-downloads-tracker': 5.16.1
'@mui/system': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/types': 7.2.15(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@types/react-transition-group': 4.4.10
clsx: 2.1.1
csstype: 3.1.3
@@ -6666,6 +6762,15 @@ snapshots:
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
'@mui/private-theming@5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
prop-types: 15.8.1
react: 19.0.0-rc-df783f9ea1-20240708
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
'@mui/styled-engine@5.15.14(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)':
dependencies:
'@babel/runtime': 7.24.7
@@ -6677,6 +6782,17 @@ snapshots:
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/styled-engine@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)':
dependencies:
'@babel/runtime': 7.24.7
'@emotion/cache': 11.11.0
csstype: 3.1.3
prop-types: 15.8.1
react: 19.0.0-rc-df783f9ea1-20240708
optionalDependencies:
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/system@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
@@ -6693,10 +6809,30 @@ snapshots:
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@types/react': types-react@19.0.0-rc.1
'@mui/system@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
'@mui/private-theming': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/styled-engine': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)
'@mui/types': 7.2.15(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
clsx: 2.1.1
csstype: 3.1.3
prop-types: 15.8.1
react: 19.0.0-rc-df783f9ea1-20240708
optionalDependencies:
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@types/react': types-react@19.0.0-rc.1
'@mui/types@7.2.14(types-react@19.0.0-rc.1)':
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
'@mui/types@7.2.15(types-react@19.0.0-rc.1)':
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
'@mui/utils@5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
@@ -6707,28 +6843,33 @@ snapshots:
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
'@mui/x-data-grid@7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
'@mui/utils@5.16.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@types/prop-types': 15.7.12
prop-types: 15.8.1
react: 19.0.0-rc-df783f9ea1-20240708
react-is: 18.3.1
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
'@mui/x-date-pickers@7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(dayjs@1.11.11)(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/system': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/x-internals': 7.9.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@types/react-transition-group': 4.4.10
clsx: 2.1.1
prop-types: 15.8.1
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
reselect: 4.1.8
transitivePeerDependencies:
- '@emotion/react'
- '@emotion/styled'
- '@types/react'
'@mui/x-internals@7.9.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)':
dependencies:
'@babel/runtime': 7.24.7
'@mui/utils': 5.16.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
react: 19.0.0-rc-df783f9ea1-20240708
react-transition-group: 4.4.5(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
optionalDependencies:
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
dayjs: 1.11.11
transitivePeerDependencies:
- '@types/react'
@@ -7263,6 +7404,26 @@ snapshots:
dependencies:
defer-to-connect: 2.0.1
'@tanstack/match-sorter-utils@8.15.1':
dependencies:
remove-accents: 0.5.0
'@tanstack/react-table@8.16.0(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)':
dependencies:
'@tanstack/table-core': 8.16.0
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
'@tanstack/react-virtual@3.3.0(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)':
dependencies:
'@tanstack/virtual-core': 3.3.0
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
'@tanstack/table-core@8.16.0': {}
'@tanstack/virtual-core@3.3.0': {}
'@taplo/core@0.1.1': {}
'@taplo/lib@0.4.0-alpha.2':
@@ -7494,8 +7655,6 @@ snapshots:
'@types/http-cache-semantics@4.0.4': {}
'@types/js-cookie@3.0.6': {}
'@types/json5@0.0.29': {}
'@types/jsonfile@6.1.4':
@@ -9352,6 +9511,8 @@ snapshots:
dependencies:
'@types/hast': 3.0.4
highlight-words@1.2.2: {}
hoist-non-react-statics@3.3.2:
dependencies:
react-is: 16.13.1
@@ -9880,6 +10041,20 @@ snapshots:
escape-string-regexp: 4.0.0
optional: true
material-react-table@2.13.0(anywsq46gdagafemjlmocwrkqu):
dependencies:
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/icons-material': 5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(dayjs@1.11.11)(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@tanstack/match-sorter-utils': 8.15.1
'@tanstack/react-table': 8.16.0(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
'@tanstack/react-virtual': 3.3.0(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)
highlight-words: 1.2.2
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
mathml-tag-names@2.1.3: {}
mdast-util-from-markdown@2.0.0:
@@ -10160,12 +10335,12 @@ snapshots:
ms@2.1.3: {}
mui-color-input@3.0.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1):
mui-color-input@3.0.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1):
dependencies:
'@ctrl/tinycolor': 4.1.0
'@emotion/react': 11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@emotion/styled': 11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
optionalDependencies:
@@ -10683,13 +10858,14 @@ snapshots:
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
react-hook-form-mui@7.0.1(addvybcbawtwkjqnoojx6y4g5m):
react-hook-form-mui@7.0.1(7cllkcphevtaad3vgre6vmruby):
dependencies:
'@mui/material': 5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/material': 5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
react: 19.0.0-rc-df783f9ea1-20240708
react-hook-form: 7.52.1(react@19.0.0-rc-df783f9ea1-20240708)
optionalDependencies:
'@mui/icons-material': 5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/icons-material': 5.16.1(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@mui/material@5.16.1(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(dayjs@1.11.11)(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
react-hook-form@7.52.1(react@19.0.0-rc-df783f9ea1-20240708):
dependencies:
@@ -10746,11 +10922,6 @@ snapshots:
optionalDependencies:
'@types/react': types-react@19.0.0-rc.1
react-resizable-panels@2.0.20(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708):
dependencies:
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
react-router-dom@6.24.1(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708):
dependencies:
'@remix-run/router': 1.17.1
@@ -10763,6 +10934,12 @@ snapshots:
'@remix-run/router': 1.17.1
react: 19.0.0-rc-df783f9ea1-20240708
react-split-grid@1.0.4(react@19.0.0-rc-df783f9ea1-20240708):
dependencies:
prop-types: 15.8.1
react: 19.0.0-rc-df783f9ea1-20240708
split-grid: 1.0.11
react-style-singleton@2.2.1(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1):
dependencies:
get-nonce: 1.0.1
@@ -10774,18 +10951,13 @@ snapshots:
react-transition-group@4.4.5(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708):
dependencies:
'@babel/runtime': 7.24.5
'@babel/runtime': 7.24.7
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
react-virtuoso@4.7.10(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708):
dependencies:
react: 19.0.0-rc-df783f9ea1-20240708
react-dom: 19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708)
react@19.0.0-rc-df783f9ea1-20240708: {}
read-cache@1.0.0:
@@ -10853,12 +11025,12 @@ snapshots:
unified: 11.0.4
vfile: 6.0.1
remove-accents@0.5.0: {}
require-directory@2.1.1: {}
require-from-string@2.0.2: {}
reselect@4.1.8: {}
reserved-words@0.1.2: {}
resize-observer-polyfill@1.5.1: {}
@@ -11079,6 +11251,8 @@ snapshots:
space-separated-tokens@2.0.2: {}
split-grid@1.0.11: {}
split2@4.2.0: {}
sprintf-js@1.1.3: {}
@@ -11206,7 +11380,7 @@ snapshots:
postcss-sorting: 8.0.2(postcss@8.4.39)
stylelint: 16.6.1(typescript@5.5.3)
stylelint-scss@6.4.0(stylelint@16.6.1(typescript@5.5.3)):
stylelint-scss@6.4.1(stylelint@16.6.1(typescript@5.5.3)):
dependencies:
known-css-properties: 0.34.0
postcss-media-query-parser: 0.2.3
@@ -11706,7 +11880,7 @@ snapshots:
esbuild: 0.19.12
monaco-editor: 0.50.0
vite-plugin-sass-dts@1.3.22(postcss@8.4.39)(prettier@3.3.2)(sass@1.77.7)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0)):
vite-plugin-sass-dts@1.3.24(postcss@8.4.39)(prettier@3.3.2)(sass@1.77.7)(vite@5.3.3(@types/node@20.14.10)(less@4.2.0)(sass@1.77.7)(stylus@0.62.0)):
dependencies:
postcss: 8.4.39
postcss-js: 4.0.1(postcss@8.4.39)
+5 -1
View File
@@ -393,7 +393,11 @@ func (c *clientConfig) parseURI() bool {
return false
}
if u.User != nil {
c.Auth = u.User.String()
auth, err := url.QueryUnescape(u.User.String())
if err != nil {
return false
}
c.Auth = auth
}
c.Server = u.Host
q := u.Query()
@@ -8,7 +8,81 @@
compatible = "hf,m7986r1-emmc", "mediatek,mt7986a";
chosen {
bootargs = "root=PARTLABEL=rootfs rootwait rootfstype=squashfs,f2fs";
bootargs = "root=PARTLABEL=rootfs rootwait";
};
};
&mmc0 {
bus-width = <8>;
cap-mmc-highspeed;
hs400-ds-delay = <0x14014>;
max-frequency = <200000000>;
mmc-hs200-1_8v;
non-removable;
pinctrl-names = "default", "state_uhs";
pinctrl-0 = <&mmc0_pins_default>;
pinctrl-1 = <&mmc0_pins_uhs>;
vmmc-supply = <&reg_3p3v>;
vqmmc-supply = <&reg_1p8v>;
status = "okay";
};
&pio {
mmc0_pins_default: mmc0-pins-default {
mux {
function = "emmc";
groups = "emmc_51";
};
conf-cmd-dat {
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
input-enable;
drive-strength = <4>;
mediatek,pull-up-adv = <1>;
};
conf-clk {
pins = "EMMC_CK";
drive-strength = <6>;
mediatek,pull-down-adv = <2>;
};
conf-ds {
pins = "EMMC_DSL";
mediatek,pull-down-adv = <2>;
};
conf-rst {
pins = "EMMC_RSTB";
drive-strength = <4>;
mediatek,pull-up-adv = <1>;
};
};
mmc0_pins_uhs: mmc0-uhs-pins {
mux {
function = "emmc";
groups = "emmc_51";
};
conf-cmd-dat {
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
input-enable;
drive-strength = <4>;
mediatek,pull-up-adv = <1>;
};
conf-clk {
pins = "EMMC_CK";
drive-strength = <6>;
mediatek,pull-down-adv = <2>;
};
conf-ds {
pins = "EMMC_DSL";
mediatek,pull-down-adv = <2>;
};
conf-rst {
pins = "EMMC_RSTB";
drive-strength = <4>;
mediatek,pull-up-adv = <1>;
};
};
};
@@ -15,7 +15,7 @@
led-running = &sys_led;
led-upgrade = &sys_led;
};
chosen {
stdout-path = "serial0:115200n8";
};
@@ -68,6 +68,15 @@
};
};
reg_1p8v: regulator-1p8v {
compatible = "regulator-fixed";
regulator-name = "fixed-1.8V";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-boot-on;
regulator-always-on;
};
reg_3p3v: regulator-3p3v {
compatible = "regulator-fixed";
regulator-name = "fixed-3.3V";
@@ -85,15 +94,6 @@
regulator-boot-on;
regulator-always-on;
};
reg_1p8v: regulator-1p8v {
compatible = "regulator-fixed";
regulator-name = "fixed-1.8V";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-boot-on;
regulator-always-on;
};
};
&crypto {
@@ -188,64 +188,6 @@
output-low;
};
};
mmc0_pins_default: mmc0-pins-default {
mux {
function = "emmc";
groups = "emmc_51";
};
conf-cmd-dat {
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
input-enable;
drive-strength = <4>;
mediatek,pull-up-adv = <1>;
};
conf-clk {
pins = "EMMC_CK";
drive-strength = <6>;
mediatek,pull-down-adv = <2>;
};
conf-ds {
pins = "EMMC_DSL";
mediatek,pull-down-adv = <2>;
};
conf-rst {
pins = "EMMC_RSTB";
drive-strength = <4>;
mediatek,pull-up-adv = <1>;
};
};
mmc0_pins_uhs: mmc0-uhs-pins {
mux {
function = "emmc";
groups = "emmc_51";
};
conf-cmd-dat {
pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
"EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
"EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
input-enable;
drive-strength = <4>;
mediatek,pull-up-adv = <1>;
};
conf-clk {
pins = "EMMC_CK";
drive-strength = <6>;
mediatek,pull-down-adv = <2>;
};
conf-ds {
pins = "EMMC_DSL";
mediatek,pull-down-adv = <2>;
};
conf-rst {
pins = "EMMC_RSTB";
drive-strength = <4>;
mediatek,pull-up-adv = <1>;
};
};
};
&ssusb {
@@ -310,21 +252,3 @@
&watchdog {
status = "okay";
};
&mmc0 {
bus-width = <8>;
cap-mmc-highspeed;
hs400-ds-delay = <0x14014>;
max-frequency = <200000000>;
mmc-hs200-1_8v;
no-sd;
no-sdio;
non-removable;
pinctrl-names = "default", "state_uhs";
pinctrl-0 = <&mmc0_pins_default>;
pinctrl-1 = <&mmc0_pins_uhs>;
vmmc-supply = <&reg_3p3v>;
vqmmc-supply = <&reg_1p8v>;
status = "okay";
};
@@ -34,13 +34,13 @@ mediatek_setup_interfaces()
qihoo,360t7)
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" wan
;;
hf,m7986r1*)
ucidef_set_interfaces_lan_wan "lan2 lan3 lan4" "lan1 usb0"
;;
glinet,gl-mt2500|\
glinet,gl-mt3000)
ucidef_set_interfaces_lan_wan eth1 eth0
;;
hf,m7986r1*)
ucidef_set_interfaces_lan_wan "lan2 lan3 lan4" "lan1 usb0"
;;
mediatek,mt7986a-rfb|\
mediatek,mt7986b-rfb)
ucidef_set_interfaces_lan_wan "lan0 lan1 lan2 lan3" eth1
+29 -30
View File
@@ -340,6 +340,35 @@ define Device/h3c_magic-nx30-pro
endef
TARGET_DEVICES += h3c_magic-nx30-pro
define Device/hf_m7986r1-emmc
DEVICE_VENDOR := HF
DEVICE_MODEL := M7986R1 (eMMC)
DEVICE_DTS := mt7986a-hf-m7986r1-emmc
DEVICE_DTS_DIR := ../dts
DEVICE_PACKAGES := kmod-usb3 kmod-mt7921e kmod-usb-net-rndis kmod-usb-serial-option f2fsck mkf2fs
SUPPORTED_DEVICES += HF-M7986R1
KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
KERNEL_INITRAMFS := kernel-bin | lzma | \
fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
endef
TARGET_DEVICES += hf_m7986r1-emmc
define Device/hf_m7986r1-nand
DEVICE_VENDOR := HF
DEVICE_MODEL := M7986R1 (NAND)
DEVICE_DTS := mt7986a-hf-m7986r1-nand
DEVICE_DTS_DIR := ../dts
UBINIZE_OPTS := -E 5
BLOCKSIZE := 128k
PAGESIZE := 2048
KERNEL_IN_UBI := 1
DEVICE_PACKAGES := kmod-usb3 kmod-mt7921e kmod-usb-net-rndis kmod-usb-serial-option
SUPPORTED_DEVICES += HF-M7986R1
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
endef
TARGET_DEVICES += hf_m7986r1-nand
define Device/imou_lc-hx3001
DEVICE_VENDOR := IMOU
DEVICE_MODEL := LC-HX3001
@@ -479,36 +508,6 @@ define Device/mediatek_mt7988a-rfb
endef
TARGET_DEVICES += mediatek_mt7988a-rfb
define Device/hf_m7986r1-emmc
DEVICE_VENDOR := HF
DEVICE_MODEL := M7986R1 (eMMC version)
DEVICE_DTS := mt7986a-hf-m7986r1-emmc
DEVICE_DTS_DIR := ../dts
DEVICE_PACKAGES := kmod-usb3 kmod-mt7921e kmod-usb-serial-option kmod-usb-net-rndis f2fsck mkf2fs
SUPPORTED_DEVICES += HF-M7986R1
KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
KERNEL_INITRAMFS := kernel-bin | lzma | \
fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
endef
TARGET_DEVICES +=hf_m7986r1-emmc
define Device/hf_m7986r1-nand
DEVICE_VENDOR := HF
DEVICE_MODEL := M7986R1 (NAND version)
DEVICE_DTS := mt7986a-hf-m7986r1-nand
DEVICE_DTS_DIR := ../dts
UBINIZE_OPTS := -E 5
BLOCKSIZE := 128k
PAGESIZE := 2048
IMAGE_SIZE := 116736k
KERNEL_IN_UBI := 1
DEVICE_PACKAGES := kmod-usb3 kmod-mt7921e kmod-usb-serial-option kmod-usb-net-rndis mmc-utils
SUPPORTED_DEVICES += HF-M7986R1
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
endef
TARGET_DEVICES +=hf_m7986r1-nand
define Device/netcore_n60
DEVICE_VENDOR := Netcore
DEVICE_MODEL := N60
+9 -9
View File
@@ -8,7 +8,7 @@ define Device/advantech_rsb4810
SOC := rk3568
UBOOT_DEVICE_NAME := advantech-rsb4810-rk3568
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
DEVICE_PACKAGES := kmod-ata-ahci kmod-ata-ahci-platform -urngd
DEVICE_PACKAGES := kmod-ata-ahci-dwc -urngd
endef
TARGET_DEVICES += advantech_rsb4810
@@ -48,7 +48,7 @@ define Device/ezpro_mrkaio-m68s
SOC := rk3568
UBOOT_DEVICE_NAME := mrkaio-m68s-rk3568
IMAGE/sysupgrade.img.gz := boot-common | boot-script vop | pine64-img | gzip | append-metadata
DEVICE_PACKAGES := kmod-ata-ahci kmod-ata-ahci-platform kmod-drm-rockchip
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-drm-rockchip
endef
TARGET_DEVICES += ezpro_mrkaio-m68s
@@ -58,7 +58,7 @@ define Device/ezpro_mrkaio-m68s-plus
SOC := rk3568
UBOOT_DEVICE_NAME := mrkaio-m68s-rk3568
IMAGE/sysupgrade.img.gz := boot-common | boot-script vop | pine64-img | gzip | append-metadata
DEVICE_PACKAGES := kmod-r8125 kmod-ata-ahci kmod-ata-ahci-platform kmod-drm-rockchip
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-drm-rockchip kmod-r8125
endef
TARGET_DEVICES += ezpro_mrkaio-m68s-plus
@@ -157,7 +157,7 @@ define Device/firefly_station-p2
DEVICE_DTS := rockchip/rk3568-roc-pc
UBOOT_DEVICE_NAME := station-p2-rk3568
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
DEVICE_PACKAGES := kmod-brcmfmac kmod-ikconfig kmod-ata-ahci-platform station-p2-firmware wpad-openssl
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-brcmfmac kmod-ikconfig wpad-openssl
endef
TARGET_DEVICES += firefly_station-p2
@@ -165,7 +165,7 @@ define Device/hinlink_common
DEVICE_VENDOR := HINLINK
UBOOT_DEVICE_NAME := opc-h68k-rk3568
IMAGE/sysupgrade.img.gz := boot-common | boot-script vop | pine64-img | gzip | append-metadata
DEVICE_PACKAGES := kmod-ata-ahci-platform kmod-drm-rockchip kmod-hwmon-pwmfan kmod-mt7921e kmod-r8125 wpad-openssl
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-drm-rockchip kmod-hwmon-pwmfan kmod-mt7921e kmod-r8125 wpad-openssl
endef
define Device/hinlink_opc-h66k
@@ -206,7 +206,7 @@ define Device/panther_x2
DEVICE_DTS := rockchip/rk3566-panther-x2
UBOOT_DEVICE_NAME := panther-x2-rk3566
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
DEVICE_PACKAGES := kmod-brcmfmac kmod-ikconfig panther-x2-firmware wpad-openssl
DEVICE_PACKAGES := kmod-brcmfmac kmod-ikconfig brcmfmac-nvram-43430-sdio wpad-openssl
endef
TARGET_DEVICES += panther_x2
@@ -226,7 +226,7 @@ define Device/radxa_e25
DEVICE_DTS := rockchip/rk3568-radxa-e25
UBOOT_DEVICE_NAME := radxa-e25-rk3568
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
DEVICE_PACKAGES := kmod-ata-ahci-platform kmod-r8125
DEVICE_PACKAGES := kmod-ata-ahci-dwc kmod-r8125
endef
TARGET_DEVICES += radxa_e25
@@ -257,7 +257,7 @@ define Device/rongpin_king3399
SOC := rk3399
UBOOT_DEVICE_NAME := rongpin-king3399-rk3399
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-bin | gzip | append-metadata
DEVICE_PACKAGES := kmod-r8168 -urngd kmod-brcmfmac cypress-firmware-4356-sdio rongpin-king3399-firmware wpad-openssl
DEVICE_PACKAGES := kmod-r8168 -urngd kmod-brcmfmac cypress-firmware-4356-sdio wpad-openssl
endef
TARGET_DEVICES += rongpin_king3399
@@ -278,7 +278,7 @@ define Device/seewo_sv21-rk3568
DEVICE_DTS := rockchip/rk3568-seewo-sv21
UBOOT_DEVICE_NAME := seewo-sv21-rk3568
IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata
DEVICE_PACKAGES := kmod-usb-net-rtl8152 kmod-ata-ahci kmod-ata-ahci-platform
DEVICE_PACKAGES := kmod-usb-net-rtl8152 kmod-ata-ahci-dwc
endef
TARGET_DEVICES += seewo_sv21-rk3568
File diff suppressed because it is too large Load Diff
@@ -1 +1 @@
20240602150004
20240708150024
@@ -2,6 +2,7 @@
2001:254::/31
2001:256:100::/48
2001:550:1601::/48
2001:67c:aec::/48
2001:67c:c28::/48
2001:7fa:5::/48
2001:c68::/32
@@ -9,8 +10,7 @@
2001:da8::/32
2001:daa:1::/48
2001:daa:2::/47
2001:daa:4::/47
2001:daa:6::/48
2001:daa:4::/48
2001:dc7::/32
2001:dd8:1::/48
2001:dd8:5::/48
@@ -34,11 +34,12 @@
2400:5400:10::/48
2400:5a60:2::/48
2400:5a60:100::/48
2400:5f60::/32
2400:6000::/32
2400:6460::/40
2400:6600::/32
2400:6e60:1301::/48
2400:73e0::/32
2400:73e0:201::/48
2400:75aa::/32
2400:7bc0:20::/43
2400:7fc0::/40
@@ -101,17 +102,22 @@
2400:9520:434::/48
2400:95e0::/48
2400:9600:8800::/48
2400:9620::/32
2400:a040::/32
2400:a980::/29
2400:ae00:1981::/48
2400:b200::/32
2400:b600::/32
2400:b700::/48
2400:be00::/48
2400:cb80:e30::/44
2400:cb80:e40::/44
2400:da00::/32
2400:dd00::/28
2400:e3e0:aaa0::/44
2400:e3e0:abb0::/44
2400:ebc0::/32
2400:ed60::/48
2400:ee00::/32
2400:f6e0::/32
2400:f720::/32
@@ -127,7 +133,6 @@
2401:11a0:1500::/40
2401:11a0:d150::/48
2401:11a0:d152::/48
2401:11a0:d158::/48
2401:1200::/48
2401:1320::/32
2401:1740:2000::/48
@@ -159,9 +164,11 @@
2401:4a80::/32
2401:5960:5960::/48
2401:70e0::/32
2401:71c0::/48
2401:7700::/32
2401:7d40::/32
2401:7e00::/32
2401:8be0::/48
2401:8d00::/46
2401:8d00:7::/48
2401:8d00:8::/47
@@ -171,6 +178,9 @@
2401:8d00:10::/48
2401:8d00:12::/48
2401:8d00:14::/48
2401:8da0::/48
2401:95c0:f001::/48
2401:9ca0::/48
2401:a140:1::/48
2401:b180::/32
2401:b400::/45
@@ -208,7 +218,9 @@
2402:6f40:2::/47
2402:6fc0::/48
2402:7040::/32
2402:7240::/36
2402:7240:2000::/36
2402:7740:2000::/36
2402:7740:a000::/36
2402:7d80::/32
2402:8bc0::/32
2402:8cc0::/40
@@ -218,7 +230,7 @@
2402:93c0:20::/48
2402:93c0:100::/48
2402:9a80::/32
2402:9e80:60::/48
2402:9b80:10::/48
2402:a200::/32
2402:b8c0::/32
2402:b940::/40
@@ -246,7 +258,7 @@
2403:1ec0:1200::/48
2403:1ec0:1400::/48
2403:1ec0:1610::/48
2403:2040::/32
2403:2040::/48
2403:27c0:c03::/48
2403:27c0:1000::/48
2403:2b40::/32
@@ -255,6 +267,7 @@
2403:4280::/47
2403:4b40::/32
2403:4c80::/48
2403:4c80:128::/48
2403:5c80::/48
2403:6380:14::/47
2403:6380:20::/44
@@ -287,11 +300,12 @@
2404:bc0:4f00::/43
2404:1c80::/32
2404:2280:106::/47
2404:2280:10b::/48
2404:2280:10d::/48
2404:2280:10f::/48
2404:2280:112::/47
2404:2280:115::/48
2404:2280:11b::/48
2404:2280:11a::/47
2404:2280:11c::/47
2404:2280:11e::/48
2404:2280:123::/48
@@ -320,8 +334,7 @@
2404:2280:1bf::/48
2404:2280:1c1::/48
2404:2280:1c2::/47
2404:2280:1c4::/47
2404:2280:1c7::/48
2404:2280:1c4::/46
2404:2280:1c8::/48
2404:2280:1cb::/48
2404:2280:1cc::/48
@@ -333,8 +346,7 @@
2404:2280:1e0::/48
2404:2280:1e2::/47
2404:2280:1e4::/46
2404:2280:1e8::/48
2404:2280:1ea::/48
2404:2280:1e8::/46
2404:2280:1ec::/47
2404:2280:1ee::/48
2404:2280:1f0::/45
@@ -375,7 +387,6 @@
2404:c940::/48
2404:d7c0:2::/48
2404:e280::/47
2404:e5c0::/32
2404:e8c0::/32
2404:ea80:500:575::/64
2404:ea80:600:623::/64
@@ -396,6 +407,7 @@
2405:3140:31::/48
2405:3140:3a::/48
2405:3bc0::/48
2405:4540:8000::/48
2405:57c0::/47
2405:57c0:100::/48
2405:66c0::/32
@@ -432,11 +444,14 @@
2406:840:110::/48
2406:840:180::/48
2406:840:1c0::/48
2406:840:2e0::/48
2406:840:301::/48
2406:840:302::/48
2406:840:3c1::/48
2406:840:410::/48
2406:840:420::/48
2406:840:480::/48
2406:840:540::/48
2406:840:680::/48
2406:840:801::/48
2406:840:802::/47
@@ -468,26 +483,31 @@
2406:840:9700::/40
2406:840:9801::/48
2406:840:9810::/48
2406:840:981a::/48
2406:840:981c::/46
2406:840:9960::/47
2406:840:9962::/48
2406:840:9969::/48
2406:840:996f::/48
2406:840:9980::/48
2406:840:9984::/48
2406:840:9ef0::/44
2406:840:c0a8::/48
2406:840:e010::/47
2406:840:e014::/46
2406:840:e018::/45
2406:840:e030::/47
2406:840:e033::/48
2406:840:e03f::/48
2406:840:e080::/44
2406:840:e0c1::/48
2406:840:e0cf::/48
2406:840:e0e0::/44
2406:840:e10f::/48
2406:840:e14f::/48
2406:840:e180::/44
2406:840:e20f::/48
2406:840:e230::/48
2406:840:e230::/47
2406:840:e232::/48
2406:840:e234::/48
2406:840:e270::/44
2406:840:e300::/47
2406:840:e302::/48
@@ -510,7 +530,6 @@
2406:840:e84f::/48
2406:840:e880::/44
2406:840:eab0::/46
2406:840:eab4::/48
2406:840:eab6::/48
2406:840:eb00::/46
2406:840:eb04::/47
@@ -521,9 +540,12 @@
2406:840:eb80::/42
2406:840:ed02::/48
2406:840:eed0::/44
2406:840:efa0::/44
2406:840:eee0::/44
2406:840:f0a1::/48
2406:840:f0aa::/48
2406:840:f100::/47
2406:840:f200::/47
2406:840:f203::/48
2406:840:f230::/44
2406:840:f380::/44
2406:840:f401::/48
@@ -536,23 +558,33 @@
2406:840:fa01::/48
2406:840:fa02::/47
2406:840:fa04::/48
2406:840:fa40::/48
2406:840:fc80::/45
2406:840:fc88::/46
2406:840:fc8c::/47
2406:840:fc8e::/48
2406:840:fcc0::/44
2406:840:fd00::/47
2406:840:fd03::/48
2406:840:fd1f::/48
2406:840:fdd0::/47
2406:840:fd90::/44
2406:840:fda0::/43
2406:840:fdc0::/44
2406:840:fdd1::/48
2406:840:fde0::/48
2406:840:fe27::/48
2406:840:fe50::/48
2406:840:fe60::/48
2406:840:fe72::/47
2406:840:fe90::/46
2406:840:fec0::/47
2406:840:fec4::/47
2406:840:fec3::/48
2406:840:fec4::/46
2406:840:fec8::/45
2406:840:fed1::/48
2406:840:fed2::/47
2406:840:fed4::/46
2406:840:fed8::/47
2406:840:feda::/48
2406:840:fed8::/46
2406:840:fedd::/48
2406:840:fede::/47
2406:840:feed::/48
@@ -568,7 +600,8 @@
2406:3340::/32
2406:3640:1::/48
2406:3d80::/32
2406:4440:f000::/44
2406:4440:f000::/48
2406:4440:f00f::/48
2406:4d00::/48
2406:52c0::/32
2406:5340:6666::/48
@@ -583,6 +616,8 @@
2406:d440:100::/44
2406:d440:200::/44
2406:d440:300::/44
2406:d440:ff00::/48
2406:d440:ffff::/48
2406:e3c0::/32
2406:e500::/33
2407:2840::/48
@@ -608,6 +643,7 @@
2407:c080:5000::/37
2407:c080:6000::/36
2407:c080:8000::/36
2407:d9c0::/32
2408:4000::/22
2408:8000::/48
2408:8000:2::/47
@@ -1085,8 +1121,6 @@
2408:8a05:8000::/36
2408:8a06::/47
2408:8a06:100::/47
2408:8a07:6000::/38
2408:8a07:6400::/40
2408:8a21:4000::/35
2408:8a22:9200::/39
2408:8a22:9400::/38
@@ -1141,7 +1175,7 @@
240a:40c3:c200::/48
240a:40c3:c240::/48
240a:4172::/31
240a:41b0::/31
240a:41b0::/34
240a:41f2::/31
240a:4242::/31
240a:4280::/26
@@ -1166,7 +1200,7 @@
240d:c000:6000::/36
240d:c000:7000::/44
240d:c000:f000::/44
240d:c000:f020::/44
240d:c000:f020::/43
240d:c010::/47
240d:c010:14::/48
240d:c010:16::/48
@@ -1179,6 +1213,7 @@
240d:c010:6c::/48
240d:c040::/44
240e::/20
2601:1d08:4000::/44
2602:2a3::/48
2602:2a4:ff::/48
2602:2c3:810::/44
@@ -1191,19 +1226,31 @@
2602:fa4f:600::/40
2602:fab0:11::/48
2602:fbda:600::/48
2602:fbda:610::/48
2602:fbda:660::/48
2602:fbda:666::/48
2602:fc52:311::/48
2602:fc52:315::/48
2602:fd92:801::/48
2602:fe69:f26::/47
2602:fed2:7020::/46
2602:fed2:7101::/48
2602:fed2:731d::/48
2602:feda:182::/47
2602:feda:1bf::/48
2602:feda:1d1::/48
2602:feda:1d2::/48
2602:feda:2a0::/46
2602:feda:2a4::/47
2602:feda:2a6::/48
2602:feda:2aa::/48
2602:feda:2af::/48
2602:feda:2d0::/47
2602:feda:2f0::/48
2602:feda:3c5::/48
2602:feda:b8f::/48
2602:feda:c34::/48
2602:feda:ca1::/48
2602:feda:d80::/48
2602:feda:d83::/48
2602:ffe4:c5f::/48
@@ -1222,8 +1269,11 @@
2605:9d80:9052::/48
2605:9d80:9071::/48
2605:9d80:9092::/48
2605:f440:cafe::/48
2620:57:4004::/47
2804:1e48::/32
2a03:5840:f3::/48
2a03:5840:11b::/48
2a03:5840:290::/48
2a04:3e00:1002::/48
2a04:f580:8010::/47
@@ -1256,7 +1306,11 @@
2a04:f580:9290::/48
2a05:1085::/32
2a05:1087::/32
2a05:dfc1:1600::/40
2a05:4140:66::/48
2a05:dfc1:1600::/48
2a05:dfc1:1604::/48
2a05:dfc1:1607::/48
2a05:dfc1:1608::/48
2a05:dfc1:7106::/47
2a05:dfc1:7108::/47
2a05:dfc1:7110::/48
@@ -1271,17 +1325,23 @@
2a05:dfc1:8c22::/48
2a05:dfc1:8c24::/48
2a05:dfc1:8c42::/48
2a05:dfc1:8c90::/46
2a05:dfc1:8c94::/47
2a05:dfc1:8d00::/48
2a05:dfc1:8c90::/45
2a05:dfc1:8d02::/48
2a06:3600::/29
2a06:9f81:4610::/44
2a06:9f81:4620::/44
2a06:9f81:4640::/43
2a06:9f81:5100::/47
2a06:9f81:5102::/48
2a06:9f81:5400::/40
2a06:a005:260::/43
2a06:a005:280::/43
2a06:a005:2a0::/44
2a06:a005:486::/48
2a06:a005:8d0::/47
2a06:a005:8da::/48
2a06:a005:9c0::/48
2a06:a005:a13::/48
2a06:a005:b69::/48
2a06:a005:e80::/43
2a06:a005:f80::/44
2a06:a005:1340::/43
@@ -1292,10 +1352,14 @@
2a06:a005:13ea::/47
2a06:a005:13ed::/48
2a06:a005:13ef::/48
2a06:a005:1520::/44
2a06:a005:1800::/48
2a06:a005:1b60::/47
2a06:a005:1c40::/44
2a06:a005:1ee1::/48
2a06:a005:1ee9::/48
2a06:a005:1eee::/48
2a06:a005:2040::/44
2a06:a005:2100::/44
2a06:a005:28f3::/48
2a06:a005:28f4::/48
2a06:a005:2910::/44
@@ -1306,12 +1370,32 @@
2a06:a005:29d1::/48
2a06:de00:de04::/48
2a06:de00:de0e::/48
2a06:de01:80f::/48
2a06:de01:821::/48
2a06:de01:854::/48
2a06:de01:85f::/48
2a06:de01:8a4::/48
2a06:de01:8b8::/48
2a06:de01:8c4::/48
2a06:de01:8cb::/48
2a06:de01:917::/48
2a06:de01:92f::/48
2a06:de01:944::/47
2a06:de01:98c::/48
2a06:de01:9a8::/48
2a06:de01:acd::/48
2a06:de01:af9::/48
2a06:de01:b1a::/48
2a06:de01:b32::/48
2a06:e881:2509::/48
2a06:e881:5501::/48
2a06:e881:5502::/48
2a06:e881:5506::/48
2a06:e881:6600::/48
2a06:e881:6602::/47
2a06:e881:6606::/48
2a07:54c1:2200::/47
2a07:54c1:2202::/48
2a09:b280:ff80::/48
2a07:54c1:2200::/46
2a09:b280:ff80::/47
2a09:b280:ff83::/48
2a09:b280:ff84::/47
2a0a:2840:20::/43
@@ -1338,25 +1422,40 @@
2a0a:6040:5555::/48
2a0a:6040:6607::/48
2a0a:6040:6c40::/44
2a0a:6040:7e00::/48
2a0a:6040:a450::/47
2a0a:6040:a740::/48
2a0a:6040:a900::/47
2a0a:6040:b770::/44
2a0a:6040:c601::/48
2a0a:6040:c700::/42
2a0a:6040:c740::/47
2a0a:6040:c742::/48
2a0a:6040:c760::/47
2a0a:6040:c770::/44
2a0a:6040:c7a0::/48
2a0a:6040:ce11::/48
2a0a:6040:d310::/48
2a0a:6040:d400::/47
2a0a:6040:d600::/44
2a0a:6040:d610::/48
2a0a:6040:d612::/48
2a0a:6040:d614::/47
2a0a:6040:d617::/48
2a0a:6040:d710::/44
2a0a:6040:e300::/40
2a0a:6040:e410::/48
2a0a:6040:e541::/48
2a0a:6040:e543::/48
2a0a:6040:e544::/47
2a0a:6040:e54c::/48
2a0a:6040:e900::/40
2a0a:6040:ec00::/40
2a0a:6044:b800::/40
2a0b:b86:ffe0::/48
2a0b:b87:ffb5::/48
2a0b:2542::/48
2a0b:2542:300::/40
2a0b:4340:30::/44
2a0b:4340:70::/48
2a0b:4340:90::/48
@@ -1368,17 +1467,27 @@
2a0b:4340:a0::/44
2a0b:4340:c0::/44
2a0b:4340:d8::/48
2a0b:4340:400::/46
2a0b:4340:404::/47
2a0b:4340:406::/48
2a0b:4340:434::/48
2a0b:4340:560::/44
2a0b:4340:1304::/48
2a0b:4340:1340::/48
2a0c:9a40:8cf0::/48
2a0c:9a40:9e00::/43
2a0c:b641:210::/47
2a0c:b641:24f::/48
2a0c:b641:510::/48
2a0c:b641:570::/47
2a0c:b641:730::/44
2a0c:b641:a60::/44
2a0c:b641:b21::/48
2a0c:b642:4101::/48
2a0c:b642:4102::/47
2a0c:b642:4104::/46
2a0d:2146:8040::/48
2a0d:2406:510::/47
2a0d:2406:512::/48
2a0d:2580:ff00::/45
2a0d:2580:ff08::/46
2a0d:2581:fffc::/48
@@ -1386,6 +1495,8 @@
2a0d:2687::/32
2a0d:2904::/44
2a0d:c7c7::/32
2a0e:800:ff00::/48
2a0e:800:ff04::/48
2a0e:800:ff20::/47
2a0e:800:ff40::/42
2a0e:15c0:6::/48
@@ -1405,41 +1516,53 @@
2a0e:aa06:440::/48
2a0e:aa06:470::/44
2a0e:aa06:490::/44
2a0e:aa06:4e0::/44
2a0e:aa06:500::/44
2a0e:aa06:520::/48
2a0e:aa06:525::/48
2a0e:aa07:e00e::/48
2a0e:aa07:e01b::/48
2a0e:aa07:e024::/47
2a0e:aa07:e027::/48
2a0e:aa07:e030::/48
2a0e:aa07:e035::/48
2a0e:aa07:e039::/48
2a0e:aa07:e043::/48
2a0e:aa07:e050::/44
2a0e:aa07:e060::/48
2a0e:aa07:e071::/48
2a0e:aa07:e0f1::/48
2a0e:aa07:e0f7::/48
2a0e:aa07:e120::/44
2a0e:aa07:e130::/47
2a0e:aa07:e140::/47
2a0e:aa07:e143::/48
2a0e:aa07:e145::/48
2a0e:aa07:e146::/47
2a0e:aa07:e146::/48
2a0e:aa07:e148::/48
2a0e:aa07:e16a::/48
2a0e:aa07:e1a0::/46
2a0e:aa07:e1b0::/47
2a0e:aa07:e1b2::/48
2a0e:aa07:e1b4::/47
2a0e:aa07:e1b0::/44
2a0e:aa07:e1e1::/48
2a0e:aa07:e200::/44
2a0e:aa07:f000::/48
2a0e:aa07:f004::/48
2a0e:aa07:f008::/48
2a0e:aa07:f041::/48
2a0e:aa07:f042::/48
2a0e:aa07:f0d0::/48
2a0e:aa07:f0d0::/47
2a0e:aa07:f0d2::/48
2a0e:aa07:f0d4::/47
2a0e:aa07:f0d6::/48
2a0e:aa07:f0d8::/45
2a0e:aa07:f0e0::/44
2a0e:b107:30::/48
2a0e:b107:32::/47
2a0e:b107:a0::/44
2a0e:b107:12b::/48
2a0e:b107:1c1::/48
2a0e:b107:272::/48
2a0e:b107:710::/48
2a0e:b107:740::/44
2a0e:b107:790::/45
2a0e:b107:798::/46
2a0e:b107:c10::/48
2a0e:b107:da0::/44
2a0e:b107:dce::/48
@@ -1449,53 +1572,78 @@
2a0e:b107:1a40::/46
2a0e:b107:1b60::/48
2a0e:b107:1b6e::/47
2a0e:b107:1d25::/48
2a0e:b107:1e85::/48
2a0e:b107:2440::/44
2a0f:1440::/29
2a0f:2100::/29
2a0f:5707:ac01::/48
2a0f:5707:fe01::/48
2a0f:5707:fff4::/47
2a0f:5707:fff5::/48
2a0f:7802:e104::/47
2a0f:7802:e110::/47
2a0f:7802:e120::/44
2a0f:7802:e138::/45
2a0f:7802:e140::/46
2a0f:7803:dd00::/41
2a0f:7803:dd80::/42
2a0f:7803:f970::/44
2a0f:7803:fa21::/48
2a0f:7803:fa22::/47
2a0f:7803:fc00::/43
2a0f:7803:fc20::/44
2a0f:7803:fc80::/44
2a0f:7803:fcc0::/44
2a0f:7803:fcaa::/48
2a0f:7803:fe21::/48
2a0f:7803:fe22::/48
2a0f:7803:fe24::/48
2a0f:7803:fe80::/47
2a0f:7803:fe82::/48
2a0f:7803:fe84::/48
2a0f:7803:ff10::/48
2a0f:7980::/44
2a0f:85c1:100::/48
2a0f:85c1:3b5::/48
2a0f:85c1:816::/48
2a0f:9400:6110::/48
2a0f:9400:8016::/48
2a0f:9400:7700::/48
2a0f:9b00::/29
2a0f:e401:133::/48
2a10:2f00:13a::/48
2a10:2f00:147::/48
2a10:2f00:15a::/48
2a10:2f00:18e::/48
2a10:2f01:100::/48
2a10:3440::/29
2a10:cc40:180::/47
2a10:cc40:188::/48
2a10:cc40:190::/48
2a10:cc42:120::/43
2a10:ccc0:cc1::/48
2a10:ccc0:cc2::/48
2a10:ccc0:ccc::/48
2a10:ccc0:c0c3::/48
2a10:ccc0:ccc6::/48
2a10:ccc0:cccc::/46
2a11:f2c0:ffc4::/48
2a12:3fc2:6600::/48
2a12:3fc2:6666::/48
2a12:3fc2:aa10::/44
2a12:3fc2:aa40::/44
2a12:3fc2:ab50::/48
2a12:3fc2:e72e::/48
2a12:3fc2:e810::/44
2a12:3fc7::/48
2a12:3fc7:8000::/48
2a12:dd47:5c00::/40
2a12:f8c0:1000::/40
2a12:f8c3::/36
2a13:1800::/48
2a13:1800:10::/48
2a13:1800:80::/44
2a13:1800:300::/44
2a13:1801:180::/43
2a13:1802::/43
2a13:a5c3:f000::/40
2a13:a5c4:1000::/38
2a13:a5c4:1400::/39
2a13:a5c5::/48
2a13:a5c7:1200::/40
2a13:a5c7:1500::/40
2a13:a5c7:1600::/45
@@ -1505,30 +1653,39 @@
2a13:a5c7:1801::/48
2a13:a5c7:1802::/47
2a13:a5c7:1804::/47
2a13:a5c7:1888::/48
2a13:a5c7:2102::/47
2a13:a5c7:2104::/48
2a13:a5c7:2106::/48
2a13:a5c7:2109::/48
2a13:a5c7:2200::/40
2a13:aac4:f000::/44
2a13:b487:11da::/48
2a13:b487:1200::/43
2a13:b487:1ba2::/48
2a13:b487:1ba6::/47
2a13:b487:1bb2::/47
2a13:b487:1200::/44
2a13:b487:1bb2::/48
2a13:b487:1bba::/47
2a13:b487:1bc0::/47
2a13:b487:1bff::/48
2a13:b487:1f02::/47
2a13:b487:1f04::/46
2a13:df80:3b00::/44
2a13:df80:3b11::/48
2a13:df85:a201::/48
2a13:df85:a202::/47
2a13:df85:a204::/48
2a13:df85:a2ff::/48
2a13:df85:be10::/48
2a13:df85:be80::/48
2a13:df85:be88::/48
2a13:df85:be90::/48
2a13:df85:beaa::/48
2a13:df85:bed0::/48
2a13:df85:bedc::/48
2a13:df85:befe::/48
2a14:7c0:4a01::/48
2a14:7c0:4d00::/40
2a14:4c41::/32
2a14:7581:ffb::/48
2a14:7581:ffc::/48
2a14:7583::/32
2a14:7586::/31
2c0f:f7a8:8011::/48
2c0f:f7a8:8050::/48
2c0f:f7a8:805f::/48
@@ -1 +1 @@
20240602150004
20240708150024
File diff suppressed because it is too large Load Diff
@@ -1 +1 @@
202406062209
202407102210
@@ -3177,6 +3177,7 @@ liangzhichuanmei.com
lianyue.net
liaowangxizang.net
liberal.org.hk
libertysculpturepark.com
libertytimes.com.tw
library.usc.cuhk.edu.hk
libredd.it
@@ -5846,6 +5847,7 @@ wqyd.org
wrchina.org
wretch.cc
writer.zoho.com
writesonic.com
wsj.com
wsj.net
wsjhk.com
@@ -1 +1 @@
202406062209
202407102210
@@ -146,7 +146,7 @@ uci.foreach(uciconfig, uciserver, (cfg) => {
max_time_difference: cfg.tls_reality_max_time_difference ? (cfg.max_time_difference + 's') : null,
handshake: {
server: cfg.tls_reality_server_addr,
server_port: cfg.tls_reality_server_port
server_port: strToInt(cfg.tls_reality_server_port)
}
} : null
} : null,
File diff suppressed because it is too large Load Diff
@@ -1 +1 @@
20240602150004
20240708150024
@@ -2,6 +2,7 @@
2001:254::/31
2001:256:100::/48
2001:550:1601::/48
2001:67c:aec::/48
2001:67c:c28::/48
2001:7fa:5::/48
2001:c68::/32
@@ -9,8 +10,7 @@
2001:da8::/32
2001:daa:1::/48
2001:daa:2::/47
2001:daa:4::/47
2001:daa:6::/48
2001:daa:4::/48
2001:dc7::/32
2001:dd8:1::/48
2001:dd8:5::/48
@@ -34,11 +34,12 @@
2400:5400:10::/48
2400:5a60:2::/48
2400:5a60:100::/48
2400:5f60::/32
2400:6000::/32
2400:6460::/40
2400:6600::/32
2400:6e60:1301::/48
2400:73e0::/32
2400:73e0:201::/48
2400:75aa::/32
2400:7bc0:20::/43
2400:7fc0::/40
@@ -101,17 +102,22 @@
2400:9520:434::/48
2400:95e0::/48
2400:9600:8800::/48
2400:9620::/32
2400:a040::/32
2400:a980::/29
2400:ae00:1981::/48
2400:b200::/32
2400:b600::/32
2400:b700::/48
2400:be00::/48
2400:cb80:e30::/44
2400:cb80:e40::/44
2400:da00::/32
2400:dd00::/28
2400:e3e0:aaa0::/44
2400:e3e0:abb0::/44
2400:ebc0::/32
2400:ed60::/48
2400:ee00::/32
2400:f6e0::/32
2400:f720::/32
@@ -127,7 +133,6 @@
2401:11a0:1500::/40
2401:11a0:d150::/48
2401:11a0:d152::/48
2401:11a0:d158::/48
2401:1200::/48
2401:1320::/32
2401:1740:2000::/48
@@ -159,9 +164,11 @@
2401:4a80::/32
2401:5960:5960::/48
2401:70e0::/32
2401:71c0::/48
2401:7700::/32
2401:7d40::/32
2401:7e00::/32
2401:8be0::/48
2401:8d00::/46
2401:8d00:7::/48
2401:8d00:8::/47
@@ -171,6 +178,9 @@
2401:8d00:10::/48
2401:8d00:12::/48
2401:8d00:14::/48
2401:8da0::/48
2401:95c0:f001::/48
2401:9ca0::/48
2401:a140:1::/48
2401:b180::/32
2401:b400::/45
@@ -208,7 +218,9 @@
2402:6f40:2::/47
2402:6fc0::/48
2402:7040::/32
2402:7240::/36
2402:7240:2000::/36
2402:7740:2000::/36
2402:7740:a000::/36
2402:7d80::/32
2402:8bc0::/32
2402:8cc0::/40
@@ -218,7 +230,7 @@
2402:93c0:20::/48
2402:93c0:100::/48
2402:9a80::/32
2402:9e80:60::/48
2402:9b80:10::/48
2402:a200::/32
2402:b8c0::/32
2402:b940::/40
@@ -246,7 +258,7 @@
2403:1ec0:1200::/48
2403:1ec0:1400::/48
2403:1ec0:1610::/48
2403:2040::/32
2403:2040::/48
2403:27c0:c03::/48
2403:27c0:1000::/48
2403:2b40::/32
@@ -255,6 +267,7 @@
2403:4280::/47
2403:4b40::/32
2403:4c80::/48
2403:4c80:128::/48
2403:5c80::/48
2403:6380:14::/47
2403:6380:20::/44
@@ -287,11 +300,12 @@
2404:bc0:4f00::/43
2404:1c80::/32
2404:2280:106::/47
2404:2280:10b::/48
2404:2280:10d::/48
2404:2280:10f::/48
2404:2280:112::/47
2404:2280:115::/48
2404:2280:11b::/48
2404:2280:11a::/47
2404:2280:11c::/47
2404:2280:11e::/48
2404:2280:123::/48
@@ -320,8 +334,7 @@
2404:2280:1bf::/48
2404:2280:1c1::/48
2404:2280:1c2::/47
2404:2280:1c4::/47
2404:2280:1c7::/48
2404:2280:1c4::/46
2404:2280:1c8::/48
2404:2280:1cb::/48
2404:2280:1cc::/48
@@ -333,8 +346,7 @@
2404:2280:1e0::/48
2404:2280:1e2::/47
2404:2280:1e4::/46
2404:2280:1e8::/48
2404:2280:1ea::/48
2404:2280:1e8::/46
2404:2280:1ec::/47
2404:2280:1ee::/48
2404:2280:1f0::/45
@@ -375,7 +387,6 @@
2404:c940::/48
2404:d7c0:2::/48
2404:e280::/47
2404:e5c0::/32
2404:e8c0::/32
2404:ea80:500:575::/64
2404:ea80:600:623::/64
@@ -396,6 +407,7 @@
2405:3140:31::/48
2405:3140:3a::/48
2405:3bc0::/48
2405:4540:8000::/48
2405:57c0::/47
2405:57c0:100::/48
2405:66c0::/32
@@ -432,11 +444,14 @@
2406:840:110::/48
2406:840:180::/48
2406:840:1c0::/48
2406:840:2e0::/48
2406:840:301::/48
2406:840:302::/48
2406:840:3c1::/48
2406:840:410::/48
2406:840:420::/48
2406:840:480::/48
2406:840:540::/48
2406:840:680::/48
2406:840:801::/48
2406:840:802::/47
@@ -468,26 +483,31 @@
2406:840:9700::/40
2406:840:9801::/48
2406:840:9810::/48
2406:840:981a::/48
2406:840:981c::/46
2406:840:9960::/47
2406:840:9962::/48
2406:840:9969::/48
2406:840:996f::/48
2406:840:9980::/48
2406:840:9984::/48
2406:840:9ef0::/44
2406:840:c0a8::/48
2406:840:e010::/47
2406:840:e014::/46
2406:840:e018::/45
2406:840:e030::/47
2406:840:e033::/48
2406:840:e03f::/48
2406:840:e080::/44
2406:840:e0c1::/48
2406:840:e0cf::/48
2406:840:e0e0::/44
2406:840:e10f::/48
2406:840:e14f::/48
2406:840:e180::/44
2406:840:e20f::/48
2406:840:e230::/48
2406:840:e230::/47
2406:840:e232::/48
2406:840:e234::/48
2406:840:e270::/44
2406:840:e300::/47
2406:840:e302::/48
@@ -510,7 +530,6 @@
2406:840:e84f::/48
2406:840:e880::/44
2406:840:eab0::/46
2406:840:eab4::/48
2406:840:eab6::/48
2406:840:eb00::/46
2406:840:eb04::/47
@@ -521,9 +540,12 @@
2406:840:eb80::/42
2406:840:ed02::/48
2406:840:eed0::/44
2406:840:efa0::/44
2406:840:eee0::/44
2406:840:f0a1::/48
2406:840:f0aa::/48
2406:840:f100::/47
2406:840:f200::/47
2406:840:f203::/48
2406:840:f230::/44
2406:840:f380::/44
2406:840:f401::/48
@@ -536,23 +558,33 @@
2406:840:fa01::/48
2406:840:fa02::/47
2406:840:fa04::/48
2406:840:fa40::/48
2406:840:fc80::/45
2406:840:fc88::/46
2406:840:fc8c::/47
2406:840:fc8e::/48
2406:840:fcc0::/44
2406:840:fd00::/47
2406:840:fd03::/48
2406:840:fd1f::/48
2406:840:fdd0::/47
2406:840:fd90::/44
2406:840:fda0::/43
2406:840:fdc0::/44
2406:840:fdd1::/48
2406:840:fde0::/48
2406:840:fe27::/48
2406:840:fe50::/48
2406:840:fe60::/48
2406:840:fe72::/47
2406:840:fe90::/46
2406:840:fec0::/47
2406:840:fec4::/47
2406:840:fec3::/48
2406:840:fec4::/46
2406:840:fec8::/45
2406:840:fed1::/48
2406:840:fed2::/47
2406:840:fed4::/46
2406:840:fed8::/47
2406:840:feda::/48
2406:840:fed8::/46
2406:840:fedd::/48
2406:840:fede::/47
2406:840:feed::/48
@@ -568,7 +600,8 @@
2406:3340::/32
2406:3640:1::/48
2406:3d80::/32
2406:4440:f000::/44
2406:4440:f000::/48
2406:4440:f00f::/48
2406:4d00::/48
2406:52c0::/32
2406:5340:6666::/48
@@ -583,6 +616,8 @@
2406:d440:100::/44
2406:d440:200::/44
2406:d440:300::/44
2406:d440:ff00::/48
2406:d440:ffff::/48
2406:e3c0::/32
2406:e500::/33
2407:2840::/48
@@ -608,6 +643,7 @@
2407:c080:5000::/37
2407:c080:6000::/36
2407:c080:8000::/36
2407:d9c0::/32
2408:4000::/22
2408:8000::/48
2408:8000:2::/47
@@ -1085,8 +1121,6 @@
2408:8a05:8000::/36
2408:8a06::/47
2408:8a06:100::/47
2408:8a07:6000::/38
2408:8a07:6400::/40
2408:8a21:4000::/35
2408:8a22:9200::/39
2408:8a22:9400::/38
@@ -1141,7 +1175,7 @@
240a:40c3:c200::/48
240a:40c3:c240::/48
240a:4172::/31
240a:41b0::/31
240a:41b0::/34
240a:41f2::/31
240a:4242::/31
240a:4280::/26
@@ -1166,7 +1200,7 @@
240d:c000:6000::/36
240d:c000:7000::/44
240d:c000:f000::/44
240d:c000:f020::/44
240d:c000:f020::/43
240d:c010::/47
240d:c010:14::/48
240d:c010:16::/48
@@ -1179,6 +1213,7 @@
240d:c010:6c::/48
240d:c040::/44
240e::/20
2601:1d08:4000::/44
2602:2a3::/48
2602:2a4:ff::/48
2602:2c3:810::/44
@@ -1191,19 +1226,31 @@
2602:fa4f:600::/40
2602:fab0:11::/48
2602:fbda:600::/48
2602:fbda:610::/48
2602:fbda:660::/48
2602:fbda:666::/48
2602:fc52:311::/48
2602:fc52:315::/48
2602:fd92:801::/48
2602:fe69:f26::/47
2602:fed2:7020::/46
2602:fed2:7101::/48
2602:fed2:731d::/48
2602:feda:182::/47
2602:feda:1bf::/48
2602:feda:1d1::/48
2602:feda:1d2::/48
2602:feda:2a0::/46
2602:feda:2a4::/47
2602:feda:2a6::/48
2602:feda:2aa::/48
2602:feda:2af::/48
2602:feda:2d0::/47
2602:feda:2f0::/48
2602:feda:3c5::/48
2602:feda:b8f::/48
2602:feda:c34::/48
2602:feda:ca1::/48
2602:feda:d80::/48
2602:feda:d83::/48
2602:ffe4:c5f::/48
@@ -1222,8 +1269,11 @@
2605:9d80:9052::/48
2605:9d80:9071::/48
2605:9d80:9092::/48
2605:f440:cafe::/48
2620:57:4004::/47
2804:1e48::/32
2a03:5840:f3::/48
2a03:5840:11b::/48
2a03:5840:290::/48
2a04:3e00:1002::/48
2a04:f580:8010::/47
@@ -1256,7 +1306,11 @@
2a04:f580:9290::/48
2a05:1085::/32
2a05:1087::/32
2a05:dfc1:1600::/40
2a05:4140:66::/48
2a05:dfc1:1600::/48
2a05:dfc1:1604::/48
2a05:dfc1:1607::/48
2a05:dfc1:1608::/48
2a05:dfc1:7106::/47
2a05:dfc1:7108::/47
2a05:dfc1:7110::/48
@@ -1271,17 +1325,23 @@
2a05:dfc1:8c22::/48
2a05:dfc1:8c24::/48
2a05:dfc1:8c42::/48
2a05:dfc1:8c90::/46
2a05:dfc1:8c94::/47
2a05:dfc1:8d00::/48
2a05:dfc1:8c90::/45
2a05:dfc1:8d02::/48
2a06:3600::/29
2a06:9f81:4610::/44
2a06:9f81:4620::/44
2a06:9f81:4640::/43
2a06:9f81:5100::/47
2a06:9f81:5102::/48
2a06:9f81:5400::/40
2a06:a005:260::/43
2a06:a005:280::/43
2a06:a005:2a0::/44
2a06:a005:486::/48
2a06:a005:8d0::/47
2a06:a005:8da::/48
2a06:a005:9c0::/48
2a06:a005:a13::/48
2a06:a005:b69::/48
2a06:a005:e80::/43
2a06:a005:f80::/44
2a06:a005:1340::/43
@@ -1292,10 +1352,14 @@
2a06:a005:13ea::/47
2a06:a005:13ed::/48
2a06:a005:13ef::/48
2a06:a005:1520::/44
2a06:a005:1800::/48
2a06:a005:1b60::/47
2a06:a005:1c40::/44
2a06:a005:1ee1::/48
2a06:a005:1ee9::/48
2a06:a005:1eee::/48
2a06:a005:2040::/44
2a06:a005:2100::/44
2a06:a005:28f3::/48
2a06:a005:28f4::/48
2a06:a005:2910::/44
@@ -1306,12 +1370,32 @@
2a06:a005:29d1::/48
2a06:de00:de04::/48
2a06:de00:de0e::/48
2a06:de01:80f::/48
2a06:de01:821::/48
2a06:de01:854::/48
2a06:de01:85f::/48
2a06:de01:8a4::/48
2a06:de01:8b8::/48
2a06:de01:8c4::/48
2a06:de01:8cb::/48
2a06:de01:917::/48
2a06:de01:92f::/48
2a06:de01:944::/47
2a06:de01:98c::/48
2a06:de01:9a8::/48
2a06:de01:acd::/48
2a06:de01:af9::/48
2a06:de01:b1a::/48
2a06:de01:b32::/48
2a06:e881:2509::/48
2a06:e881:5501::/48
2a06:e881:5502::/48
2a06:e881:5506::/48
2a06:e881:6600::/48
2a06:e881:6602::/47
2a06:e881:6606::/48
2a07:54c1:2200::/47
2a07:54c1:2202::/48
2a09:b280:ff80::/48
2a07:54c1:2200::/46
2a09:b280:ff80::/47
2a09:b280:ff83::/48
2a09:b280:ff84::/47
2a0a:2840:20::/43
@@ -1338,25 +1422,40 @@
2a0a:6040:5555::/48
2a0a:6040:6607::/48
2a0a:6040:6c40::/44
2a0a:6040:7e00::/48
2a0a:6040:a450::/47
2a0a:6040:a740::/48
2a0a:6040:a900::/47
2a0a:6040:b770::/44
2a0a:6040:c601::/48
2a0a:6040:c700::/42
2a0a:6040:c740::/47
2a0a:6040:c742::/48
2a0a:6040:c760::/47
2a0a:6040:c770::/44
2a0a:6040:c7a0::/48
2a0a:6040:ce11::/48
2a0a:6040:d310::/48
2a0a:6040:d400::/47
2a0a:6040:d600::/44
2a0a:6040:d610::/48
2a0a:6040:d612::/48
2a0a:6040:d614::/47
2a0a:6040:d617::/48
2a0a:6040:d710::/44
2a0a:6040:e300::/40
2a0a:6040:e410::/48
2a0a:6040:e541::/48
2a0a:6040:e543::/48
2a0a:6040:e544::/47
2a0a:6040:e54c::/48
2a0a:6040:e900::/40
2a0a:6040:ec00::/40
2a0a:6044:b800::/40
2a0b:b86:ffe0::/48
2a0b:b87:ffb5::/48
2a0b:2542::/48
2a0b:2542:300::/40
2a0b:4340:30::/44
2a0b:4340:70::/48
2a0b:4340:90::/48
@@ -1368,17 +1467,27 @@
2a0b:4340:a0::/44
2a0b:4340:c0::/44
2a0b:4340:d8::/48
2a0b:4340:400::/46
2a0b:4340:404::/47
2a0b:4340:406::/48
2a0b:4340:434::/48
2a0b:4340:560::/44
2a0b:4340:1304::/48
2a0b:4340:1340::/48
2a0c:9a40:8cf0::/48
2a0c:9a40:9e00::/43
2a0c:b641:210::/47
2a0c:b641:24f::/48
2a0c:b641:510::/48
2a0c:b641:570::/47
2a0c:b641:730::/44
2a0c:b641:a60::/44
2a0c:b641:b21::/48
2a0c:b642:4101::/48
2a0c:b642:4102::/47
2a0c:b642:4104::/46
2a0d:2146:8040::/48
2a0d:2406:510::/47
2a0d:2406:512::/48
2a0d:2580:ff00::/45
2a0d:2580:ff08::/46
2a0d:2581:fffc::/48
@@ -1386,6 +1495,8 @@
2a0d:2687::/32
2a0d:2904::/44
2a0d:c7c7::/32
2a0e:800:ff00::/48
2a0e:800:ff04::/48
2a0e:800:ff20::/47
2a0e:800:ff40::/42
2a0e:15c0:6::/48
@@ -1405,41 +1516,53 @@
2a0e:aa06:440::/48
2a0e:aa06:470::/44
2a0e:aa06:490::/44
2a0e:aa06:4e0::/44
2a0e:aa06:500::/44
2a0e:aa06:520::/48
2a0e:aa06:525::/48
2a0e:aa07:e00e::/48
2a0e:aa07:e01b::/48
2a0e:aa07:e024::/47
2a0e:aa07:e027::/48
2a0e:aa07:e030::/48
2a0e:aa07:e035::/48
2a0e:aa07:e039::/48
2a0e:aa07:e043::/48
2a0e:aa07:e050::/44
2a0e:aa07:e060::/48
2a0e:aa07:e071::/48
2a0e:aa07:e0f1::/48
2a0e:aa07:e0f7::/48
2a0e:aa07:e120::/44
2a0e:aa07:e130::/47
2a0e:aa07:e140::/47
2a0e:aa07:e143::/48
2a0e:aa07:e145::/48
2a0e:aa07:e146::/47
2a0e:aa07:e146::/48
2a0e:aa07:e148::/48
2a0e:aa07:e16a::/48
2a0e:aa07:e1a0::/46
2a0e:aa07:e1b0::/47
2a0e:aa07:e1b2::/48
2a0e:aa07:e1b4::/47
2a0e:aa07:e1b0::/44
2a0e:aa07:e1e1::/48
2a0e:aa07:e200::/44
2a0e:aa07:f000::/48
2a0e:aa07:f004::/48
2a0e:aa07:f008::/48
2a0e:aa07:f041::/48
2a0e:aa07:f042::/48
2a0e:aa07:f0d0::/48
2a0e:aa07:f0d0::/47
2a0e:aa07:f0d2::/48
2a0e:aa07:f0d4::/47
2a0e:aa07:f0d6::/48
2a0e:aa07:f0d8::/45
2a0e:aa07:f0e0::/44
2a0e:b107:30::/48
2a0e:b107:32::/47
2a0e:b107:a0::/44
2a0e:b107:12b::/48
2a0e:b107:1c1::/48
2a0e:b107:272::/48
2a0e:b107:710::/48
2a0e:b107:740::/44
2a0e:b107:790::/45
2a0e:b107:798::/46
2a0e:b107:c10::/48
2a0e:b107:da0::/44
2a0e:b107:dce::/48
@@ -1449,53 +1572,78 @@
2a0e:b107:1a40::/46
2a0e:b107:1b60::/48
2a0e:b107:1b6e::/47
2a0e:b107:1d25::/48
2a0e:b107:1e85::/48
2a0e:b107:2440::/44
2a0f:1440::/29
2a0f:2100::/29
2a0f:5707:ac01::/48
2a0f:5707:fe01::/48
2a0f:5707:fff4::/47
2a0f:5707:fff5::/48
2a0f:7802:e104::/47
2a0f:7802:e110::/47
2a0f:7802:e120::/44
2a0f:7802:e138::/45
2a0f:7802:e140::/46
2a0f:7803:dd00::/41
2a0f:7803:dd80::/42
2a0f:7803:f970::/44
2a0f:7803:fa21::/48
2a0f:7803:fa22::/47
2a0f:7803:fc00::/43
2a0f:7803:fc20::/44
2a0f:7803:fc80::/44
2a0f:7803:fcc0::/44
2a0f:7803:fcaa::/48
2a0f:7803:fe21::/48
2a0f:7803:fe22::/48
2a0f:7803:fe24::/48
2a0f:7803:fe80::/47
2a0f:7803:fe82::/48
2a0f:7803:fe84::/48
2a0f:7803:ff10::/48
2a0f:7980::/44
2a0f:85c1:100::/48
2a0f:85c1:3b5::/48
2a0f:85c1:816::/48
2a0f:9400:6110::/48
2a0f:9400:8016::/48
2a0f:9400:7700::/48
2a0f:9b00::/29
2a0f:e401:133::/48
2a10:2f00:13a::/48
2a10:2f00:147::/48
2a10:2f00:15a::/48
2a10:2f00:18e::/48
2a10:2f01:100::/48
2a10:3440::/29
2a10:cc40:180::/47
2a10:cc40:188::/48
2a10:cc40:190::/48
2a10:cc42:120::/43
2a10:ccc0:cc1::/48
2a10:ccc0:cc2::/48
2a10:ccc0:ccc::/48
2a10:ccc0:c0c3::/48
2a10:ccc0:ccc6::/48
2a10:ccc0:cccc::/46
2a11:f2c0:ffc4::/48
2a12:3fc2:6600::/48
2a12:3fc2:6666::/48
2a12:3fc2:aa10::/44
2a12:3fc2:aa40::/44
2a12:3fc2:ab50::/48
2a12:3fc2:e72e::/48
2a12:3fc2:e810::/44
2a12:3fc7::/48
2a12:3fc7:8000::/48
2a12:dd47:5c00::/40
2a12:f8c0:1000::/40
2a12:f8c3::/36
2a13:1800::/48
2a13:1800:10::/48
2a13:1800:80::/44
2a13:1800:300::/44
2a13:1801:180::/43
2a13:1802::/43
2a13:a5c3:f000::/40
2a13:a5c4:1000::/38
2a13:a5c4:1400::/39
2a13:a5c5::/48
2a13:a5c7:1200::/40
2a13:a5c7:1500::/40
2a13:a5c7:1600::/45
@@ -1505,30 +1653,39 @@
2a13:a5c7:1801::/48
2a13:a5c7:1802::/47
2a13:a5c7:1804::/47
2a13:a5c7:1888::/48
2a13:a5c7:2102::/47
2a13:a5c7:2104::/48
2a13:a5c7:2106::/48
2a13:a5c7:2109::/48
2a13:a5c7:2200::/40
2a13:aac4:f000::/44
2a13:b487:11da::/48
2a13:b487:1200::/43
2a13:b487:1ba2::/48
2a13:b487:1ba6::/47
2a13:b487:1bb2::/47
2a13:b487:1200::/44
2a13:b487:1bb2::/48
2a13:b487:1bba::/47
2a13:b487:1bc0::/47
2a13:b487:1bff::/48
2a13:b487:1f02::/47
2a13:b487:1f04::/46
2a13:df80:3b00::/44
2a13:df80:3b11::/48
2a13:df85:a201::/48
2a13:df85:a202::/47
2a13:df85:a204::/48
2a13:df85:a2ff::/48
2a13:df85:be10::/48
2a13:df85:be80::/48
2a13:df85:be88::/48
2a13:df85:be90::/48
2a13:df85:beaa::/48
2a13:df85:bed0::/48
2a13:df85:bedc::/48
2a13:df85:befe::/48
2a14:7c0:4a01::/48
2a14:7c0:4d00::/40
2a14:4c41::/32
2a14:7581:ffb::/48
2a14:7581:ffc::/48
2a14:7583::/32
2a14:7586::/31
2c0f:f7a8:8011::/48
2c0f:f7a8:8050::/48
2c0f:f7a8:805f::/48
@@ -1 +1 @@
20240602150004
20240708150024
File diff suppressed because it is too large Load Diff
@@ -1 +1 @@
202406062209
202407102210
@@ -3177,6 +3177,7 @@ liangzhichuanmei.com
lianyue.net
liaowangxizang.net
liberal.org.hk
libertysculpturepark.com
libertytimes.com.tw
library.usc.cuhk.edu.hk
libredd.it
@@ -5846,6 +5847,7 @@ wqyd.org
wrchina.org
wretch.cc
writer.zoho.com
writesonic.com
wsj.com
wsj.net
wsjhk.com
@@ -1 +1 @@
202406062209
202407102210
@@ -146,7 +146,7 @@ uci.foreach(uciconfig, uciserver, (cfg) => {
max_time_difference: cfg.tls_reality_max_time_difference ? (cfg.max_time_difference + 's') : null,
handshake: {
server: cfg.tls_reality_server_addr,
server_port: cfg.tls_reality_server_port
server_port: strToInt(cfg.tls_reality_server_port)
}
} : null
} : null,
@@ -457,14 +457,11 @@ function main() {
node_cache[groupHash] = {};
const res = wGET(url);
if (!res) {
if (isEmpty(res)) {
log(sprintf('Failed to fetch resources from %s.', url));
continue;
}
push(node_result, []);
const subindex = length(node_result) - 1;
let nodes;
try {
nodes = json(res).servers || json(res);
@@ -502,7 +499,8 @@ function main() {
config.packet_encoding = packet_encoding;
config.grouphash = groupHash;
push(node_result[subindex], config);
push(node_result, []);
push(node_result[length(node_result)-1], config);
node_cache[groupHash][confHash] = config;
node_cache[groupHash][nameHash] = config;
@@ -510,7 +508,10 @@ function main() {
}
}
log(sprintf('Successfully fetched %s nodes of total %s from %s.', count, length(nodes), url));
if (count == 0)
log(sprintf('No valid node found in %s.', url));
else
log(sprintf('Successfully fetched %s nodes of total %s from %s.', count, length(nodes), url));
}
if (isEmpty(node_result)) {
@@ -9,7 +9,7 @@ LUCI_TITLE:=LuCI support for quickstart
LUCI_DEPENDS:=+quickstart +luci-app-store
LUCI_PKGARCH:=all
PKG_VERSION:=0.8.13-2
PKG_VERSION:=0.8.13-3
# PKG_RELEASE MUST be empty for luci.mk
PKG_RELEASE:=
@@ -1,2 +1,11 @@
<% luci.template.render("quickstart/main", {prefix=luci.dispatcher.build_url("admin", "quickstart")}) %>
<%
local function vue_lang()
local i18n = require("luci.i18n")
local lang = i18n.translate("quickstart_vue_lang")
if lang == "quickstart_vue_lang" or lang == "" then
lang = "en"
end
return lang
end
-%>
<% luci.template.render("quickstart/main", {prefix=luci.dispatcher.build_url("admin", "quickstart"),lang=vue_lang()}) %>
@@ -35,7 +35,7 @@ namespace Ryujinx.Graphics.Vulkan
queue,
queueLock,
_gd.QueueFamilyIndex,
_gd.IsConcurrentFenceWaitUnsupported,
_gd.IsQualcommProprietary,
isLight: true);
}
}
@@ -1021,7 +1021,7 @@ namespace Ryujinx.Graphics.Vulkan
_newState.RasterizerDiscardEnable = discard;
SignalStateChange();
if (!discard && Gd.Vendor == Vendor.Qualcomm)
if (!discard && Gd.IsQualcommProprietary)
{
// On Adreno, enabling rasterizer discard somehow corrupts the viewport state.
// Force it to be updated on next use to work around this bug.
@@ -47,10 +47,11 @@ namespace Ryujinx.Graphics.Vulkan
return;
}
if (componentMask != 0xf)
if (componentMask != 0xf || Gd.IsQualcommProprietary)
{
// We can't use CmdClearAttachments if not writing all components,
// because on Vulkan, the pipeline state does not affect clears.
// On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all.
var dstTexture = FramebufferParams.GetColorView(index);
if (dstTexture == null)
{
@@ -87,10 +88,11 @@ namespace Ryujinx.Graphics.Vulkan
return;
}
if (stencilMask != 0 && stencilMask != 0xff)
if ((stencilMask != 0 && stencilMask != 0xff) || Gd.IsQualcommProprietary)
{
// We can't use CmdClearAttachments if not clearing all (mask is all ones, 0xFF) or none (mask is 0) of the stencil bits,
// because on Vulkan, the pipeline state does not affect clears.
// On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all.
var dstTexture = FramebufferParams.GetDepthStencilView();
if (dstTexture == null)
{
@@ -133,7 +133,7 @@ namespace Ryujinx.Graphics.Vulkan
Templates = BuildTemplates(usePushDescriptors);
// Updating buffer texture bindings using template updates crashes the Adreno driver on Windows.
UpdateTexturesWithoutTemplate = gd.Vendor == Vendor.Qualcomm && usesBufferTextures;
UpdateTexturesWithoutTemplate = gd.IsQualcommProprietary && usesBufferTextures;
_compileTask = Task.CompletedTask;
_firstBackgroundUse = false;
@@ -87,10 +87,10 @@ namespace Ryujinx.Graphics.Vulkan
internal bool IsAmdGcn { get; private set; }
internal bool IsNvidiaPreTuring { get; private set; }
internal bool IsIntelArc { get; private set; }
internal bool IsQualcommProprietary { get; private set; }
internal bool IsMoltenVk { get; private set; }
internal bool IsTBDR { get; private set; }
internal bool IsSharedMemory { get; private set; }
internal bool IsConcurrentFenceWaitUnsupported { get; private set; }
public string GpuVendor { get; private set; }
public string GpuDriver { get; private set; }
@@ -325,8 +325,6 @@ namespace Ryujinx.Graphics.Vulkan
Vendor == Vendor.Broadcom ||
Vendor == Vendor.ImgTec;
IsConcurrentFenceWaitUnsupported = Vendor == Vendor.Qualcomm;
GpuVendor = VendorUtils.GetNameFromId(properties.VendorID);
GpuDriver = hasDriverProperties && !OperatingSystem.IsMacOS() ?
VendorUtils.GetFriendlyDriverName(driverProperties.DriverID) : GpuVendor; // Fallback to vendor name if driver is unavailable or on MacOS where vendor is preferred.
@@ -348,7 +346,7 @@ namespace Ryujinx.Graphics.Vulkan
{
IsNvidiaPreTuring = gpuNumber < 2000;
}
else if (GpuDriver.Contains("TITAN") && !GpuDriver.Contains("RTX"))
else if (GpuRenderer.Contains("TITAN") && !GpuRenderer.Contains("RTX"))
{
IsNvidiaPreTuring = true;
}
@@ -358,6 +356,8 @@ namespace Ryujinx.Graphics.Vulkan
IsIntelArc = GpuRenderer.StartsWith("Intel(R) Arc(TM)");
}
IsQualcommProprietary = hasDriverProperties && driverProperties.DriverID == DriverId.QualcommProprietary;
ulong minResourceAlignment = Math.Max(
Math.Max(
properties.Limits.MinStorageBufferOffsetAlignment,
@@ -415,7 +415,7 @@ namespace Ryujinx.Graphics.Vulkan
Api.TryGetDeviceExtension(_instance.Instance, _device, out ExtExternalMemoryHost hostMemoryApi);
HostMemoryAllocator = new HostMemoryAllocator(MemoryAllocator, Api, hostMemoryApi, _device);
CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex, IsConcurrentFenceWaitUnsupported);
CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex, IsQualcommProprietary);
PipelineLayoutCache = new PipelineLayoutCache();
@@ -692,7 +692,7 @@ namespace Ryujinx.Graphics.Vulkan
GpuVendor,
memoryType: memoryType,
hasFrontFacingBug: IsIntelWindows,
hasVectorIndexingBug: Vendor == Vendor.Qualcomm,
hasVectorIndexingBug: IsQualcommProprietary,
needsFragmentOutputSpecialization: IsMoltenVk,
reduceShaderPrecision: IsMoltenVk,
supportsAstcCompression: features2.Features.TextureCompressionAstcLdr && supportsAstcFormats,
+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dns2tcp
PKG_VERSION:=1.1.1
PKG_VERSION:=1.1.2
PKG_RELEASE:=2
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/zfl9/dns2tcp/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=35251fbe1645601086f21cdbd5a2f75471d812f99ed8017bb05158840456b43c
PKG_HASH:=5e8c6302a1d32c16ae7d4b8e39cd9aad1f2d7e68fe18813e76cb1e48ec5940d2
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
PKG_LICENSE:=AGPL-3.0-only
+2 -2
View File
@@ -12,13 +12,13 @@ PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
include $(INCLUDE_DIR)/package.mk
GEOIP_VER:=202407040043
GEOIP_VER:=202407110044
GEOIP_FILE:=geoip.dat.$(GEOIP_VER)
define Download/geoip
URL:=https://github.com/v2fly/geoip/releases/download/$(GEOIP_VER)/
URL_FILE:=geoip.dat
FILE:=$(GEOIP_FILE)
HASH:=c55f7e9866acb963873b0d907404b395bd3b7447470b5407d79868c3d1c0cb04
HASH:=83c8d38a4fff932fcbfe726c1f85c0debb1bf169afcfa18566c731a2f2c1f7b6
endef
GEOSITE_VER:=20240710044910
+2 -7
View File
@@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace v2rayN.Common
@@ -60,4 +55,4 @@ namespace v2rayN.Common
#endregion YAML
}
}
}
@@ -59,6 +59,10 @@ namespace v2rayN.Handler.Fmt
{
dicQuery.Add("spx", Utils.UrlEncode(item.spiderX));
}
if (item.allowInsecure.Equals("true"))
{
dicQuery.Add("allowInsecure", "1");
}
dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : nameof(ETransport.tcp));
+11 -114
View File
@@ -1,5 +1,4 @@
using System.Text.RegularExpressions;
using v2rayN.Enums;
using v2rayN.Enums;
using v2rayN.Models;
using v2rayN.Resx;
@@ -7,17 +6,13 @@ namespace v2rayN.Handler.Fmt
{
internal class VmessFmt : BaseFmt
{
private static readonly Regex StdVmessUserInfo = new(
@"^(?<network>[a-z]+)(\+(?<streamSecurity>[a-z]+))?:(?<id>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$", RegexOptions.Compiled);
public static ProfileItem? Resolve(string str, out string msg)
{
msg = ResUI.ConfigurationFormatIncorrect;
ProfileItem? item;
int indexSplit = str.IndexOf("?");
if (indexSplit > 0)
if (str.IndexOf('?') > 0 && str.IndexOf('&') > 0)
{
item = ResolveStdVmess(str) ?? ResolveVmess4Kitsunebi(str);
item = ResolveStdVmess(str);
}
else
{
@@ -107,7 +102,7 @@ namespace v2rayN.Handler.Fmt
return item;
}
private static ProfileItem? ResolveStdVmess(string result)
public static ProfileItem? ResolveStdVmess(string str)
{
ProfileItem item = new()
{
@@ -115,113 +110,15 @@ namespace v2rayN.Handler.Fmt
security = "auto"
};
Uri u = new(result);
Uri url = new(str);
item.address = u.IdnHost;
item.port = u.Port;
item.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped);
var query = Utils.ParseQueryString(u.Query);
item.address = url.IdnHost;
item.port = url.Port;
item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped);
item.id = Utils.UrlDecode(url.UserInfo);
var m = StdVmessUserInfo.Match(u.UserInfo);
if (!m.Success) return null;
item.id = m.Groups["id"].Value;
if (m.Groups["streamSecurity"].Success)
{
item.streamSecurity = m.Groups["streamSecurity"].Value;
}
switch (item.streamSecurity)
{
case Global.StreamSecurity:
break;
default:
if (!Utils.IsNullOrEmpty(item.streamSecurity))
return null;
break;
}
item.network = m.Groups["network"].Value;
switch (item.network)
{
case nameof(ETransport.tcp):
string t1 = query["type"] ?? Global.None;
item.headerType = t1;
break;
case nameof(ETransport.kcp):
item.headerType = query["type"] ?? Global.None;
break;
case nameof(ETransport.ws):
case nameof(ETransport.httpupgrade):
case nameof(ETransport.splithttp):
string p1 = query["path"] ?? "/";
string h1 = query["host"] ?? "";
item.requestHost = Utils.UrlDecode(h1);
item.path = p1;
break;
case nameof(ETransport.http):
case nameof(ETransport.h2):
item.network = nameof(ETransport.h2);
string p2 = query["path"] ?? "/";
string h2 = query["host"] ?? "";
item.requestHost = Utils.UrlDecode(h2);
item.path = p2;
break;
case nameof(ETransport.quic):
string s = query["security"] ?? Global.None;
string k = query["key"] ?? "";
string t3 = query["type"] ?? Global.None;
item.headerType = t3;
item.requestHost = Utils.UrlDecode(s);
item.path = k;
break;
default:
return null;
}
return item;
}
private static ProfileItem? ResolveVmess4Kitsunebi(string result)
{
ProfileItem item = new()
{
configType = EConfigType.VMess
};
result = result[Global.ProtocolShares[EConfigType.VMess].Length..];
int indexSplit = result.IndexOf("?");
if (indexSplit > 0)
{
result = result[..indexSplit];
}
result = Utils.Base64Decode(result);
string[] arr1 = result.Split('@');
if (arr1.Length != 2)
{
return null;
}
string[] arr21 = arr1[0].Split(':');
string[] arr22 = arr1[1].Split(':');
if (arr21.Length != 2 || arr22.Length != 2)
{
return null;
}
item.address = arr22[0];
item.port = Utils.ToInt(arr22[1]);
item.security = arr21[0];
item.id = arr21[1];
item.network = Global.DefaultNetwork;
item.headerType = Global.None;
item.remarks = "Alien";
var query = Utils.ParseQueryString(url.Query);
ResolveStdTransport(query, ref item);
return item;
}
@@ -1,6 +1,4 @@

using static v2rayN.Models.ClashProxies;
using static v2rayN.Models.ClashProxies;
namespace v2rayN.Models
{
@@ -167,7 +167,7 @@ namespace v2rayN.ViewModels
public void ProxiesDelayTest()
{
ProxiesDelayTest(true);
}
}
#region proxy function
@@ -337,7 +337,7 @@ namespace v2rayN.ViewModels
private ProxiesItem? TryGetProxy(string name)
{
if(proxies is null)
if (proxies is null)
return null;
proxies.TryGetValue(name, out ProxiesItem proxy2);
if (proxy2 != null)
@@ -479,7 +479,7 @@ namespace v2rayN.ViewModels
}
Thread.Sleep(1000);
}
});
});
}
#endregion task
@@ -151,6 +151,7 @@ namespace v2rayN.ViewModels
//CheckUpdate
public ReactiveCommand<Unit, Unit> CheckUpdateNCmd { get; }
public ReactiveCommand<Unit, Unit> CheckUpdateXrayCoreCmd { get; }
public ReactiveCommand<Unit, Unit> CheckUpdateClashMetaCoreCmd { get; }
public ReactiveCommand<Unit, Unit> CheckUpdateSingBoxCoreCmd { get; }
@@ -1519,11 +1520,11 @@ namespace v2rayN.ViewModels
{
BlReloadEnabled = true;
ShowCalshUI = (_config.runningCoreType is ECoreType.clash or ECoreType.clash_meta or ECoreType.mihomo);
if (ShowCalshUI) {
if (ShowCalshUI)
{
Locator.Current.GetService<ClashProxiesViewModel>()?.ProxiesReload();
}
}));
});
}
@@ -1,6 +1,6 @@
using v2rayN.ViewModels;
using ReactiveUI;
using System.Reactive.Disposables;
using v2rayN.ViewModels;
namespace v2rayN.Views
{
@@ -1,13 +1,12 @@
<reactiveui:ReactiveUserControl
x:Class="v2rayN.Views.ClashProxiesView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:v2rayN.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:v2rayN.Views"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:reactiveui="http://reactiveui.net"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converters="clr-namespace:v2rayN.Converters"
xmlns:resx="clr-namespace:v2rayN.Resx"
xmlns:vms="clr-namespace:v2rayN.ViewModels"
d:DesignHeight="450"
@@ -1,8 +1,8 @@
using v2rayN.ViewModels;
using ReactiveUI;
using Splat;
using System.Reactive.Disposables;
using System.Windows.Input;
using v2rayN.ViewModels;
namespace v2rayN.Views
{
@@ -38,7 +38,6 @@ namespace v2rayN.Views
{
cmbdomainStrategy4Out.Items.Add(it);
});
this.WhenActivated(disposables =>
{
@@ -1,12 +1,12 @@
<reactiveui:ReactiveWindow
x:Class="v2rayN.Views.RoutingRuleDetailsWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="clr-namespace:v2rayN.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:reactiveui="http://reactiveui.net"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:conv="clr-namespace:v2rayN.Converters"
xmlns:resx="clr-namespace:v2rayN.Resx"
xmlns:vms="clr-namespace:v2rayN.ViewModels"
Title="{x:Static resx:ResUI.menuRoutingRuleDetailsSetting}"
@@ -1,12 +1,12 @@
<reactiveui:ReactiveWindow
x:Class="v2rayN.Views.RoutingRuleSettingWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="clr-namespace:v2rayN.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:reactiveui="http://reactiveui.net"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:conv="clr-namespace:v2rayN.Converters"
xmlns:resx="clr-namespace:v2rayN.Resx"
xmlns:vms="clr-namespace:v2rayN.ViewModels"
Title="{x:Static resx:ResUI.menuRoutingRuleSetting}"
@@ -395,14 +395,18 @@ object AngConfigManager {
count = parseCustomConfigServer(server, subid)
}
if (parseBatchSubscription(server, subid) > 0) {
updateConfigViaSubAll()
return 1
var countSub = parseBatchSubscription(server)
if (countSub <= 0) {
countSub = parseBatchSubscription(Utils.decode(server))
}
return count
if (countSub > 0) {
updateConfigViaSubAll()
}
return count + countSub
}
fun parseBatchSubscription(servers: String?, subid: String): Int {
fun parseBatchSubscription(servers: String?): Int {
try {
if (servers == null) {
return 0
@@ -410,7 +414,6 @@ object AngConfigManager {
var count = 0
servers.lines()
.reversed()
.forEach { str ->
if (str.startsWith(AppConfig.PROTOCOL_HTTP) || str.startsWith(AppConfig.PROTOCOL_HTTPS)) {
count += MmkvManager.importUrlAsSubscription(str)
@@ -488,7 +491,7 @@ object AngConfigManager {
if (serverList.isNotEmpty()) {
var count = 0
for (srv in serverList) {
for (srv in serverList.reversed()) {
val config = ServerConfig.create(EConfigType.CUSTOM)
config.fullConfig =
Gson().fromJson(Gson().toJson(srv), V2rayConfig::class.java)
@@ -7,7 +7,6 @@ import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import com.v2ray.ang.dto.AppInfo
import rx.Observable
import java.util.*
object AppManagerUtil {
fun loadNetworkAppList(ctx: Context): ArrayList<AppInfo> {
@@ -31,9 +30,10 @@ object AppManagerUtil {
return apps
}
fun rxLoadNetworkAppList(ctx: Context): Observable<ArrayList<AppInfo>> = Observable.unsafeCreate {
it.onNext(loadNetworkAppList(ctx))
}
fun rxLoadNetworkAppList(ctx: Context): Observable<ArrayList<AppInfo>> =
Observable.unsafeCreate {
it.onNext(loadNetworkAppList(ctx))
}
val PackageInfo.hasInternetPermission: Boolean
get() {
@@ -179,7 +179,7 @@ object MmkvManager {
}
}
fun sortByTestResults( ) {
fun sortByTestResults() {
data class ServerDelay(var guid: String, var testDelayMillis: Long)
val serverDelays = mutableListOf<ServerDelay>()
@@ -7,7 +7,7 @@ import android.content.res.Resources
import android.os.Build
import android.os.LocaleList
import androidx.annotation.RequiresApi
import java.util.*
import java.util.Locale
open class MyContextWrapper(base: Context?) : ContextWrapper(base) {
companion object {
@@ -52,7 +52,8 @@ object SpeedtestUtil {
val allText = process.inputStream.bufferedReader().use { it.readText() }
if (!TextUtils.isEmpty(allText)) {
val tempInfo = allText.substring(allText.indexOf("min/avg/max/mdev") + 19)
val temps = tempInfo.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
val temps =
tempInfo.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
if (temps.count() > 0 && temps[0].length < 10) {
return temps[0].toFloat().toInt().toString() + "ms"
}
@@ -70,7 +71,7 @@ object SpeedtestUtil {
tcpTestingSockets.add(socket)
}
val start = System.currentTimeMillis()
socket.connect(InetSocketAddress(url, port),3000)
socket.connect(InetSocketAddress(url, port), 3000)
val time = System.currentTimeMillis() - start
synchronized(this) {
tcpTestingSockets.remove(socket)
@@ -105,8 +106,11 @@ object SpeedtestUtil {
val url = URL(Utils.getDelayTestUrl())
conn = url.openConnection(
Proxy(Proxy.Type.HTTP,
InetSocketAddress("127.0.0.1", port))) as HttpURLConnection
Proxy(
Proxy.Type.HTTP,
InetSocketAddress("127.0.0.1", port)
)
) as HttpURLConnection
conn.connectTimeout = 30000
conn.readTimeout = 30000
conn.setRequestProperty("Connection", "close")
@@ -120,11 +124,19 @@ object SpeedtestUtil {
if (code == 204 || code == 200 && conn.responseLength == 0L) {
result = context.getString(R.string.connection_test_available, elapsed)
} else {
throw IOException(context.getString(R.string.connection_test_error_status_code, code))
throw IOException(
context.getString(
R.string.connection_test_error_status_code,
code
)
)
}
} catch (e: IOException) {
// network exception
Log.d(AppConfig.ANG_PACKAGE, "testConnection IOException: " + Log.getStackTraceString(e))
Log.d(
AppConfig.ANG_PACKAGE,
"testConnection IOException: " + Log.getStackTraceString(e)
)
result = context.getString(R.string.connection_test_error, e.message)
} catch (e: Exception) {
// library exception, eg sumsung
@@ -142,7 +142,8 @@ object V2rayConfigUtil {
settingsStorage?.decodeBool(AppConfig.PREF_SNIFFING_ENABLED, true)
?: true
v2rayConfig.inbounds[0].sniffing?.enabled = fakedns || sniffAllTlsAndHttp
v2rayConfig.inbounds[0].sniffing?.routeOnly = settingsStorage?.decodeBool(AppConfig.PREF_ROUTE_ONLY_ENABLED, false)
v2rayConfig.inbounds[0].sniffing?.routeOnly =
settingsStorage?.decodeBool(AppConfig.PREF_ROUTE_ONLY_ENABLED, false)
if (!sniffAllTlsAndHttp) {
v2rayConfig.inbounds[0].sniffing?.destOverride?.clear()
}
@@ -188,7 +189,7 @@ object V2rayConfigUtil {
)
routingUserRule(
settingsStorage?.decodeString(AppConfig.PREF_V2RAY_ROUTING_DIRECT)
?: "", AppConfig.TAG_DIRECT, v2rayConfig
?: "", TAG_DIRECT, v2rayConfig
)
routingUserRule(
settingsStorage?.decodeString(AppConfig.PREF_V2RAY_ROUTING_BLOCKED)
@@ -210,37 +211,38 @@ object V2rayConfigUtil {
when (routingMode) {
ERoutingMode.BYPASS_LAN.value -> {
routingGeo("ip", "private", AppConfig.TAG_DIRECT, v2rayConfig)
routingGeo("ip", "private", TAG_DIRECT, v2rayConfig)
}
ERoutingMode.BYPASS_MAINLAND.value -> {
routingGeo("", "cn", AppConfig.TAG_DIRECT, v2rayConfig)
routingGeo("domain", "geolocation-cn", AppConfig.TAG_DIRECT, v2rayConfig)
routingGeo("", "cn", TAG_DIRECT, v2rayConfig)
routingGeo("domain", "geolocation-cn", TAG_DIRECT, v2rayConfig)
v2rayConfig.routing.rules.add(0, googleapisRoute)
}
ERoutingMode.BYPASS_LAN_MAINLAND.value -> {
routingGeo("ip", "private", AppConfig.TAG_DIRECT, v2rayConfig)
routingGeo("", "cn", AppConfig.TAG_DIRECT, v2rayConfig)
routingGeo("domain", "geolocation-cn", AppConfig.TAG_DIRECT, v2rayConfig)
routingGeo("ip", "private", TAG_DIRECT, v2rayConfig)
routingGeo("", "cn", TAG_DIRECT, v2rayConfig)
routingGeo("domain", "geolocation-cn", TAG_DIRECT, v2rayConfig)
v2rayConfig.routing.rules.add(0, googleapisRoute)
}
ERoutingMode.GLOBAL_DIRECT.value -> {
val globalDirect = V2rayConfig.RoutingBean.RulesBean(
outboundTag = AppConfig.TAG_DIRECT,
outboundTag = TAG_DIRECT,
port = "0-65535"
)
v2rayConfig.routing.rules.add(globalDirect)
}
}
if(routingMode != ERoutingMode.GLOBAL_DIRECT.value) {
if (routingMode != ERoutingMode.GLOBAL_DIRECT.value) {
v2rayConfig.routing.rules.add(
V2rayConfig.RoutingBean.RulesBean(
outboundTag = AppConfig.TAG_PROXY,
port = "0-65535"
))
)
)
}
} catch (e: Exception) {
@@ -465,7 +467,7 @@ object V2rayConfigUtil {
if (Utils.isPureIpAddress(domesticDns.first())) {
v2rayConfig.routing.rules.add(
0, V2rayConfig.RoutingBean.RulesBean(
outboundTag = AppConfig.TAG_DIRECT,
outboundTag = TAG_DIRECT,
port = "53",
ip = arrayListOf(domesticDns.first()),
domain = null
@@ -597,7 +599,8 @@ object V2rayConfigUtil {
mux = null
)
var packets = settingsStorage?.decodeString(AppConfig.PREF_FRAGMENT_PACKETS) ?: "tlshello"
var packets =
settingsStorage?.decodeString(AppConfig.PREF_FRAGMENT_PACKETS) ?: "tlshello"
if (v2rayConfig.outbounds[0].streamSettings?.security == V2rayConfig.REALITY
&& packets == "tlshello"
) {
@@ -96,7 +96,7 @@ object ShadowsocksFmt {
for (pair in pairs) {
val idx = pair.indexOf("=")
if (idx == -1) {
queryPairs[Utils.urlDecode(pair)] = "";
queryPairs[Utils.urlDecode(pair)] = ""
} else {
queryPairs[Utils.urlDecode(pair.substring(0, idx))] =
Utils.urlDecode(pair.substring(idx + 1))
@@ -118,9 +118,9 @@ object ShadowsocksFmt {
null
)
} else if (queryPairs["plugin"] == "v2ray-plugin") {
var network = "ws";
var network = "ws"
if (queryPairs["mode"] == "quic") {
network = "quic";
network = "quic"
}
sni = config.outboundBean?.streamSettings?.populateTransportSettings(
network,
@@ -20,7 +20,7 @@ object TrojanFmt {
}
fun parseTrojan(str: String): ServerConfig? {
val allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
val config = ServerConfig.create(EConfigType.TROJAN)
val uri = URI(Utils.fixIllegalUrl(str))
@@ -28,35 +28,37 @@ object TrojanFmt {
var flow = ""
var fingerprint = config.outboundBean?.streamSettings?.tlsSettings?.fingerprint
if (uri.rawQuery.isNullOrEmpty()) {
config.outboundBean?.streamSettings?.populateTlsSettings(
V2rayConfig.TLS, allowInsecure, "",
fingerprint, null, null, null, null
)
} else {
val queryParam = uri.rawQuery.split("&")
.associate { it.split("=").let { (k, v) -> k to Utils.urlDecode(v) } }
if (uri.rawQuery.isNullOrEmpty()) return null
val sni = config.outboundBean?.streamSettings?.populateTransportSettings(
queryParam["type"] ?: "tcp",
queryParam["headerType"],
queryParam["host"],
queryParam["path"],
queryParam["seed"],
queryParam["quicSecurity"],
queryParam["key"],
queryParam["mode"],
queryParam["serviceName"],
queryParam["authority"]
)
fingerprint = queryParam["fp"] ?: ""
config.outboundBean?.streamSettings?.populateTlsSettings(
queryParam["security"] ?: V2rayConfig.TLS,
allowInsecure, queryParam["sni"] ?: sni?:"", fingerprint, queryParam["alpn"],
null, null, null
)
flow = queryParam["flow"] ?: ""
}
val queryParam = uri.rawQuery.split("&")
.associate { it.split("=").let { (k, v) -> k to Utils.urlDecode(v) } }
val sni = config.outboundBean?.streamSettings?.populateTransportSettings(
queryParam["type"] ?: "tcp",
queryParam["headerType"],
queryParam["host"],
queryParam["path"],
queryParam["seed"],
queryParam["quicSecurity"],
queryParam["key"],
queryParam["mode"],
queryParam["serviceName"],
queryParam["authority"]
)
fingerprint = queryParam["fp"] ?: ""
allowInsecure = if ((queryParam["allowInsecure"] ?: "") == "1") true else allowInsecure
config.outboundBean?.streamSettings?.populateTlsSettings(
queryParam["security"] ?: V2rayConfig.TLS,
allowInsecure,
queryParam["sni"] ?: sni ?: "",
fingerprint,
queryParam["alpn"],
null,
null,
null
)
flow = queryParam["flow"] ?: ""
config.outboundBean?.settings?.servers?.get(0)?.let { server ->
server.address = uri.idnHost
@@ -78,7 +80,6 @@ object TrojanFmt {
if (!TextUtils.isEmpty(it)) {
dicQuery["flow"] = it
}
}
dicQuery["security"] = streamSetting.security.ifEmpty { "none" }
@@ -92,16 +93,16 @@ object TrojanFmt {
Utils.removeWhiteSpace(tlsSetting.alpn.joinToString()).orEmpty()
}
if (!TextUtils.isEmpty(tlsSetting.fingerprint)) {
dicQuery["fp"] = tlsSetting.fingerprint?:""
dicQuery["fp"] = tlsSetting.fingerprint ?: ""
}
if (!TextUtils.isEmpty(tlsSetting.publicKey)) {
dicQuery["pbk"] = tlsSetting.publicKey?:""
dicQuery["pbk"] = tlsSetting.publicKey ?: ""
}
if (!TextUtils.isEmpty(tlsSetting.shortId)) {
dicQuery["sid"] = tlsSetting.shortId?:""
dicQuery["sid"] = tlsSetting.shortId ?: ""
}
if (!TextUtils.isEmpty(tlsSetting.spiderX)) {
dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX?:"")
dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX ?: "")
}
}
dicQuery["type"] =
@@ -20,7 +20,7 @@ object VlessFmt {
}
fun parseVless(str: String): ServerConfig? {
val allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
val config = ServerConfig.create(EConfigType.VLESS)
val uri = URI(Utils.fixIllegalUrl(str))
@@ -31,7 +31,7 @@ object VlessFmt {
val streamSetting = config.outboundBean?.streamSettings ?: return null
config.remarks = Utils.urlDecode(uri.fragment ?: "")
config.outboundBean?.settings?.vnext?.get(0)?.let { vnext ->
config.outboundBean.settings?.vnext?.get(0)?.let { vnext ->
vnext.address = uri.idnHost
vnext.port = uri.port
vnext.users[0].id = uri.userInfo
@@ -51,6 +51,7 @@ object VlessFmt {
queryParam["serviceName"],
queryParam["authority"]
)
allowInsecure = if ((queryParam["allowInsecure"] ?: "") == "1") true else allowInsecure
streamSetting.populateTlsSettings(
queryParam["security"] ?: "",
allowInsecure,
@@ -92,16 +93,16 @@ object VlessFmt {
Utils.removeWhiteSpace(tlsSetting.alpn.joinToString()).orEmpty()
}
if (!TextUtils.isEmpty(tlsSetting.fingerprint)) {
dicQuery["fp"] = tlsSetting.fingerprint?:""
dicQuery["fp"] = tlsSetting.fingerprint ?: ""
}
if (!TextUtils.isEmpty(tlsSetting.publicKey)) {
dicQuery["pbk"] = tlsSetting.publicKey?:""
dicQuery["pbk"] = tlsSetting.publicKey ?: ""
}
if (!TextUtils.isEmpty(tlsSetting.shortId)) {
dicQuery["sid"] = tlsSetting.shortId?:""
dicQuery["sid"] = tlsSetting.shortId ?: ""
}
if (!TextUtils.isEmpty(tlsSetting.spiderX)) {
dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX?:"")
dicQuery["spx"] = Utils.urlEncode(tlsSetting.spiderX ?: "")
}
}
dicQuery["type"] =
@@ -22,68 +22,64 @@ object VmessFmt {
}
fun parseVmess(str: String): ServerConfig? {
if (str.indexOf('?') > 0 && str.indexOf('&') > 0) {
return parseVmessStd(str)
}
val allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
val config = ServerConfig.create(EConfigType.VMESS)
val streamSetting = config.outboundBean?.streamSettings ?: return null
if (!tryParseNewVmess(str, config, allowInsecure)) {
if (str.indexOf("?") > 0) {
if (!tryResolveVmess4Kitsunebi(str, config)) {
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_incorrect_protocol")
return null
}
} else {
var result = str.replace(EConfigType.VMESS.protocolScheme, "")
result = Utils.decode(result)
if (TextUtils.isEmpty(result)) {
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_decoding_failed")
return null
}
val vmessQRCode = Gson().fromJson(result, VmessQRCode::class.java)
// Although VmessQRCode fields are non null, looks like Gson may still create null fields
if (TextUtils.isEmpty(vmessQRCode.add) || TextUtils.isEmpty(vmessQRCode.port) || TextUtils.isEmpty(
vmessQRCode.id
) || TextUtils.isEmpty(vmessQRCode.net)
) {
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_incorrect_protocol")
return null
}
config.remarks = vmessQRCode.ps
config.outboundBean?.settings?.vnext?.get(0)?.let { vnext ->
vnext.address = vmessQRCode.add
vnext.port = Utils.parseInt(vmessQRCode.port)
vnext.users[0].id = vmessQRCode.id
vnext.users[0].security =
if (TextUtils.isEmpty(vmessQRCode.scy)) V2rayConfig.DEFAULT_SECURITY else vmessQRCode.scy
vnext.users[0].alterId = Utils.parseInt(vmessQRCode.aid)
}
val sni = streamSetting.populateTransportSettings(
vmessQRCode.net,
vmessQRCode.type,
vmessQRCode.host,
vmessQRCode.path,
vmessQRCode.path,
vmessQRCode.host,
vmessQRCode.path,
vmessQRCode.type,
vmessQRCode.path,
vmessQRCode.host
)
val fingerprint = vmessQRCode.fp ?: streamSetting.tlsSettings?.fingerprint
streamSetting.populateTlsSettings(
vmessQRCode.tls,
allowInsecure,
if (TextUtils.isEmpty(vmessQRCode.sni)) sni else vmessQRCode.sni,
fingerprint,
vmessQRCode.alpn,
null,
null,
null
)
}
var result = str.replace(EConfigType.VMESS.protocolScheme, "")
result = Utils.decode(result)
if (TextUtils.isEmpty(result)) {
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_decoding_failed")
return null
}
val vmessQRCode = Gson().fromJson(result, VmessQRCode::class.java)
// Although VmessQRCode fields are non null, looks like Gson may still create null fields
if (TextUtils.isEmpty(vmessQRCode.add)
|| TextUtils.isEmpty(vmessQRCode.port)
|| TextUtils.isEmpty(vmessQRCode.id)
|| TextUtils.isEmpty(vmessQRCode.net)
) {
Log.d(AppConfig.ANG_PACKAGE, "R.string.toast_incorrect_protocol")
return null
}
config.remarks = vmessQRCode.ps
config.outboundBean.settings?.vnext?.get(0)?.let { vnext ->
vnext.address = vmessQRCode.add
vnext.port = Utils.parseInt(vmessQRCode.port)
vnext.users[0].id = vmessQRCode.id
vnext.users[0].security =
if (TextUtils.isEmpty(vmessQRCode.scy)) V2rayConfig.DEFAULT_SECURITY else vmessQRCode.scy
vnext.users[0].alterId = Utils.parseInt(vmessQRCode.aid)
}
val sni = streamSetting.populateTransportSettings(
vmessQRCode.net,
vmessQRCode.type,
vmessQRCode.host,
vmessQRCode.path,
vmessQRCode.path,
vmessQRCode.host,
vmessQRCode.path,
vmessQRCode.type,
vmessQRCode.path,
vmessQRCode.host
)
val fingerprint = vmessQRCode.fp
streamSetting.populateTlsSettings(
vmessQRCode.tls,
allowInsecure,
if (TextUtils.isEmpty(vmessQRCode.sni)) sni else vmessQRCode.sni,
fingerprint,
vmessQRCode.alpn,
null,
null,
null
)
return config
}
@@ -114,80 +110,51 @@ object VmessFmt {
return Utils.encode(json)
}
private fun tryParseNewVmess(
uriString: String, config: ServerConfig, allowInsecure: Boolean
): Boolean {
return runCatching {
val uri = URI(Utils.fixIllegalUrl(uriString))
check(uri.scheme == "vmess")
val (_, protocol, tlsStr, uuid, alterId) = Regex("(tcp|http|ws|kcp|quic|grpc)(\\+tls)?:([0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12})").matchEntire(
uri.userInfo
)?.groupValues ?: error("parse user info fail.")
val tls = tlsStr.isNotBlank()
val queryParam = uri.rawQuery.split("&")
.associate { it.split("=").let { (k, v) -> k to Utils.urlDecode(v) } }
fun parseVmessStd(str: String): ServerConfig? {
var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
val config = ServerConfig.create(EConfigType.VMESS)
val streamSetting = config.outboundBean?.streamSettings ?: return false
config.remarks = Utils.urlDecode(uri.fragment ?: "")
config.outboundBean.settings?.vnext?.get(0)?.let { vnext ->
vnext.address = uri.idnHost
vnext.port = uri.port
vnext.users[0].id = uuid
vnext.users[0].security = V2rayConfig.DEFAULT_SECURITY
vnext.users[0].alterId = alterId.toInt()
}
var fingerprint = streamSetting.tlsSettings?.fingerprint
val sni = streamSetting.populateTransportSettings(protocol,
queryParam["type"],
queryParam["host"]?.split("|")?.get(0) ?: "",
queryParam["path"]?.takeIf { it.trim() != "/" } ?: "",
queryParam["seed"],
queryParam["security"],
queryParam["key"],
queryParam["mode"],
queryParam["serviceName"],
queryParam["authority"])
streamSetting.populateTlsSettings(
if (tls) V2rayConfig.TLS else "",
allowInsecure,
sni,
fingerprint,
null,
null,
null,
null
)
true
}.getOrElse { false }
}
val uri = URI(Utils.fixIllegalUrl(str))
if (uri.rawQuery.isNullOrEmpty()) return null
val queryParam = uri.rawQuery.split("&")
.associate { it.split("=").let { (k, v) -> k to Utils.urlDecode(v) } }
private fun tryResolveVmess4Kitsunebi(server: String, config: ServerConfig): Boolean {
val streamSetting = config.outboundBean?.streamSettings ?: return null
var result = server.replace(EConfigType.VMESS.protocolScheme, "")
val indexSplit = result.indexOf("?")
if (indexSplit > 0) {
result = result.substring(0, indexSplit)
}
result = Utils.decode(result)
val arr1 = result.split('@')
if (arr1.count() != 2) {
return false
}
val arr21 = arr1[0].split(':')
val arr22 = arr1[1].split(':')
if (arr21.count() != 2) {
return false
}
config.remarks = "Alien"
config.outboundBean?.settings?.vnext?.get(0)?.let { vnext ->
vnext.address = arr22[0]
vnext.port = Utils.parseInt(arr22[1])
vnext.users[0].id = arr21[1]
vnext.users[0].security = arr21[0]
config.remarks = Utils.urlDecode(uri.fragment ?: "")
config.outboundBean.settings?.vnext?.get(0)?.let { vnext ->
vnext.address = uri.idnHost
vnext.port = uri.port
vnext.users[0].id = uri.userInfo
vnext.users[0].security = V2rayConfig.DEFAULT_SECURITY
vnext.users[0].alterId = 0
}
return true
val sni = streamSetting.populateTransportSettings(
queryParam["type"] ?: "tcp",
queryParam["headerType"],
queryParam["host"],
queryParam["path"],
queryParam["seed"],
queryParam["quicSecurity"],
queryParam["key"],
queryParam["mode"],
queryParam["serviceName"],
queryParam["authority"]
)
allowInsecure = if ((queryParam["allowInsecure"] ?: "") == "1") true else allowInsecure
streamSetting.populateTlsSettings(
queryParam["security"] ?: "",
allowInsecure,
queryParam["sni"] ?: sni,
queryParam["fp"] ?: "",
queryParam["alpn"],
null,
null,
null
)
return config
}
}
@@ -25,14 +25,15 @@ object WireguardFmt {
?: AppConfig.WIREGUARD_LOCAL_ADDRESS_V4).removeWhiteSpace()
.split(",")
wireguard.peers?.get(0)?.publicKey = queryParam["publickey"] ?: ""
wireguard.peers?.get(0)?.endpoint = Utils.getIpv6Address(uri.idnHost) + ":${uri.port}"
wireguard.peers?.get(0)?.endpoint =
Utils.getIpv6Address(uri.idnHost) + ":${uri.port}"
wireguard.mtu = Utils.parseInt(queryParam["mtu"] ?: AppConfig.WIREGUARD_LOCAL_MTU)
wireguard.reserved =
(queryParam["reserved"] ?: "0,0,0").removeWhiteSpace().split(",")
.map { it.toInt() }
}
return config
}else {
} else {
return null
}
}
+1 -1
View File
@@ -20,7 +20,7 @@ require (
github.com/stretchr/testify v1.9.0
github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e
github.com/vishvananda/netlink v1.2.1-beta.2.0.20230316163032-ced5aaba43e3
github.com/xtls/reality v0.0.0-20240429224917-ecc4401070cc
github.com/xtls/reality v0.0.0-20240711105359-4dbe0df83874
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba
golang.org/x/crypto v0.25.0
golang.org/x/net v0.27.0
+2 -2
View File
@@ -163,8 +163,8 @@ github.com/vishvananda/netlink v1.2.1-beta.2.0.20230316163032-ced5aaba43e3/go.mo
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
github.com/xtls/reality v0.0.0-20240429224917-ecc4401070cc h1:0Nj8T1n7F7+v4vRVroaJIvY6R0vNABLfPH+lzPHRJvI=
github.com/xtls/reality v0.0.0-20240429224917-ecc4401070cc/go.mod h1:dm4y/1QwzjGaK17ofi0Vs6NpKAHegZky8qk6J2JJZAE=
github.com/xtls/reality v0.0.0-20240711105359-4dbe0df83874 h1:Y6YuIN3XH/x+klNP7C/BfY2EUJzqXyNkQNfqGa+OCS4=
github.com/xtls/reality v0.0.0-20240711105359-4dbe0df83874/go.mod h1:dm4y/1QwzjGaK17ofi0Vs6NpKAHegZky8qk6J2JJZAE=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
@@ -0,0 +1,121 @@
package browser_dialer
import (
"bytes"
"context"
_ "embed"
"encoding/base64"
"net/http"
"time"
"github.com/gorilla/websocket"
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/platform"
"github.com/xtls/xray-core/common/uuid"
)
//go:embed dialer.html
var webpage []byte
var conns chan *websocket.Conn
var upgrader = &websocket.Upgrader{
ReadBufferSize: 0,
WriteBufferSize: 0,
HandshakeTimeout: time.Second * 4,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func init() {
addr := platform.NewEnvFlag(platform.BrowserDialerAddress).GetValue(func() string { return "" })
if addr != "" {
token := uuid.New()
csrfToken := token.String()
webpage = bytes.ReplaceAll(webpage, []byte("csrfToken"), []byte(csrfToken))
conns = make(chan *websocket.Conn, 256)
go http.ListenAndServe(addr, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/websocket" {
if r.URL.Query().Get("token") == csrfToken {
if conn, err := upgrader.Upgrade(w, r, nil); err == nil {
conns <- conn
} else {
errors.LogError(context.Background(), "Browser dialer http upgrade unexpected error")
}
}
} else {
w.Write(webpage)
}
}))
}
}
func HasBrowserDialer() bool {
return conns != nil
}
func DialWS(uri string, ed []byte) (*websocket.Conn, error) {
data := []byte("WS " + uri)
if ed != nil {
data = append(data, " "+base64.RawURLEncoding.EncodeToString(ed)...)
}
return dialRaw(data)
}
func DialGet(uri string) (*websocket.Conn, error) {
data := []byte("GET " + uri)
return dialRaw(data)
}
func DialPost(uri string, payload []byte) error {
data := []byte("POST " + uri)
conn, err := dialRaw(data)
if err != nil {
return err
}
err = conn.WriteMessage(websocket.BinaryMessage, payload)
if err != nil {
return err
}
err = CheckOK(conn)
if err != nil {
return err
}
conn.Close()
return nil
}
func dialRaw(data []byte) (*websocket.Conn, error) {
var conn *websocket.Conn
for {
conn = <-conns
if conn.WriteMessage(websocket.TextMessage, data) != nil {
conn.Close()
} else {
break
}
}
err := CheckOK(conn)
if err != nil {
return nil, err
}
return conn, nil
}
func CheckOK(conn *websocket.Conn) error {
if _, p, err := conn.ReadMessage(); err != nil {
conn.Close()
return err
} else if s := string(p); s != "ok" {
conn.Close()
return errors.New(s)
}
return nil
}
@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html>
<head>
<title>Browser Dialer</title>
</head>
<body>
<script>
// Copyright (c) 2021 XRAY. Mozilla Public License 2.0.
var url = "ws://" + window.location.host + "/websocket?token=csrfToken";
var clientIdleCount = 0;
var upstreamGetCount = 0;
var upstreamWsCount = 0;
var upstreamPostCount = 0;
setInterval(check, 1000);
function check() {
if (clientIdleCount > 0) {
return;
}
clientIdleCount += 1;
console.log("Prepare", url);
var ws = new WebSocket(url);
// arraybuffer is significantly faster in chrome than default
// blob, tested with chrome 123
ws.binaryType = "arraybuffer";
ws.onmessage = function (event) {
clientIdleCount -= 1;
let [method, url, protocol] = event.data.split(" ");
if (method == "WS") {
upstreamWsCount += 1;
console.log("Dial WS", url, protocol);
const wss = new WebSocket(url, protocol);
wss.binaryType = "arraybuffer";
var opened = false;
ws.onmessage = function (event) {
wss.send(event.data)
}
wss.onopen = function (event) {
opened = true;
ws.send("ok")
}
wss.onmessage = function (event) {
ws.send(event.data)
}
wss.onclose = function (event) {
upstreamWsCount -= 1;
console.log("Dial WS DONE, remaining: ", upstreamWsCount);
ws.close()
}
wss.onerror = function (event) {
!opened && ws.send("fail")
wss.close()
}
ws.onclose = function (event) {
wss.close()
}
} else if (method == "GET") {
(async () => {
console.log("Dial GET", url);
ws.send("ok");
const controller = new AbortController();
/*
Aborting a streaming response in JavaScript
requires two levers to be pulled:
First, the streaming read itself has to be cancelled using
reader.cancel(), only then controller.abort() will actually work.
If controller.abort() alone is called while a
reader.read() is ongoing, it will block until the server closes the
response, the page is refreshed or the network connection is lost.
*/
let reader = null;
ws.onclose = (event) => {
try {
reader && reader.cancel();
} catch(e) {}
try {
controller.abort();
} catch(e) {}
}
try {
upstreamGetCount += 1;
const response = await fetch(url, {signal: controller.signal});
const body = await response.body;
reader = body.getReader();
while (true) {
const { done, value } = await reader.read();
ws.send(value);
if (done) break;
}
} finally {
upstreamGetCount -= 1;
console.log("Dial GET DONE, remaining: ", upstreamGetCount);
ws.close();
}
})()
} else if (method == "POST") {
upstreamPostCount += 1;
console.log("Dial POST", url);
ws.send("ok");
ws.onmessage = async (event) => {
try {
const response = await fetch(
url,
{method: "POST", body: event.data}
);
if (response.ok) {
ws.send("ok");
} else {
console.error("bad status code");
ws.send("fail");
}
} finally {
upstreamPostCount -= 1;
console.log("Dial POST DONE, remaining: ", upstreamPostCount);
ws.close();
}
};
}
check()
}
ws.onerror = function (event) {
ws.close()
}
}
</script>
</body>
</html>
@@ -0,0 +1,39 @@
package splithttp
import (
"context"
"io"
"io/ioutil"
gonet "net"
"github.com/xtls/xray-core/transport/internet/browser_dialer"
"github.com/xtls/xray-core/transport/internet/websocket"
)
// implements splithttp.DialerClient in terms of browser dialer
// has no fields because everything is global state :O)
type BrowserDialerClient struct{}
func (c *BrowserDialerClient) OpenDownload(ctx context.Context, baseURL string) (io.ReadCloser, gonet.Addr, gonet.Addr, error) {
conn, err := browser_dialer.DialGet(baseURL)
dummyAddr := &gonet.IPAddr{}
if err != nil {
return nil, dummyAddr, dummyAddr, err
}
return websocket.NewConnection(conn, dummyAddr, nil), conn.RemoteAddr(), conn.LocalAddr(), nil
}
func (c *BrowserDialerClient) SendUploadRequest(ctx context.Context, url string, payload io.ReadWriteCloser, contentLength int64) error {
bytes, err := ioutil.ReadAll(payload)
if err != nil {
return err
}
err = browser_dialer.DialPost(url, bytes)
if err != nil {
return err
}
return nil
}
@@ -0,0 +1,169 @@
package splithttp
import (
"bytes"
"context"
"io"
gonet "net"
"net/http"
"net/http/httptrace"
"sync"
"github.com/xtls/xray-core/common"
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/net"
"github.com/xtls/xray-core/common/signal/done"
)
// interface to abstract between use of browser dialer, vs net/http
type DialerClient interface {
// (ctx, baseURL, payload) -> err
// baseURL already contains sessionId and seq
SendUploadRequest(context.Context, string, io.ReadWriteCloser, int64) error
// (ctx, baseURL) -> (downloadReader, remoteAddr, localAddr)
// baseURL already contains sessionId
OpenDownload(context.Context, string) (io.ReadCloser, net.Addr, net.Addr, error)
}
// implements splithttp.DialerClient in terms of direct network connections
type DefaultDialerClient struct {
transportConfig *Config
download *http.Client
upload *http.Client
isH2 bool
// pool of net.Conn, created using dialUploadConn
uploadRawPool *sync.Pool
dialUploadConn func(ctxInner context.Context) (net.Conn, error)
}
func (c *DefaultDialerClient) OpenDownload(ctx context.Context, baseURL string) (io.ReadCloser, gonet.Addr, gonet.Addr, error) {
var remoteAddr gonet.Addr
var localAddr gonet.Addr
// this is done when the TCP/UDP connection to the server was established,
// and we can unblock the Dial function and print correct net addresses in
// logs
gotConn := done.New()
var downResponse io.ReadCloser
gotDownResponse := done.New()
go func() {
trace := &httptrace.ClientTrace{
GotConn: func(connInfo httptrace.GotConnInfo) {
remoteAddr = connInfo.Conn.RemoteAddr()
localAddr = connInfo.Conn.LocalAddr()
gotConn.Close()
},
}
// in case we hit an error, we want to unblock this part
defer gotConn.Close()
req, err := http.NewRequestWithContext(
httptrace.WithClientTrace(ctx, trace),
"GET",
baseURL,
nil,
)
if err != nil {
errors.LogInfoInner(ctx, err, "failed to construct download http request")
gotDownResponse.Close()
return
}
req.Header = c.transportConfig.GetRequestHeader()
response, err := c.download.Do(req)
gotConn.Close()
if err != nil {
errors.LogInfoInner(ctx, err, "failed to send download http request")
gotDownResponse.Close()
return
}
if response.StatusCode != 200 {
response.Body.Close()
errors.LogInfo(ctx, "invalid status code on download:", response.Status)
gotDownResponse.Close()
return
}
downResponse = response.Body
gotDownResponse.Close()
}()
// we want to block Dial until we know the remote address of the server,
// for logging purposes
<-gotConn.Wait()
lazyDownload := &LazyReader{
CreateReader: func() (io.ReadCloser, error) {
<-gotDownResponse.Wait()
if downResponse == nil {
return nil, errors.New("downResponse failed")
}
return downResponse, nil
},
}
return lazyDownload, remoteAddr, localAddr, nil
}
func (c *DefaultDialerClient) SendUploadRequest(ctx context.Context, url string, payload io.ReadWriteCloser, contentLength int64) error {
req, err := http.NewRequest("POST", url, payload)
req.ContentLength = contentLength
if err != nil {
return err
}
req.Header = c.transportConfig.GetRequestHeader()
if c.isH2 {
resp, err := c.upload.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return errors.New("bad status code:", resp.Status)
}
} else {
// stringify the entire HTTP/1.1 request so it can be
// safely retried. if instead req.Write is called multiple
// times, the body is already drained after the first
// request
requestBytes := new(bytes.Buffer)
common.Must(req.Write(requestBytes))
var uploadConn any
for {
uploadConn = c.uploadRawPool.Get()
newConnection := uploadConn == nil
if newConnection {
uploadConn, err = c.dialUploadConn(context.WithoutCancel(ctx))
if err != nil {
return err
}
}
_, err = uploadConn.(net.Conn).Write(requestBytes.Bytes())
// if the write failed, we try another connection from
// the pool, until the write on a new connection fails.
// failed writes to a pooled connection are normal when
// the connection has been closed in the meantime.
if err == nil {
break
} else if newConnection {
return err
}
}
c.uploadRawPool.Put(uploadConn)
}
return nil
}
+46 -162
View File
@@ -1,13 +1,10 @@
package splithttp
import (
"bytes"
"context"
gotls "crypto/tls"
"io"
gonet "net"
"net/http"
"net/http/httptrace"
"net/url"
"strconv"
"sync"
@@ -17,10 +14,10 @@ import (
"github.com/xtls/xray-core/common/buf"
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/net"
"github.com/xtls/xray-core/common/signal/done"
"github.com/xtls/xray-core/common/signal/semaphore"
"github.com/xtls/xray-core/common/uuid"
"github.com/xtls/xray-core/transport/internet"
"github.com/xtls/xray-core/transport/internet/browser_dialer"
"github.com/xtls/xray-core/transport/internet/stat"
"github.com/xtls/xray-core/transport/internet/tls"
"github.com/xtls/xray-core/transport/pipe"
@@ -32,32 +29,31 @@ type dialerConf struct {
*internet.MemoryStreamConfig
}
type reusedClient struct {
download *http.Client
upload *http.Client
isH2 bool
// pool of net.Conn, created using dialUploadConn
uploadRawPool *sync.Pool
dialUploadConn func(ctxInner context.Context) (net.Conn, error)
}
var (
globalDialerMap map[dialerConf]reusedClient
globalDialerMap map[dialerConf]DialerClient
globalDialerAccess sync.Mutex
)
func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) reusedClient {
func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) DialerClient {
if browser_dialer.HasBrowserDialer() {
return &BrowserDialerClient{}
}
globalDialerAccess.Lock()
defer globalDialerAccess.Unlock()
if globalDialerMap == nil {
globalDialerMap = make(map[dialerConf]reusedClient)
globalDialerMap = make(map[dialerConf]DialerClient)
}
if client, found := globalDialerMap[dialerConf{dest, streamSettings}]; found {
return client
}
if browser_dialer.HasBrowserDialer() {
return &BrowserDialerClient{}
}
tlsConfig := tls.ConfigFromStreamSettings(streamSettings)
isH2 := tlsConfig != nil && !(len(tlsConfig.NextProtocol) == 1 && tlsConfig.NextProtocol[0] == "http/1.1")
@@ -116,7 +112,8 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
uploadTransport = nil
}
client := reusedClient{
client := &DefaultDialerClient{
transportConfig: streamSettings.ProtocolSettings.(*Config),
download: &http.Client{
Transport: downloadTransport,
},
@@ -160,80 +157,9 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
httpClient := getHTTPClient(ctx, dest, streamSettings)
var remoteAddr gonet.Addr
var localAddr gonet.Addr
// this is done when the TCP/UDP connection to the server was established,
// and we can unblock the Dial function and print correct net addresses in
// logs
gotConn := done.New()
var downResponse io.ReadCloser
gotDownResponse := done.New()
sessionIdUuid := uuid.New()
sessionId := sessionIdUuid.String()
go func() {
trace := &httptrace.ClientTrace{
GotConn: func(connInfo httptrace.GotConnInfo) {
remoteAddr = connInfo.Conn.RemoteAddr()
localAddr = connInfo.Conn.LocalAddr()
gotConn.Close()
},
}
// in case we hit an error, we want to unblock this part
defer gotConn.Close()
req, err := http.NewRequestWithContext(
httptrace.WithClientTrace(context.WithoutCancel(ctx), trace),
"GET",
requestURL.String()+sessionId,
nil,
)
if err != nil {
errors.LogInfoInner(ctx, err, "failed to construct download http request")
gotDownResponse.Close()
return
}
req.Header = transportConfiguration.GetRequestHeader()
response, err := httpClient.download.Do(req)
gotConn.Close()
if err != nil {
errors.LogInfoInner(ctx, err, "failed to send download http request")
gotDownResponse.Close()
return
}
if response.StatusCode != 200 {
response.Body.Close()
errors.LogInfo(ctx, "invalid status code on download:", response.Status)
gotDownResponse.Close()
return
}
// skip "ooooooooook" response
trashHeader := []byte{0}
for {
_, err = io.ReadFull(response.Body, trashHeader)
if err != nil {
response.Body.Close()
errors.LogInfoInner(ctx, err, "failed to read initial response")
gotDownResponse.Close()
return
}
if trashHeader[0] == 'k' {
break
}
}
downResponse = response.Body
gotDownResponse.Close()
}()
uploadUrl := requestURL.String() + sessionId + "/"
baseURL := requestURL.String() + sessionId
uploadPipeReader, uploadPipeWriter := pipe.New(pipe.WithSizeLimit(maxUploadSize))
@@ -252,97 +178,55 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
<-requestsLimiter.Wait()
url := uploadUrl + strconv.FormatInt(requestCounter, 10)
seq := requestCounter
requestCounter += 1
go func() {
defer requestsLimiter.Signal()
req, err := http.NewRequest("POST", url, &buf.MultiBufferContainer{MultiBuffer: chunk})
err := httpClient.SendUploadRequest(
context.WithoutCancel(ctx),
baseURL+"/"+strconv.FormatInt(seq, 10),
&buf.MultiBufferContainer{MultiBuffer: chunk},
int64(chunk.Len()),
)
if err != nil {
errors.LogInfoInner(ctx, err, "failed to send upload")
uploadPipeReader.Interrupt()
return
}
req.ContentLength = int64(chunk.Len())
req.Header = transportConfiguration.GetRequestHeader()
if httpClient.isH2 {
resp, err := httpClient.upload.Do(req)
if err != nil {
errors.LogInfoInner(ctx, err, "failed to send upload")
uploadPipeReader.Interrupt()
return
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
errors.LogInfo(ctx, "failed to send upload, bad status code:", resp.Status)
uploadPipeReader.Interrupt()
return
}
} else {
var uploadConn any
// stringify the entire HTTP/1.1 request so it can be
// safely retried. if instead req.Write is called multiple
// times, the body is already drained after the first
// request
requestBytes := new(bytes.Buffer)
common.Must(req.Write(requestBytes))
for {
uploadConn = httpClient.uploadRawPool.Get()
newConnection := uploadConn == nil
if newConnection {
uploadConn, err = httpClient.dialUploadConn(context.WithoutCancel(ctx))
if err != nil {
errors.LogInfoInner(ctx, err, "failed to connect upload")
uploadPipeReader.Interrupt()
return
}
}
_, err = uploadConn.(net.Conn).Write(requestBytes.Bytes())
// if the write failed, we try another connection from
// the pool, until the write on a new connection fails.
// failed writes to a pooled connection are normal when
// the connection has been closed in the meantime.
if err == nil {
break
} else if newConnection {
errors.LogInfoInner(ctx, err, "failed to send upload")
uploadPipeReader.Interrupt()
return
}
}
httpClient.uploadRawPool.Put(uploadConn)
}
}()
}
}()
// we want to block Dial until we know the remote address of the server,
// for logging purposes
<-gotConn.Wait()
lazyRawDownload, remoteAddr, localAddr, err := httpClient.OpenDownload(context.WithoutCancel(ctx), baseURL)
if err != nil {
return nil, err
}
lazyDownload := &LazyReader{
CreateReader: func() (io.ReadCloser, error) {
// skip "ooooooooook" response
trashHeader := []byte{0}
for {
_, err := io.ReadFull(lazyRawDownload, trashHeader)
if err != nil {
return nil, errors.New("failed to read initial response").Base(err)
}
if trashHeader[0] == 'k' {
break
}
}
return lazyRawDownload, nil
},
}
// necessary in order to send larger chunks in upload
bufferedUploadPipeWriter := buf.NewBufferedWriter(uploadPipeWriter)
bufferedUploadPipeWriter.SetBuffered(false)
lazyDownload := &LazyReader{
CreateReader: func() (io.ReadCloser, error) {
<-gotDownResponse.Wait()
if downResponse == nil {
return nil, errors.New("downResponse failed")
}
return downResponse, nil
},
}
conn := splitConn{
writer: bufferedUploadPipeWriter,
reader: lazyDownload,
@@ -32,7 +32,7 @@ type requestHandler struct {
}
type httpSession struct {
uploadQueue *UploadQueue
uploadQueue *uploadQueue
// for as long as the GET request is not opened by the client, this will be
// open ("undone"), and the session may be expired within a certain TTL.
// after the client connects, this becomes "done" and the session lives as
@@ -163,7 +163,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
writer.Header().Set("X-Accel-Buffering", "no")
// magic header to make the HTTP middle box consider this as SSE to disable buffer
writer.Header().Set("Content-Type", "text/event-stream")
writer.WriteHeader(http.StatusOK)
// send a chunk immediately to enable CDN streaming.
// many CDN buffer the response headers until the origin starts sending
@@ -15,7 +15,7 @@ type Packet struct {
Seq uint64
}
type UploadQueue struct {
type uploadQueue struct {
pushedPackets chan Packet
heap uploadHeap
nextSeq uint64
@@ -23,8 +23,8 @@ type UploadQueue struct {
maxPackets int
}
func NewUploadQueue(maxPackets int) *UploadQueue {
return &UploadQueue{
func NewUploadQueue(maxPackets int) *uploadQueue {
return &uploadQueue{
pushedPackets: make(chan Packet, maxPackets),
heap: uploadHeap{},
nextSeq: 0,
@@ -33,7 +33,7 @@ func NewUploadQueue(maxPackets int) *UploadQueue {
}
}
func (h *UploadQueue) Push(p Packet) error {
func (h *uploadQueue) Push(p Packet) error {
if h.closed {
return errors.New("splithttp packet queue closed")
}
@@ -42,13 +42,13 @@ func (h *UploadQueue) Push(p Packet) error {
return nil
}
func (h *UploadQueue) Close() error {
func (h *uploadQueue) Close() error {
h.closed = true
close(h.pushedPackets)
return nil
}
func (h *UploadQueue) Read(b []byte) (int, error) {
func (h *uploadQueue) Read(b []byte) (int, error) {
if h.closed {
return 0, io.EOF
}
@@ -15,16 +15,14 @@ var _ buf.Writer = (*connection)(nil)
// connection is a wrapper for net.Conn over WebSocket connection.
type connection struct {
conn *websocket.Conn
reader io.Reader
remoteAddr net.Addr
conn *websocket.Conn
reader io.Reader
}
func newConnection(conn *websocket.Conn, remoteAddr net.Addr, extraReader io.Reader) *connection {
func NewConnection(conn *websocket.Conn, remoteAddr net.Addr, extraReader io.Reader) *connection {
return &connection{
conn: conn,
remoteAddr: remoteAddr,
reader: extraReader,
conn: conn,
reader: extraReader,
}
}
@@ -92,7 +90,7 @@ func (c *connection) LocalAddr() net.Addr {
}
func (c *connection) RemoteAddr() net.Addr {
return c.remoteAddr
return c.conn.RemoteAddr()
}
func (c *connection) SetDeadline(t time.Time) error {
@@ -1,54 +1,23 @@
package websocket
import (
"bytes"
"context"
_ "embed"
"encoding/base64"
"io"
gonet "net"
"net/http"
"time"
"github.com/gorilla/websocket"
"github.com/xtls/xray-core/common"
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/net"
"github.com/xtls/xray-core/common/platform"
"github.com/xtls/xray-core/common/uuid"
"github.com/xtls/xray-core/transport/internet"
"github.com/xtls/xray-core/transport/internet/browser_dialer"
"github.com/xtls/xray-core/transport/internet/stat"
"github.com/xtls/xray-core/transport/internet/tls"
)
//go:embed dialer.html
var webpage []byte
var conns chan *websocket.Conn
func init() {
addr := platform.NewEnvFlag(platform.BrowserDialerAddress).GetValue(func() string { return "" })
if addr != "" {
token := uuid.New()
csrfToken := token.String()
webpage = bytes.ReplaceAll(webpage, []byte("csrfToken"), []byte(csrfToken))
conns = make(chan *websocket.Conn, 256)
go http.ListenAndServe(addr, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/websocket" {
if r.URL.Query().Get("token") == csrfToken {
if conn, err := upgrader.Upgrade(w, r, nil); err == nil {
conns <- conn
} else {
errors.LogError(context.Background(), "Browser dialer http upgrade unexpected error")
}
}
} else {
w.Write(webpage)
}
}))
}
}
// Dial dials a WebSocket connection to the given destination.
func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) {
errors.LogInfo(ctx, "creating connection to ", dest)
@@ -98,18 +67,18 @@ func dialWebSocket(ctx context.Context, dest net.Destination, streamSettings *in
// Like the NetDial in the dialer
pconn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings)
if err != nil {
errors.LogErrorInner(ctx, err, "failed to dial to " + addr)
errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
return nil, err
}
// TLS and apply the handshake
cn := tls.UClient(pconn, tlsConfig, fingerprint).(*tls.UConn)
if err := cn.WebsocketHandshakeContext(ctx); err != nil {
errors.LogErrorInner(ctx, err, "failed to dial to " + addr)
errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
return nil, err
}
if !tlsConfig.InsecureSkipVerify {
if err := cn.VerifyHostname(tlsConfig.ServerName); err != nil {
errors.LogErrorInner(ctx, err, "failed to dial to " + addr)
errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
return nil, err
}
}
@@ -124,28 +93,13 @@ func dialWebSocket(ctx context.Context, dest net.Destination, streamSettings *in
}
uri := protocol + "://" + host + wsSettings.GetNormalizedPath()
if conns != nil {
data := []byte(uri)
if ed != nil {
data = append(data, " "+base64.RawURLEncoding.EncodeToString(ed)...)
}
var conn *websocket.Conn
for {
conn = <-conns
if conn.WriteMessage(websocket.TextMessage, data) != nil {
conn.Close()
} else {
break
}
}
if _, p, err := conn.ReadMessage(); err != nil {
conn.Close()
if browser_dialer.HasBrowserDialer() {
conn, err := browser_dialer.DialWS(uri, ed)
if err != nil {
return nil, err
} else if s := string(p); s != "ok" {
conn.Close()
return nil, errors.New(s)
}
return newConnection(conn, conn.RemoteAddr(), nil), nil
return NewConnection(conn, conn.RemoteAddr(), nil), nil
}
header := wsSettings.GetRequestHeader()
@@ -163,7 +117,7 @@ func dialWebSocket(ctx context.Context, dest net.Destination, streamSettings *in
return nil, errors.New("failed to dial to (", uri, "): ", reason).Base(err)
}
return newConnection(conn, conn.RemoteAddr(), nil), nil
return NewConnection(conn, conn.RemoteAddr(), nil), nil
}
type delayDialConn struct {
@@ -1,59 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Browser Dialer</title>
</head>
<body>
<script>
// Copyright (c) 2021 XRAY. Mozilla Public License 2.0.
var url = "ws://" + window.location.host + "/websocket?token=csrfToken"
var count = 0
setInterval(check, 1000)
function check() {
if (count <= 0) {
count += 1
console.log("Prepare", url)
var ws = new WebSocket(url)
// arraybuffer is significantly faster in chrome than default
// blob, tested with chrome 123
ws.binaryType = "arraybuffer";
var wss = undefined
var first = true
ws.onmessage = function (event) {
if (first) {
first = false
count -= 1
var arr = event.data.split(" ")
console.log("Dial", arr[0], arr[1])
wss = new WebSocket(arr[0], arr[1])
wss.binaryType = "arraybuffer";
var opened = false
wss.onopen = function (event) {
opened = true
ws.send("ok")
}
wss.onmessage = function (event) {
ws.send(event.data)
}
wss.onclose = function (event) {
ws.close()
}
wss.onerror = function (event) {
!opened && ws.send("fail")
wss.close()
}
check()
} else wss.send(event.data)
}
ws.onclose = function (event) {
if (first) count -= 1
else wss.close()
}
ws.onerror = function (event) {
ws.close()
}
}
}
</script>
</body>
</html>
@@ -73,7 +73,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
}
}
h.ln.addConn(newConnection(conn, remoteAddr, extraReader))
h.ln.addConn(NewConnection(conn, remoteAddr, extraReader))
}
type Listener struct {
+1
View File
@@ -8,3 +8,4 @@
*.qm binary
*.mo binary
*.gmo binary
*.strings binary
+1 -1
View File
@@ -96,7 +96,7 @@ jobs:
:SetNewVCToolsVersion
set VCToolsVersion=
mingw64-clang-tidy:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
if: ${{ github.event_name != 'release' }}
strategy:
fail-fast: false
+7 -8
View File
@@ -39,7 +39,7 @@ env:
GOPROXY: direct
jobs:
mingw64-release:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
@@ -131,15 +131,14 @@ jobs:
- name: Populate depedencies (i686)
if: ${{ matrix.arch == 'i686' }}
run: |
# fix for missing i386 deb packages from deb.sury.org repository
sudo add-apt-repository ppa:ondrej/php
# alternative fix is to downgrade overloaded libpcre2 versions with five locally installed packages which are PHP-related and came from deb.sury.org repository.
# sudo apt-get install -y --allow-downgrades libpcre2-8-0=10.34-7ubuntu0.1 libpcre2-16-0=10.34-7ubuntu0.1 libpcre2-32-0=10.34-7ubuntu0.1 libpcre2-dev=10.34-7ubuntu0.1 libgd3=2.2.5-5.2ubuntu2.1
sudo dpkg --add-architecture i386 && sudo apt-get update -qq && sudo apt-get install -y wine wine32
sudo dpkg --add-architecture i386
sudo apt-get update -qq
sudo apt-get install -y wine wine32
- name: Populate depedencies (x86_64)
if: ${{ matrix.arch == 'x86_64' || matrix.arch == 'aarch64' }}
if: ${{ matrix.arch == 'x86_64' }}
run: |
sudo apt-get update -qq && sudo apt-get install -y wine wine64
sudo apt-get update -qq
sudo apt-get install -y wine wine64
- name: Patch libcxx for windows xp
if: ${{ matrix.arch == 'i686' || matrix.arch == 'x86_64' }}
run: |
+1 -1
View File
@@ -23,7 +23,7 @@ BOOL WINAPI ProcessPrng(PBYTE pbData, SIZE_T cbData);
namespace {
// wine's trick
decltype(&ProcessPrng) GetProcessPrngFallback(void) {
decltype(&ProcessPrng) GetProcessPrngFallback() {
HMODULE hmod = LoadLibraryW(L"advapi32");
CHECK(hmod);
auto process_prng_fn =
+4 -4
View File
@@ -79,7 +79,7 @@ TEST(UtilsTest, StringToInteger) {
ASSERT_TRUE(i.has_value());
ASSERT_EQ(i.value(), 123);
const char s3[] = "123";
constexpr const char s3[] = "123\1";
i = StringToInteger(std::string(s3, 3));
ASSERT_TRUE(i.has_value());
ASSERT_EQ(i.value(), 123);
@@ -87,7 +87,7 @@ TEST(UtilsTest, StringToInteger) {
i = StringToInteger(std::string(s3, 4));
ASSERT_FALSE(i.has_value());
const char s4[] = "123a";
constexpr const char s4[] = "123a\1";
i = StringToInteger(std::string(s4, 4));
ASSERT_FALSE(i.has_value());
@@ -97,13 +97,13 @@ TEST(UtilsTest, GetTempDir) {
std::string tmp_dir;
ASSERT_TRUE(GetTempDir(&tmp_dir));
ASSERT_FALSE(tmp_dir.empty());
LOG(ERROR) << "tmp_dir: " << tmp_dir;
LOG(WARNING) << "tmp_dir: " << tmp_dir;
}
TEST(UtilsTest, GetHomeDir) {
std::string home_dir = GetHomeDir();
ASSERT_FALSE(home_dir.empty());
LOG(ERROR) << "home_dir: " << home_dir;
LOG(WARNING) << "home_dir: " << home_dir;
}
TEST(UtilsTest, ReadFileAndWrite4K) {
+2 -2
View File
@@ -31,7 +31,7 @@ FARPROC WINAPI HandleDelayLoadFailureCommon(unsigned reason,
// behavior or be hard to diagnose. See https://crbug.com/1320845.
abort();
return 0;
return nullptr;
}
namespace {
@@ -44,7 +44,7 @@ bool g_hooks_enabled = true;
FARPROC WINAPI DelayLoadFailureHookEXE(unsigned reason,
DelayLoadInfo* dll_info) {
if (!g_hooks_enabled)
return 0;
return nullptr;
return HandleDelayLoadFailureCommon(reason, dll_info);
}
+2
View File
@@ -24,6 +24,8 @@
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
<key>NSHumanReadableCopyright</key>
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UISupportedInterfaceOrientations</key>

Some files were not shown because too many files have changed in this diff Show More