From 07297d7a61e312d87c56d33f168e9d0d688674ee Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Sat, 2 Aug 2025 20:40:39 +0200 Subject: [PATCH] Update On Sat Aug 2 20:40:38 CEST 2025 --- .github/update.log | 1 + clash-nyanpasu/backend/Cargo.lock | 72 +- clash-nyanpasu/backend/tauri/Cargo.toml | 12 +- .../frontend/interface/package.json | 4 +- clash-nyanpasu/frontend/nyanpasu/package.json | 14 +- clash-nyanpasu/frontend/ui/package.json | 2 +- clash-nyanpasu/manifest/version.json | 6 +- clash-nyanpasu/package.json | 6 +- clash-nyanpasu/pnpm-lock.yaml | 882 ++--- .../package/firmware/ath11k-firmware/Makefile | 14 - lede/package/qca/nss-eip-firmware/Makefile | 34 + .../package/qca/nss-eip-firmware/src/ifpp.bin | Bin 0 -> 12272 bytes .../package/qca/nss-eip-firmware/src/ipue.bin | Bin 0 -> 6116 bytes .../package/qca/nss-eip-firmware/src/ofpp.bin | Bin 0 -> 6128 bytes .../package/qca/nss-eip-firmware/src/opue.bin | Bin 0 -> 4068 bytes lede/package/qca/qca-nss-crypto/Makefile | 10 +- ...1-nss-crypto-fix-SHA1-header-include.patch | 27 - .../0001-nss-crypto-support-kernel-6.12.patch | 155 + ...rypto-fix-SHA-header-include-in-5.15.patch | 44 - lede/package/qca/qca-nss-ecm/Makefile | 3 +- .../arm64/boot/dts/qcom/ipq8071-ap8220.dts | 15 - openwrt-packages/luci-app-amlogic/Makefile | 2 +- .../root/usr/sbin/openwrt-install-amlogic | 4 +- .../usr/share/amlogic/amlogic_check_plugin.sh | 2 +- .../luasrc/model/cbi/passwall/client/rule.lua | 8 + .../luci-app-passwall/po/zh-cn/passwall.po | 6 + .../root/usr/share/passwall/rule_update.lua | 163 +- .../root/usr/share/passwall2/iptables.sh | 18 +- .../root/usr/share/passwall2/nftables.sh | 20 +- sing-box/cmd/internal/tun_bench/main.go | 12 +- sing-box/docs/changelog.md | 144 +- .../luasrc/model/cbi/passwall/client/rule.lua | 8 + small/luci-app-passwall/po/zh-cn/passwall.po | 6 + .../root/usr/share/passwall/rule_update.lua | 163 +- .../root/usr/share/passwall2/iptables.sh | 18 +- .../root/usr/share/passwall2/nftables.sh | 20 +- v2rayn/v2rayN/ServiceLib/Resx/ResUI.hu.resx | 574 ++-- .../.github/workflows/main.yml | 4 +- .../src/main/java/com/v2ray/ang/AppConfig.kt | 1 + .../NotificationManager.kt} | 20 +- .../PluginServiceManager.kt} | 9 +- .../SubscriptionUpdater.kt | 16 +- .../V2RayServiceManager.kt | 29 +- .../com/v2ray/ang/receiver/BootReceiver.kt | 2 +- .../com/v2ray/ang/receiver/TaskerReceiver.kt | 2 +- .../com/v2ray/ang/receiver/WidgetProvider.kt | 2 +- .../com/v2ray/ang/service/QSTileService.kt | 1 + .../com/v2ray/ang/service/Tun2SocksService.kt | 129 + .../ang/service/V2RayProxyOnlyService.kt | 1 + .../com/v2ray/ang/service/V2RayTestService.kt | 4 +- .../com/v2ray/ang/service/V2RayVpnService.kt | 224 +- .../java/com/v2ray/ang/ui/MainActivity.kt | 2 +- .../com/v2ray/ang/ui/MainRecyclerAdapter.kt | 2 +- .../java/com/v2ray/ang/ui/ScSwitchActivity.kt | 2 +- .../java/com/v2ray/ang/ui/SettingsActivity.kt | 2 +- v2rayng/V2rayNG/gradle/libs.versions.toml | 2 +- v2rayng/hysteria/app/cmd/client.go | 4 +- v2rayng/hysteria/app/go.mod | 4 +- v2rayng/hysteria/app/go.sum | 8 +- v2rayng/hysteria/app/internal/tun/server.go | 24 +- v2rayng/hysteria/core/client/client.go | 1 + v2rayng/hysteria/core/go.mod | 2 +- v2rayng/hysteria/core/go.sum | 4 +- v2rayng/hysteria/core/server/server.go | 1 + v2rayng/hysteria/extras/go.mod | 2 +- v2rayng/hysteria/extras/go.sum | 4 +- xray-core/infra/conf/dokodemo.go | 19 +- xray-core/infra/conf/transport_internet.go | 10 +- xray-core/proxy/dokodemo/config.pb.go | 76 +- xray-core/proxy/dokodemo/config.proto | 2 + xray-core/proxy/dokodemo/dokodemo.go | 12 +- xray-core/transport/internet/tcp/dialer.go | 18 +- xray-core/transport/internet/tls/config.go | 20 +- xray-core/transport/internet/tls/config.pb.go | 223 +- xray-core/transport/internet/tls/config.proto | 6 +- xray-core/transport/internet/tls/ech.go | 92 +- xray-core/transport/internet/tls/ech_test.go | 5 +- yt-dlp/yt_dlp/extractor/adobetv.py | 44 +- yt-dlp/yt_dlp/extractor/apa.py | 12 +- yt-dlp/yt_dlp/extractor/arcpublishing.py | 14 + yt-dlp/yt_dlp/extractor/arte.py | 33 +- yt-dlp/yt_dlp/extractor/bandcamp.py | 45 +- yt-dlp/yt_dlp/extractor/blogger.py | 13 +- yt-dlp/yt_dlp/extractor/cloudflarestream.py | 20 +- yt-dlp/yt_dlp/extractor/condenast.py | 18 + yt-dlp/yt_dlp/extractor/crooksandliars.py | 17 +- yt-dlp/yt_dlp/extractor/dailymail.py | 11 + yt-dlp/yt_dlp/extractor/dailymotion.py | 55 +- yt-dlp/yt_dlp/extractor/dbtv.py | 18 +- yt-dlp/yt_dlp/extractor/ertgr.py | 39 +- yt-dlp/yt_dlp/extractor/facebook.py | 144 +- yt-dlp/yt_dlp/extractor/generic.py | 2551 +++----------- yt-dlp/yt_dlp/extractor/glomex.py | 25 +- yt-dlp/yt_dlp/extractor/indavideo.py | 25 +- yt-dlp/yt_dlp/extractor/joj.py | 14 +- yt-dlp/yt_dlp/extractor/jwplatform.py | 26 +- yt-dlp/yt_dlp/extractor/kaltura.py | 305 +- yt-dlp/yt_dlp/extractor/kinja.py | 9 + yt-dlp/yt_dlp/extractor/libsyn.py | 34 +- yt-dlp/yt_dlp/extractor/mainstreaming.py | 180 +- yt-dlp/yt_dlp/extractor/medialaan.py | 14 + yt-dlp/yt_dlp/extractor/megatvcom.py | 22 +- yt-dlp/yt_dlp/extractor/mlb.py | 161 +- yt-dlp/yt_dlp/extractor/nbc.py | 402 +-- yt-dlp/yt_dlp/extractor/panopto.py | 394 +-- yt-dlp/yt_dlp/extractor/peertube.py | 103 +- yt-dlp/yt_dlp/extractor/playwire.py | 15 +- yt-dlp/yt_dlp/extractor/rutube.py | 43 +- yt-dlp/yt_dlp/extractor/rutv.py | 150 +- yt-dlp/yt_dlp/extractor/ruutu.py | 194 +- yt-dlp/yt_dlp/extractor/senategov.py | 32 +- yt-dlp/yt_dlp/extractor/simplecast.py | 34 +- yt-dlp/yt_dlp/extractor/soundcloud.py | 527 +-- yt-dlp/yt_dlp/extractor/sportbox.py | 12 +- .../yt_dlp/extractor/springboardplatform.py | 12 +- yt-dlp/yt_dlp/extractor/substack.py | 23 + yt-dlp/yt_dlp/extractor/ted.py | 32 +- yt-dlp/yt_dlp/extractor/tunein.py | 40 +- yt-dlp/yt_dlp/extractor/tvc.py | 22 +- yt-dlp/yt_dlp/extractor/tvopengr.py | 20 +- yt-dlp/yt_dlp/extractor/twentymin.py | 15 +- yt-dlp/yt_dlp/extractor/udn.py | 18 +- yt-dlp/yt_dlp/extractor/vbox7.py | 19 +- yt-dlp/yt_dlp/extractor/viddler.py | 14 +- yt-dlp/yt_dlp/extractor/videa.py | 25 +- yt-dlp/yt_dlp/extractor/videopress.py | 19 +- yt-dlp/yt_dlp/extractor/viewlift.py | 49 +- yt-dlp/yt_dlp/extractor/vimeo.py | 1022 +++--- yt-dlp/yt_dlp/extractor/viqeo.py | 15 +- yt-dlp/yt_dlp/extractor/voxmedia.py | 10 + yt-dlp/yt_dlp/extractor/wimtv.py | 19 +- yt-dlp/yt_dlp/extractor/wistia.py | 37 +- yt-dlp/yt_dlp/extractor/xhamster.py | 50 +- yt-dlp/yt_dlp/extractor/yapfiles.py | 9 + yt-dlp/yt_dlp/extractor/youtube/_video.py | 2967 +++++++++-------- yt-dlp/yt_dlp/extractor/zapiks.py | 58 +- 136 files changed, 6788 insertions(+), 6922 deletions(-) create mode 100644 lede/package/qca/nss-eip-firmware/Makefile create mode 100644 lede/package/qca/nss-eip-firmware/src/ifpp.bin create mode 100644 lede/package/qca/nss-eip-firmware/src/ipue.bin create mode 100644 lede/package/qca/nss-eip-firmware/src/ofpp.bin create mode 100644 lede/package/qca/nss-eip-firmware/src/opue.bin delete mode 100644 lede/package/qca/qca-nss-crypto/patches/0001-nss-crypto-fix-SHA1-header-include.patch create mode 100644 lede/package/qca/qca-nss-crypto/patches/0001-nss-crypto-support-kernel-6.12.patch delete mode 100644 lede/package/qca/qca-nss-crypto/patches/0003-nss-crypto-fix-SHA-header-include-in-5.15.patch rename v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/{service/NotificationService.kt => handler/NotificationManager.kt} (95%) rename v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/{util/PluginUtil.kt => handler/PluginServiceManager.kt} (97%) rename v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/{service => handler}/SubscriptionUpdater.kt (78%) rename v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/{service => handler}/V2RayServiceManager.kt (94%) create mode 100644 v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/Tun2SocksService.kt diff --git a/.github/update.log b/.github/update.log index c581c7d6fa..11f5e62b61 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1077,3 +1077,4 @@ Update On Tue Jul 29 20:43:03 CEST 2025 Update On Wed Jul 30 20:44:03 CEST 2025 Update On Thu Jul 31 20:43:42 CEST 2025 Update On Fri Aug 1 20:44:14 CEST 2025 +Update On Sat Aug 2 20:40:30 CEST 2025 diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index 97eb5b1714..a620d7f20a 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -352,7 +352,7 @@ dependencies = [ "objc2-foundation 0.3.1", "parking_lot", "percent-encoding", - "windows-sys 0.52.0", + "windows-sys 0.59.0", "wl-clipboard-rs", "x11rb", ] @@ -1680,7 +1680,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -6384,9 +6384,9 @@ checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" [[package]] name = "oxc-miette" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00cb1a49ec377f62606cbf047794efd37d668dbcbcefaeb5bf43f89b3c391418" +checksum = "31cfb121c9d3e0f9082856927f5cff9594279c91b544f4436e4bc971563caa60" dependencies = [ "cfg-if", "owo-colors", @@ -6398,9 +6398,9 @@ dependencies = [ [[package]] name = "oxc-miette-derive" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1739910e9871fe8d6e311f80fb2793756335aec97b0f985e778cbf4bc5cf574f" +checksum = "a6eabb57f935b454fbe0552ea0abaaf9eb0019b5fa05a7bbe7efd5bd8c765085" dependencies = [ "proc-macro2", "quote", @@ -6409,9 +6409,9 @@ dependencies = [ [[package]] name = "oxc_allocator" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84be1252337ee005688471024aa3c490237e11ef4c18013573d76820718bd28d" +checksum = "387e852fa63147768141c5d1d4ca62adf5de4d0c8cfc502d60ebc863dd60fef7" dependencies = [ "allocator-api2", "bumpalo", @@ -6422,9 +6422,9 @@ dependencies = [ [[package]] name = "oxc_ast" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4611623aa731f9b6eafbbbb6616ddbfe65622fb9031f7f22b7d985ee9222d93c" +checksum = "d2865881163de2608e5e9981746de727930e5c23c92954973903adaa22601aee" dependencies = [ "bitflags 2.9.1", "oxc_allocator", @@ -6438,9 +6438,9 @@ dependencies = [ [[package]] name = "oxc_ast_macros" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59d873a6c17e393ab36dfd10fcd0b5e22581cd8adb6d0936b69c28371d338374" +checksum = "8c9cff8428e0513c6f2b2fd55cd1217f8243ba806ba1914d9783a4c47cf85eb1" dependencies = [ "phf 0.12.1", "proc-macro2", @@ -6450,9 +6450,9 @@ dependencies = [ [[package]] name = "oxc_ast_visit" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40afa7805ea0197de14d18ccfc59004a688d68f7f2696e02619fd4e503f6011d" +checksum = "97271b9fd4b8bceb887feaa73f4f8b5c1d4e2348124ab569be8982c24f1b95da" dependencies = [ "oxc_allocator", "oxc_ast", @@ -6462,18 +6462,18 @@ dependencies = [ [[package]] name = "oxc_data_structures" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb262baf5fb69c3971c6662684c2167e58708880f794465fbd53257fec7f087" +checksum = "9c1442a0ccd0667148c49e5fcb79d0578aaef863f65d9f30b4dbce262c7ccac8" dependencies = [ "rustversion", ] [[package]] name = "oxc_diagnostics" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c312b8185e7e63af7d76b5f69520baa53c4d8163ba2ff9e1801d53a9633089" +checksum = "af2ddf131f04efd708f8d4325183ebd4b73ce70cfe75ae0f9718985193faad74" dependencies = [ "cow-utils", "oxc-miette", @@ -6482,9 +6482,9 @@ dependencies = [ [[package]] name = "oxc_ecmascript" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a09ef36e663aa5512c8277f282e531d14fa5445493e47b6404f93d77830eb29" +checksum = "ea921bd0bf9d2827de585f6e2e5177b763a7b3de24016a493c69aae022750bfe" dependencies = [ "num-bigint", "num-traits", @@ -6495,9 +6495,9 @@ dependencies = [ [[package]] name = "oxc_estree" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c05d61aacb87526c3b6f10332370e6081592d8fa1e45a95d794fb3e180b165" +checksum = "4adb8dff81cbddb3c2b722c6bf839bb222f57d2d6d7bda27326cdeb642d76c3a" [[package]] name = "oxc_index" @@ -6507,9 +6507,9 @@ checksum = "2fa07b0cfa997730afed43705766ef27792873fdf5215b1391949fec678d2392" [[package]] name = "oxc_parser" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21908e281daf0c4ff94b66b627daaf2aea4869fbee696e07a7f35e449c633962" +checksum = "3994791fdb377e2dd4a27a4ce2ba8b4350bdf155bb1389c0b241ae4982f61855" dependencies = [ "bitflags 2.9.1", "cow-utils", @@ -6530,9 +6530,9 @@ dependencies = [ [[package]] name = "oxc_regular_expression" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3740a822270e305bb5b946b0a60ae9294f8d2ab71d9cab014bd629433780326c" +checksum = "956ae00a7b2d35c832f97da58d5faf852c4e8e70ab271550109c1d77e1b1b43b" dependencies = [ "bitflags 2.9.1", "oxc_allocator", @@ -6546,9 +6546,9 @@ dependencies = [ [[package]] name = "oxc_span" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b25ebff6503fe212773c1079110341c67d66ff1cb2d44fbe9f2b202140061187" +checksum = "83c27ab8f00b330fdbc3fc22872851f48d79284dda51428043bb2ed4e0d34816" dependencies = [ "compact_str", "oxc-miette", @@ -6559,9 +6559,9 @@ dependencies = [ [[package]] name = "oxc_syntax" -version = "0.78.0" +version = "0.79.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021a06690c525668d7872f2cff6f2c6ed0b43ae9a89ad66aa0faff70aaae80fa" +checksum = "d4a89b351b05d9a44ea8291fb48a6d32f4687ebc7e12b95d1695b46e12f96e2b" dependencies = [ "bitflags 2.9.1", "cow-utils", @@ -7289,7 +7289,7 @@ dependencies = [ "once_cell", "socket2 0.5.10", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7854,7 +7854,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -9510,7 +9510,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix 1.0.8", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -9803,9 +9803,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -11172,7 +11172,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/clash-nyanpasu/backend/tauri/Cargo.toml b/clash-nyanpasu/backend/tauri/Cargo.toml index 8b1b565081..4215e80084 100644 --- a/clash-nyanpasu/backend/tauri/Cargo.toml +++ b/clash-nyanpasu/backend/tauri/Cargo.toml @@ -172,12 +172,12 @@ display-info = "0.5.0" # should be removed after upgrading to tauri v2 # OXC (The Oxidation Compiler) # We use it to parse and transpile the old script profile to esm based script profile -oxc_parser = "0.78" -oxc_allocator = "0.78" -oxc_span = "0.78" -oxc_ast = "0.78" -oxc_syntax = "0.78" -oxc_ast_visit = "0.78" +oxc_parser = "0.79" +oxc_allocator = "0.79" +oxc_span = "0.79" +oxc_ast = "0.79" +oxc_syntax = "0.79" +oxc_ast_visit = "0.79" # Lua Integration mlua = { version = "0.11", features = [ diff --git a/clash-nyanpasu/frontend/interface/package.json b/clash-nyanpasu/frontend/interface/package.json index d259b4df74..ba3be35521 100644 --- a/clash-nyanpasu/frontend/interface/package.json +++ b/clash-nyanpasu/frontend/interface/package.json @@ -11,7 +11,7 @@ "build": "tsc" }, "dependencies": { - "@tanstack/react-query": "5.83.0", + "@tanstack/react-query": "5.84.1", "@tauri-apps/api": "2.6.0", "ahooks": "3.9.0", "dayjs": "1.11.13", @@ -22,6 +22,6 @@ }, "devDependencies": { "@types/lodash-es": "4.17.12", - "@types/react": "19.1.8" + "@types/react": "19.1.9" } } diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 7765b58b92..5f3b1d41e2 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -56,12 +56,12 @@ "@csstools/normalize.css": "12.1.1", "@emotion/babel-plugin": "11.13.5", "@emotion/react": "11.14.0", - "@iconify/json": "2.2.364", + "@iconify/json": "2.2.365", "@monaco-editor/react": "4.7.0", - "@tanstack/react-query": "5.83.0", - "@tanstack/react-router": "1.130.9", - "@tanstack/react-router-devtools": "1.130.9", - "@tanstack/router-plugin": "1.130.9", + "@tanstack/react-query": "5.84.1", + "@tanstack/react-router": "1.130.12", + "@tanstack/react-router-devtools": "1.130.13", + "@tanstack/router-plugin": "1.130.15", "@tauri-apps/plugin-clipboard-manager": "2.3.0", "@tauri-apps/plugin-dialog": "2.3.0", "@tauri-apps/plugin-fs": "2.4.0", @@ -70,8 +70,8 @@ "@tauri-apps/plugin-process": "2.3.0", "@tauri-apps/plugin-shell": "2.3.0", "@tauri-apps/plugin-updater": "2.9.0", - "@types/react": "19.1.8", - "@types/react-dom": "19.1.6", + "@types/react": "19.1.9", + "@types/react-dom": "19.1.7", "@types/validator": "13.15.2", "@vitejs/plugin-legacy": "7.1.0", "@vitejs/plugin-react": "4.7.0", diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index 685f69df25..821418762e 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -19,7 +19,7 @@ "@radix-ui/react-scroll-area": "1.2.9", "@tauri-apps/api": "2.6.0", "@types/d3": "7.4.3", - "@types/react": "19.1.8", + "@types/react": "19.1.9", "@vitejs/plugin-react": "4.7.0", "ahooks": "3.9.0", "d3": "7.9.0", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index f22f9aab80..4b652410d3 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,10 +2,10 @@ "manifest_version": 1, "latest": { "mihomo": "v1.19.12", - "mihomo_alpha": "alpha-e8fddd8", + "mihomo_alpha": "alpha-e89af72", "clash_rs": "v0.8.2", "clash_premium": "2023-09-05-gdcc8d87", - "clash_rs_alpha": "0.8.1-alpha+sha.3164865" + "clash_rs_alpha": "0.8.2-alpha+sha.3bbfc09" }, "arch_template": { "mihomo": { @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-07-31T22:21:34.711Z" + "updated_at": "2025-08-01T22:21:26.394Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 43133426fd..67f5edee58 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -66,7 +66,7 @@ "@tauri-apps/cli": "2.6.2", "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", - "@types/node": "22.16.5", + "@types/node": "22.17.0", "@typescript-eslint/eslint-plugin": "8.38.0", "@typescript-eslint/parser": "8.38.0", "autoprefixer": "10.4.21", @@ -106,10 +106,10 @@ "stylelint-scss": "6.12.1", "tailwindcss": "4.1.11", "tsx": "4.20.3", - "typescript": "5.8.3", + "typescript": "5.9.2", "typescript-eslint": "8.38.0" }, - "packageManager": "pnpm@10.13.1", + "packageManager": "pnpm@10.14.0", "engines": { "node": "22.18.0" }, diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index ac6dfba1fa..25fefee73b 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -24,7 +24,7 @@ importers: devDependencies: '@commitlint/cli': specifier: 19.8.1 - version: 19.8.1(@types/node@22.16.5)(typescript@5.8.3) + version: 19.8.1(@types/node@22.17.0)(typescript@5.9.2) '@commitlint/config-conventional': specifier: 19.8.1 version: 19.8.1 @@ -47,14 +47,14 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/node': - specifier: 22.16.5 - version: 22.16.5 + specifier: 22.17.0 + version: 22.17.0 '@typescript-eslint/eslint-plugin': specifier: 8.38.0 - version: 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) '@typescript-eslint/parser': specifier: 8.38.0 - version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) @@ -75,16 +75,16 @@ importers: version: 10.1.8(eslint@9.32.0(jiti@2.4.2)) eslint-import-resolver-alias: specifier: 1.1.2 - version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))) + version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))) eslint-plugin-html: specifier: 8.1.3 version: 8.1.3 eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2)) + version: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-n: specifier: 17.21.3 - version: 17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + version: 17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) eslint-plugin-prettier: specifier: 5.5.3 version: 5.5.3(eslint-config-prettier@10.1.8(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(prettier@3.6.2) @@ -105,13 +105,13 @@ importers: version: 16.3.0 knip: specifier: 5.62.0 - version: 5.62.0(@types/node@22.16.5)(typescript@5.8.3) + version: 5.62.0(@types/node@22.17.0)(typescript@5.9.2) lint-staged: specifier: 16.1.2 version: 16.1.2 neostandard: specifier: 0.12.2 - version: 0.12.2(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + version: 0.12.2(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) npm-run-all2: specifier: 8.0.4 version: 8.0.4 @@ -141,25 +141,25 @@ importers: version: 6.1.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) stylelint: specifier: 16.23.0 - version: 16.23.0(typescript@5.8.3) + version: 16.23.0(typescript@5.9.2) stylelint-config-html: specifier: 1.1.0 - version: 1.1.0(postcss-html@1.8.0)(stylelint@16.23.0(typescript@5.8.3)) + version: 1.1.0(postcss-html@1.8.0)(stylelint@16.23.0(typescript@5.9.2)) stylelint-config-recess-order: specifier: 7.1.0 - version: 7.1.0(stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.8.3)))(stylelint@16.23.0(typescript@5.8.3)) + version: 7.1.0(stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.9.2)))(stylelint@16.23.0(typescript@5.9.2)) stylelint-config-standard: specifier: 39.0.0 - version: 39.0.0(stylelint@16.23.0(typescript@5.8.3)) + version: 39.0.0(stylelint@16.23.0(typescript@5.9.2)) stylelint-declaration-block-no-ignored-properties: specifier: 2.8.0 - version: 2.8.0(stylelint@16.23.0(typescript@5.8.3)) + version: 2.8.0(stylelint@16.23.0(typescript@5.9.2)) stylelint-order: specifier: 7.0.0 - version: 7.0.0(stylelint@16.23.0(typescript@5.8.3)) + version: 7.0.0(stylelint@16.23.0(typescript@5.9.2)) stylelint-scss: specifier: 6.12.1 - version: 6.12.1(stylelint@16.23.0(typescript@5.8.3)) + version: 6.12.1(stylelint@16.23.0(typescript@5.9.2)) tailwindcss: specifier: 4.1.11 version: 4.1.11 @@ -167,17 +167,17 @@ importers: specifier: 4.20.3 version: 4.20.3 typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.2 + version: 5.9.2 typescript-eslint: specifier: 8.38.0 - version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) frontend/interface: dependencies: '@tanstack/react-query': - specifier: 5.83.0 - version: 5.83.0(react@19.1.1) + specifier: 5.84.1 + version: 5.84.1(react@19.1.1) '@tauri-apps/api': specifier: 2.6.0 version: 2.6.0 @@ -204,8 +204,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/react': - specifier: 19.1.8 - version: 19.1.8 + specifier: 19.1.9 + version: 19.1.9 frontend/nyanpasu: dependencies: @@ -220,7 +220,7 @@ importers: version: 3.2.2(react@19.1.1) '@emotion/styled': specifier: 11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -229,16 +229,16 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 7.2.0 - version: 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) + version: 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) '@mui/lab': specifier: 7.0.0-beta.14 - version: 7.0.0-beta.14(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 7.0.0-beta.14(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/material': specifier: 7.2.0 - version: 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/x-date-pickers': specifier: 8.9.2 - version: 8.9.2(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.9.2(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -250,7 +250,7 @@ importers: version: 4.1.11 '@tanstack/router-zod-adapter': specifier: 1.81.5 - version: 1.81.5(@tanstack/react-router@1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.14) + version: 1.81.5(@tanstack/react-router@1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.14) '@tauri-apps/api': specifier: 2.6.0 version: 2.6.0 @@ -277,22 +277,22 @@ importers: version: 12.23.12(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) i18next: specifier: 25.3.2 - version: 25.3.2(typescript@5.8.3) + version: 25.3.2(typescript@5.9.2) jotai: specifier: 2.12.5 - version: 2.12.5(@types/react@19.1.8)(react@19.1.1) + version: 2.12.5(@types/react@19.1.9)(react@19.1.1) json-schema: specifier: 0.4.0 version: 0.4.0 material-react-table: specifier: npm:@greenhat616/material-react-table@4.0.0 - version: '@greenhat616/material-react-table@4.0.0(1771d1dc89f6502acd08ab3379b879ff)' + version: '@greenhat616/material-react-table@4.0.0(80569ad63082be623b4d1f088aa46ad4)' monaco-editor: specifier: 0.52.2 version: 0.52.2 mui-color-input: specifier: 7.0.0 - version: 7.0.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 7.0.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -307,13 +307,13 @@ importers: version: 1.6.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-hook-form-mui: specifier: 7.6.2 - version: 7.6.2(5bed6be4950c70f4147e918454a0d179) + version: 7.6.2(6f142df272ff31372e8729fe1f91fe1b) react-i18next: specifier: 15.6.1 - version: 15.6.1(i18next@25.3.2(typescript@5.8.3))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) + version: 15.6.1(i18next@25.3.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) react-markdown: specifier: 10.1.0 - version: 10.1.0(@types/react@19.1.8)(react@19.1.1) + version: 10.1.0(@types/react@19.1.9)(react@19.1.1) react-split-grid: specifier: 1.0.4 version: 1.0.4(react@19.1.1) @@ -341,25 +341,25 @@ importers: version: 11.13.5 '@emotion/react': specifier: 11.14.0 - version: 11.14.0(@types/react@19.1.8)(react@19.1.1) + version: 11.14.0(@types/react@19.1.9)(react@19.1.1) '@iconify/json': - specifier: 2.2.364 - version: 2.2.364 + specifier: 2.2.365 + version: 2.2.365 '@monaco-editor/react': specifier: 4.7.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/react-query': - specifier: 5.83.0 - version: 5.83.0(react@19.1.1) + specifier: 5.84.1 + version: 5.84.1(react@19.1.1) '@tanstack/react-router': - specifier: 1.130.9 - version: 1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 1.130.12 + version: 1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/react-router-devtools': - specifier: 1.130.9 - version: 1.130.9(@tanstack/react-router@1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.130.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3) + specifier: 1.130.13 + version: 1.130.13(@tanstack/react-router@1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.130.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3) '@tanstack/router-plugin': - specifier: 1.130.9 - version: 1.130.9(@tanstack/react-router@1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + specifier: 1.130.15 + version: 1.130.15(@tanstack/react-router@1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) '@tauri-apps/plugin-clipboard-manager': specifier: 2.3.0 version: 2.3.0 @@ -385,23 +385,23 @@ importers: specifier: 2.9.0 version: 2.9.0 '@types/react': - specifier: 19.1.8 - version: 19.1.8 + specifier: 19.1.9 + version: 19.1.9 '@types/react-dom': - specifier: 19.1.6 - version: 19.1.6(@types/react@19.1.8) + specifier: 19.1.7 + version: 19.1.7(@types/react@19.1.9) '@types/validator': specifier: 13.15.2 version: 13.15.2 '@vitejs/plugin-legacy': specifier: 7.1.0 - version: 7.1.0(terser@5.36.0)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 7.1.0(terser@5.36.0)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) '@vitejs/plugin-react': specifier: 4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.7.0(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) '@vitejs/plugin-react-swc': specifier: 3.11.0 - version: 3.11.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.11.0(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) change-case: specifier: 5.4.4 version: 5.4.4 @@ -434,25 +434,25 @@ importers: version: 19.3.0 unplugin-icons: specifier: 22.2.0 - version: 22.2.0(@svgr/core@8.1.0(typescript@5.8.3)) + version: 22.2.0(@svgr/core@8.1.0(typescript@5.9.2)) validator: specifier: 13.15.15 version: 13.15.15 vite: specifier: 7.0.6 - version: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) vite-plugin-html: specifier: 3.2.2 - version: 3.2.2(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.2.2(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-sass-dts: specifier: 1.3.31 - version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-svgr: specifier: 4.3.0 - version: 4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.3.0(rollup@4.40.0)(typescript@5.9.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 5.1.4(typescript@5.9.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) zod: specifier: 4.0.14 version: 4.0.14 @@ -464,19 +464,19 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 7.2.0 - version: 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) + version: 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) '@mui/lab': specifier: 7.0.0-beta.14 - version: 7.0.0-beta.14(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 7.0.0-beta.14(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/material': specifier: 7.2.0 - version: 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-portal': specifier: 1.1.9 - version: 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-scroll-area': specifier: 1.2.9 - version: 1.2.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.2.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tauri-apps/api': specifier: 2.6.0 version: 2.6.0 @@ -484,11 +484,11 @@ importers: specifier: 7.4.3 version: 7.4.3 '@types/react': - specifier: 19.1.8 - version: 19.1.8 + specifier: 19.1.9 + version: 19.1.9 '@vitejs/plugin-react': specifier: 4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.7.0(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) ahooks: specifier: 3.9.0 version: 3.9.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -509,7 +509,7 @@ importers: version: 6.0.0(react@19.1.1) react-i18next: specifier: 15.6.1 - version: 15.6.1(i18next@25.3.2(typescript@5.8.3))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) + version: 15.6.1(i18next@25.3.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) react-use: specifier: 17.6.0 version: 17.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -518,14 +518,14 @@ importers: version: 4.1.11 vite: specifier: 7.0.6 - version: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 5.1.4(typescript@5.9.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) devDependencies: '@emotion/react': specifier: 11.14.0 - version: 11.14.0(@types/react@19.1.8)(react@19.1.1) + version: 11.14.0(@types/react@19.1.9)(react@19.1.1) '@types/d3-interpolate-path': specifier: 2.0.3 version: 2.0.3 @@ -543,10 +543,10 @@ importers: version: 3.3.1 typescript-plugin-css-modules: specifier: 5.2.0 - version: 5.2.0(typescript@5.8.3) + version: 5.2.0(typescript@5.9.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.16.5)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.5.4(@types/node@22.17.0)(rollup@4.40.0)(typescript@5.9.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) scripts: dependencies: @@ -1753,8 +1753,8 @@ packages: '@vue/compiler-sfc': optional: true - '@iconify/json@2.2.364': - resolution: {integrity: sha512-+ekQRRGXObKZ4JK+GszoxWn6jSo9ItRNrIBXdfO+e3ySqZIDkNS7AVHuQ8+2ta8WlgBliU9Vth1aFAa0iSvB1w==} + '@iconify/json@2.2.365': + resolution: {integrity: sha512-9ZLdIXnswa1XCssYqnCjmXtuxj0l4nkY33FTs8PYCj5rTfPrJlRiPWUDzZOocNsSqjssr5fVPo0ME1hO9h0/IQ==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -2981,32 +2981,32 @@ packages: '@tailwindcss/postcss@4.1.11': resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} - '@tanstack/history@1.129.7': - resolution: {integrity: sha512-I3YTkbe4RZQN54Qw4+IUhOjqG2DdbG2+EBWuQfew4MEk0eddLYAQVa50BZVww4/D2eh5I9vEk2Fd1Y0Wty7pug==} + '@tanstack/history@1.130.12': + resolution: {integrity: sha512-2VO1nNFDWojgZ7Uqv/OJfH6LphZQ1kE6l8sI3YBgSPtj3qN6I/rsoTHW9rGjwiDO8sQoDRXod2hpH6HMs5NDsw==} engines: {node: '>=12'} '@tanstack/match-sorter-utils@8.19.4': resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.83.0': - resolution: {integrity: sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA==} + '@tanstack/query-core@5.83.1': + resolution: {integrity: sha512-OG69LQgT7jSp+5pPuCfzltq/+7l2xoweggjme9vlbCPa/d7D7zaqv5vN/S82SzSYZ4EDLTxNO1PWrv49RAS64Q==} - '@tanstack/react-query@5.83.0': - resolution: {integrity: sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ==} + '@tanstack/react-query@5.84.1': + resolution: {integrity: sha512-zo7EUygcWJMQfFNWDSG7CBhy8irje/XY0RDVKKV4IQJAysb+ZJkkJPcnQi+KboyGUgT+SQebRFoTqLuTtfoDLw==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.130.9': - resolution: {integrity: sha512-5eF5M4F+Mzg+2rxyE3EBF8sTCBkRHswoRXw3V8i7i3+c7C80j9SOYgYar/WHcA3IkBUSgVf6HCd38yxB0Vbvsg==} + '@tanstack/react-router-devtools@1.130.13': + resolution: {integrity: sha512-cY+jYxEP4/WNDgFFlI5/1u2U9zY9zHmJDoNxCF3NiaSgtAIVHdCKRGvfG6oRl6EposNGtn+JJhQkMkfAyoN9lQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.130.9 + '@tanstack/react-router': ^1.130.12 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.130.9': - resolution: {integrity: sha512-TAz21GvF51JoObEFq//Qc/TugwB/T5fUla+Z4DiflR3bggoCt+USdURsyrbt38EcH9j1doJXIcjaAbDnHAmY7Q==} + '@tanstack/react-router@1.130.12': + resolution: {integrity: sha512-7BYgOpGc1vK8MH1LIFLLBudGpH46GQy+hewnP7dNQJ4KHmkwPHv958L1IMA9jU/rs5g1ZH5n1f33BAMOBXUMYQ==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -3031,15 +3031,15 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.130.9': - resolution: {integrity: sha512-+1GUeSETgXXane/4XyU4zbpe0QOSY8y2ZQCPyZCVphDZSpVNQ7HGENd6LUnpm+dNEVXPjFJxoz6sQguQVrbheg==} + '@tanstack/router-core@1.130.12': + resolution: {integrity: sha512-emq3cRU9Na1hnIToojzkfJcOZm/MG2bv9M+Kr/elUxEf83enGEwQXC1EKezTuwNgeJrOv8vPJdEhWM7IQodnHQ==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.130.9': - resolution: {integrity: sha512-t/bdb/tvWUWsDgN5pOez73K1/Mx30lXfu3P0NRmhrRUJ673khmf2haeQauMAafeTwLeZ3c17mBJwKnW2aCd1kA==} + '@tanstack/router-devtools-core@1.130.13': + resolution: {integrity: sha512-Fn8lwnc5zvyllaDQNY6qTSTtKZsEY4mlZlJVTmC2/vvY1susXUA0NQPmpBquJYQAHJGzqPX83h/yKb7hzBSH3g==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.130.9 + '@tanstack/router-core': ^1.130.12 csstype: ^3.0.10 solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 @@ -3047,16 +3047,16 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.130.9': - resolution: {integrity: sha512-DsQ7kLQmMk0L3K3/QtuMveILQWAarzfv6DpLMN9+fHlIFuw7OQinVrzD9i+9oAKcYzsBgM1iez5IMXYpCta1gA==} + '@tanstack/router-generator@1.130.15': + resolution: {integrity: sha512-2TICfuSN8oYydTHd+nATkKV4B37XRrAWrwK9+g5dPVUP9lhLy7FQy3IVcb1HRXFXvW0zr5zPNxXErTrOmrceyA==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.130.9': - resolution: {integrity: sha512-/QmDbj+z/UysHeMi9F4sJqh76clSX4QFjIdOgO7u8nXkgjSBfPcyWos+1rw9ovn+DeDmyKlvzt3BEIU1+bvptA==} + '@tanstack/router-plugin@1.130.15': + resolution: {integrity: sha512-ovYGN0a5CxIPkVdbJPLAqwlE0eUYhHm0PkPCH0TxR24XpEGaCxAOw92DriLRZj9R4xTg5oeJqM+3wiZJfujx/A==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.130.9 + '@tanstack/react-router': ^1.130.12 vite: '>=5.0.0 || >=6.0.0' vite-plugin-solid: ^2.11.2 webpack: '>=5.92.0' @@ -3072,8 +3072,8 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.129.7': - resolution: {integrity: sha512-I2OyQF5U6sxHJApXKCUmCncTHKcpj4681FwyxpYg5QYOatHcn/zVMl7Rj4h36fu8/Lo2ZRLxUMd5kmXgp5Pb/A==} + '@tanstack/router-utils@1.130.12': + resolution: {integrity: sha512-vyk7qduNrVrJWgUXHqRyZrFLOL9YJ/4ycN5PbJ2cLRBln01NkG/abKTHi32V31yMehxkxAO0EoicicvalnV0FA==} engines: {node: '>=12'} '@tanstack/router-zod-adapter@1.81.5': @@ -3390,8 +3390,8 @@ packages: '@types/node@16.18.108': resolution: {integrity: sha512-fj42LD82fSv6yN9C6Q4dzS+hujHj+pTv0IpRR3kI20fnYeS0ytBpjFO9OjmDowSPPt4lNKN46JLaKbCyP+BW2A==} - '@types/node@22.16.5': - resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==} + '@types/node@22.17.0': + resolution: {integrity: sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3408,8 +3408,8 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@19.1.6': - resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} + '@types/react-dom@19.1.7': + resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} peerDependencies: '@types/react': ^19.0.0 @@ -3418,8 +3418,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@19.1.8': - resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + '@types/react@19.1.9': + resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -8131,8 +8131,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true @@ -9552,11 +9552,11 @@ snapshots: '@bufbuild/protobuf@2.5.2': {} - '@commitlint/cli@19.8.1(@types/node@22.16.5)(typescript@5.8.3)': + '@commitlint/cli@19.8.1(@types/node@22.17.0)(typescript@5.9.2)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@22.16.5)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@22.17.0)(typescript@5.9.2) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.1 @@ -9603,15 +9603,15 @@ snapshots: '@commitlint/rules': 19.8.1 '@commitlint/types': 19.8.1 - '@commitlint/load@19.8.1(@types/node@22.16.5)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@22.17.0)(typescript@5.9.2)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 '@commitlint/resolve-extends': 19.8.1 '@commitlint/types': 19.8.1 chalk: 5.4.1 - cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@22.16.5)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.2) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.17.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -9772,7 +9772,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1)': + '@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.26.0 '@emotion/babel-plugin': 11.13.5 @@ -9784,7 +9784,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 transitivePeerDependencies: - supports-color @@ -9798,18 +9798,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.1) '@emotion/utils': 1.4.2 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 transitivePeerDependencies: - supports-color @@ -9955,13 +9955,13 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@greenhat616/material-react-table@4.0.0(1771d1dc89f6502acd08ab3379b879ff)': + '@greenhat616/material-react-table@4.0.0(80569ad63082be623b4d1f088aa46ad4)': dependencies: - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@mui/icons-material': 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/x-date-pickers': 8.9.2(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@mui/icons-material': 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/x-date-pickers': 8.9.2(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/match-sorter-utils': 8.19.4 '@tanstack/react-table': 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/react-virtual': 3.13.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -9997,7 +9997,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@iconify/json@2.2.364': + '@iconify/json@2.2.365': dependencies: '@iconify/types': 2.0.0 pathe: 1.1.2 @@ -10055,23 +10055,23 @@ snapshots: '@material/material-color-utilities@0.3.0': {} - '@microsoft/api-extractor-model@7.30.3(@types/node@22.16.5)': + '@microsoft/api-extractor-model@7.30.3(@types/node@22.17.0)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.11.0(@types/node@22.16.5) + '@rushstack/node-core-library': 5.11.0(@types/node@22.17.0) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.51.0(@types/node@22.16.5)': + '@microsoft/api-extractor@7.51.0(@types/node@22.17.0)': dependencies: - '@microsoft/api-extractor-model': 7.30.3(@types/node@22.16.5) + '@microsoft/api-extractor-model': 7.30.3(@types/node@22.17.0) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.11.0(@types/node@22.16.5) + '@rushstack/node-core-library': 5.11.0(@types/node@22.17.0) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.0(@types/node@22.16.5) - '@rushstack/ts-command-line': 4.23.5(@types/node@22.16.5) + '@rushstack/terminal': 0.15.0(@types/node@22.17.0) + '@rushstack/ts-command-line': 4.23.5(@types/node@22.17.0) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -10103,39 +10103,39 @@ snapshots: '@mui/core-downloads-tracker@7.2.0': {} - '@mui/icons-material@7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react@19.1.1)': + '@mui/icons-material@7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@mui/lab@7.0.0-beta.14(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/lab@7.0.0-beta.14(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/system': 7.1.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@mui/types': 7.4.3(@types/react@19.1.8) - '@mui/utils': 7.1.1(@types/react@19.1.8)(react@19.1.1) + '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/system': 7.1.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@mui/types': 7.4.3(@types/react@19.1.9) + '@mui/utils': 7.1.1(@types/react@19.1.9)(react@19.1.1) clsx: 2.1.1 prop-types: 15.8.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@types/react': 19.1.8 + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@types/react': 19.1.9 - '@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 '@mui/core-downloads-tracker': 7.2.0 - '@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@mui/types': 7.4.4(@types/react@19.1.8) - '@mui/utils': 7.2.0(@types/react@19.1.8)(react@19.1.1) + '@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@mui/types': 7.4.4(@types/react@19.1.9) + '@mui/utils': 7.2.0(@types/react@19.1.9)(react@19.1.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@19.1.8) + '@types/react-transition-group': 4.4.12(@types/react@19.1.9) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -10144,29 +10144,29 @@ snapshots: react-is: 19.1.0 react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@types/react': 19.1.8 + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@types/react': 19.1.9 - '@mui/private-theming@7.1.1(@types/react@19.1.8)(react@19.1.1)': + '@mui/private-theming@7.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/utils': 7.2.0(@types/react@19.1.8)(react@19.1.1) + '@mui/utils': 7.2.0(@types/react@19.1.9)(react@19.1.1) prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@mui/private-theming@7.2.0(@types/react@19.1.8)(react@19.1.1)': + '@mui/private-theming@7.2.0(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/utils': 7.2.0(@types/react@19.1.8)(react@19.1.1) + '@mui/utils': 7.2.0(@types/react@19.1.9)(react@19.1.1) prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@mui/styled-engine@7.1.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(react@19.1.1)': + '@mui/styled-engine@7.1.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 '@emotion/cache': 11.14.0 @@ -10176,10 +10176,10 @@ snapshots: prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) - '@mui/styled-engine@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(react@19.1.1)': + '@mui/styled-engine@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 '@emotion/cache': 11.14.0 @@ -10189,102 +10189,102 @@ snapshots: prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) - '@mui/system@7.1.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1)': + '@mui/system@7.1.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/private-theming': 7.1.1(@types/react@19.1.8)(react@19.1.1) - '@mui/styled-engine': 7.1.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(react@19.1.1) - '@mui/types': 7.4.3(@types/react@19.1.8) - '@mui/utils': 7.1.1(@types/react@19.1.8)(react@19.1.1) + '@mui/private-theming': 7.1.1(@types/react@19.1.9)(react@19.1.1) + '@mui/styled-engine': 7.1.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(react@19.1.1) + '@mui/types': 7.4.3(@types/react@19.1.9) + '@mui/utils': 7.1.1(@types/react@19.1.9)(react@19.1.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@types/react': 19.1.8 + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@types/react': 19.1.9 - '@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1)': + '@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/private-theming': 7.2.0(@types/react@19.1.8)(react@19.1.1) - '@mui/styled-engine': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(react@19.1.1) - '@mui/types': 7.4.4(@types/react@19.1.8) - '@mui/utils': 7.2.0(@types/react@19.1.8)(react@19.1.1) + '@mui/private-theming': 7.2.0(@types/react@19.1.9)(react@19.1.1) + '@mui/styled-engine': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(react@19.1.1) + '@mui/types': 7.4.4(@types/react@19.1.9) + '@mui/utils': 7.2.0(@types/react@19.1.9)(react@19.1.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@types/react': 19.1.8 + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@types/react': 19.1.9 - '@mui/types@7.4.3(@types/react@19.1.8)': + '@mui/types@7.4.3(@types/react@19.1.9)': dependencies: '@babel/runtime': 7.27.6 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@mui/types@7.4.4(@types/react@19.1.8)': + '@mui/types@7.4.4(@types/react@19.1.9)': dependencies: '@babel/runtime': 7.27.6 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@mui/utils@7.1.1(@types/react@19.1.8)(react@19.1.1)': + '@mui/utils@7.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/types': 7.4.3(@types/react@19.1.8) + '@mui/types': 7.4.3(@types/react@19.1.9) '@types/prop-types': 15.7.14 clsx: 2.1.1 prop-types: 15.8.1 react: 19.1.1 react-is: 19.1.0 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@mui/utils@7.2.0(@types/react@19.1.8)(react@19.1.1)': + '@mui/utils@7.2.0(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/types': 7.4.4(@types/react@19.1.8) + '@mui/types': 7.4.4(@types/react@19.1.9) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 19.1.1 react-is: 19.1.0 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@mui/x-date-pickers@8.9.2(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/x-date-pickers@8.9.2(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@mui/utils': 7.2.0(@types/react@19.1.8)(react@19.1.1) - '@mui/x-internals': 8.9.2(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@types/react-transition-group': 4.4.12(@types/react@19.1.8) + '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@mui/utils': 7.2.0(@types/react@19.1.9)(react@19.1.1) + '@mui/x-internals': 8.9.2(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@types/react-transition-group': 4.4.12(@types/react@19.1.9) clsx: 2.1.1 prop-types: 15.8.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) dayjs: 1.11.13 transitivePeerDependencies: - '@types/react' - '@mui/x-internals@8.9.2(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1)': + '@mui/x-internals@8.9.2(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@mui/utils': 7.2.0(@types/react@19.1.8)(react@19.1.1) + '@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@mui/utils': 7.2.0(@types/react@19.1.9)(react@19.1.1) react: 19.1.1 reselect: 5.1.1 use-sync-external-store: 1.5.0(react@19.1.1) @@ -10679,88 +10679,88 @@ snapshots: '@radix-ui/primitive@1.1.2': {} - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.8)(react@19.1.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.9)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-context@1.1.2(@types/react@19.1.8)(react@19.1.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.1.9)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-direction@1.1.1(@types/react@19.1.8)(react@19.1.1)': + '@radix-ui/react-direction@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-scroll-area@1.2.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-scroll-area@1.2.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-slot@1.2.3(@types/react@19.1.8)(react@19.1.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.1.9)(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.8)(react@19.1.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.8)(react@19.1.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 '@rolldown/pluginutils@1.0.0-beta.27': {} @@ -10847,7 +10847,7 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.11.0(@types/node@22.16.5)': + '@rushstack/node-core-library@5.11.0(@types/node@22.17.0)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -10858,23 +10858,23 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 optionalDependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.0(@types/node@22.16.5)': + '@rushstack/terminal@0.15.0(@types/node@22.17.0)': dependencies: - '@rushstack/node-core-library': 5.11.0(@types/node@22.16.5) + '@rushstack/node-core-library': 5.11.0(@types/node@22.17.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 - '@rushstack/ts-command-line@4.23.5(@types/node@22.16.5)': + '@rushstack/ts-command-line@4.23.5(@types/node@22.17.0)': dependencies: - '@rushstack/terminal': 0.15.0(@types/node@22.16.5) + '@rushstack/terminal': 0.15.0(@types/node@22.17.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -10918,9 +10918,9 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin@2.11.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': + '@stylistic/eslint-plugin@2.11.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@typescript-eslint/utils': 8.36.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) eslint: 9.32.0(jiti@2.4.2) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -10974,12 +10974,12 @@ snapshots: '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.0) '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.0) - '@svgr/core@8.1.0(typescript@5.8.3)': + '@svgr/core@8.1.0(typescript@5.9.2)': dependencies: '@babel/core': 7.28.0 '@svgr/babel-preset': 8.1.0(@babel/core@7.28.0) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.9.2) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -10990,11 +10990,11 @@ snapshots: '@babel/types': 7.28.1 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))': dependencies: '@babel/core': 7.28.0 '@svgr/babel-preset': 8.1.0(@babel/core@7.28.0) - '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/core': 8.1.0(typescript@5.9.2) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: @@ -11128,23 +11128,23 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.11 - '@tanstack/history@1.129.7': {} + '@tanstack/history@1.130.12': {} '@tanstack/match-sorter-utils@8.19.4': dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.83.0': {} + '@tanstack/query-core@5.83.1': {} - '@tanstack/react-query@5.83.0(react@19.1.1)': + '@tanstack/react-query@5.84.1(react@19.1.1)': dependencies: - '@tanstack/query-core': 5.83.0 + '@tanstack/query-core': 5.83.1 react: 19.1.1 - '@tanstack/react-router-devtools@1.130.9(@tanstack/react-router@1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.130.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)': + '@tanstack/react-router-devtools@1.130.13(@tanstack/react-router@1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.130.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)': dependencies: - '@tanstack/react-router': 1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/router-devtools-core': 1.130.9(@tanstack/router-core@1.130.9)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3) + '@tanstack/react-router': 1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-devtools-core': 1.130.13(@tanstack/router-core@1.130.12)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -11153,11 +11153,11 @@ snapshots: - solid-js - tiny-invariant - '@tanstack/react-router@1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-router@1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/history': 1.129.7 + '@tanstack/history': 1.130.12 '@tanstack/react-store': 0.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/router-core': 1.130.9 + '@tanstack/router-core': 1.130.12 isbot: 5.1.28 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -11169,7 +11169,7 @@ snapshots: '@tanstack/store': 0.7.0 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - use-sync-external-store: 1.4.0(react@19.1.1) + use-sync-external-store: 1.5.0(react@19.1.1) '@tanstack/react-table@8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: @@ -11183,9 +11183,9 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@tanstack/router-core@1.130.9': + '@tanstack/router-core@1.130.12': dependencies: - '@tanstack/history': 1.129.7 + '@tanstack/history': 1.130.12 '@tanstack/store': 0.7.0 cookie-es: 1.2.2 seroval: 1.3.2 @@ -11193,9 +11193,9 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.130.9(@tanstack/router-core@1.130.9)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)': + '@tanstack/router-devtools-core@1.130.13(@tanstack/router-core@1.130.12)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)': dependencies: - '@tanstack/router-core': 1.130.9 + '@tanstack/router-core': 1.130.12 clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.5 @@ -11203,10 +11203,10 @@ snapshots: optionalDependencies: csstype: 3.1.3 - '@tanstack/router-generator@1.130.9': + '@tanstack/router-generator@1.130.15': dependencies: - '@tanstack/router-core': 1.130.9 - '@tanstack/router-utils': 1.129.7 + '@tanstack/router-core': 1.130.12 + '@tanstack/router-utils': 1.130.12 '@tanstack/virtual-file-routes': 1.129.7 prettier: 3.6.2 recast: 0.23.11 @@ -11216,7 +11216,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.130.9(@tanstack/react-router@1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': + '@tanstack/router-plugin@1.130.15(@tanstack/react-router@1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) @@ -11224,21 +11224,21 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 '@babel/types': 7.28.1 - '@tanstack/router-core': 1.130.9 - '@tanstack/router-generator': 1.130.9 - '@tanstack/router-utils': 1.129.7 + '@tanstack/router-core': 1.130.12 + '@tanstack/router-generator': 1.130.15 + '@tanstack/router-utils': 1.130.12 '@tanstack/virtual-file-routes': 1.129.7 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.5 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + '@tanstack/react-router': 1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.129.7': + '@tanstack/router-utils@1.130.12': dependencies: '@babel/core': 7.28.0 '@babel/generator': 7.28.0 @@ -11249,9 +11249,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.14)': + '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.14)': dependencies: - '@tanstack/react-router': 1.130.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-router': 1.130.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) zod: 4.0.14 '@tanstack/store@0.7.0': {} @@ -11369,7 +11369,7 @@ snapshots: '@types/adm-zip@0.5.7': dependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 '@types/argparse@1.0.38': {} @@ -11400,12 +11400,12 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.16.5 + '@types/node': 22.17.0 '@types/responselike': 1.0.3 '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 '@types/d3-array@3.2.1': {} @@ -11541,7 +11541,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.16.5 + '@types/node': 22.17.0 '@types/geojson@7946.0.14': {} @@ -11559,11 +11559,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 '@types/keyv@3.1.4': dependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 '@types/lodash-es@4.17.12': dependencies: @@ -11579,7 +11579,7 @@ snapshots: '@types/node@16.18.108': {} - '@types/node@22.16.5': + '@types/node@22.17.0': dependencies: undici-types: 6.21.0 @@ -11597,21 +11597,21 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@19.1.6(@types/react@19.1.8)': + '@types/react-dom@19.1.7(@types/react@19.1.9)': dependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@types/react-transition-group@4.4.12(@types/react@19.1.8)': + '@types/react-transition-group@4.4.12(@types/react@19.1.9)': dependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@types/react@19.1.8': + '@types/react@19.1.9': dependencies: csstype: 3.1.3 '@types/responselike@1.0.3': dependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 '@types/retry@0.12.2': {} @@ -11631,53 +11631,53 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 optional: true - '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/type-utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.38.0 eslint: 9.32.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1 eslint: 9.32.0(jiti@2.4.2) - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.36.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.36.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.9.2) '@typescript-eslint/types': 8.36.0 debug: 4.4.1 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.38.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.2) '@typescript-eslint/types': 8.38.0 debug: 4.4.1 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -11691,23 +11691,23 @@ snapshots: '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 - '@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.9.2)': dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.9.2)': dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/type-utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) debug: 4.4.1 eslint: 9.32.0(jiti@2.4.2) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -11717,10 +11717,10 @@ snapshots: '@typescript-eslint/types@8.38.0': {} - '@typescript-eslint/typescript-estree@8.36.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.36.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.36.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) + '@typescript-eslint/project-service': 8.36.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.9.2) '@typescript-eslint/types': 8.36.0 '@typescript-eslint/visitor-keys': 8.36.0 debug: 4.4.1 @@ -11728,15 +11728,15 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/project-service': 8.38.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.2) '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1 @@ -11744,30 +11744,30 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.36.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.36.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.36.0 '@typescript-eslint/types': 8.36.0 - '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.9.2) eslint: 9.32.0(jiti@2.4.2) - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) eslint: 9.32.0(jiti@2.4.2) - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -11842,7 +11842,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.10.1': optional: true - '@vitejs/plugin-legacy@7.1.0(terser@5.36.0)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-legacy@7.1.0(terser@5.36.0)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) @@ -11857,19 +11857,19 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.36.0 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react-swc@3.11.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-react-swc@3.11.0(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 '@swc/core': 1.13.0 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.7.0(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-react@4.7.0(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -11877,7 +11877,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -11911,7 +11911,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.8.3)': + '@vue/language-core@2.2.0(typescript@5.9.2)': dependencies: '@volar/language-core': 2.4.11 '@vue/compiler-dom': 3.5.13 @@ -11922,7 +11922,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 '@vue/shared@3.5.13': {} @@ -12555,12 +12555,12 @@ snapshots: core-js@3.44.0: {} - cosmiconfig-typescript-loader@6.1.0(@types/node@22.16.5)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@22.17.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2): dependencies: - '@types/node': 22.16.5 - cosmiconfig: 9.0.0(typescript@5.8.3) + '@types/node': 22.17.0 + cosmiconfig: 9.0.0(typescript@5.9.2) jiti: 2.4.2 - typescript: 5.8.3 + typescript: 5.9.2 cosmiconfig@7.1.0: dependencies: @@ -12570,23 +12570,23 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.8.3): + cosmiconfig@8.3.6(typescript@5.9.2): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - cosmiconfig@9.0.0(typescript@5.8.3): + cosmiconfig@9.0.0(typescript@5.9.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 country-code-emoji@2.3.0: {} @@ -13361,9 +13361,9 @@ snapshots: optionalDependencies: unrs-resolver: 1.10.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))): dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)) eslint-import-resolver-node@0.3.9: dependencies: @@ -13373,7 +13373,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 @@ -13384,16 +13384,16 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.10.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) eslint: 9.32.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -13410,7 +13410,7 @@ snapshots: dependencies: htmlparser2: 10.0.0 - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)): dependencies: '@typescript-eslint/types': 8.35.1 comment-parser: 1.4.1 @@ -13423,12 +13423,12 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.10.1 optionalDependencies: - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13439,7 +13439,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.32.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13451,13 +13451,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-n@17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) enhanced-resolve: 5.18.1 @@ -13468,7 +13468,7 @@ snapshots: globrex: 0.1.2 ignore: 5.3.2 semver: 7.7.2 - ts-declaration-location: 1.0.7(typescript@5.8.3) + ts-declaration-location: 1.0.7(typescript@5.9.2) transitivePeerDependencies: - typescript @@ -14191,11 +14191,11 @@ snapshots: hyphenate-style-name@1.1.0: {} - i18next@25.3.2(typescript@5.8.3): + i18next@25.3.2(typescript@5.9.2): dependencies: '@babel/runtime': 7.27.6 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 iconv-lite@0.6.3: dependencies: @@ -14565,9 +14565,9 @@ snapshots: jju@1.4.0: {} - jotai@2.12.5(@types/react@19.1.8)(react@19.1.1): + jotai@2.12.5(@types/react@19.1.9)(react@19.1.1): optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 react: 19.1.1 js-cookie@2.2.1: {} @@ -14645,10 +14645,10 @@ snapshots: kind-of@6.0.3: {} - knip@5.62.0(@types/node@22.16.5)(typescript@5.8.3): + knip@5.62.0(@types/node@22.17.0)(typescript@5.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 22.16.5 + '@types/node': 22.17.0 fast-glob: 3.3.3 formatly: 0.2.4 jiti: 2.4.2 @@ -14659,7 +14659,7 @@ snapshots: picomatch: 4.0.2 smol-toml: 1.3.4 strip-json-comments: 5.0.2 - typescript: 5.8.3 + typescript: 5.9.2 zod: 3.25.76 zod-validation-error: 3.3.1(zod@3.25.76) @@ -15208,16 +15208,16 @@ snapshots: muggle-string@0.4.1: {} - mui-color-input@7.0.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + mui-color-input@7.0.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@ctrl/tinycolor': 4.1.0 - '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.9)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 nano-css@5.6.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: @@ -15248,20 +15248,20 @@ snapshots: sax: 1.3.0 optional: true - neostandard@0.12.2(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3): + neostandard@0.12.2(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): dependencies: '@humanwhocodes/gitignore-to-minimatch': 1.0.2 - '@stylistic/eslint-plugin': 2.11.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@stylistic/eslint-plugin': 2.11.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) eslint: 9.32.0(jiti@2.4.2) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-n: 17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-n: 17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) eslint-plugin-promise: 7.2.1(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@2.4.2)) find-up: 5.0.0 globals: 15.15.0 peowly: 1.3.2 - typescript-eslint: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + typescript-eslint: 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node @@ -15803,38 +15803,38 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-hook-form-mui@7.6.2(5bed6be4950c70f4147e918454a0d179): + react-hook-form-mui@7.6.2(6f142df272ff31372e8729fe1f91fe1b): dependencies: - '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-hook-form: 7.52.1(react@19.1.1) optionalDependencies: - '@mui/icons-material': 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.8)(react@19.1.1) - '@mui/x-date-pickers': 8.9.2(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(react@19.1.1))(@types/react@19.1.8)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/icons-material': 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.9)(react@19.1.1) + '@mui/x-date-pickers': 8.9.2(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(react@19.1.1))(@types/react@19.1.9)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-hook-form@7.52.1(react@19.1.1): dependencies: react: 19.1.1 - react-i18next@15.6.1(i18next@25.3.2(typescript@5.8.3))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3): + react-i18next@15.6.1(i18next@25.3.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2): dependencies: '@babel/runtime': 7.27.6 html-parse-stringify: 3.0.1 - i18next: 25.3.2(typescript@5.8.3) + i18next: 25.3.2(typescript@5.9.2) react: 19.1.1 optionalDependencies: react-dom: 19.1.1(react@19.1.1) - typescript: 5.8.3 + typescript: 5.9.2 react-is@16.13.1: {} react-is@19.1.0: {} - react-markdown@10.1.0(@types/react@19.1.8)(react@19.1.1): + react-markdown@10.1.0(@types/react@19.1.9)(react@19.1.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.3 - '@types/react': 19.1.8 + '@types/react': 19.1.9 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 @@ -16575,36 +16575,36 @@ snapshots: dependencies: inline-style-parser: 0.2.3 - stylelint-config-html@1.1.0(postcss-html@1.8.0)(stylelint@16.23.0(typescript@5.8.3)): + stylelint-config-html@1.1.0(postcss-html@1.8.0)(stylelint@16.23.0(typescript@5.9.2)): dependencies: postcss-html: 1.8.0 - stylelint: 16.23.0(typescript@5.8.3) + stylelint: 16.23.0(typescript@5.9.2) - stylelint-config-recess-order@7.1.0(stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.8.3)))(stylelint@16.23.0(typescript@5.8.3)): + stylelint-config-recess-order@7.1.0(stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.9.2)))(stylelint@16.23.0(typescript@5.9.2)): dependencies: - stylelint: 16.23.0(typescript@5.8.3) - stylelint-order: 7.0.0(stylelint@16.23.0(typescript@5.8.3)) + stylelint: 16.23.0(typescript@5.9.2) + stylelint-order: 7.0.0(stylelint@16.23.0(typescript@5.9.2)) - stylelint-config-recommended@17.0.0(stylelint@16.23.0(typescript@5.8.3)): + stylelint-config-recommended@17.0.0(stylelint@16.23.0(typescript@5.9.2)): dependencies: - stylelint: 16.23.0(typescript@5.8.3) + stylelint: 16.23.0(typescript@5.9.2) - stylelint-config-standard@39.0.0(stylelint@16.23.0(typescript@5.8.3)): + stylelint-config-standard@39.0.0(stylelint@16.23.0(typescript@5.9.2)): dependencies: - stylelint: 16.23.0(typescript@5.8.3) - stylelint-config-recommended: 17.0.0(stylelint@16.23.0(typescript@5.8.3)) + stylelint: 16.23.0(typescript@5.9.2) + stylelint-config-recommended: 17.0.0(stylelint@16.23.0(typescript@5.9.2)) - stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@16.23.0(typescript@5.8.3)): + stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@16.23.0(typescript@5.9.2)): dependencies: - stylelint: 16.23.0(typescript@5.8.3) + stylelint: 16.23.0(typescript@5.9.2) - stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.8.3)): + stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.9.2)): dependencies: postcss: 8.5.6 postcss-sorting: 9.1.0(postcss@8.5.6) - stylelint: 16.23.0(typescript@5.8.3) + stylelint: 16.23.0(typescript@5.9.2) - stylelint-scss@6.12.1(stylelint@16.23.0(typescript@5.8.3)): + stylelint-scss@6.12.1(stylelint@16.23.0(typescript@5.9.2)): dependencies: css-tree: 3.1.0 is-plain-object: 5.0.0 @@ -16614,9 +16614,9 @@ snapshots: postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - stylelint: 16.23.0(typescript@5.8.3) + stylelint: 16.23.0(typescript@5.9.2) - stylelint@16.23.0(typescript@5.8.3): + stylelint@16.23.0(typescript@5.9.2): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -16625,7 +16625,7 @@ snapshots: '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.2) css-functions-list: 3.2.3 css-tree: 3.1.0 debug: 4.4.1 @@ -16819,22 +16819,22 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 ts-custom-error@3.3.1: {} - ts-declaration-location@1.0.7(typescript@5.8.3): + ts-declaration-location@1.0.7(typescript@5.9.2): dependencies: picomatch: 4.0.3 - typescript: 5.8.3 + typescript: 5.9.2 ts-easing@0.2.0: {} - tsconfck@3.0.3(typescript@5.8.3): + tsconfck@3.0.3(typescript@5.9.2): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 tsconfig-paths@3.15.0: dependencies: @@ -16940,18 +16940,18 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) eslint: 9.32.0(jiti@2.4.2) - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - typescript-plugin-css-modules@5.2.0(typescript@5.8.3): + typescript-plugin-css-modules@5.2.0(typescript@5.9.2): dependencies: '@types/postcss-modules-local-by-default': 4.0.2 '@types/postcss-modules-scope': 3.0.4 @@ -16968,7 +16968,7 @@ snapshots: sass: 1.83.0 source-map-js: 1.2.1 tsconfig-paths: 4.2.0 - typescript: 5.8.3 + typescript: 5.9.2 optionalDependencies: stylus: 0.62.0 transitivePeerDependencies: @@ -16977,7 +16977,7 @@ snapshots: typescript@5.7.3: {} - typescript@5.8.3: {} + typescript@5.9.2: {} ufo@1.5.4: {} @@ -17094,7 +17094,7 @@ snapshots: unplugin: 2.3.5 unplugin-utils: 0.2.4 - unplugin-icons@22.2.0(@svgr/core@8.1.0(typescript@5.8.3)): + unplugin-icons@22.2.0(@svgr/core@8.1.0(typescript@5.9.2)): dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/utils': 2.3.0 @@ -17102,7 +17102,7 @@ snapshots: local-pkg: 1.1.1 unplugin: 2.3.5 optionalDependencies: - '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/core': 8.1.0(typescript@5.9.2) transitivePeerDependencies: - supports-color @@ -17227,26 +17227,26 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@22.16.5)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.40.0)(typescript@5.9.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): dependencies: - '@microsoft/api-extractor': 7.51.0(@types/node@22.16.5) + '@microsoft/api-extractor': 7.51.0(@types/node@22.17.0) '@rollup/pluginutils': 5.1.4(rollup@4.40.0) '@volar/typescript': 2.4.11 - '@vue/language-core': 2.2.0(typescript@5.8.3) + '@vue/language-core': 2.2.0(typescript@5.9.2) compare-versions: 6.1.1 debug: 4.4.0 kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 5.8.3 + typescript: 5.9.2 optionalDependencies: - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-html@3.2.2(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -17260,39 +17260,39 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) - vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): dependencies: postcss: 8.5.6 postcss-js: 4.0.1(postcss@8.5.6) prettier: 3.6.2 sass-embedded: 1.89.2 - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) - vite-plugin-svgr@4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-svgr@4.3.0(rollup@4.40.0)(typescript@5.9.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.40.0) - '@svgr/core': 8.1.0(typescript@5.8.3) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + '@svgr/core': 8.1.0(typescript@5.9.2) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.8.3) + tsconfck: 3.0.3(typescript@5.9.2) optionalDependencies: - vite: 7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@7.0.6(@types/node@22.16.5)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0): + vite@7.0.6(@types/node@22.17.0)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.4.6(picomatch@4.0.3) @@ -17301,7 +17301,7 @@ snapshots: rollup: 4.40.0 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.16.5 + '@types/node': 22.17.0 fsevents: 2.3.3 jiti: 2.4.2 less: 4.2.0 diff --git a/lede/package/firmware/ath11k-firmware/Makefile b/lede/package/firmware/ath11k-firmware/Makefile index 2257313b46..2afd7771c9 100644 --- a/lede/package/firmware/ath11k-firmware/Makefile +++ b/lede/package/firmware/ath11k-firmware/Makefile @@ -62,17 +62,6 @@ define Build/Compile endef -QCN9074_BOARD_REV:=8e140c65f36137714b6d8934e09dcd73cb05c2f6 -QCN9074_BOARD_FILE:=board-2.bin.$(QCN9074_BOARD_REV) - -define Download/qcn9074-board - URL:=https://github.com/kvalo/ath11k-firmware/raw/master/QCN9074/hw1.0/ - URL_FILE:=board-2.bin - FILE:=$(QCN9074_BOARD_FILE) - HASH:=dbf0ca14aa1229eccd48f26f1026901b9718b143bd30b51b8ea67c84ba6207f1 -endef -$(eval $(call Download,qcn9074-board)) - define Package/ath11k-firmware-ipq5018/install $(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ5018/hw1.0 $(INSTALL_DATA) \ @@ -82,7 +71,6 @@ endef define Package/ath11k-firmware-ipq6018/install $(INSTALL_DIR) $(1)/lib/firmware/IPQ6018 - $(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0 $(INSTALL_DATA) \ $(PKG_BUILD_DIR)/ath11k-firmware/IPQ6018/hw1.0/2.5.0.1/WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1/* \ $(1)/lib/firmware/IPQ6018/ @@ -107,8 +95,6 @@ define Package/ath11k-firmware-qcn9074/install $(INSTALL_DATA) \ $(PKG_BUILD_DIR)/ath11k-firmware/QCN9074/hw1.0/testing/2.9.0.1/WLAN.HK.2.9.0.1-01385-QCAHKSWPL_SILICONZ-1/* \ $(1)/lib/firmware/ath11k/QCN9074/hw1.0/ - $(INSTALL_BIN) \ - $(DL_DIR)/$(QCN9074_BOARD_FILE) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board-2.bin endef $(eval $(call BuildPackage,ath11k-firmware-ipq5018)) diff --git a/lede/package/qca/nss-eip-firmware/Makefile b/lede/package/qca/nss-eip-firmware/Makefile new file mode 100644 index 0000000000..de9558e0ca --- /dev/null +++ b/lede/package/qca/nss-eip-firmware/Makefile @@ -0,0 +1,34 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=nss-eip-firmware +PKG_VERSION=2.5.7 +PKG_RELEASE:=1 + +PKG_MAINTAINER:=Robert Marko + +include $(INCLUDE_DIR)/package.mk + +define Package/nss-eip-firmware + SECTION:=firmware + CATEGORY:=Firmware + TITLE:=NSS EIP-197 firmware + DEPENDS:=@(TARGET_qualcommax_ipq807x||TARGET_qualcommax_ipq60xx) +endef + +define Build/Compile + +endef + +define Package/nss-eip-firmware/install + $(INSTALL_DIR) $(1)/lib/firmware/ + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/ifpp.bin $(1)/lib/firmware/ifpp.bin + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/ipue.bin $(1)/lib/firmware/ipue.bin + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/ofpp.bin $(1)/lib/firmware/ofpp.bin + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/opue.bin $(1)/lib/firmware/opue.bin +endef + +$(eval $(call BuildPackage,nss-eip-firmware)) diff --git a/lede/package/qca/nss-eip-firmware/src/ifpp.bin b/lede/package/qca/nss-eip-firmware/src/ifpp.bin new file mode 100644 index 0000000000000000000000000000000000000000..033ad555266d6ddd9bd39a3af4fe9c6c5f631ce7 GIT binary patch literal 12272 zcmeHNe{dAnegE#>-rcTrpxx7*PLgrh`-O##;{#)SPz;L%SfXZpmW6|CoGu;PmEAU3 z;s#8ovEOkAx{L7m5|{)^;|g$X;>k?G;Pgj4ld~hYBq2pfnihL#dc}%OTiX@3GsH8F z>G%8g_H=iWFr;?>Xo1<;)7$sHKR@3e@9hGEu*6tIW$c=n<5$CH!DY&f#e9s##X^s| z6f!2r`iu{@tkVJd7MV#-akwPqId{=y~MBBKw^% zTXR$M2usEHxU4T0^SfXd+XVycY4##3=JCIBu?y0*bDpeQv#0LwO#Tn@>HMP=ng>}? zIc*K=kp5RLhm;U=MgCxrg)cO>3vi}gdjJFzAa~D37{WU%;PZRv?ke=a zpD7s=4AuoD7knNXO$%vsK!Z#d(V+3oXm_Hug@M^&wrg||-9Lder@IB$JqBRH+n-V& z0~d}d_xRBFz##J8;AkAI7n1mUoOEA@x?h-m!%IXLtc6Li=Hqo3FPsA)(eHQiLmT;+ z;f5T^hq7vg_tj^WM$;&a4};(`Ka`ny8{#Tm*b3iZ8S{ssU(X&He81_mb&WpNTpFWw z&nnCeAf6hmw;BeFXWN14^Pw=`^_OU07>=UMg8J9=8-2J8#y1^fe@kdkxIguki4UGx zqXTon8|C?L07Lmk7ID8Sf~i_XJvMwo7XaYfXp^aU{h*51Pr=1wfOwr`KP&UXc+me5 zdA&LXuRhLe9r7Z){R`TDWcW1a_hXbr+P|Ulo8txT{5tXAHa?teC12YZkb%Ksyp{lC zzlHauc)ta&Wnif|C(;R1{_~*U%Kj|VbZA5Bh%Q;r=_SNaEB=PWEiRJLlWsI~R#f+< z!5oH$86{}An&!#YF&%Ld>tLfd&ts_t(BNzSoQX`!I8mYDssu|dI?cWn^;ySaFNfN+ zaqo(NQ0Rx>%{QV>3-w~K_k7dHm$XyX0bTCX+AXoP<;Jurd?)=M>F_oq{YrY7c*C}R z(!T7M(!WYS>N=SDiR*mk(TsiHmp!>{U-stA2J!s1yIiX?`?CA8JH*D!oa_zRwb_l? z!R+U<`w){ylS>iL2Iew&$nRxdE0mKgDK`)Z9JgY+qko5StL9PEBL}mH3B>h6#=`S( zje&V=DO18sDtO_cc!<^`tr*g1&J8p-AGZ$b8uVzi<~SRU%PSxBx2~Mye?ooi-vpz7 zmY_c66U?V(iN^P5f$_2%j5~s0^af8@aeaYs*M3@uv;?2orfHa0{x|s(-)f$uZvt)A zit)AwbDP2P5s*}`A*pV7=&K>JiBfF9ZPzpm1(@Tp8N$0DIIS>7?pmevYZW}_|-qH+KGKuC-6K%(?v$xrH z{|c->M>dwt#Txm=u{o_Fzfs&x_^nw3BT(@z#u4|6tsBJQfnW%{%CvDubWTBFzY{wX zaf`Y=5WlRold#Y+mt)~=#r3gaK}Ia-h=mhXSg6i7Oj3EQ!9ZLDj~y#I+b&2F7RbI;IU)>FA!JB}APj{4 zl{7%Ah`(Nz;#kB}{@G413EibLBz zqc?%|eDVYvj>$$3_Efbts>P7(g;}3`J~__x*kt+isBA2r>I0N80}yXCaC_|@y0NZguO(YYD7KF>N;7SPqfnA5X(%?C#u=bbHS4#``aSL}X(^2)_zojSLmt`FF{Uheu@Y+$WPeDe9_a@|&W{5!Jf0SL!XE} zDZltUN=?3Ua*I>{={fF8=HuA|`B=;i^aeq~Z9Cp6SIKAZ_{9OmWgbwlj=UKLqWKi| zyNNLo3`sCoNz5#cMaQ33@;KHDPvd?~wyqDJMx0MohaJ8|n`p@+cLmwmp!%n{U*`3D zWJ^#e^#>u<-<}?5o2B3P_m!CVD0;0U54d?wt)ll)Yh=j`wvODz*SSXe-PN+xuf24< z_f+;K6+MwpHErC>x#hlf?ZfwleCo=-tLP};-lv`~)fmTaq#r(?v_CtPr}`4p_Xwpe zN2H_DN$Ka=_od|a_3lU9Uv)pZ{jc2bxK+=mJ@wbhk<7eXb(X)+O&ep&-)�{}%SggMK=Gpp}q8+qQ5F_yiFtF=fI&VzvPgYsU` z8P}WqM`+y61C$rmM7kwYdtLDF=e%-ut*Y=7a6aZUhhGq|7p9)L%xBIFn@{yx@`ntC zs0@dq&N@fVx2BQvy{yC6mj6=aB>D#SdYH2#(EXBsXM-N3nveM|!q0cOEQcZ<{G0MU z<#w{y%uP7jj8!J*I_HtNLZboe+8pr;0XD2d)dBZ7uvJQW{c2jwrFCLy8rRA zjq9JyhPKJE0D&Xbc&_H-#6mTF&kVIDcFOqgMErM>T+h0(E>9uTbN>UG3^sZrVg7dY z^XF*Kg4Y?uzEtLI*!Vxn&lpG!!av0W$`Ne#j`xMOXRt3 zeHiJ6MUEB34(g1*!#q!79wQxxsUDzzH|%hsY?zNxRGX1gpku z{p>ssrNyw%<1)pj#F1}Qbf?OGc>@Oaz%Vm!2XUJce1L|c*e%F<87ohx7E&G4&z!)W5*z0O!$930M zud9~biQj73>vIhGk?c?Oxy|chsDq^_KZX-#yT2F;H`_hJF!jiVvvQ-P1`v$U8oO;ZA2g zloqOALq8DTDQTfT2L^%T+3}S#x5igx{lVg9Co_icHAByI{Ljhg?>JxX97>P*6`FN9gW|x^ zBbckzqcw-PLm6x7+VYFuiCR8g-J^9PzPBNp5FL_VsOnK4xo8e&F%i~WcJ5a3U1YEP zOfDxsBh$4(-kaNt_h;ls<=@9~{8e*JH!pyDTM*>e43F9ju$=oOhVM-2d_to4rm$zl zVceru&okU=3*}`IYsxJ%+wEKctzA>CpK2}c&+#mHZGdP%=51DA0;;~HptUsjO{7^nUJO_MHU#y{c)kVrtw6_dL!VbF>dCV&=}Sw7{@!3Q zoUpodJ~!_&7g{Uvch!8f8DtG`;rALo$u-ttNjl(|Wc37QsXge^+m8Vxbhi6!NyGI3 z(1AMOI*UXd@iPp@(JKH^0YC}2R8#Lm;+|Y(+Y)z69pyxDC#dC2~-K7}wr_HV6xvq9hP zKx0$l4>f6Jo6uniI=!fY|aBdqkXfvl6QzV72b>_*S zXbp8^3Mhi}ya9jv>Yg{^8s|BFzoDJBzNKT|1n5gHFFhl9ePudB_&pAdB@yd%7mABr zyYh;e#CJkV>3gTt;^w9J?MO9tym+PuutNGK(h(%3neL5}@Gjlml8fIx<-1pMy+-45 z`L2}58}QzUV;xpTCm%T9${aJ)~=T8TBN(u5AT;Q^pM2h`M^syccnz91d|hW#ksbAi{+$YYT+Pa^-vv0plbXUyBj zHkJ-4iut3l2Z8>6vHUm9$GjI|!8?ALdU;)tuHInW&w{=DZ&p}e`UPSu<&OJzwp=f= z-F@S4qK?>u-jr#X>mUE#x*%PLJ@}rOsRK!C8{$MAkR-)RcSRD<+xSEI0Mskj6&qZ^ wz!eN!!N3&^T*1KqZ46-l*8pmvlVL-Hy&V5-00^zn&`#sn!_Ys57w-%H8{to-P5=M^ literal 0 HcmV?d00001 diff --git a/lede/package/qca/nss-eip-firmware/src/ipue.bin b/lede/package/qca/nss-eip-firmware/src/ipue.bin new file mode 100644 index 0000000000000000000000000000000000000000..153a7b4e8a3dd67accb063d33bff7e82d3b5f834 GIT binary patch literal 6116 zcmeHL|8rbb6+iFYx5?XNQ{Ha2*`yG1lWc9`l;I^^rkfIETMBF-fvCk|JIuUF$4M2O zmlmZ((7V|HX=q``GN6v5v103}BWVle7a6y-3>|f(>Nt)vj@vX$A0nMV8DXa2`Z+Ie zLz;qrLE5=b3f)r4Det=_ z-b{I%jclgE?A&OfiTZKIP)BxTfQ zDuw78=qsM+Ds@rVF;DJpG)?VIUi*yKQhHJBcD_k+`x-izKPL{U?@>;j6UT^Ju0FDp zCbypx=kkA|Q*uC=B0c=PEu& zl-(w&FuYTJp1!6wDI$9bks~RyMbhAuBr;=UnzU1qL)MhNU`&r@D{cgJz z{hhG+c*DI74tSE$#09{cVJy@l92)V3;LH*95bm(ceY8!`o( z(D90C@2UpZsx$5jl7=?==NrKfF`9Q+Puh#l^obgWyx4o+7aIJ1RARqrn4t@#)MjCj zQ}Ml`AO0RB`=M$Z{LEodmR0j4Luje^_8~&Si-_o+RDU@-q0Y-x+IbRRWVN^&@yrqD7fR(AX zH6S0_BJrzqzPHMKneJgw?W6nppfql|BJ5D{&&c3>w-{eNq(eAJ09TJ2rAm zzZdOg?m=GMv<2gZ>kG$wq2m|Y3#=*7wQl5Wezt$ttghVgk)P(inxpKFM0UEdr0IF* zX2`voaQdekO3&)TxnVjn^Bm;BbhC9o=5K>MrXz0ly=KtpbyJeu655tPqE7|X*ex=> zR^F6cJ8=^YtvyYqWdi#ys-`HJ6itEOA@H2CYu_jDhN$VqW`4 zat?U1W~@rabD2J)&K`)9cb`9R{A+hyX4hkULn4X#MrOvm5nMPKlG@xV48^>jh2b&@&R zn$AtMQ7Pt+*@p?7@4$R-PR`A*%uTdr=IyhwzCKvz{bpu2a!d8>UKV?MH|}yjY=lrh z8NUO-?~~$qIugbKA#+ZX0En#?M@H3UNkmB;n-Nn)+%-6DDsnQiRo>h`Bs1{`(Hf! zsj2yP$9~&=UV1w$uDNDWbw`S{8vdo?s4dCi{jhNmzbDV2{W#qS46Z1u)e`GTtfzWdOSo_;TY2aIGPo$H(=sGm1N9oF|3w`K=Hy-_2{t1I_{d z{UI0cD}$mu|4-~At{Xwk(`st)#;ql1aueky+NtsSBSa}d+3xd%H(y3gu1Hw+ z6gew&vhg+{8==c^FMc;a(tS!GcXhHRWe47Om6-3y=TP6_$0x+L(f?h}G;n+rl45?0 zWXO7svo6zz-;fRT*}UeoQCPnkccoPYzAuQmF54s6XWw7=%09CF%6;*BkKdn$R_9@h%<*^dr2TKGsJlwlVSMtnql~3J&+=pH-d2}7*_?dI+!;DSsTbmur7?SnANZO z`VB+#^;a3%8TO|-7>69ey+Yzq5=DzLV=&h7c=D6S1=th?!*_ux4o>MwXFaJ`C(@(B8)! z$E!onJ3*g)XCL04=L7p2N3G1@tu#N5`QH^j&*$M%J<73V1iycKm7U~obN}01xy5;xKVJ4{7oeQ1*Ir~`Ffr)_U|DkGlw8aCNGptms~AK`Hl#d{ zd(8Bq_m@3%O#7zPX}v zeV(a$DC*{8-Wu7d@LJp-09-|yfIC>EX$dWW+m;cL2YQg;zC>eM_!T@GK$c+JDUSF2 z1^d6ROd}qfKrlp>TWsCfhjbck?sIu^^{REC$0eFyX~i|b*h`3IEB33ftwwqcutTdw zJyuIK3joZfIGA5zJJSlXhd6O(&SR1$=(6|v?A-EJFwdgQinx@G z(I%ELz#NN5ldRpgy|||m9j!FCIRHAVL1`TInA-x7>~?|@8Li-atGhY_f&rj7gj7iN zRMitO0uD%3tB~rhe)Jhz>~n#u(hp9i!pC)tMHC&AID@_i z&4c5xo>lU7X|x$2AT(YKkdCbmLD}k{CdOLZMh8%%_jdnnYNc<}_tI~tUr3M8clwco zym+DKbg|9M$zAF%mBSdXe3%Uz7+XBw4se*xgQB6T5K{U1Q%Fw|zikWBLMIHgD?7%X z0hVh@qHU19GyEEHp#LyVLTDqQN^B^7f8X7JX^>DoA>ng>s6K&hV zb-^w2EM$Ae$Psd!d`6<6^&BN*>0{&*vJBwOF~W=ufu(eIF%M|> z^X)9oejDdfJRXEa5r>Ci0Ot9)2PT^k1J^o`Rm8_9?fly3Sl*}Z$GBP+70@<`<74M@8kFj2j8r4syy@Xu&kL-QyI#(LoV8-Jj z0O57tt_2_kDfe@>CbzMFz&I!k3r(^+sDhi$)=#XHMuHUa=6>XBJGlRGEh((sP6v$n z>v$a?#(KPqXJZq`0hsy;+t!jA(Dkosz`^B2j~#}fPUD| zb9aa`7jnW8W*1C^M~n2C^6K}bC%EZoaH^wS>AJ*qx2YlhbYfk&P$So)4WDe zw6loOlgq()Tq@)s=0&)egHhu-pXE|q;BsDrn!T>626X7&J{OaNstAgmYe^AnyF*i{ zQ@CciOq(Y?rDw#);crj+jQnnxtvM4yBi=dn0x>em4-O!kMxr?OWzzP&!|R*`SHnD} zB_*VK^?DLb)=Hqk=8ym=a~|{MKJyA}F1`~Y8I+rSC)n=>PV+niaE1ZajM(o8yZ*7P zu2`o5jIJ3T${3Vmpd16`7%0a; vIR?rxP>z9e4E*0?KmxZ6O16#Rzm*EeHl4(uIW>TPy(6C>0Qh0p?Dz3M#;8t} literal 0 HcmV?d00001 diff --git a/lede/package/qca/nss-eip-firmware/src/opue.bin b/lede/package/qca/nss-eip-firmware/src/opue.bin new file mode 100644 index 0000000000000000000000000000000000000000..80fb1a211d58e4e08230a354e644b2c46817ef13 GIT binary patch literal 4068 zcmeHKU279j5IsrOG)dFuCWhG5er%c;TcKrJMUrYEh=LTs;%j|arHBQEtx!cooVG#> z1zo6`>Wjq}AEfL`1ff{m;s^TF{)ABT1M0_noSQ~$i}(w6VK{g0&YU}Q=e%5aLoFcW z*#^%UnhK*o2V)>tc-+02g-_RMDWlR-7DOjN;geI3#-Z~5$2a4Cr#O^wDpy1tjk+^C zPKV*1H=!Wp|RRLtugXwn}nwxfgQb&o&jhuJLzI&1ms#k|j%J-)wc4hLbBa&4P* zD29!REDZq0u^hH2Rb6OVlQmQqTBCiK(ShJ7%liijVwiJcb&NA+*>7Py!&n0JJFst*P@-+KP=W=`)a(n) zBm0*aAp7uo@pgkVd-FiRc&iF;;g$u9q}{_9-DSL1_ZK<;&%d4cuedPTX=p>fsu=VE zT0n8Azxw>(#tPSFf%Km8Gcn2ME9IwRg70L7>*Zckia!{gBVHS?Rmm}eP~%P>Ipbv_ zUCvj=MZA%UYQWWis{vO7t_EBUxEgRZz;CTq W2=f&2izJRvZS7%U@JDR5cf)U5t5W*_ literal 0 HcmV?d00001 diff --git a/lede/package/qca/qca-nss-crypto/Makefile b/lede/package/qca/qca-nss-crypto/Makefile index c0d2dc4bb4..13844ee95e 100644 --- a/lede/package/qca/qca-nss-crypto/Makefile +++ b/lede/package/qca/qca-nss-crypto/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=qca-nss-crypto PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2022-12-15 +PKG_SOURCE_DATE:=2024-09-16 PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/nss-crypto.git -PKG_SOURCE_VERSION:=3c5a574ce99d7f0b9f892002020f1bf9bfc57a81 -PKG_MIRROR_HASH:=ff487c5574481f548eef7b61129fa7be1d83ae285dcc3356a06be237440d8782 +PKG_SOURCE_VERSION:=60e27b91f9cdb1d6de38337c03444021ae8c1040 +PKG_MIRROR_HASH:=1ba1133bcc3d760a3d77cb6cf49541a293fc08c97a8b1eebebf01ade55606e63 PKG_BUILD_PARALLEL:=1 @@ -26,7 +26,7 @@ define KernelPackage/qca-nss-crypto SECTION:=kernel CATEGORY:=Kernel modules SUBMENU:=Cryptographic API modules - DEPENDS:=@TARGET_qualcommax +kmod-qca-nss-drv + DEPENDS:=@TARGET_qualcommax +kmod-qca-nss-drv +TARGET_qualcommax_ipq807x:nss-eip-firmware +TARGET_qualcommax_ipq60xx:nss-eip-firmware TITLE:=Kernel driver for NSS crypto driver FILES:=$(PKG_BUILD_DIR)/$(NSS_CRYPTO_DIR)/src/qca-nss-crypto.ko \ $(PKG_BUILD_DIR)/$(NSS_CRYPTO_DIR)/tool/qca-nss-crypto-tool.ko @@ -43,6 +43,8 @@ define Build/InstallDev endef EXTRA_CFLAGS+= \ + -Wno-missing-prototypes \ + -Wno-missing-declarations \ -DCONFIG_NSS_DEBUG_LEVEL=4 \ -I$(STAGING_DIR)/usr/include/qca-nss-crypto \ -I$(STAGING_DIR)/usr/include/qca-nss-drv \ diff --git a/lede/package/qca/qca-nss-crypto/patches/0001-nss-crypto-fix-SHA1-header-include.patch b/lede/package/qca/qca-nss-crypto/patches/0001-nss-crypto-fix-SHA1-header-include.patch deleted file mode 100644 index c9849a2e8d..0000000000 --- a/lede/package/qca/qca-nss-crypto/patches/0001-nss-crypto-fix-SHA1-header-include.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 0c6c593783f2d64a429ad38523661a915aa462fc Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Sun, 13 Mar 2022 13:44:47 +0100 -Subject: [PATCH 1/3] nss-crypto: fix SHA1 header include - -SHA1 header has been merged to the generic SHA one, -and with that the cryptohash.h was dropped. - -So, fix include in kernels 5.8 and newer. - -Signed-off-by: Robert Marko ---- - v2.0/src/nss_crypto_hlos.h | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/v2.0/src/nss_crypto_hlos.h -+++ b/v2.0/src/nss_crypto_hlos.h -@@ -55,7 +55,9 @@ - #include - #include - #include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) - #include -+#endif - #include - #include - #include diff --git a/lede/package/qca/qca-nss-crypto/patches/0001-nss-crypto-support-kernel-6.12.patch b/lede/package/qca/qca-nss-crypto/patches/0001-nss-crypto-support-kernel-6.12.patch new file mode 100644 index 0000000000..7bde99de36 --- /dev/null +++ b/lede/package/qca/qca-nss-crypto/patches/0001-nss-crypto-support-kernel-6.12.patch @@ -0,0 +1,155 @@ +--- a/v1.0/src/nss_crypto_dtsi.c ++++ b/v1.0/src/nss_crypto_dtsi.c +@@ -346,7 +346,7 @@ static int nss_crypto_probe(struct platf + * nss_crypto_remove() + * remove the crypto engine and deregister everything + */ +-static int nss_crypto_remove(struct platform_device *pdev) ++static void nss_crypto_remove(struct platform_device *pdev) + { + struct nss_crypto_ctrl_eng *e_ctrl; + struct nss_crypto_ctrl *ctrl; +@@ -361,7 +361,6 @@ static int nss_crypto_remove(struct plat + kfree(ctrl->clocks); + } + +- return 0; + }; + + static struct of_device_id nss_crypto_dt_ids[] = { +@@ -375,7 +374,11 @@ MODULE_DEVICE_TABLE(of, nss_crypto_dt_id + */ + static struct platform_driver nss_crypto_drv = { + .probe = nss_crypto_probe, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 11, 0) ++ .remove_new = nss_crypto_remove, ++#else + .remove = nss_crypto_remove, ++#endif + .driver = { + .owner = THIS_MODULE, + .name = "nss-crypto", +--- a/v2.0/src/hal/ipq60xx/nss_crypto_eip197.h ++++ b/v2.0/src/hal/ipq60xx/nss_crypto_eip197.h +@@ -19,7 +19,9 @@ + #ifndef __NSS_CRYPTO_EIP197_H + #define __NSS_CRYPTO_EIP197_H + ++#include + #include ++#include + + /* + * Common configuration data for command and result +--- a/v2.0/src/hal/ipq60xx/nss_crypto_hw.c ++++ b/v2.0/src/hal/ipq60xx/nss_crypto_hw.c +@@ -15,8 +15,10 @@ + * PERFORMANCE OF THIS SOFTWARE. + */ + ++#include + #include + #include "nss_crypto_eip197.h" ++#include "nss_crypto_hw.h" + + /* + * nss_crypto_hw_deinit() +--- a/v2.0/src/hal/ipq807x/nss_crypto_eip197.h ++++ b/v2.0/src/hal/ipq807x/nss_crypto_eip197.h +@@ -20,6 +20,8 @@ + #define __NSS_CRYPTO_EIP197_H + + #include ++#include ++#include + + /* + * Common configuration data for command and result +--- a/v2.0/src/hal/ipq807x/nss_crypto_hw.c ++++ b/v2.0/src/hal/ipq807x/nss_crypto_hw.c +@@ -15,8 +15,10 @@ + * PERFORMANCE OF THIS SOFTWARE. + */ + ++#include + #include + #include "nss_crypto_eip197.h" ++#include "nss_crypto_hw.h" + + /* + * nss_crypto_hw_deinit() +@@ -27,7 +29,6 @@ void nss_crypto_hw_deinit(struct platfor + /* + * TODO: Add support for putting HW into reset + */ +- return; + } + + /* +--- a/v2.0/src/nss_crypto_ctrl.c ++++ b/v2.0/src/nss_crypto_ctrl.c +@@ -1575,11 +1575,10 @@ static int nss_crypto_device_probe(struc + * nss_crypto_device_remove() + * remove crypto device and deregister everything + */ +-static int nss_crypto_device_remove(struct platform_device *pdev) ++static void nss_crypto_device_remove(struct platform_device *pdev) + { + nss_crypto_hw_deinit(pdev); + nss_crypto_node_free(platform_get_drvdata(pdev)); +- return 0; + }; + + /* +@@ -1588,7 +1587,11 @@ static int nss_crypto_device_remove(stru + */ + static struct platform_driver nss_crypto_device = { + .probe = nss_crypto_device_probe, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 11, 0) ++ .remove_new = nss_crypto_device_remove, ++#else + .remove = nss_crypto_device_remove, ++#endif + .driver = { + .owner = THIS_MODULE, + .name = "nss-crypto-device", +@@ -1656,7 +1659,7 @@ static int nss_crypto_probe(struct platf + * nss_crypto_remove() + * remove the crypto driver + */ +-static int nss_crypto_remove(struct platform_device *pdev) ++static void nss_crypto_remove(struct platform_device *pdev) + { + struct nss_crypto_ctrl *ctrl = platform_get_drvdata(pdev); + +@@ -1670,7 +1673,6 @@ static int nss_crypto_remove(struct plat + * Clear the active state of driver + */ + ctrl->active = false; +- return 0; + } + + /* +@@ -1679,7 +1681,11 @@ static int nss_crypto_remove(struct plat + */ + static struct platform_driver nss_crypto_drv = { + .probe = nss_crypto_probe, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 11, 0) ++ .remove_new = nss_crypto_remove, ++#else + .remove = nss_crypto_remove, ++#endif + .driver = { + .owner = THIS_MODULE, + .name = "nss-crypto", +--- a/v2.0/tool/nss_crypto_bench.c ++++ b/v2.0/tool/nss_crypto_bench.c +@@ -980,7 +980,7 @@ int __init crypto_bench_init(void) + + ctx->attach = crypto_bench_attach; + ctx->detach = crypto_bench_detach; +- strlcpy(ctx->name, "bench", sizeof(ctx->name)); ++ strscpy(ctx->name, "bench", sizeof(ctx->name)); + ctx->hdr_pool_sz = 1024; + ctx->default_hdr_sz = 512; + ctx->timeout_ticks = 1; diff --git a/lede/package/qca/qca-nss-crypto/patches/0003-nss-crypto-fix-SHA-header-include-in-5.15.patch b/lede/package/qca/qca-nss-crypto/patches/0003-nss-crypto-fix-SHA-header-include-in-5.15.patch deleted file mode 100644 index 61df791fdd..0000000000 --- a/lede/package/qca/qca-nss-crypto/patches/0003-nss-crypto-fix-SHA-header-include-in-5.15.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 96da3ca01ac172e5d858209b3d3d9aefad04423c Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Sun, 13 Mar 2022 13:47:24 +0100 -Subject: [PATCH 3/3] nss-crypto: fix SHA header include in 5.15 - -SHA header was split into SHA-1 and SHA-2 headers in kernel 5.11, so -fix the include for newer kernels. - -Signed-off-by: Robert Marko ---- - v2.0/src/nss_crypto_ctrl.c | 6 ++++++ - v2.0/src/nss_crypto_hlos.h | 4 ++++ - 2 files changed, 10 insertions(+) - ---- a/v2.0/src/nss_crypto_ctrl.c -+++ b/v2.0/src/nss_crypto_ctrl.c -@@ -38,7 +38,13 @@ - #include - #include - #include -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) - #include -+#else -+#include -+#include -+#endif - #include - #include - #include ---- a/v2.0/src/nss_crypto_hlos.h -+++ b/v2.0/src/nss_crypto_hlos.h -@@ -58,7 +58,11 @@ - #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) - #include - #endif -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) - #include -+#else -+#include -+#endif - #include - #include - #include diff --git a/lede/package/qca/qca-nss-ecm/Makefile b/lede/package/qca/qca-nss-ecm/Makefile index 5b65c6e292..c71f60a999 100644 --- a/lede/package/qca/qca-nss-ecm/Makefile +++ b/lede/package/qca/qca-nss-ecm/Makefile @@ -28,8 +28,9 @@ define KernelPackage/qca-nss-ecm +@NSS_DRV_VIRT_IF_ENABLE \ +@NSS_DRV_WIFI_ENABLE \ +kmod-qca-nss-drv \ - +kmod-bonding +kmod-nf-conntrack \ + +kmod-bonding +kmod-nf-conntrack \ +kmod-ppp +kmod-pppoe +kmod-pptp \ + +PACKAGE_iptables:iptables-mod-physdev \ +PACKAGE_kmod-pppol2tp:kmod-pppol2tp \ +PACKAGE_kmod-qca-mcs:kmod-qca-mcs \ +PACKAGE_kmod-nat46:kmod-nat46 \ diff --git a/lede/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq8071-ap8220.dts b/lede/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq8071-ap8220.dts index f49e377002..be7798b591 100644 --- a/lede/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq8071-ap8220.dts +++ b/lede/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq8071-ap8220.dts @@ -227,26 +227,11 @@ &qpic_nand { status = "okay"; - partitions { - status = "disabled"; - }; - nand@0 { reg = <0>; nand-ecc-strength = <4>; nand-ecc-step-size = <512>; nand-bus-width = <8>; - - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - partition@0 { - label = "rootfs"; - reg = <0x0000000 0x8000000>; - }; - }; }; }; diff --git a/openwrt-packages/luci-app-amlogic/Makefile b/openwrt-packages/luci-app-amlogic/Makefile index d95d5f172e..481f330293 100644 --- a/openwrt-packages/luci-app-amlogic/Makefile +++ b/openwrt-packages/luci-app-amlogic/Makefile @@ -16,7 +16,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-amlogic -PKG_VERSION:=3.1.261 +PKG_VERSION:=3.1.263 PKG_RELEASE:=1 PKG_LICENSE:=GPL-2.0 License diff --git a/openwrt-packages/luci-app-amlogic/root/usr/sbin/openwrt-install-amlogic b/openwrt-packages/luci-app-amlogic/root/usr/sbin/openwrt-install-amlogic index 071f0f2a86..c807f96040 100755 --- a/openwrt-packages/luci-app-amlogic/root/usr/sbin/openwrt-install-amlogic +++ b/openwrt-packages/luci-app-amlogic/root/usr/sbin/openwrt-install-amlogic @@ -196,8 +196,8 @@ else # 7. ANDROID_UBOOT AMLOGIC_SOC="$(echo "${ret}" | awk -F ':' '{print $3}')" FDTFILE="$( - grep -oE 'meson[^[:space:]]*\.dtb' /boot/extlinux/extlinux.conf 2>/dev/null || - grep -oE 'meson[^[:space:]]*\.dtb' /boot/uEnv.txt 2>/dev/null || + grep -iE '^[[:space:]]*fdt[[:space:]]+/.*\.dtb' /boot/extlinux/extlinux.conf 2>/dev/null | grep -v '^[[:space:]]*#' | awk '{print $2}' | xargs basename 2>/dev/null || + grep -oE '^FDT=.*meson[^[:space:]]*\.dtb' /boot/uEnv.txt 2>/dev/null | cut -d= -f2 | xargs basename 2>/dev/null || echo "${ret}" | awk -F':' '{print $4}' )" UBOOT_OVERLOAD="$(echo "${ret}" | awk -F ':' '{print $5}')" diff --git a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh index ec9478fa00..d7ed6a59dd 100755 --- a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh +++ b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh @@ -74,7 +74,7 @@ current_plugin_v="" if command -v opkg >/dev/null 2>&1; then # System has opkg - package_manager="opkg" + package_manager="ipk" # Important: Add cut to handle versions like X.Y.Z-r1, ensuring consistent output current_plugin_v="$(opkg list-installed | grep '^luci-app-amlogic' | awk '{print $3}' | cut -d'-' -f1)" elif command -v apk >/dev/null 2>&1; then diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua index 696eae14f1..2f30dffc7d 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua @@ -17,6 +17,7 @@ o.rmempty = false ---- gfwlist URL o = s:option(DynamicList, "gfwlist_url", translate("GFW domains(gfwlist) Update URL")) +o:depends("geo2rule", false) o:value("https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt", translate("v2fly/domain-list-community")) o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt", translate("Loyalsoldier/v2ray-rules-dat")) o:value("https://fastly.jsdelivr.net/gh/Loukky/gfwlist-by-loukky/gfwlist.txt", translate("Loukky/gfwlist-by-loukky")) @@ -25,6 +26,7 @@ o.default = "https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release ----chnroute URL o = s:option(DynamicList, "chnroute_url", translate("China IPs(chnroute) Update URL")) +o:depends("geo2rule", false) o:value("https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt", translate("gaoyifan/china-operator-ip/china")) o:value("https://ispip.clang.cn/all_cn.txt", translate("Clang.CN")) o:value("https://ispip.clang.cn/all_cn_cidr.txt", translate("Clang.CN.CIDR")) @@ -34,12 +36,14 @@ o:value("https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule ----chnroute6 URL o = s:option(DynamicList, "chnroute6_url", translate("China IPv6s(chnroute6) Update URL")) +o:depends("geo2rule", false) o:value("https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china6.txt", translate("gaoyifan/china-operator-ip/china6")) o:value("https://ispip.clang.cn/all_cn_ipv6.txt", translate("Clang.CN.IPv6")) o:value("https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/ChinaMax/ChinaMax_IP.txt", translate("ios_rule_script/ChinaMax_IP")) ----chnlist URL o = s:option(DynamicList, "chnlist_url", translate("China List(Chnlist) Update URL")) +o:depends("geo2rule", false) o:value("https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf", translate("felixonmars/domains.china")) o:value("https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf", translate("felixonmars/apple.china")) o:value("https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/google.china.conf", translate("felixonmars/google.china")) @@ -69,6 +73,10 @@ if has_xray or has_singbox then o.rmempty = false if api.is_finded("geoview") then + o = s:option(Flag, "geo2rule", translate("Generate Rule List from Geo"), translate("Generate rule lists such as GFW, China domains, and China IP ranges based on Geo files.")) + o.default = 0 + o.rmempty = false + o = s:option(Flag, "enable_geoview", translate("Enable Geo Data Parsing")) o.default = 0 o.rmempty = false diff --git a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po index 0ed138017a..154b3e67c2 100644 --- a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po +++ b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po @@ -982,6 +982,12 @@ msgstr "Geo 规则文件目录" msgid "This variable specifies a directory where geoip.dat and geosite.dat files are." msgstr "此变量指定 geoip.dat 和 geosite.dat 文件所在的目录。" +msgid "Generate Rule List from Geo" +msgstr "从 Geo 文件生成规则" + +msgid "Generate rule lists such as GFW, China domains, and China IP ranges based on Geo files." +msgstr "根据 Geo 文件生成规则列表,包括 GFW、中国域名和中国 IP 段等。" + msgid "Enable Geo Data Parsing" msgstr "开启 Geo 数据解析" diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/rule_update.lua b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/rule_update.lua index b415bd2e98..8764fe21bb 100755 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/rule_update.lua +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/rule_update.lua @@ -37,6 +37,9 @@ local geoip_url = uci:get(name, "@global_rules[0]", "geoip_url") or "https://gi local geosite_url = uci:get(name, "@global_rules[0]", "geosite_url") or "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat" local asset_location = uci:get(name, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" local use_nft = uci:get(name, "@global_forwarding[0]", "use_nft") or "0" +local geo2rule = uci:get(name, "@global_rules[0]", "geo2rule") or "0" +local geoip_update_ok, geosite_update_ok = false, false +asset_location = asset_location:match("/$") and asset_location or (asset_location .. "/") --兼容旧版本geo下载方式的配置,择机删除。 if geoip_url:match(".*/([^/]+)$") == "latest" then @@ -141,6 +144,31 @@ local function non_file_check(file_path, vali_file) end end +local function GeoToRule(rule_name, rule_type, out_path) + if not api.is_finded("geoview") then + log(rule_name .. "生成失败,缺少 geoview 组件。") + return false; + end + local geosite_path = asset_location .. "geosite.dat" + local geoip_path = asset_location .. "geoip.dat" + local file_path = (rule_type == "domain") and geosite_path or geoip_path + local arg + if rule_type == "domain" then + if rule_name == "gfwlist" then + arg = "-type geosite -list gfw" + else + arg = "-type geosite -list cn" + end + elseif rule_type == "ip4" then + arg = "-type geoip -list cn -ipv6=false" + elseif rule_type == "ip6" then + arg = "-type geoip -list cn -ipv4=false" + end + cmd = string.format("geoview -input '%s' %s -lowmem=true -output '%s'", file_path, arg, out_path) + sys.exec(cmd) + return true; +end + --fetch rule local function fetch_rule(rule_name,rule_type,url,exclude_domain) local sret = 200 @@ -151,23 +179,33 @@ local function fetch_rule(rule_name,rule_type,url,exclude_domain) local download_file_tmp = "/tmp/" ..rule_name.. "_dl" local unsort_file_tmp = "/tmp/" ..rule_name.. "_unsort" - log(rule_name.. " 开始更新...") + if geo2rule == "1" then + url = {"geo2rule"} + log(rule_name.. " 开始生成...") + else + log(rule_name.. " 开始更新...") + end for k,v in ipairs(url) do - sret_tmp = curl(v, download_file_tmp..k, vali_file..k) - if sret_tmp == 200 and non_file_check(download_file_tmp..k, vali_file..k) then - log(rule_name.. " 第" ..k.. "条规则:" ..v.. "下载文件过程出错,尝试重新下载。") - os.remove(download_file_tmp..k) - os.remove(vali_file..k) + if v ~= "geo2rule" then sret_tmp = curl(v, download_file_tmp..k, vali_file..k) if sret_tmp == 200 and non_file_check(download_file_tmp..k, vali_file..k) then - sret = 0 - sret_tmp = 0 - log(rule_name.. " 第" ..k.. "条规则:" ..v.. "下载文件过程出错,请检查网络或下载链接后重试!") + log(rule_name.. " 第" ..k.. "条规则:" ..v.. "下载文件过程出错,尝试重新下载。") + os.remove(download_file_tmp..k) + os.remove(vali_file..k) + sret_tmp = curl(v, download_file_tmp..k, vali_file..k) + if sret_tmp == 200 and non_file_check(download_file_tmp..k, vali_file..k) then + sret = 0 + sret_tmp = 0 + log(rule_name.. " 第" ..k.. "条规则:" ..v.. "下载文件过程出错,请检查网络或下载链接后重试!") + end end + else + if not GeoToRule(rule_name, rule_type, download_file_tmp..k) then return 1 end + sret_tmp = 200 end if sret_tmp == 200 then - if rule_name == "gfwlist" then + if rule_name == "gfwlist" and geo2rule == "0" then local domains = {} local gfwlist = io.open(download_file_tmp..k, "r") local decode = api.base64Decode(gfwlist:read("*all")) @@ -314,6 +352,11 @@ local function fetch_geofile(geo_name, geo_type, url) sys.call(string.format("mkdir -p %s && cp -f %s %s", asset_location, tmp_path, asset_path)) reboot = 1 log(geo_type .. " 更新成功。") + if geo_type == "geoip" then + geoip_update_ok = true + else + geosite_update_ok = true + end else log(geo_type .. " 更新失败,请稍后重试或更换更新URL。") return 1 @@ -326,6 +369,11 @@ local function fetch_geofile(geo_name, geo_type, url) sys.call(string.format("mkdir -p %s && cp -f %s %s", asset_location, tmp_path, asset_path)) reboot = 1 log(geo_type .. " 更新成功。") + if geo_type == "geoip" then + geoip_update_ok = true + else + geosite_update_ok = true + end end else log(geo_type .. " 更新失败,请稍后重试或更换更新URL。") @@ -392,58 +440,69 @@ if gfwlist_update == "0" and chnroute_update == "0" and chnroute6_update == "0" end log("开始更新规则...") -if gfwlist_update == "1" then - xpcall(fetch_gfwlist,function(e) +local function safe_call(func, err_msg) + xpcall(func, function(e) log(e) log(debug.traceback()) - log('更新gfwlist发生错误...') + log(err_msg) end) end -if chnroute_update == "1" then - xpcall(fetch_chnroute,function(e) - log(e) - log(debug.traceback()) - log('更新chnroute发生错误...') - end) +local function remove_tmp_geofile(name) + os.remove("/tmp/" .. name .. ".dat") + os.remove("/tmp/" .. name .. ".dat.sha256sum") end -if chnroute6_update == "1" then - xpcall(fetch_chnroute6,function(e) - log(e) - log(debug.traceback()) - log('更新chnroute6发生错误...') - end) -end +if geo2rule == "1" then + if geoip_update == "1" then + log("geoip 开始更新...") + safe_call(fetch_geoip, "更新geoip发生错误...") + remove_tmp_geofile("geoip") + end -if chnlist_update == "1" then - xpcall(fetch_chnlist,function(e) - log(e) - log(debug.traceback()) - log('更新chnlist发生错误...') - end) -end + if geosite_update == "1" then + log("geosite 开始更新...") + safe_call(fetch_geosite, "更新geosite发生错误...") + remove_tmp_geofile("geosite") + end -if geoip_update == "1" then - log("geoip 开始更新...") - xpcall(fetch_geoip,function(e) - log(e) - log(debug.traceback()) - log('更新geoip发生错误...') - end) - os.remove("/tmp/geoip.dat") - os.remove("/tmp/geoip.dat.sha256sum") -end + if geoip_update_ok then + safe_call(fetch_chnroute, "生成chnroute发生错误...") + safe_call(fetch_chnroute6, "生成chnroute6发生错误...") + end -if geosite_update == "1" then - log("geosite 开始更新...") - xpcall(fetch_geosite,function(e) - log(e) - log(debug.traceback()) - log('更新geosite发生错误...') - end) - os.remove("/tmp/geosite.dat") - os.remove("/tmp/geosite.dat.sha256sum") + if geosite_update_ok then + safe_call(fetch_gfwlist, "生成gfwlist发生错误...") + safe_call(fetch_chnlist, "生成chnlist发生错误...") + end +else + if gfwlist_update == "1" then + safe_call(fetch_gfwlist, "更新gfwlist发生错误...") + end + + if chnroute_update == "1" then + safe_call(fetch_chnroute, "更新chnroute发生错误...") + end + + if chnroute6_update == "1" then + safe_call(fetch_chnroute6, "更新chnroute6发生错误...") + end + + if chnlist_update == "1" then + safe_call(fetch_chnlist, "更新chnlist发生错误...") + end + + if geoip_update == "1" then + log("geoip 开始更新...") + safe_call(fetch_geoip, "更新geoip发生错误...") + remove_tmp_geofile("geoip") + end + + if geosite_update == "1" then + log("geosite 开始更新...") + safe_call(fetch_geosite, "更新geosite发生错误...") + remove_tmp_geofile("geosite") + end end uci:set(name, "@global_rules[0]", "gfwlist_update", gfwlist_update) diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/iptables.sh b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/iptables.sh index c102e79846..c1e0759684 100755 --- a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/iptables.sh +++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/iptables.sh @@ -365,7 +365,7 @@ load_acl() { _acl_list=${TMP_ACL_PATH}/${sid}/source_list for i in $(cat $_acl_list); do - local _ipt_source + local _ipt_source _ipv4 local msg if [ -n "${interface}" ]; then . /lib/functions/network.sh @@ -382,6 +382,7 @@ load_acl() { _iprange=$(echo ${i} | sed 's#iprange:##g') _ipt_source=$(factor ${_iprange} "${_ipt_source}-m iprange --src-range") msg="${msg}IP range【${_iprange}】," + _ipv4="1" unset _iprange elif [ -n "$(echo ${i} | grep '^ipset:')" ]; then _ipset=$(echo ${i} | sed 's#ipset:##g') @@ -399,6 +400,7 @@ load_acl() { _ip=$(echo ${i} | sed 's#ip:##g') _ipt_source=$(factor ${_ip} "${_ipt_source}-s") msg="${msg}IP【${_ip}】," + _ipv4="1" unset _ip elif [ -n "$(echo ${i} | grep '^mac:')" ]; then _mac=$(echo ${i} | sed 's#mac:##g') @@ -417,7 +419,7 @@ load_acl() { [ "$tcp_no_redir_ports" != "disable" ] && { if [ "$tcp_no_redir_ports" != "1:65535" ]; then - add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp" $tcp_no_redir_ports "-j RETURN" 2>/dev/null + [ "$_ipv4" != "1" ] && add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp" $tcp_no_redir_ports "-j RETURN" 2>/dev/null add_port_rules "$ipt_tmp -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp" $tcp_no_redir_ports "-j RETURN" echolog " - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]" else @@ -429,7 +431,7 @@ load_acl() { [ "$udp_no_redir_ports" != "disable" ] && { if [ "$udp_no_redir_ports" != "1:65535" ]; then - add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp" $udp_no_redir_ports "-j RETURN" 2>/dev/null + [ "$_ipv4" != "1" ] && add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp" $udp_no_redir_ports "-j RETURN" 2>/dev/null add_port_rules "$ipt_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp" $udp_no_redir_ports "-j RETURN" echolog " - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]" else @@ -479,7 +481,7 @@ load_acl() { add_port_rules "$ipt_tmp -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source}" $tcp_redir_ports "${ipt_j}" [ -n "${is_tproxy}" ] && $ipt_m -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source} $(REDIRECT $redir_port TPROXY) - [ "$PROXY_IPV6" == "1" ] && { + [ "$PROXY_IPV6" == "1" ] && [ "$_ipv4" != "1" ] && { $ip6t_m -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source} -d $FAKE_IP_6 -j PSW2_RULE 2>/dev/null add_shunt_t_rule "${shunt_list6}" "$ip6t_m -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source}" "${ipt_j}" $tcp_redir_ports 2>/dev/null add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source}" $tcp_redir_ports "-j PSW2_RULE" 2>/dev/null @@ -488,7 +490,7 @@ load_acl() { echolog " - ${msg2}" } $ipt_tmp -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp -j RETURN - $ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp -j RETURN 2>/dev/null + [ "$_ipv4" != "1" ] && $ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp -j RETURN 2>/dev/null [ "$udp_proxy_mode" != "disable" ] && [ -n "$redir_port" ] && { msg2="${msg}使用 UDP 节点[$node_remark](TPROXY:${redir_port})" @@ -498,7 +500,7 @@ load_acl() { add_port_rules "$ipt_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source}" $udp_redir_ports "-j PSW2_RULE" $ipt_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source} $(REDIRECT $redir_port TPROXY) - [ "$PROXY_IPV6" == "1" ] && { + [ "$PROXY_IPV6" == "1" ] && [ "$_ipv4" != "1" ] && { $ip6t_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source} -d $FAKE_IP_6 -j PSW2_RULE 2>/dev/null add_shunt_t_rule "${shunt_list6}" "$ip6t_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source}" "-j PSW2_RULE" $udp_redir_ports 2>/dev/null add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source}" $udp_redir_ports "-j PSW2_RULE" 2>/dev/null @@ -507,8 +509,8 @@ load_acl() { echolog " - ${msg2}" } $ipt_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp -j RETURN - $ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp -j RETURN 2>/dev/null - unset ipt_tmp ipt_j _ipt_source msg msg2 + [ "$_ipv4" != "1" ] && $ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp -j RETURN 2>/dev/null + unset ipt_tmp ipt_j _ipt_source msg msg2 _ipv4 done unset enabled sid remarks sources tcp_no_redir_ports udp_no_redir_ports tcp_redir_ports udp_redir_ports node interface write_ipset_direct unset node_remark _acl_list diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/nftables.sh b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/nftables.sh index e1b917f45e..0ae46b3993 100755 --- a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/nftables.sh +++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/nftables.sh @@ -389,7 +389,7 @@ load_acl() { _acl_list=${TMP_ACL_PATH}/${sid}/source_list for i in $(cat $_acl_list); do - local _ipt_source + local _ipt_source _ipv4 local msg if [ -n "${interface}" ]; then . /lib/functions/network.sh @@ -406,6 +406,7 @@ load_acl() { _iprange=$(echo ${i} | sed 's#iprange:##g') _ipt_source=$(factor ${_iprange} "${_ipt_source}ip saddr") msg="${msg}IP range【${_iprange}】," + _ipv4="1" unset _iprange elif [ -n "$(echo ${i} | grep '^ipset:')" ]; then _ipset=$(echo ${i} | sed 's#ipset:##g') @@ -416,6 +417,7 @@ load_acl() { _ip=$(echo ${i} | sed 's#ip:##g') _ipt_source=$(factor ${_ip} "${_ipt_source}ip saddr") msg="${msg}IP【${_ip}】," + _ipv4="1" unset _ip elif [ -n "$(echo ${i} | grep '^mac:')" ]; then _mac=$(echo ${i} | sed 's#mac:##g') @@ -432,7 +434,7 @@ load_acl() { [ "$tcp_no_redir_ports" != "disable" ] && { if [ "$tcp_no_redir_ports" != "1:65535" ]; then nft "add rule $NFTABLE_NAME $nft_prerouting_chain ${_ipt_source} ip protocol tcp $(factor $tcp_no_redir_ports "tcp dport") counter return comment \"$remarks\"" - nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 ${_ipt_source} meta l4proto tcp $(factor $tcp_no_redir_ports "tcp dport") counter return comment \"$remarks\"" + [ "$_ipv4" != "1" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 ${_ipt_source} meta l4proto tcp $(factor $tcp_no_redir_ports "tcp dport") counter return comment \"$remarks\"" echolog " - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]" else #结束时会return,无需加多余的规则。 @@ -444,7 +446,7 @@ load_acl() { [ "$udp_no_redir_ports" != "disable" ] && { if [ "$udp_no_redir_ports" != "1:65535" ]; then nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_no_redir_ports "udp dport") counter return comment \"$remarks\"" - nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_no_redir_ports "udp dport") counter return comment \"$remarks\"" 2>/dev/null + [ "$_ipv4" != "1" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_no_redir_ports "udp dport") counter return comment \"$remarks\"" 2>/dev/null echolog " - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]" else #结束时会return,无需加多余的规则。 @@ -499,7 +501,7 @@ load_acl() { nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ${nft_j} comment \"$remarks\"" [ -n "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol tcp ${_ipt_source} $(REDIRECT $redir_port TPROXY4) comment \"$remarks\"" - [ "$PROXY_IPV6" == "1" ] && { + [ "$PROXY_IPV6" == "1" ] && [ "$_ipv4" != "1" ] && { nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW2_RULE comment \"$remarks\"" add_shunt_t_rule "${shunt_list6}" "nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr" "counter jump PSW2_RULE" "$remarks" 2>/dev/null nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") counter jump PSW2_RULE comment \"$remarks\"" 2>/dev/null @@ -508,7 +510,7 @@ load_acl() { echolog " - ${msg2}" } nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} counter return comment \"$remarks\"" - nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null + [ "$_ipv4" != "1" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null [ "$udp_proxy_mode" != "disable" ] && [ -n "$redir_port" ] && { msg2="${msg}使用 UDP 节点[$node_remark](TPROXY:${redir_port})" @@ -518,17 +520,17 @@ load_acl() { nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") counter jump PSW2_RULE comment \"$remarks\"" nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(REDIRECT $redir_port TPROXY4) comment \"$remarks\"" - [ "$PROXY_IPV6" == "1" ] && { + [ "$PROXY_IPV6" == "1" ] && [ "$_ipv4" != "1" ] && { nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW2_RULE comment \"$remarks\"" - add_shunt_t_rule "${shunt_list6}" "nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr" "counter jump PSW2_RULE" "$remarks" + add_shunt_t_rule "${shunt_list6}" "nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr" "counter jump PSW2_RULE" "$remarks" 2>/dev/null nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") counter jump PSW2_RULE comment \"$remarks\"" 2>/dev/null nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(REDIRECT $redir_port TPROXY) comment \"$remarks\"" 2>/dev/null } echolog " - ${msg2}" } nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} counter return comment \"$remarks\"" - nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null - unset nft_chain nft_j _ipt_source msg msg2 + [ "$_ipv4" != "1" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null + unset nft_chain nft_j _ipt_source msg msg2 _ipv4 done unset enabled sid remarks sources tcp_proxy_mode udp_proxy_mode tcp_no_redir_ports udp_no_redir_ports tcp_redir_ports udp_redir_ports node interface write_ipset_direct unset redir_port node_remark _acl_list diff --git a/sing-box/cmd/internal/tun_bench/main.go b/sing-box/cmd/internal/tun_bench/main.go index c1227a6b99..abad8c34f1 100644 --- a/sing-box/cmd/internal/tun_bench/main.go +++ b/sing-box/cmd/internal/tun_bench/main.go @@ -46,7 +46,7 @@ func main0() error { func runTests() ([]TestResult, error) { boxPaths := []string{ - //"/Users/sekai/Downloads/sing-box-1.11.15-darwin-arm64/sing-box", + os.ExpandEnv("$HOME/Downloads/sing-box-1.11.15-darwin-arm64/sing-box"), //"/Users/sekai/Downloads/sing-box-1.11.15-linux-arm64/sing-box", "./sing-box", } @@ -55,11 +55,11 @@ func runTests() ([]TestResult, error) { "system", } mtus := []int{ - // 1500, - // 4064, + 1500, + 4064, // 16384, - 32768, - 49152, + // 32768, + // 49152, 65535, } flagList := [][]string{ @@ -182,7 +182,7 @@ func testOnce(boxPath string, stackName string, mtu int, multiThread bool, flags time.Sleep(time.Second) - args := []string{"-c", testAddress.String(), "-t", "5"} + args := []string{"-c", testAddress.String()} if multiThread { args = append(args, "-P", "10") } diff --git a/sing-box/docs/changelog.md b/sing-box/docs/changelog.md index 3f554617f4..db9f76aaeb 100644 --- a/sing-box/docs/changelog.md +++ b/sing-box/docs/changelog.md @@ -2,9 +2,149 @@ icon: material/alert-decagram --- -#### 1.12.0-rc.4 +#### 1.12.0 -* Fixes and improvements +* Refactor DNS servers **1** +* Add domain resolver options**2** +* Add TLS fragment/record fragment support to route options and outbound TLS options **3** +* Add certificate options **4** +* Add Tailscale endpoint and DNS server **5** +* Drop support for go1.22 **6** +* Add AnyTLS protocol **7** +* Migrate to stdlib ECH implementation **8** +* Add NTP sniffer **9** +* Add wildcard SNI support for ShadowTLS inbound **10** +* Improve `auto_redirect` **11** +* Add control options for listeners **12** +* Add DERP service **13** +* Add Resolved service and DNS server **14** +* Add SSM API service **15** +* Add loopback address support for tun **16** +* Improve tun performance on Apple platforms **17** +* Update quic-go to v0.52.0 +* Update gVisor to 20250319.0 + +**1**: + +DNS servers are refactored for better performance and scalability. + +See [DNS server](/configuration/dns/server/). + +For migration, see [Migrate to new DNS server formats](/migration/#migrate-to-new-dns-servers). + +Compatibility for old formats will be removed in sing-box 1.14.0. + +**2**: + +Legacy `outbound` DNS rules are deprecated +and can be replaced by the new `domain_resolver` option. + +See [Dial Fields](/configuration/shared/dial/#domain_resolver) and +[Route](/configuration/route/#default_domain_resolver). + +For migration, +see [Migrate outbound DNS rule items to domain resolver](/migration/#migrate-outbound-dns-rule-items-to-domain-resolver). + +**3**: + +See [Route Action](/configuration/route/rule_action/#tls_fragment) and [TLS](/configuration/shared/tls/). + +**4**: + +New certificate options allow you to manage the default list of trusted X509 CA certificates. + +For the system certificate list, fixed Go not reading Android trusted certificates correctly. + +You can also use the Mozilla Included List instead, or add trusted certificates yourself. + +See [Certificate](/configuration/certificate/). + +**5**: + +See [Tailscale](/configuration/endpoint/tailscale/). + +**6**: + +Due to maintenance difficulties, sing-box 1.12.0 requires at least Go 1.23 to compile. + +For Windows 7 users, legacy binaries now continue to compile with Go 1.23 and patches from [MetaCubeX/go](https://github.com/MetaCubeX/go). + +**7**: + +The new AnyTLS protocol claims to mitigate TLS proxy traffic characteristics and comes with a new multiplexing scheme. + +See [AnyTLS Inbound](/configuration/inbound/anytls/) and [AnyTLS Outbound](/configuration/outbound/anytls/). + +**8**: + +See [TLS](/configuration/shared/tls). + +The build tag `with_ech` is no longer needed and has been removed. + +**9**: + +See [Protocol Sniff](/configuration/route/sniff/). + +**10**: + +See [ShadowTLS](/configuration/inbound/shadowtls/#wildcard_sni). + +**11**: + +Now `auto_redirect` fixes compatibility issues between tun and Docker bridge networks, +see [Tun](/configuration/inbound/tun/#auto_redirect). + +**12**: + +You can now set `bind_interface`, `routing_mark` and `reuse_addr` in Listen Fields. + +See [Listen Fields](/configuration/shared/listen/). + +**13**: + +DERP service is a Tailscale DERP server, similar to [derper](https://pkg.go.dev/tailscale.com/cmd/derper). + +See [DERP Service](/configuration/service/derp/). + +**14**: + +Resolved service is a fake systemd-resolved DBUS service to receive DNS settings from other programs +(e.g. NetworkManager) and provide DNS resolution. + +See [Resolved Service](/configuration/service/resolved/) and [Resolved DNS Server](/configuration/dns/server/resolved/). + +**15**: + +SSM API service is a RESTful API server for managing Shadowsocks servers. + +See [SSM API Service](/configuration/service/ssm-api/). + +**16**: + +TUN now implements SideStore's StosVPN. + +See [Tun](/configuration/inbound/tun/#loopback_address). + +**17**: + +We have significantly improved the performance of tun inbound on Apple platforms, especially in the gVisor stack. + +The following data was tested using [tun_bench](https://github.com/SagerNet/sing-box/blob/dev-next/cmd/internal/tun_bench/main.go) on M4 MacBook pro. + +| Version | Stack | MTU | Upload | Download | +|-------------|--------|-------|--------|----------| +| 1.11.15 | gvisor | 1500 | 852M | 2.57G | +| 1.12.0-rc.4 | gvisor | 1500 | 2.90G | 4.68G | +| 1.11.15 | gvisor | 4064 | 2.31G | 6.34G | +| 1.12.0-rc.4 | gvisor | 4064 | 7.54G | 12.2G | +| 1.11.15 | gvisor | 65535 | 27.6G | 18.1G | +| 1.12.0-rc.4 | gvisor | 65535 | 39.8G | 34.7G | +| 1.11.15 | system | 1500 | 664M | 706M | +| 1.12.0-rc.4 | system | 1500 | 2.44G | 2.51G | +| 1.11.15 | system | 4064 | 1.88G | 1.94G | +| 1.12.0-rc.4 | system | 4064 | 6.45G | 6.27G | +| 1.11.15 | system | 65535 | 26.2G | 17.4G | +| 1.12.0-rc.4 | system | 65535 | 17.6G | 21.0G | ### 1.11.15 diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua index 696eae14f1..2f30dffc7d 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua @@ -17,6 +17,7 @@ o.rmempty = false ---- gfwlist URL o = s:option(DynamicList, "gfwlist_url", translate("GFW domains(gfwlist) Update URL")) +o:depends("geo2rule", false) o:value("https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt", translate("v2fly/domain-list-community")) o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt", translate("Loyalsoldier/v2ray-rules-dat")) o:value("https://fastly.jsdelivr.net/gh/Loukky/gfwlist-by-loukky/gfwlist.txt", translate("Loukky/gfwlist-by-loukky")) @@ -25,6 +26,7 @@ o.default = "https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release ----chnroute URL o = s:option(DynamicList, "chnroute_url", translate("China IPs(chnroute) Update URL")) +o:depends("geo2rule", false) o:value("https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt", translate("gaoyifan/china-operator-ip/china")) o:value("https://ispip.clang.cn/all_cn.txt", translate("Clang.CN")) o:value("https://ispip.clang.cn/all_cn_cidr.txt", translate("Clang.CN.CIDR")) @@ -34,12 +36,14 @@ o:value("https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule ----chnroute6 URL o = s:option(DynamicList, "chnroute6_url", translate("China IPv6s(chnroute6) Update URL")) +o:depends("geo2rule", false) o:value("https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china6.txt", translate("gaoyifan/china-operator-ip/china6")) o:value("https://ispip.clang.cn/all_cn_ipv6.txt", translate("Clang.CN.IPv6")) o:value("https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/ChinaMax/ChinaMax_IP.txt", translate("ios_rule_script/ChinaMax_IP")) ----chnlist URL o = s:option(DynamicList, "chnlist_url", translate("China List(Chnlist) Update URL")) +o:depends("geo2rule", false) o:value("https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf", translate("felixonmars/domains.china")) o:value("https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf", translate("felixonmars/apple.china")) o:value("https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/google.china.conf", translate("felixonmars/google.china")) @@ -69,6 +73,10 @@ if has_xray or has_singbox then o.rmempty = false if api.is_finded("geoview") then + o = s:option(Flag, "geo2rule", translate("Generate Rule List from Geo"), translate("Generate rule lists such as GFW, China domains, and China IP ranges based on Geo files.")) + o.default = 0 + o.rmempty = false + o = s:option(Flag, "enable_geoview", translate("Enable Geo Data Parsing")) o.default = 0 o.rmempty = false diff --git a/small/luci-app-passwall/po/zh-cn/passwall.po b/small/luci-app-passwall/po/zh-cn/passwall.po index 0ed138017a..154b3e67c2 100644 --- a/small/luci-app-passwall/po/zh-cn/passwall.po +++ b/small/luci-app-passwall/po/zh-cn/passwall.po @@ -982,6 +982,12 @@ msgstr "Geo 规则文件目录" msgid "This variable specifies a directory where geoip.dat and geosite.dat files are." msgstr "此变量指定 geoip.dat 和 geosite.dat 文件所在的目录。" +msgid "Generate Rule List from Geo" +msgstr "从 Geo 文件生成规则" + +msgid "Generate rule lists such as GFW, China domains, and China IP ranges based on Geo files." +msgstr "根据 Geo 文件生成规则列表,包括 GFW、中国域名和中国 IP 段等。" + msgid "Enable Geo Data Parsing" msgstr "开启 Geo 数据解析" diff --git a/small/luci-app-passwall/root/usr/share/passwall/rule_update.lua b/small/luci-app-passwall/root/usr/share/passwall/rule_update.lua index b415bd2e98..8764fe21bb 100755 --- a/small/luci-app-passwall/root/usr/share/passwall/rule_update.lua +++ b/small/luci-app-passwall/root/usr/share/passwall/rule_update.lua @@ -37,6 +37,9 @@ local geoip_url = uci:get(name, "@global_rules[0]", "geoip_url") or "https://gi local geosite_url = uci:get(name, "@global_rules[0]", "geosite_url") or "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat" local asset_location = uci:get(name, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" local use_nft = uci:get(name, "@global_forwarding[0]", "use_nft") or "0" +local geo2rule = uci:get(name, "@global_rules[0]", "geo2rule") or "0" +local geoip_update_ok, geosite_update_ok = false, false +asset_location = asset_location:match("/$") and asset_location or (asset_location .. "/") --兼容旧版本geo下载方式的配置,择机删除。 if geoip_url:match(".*/([^/]+)$") == "latest" then @@ -141,6 +144,31 @@ local function non_file_check(file_path, vali_file) end end +local function GeoToRule(rule_name, rule_type, out_path) + if not api.is_finded("geoview") then + log(rule_name .. "生成失败,缺少 geoview 组件。") + return false; + end + local geosite_path = asset_location .. "geosite.dat" + local geoip_path = asset_location .. "geoip.dat" + local file_path = (rule_type == "domain") and geosite_path or geoip_path + local arg + if rule_type == "domain" then + if rule_name == "gfwlist" then + arg = "-type geosite -list gfw" + else + arg = "-type geosite -list cn" + end + elseif rule_type == "ip4" then + arg = "-type geoip -list cn -ipv6=false" + elseif rule_type == "ip6" then + arg = "-type geoip -list cn -ipv4=false" + end + cmd = string.format("geoview -input '%s' %s -lowmem=true -output '%s'", file_path, arg, out_path) + sys.exec(cmd) + return true; +end + --fetch rule local function fetch_rule(rule_name,rule_type,url,exclude_domain) local sret = 200 @@ -151,23 +179,33 @@ local function fetch_rule(rule_name,rule_type,url,exclude_domain) local download_file_tmp = "/tmp/" ..rule_name.. "_dl" local unsort_file_tmp = "/tmp/" ..rule_name.. "_unsort" - log(rule_name.. " 开始更新...") + if geo2rule == "1" then + url = {"geo2rule"} + log(rule_name.. " 开始生成...") + else + log(rule_name.. " 开始更新...") + end for k,v in ipairs(url) do - sret_tmp = curl(v, download_file_tmp..k, vali_file..k) - if sret_tmp == 200 and non_file_check(download_file_tmp..k, vali_file..k) then - log(rule_name.. " 第" ..k.. "条规则:" ..v.. "下载文件过程出错,尝试重新下载。") - os.remove(download_file_tmp..k) - os.remove(vali_file..k) + if v ~= "geo2rule" then sret_tmp = curl(v, download_file_tmp..k, vali_file..k) if sret_tmp == 200 and non_file_check(download_file_tmp..k, vali_file..k) then - sret = 0 - sret_tmp = 0 - log(rule_name.. " 第" ..k.. "条规则:" ..v.. "下载文件过程出错,请检查网络或下载链接后重试!") + log(rule_name.. " 第" ..k.. "条规则:" ..v.. "下载文件过程出错,尝试重新下载。") + os.remove(download_file_tmp..k) + os.remove(vali_file..k) + sret_tmp = curl(v, download_file_tmp..k, vali_file..k) + if sret_tmp == 200 and non_file_check(download_file_tmp..k, vali_file..k) then + sret = 0 + sret_tmp = 0 + log(rule_name.. " 第" ..k.. "条规则:" ..v.. "下载文件过程出错,请检查网络或下载链接后重试!") + end end + else + if not GeoToRule(rule_name, rule_type, download_file_tmp..k) then return 1 end + sret_tmp = 200 end if sret_tmp == 200 then - if rule_name == "gfwlist" then + if rule_name == "gfwlist" and geo2rule == "0" then local domains = {} local gfwlist = io.open(download_file_tmp..k, "r") local decode = api.base64Decode(gfwlist:read("*all")) @@ -314,6 +352,11 @@ local function fetch_geofile(geo_name, geo_type, url) sys.call(string.format("mkdir -p %s && cp -f %s %s", asset_location, tmp_path, asset_path)) reboot = 1 log(geo_type .. " 更新成功。") + if geo_type == "geoip" then + geoip_update_ok = true + else + geosite_update_ok = true + end else log(geo_type .. " 更新失败,请稍后重试或更换更新URL。") return 1 @@ -326,6 +369,11 @@ local function fetch_geofile(geo_name, geo_type, url) sys.call(string.format("mkdir -p %s && cp -f %s %s", asset_location, tmp_path, asset_path)) reboot = 1 log(geo_type .. " 更新成功。") + if geo_type == "geoip" then + geoip_update_ok = true + else + geosite_update_ok = true + end end else log(geo_type .. " 更新失败,请稍后重试或更换更新URL。") @@ -392,58 +440,69 @@ if gfwlist_update == "0" and chnroute_update == "0" and chnroute6_update == "0" end log("开始更新规则...") -if gfwlist_update == "1" then - xpcall(fetch_gfwlist,function(e) +local function safe_call(func, err_msg) + xpcall(func, function(e) log(e) log(debug.traceback()) - log('更新gfwlist发生错误...') + log(err_msg) end) end -if chnroute_update == "1" then - xpcall(fetch_chnroute,function(e) - log(e) - log(debug.traceback()) - log('更新chnroute发生错误...') - end) +local function remove_tmp_geofile(name) + os.remove("/tmp/" .. name .. ".dat") + os.remove("/tmp/" .. name .. ".dat.sha256sum") end -if chnroute6_update == "1" then - xpcall(fetch_chnroute6,function(e) - log(e) - log(debug.traceback()) - log('更新chnroute6发生错误...') - end) -end +if geo2rule == "1" then + if geoip_update == "1" then + log("geoip 开始更新...") + safe_call(fetch_geoip, "更新geoip发生错误...") + remove_tmp_geofile("geoip") + end -if chnlist_update == "1" then - xpcall(fetch_chnlist,function(e) - log(e) - log(debug.traceback()) - log('更新chnlist发生错误...') - end) -end + if geosite_update == "1" then + log("geosite 开始更新...") + safe_call(fetch_geosite, "更新geosite发生错误...") + remove_tmp_geofile("geosite") + end -if geoip_update == "1" then - log("geoip 开始更新...") - xpcall(fetch_geoip,function(e) - log(e) - log(debug.traceback()) - log('更新geoip发生错误...') - end) - os.remove("/tmp/geoip.dat") - os.remove("/tmp/geoip.dat.sha256sum") -end + if geoip_update_ok then + safe_call(fetch_chnroute, "生成chnroute发生错误...") + safe_call(fetch_chnroute6, "生成chnroute6发生错误...") + end -if geosite_update == "1" then - log("geosite 开始更新...") - xpcall(fetch_geosite,function(e) - log(e) - log(debug.traceback()) - log('更新geosite发生错误...') - end) - os.remove("/tmp/geosite.dat") - os.remove("/tmp/geosite.dat.sha256sum") + if geosite_update_ok then + safe_call(fetch_gfwlist, "生成gfwlist发生错误...") + safe_call(fetch_chnlist, "生成chnlist发生错误...") + end +else + if gfwlist_update == "1" then + safe_call(fetch_gfwlist, "更新gfwlist发生错误...") + end + + if chnroute_update == "1" then + safe_call(fetch_chnroute, "更新chnroute发生错误...") + end + + if chnroute6_update == "1" then + safe_call(fetch_chnroute6, "更新chnroute6发生错误...") + end + + if chnlist_update == "1" then + safe_call(fetch_chnlist, "更新chnlist发生错误...") + end + + if geoip_update == "1" then + log("geoip 开始更新...") + safe_call(fetch_geoip, "更新geoip发生错误...") + remove_tmp_geofile("geoip") + end + + if geosite_update == "1" then + log("geosite 开始更新...") + safe_call(fetch_geosite, "更新geosite发生错误...") + remove_tmp_geofile("geosite") + end end uci:set(name, "@global_rules[0]", "gfwlist_update", gfwlist_update) diff --git a/small/luci-app-passwall2/root/usr/share/passwall2/iptables.sh b/small/luci-app-passwall2/root/usr/share/passwall2/iptables.sh index c102e79846..c1e0759684 100755 --- a/small/luci-app-passwall2/root/usr/share/passwall2/iptables.sh +++ b/small/luci-app-passwall2/root/usr/share/passwall2/iptables.sh @@ -365,7 +365,7 @@ load_acl() { _acl_list=${TMP_ACL_PATH}/${sid}/source_list for i in $(cat $_acl_list); do - local _ipt_source + local _ipt_source _ipv4 local msg if [ -n "${interface}" ]; then . /lib/functions/network.sh @@ -382,6 +382,7 @@ load_acl() { _iprange=$(echo ${i} | sed 's#iprange:##g') _ipt_source=$(factor ${_iprange} "${_ipt_source}-m iprange --src-range") msg="${msg}IP range【${_iprange}】," + _ipv4="1" unset _iprange elif [ -n "$(echo ${i} | grep '^ipset:')" ]; then _ipset=$(echo ${i} | sed 's#ipset:##g') @@ -399,6 +400,7 @@ load_acl() { _ip=$(echo ${i} | sed 's#ip:##g') _ipt_source=$(factor ${_ip} "${_ipt_source}-s") msg="${msg}IP【${_ip}】," + _ipv4="1" unset _ip elif [ -n "$(echo ${i} | grep '^mac:')" ]; then _mac=$(echo ${i} | sed 's#mac:##g') @@ -417,7 +419,7 @@ load_acl() { [ "$tcp_no_redir_ports" != "disable" ] && { if [ "$tcp_no_redir_ports" != "1:65535" ]; then - add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp" $tcp_no_redir_ports "-j RETURN" 2>/dev/null + [ "$_ipv4" != "1" ] && add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp" $tcp_no_redir_ports "-j RETURN" 2>/dev/null add_port_rules "$ipt_tmp -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp" $tcp_no_redir_ports "-j RETURN" echolog " - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]" else @@ -429,7 +431,7 @@ load_acl() { [ "$udp_no_redir_ports" != "disable" ] && { if [ "$udp_no_redir_ports" != "1:65535" ]; then - add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp" $udp_no_redir_ports "-j RETURN" 2>/dev/null + [ "$_ipv4" != "1" ] && add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp" $udp_no_redir_ports "-j RETURN" 2>/dev/null add_port_rules "$ipt_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp" $udp_no_redir_ports "-j RETURN" echolog " - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]" else @@ -479,7 +481,7 @@ load_acl() { add_port_rules "$ipt_tmp -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source}" $tcp_redir_ports "${ipt_j}" [ -n "${is_tproxy}" ] && $ipt_m -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source} $(REDIRECT $redir_port TPROXY) - [ "$PROXY_IPV6" == "1" ] && { + [ "$PROXY_IPV6" == "1" ] && [ "$_ipv4" != "1" ] && { $ip6t_m -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source} -d $FAKE_IP_6 -j PSW2_RULE 2>/dev/null add_shunt_t_rule "${shunt_list6}" "$ip6t_m -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source}" "${ipt_j}" $tcp_redir_ports 2>/dev/null add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") -p tcp ${_ipt_source}" $tcp_redir_ports "-j PSW2_RULE" 2>/dev/null @@ -488,7 +490,7 @@ load_acl() { echolog " - ${msg2}" } $ipt_tmp -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp -j RETURN - $ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp -j RETURN 2>/dev/null + [ "$_ipv4" != "1" ] && $ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p tcp -j RETURN 2>/dev/null [ "$udp_proxy_mode" != "disable" ] && [ -n "$redir_port" ] && { msg2="${msg}使用 UDP 节点[$node_remark](TPROXY:${redir_port})" @@ -498,7 +500,7 @@ load_acl() { add_port_rules "$ipt_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source}" $udp_redir_ports "-j PSW2_RULE" $ipt_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source} $(REDIRECT $redir_port TPROXY) - [ "$PROXY_IPV6" == "1" ] && { + [ "$PROXY_IPV6" == "1" ] && [ "$_ipv4" != "1" ] && { $ip6t_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source} -d $FAKE_IP_6 -j PSW2_RULE 2>/dev/null add_shunt_t_rule "${shunt_list6}" "$ip6t_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source}" "-j PSW2_RULE" $udp_redir_ports 2>/dev/null add_port_rules "$ip6t_m -A PSW2 $(comment "$remarks") -p udp ${_ipt_source}" $udp_redir_ports "-j PSW2_RULE" 2>/dev/null @@ -507,8 +509,8 @@ load_acl() { echolog " - ${msg2}" } $ipt_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp -j RETURN - $ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp -j RETURN 2>/dev/null - unset ipt_tmp ipt_j _ipt_source msg msg2 + [ "$_ipv4" != "1" ] && $ip6t_m -A PSW2 $(comment "$remarks") ${_ipt_source} -p udp -j RETURN 2>/dev/null + unset ipt_tmp ipt_j _ipt_source msg msg2 _ipv4 done unset enabled sid remarks sources tcp_no_redir_ports udp_no_redir_ports tcp_redir_ports udp_redir_ports node interface write_ipset_direct unset node_remark _acl_list diff --git a/small/luci-app-passwall2/root/usr/share/passwall2/nftables.sh b/small/luci-app-passwall2/root/usr/share/passwall2/nftables.sh index e1b917f45e..0ae46b3993 100755 --- a/small/luci-app-passwall2/root/usr/share/passwall2/nftables.sh +++ b/small/luci-app-passwall2/root/usr/share/passwall2/nftables.sh @@ -389,7 +389,7 @@ load_acl() { _acl_list=${TMP_ACL_PATH}/${sid}/source_list for i in $(cat $_acl_list); do - local _ipt_source + local _ipt_source _ipv4 local msg if [ -n "${interface}" ]; then . /lib/functions/network.sh @@ -406,6 +406,7 @@ load_acl() { _iprange=$(echo ${i} | sed 's#iprange:##g') _ipt_source=$(factor ${_iprange} "${_ipt_source}ip saddr") msg="${msg}IP range【${_iprange}】," + _ipv4="1" unset _iprange elif [ -n "$(echo ${i} | grep '^ipset:')" ]; then _ipset=$(echo ${i} | sed 's#ipset:##g') @@ -416,6 +417,7 @@ load_acl() { _ip=$(echo ${i} | sed 's#ip:##g') _ipt_source=$(factor ${_ip} "${_ipt_source}ip saddr") msg="${msg}IP【${_ip}】," + _ipv4="1" unset _ip elif [ -n "$(echo ${i} | grep '^mac:')" ]; then _mac=$(echo ${i} | sed 's#mac:##g') @@ -432,7 +434,7 @@ load_acl() { [ "$tcp_no_redir_ports" != "disable" ] && { if [ "$tcp_no_redir_ports" != "1:65535" ]; then nft "add rule $NFTABLE_NAME $nft_prerouting_chain ${_ipt_source} ip protocol tcp $(factor $tcp_no_redir_ports "tcp dport") counter return comment \"$remarks\"" - nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 ${_ipt_source} meta l4proto tcp $(factor $tcp_no_redir_ports "tcp dport") counter return comment \"$remarks\"" + [ "$_ipv4" != "1" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 ${_ipt_source} meta l4proto tcp $(factor $tcp_no_redir_ports "tcp dport") counter return comment \"$remarks\"" echolog " - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]" else #结束时会return,无需加多余的规则。 @@ -444,7 +446,7 @@ load_acl() { [ "$udp_no_redir_ports" != "disable" ] && { if [ "$udp_no_redir_ports" != "1:65535" ]; then nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_no_redir_ports "udp dport") counter return comment \"$remarks\"" - nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_no_redir_ports "udp dport") counter return comment \"$remarks\"" 2>/dev/null + [ "$_ipv4" != "1" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_no_redir_ports "udp dport") counter return comment \"$remarks\"" 2>/dev/null echolog " - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]" else #结束时会return,无需加多余的规则。 @@ -499,7 +501,7 @@ load_acl() { nft "add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ${nft_j} comment \"$remarks\"" [ -n "${is_tproxy}" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol tcp ${_ipt_source} $(REDIRECT $redir_port TPROXY4) comment \"$remarks\"" - [ "$PROXY_IPV6" == "1" ] && { + [ "$PROXY_IPV6" == "1" ] && [ "$_ipv4" != "1" ] && { nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW2_RULE comment \"$remarks\"" add_shunt_t_rule "${shunt_list6}" "nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") ip6 daddr" "counter jump PSW2_RULE" "$remarks" 2>/dev/null nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports "tcp dport") counter jump PSW2_RULE comment \"$remarks\"" 2>/dev/null @@ -508,7 +510,7 @@ load_acl() { echolog " - ${msg2}" } nft "add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} counter return comment \"$remarks\"" - nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null + [ "$_ipv4" != "1" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null [ "$udp_proxy_mode" != "disable" ] && [ -n "$redir_port" ] && { msg2="${msg}使用 UDP 节点[$node_remark](TPROXY:${redir_port})" @@ -518,17 +520,17 @@ load_acl() { nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") counter jump PSW2_RULE comment \"$remarks\"" nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(REDIRECT $redir_port TPROXY4) comment \"$remarks\"" - [ "$PROXY_IPV6" == "1" ] && { + [ "$PROXY_IPV6" == "1" ] && [ "$_ipv4" != "1" ] && { nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW2_RULE comment \"$remarks\"" - add_shunt_t_rule "${shunt_list6}" "nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr" "counter jump PSW2_RULE" "$remarks" + add_shunt_t_rule "${shunt_list6}" "nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") ip6 daddr" "counter jump PSW2_RULE" "$remarks" 2>/dev/null nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports "udp dport") counter jump PSW2_RULE comment \"$remarks\"" 2>/dev/null nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(REDIRECT $redir_port TPROXY) comment \"$remarks\"" 2>/dev/null } echolog " - ${msg2}" } nft "add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} counter return comment \"$remarks\"" - nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null - unset nft_chain nft_j _ipt_source msg msg2 + [ "$_ipv4" != "1" ] && nft "add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} counter return comment \"$remarks\"" 2>/dev/null + unset nft_chain nft_j _ipt_source msg msg2 _ipv4 done unset enabled sid remarks sources tcp_proxy_mode udp_proxy_mode tcp_no_redir_ports udp_no_redir_ports tcp_redir_ports udp_redir_ports node interface write_ipset_direct unset redir_port node_remark _acl_list diff --git a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.hu.resx b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.hu.resx index 862758f649..d7fd9fd30f 100644 --- a/v2rayn/v2rayN/ServiceLib/Resx/ResUI.hu.resx +++ b/v2rayn/v2rayN/ServiceLib/Resx/ResUI.hu.resx @@ -118,55 +118,55 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - A megosztási link másolása a vágólapra sikerült + Sikeresen exportálta a megosztási linket a vágólapra - Kérjük, először ellenőrizze a szerverbeállításokat + Kérjük, először ellenőrizze a konfigurációs beállításokat. - Érvénytelen konfigurációs formátum + Érvénytelen konfigurációs formátum. - Vegye figyelembe, hogy a testreszabott konfiguráció teljes mértékben az ön konfigurációjától függ, és nem működik minden beállítással. Ha a rendszer proxyját szeretné használni, kérjük, módosítsa a figyelési portot kézzel. + Ne feledje, hogy az egyéni konfiguráció teljes mértékben a saját konfigurációjától függ, és nem működik minden beállítással. Ha a rendszerproxyt szeretné használni, kérjük, manuálisan módosítsa a figyelő portot. Letöltés... - Nem sikerült a konfigurációs fájl átalakítása + Nem sikerült a konfigurációs fájl konvertálása - Nem sikerült a gyári konfigurációs fájl generálása + Nem sikerült az alapértelmezett konfigurációs fájl generálása - Nem sikerült lekérni a gyári konfigurációt + Nem sikerült lekérni az alapértelmezett konfigurációt - Nem sikerült a testreszabott konfigurációs szerver importálása + Nem sikerült importálni az egyéni konfigurációt - Nem sikerült a konfigurációs fájl beolvasása + Nem sikerült olvasni a konfigurációs fájlt - Kérjük, adja meg a helyes formátumú szerverportot + Kérjük, adja meg a helyes port formátumot. - Kérjük, adja meg a helyi figyelési portot + Kérjük, adja meg a helyi figyelő portot. - Kérjük, töltse ki a jelszót + Kérjük, adja meg a jelszót. - Kérjük, adja meg a szerver címét + Kérjük, adja meg a címet. - Kérjük, adja meg a felhasználói azonosítót + Kérjük, adja meg a felhasználói azonosítót. - Nem helyes a konfiguráció, kérjük, ellenőrizze + Ez nem a megfelelő konfiguráció, kérjük, ellenőrizze - Kezi konfiguráció + Kezdeti konfiguráció {0} {1} már naprakész. @@ -187,13 +187,13 @@ Típus - Előfizetési csoport + Előfizetés csoport - Letöltési forgalom ma + Mai letöltési forgalom - Feltöltési forgalom ma + Mai feltöltési forgalom Összes letöltési forgalom @@ -205,37 +205,37 @@ Szállítás - A Core letöltése sikerült + A Core sikeresen letöltve - Nem sikerült az előfizetési tartalom importálása + Nem sikerült importálni az előfizetés tartalmát - Az előfizetési tartalom sikeresen lekérve + Az előfizetés tartalma sikeresen lekérve - Nincs érvényes előfizetés meghatározva + Nincs érvényes előfizetés beállítva - Resolve {0} sikeresen + Resolved {0} successfully - Kezdje el az előfizetések lekérését + Előfizetések lekérdezése elindult - Kezdődik a frissítés: {0}... + Frissítés indítása: {0}... - Érvénytelen előfizetési tartalom + Érvénytelen előfizetés tartalom - Kicsomagolás folyamatban...... + Kicsomagolás... - Az előfizetések frissítése befejeződött + Előfizetés frissítése befejeződött - Az előfizetések frissítése elkezdődött + Előfizetés frissítése elindult A Core sikeresen frissítve @@ -244,16 +244,16 @@ A Core sikeresen frissítve! Szolgáltatás újraindítása... - Nem-VMess vagy ss protokoll + Nem VMess vagy SS protokoll - A Core fájl (fájl neve: {1}) nem található a mappában ({0}), kérjük, töltse le és helyezze a mappába, letöltési cím: {2} + A Core fájl (fájlnév: {1}) nem található a mappában ({0}), kérjük, töltse le és helyezze a mappába, letöltési cím: {2} - Beolvasás befejeződött, nem található érvényes QR-kód + Szkennelés befejeződött, nem található érvényes QR kód - A művelet nem sikerült, kérjük, ellenőrizze és próbálja újra + Művelet sikertelen, kérjük, ellenőrizze és próbálja újra Kérjük, töltse ki a megjegyzéseket @@ -262,97 +262,97 @@ Kérjük, válassza ki a titkosítási módszert - Kérjük, válasszon egy protokollt + Kérjük, válassza ki a protokollt - Kérjük, először válassza ki a szervert + Kérjük, először válassza ki a konfigurációt - A szerverek duplikáció eltávolítása befejeződött. Régi: {0}, Új: {1}. + Konfigurációk deduplikálása befejeződött. Régi: {0}, Új: {1}. - Biztosan el kívánja távolítani a szervert? + Biztosan eltávolítja a konfigurációt? - A kliens konfigurációs fájl mentve van itt: {0} + Az ügyfélkonfigurációs fájl mentése itt: {0} Szolgáltatás indítása ({0})... - Konfiguráció sikeres {0} + Konfiguráció sikeres. {0} - A testreszabott konfigurációs szerver sikeresen importálva + Egyéni konfiguráció sikeresen importálva - {0} szerver importálva a vágólapról + {0} konfiguráció importálva a vágólapról - A megosztott link sikeresen importálva a beolvasás során + Sikeresen beolvasta és importálta a megosztott linket A késleltetés: {0} ms, {1} - A művelet sikeres + Művelet sikeres - Kérjük, válassza ki a szabályokat + Kérjük, válasszon szabályokat - Biztosan el kívánja távolítani a szabályokat? + Biztosan eltávolítja a szabályokat? - {0}, az egyik kötelező. + {0}, az egyik kötelező mező. Megjegyzések - URL (Opcionális) + URL (opcionális) - Szám + Darabszám Kérjük, adja meg az URL-t - Hozzá kívánja adni a szabályokat? Válassza az igent az összefűzéshez, válassza a másikat a cseréhez + Hozzá szeretne fűzni szabályokat? Igen a hozzáfűzéshez, nem a cseréhez. - GeoFile letöltése: {0} sikerült + A GeoFile: {0} sikeresen letöltve Információ - Testreszabott ikona + Egyéni ikon - Kérjük, adja meg a helyes egyedi DNS-t + Kérjük, töltse ki a helyes egyéni DNS-t - *ws/httpupgrade/xhttp útvonal + *ws/http upgrade/xhttp elérési út - *h2 útvonal + *h2 elérési út - *QUIC kulcs/KCP mag + *QUIC kulcs/KCP seed - *grpc szolgáltatás neve + *grpc szolgáltatásnév - *http host, vesszővel elválasztva (,) + *http host vesszővel elválasztva (,) - *ws/httpupgrade/xhttp host + *ws/http upgrade/xhttp host - *h2 host, vesszővel elválasztva (,) + *h2 host vesszővel elválasztva (,) *QUIC biztonság @@ -373,19 +373,19 @@ TLS - *kcp mag + *kcp seed - A globális billentyűparancs {0} bejegyzése nem sikerült, ok: {1} + Globális gyorsbillentyű {0} regisztrációja sikertelen, ok: {1} - A globális billentyűparancs {0} sikeresen bejegyezve + Globális gyorsbillentyű {0} sikeresen regisztrálva Összes - Kérjük, keresse meg a szerver konfigurációjának importálásához + Kérjük, tallózzon a konfiguráció importálásához Tesztelés... @@ -397,7 +397,7 @@ Helyi - Szerver szűrő, nyomja meg az Enter-t a végrehajtáshoz + Konfigurációs szűrő, Enter billentyűvel végrehajtható Frissítés ellenőrzése @@ -409,13 +409,13 @@ Kilépés - Globális billentyűparancs beállítása + Globális gyorsbillentyű beállítás - Segítség + Súgó - Opció beállítása + Opció beállítás Promóció @@ -424,25 +424,25 @@ Újratöltés - Útvonal beállítása + Útválasztási beállítás - Szerverek + Konfigurációk Beállítások - Frissítse a jelenlegi előfizetést proxy nélkül + Aktuális előfizetés frissítése proxy nélkül - Frissítse a jelenlegi előfizetést proxyval + Aktuális előfizetés frissítése proxyval Előfizetési csoport - Előfizetési csoport beállítások + Előfizetési csoport beállításai Előfizetések frissítése proxy nélkül @@ -457,7 +457,7 @@ Rendszerproxy törlése - Ne változtassa meg a rendszer proxyját + Ne változtassa meg a rendszerproxyt PAC mód @@ -472,64 +472,64 @@ Nyelv (Újraindítás) - Importálja a megosztott linkeket a vágólapról (Ctrl+V) + Megosztási linkek importálása vágólapról (Ctrl+V) - QR kód beolvasása a képernyőn (Ctrl+S) + QR kód beolvasása a képernyőről (Ctrl+S) - Kiválasztott szerver klónozása + Kijelölt konfiguráció klónozása - Duplikált szerverek eltávolítása + Ismétlődő konfigurációk eltávolítása - Kiválasztott szerver(törlés) + Kijelölt konfigurációk eltávolítása (Delete) - Aktív szerverként beállítani (Enter) + Beállítás aktív konfigurációként (Enter) - Minden szolgáltatási statisztika törlése + Összes szolgáltatás statisztika törlése - A szerverek valós késleltetésének tesztelése (Ctrl+R) + Konfigurációk valós késleltetésének tesztelése (Ctrl+R) - Sorrend szerinti tesztelési eredmény + Rendezés teszteredmény szerint - A szerverek letöltési sebességének tesztelése (Ctrl+T) + Konfigurációk letöltési sebességének tesztelése (Ctrl+T) - Szerver tesztelése tcping-gel (Ctrl+O) + Konfigurációk tesztelése tcpinggel (Ctrl+O) - A kiválasztott szerver exportálása a teljes konfigurációhoz + Kijelölt konfiguráció exportálása teljes konfigurációként - A megosztási link kattintásra másolása (Ctrl+C) + Megosztási link exportálása vágólapra (Ctrl+C) - Testreszabott konfigurációs szerver hozzáadása + Egyéni konfiguráció hozzáadása - [Shadowsocks] szerver hozzáadása + [Shadowsocks] konfiguráció hozzáadása - [SOCKS] szerver hozzáadása + [SOCKS] konfiguráció hozzáadása - [Trojan] szerver hozzáadása + [Trojan] konfiguráció hozzáadása - [VLESS] szerver hozzáadása + [VLESS] konfiguráció hozzáadása - [VMess] szerver hozzáadása + [VMess] konfiguráció hozzáadása - Mindet kijelölni (Ctrl+A) + Összes kijelölése (Ctrl+A) Összes törlése @@ -556,19 +556,19 @@ Megosztás - A frissítés engedélyezése + Frissítés engedélyezése - Sorrend + Rendezés - Felhasználói ügynök + User Agent - Cancel + Mégsem - Megerősít + Megerősítés Szállítás @@ -577,40 +577,40 @@ Cím - Engedélyezett nem biztosított + Nem biztonságos engedélyezése ALPN - AlterID + Alter ID Ujjlenyomat - Álcázás típusa + Álcázási típus UUID(id) - Szállítási protokoll (hálózat) + Szállítási protokoll(hálózat) - Útvonal + Elérési út Port - Álnév (megjegyzések) + Alias (megjegyzések) - Álcázott domain (hoszt) + Álcázási tartomány(host) - Kódolási módszer (biztonság) + Titkosítási módszer (biztonság) SNI @@ -622,10 +622,10 @@ *Alapértelmezett érték tcp - Yalap típusa + Core Típus - Folyam + Flow Generálás @@ -634,34 +634,34 @@ Jelszó - Jelszó (opcionális) + Jelszó(Opcionális) UUID(id) - Kódolás + Titkosítás - Felhasználó (opcionális) + Felhasználó(Opcionális) - Kódolás + Titkosítás Socks port - * Ezen érték beállítása után egy socks szolgáltatás indul el Xray/sing-box(Tun) használatával, amely funkcionalitásokat biztosít, mint például a sebesség megjelenítése + * A beállítás után egy socks szolgáltatás indul az Xray/sing-box(Tun) segítségével, hogy olyan funkciókat biztosítson, mint a sebességkijelzés - Böngészés + Tallózás Szerkesztés - Fejlett proxy beállítások, protokoll választás (opcionális) + Haladó proxy beállítások, protokoll kiválasztása (opcionális) Kapcsolatok engedélyezése a LAN-ról @@ -670,61 +670,61 @@ Automatikus elrejtés indításkor - Geo automatikus frissítési időköz (órák) + Geo fájlok automatikus frissítési intervalluma (órák) - Yalap: alapbeállítások + Core: alapbeállítások V2ray DNS beállítások - Yalap: KCP beállítások + Core: KCP beállítások - Yalap típusa beállítások + Core Típus beállítások - Engedélyezett a nem biztonságos + Nem biztonságos engedélyezése - Kimenő szabadság domain stratégia + Kimenő Freedom tartomány stratégia - Otomatikusan állítja be az oszlop szélességét előfizetés frissítése után + Oszlopszélesség automatikus beállítása előfizetés frissítése után - Frissítések ellenőrzése a kiadás előtt + Előzetes kiadás frissítések ellenőrzése Kivétel - Kivétel. Ne használjon proxy szervert a címek esetében, amelyek pontosan itt kezdődnek, használjon pontosvesszőt (;) + Kivételek: Ne használjon proxy szervert a következő címmel kezdődő címekhez. Pontosvesszővel (;) válassza el a bejegyzéseket. - Display real-time speed + Valós idejű sebesség megjelenítése (újraindítást igényel) - Régi megőrzése a deduplikáció során + Régebbi bejegyzések megtartása deduplikáláskor - Napló engedélyezése + Naplózás engedélyezése - Napló szint + Naplózási szint - Mux multiplexelés bekapcsolása + Mux Multiplexing bekapcsolása v2rayN beállítások - Hitelesítő jelszó + Hitelesítési jelszó - Testreszabott DNS (több, vesszővel elválasztva (,)) + Egyéni DNS (több, vesszővel (,) elválasztva) Win10 UWP Loopback beállítása @@ -733,34 +733,34 @@ Sniffing bekapcsolása - Keverék Port + Vegyes port - Indításkor indítani + Indítás rendszerindításkor - Statisztikák engedélyezése (indítás szükséges) + Forgalmi statisztikák engedélyezése (újraindítást igényel) - Előfizetés átalakító URL + Előfizetés konverziós URL - Rendszer proxy beállítások + Rendszerproxy beállítások Biztonsági protokoll TLS v1.3 engedélyezése (előfizetés/frissítés) - A tálcán megjelenő menü szerverek megjelenítési korlátozása + Tálca jobb egérgombos menü konfigurációk megjelenítési limitje UDP engedélyezése - Hitelesítő felhasználó + Hitelesítési felhasználó - Rendszer proxy törlése + Rendszerproxy törlése GUI megjelenítése @@ -769,40 +769,40 @@ Globális gyorsbillentyű beállítások - Állítsa be közvetlenül a billentyűzet megnyomásával, indítás után érvényes + Közvetlenül beállítható billentyűnyomással; újraindítás után lép életbe - Ne változtassa meg a rendszer proxy-t + Ne változtassa meg a rendszerproxyt Visszaállítás - Rendszer proxy beállítása + Rendszerproxy beállítása - PAC módban + PAC mód - Megosztási szerver (Ctrl+F) + Konfiguráció megosztása (Ctrl+F) - Útvonal + Útválasztás - Nem adminisztrátorként fut + Nem rendszergazdaként fut - Futtatás adminisztrátorként + Futtatás rendszergazdaként - Áthelyezés a végére (B) + Mozgatás alulra (B) Le (D) - Áthelyezés a tetejére (T) + Mozgatás felülre (T) Fel (U) @@ -817,28 +817,28 @@ Hozzáadás - Fejlett szabályok importálása + Szabályok importálása - Kiválasztott eltávolítása (Törlés) + Kijelölt eltávolítása (Delete) - Aktív szabályként beállítása (Enter) + Beállítás aktív szabályként (Enter) - Domain illesztő + Tartomány illesztő - Domain stratégia + Tartomány stratégia - Előre definiált szabálykészletlista + Előre definiált szabálykészlet lista - * Állítsa be a szabályokat, vesszővel elválasztva (,); A reguláris kifejezésben a vesszőt <COMMA> -ra cseréli + *Szabályok elválasztása vesszővel (,); Szó szerinti vesszőhöz használja a <COMMA>-t; Előtag # a szabály figyelmen kívül hagyásához - Szabályok importálása a vágólapról + Szabályok importálása vágólapról Szabályok importálása fájlból @@ -847,61 +847,61 @@ Szabályok importálása előfizetési URL-ből - Szabálybeállítások + Szabály beállítások Szabály hozzáadása - Kiválasztott szabályok exportálása + Kijelölt szabályok exportálása Szabálylista - Szabály eltávolítása (Törlés) + Szabály eltávolítása (Delete) - RoutingRuleDetailsSetting + Útválasztási szabály részleteinek beállítása - Domain, ip, folyamat automatikusan rendezve lesz a mentés során + Tartomány, IP, folyamat automatikusan rendeződik mentéskor - Szabály objektum dokumentáció + Szabály objektum dokumentum - Támogatja a DnsObject, kattintson a dokumentum megtekintésére + Támogatja a DNS objektumot; Kattintson a dokumentáció megtekintéséhez - Csoporthoz, kérlek, hagyd üresen ezt a mezőt + Csoport esetén hagyja üresen - Útvonal beállítása megváltozott + Útválasztási beállítás megváltozott - Rendszer proxy beállítása megváltozott + Rendszerproxy beállítás megváltozott - Csak útvonal + Csak útválasztás - Ne használjon proxy szervert a helyi (intranet) címekhez + Ne használjon proxy szervert helyi (intranet) címekhez - Egy kattintásos több teszt késleltetés és sebesség (Ctrl+E) + Egykattintásos többszörös késleltetés és sebesség teszt (Ctrl+E) - Késleltetés(ms) + Késleltetés (ms) - Sebesség(M/s) + Sebesség (M/s) - Nem sikerült futtatni a Core-t, kérlek, nézd meg a naplót + Nem sikerült futtatni a Core-t, kérjük, ellenőrizze a prompt információt - Megjegyzések reguláris szűrő + Megjegyzések reguláris szűrője Napló megjelenítése @@ -913,61 +913,61 @@ Új port a LAN-hoz - TunMode beállítások + Tun mód beállítások - Áthelyezés csoporthoz + Mozgatás csoportba - Proxy Drag Drop Szortírozás engedélyezése (indítás szükséges) + Konfigurációk rendezésének engedélyezése húzással (újraindítást igényel) - AutoFrissítés + Automatikus frissítés Teszt kihagyása - Szerver szerkesztése (Ctrl+D) + Konfiguráció szerkesztése (Ctrl+D) - Kattintson duplán a szerver aktiválásához + Dupla kattintás a konfigurációra aktiválja - A teszt befejeződött + Teszt befejeződött Alapértelmezett TLS ujjlenyomat - Felhasználói ügynök + User-Agent Ez a paraméter csak tcp/http és ws esetén érvényes - Betűcsalád (indítás szükséges) + Betűtípus (újraindítást igényel) - Kérlek, másold a betűtípus TTF/TTC fájlt a guiFonts könyvtárba, indítsd újra a beállításokat + Másolja a TTF/TTC betűtípus fájlt a gui Fonts könyvtárba; Nyissa meg újra a beállítások ablakot Pac port = +3; Xray API port = +4; mihomo API port = +5; - Állítsd be ezt admin jogokkal, indítás után szerezd meg az admin jogokat + Rendszergazdai jogosultságokkal állítsa be, indítás után szerezzen rendszergazdai jogosultságokat Betűméret - SpeedTest egyéni időtúllépési érték + Sebességteszt egyszeri időtúllépési érték - SpeedTest URL + Sebességteszt URL - Feljebb és lejjebb mozgatás + Mozgatás fel és le Nyilvános kulcs @@ -976,40 +976,40 @@ Rövid azonosító - SpiderX + Spider X - Hardveres gyorsítás engedélyezése (indítás szükséges) + Hardveres gyorsítás engedélyezése (újraindítást igényel) - Várakozás a tesztelésre (nyomj ESC-t a leállításhoz)... + Tesztelésre vár (ESC megnyomásával megszakítható)... - Kérlek, kapcsold ki, ha szokatlan megszakítás történt + Kérjük, kapcsolja ki rendellenes megszakadás esetén - A frissítések nincsenek aktiválva, átugorva ez az előfizetés + A frissítések nincsenek engedélyezve, kihagyja ezt az előfizetést - Újraindítás adminisztrátorként + Újraindítás rendszergazdaként - Több URL, vesszővel elválasztva; Az előfizetés átalakítása érvénytelen lesz + További URL-ek, vesszővel elválasztva; Az előfizetés konverzió érvénytelen lesz {0} : {1}/s↑ | {2}/s↓ - Automatikus frissítési időköz (perc) + Automatikus frissítési intervallum (percek) - Napló engedélyezése fájlba + Naplózás engedélyezése fájlba - Átalakítási cél típusa + Konverziós cél típus - Kérlek, hagyd üresen, ha nincs szükség átalakításra + Kérjük, hagyja üresen, ha nincs szükség konverzióra DNS beállítások @@ -1018,115 +1018,115 @@ sing-box DNS beállítások - Kérlek, töltsd ki a DNS struktúrát, kattints a dokumentum megtekintésére + Kérjük, töltse ki a DNS struktúrát, kattintson a dokumentum megtekintéséhez - Kattints az alapértelmezett DNS konfiguráció importálásához + Kattintson az alapértelmezett DNS konfiguráció importálásához - sing-box domain stratégia + sing-box tartomány stratégia sing-box Mux protokoll - Teljes folyamat neve (Tun módban) + Teljes folyamatnév (Tun mód) IP vagy IP CIDR - Domain + Tartomány - [Hysteria2] szerver hozzáadása + Hysteria2 konfiguráció hozzáadása - Hysteria maximális sávszélesség (Felfelé/Letöltés) + Hysteria Max sávszélesség (Fel/Le) - Rendszer gazdagépeket használ + Rendszer Hosts használata - [TUIC] szerver hozzáadása + TUIC konfiguráció hozzáadása - Befogadó irányítás + Torlódásvezérlés - Előző proxy megjegyzések + Előző proxy konfiguráció megjegyzései - Következő proxy megjegyzések + Következő proxy konfiguráció megjegyzései - Kérlek, győződj meg róla, hogy a megjegyzés létezik és egyedi + Kérjük, győződjön meg arról, hogy a konfigurációs megjegyzések léteznek és egyediek - Kiegészítő bejövő engedélyezése + További bejövő engedélyezése IPv6 cím engedélyezése - [WireGuard] szerver hozzáadása + WireGuard konfiguráció hozzáadása Privát kulcs - Fenntartva (2,3,4) + Fenntartott (2,3,4) - Cím (Ipv4,Ipv6) + Cím (IPv4, IPv6) obfs jelszó - (Domain vagy IP vagy ProcName) és Port és Protokoll és InboundTag => OutboundTag + (Tartomány vagy IP vagy folyamatnév) és port és protokoll és bejövő címke => kimenő címke Automatikus görgetés a végére - Speed Ping Test URL + Sebesség Ping Teszt URL - Előfizetés frissítése, csak akkor határozd meg, ha a megjegyzések léteznek + Előfizetés frissítése, csak a megjegyzések létezésének ellenőrzése - A teszt leállítása... + Teszt megszakítása... - *grpc Hatóság + *grpc Authority - [HTTP] szerver hozzáadása + HTTP konfiguráció hozzáadása - Használja az Xray-t és engedélyezze a nem-Tun módot, amely összeférhet a csoport előző proxy-jával + Használja az Xray-t és engedélyezze a nem Tun módot, ami ütközik a csoport előző proxyjával - Fragmentum engedélyezése + Fragment engedélyezése - Cache fájl engedélyezése a sing-box számára (szabálykészlet fájlok) + Gyorsítótár fájl engedélyezése sing-boxhoz (szabálykészlet fájlok) - Testreszabott a sing-box szabálykészletének + A sing-box szabálykészletének testreszabása - Sikeres művelet. Kattintson a beállítási menüre az alkalmazás újraindításához. + Sikeres művelet. Kattintson a beállítások menüre az alkalmazás újraindításához. - Megnyitja a tárolás helyét + Fájl helyének megnyitása Rendezés - Zárlat + Lánc Alapértelmezett @@ -1141,7 +1141,7 @@ Letöltési forgalom - Gazda + Host Név @@ -1171,7 +1171,7 @@ Összes kapcsolat bezárása - Proxy-k + Proxyk Szabály mód @@ -1183,7 +1183,7 @@ Globális - Ne változtasson + Ne változtassa meg Szabály @@ -1195,49 +1195,49 @@ Részleges csomópont késleltetés teszt - Proxy-k frissítése + Proxyk frissítése Aktív csomópont kiválasztása (Enter) - Alapértelmezett domain stratégia a kimenő forgalomhoz + Alapértelmezett tartomány stratégia kimenő forgalomhoz - Fő elrendezés irányítása (indítás szükséges) + Fő elrendezés iránya (újraindítást igényel) Kimenő DNS cím - Oszlop szélesség automatikus beállítása + Oszlopszélesség automatikus beállítása - Exportálja a Base64-kódolt megosztási linkeket a vágólapra + Base64-kódolt megosztási linkek exportálása vágólapra - Kiválasztott szerver exportálása teljes konfigurációval a vágólapra + Kijelölt konfiguráció exportálása teljes konfigurációként a vágólapra - Fő ablak megjelenítése vagy elrejtése + Főablak megjelenítése vagy elrejtése - Testreszabott konfigurációs socks port + Egyéni konfiguráció socks portja Biztonsági mentés és visszaállítás - Biztonsági mentés helyben + Biztonsági mentés helyi tárolóba - Visszaállítás helyben + Visszaállítás helyi tárolóból - Biztonsági mentés távolról (WebDAV) + Biztonsági mentés távoli helyre (WebDAV) - Visszaállítás távolról (WebDAV) + Visszaállítás távoli helyről (WebDAV) Helyi @@ -1246,25 +1246,25 @@ Távoli (WebDAV) - WebDav URL + WebDAV URL - WebDav Felhasználónév + WebDAV felhasználónév - WebDav Jelszó + WebDAV jelszó - WebDav Ellenőrzés + WebDAV ellenőrzés Távoli mappa neve (opcionális) - Érvénytelen mentési fájl + Érvénytelen biztonsági mentés fájl - Gazda szűrő + Host szűrő Aktív @@ -1276,13 +1276,13 @@ sing-box szabálykészlet fájlok forrása (opcionális) - UpgradeApp nem létezik + Frissítő alkalmazás nem létezik - Útvonal szabályok forrása (opcionális) + Útválasztási szabályok forrása (opcionális) - Regionális előbeállítások beállítása + Regionális előbeállítások Alapértelmezett @@ -1294,22 +1294,22 @@ Irán - A Kínában élő felhasználók figyelmen kívül hagyhatják ezt a tételt + Kínai régióban lévő felhasználók figyelmen kívül hagyhatják ezt az elemet - QR kód beolvasása a képen + QR kód beolvasása a képből - Érvénytelen cím (Url) + Érvénytelen cím (URL) - Kérlek, ne használd a nem biztonságos HTTP protokollt az előfizetés címeknél + Kérjük, ne használjon nem biztonságos HTTP protokoll előfizetési címet - Telepítsd a betűtípust a rendszerbe és indítsd újra a beállításokat + Telepítse a betűtípust a rendszerbe, válassza ki vagy töltse ki a betűtípus nevét, indítsa újra a beállításokat - Biztosan ki akarsz lépni? + Biztosan ki akar lépni? Megjegyzések @@ -1318,84 +1318,84 @@ Rendszer sudo jelszó - The password will be validated via the command line. If a validation error causes the application to malfunction, please restart the application. The password will not be stored and must be entered again after each restart. + A jelszót a parancssoron keresztül ellenőrizzük. Ha egy érvényesítési hiba miatt az alkalmazás hibásan működik, indítsa újra az alkalmazást. A jelszó nem kerül tárolásra, és minden újraindítás után újra meg kell adni. *xhttp mód - XHTTP További nyers JSON, formátum: { XHTTPObject } + XHTTP Extra nyers JSON, formátum: { XHTTP Objektum } - Minimálás tálcára ablak zárásakor + Ablak bezárásakor a tálcára rejtés - The number of concurrent during multi-test + A párhuzamos tesztek száma több teszt során - Kivétel. Ne használj proxy szervert a címeknél, évezz pontosvesszőt (,) + Kivételek: Ne használjon proxy szervert a következő címekhez. Vesszővel (,) válassza el a bejegyzéseket. - Sniffing type + Sniffing típus - Enable second mixed port + Második vegyes port engedélyezése - socks: local port, socks2: second local port, socks3: LAN port + socks: helyi port, socks2: második helyi port, socks3: LAN port - Theme + Téma - Copy proxy command to clipboard + Proxy parancs másolása vágólapra - Starting retesting failed parts, {0} remaining. Press ESC to terminate... + Sikertelen részek újratesztelése elindult, {0} maradt. ESC megnyomásával megszakítható... - By test result + Teszt eredmény szerint - Remove invalid by test results + Érvénytelenek eltávolítása teszteredmények alapján - Removed {0} invalid test results. + Eltávolítva {0} érvénytelen teszteredmény. - Server port range + Konfigurációs port tartomány - Will cover the port, separate with commas (,) + A portot lefedi, vesszővel (,) elválasztva - Multi-server to custom configuration + Több konfiguráció egyéni konfigurációra - Multi-server Random by Xray + Több konfiguráció véletlenszerűen Xray szerint - Multi-server RoundRobin by Xray + Több konfiguráció RoundRobin Xray szerint - Multi-server LeastPing by Xray + Több konfiguráció legkisebb pinggel Xray szerint - Multi-server LeastLoad by Xray + Több konfiguráció legkisebb terheléssel Xray szerint - Multi-server LeastPing by sing-box + Több konfiguráció legkisebb pinggel sing-box szerint - Export server + Konfiguráció exportálása - Current connection info test URL + Aktuális kapcsolat info teszt URL - Can fill in the configuration remarks, please make sure it exist and are unique + Kitöltheti a konfigurációs megjegyzéseket, kérjük, győződjön meg róla, hogy létezik és egyedi - Incorrect password, please try again. + Helytelen jelszó, próbálja újra. - \ No newline at end of file + diff --git a/v2rayng/AndroidLibXrayLite/.github/workflows/main.yml b/v2rayng/AndroidLibXrayLite/.github/workflows/main.yml index 2080020eda..32babbcd36 100644 --- a/v2rayng/AndroidLibXrayLite/.github/workflows/main.yml +++ b/v2rayng/AndroidLibXrayLite/.github/workflows/main.yml @@ -42,7 +42,7 @@ jobs: echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager \ --channel=3 \ --install "ndk;29.0.13113456" - echo "NDK_HOME=$ANDROID_HOME/ndk/29.0.13113456" >> $GITHUB_ENV + echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/29.0.13113456" >> $GITHUB_ENV - name: Build run: | @@ -67,4 +67,4 @@ jobs: with: file: ./libv2ray*r tag: ${{ github.event.inputs.release_tag }} - file_glob: true \ No newline at end of file + file_glob: true diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt index 05369040ba..18364096db 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -163,6 +163,7 @@ object AppConfig { /** Give a good name to this, IDK*/ const val VPN = "VPN" + const val VPN_MTU = 1500 // Google API rule constants const val GOOGLEAPIS_CN_DOMAIN = "domain:googleapis.cn" diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/NotificationService.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/NotificationManager.kt similarity index 95% rename from v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/NotificationService.kt rename to v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/NotificationManager.kt index 92c551a66a..e8737d7e6e 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/NotificationService.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/NotificationManager.kt @@ -1,4 +1,4 @@ -package com.v2ray.ang.service +package com.v2ray.ang.handler import android.app.Notification import android.app.NotificationChannel @@ -12,12 +12,10 @@ import android.os.Build import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat import com.v2ray.ang.AppConfig -import com.v2ray.ang.AppConfig.ANG_PACKAGE -import com.v2ray.ang.AppConfig.TAG_DIRECT import com.v2ray.ang.R import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.extension.toSpeedString -import com.v2ray.ang.handler.MmkvManager +import com.v2ray.ang.handler.V2RayServiceManager import com.v2ray.ang.ui.MainActivity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -27,7 +25,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlin.math.min -object NotificationService { +object NotificationManager { private const val NOTIFICATION_ID = 1 private const val NOTIFICATION_PENDING_INTENT_CONTENT = 0 private const val NOTIFICATION_PENDING_INTENT_STOP_V2RAY = 1 @@ -50,7 +48,7 @@ object NotificationService { lastQueryTime = System.currentTimeMillis() var lastZeroSpeed = false val outboundTags = currentConfig?.getAllOutboundTags() - outboundTags?.remove(TAG_DIRECT) + outboundTags?.remove(AppConfig.TAG_DIRECT) speedNotificationJob = CoroutineScope(Dispatchers.IO).launch { while (isActive) { @@ -66,15 +64,15 @@ object NotificationService { proxyTotal += up + down } } - val directUplink = V2RayServiceManager.queryStats(TAG_DIRECT, AppConfig.UPLINK) - val directDownlink = V2RayServiceManager.queryStats(TAG_DIRECT, AppConfig.DOWNLINK) + val directUplink = V2RayServiceManager.queryStats(AppConfig.TAG_DIRECT, AppConfig.UPLINK) + val directDownlink = V2RayServiceManager.queryStats(AppConfig.TAG_DIRECT, AppConfig.DOWNLINK) val zeroSpeed = proxyTotal == 0L && directUplink == 0L && directDownlink == 0L if (!zeroSpeed || !lastZeroSpeed) { if (proxyTotal == 0L) { appendSpeedString(text, outboundTags?.firstOrNull(), 0.0, 0.0) } appendSpeedString( - text, TAG_DIRECT, directUplink / sinceLastQueryInSeconds, + text, AppConfig.TAG_DIRECT, directUplink / sinceLastQueryInSeconds, directDownlink / sinceLastQueryInSeconds ) updateNotification(text.toString(), proxyTotal, directDownlink + directUplink) @@ -102,12 +100,12 @@ object NotificationService { val contentPendingIntent = PendingIntent.getActivity(service, NOTIFICATION_PENDING_INTENT_CONTENT, startMainIntent, flags) val stopV2RayIntent = Intent(AppConfig.BROADCAST_ACTION_SERVICE) - stopV2RayIntent.`package` = ANG_PACKAGE + stopV2RayIntent.`package` = AppConfig.ANG_PACKAGE stopV2RayIntent.putExtra("key", AppConfig.MSG_STATE_STOP) val stopV2RayPendingIntent = PendingIntent.getBroadcast(service, NOTIFICATION_PENDING_INTENT_STOP_V2RAY, stopV2RayIntent, flags) val restartV2RayIntent = Intent(AppConfig.BROADCAST_ACTION_SERVICE) - restartV2RayIntent.`package` = ANG_PACKAGE + restartV2RayIntent.`package` = AppConfig.ANG_PACKAGE restartV2RayIntent.putExtra("key", AppConfig.MSG_STATE_RESTART) val restartV2RayPendingIntent = PendingIntent.getBroadcast(service, NOTIFICATION_PENDING_INTENT_RESTART_V2RAY, restartV2RayIntent, flags) diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/util/PluginUtil.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/PluginServiceManager.kt similarity index 97% rename from v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/util/PluginUtil.kt rename to v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/PluginServiceManager.kt index 2b9f71aa7e..20e7273f0b 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/util/PluginUtil.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/PluginServiceManager.kt @@ -1,4 +1,4 @@ -package com.v2ray.ang.util +package com.v2ray.ang.handler import android.content.Context import android.os.SystemClock @@ -7,11 +7,12 @@ import com.v2ray.ang.AppConfig import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.fmt.Hysteria2Fmt -import com.v2ray.ang.handler.SpeedtestManager import com.v2ray.ang.service.ProcessService +import com.v2ray.ang.util.JsonUtil +import com.v2ray.ang.util.Utils import java.io.File -object PluginUtil { +object PluginServiceManager { private const val HYSTERIA2 = "libhysteria2.so" private val procService: ProcessService by lazy { @@ -137,4 +138,4 @@ object PluginUtil { Log.e(AppConfig.TAG, "Failed to stop Hysteria2 process", e) } } -} +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/SubscriptionUpdater.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SubscriptionUpdater.kt similarity index 78% rename from v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/SubscriptionUpdater.kt rename to v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SubscriptionUpdater.kt index 5f3f8172bd..35ad1e9baf 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/SubscriptionUpdater.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SubscriptionUpdater.kt @@ -1,4 +1,4 @@ -package com.v2ray.ang.service +package com.v2ray.ang.handler import android.annotation.SuppressLint import android.app.NotificationChannel @@ -11,11 +11,7 @@ import androidx.core.app.NotificationManagerCompat import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.v2ray.ang.AppConfig -import com.v2ray.ang.AppConfig.SUBSCRIPTION_UPDATE_CHANNEL -import com.v2ray.ang.AppConfig.SUBSCRIPTION_UPDATE_CHANNEL_NAME import com.v2ray.ang.R -import com.v2ray.ang.handler.AngConfigManager.updateConfigViaSub -import com.v2ray.ang.handler.MmkvManager object SubscriptionUpdater { @@ -24,7 +20,7 @@ object SubscriptionUpdater { private val notificationManager = NotificationManagerCompat.from(applicationContext) private val notification = - NotificationCompat.Builder(applicationContext, SUBSCRIPTION_UPDATE_CHANNEL) + NotificationCompat.Builder(applicationContext, AppConfig.SUBSCRIPTION_UPDATE_CHANNEL) .setWhen(0) .setTicker("Update") .setContentTitle(context.getString(R.string.title_pref_auto_update_subscription)) @@ -46,18 +42,18 @@ object SubscriptionUpdater { val subItem = sub.second if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - notification.setChannelId(SUBSCRIPTION_UPDATE_CHANNEL) + notification.setChannelId(AppConfig.SUBSCRIPTION_UPDATE_CHANNEL) val channel = NotificationChannel( - SUBSCRIPTION_UPDATE_CHANNEL, - SUBSCRIPTION_UPDATE_CHANNEL_NAME, + AppConfig.SUBSCRIPTION_UPDATE_CHANNEL, + AppConfig.SUBSCRIPTION_UPDATE_CHANNEL_NAME, NotificationManager.IMPORTANCE_MIN ) notificationManager.createNotificationChannel(channel) } notificationManager.notify(3, notification.build()) Log.i(AppConfig.TAG, "subscription automatic update: ---${subItem.remarks}") - updateConfigViaSub(Pair(sub.first, subItem)) + AngConfigManager.updateConfigViaSub(Pair(sub.first, subItem)) notification.setContentText("Updating ${subItem.remarks}") } notificationManager.cancel(3) diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt similarity index 94% rename from v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt rename to v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt index 4f42ca237b..011338c22b 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt @@ -1,4 +1,4 @@ -package com.v2ray.ang.service +package com.v2ray.ang.handler import android.app.Service import android.content.BroadcastReceiver @@ -13,12 +13,11 @@ import com.v2ray.ang.R import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.extension.toast -import com.v2ray.ang.handler.MmkvManager -import com.v2ray.ang.handler.SettingsManager -import com.v2ray.ang.handler.SpeedtestManager -import com.v2ray.ang.handler.V2rayConfigManager +import com.v2ray.ang.service.ServiceControl +import com.v2ray.ang.service.V2RayProxyOnlyService +import com.v2ray.ang.service.V2RayVpnService import com.v2ray.ang.util.MessageUtil -import com.v2ray.ang.util.PluginUtil +import com.v2ray.ang.handler.PluginServiceManager import com.v2ray.ang.util.Utils import go.Seq import kotlinx.coroutines.CoroutineScope @@ -163,16 +162,16 @@ object V2RayServiceManager { if (coreController.isRunning == false) { MessageUtil.sendMsg2UI(service, AppConfig.MSG_STATE_START_FAILURE, "") - NotificationService.cancelNotification() + NotificationManager.cancelNotification() return false } try { MessageUtil.sendMsg2UI(service, AppConfig.MSG_STATE_START_SUCCESS, "") - NotificationService.showNotification(currentConfig) - NotificationService.startSpeedNotification(currentConfig) + NotificationManager.showNotification(currentConfig) + NotificationManager.startSpeedNotification(currentConfig) - PluginUtil.runPlugin(service, config, result.socksPort) + PluginServiceManager.runPlugin(service, config, result.socksPort) } catch (e: Exception) { Log.e(AppConfig.TAG, "Failed to startup service", e) return false @@ -199,14 +198,14 @@ object V2RayServiceManager { } MessageUtil.sendMsg2UI(service, AppConfig.MSG_STATE_STOP_SUCCESS, "") - NotificationService.cancelNotification() + NotificationManager.cancelNotification() try { service.unregisterReceiver(mMsgReceive) } catch (e: Exception) { Log.e(AppConfig.TAG, "Failed to unregister broadcast receiver", e) } - PluginUtil.stopPlugin() + PluginServiceManager.stopPlugin() return true } @@ -364,14 +363,14 @@ object V2RayServiceManager { when (intent?.action) { Intent.ACTION_SCREEN_OFF -> { Log.i(AppConfig.TAG, "SCREEN_OFF, stop querying stats") - NotificationService.stopSpeedNotification(currentConfig) + NotificationManager.stopSpeedNotification(currentConfig) } Intent.ACTION_SCREEN_ON -> { Log.i(AppConfig.TAG, "SCREEN_ON, start querying stats") - NotificationService.startSpeedNotification(currentConfig) + NotificationManager.startSpeedNotification(currentConfig) } } } } -} +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/BootReceiver.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/BootReceiver.kt index ae15e76cb6..3b47b634aa 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/BootReceiver.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/BootReceiver.kt @@ -4,7 +4,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import com.v2ray.ang.handler.MmkvManager -import com.v2ray.ang.service.V2RayServiceManager +import com.v2ray.ang.handler.V2RayServiceManager class BootReceiver : BroadcastReceiver() { /** diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/TaskerReceiver.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/TaskerReceiver.kt index bdb7bf9a0c..e0bc8c2601 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/TaskerReceiver.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/TaskerReceiver.kt @@ -5,7 +5,7 @@ import android.content.Context import android.content.Intent import android.text.TextUtils import com.v2ray.ang.AppConfig -import com.v2ray.ang.service.V2RayServiceManager +import com.v2ray.ang.handler.V2RayServiceManager class TaskerReceiver : BroadcastReceiver() { diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt index 99d9bda25f..2004c13559 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt @@ -10,7 +10,7 @@ import android.os.Build import android.widget.RemoteViews import com.v2ray.ang.AppConfig import com.v2ray.ang.R -import com.v2ray.ang.service.V2RayServiceManager +import com.v2ray.ang.handler.V2RayServiceManager class WidgetProvider : AppWidgetProvider() { /** diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt index 7aecf634c7..725987fea7 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt @@ -13,6 +13,7 @@ import androidx.annotation.RequiresApi import androidx.core.content.ContextCompat import com.v2ray.ang.AppConfig import com.v2ray.ang.R +import com.v2ray.ang.handler.V2RayServiceManager import com.v2ray.ang.util.MessageUtil import com.v2ray.ang.util.Utils import java.lang.ref.SoftReference diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/Tun2SocksService.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/Tun2SocksService.kt new file mode 100644 index 0000000000..e1fd52db2a --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/Tun2SocksService.kt @@ -0,0 +1,129 @@ +package com.v2ray.ang.service + +import android.content.Context +import android.net.LocalSocket +import android.net.LocalSocketAddress +import android.os.ParcelFileDescriptor +import android.util.Log +import com.v2ray.ang.AppConfig +import com.v2ray.ang.AppConfig.VPN_MTU +import com.v2ray.ang.handler.MmkvManager +import com.v2ray.ang.handler.SettingsManager +import com.v2ray.ang.util.Utils +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.io.File + +/** + * Manages the tun2socks process that handles VPN traffic + */ +class Tun2SocksService( + private val context: Context, + private val vpnInterface: ParcelFileDescriptor, + private val isRunningProvider: () -> Boolean, + private val restartCallback: () -> Unit +) { + companion object { + private const val TUN2SOCKS = "libtun2socks.so" + } + + private lateinit var process: Process + + /** + * Starts the tun2socks process with the appropriate parameters. + */ + fun startTun2Socks() { + Log.i(AppConfig.TAG, "Start run $TUN2SOCKS") + val socksPort = SettingsManager.getSocksPort() + val vpnConfig = SettingsManager.getCurrentVpnInterfaceAddressConfig() + val cmd = arrayListOf( + File(context.applicationInfo.nativeLibraryDir, TUN2SOCKS).absolutePath, + "--netif-ipaddr", vpnConfig.ipv4Router, + "--netif-netmask", "255.255.255.252", + "--socks-server-addr", "${AppConfig.LOOPBACK}:${socksPort}", + "--tunmtu", VPN_MTU.toString(), + "--sock-path", "sock_path", + "--enable-udprelay", + "--loglevel", "notice" + ) + + if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PREFER_IPV6)) { + cmd.add("--netif-ip6addr") + cmd.add(vpnConfig.ipv6Router) + } + if (MmkvManager.decodeSettingsBool(AppConfig.PREF_LOCAL_DNS_ENABLED)) { + val localDnsPort = Utils.parseInt( + MmkvManager.decodeSettingsString(AppConfig.PREF_LOCAL_DNS_PORT), + AppConfig.PORT_LOCAL_DNS.toInt() + ) + cmd.add("--dnsgw") + cmd.add("${AppConfig.LOOPBACK}:${localDnsPort}") + } + Log.i(AppConfig.TAG, cmd.toString()) + + try { + val proBuilder = ProcessBuilder(cmd) + proBuilder.redirectErrorStream(true) + process = proBuilder + .directory(context.filesDir) + .start() + Thread { + Log.i(AppConfig.TAG, "$TUN2SOCKS check") + process.waitFor() + Log.i(AppConfig.TAG, "$TUN2SOCKS exited") + if (isRunningProvider()) { + Log.i(AppConfig.TAG, "$TUN2SOCKS restart") + restartCallback() + } + }.start() + Log.i(AppConfig.TAG, "$TUN2SOCKS process info: $process") + + sendFd() + } catch (e: Exception) { + Log.e(AppConfig.TAG, "Failed to start $TUN2SOCKS process", e) + } + } + + /** + * Sends the file descriptor to the tun2socks process. + * Attempts to send the file descriptor multiple times if necessary. + */ + private fun sendFd() { + val fd = vpnInterface.fileDescriptor + val path = File(context.filesDir, "sock_path").absolutePath + Log.i(AppConfig.TAG, "LocalSocket path: $path") + + CoroutineScope(Dispatchers.IO).launch { + var tries = 0 + while (true) try { + Thread.sleep(50L shl tries) + Log.i(AppConfig.TAG, "LocalSocket sendFd tries: $tries") + LocalSocket().use { localSocket -> + localSocket.connect(LocalSocketAddress(path, LocalSocketAddress.Namespace.FILESYSTEM)) + localSocket.setFileDescriptorsForSend(arrayOf(fd)) + localSocket.outputStream.write(42) + } + break + } catch (e: Exception) { + Log.e(AppConfig.TAG, "Failed to send file descriptor, try: $tries", e) + if (tries > 5) break + tries += 1 + } + } + } + + /** + * Stops the tun2socks process + */ + fun stopTun2Socks() { + try { + Log.i(AppConfig.TAG, "$TUN2SOCKS destroy") + if (::process.isInitialized) { + process.destroy() + } + } catch (e: Exception) { + Log.e(AppConfig.TAG, "Failed to destroy $TUN2SOCKS process", e) + } + } +} diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt index 25fcd1a624..232549f7cf 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt @@ -7,6 +7,7 @@ import android.os.Build import android.os.IBinder import androidx.annotation.RequiresApi import com.v2ray.ang.handler.SettingsManager +import com.v2ray.ang.handler.V2RayServiceManager import com.v2ray.ang.util.MyContextWrapper import java.lang.ref.SoftReference diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayTestService.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayTestService.kt index 3fef1ae141..8d559441a4 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayTestService.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayTestService.kt @@ -9,10 +9,10 @@ import com.v2ray.ang.AppConfig.MSG_MEASURE_CONFIG_SUCCESS import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.extension.serializable import com.v2ray.ang.handler.MmkvManager +import com.v2ray.ang.handler.PluginServiceManager import com.v2ray.ang.handler.SpeedtestManager import com.v2ray.ang.handler.V2rayConfigManager import com.v2ray.ang.util.MessageUtil -import com.v2ray.ang.util.PluginUtil import com.v2ray.ang.util.Utils import go.Seq import kotlinx.coroutines.CoroutineScope @@ -78,7 +78,7 @@ class V2RayTestService : Service() { val config = MmkvManager.decodeServerConfig(guid) ?: return retFailure if (config.configType == EConfigType.HYSTERIA2) { - val delay = PluginUtil.realPingHy2(this, config) + val delay = PluginServiceManager.realPingHy2(this, config) return delay } else { val configResult = V2rayConfigManager.getV2rayConfig4Speedtest(this, guid) diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt index 79ee528b7b..93e8b58314 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt @@ -5,8 +5,6 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.ConnectivityManager -import android.net.LocalSocket -import android.net.LocalSocketAddress import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest @@ -19,26 +17,20 @@ import android.util.Log import androidx.annotation.RequiresApi import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.LOOPBACK +import com.v2ray.ang.AppConfig.VPN_MTU import com.v2ray.ang.BuildConfig import com.v2ray.ang.handler.MmkvManager +import com.v2ray.ang.handler.NotificationManager import com.v2ray.ang.handler.SettingsManager +import com.v2ray.ang.handler.V2RayServiceManager import com.v2ray.ang.util.MyContextWrapper import com.v2ray.ang.util.Utils -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.io.File import java.lang.ref.SoftReference class V2RayVpnService : VpnService(), ServiceControl { - companion object { - private const val VPN_MTU = 1500 - private const val TUN2SOCKS = "libtun2socks.so" - } - private lateinit var mInterface: ParcelFileDescriptor private var isRunning = false - private lateinit var process: Process + private var tun2SocksService: Tun2SocksService? = null /**destroy * Unfortunately registerDefaultNetworkCallback is going to return our VPN interface: https://android.googlesource.com/platform/frameworks/base/+/dda156ab0c5d66ad82bdcf76cda07cbc0a9c8a2e @@ -95,7 +87,7 @@ class V2RayVpnService : VpnService(), ServiceControl { override fun onDestroy() { super.onDestroy() - NotificationService.cancelNotification() + NotificationManager.cancelNotification() } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { @@ -111,7 +103,7 @@ class V2RayVpnService : VpnService(), ServiceControl { } override fun startService() { - setup() + setupService() } override fun stopService() { @@ -134,13 +126,13 @@ class V2RayVpnService : VpnService(), ServiceControl { * Sets up the VPN service. * Prepares the VPN and configures it if preparation is successful. */ - private fun setup() { + private fun setupService() { val prepare = prepare(this) if (prepare != null) { return } - if (setupVpnService() != true) { + if (configureVpnService() != true) { return } @@ -151,17 +143,52 @@ class V2RayVpnService : VpnService(), ServiceControl { * Configures the VPN service. * @return True if the VPN service was configured successfully, false otherwise. */ - private fun setupVpnService(): Boolean { - // If the old interface has exactly the same parameters, use it! - // Configure a builder while parsing the parameters. + private fun configureVpnService(): Boolean { val builder = Builder() - val vpnConfig = SettingsManager.getCurrentVpnInterfaceAddressConfig() - //val enableLocalDns = defaultDPreference.getPrefBoolean(AppConfig.PREF_LOCAL_DNS_ENABLED, false) + + // Configure network settings (addresses, routing and DNS) + configureNetworkSettings(builder) + // Configure app-specific settings (session name and per-app proxy) + configurePerAppProxy(builder) + + // Close the old interface since the parameters have been changed + try { + mInterface.close() + } catch (ignored: Exception) { + // ignored + } + + // Configure platform-specific features + configurePlatformFeatures(builder) + + // Create a new interface using the builder and save the parameters + try { + mInterface = builder.establish()!! + isRunning = true + return true + } catch (e: Exception) { + Log.e(AppConfig.TAG, "Failed to establish VPN interface", e) + stopV2Ray() + } + return false + } + + /** + * Configures the basic network settings for the VPN. + * This includes IP addresses, routing rules, and DNS servers. + * + * @param builder The VPN Builder to configure + */ + private fun configureNetworkSettings(builder: Builder) { + val vpnConfig = SettingsManager.getCurrentVpnInterfaceAddressConfig() + val bypassLan = SettingsManager.routingRulesetsBypassLan() + + // Configure IPv4 settings builder.setMtu(VPN_MTU) builder.addAddress(vpnConfig.ipv4Client, 30) - //builder.addDnsServer(PRIVATE_VLAN4_ROUTER) - val bypassLan = SettingsManager.routingRulesetsBypassLan() + + // Configure routing rules if (bypassLan) { AppConfig.ROUTED_IP_LIST.forEach { val addr = it.split('/') @@ -170,39 +197,38 @@ class V2RayVpnService : VpnService(), ServiceControl { } else { builder.addRoute("0.0.0.0", 0) } - + + // Configure IPv6 if enabled if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PREFER_IPV6) == true) { builder.addAddress(vpnConfig.ipv6Client, 126) if (bypassLan) { - builder.addRoute("2000::", 3) //currently only 1/8 of total ipV6 is in use - builder.addRoute("fc00::", 18) //Xray-core default FakeIPv6 Pool + builder.addRoute("2000::", 3) // Currently only 1/8 of total IPv6 is in use + builder.addRoute("fc00::", 18) // Xray-core default FakeIPv6 Pool } else { builder.addRoute("::", 0) } } - -// if (MmkvManager.decodeSettingsBool(AppConfig.PREF_LOCAL_DNS_ENABLED) == true) { -// builder.addDnsServer(PRIVATE_VLAN4_ROUTER) -// } else { - SettingsManager.getVpnDnsServers() - .forEach { - if (Utils.isPureIpAddress(it)) { - builder.addDnsServer(it) - } + + // Configure DNS servers + //if (MmkvManager.decodeSettingsBool(AppConfig.PREF_LOCAL_DNS_ENABLED) == true) { + // builder.addDnsServer(PRIVATE_VLAN4_ROUTER) + //} else { + SettingsManager.getVpnDnsServers().forEach { + if (Utils.isPureIpAddress(it)) { + builder.addDnsServer(it) } -// } - - builder.setSession(V2RayServiceManager.getRunningServerName()) - - configurePerAppProxy(builder) - - // Close the old interface since the parameters have been changed. - try { - mInterface.close() - } catch (ignored: Exception) { - // ignored } - + + builder.setSession(V2RayServiceManager.getRunningServerName()) + } + + /** + * Configures platform-specific VPN features for different Android versions. + * + * @param builder The VPN Builder to configure + */ + private fun configurePlatformFeatures(builder: Builder) { + // Android P (API 28) and above: Configure network callbacks if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { try { connectivity.requestNetwork(defaultNetworkRequest, defaultNetworkCallback) @@ -210,25 +236,14 @@ class V2RayVpnService : VpnService(), ServiceControl { Log.e(AppConfig.TAG, "Failed to request default network", e) } } - + + // Android Q (API 29) and above: Configure metering and HTTP proxy if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { builder.setMetered(false) if (MmkvManager.decodeSettingsBool(AppConfig.PREF_APPEND_HTTP_PROXY)) { builder.setHttpProxy(ProxyInfo.buildDirectProxy(LOOPBACK, SettingsManager.getHttpPort())) } } - - // Create a new interface using the builder and save the parameters. - try { - mInterface = builder.establish()!! - isRunning = true - return true - } catch (e: Exception) { - // non-nullable lateinit var - Log.e(AppConfig.TAG, "Failed to establish VPN interface", e) - stopV2Ray() - } - return false } /** @@ -281,79 +296,13 @@ class V2RayVpnService : VpnService(), ServiceControl { * Starts the tun2socks process with the appropriate parameters. */ private fun runTun2socks() { - Log.i(AppConfig.TAG, "Start run $TUN2SOCKS") - val socksPort = SettingsManager.getSocksPort() - val vpnConfig = SettingsManager.getCurrentVpnInterfaceAddressConfig() - val cmd = arrayListOf( - File(applicationContext.applicationInfo.nativeLibraryDir, TUN2SOCKS).absolutePath, - "--netif-ipaddr", vpnConfig.ipv4Router, - "--netif-netmask", "255.255.255.252", - "--socks-server-addr", "$LOOPBACK:${socksPort}", - "--tunmtu", VPN_MTU.toString(), - "--sock-path", "sock_path",//File(applicationContext.filesDir, "sock_path").absolutePath, - "--enable-udprelay", - "--loglevel", "notice" - ) - - if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PREFER_IPV6)) { - cmd.add("--netif-ip6addr") - cmd.add(vpnConfig.ipv6Router) - } - if (MmkvManager.decodeSettingsBool(AppConfig.PREF_LOCAL_DNS_ENABLED)) { - val localDnsPort = Utils.parseInt(MmkvManager.decodeSettingsString(AppConfig.PREF_LOCAL_DNS_PORT), AppConfig.PORT_LOCAL_DNS.toInt()) - cmd.add("--dnsgw") - cmd.add("$LOOPBACK:${localDnsPort}") - } - Log.i(AppConfig.TAG, cmd.toString()) - - try { - val proBuilder = ProcessBuilder(cmd) - proBuilder.redirectErrorStream(true) - process = proBuilder - .directory(applicationContext.filesDir) - .start() - Thread { - Log.i(AppConfig.TAG, "$TUN2SOCKS check") - process.waitFor() - Log.i(AppConfig.TAG, "$TUN2SOCKS exited") - if (isRunning) { - Log.i(AppConfig.TAG, "$TUN2SOCKS restart") - runTun2socks() - } - }.start() - Log.i(AppConfig.TAG, "$TUN2SOCKS process info : ${process.toString()}") - - sendFd() - } catch (e: Exception) { - Log.e(AppConfig.TAG, "Failed to start $TUN2SOCKS process", e) - } - } - - /** - * Sends the file descriptor to the tun2socks process. - * Attempts to send the file descriptor multiple times if necessary. - */ - private fun sendFd() { - val fd = mInterface.fileDescriptor - val path = File(applicationContext.filesDir, "sock_path").absolutePath - Log.i(AppConfig.TAG, "LocalSocket path : $path") - - CoroutineScope(Dispatchers.IO).launch { - var tries = 0 - while (true) try { - Thread.sleep(50L shl tries) - Log.i(AppConfig.TAG, "LocalSocket sendFd tries: $tries") - LocalSocket().use { localSocket -> - localSocket.connect(LocalSocketAddress(path, LocalSocketAddress.Namespace.FILESYSTEM)) - localSocket.setFileDescriptorsForSend(arrayOf(fd)) - localSocket.outputStream.write(42) - } - break - } catch (e: Exception) { - Log.e(AppConfig.TAG, "Failed to send file descriptor, try: $tries", e) - if (tries > 5) break - tries += 1 - } + tun2SocksService = Tun2SocksService( + context = applicationContext, + vpnInterface = mInterface, + isRunningProvider = { isRunning }, + restartCallback = { runTun2socks() } + ).also { + it.startTun2Socks() } } @@ -375,12 +324,8 @@ class V2RayVpnService : VpnService(), ServiceControl { } } - try { - Log.i(AppConfig.TAG, "$TUN2SOCKS destroy") - process.destroy() - } catch (e: Exception) { - Log.e(AppConfig.TAG, "Failed to destroy $TUN2SOCKS process", e) - } + tun2SocksService?.stopTun2Socks() + tun2SocksService = null V2RayServiceManager.stopCoreLoop() @@ -400,3 +345,4 @@ class V2RayVpnService : VpnService(), ServiceControl { } } } + diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt index 610af8ece9..7690b97c1e 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt @@ -38,7 +38,7 @@ import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MigrateManager import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.helper.SimpleItemTouchHelperCallback -import com.v2ray.ang.service.V2RayServiceManager +import com.v2ray.ang.handler.V2RayServiceManager import com.v2ray.ang.util.Utils import com.v2ray.ang.viewmodel.MainViewModel import kotlinx.coroutines.Dispatchers diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt index e7ea62116f..4980ec62e5 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt @@ -26,7 +26,7 @@ import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.helper.ItemTouchHelperAdapter import com.v2ray.ang.helper.ItemTouchHelperViewHolder -import com.v2ray.ang.service.V2RayServiceManager +import com.v2ray.ang.handler.V2RayServiceManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScSwitchActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScSwitchActivity.kt index 0495318a59..b75ae56621 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScSwitchActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScSwitchActivity.kt @@ -2,7 +2,7 @@ package com.v2ray.ang.ui import android.os.Bundle import com.v2ray.ang.R -import com.v2ray.ang.service.V2RayServiceManager +import com.v2ray.ang.handler.V2RayServiceManager class ScSwitchActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt index ef20f6b359..ad270c33b9 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt @@ -18,7 +18,7 @@ import com.v2ray.ang.AppConfig.VPN import com.v2ray.ang.R import com.v2ray.ang.extension.toLongEx import com.v2ray.ang.handler.MmkvManager -import com.v2ray.ang.service.SubscriptionUpdater +import com.v2ray.ang.handler.SubscriptionUpdater import com.v2ray.ang.util.Utils import com.v2ray.ang.viewmodel.SettingsViewModel import java.util.concurrent.TimeUnit diff --git a/v2rayng/V2rayNG/gradle/libs.versions.toml b/v2rayng/V2rayNG/gradle/libs.versions.toml index 587eeabac5..75d217fd0b 100644 --- a/v2rayng/V2rayNG/gradle/libs.versions.toml +++ b/v2rayng/V2rayNG/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.10.1" +agp = "8.12.0" desugarJdkLibs = "2.1.5" gradleLicensePlugin = "0.9.8" kotlin = "2.1.21" diff --git a/v2rayng/hysteria/app/cmd/client.go b/v2rayng/hysteria/app/cmd/client.go index 65bc7e0c71..05fec80c9c 100644 --- a/v2rayng/hysteria/app/cmd/client.go +++ b/v2rayng/hysteria/app/cmd/client.go @@ -470,8 +470,10 @@ func runClient(cmd *cobra.Command, args []string) { defer c.Close() uri := config.URI() - logger.Info("use this URI to share your server", zap.String("uri", uri)) if showQR { + logger.Warn("--qr flag is deprecated and will be removed in future release, " + + "please use `share` subcommand to generate share URI and QR code") + logger.Info("use this URI to share your server", zap.String("uri", uri)) utils.PrintQR(uri) } diff --git a/v2rayng/hysteria/app/go.mod b/v2rayng/hysteria/app/go.mod index d8a68a2580..6826596753 100644 --- a/v2rayng/hysteria/app/go.mod +++ b/v2rayng/hysteria/app/go.mod @@ -8,7 +8,7 @@ require ( github.com/apernet/go-tproxy v0.0.0-20230809025308-8f4723fd742f github.com/apernet/hysteria/core/v2 v2.0.0-00010101000000-000000000000 github.com/apernet/hysteria/extras/v2 v2.0.0-00010101000000-000000000000 - github.com/apernet/sing-tun v0.2.6-0.20240323130332-b9f6511036ad + github.com/apernet/sing-tun v0.2.6-0.20250726070404-c99085f9af13 github.com/caddyserver/certmagic v0.17.2 github.com/libdns/cloudflare v0.1.1 github.com/libdns/duckdns v0.2.0 @@ -30,7 +30,7 @@ require ( require ( github.com/andybalholm/brotli v1.1.0 // indirect - github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a // indirect + github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 // indirect github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6 // indirect github.com/cloudflare/circl v1.3.9 // indirect github.com/database64128/netx-go v0.0.0-20240905055117-62795b8b054a // indirect diff --git a/v2rayng/hysteria/app/go.sum b/v2rayng/hysteria/app/go.sum index bbacee8162..58dc0a7bcd 100644 --- a/v2rayng/hysteria/app/go.sum +++ b/v2rayng/hysteria/app/go.sum @@ -42,10 +42,10 @@ github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1 github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/apernet/go-tproxy v0.0.0-20230809025308-8f4723fd742f h1:uVh0qpEslrWjgzx9vOcyCqsOY3c9kofDZ1n+qaw35ZY= github.com/apernet/go-tproxy v0.0.0-20230809025308-8f4723fd742f/go.mod h1:xkkq9D4ygcldQQhKS/w9CadiCKwCngU7K9E3DaKahpM= -github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a h1:3UksCgxkac5L2hSbs3rZZVIOSX0EMQEg3K0HtTCoois= -github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= -github.com/apernet/sing-tun v0.2.6-0.20240323130332-b9f6511036ad h1:QzQ2sKpc9o42HNRR8ukM5uMC/RzR2HgZd/Nvaqol2C0= -github.com/apernet/sing-tun v0.2.6-0.20240323130332-b9f6511036ad/go.mod h1:S5IydyLSN/QAfvY+r2GoomPJ6hidtXWm/Ad18sJVssk= +github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 h1:9/jM7e+kVALd7Jfu1c27dcEpT/Fd/Gzq2OsQjKjakKI= +github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= +github.com/apernet/sing-tun v0.2.6-0.20250726070404-c99085f9af13 h1:gzets97c/u5iMj1zjanMBVkIYOdaVw+RXPzTT1xQoyM= +github.com/apernet/sing-tun v0.2.6-0.20250726070404-c99085f9af13/go.mod h1:S5IydyLSN/QAfvY+r2GoomPJ6hidtXWm/Ad18sJVssk= github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6 h1:4NNbNM2Iq/k57qEu7WfL67UrbPq1uFWxW4qODCohi+0= github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6/go.mod h1:J29hk+f9lJrblVIfiJOtTFk+OblBawmib4uz/VdKzlg= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= diff --git a/v2rayng/hysteria/app/internal/tun/server.go b/v2rayng/hysteria/app/internal/tun/server.go index a999051bbe..c9ad011bcf 100644 --- a/v2rayng/hysteria/app/internal/tun/server.go +++ b/v2rayng/hysteria/app/internal/tun/server.go @@ -123,11 +123,7 @@ func (t *tunHandler) NewConnection(ctx context.Context, conn net.Conn, m metadat defer rc.Close() // start forwarding - copyErrChan := make(chan error, 3) - go func() { - <-ctx.Done() - copyErrChan <- ctx.Err() - }() + copyErrChan := make(chan error, 2) go func() { _, copyErr := io.Copy(rc, conn) copyErrChan <- copyErr @@ -136,7 +132,11 @@ func (t *tunHandler) NewConnection(ctx context.Context, conn net.Conn, m metadat _, copyErr := io.Copy(conn, rc) copyErrChan <- copyErr }() - closeErr = <-copyErrChan + select { + case <-ctx.Done(): + closeErr = ctx.Err() + case closeErr = <-copyErrChan: + } return nil } @@ -160,11 +160,7 @@ func (t *tunHandler) NewPacketConnection(ctx context.Context, conn network.Packe defer rc.Close() // start forwarding - copyErrChan := make(chan error, 3) - go func() { - <-ctx.Done() - copyErrChan <- ctx.Err() - }() + copyErrChan := make(chan error, 2) // local <- remote go func() { for { @@ -205,7 +201,11 @@ func (t *tunHandler) NewPacketConnection(ctx context.Context, conn network.Packe } } }() - closeErr = <-copyErrChan + select { + case <-ctx.Done(): + closeErr = ctx.Err() + case closeErr = <-copyErrChan: + } return nil } diff --git a/v2rayng/hysteria/core/client/client.go b/v2rayng/hysteria/core/client/client.go index b9ad4335b3..3691d1e8df 100644 --- a/v2rayng/hysteria/core/client/client.go +++ b/v2rayng/hysteria/core/client/client.go @@ -84,6 +84,7 @@ func (c *clientImpl) connect() (*HandshakeInfo, error) { KeepAlivePeriod: c.config.QUICConfig.KeepAlivePeriod, DisablePathMTUDiscovery: c.config.QUICConfig.DisablePathMTUDiscovery, EnableDatagrams: true, + DisablePathManager: true, } // Prepare RoundTripper var conn quic.EarlyConnection diff --git a/v2rayng/hysteria/core/go.mod b/v2rayng/hysteria/core/go.mod index 68eed0449c..a6ba575424 100644 --- a/v2rayng/hysteria/core/go.mod +++ b/v2rayng/hysteria/core/go.mod @@ -5,7 +5,7 @@ go 1.23 toolchain go1.24.2 require ( - github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a + github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 github.com/stretchr/testify v1.9.0 go.uber.org/goleak v1.2.1 golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 diff --git a/v2rayng/hysteria/core/go.sum b/v2rayng/hysteria/core/go.sum index 957f4c58ea..f44407de06 100644 --- a/v2rayng/hysteria/core/go.sum +++ b/v2rayng/hysteria/core/go.sum @@ -1,5 +1,5 @@ -github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a h1:3UksCgxkac5L2hSbs3rZZVIOSX0EMQEg3K0HtTCoois= -github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= +github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 h1:9/jM7e+kVALd7Jfu1c27dcEpT/Fd/Gzq2OsQjKjakKI= +github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= diff --git a/v2rayng/hysteria/core/server/server.go b/v2rayng/hysteria/core/server/server.go index 696f1d0956..89645e094c 100644 --- a/v2rayng/hysteria/core/server/server.go +++ b/v2rayng/hysteria/core/server/server.go @@ -43,6 +43,7 @@ func NewServer(config *Config) (Server, error) { MaxIncomingStreams: config.QUICConfig.MaxIncomingStreams, DisablePathMTUDiscovery: config.QUICConfig.DisablePathMTUDiscovery, EnableDatagrams: true, + DisablePathManager: true, } listener, err := quic.Listen(config.Conn, tlsConfig, quicConfig) if err != nil { diff --git a/v2rayng/hysteria/extras/go.mod b/v2rayng/hysteria/extras/go.mod index 19f1ffcb42..23b060a794 100644 --- a/v2rayng/hysteria/extras/go.mod +++ b/v2rayng/hysteria/extras/go.mod @@ -6,7 +6,7 @@ toolchain go1.24.2 require ( github.com/apernet/hysteria/core/v2 v2.0.0-00010101000000-000000000000 - github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a + github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6 github.com/database64128/tfo-go/v2 v2.2.2 github.com/hashicorp/golang-lru/v2 v2.0.5 diff --git a/v2rayng/hysteria/extras/go.sum b/v2rayng/hysteria/extras/go.sum index 84575698e0..ac6d04a82e 100644 --- a/v2rayng/hysteria/extras/go.sum +++ b/v2rayng/hysteria/extras/go.sum @@ -1,7 +1,7 @@ github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= -github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a h1:3UksCgxkac5L2hSbs3rZZVIOSX0EMQEg3K0HtTCoois= -github.com/apernet/quic-go v0.51.1-0.20250420212127-ede9b032759a/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= +github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431 h1:9/jM7e+kVALd7Jfu1c27dcEpT/Fd/Gzq2OsQjKjakKI= +github.com/apernet/quic-go v0.52.1-0.20250607183305-9320c9d14431/go.mod h1:I/47OIGG5H/IfAm+nz2c6hm6b/NkEhpvptAoiPcY7jQ= github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6 h1:4NNbNM2Iq/k57qEu7WfL67UrbPq1uFWxW4qODCohi+0= github.com/babolivier/go-doh-client v0.0.0-20201028162107-a76cff4cb8b6/go.mod h1:J29hk+f9lJrblVIfiJOtTFk+OblBawmib4uz/VdKzlg= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= diff --git a/xray-core/infra/conf/dokodemo.go b/xray-core/infra/conf/dokodemo.go index a88ef4cd7f..781d5222a7 100644 --- a/xray-core/infra/conf/dokodemo.go +++ b/xray-core/infra/conf/dokodemo.go @@ -1,16 +1,19 @@ package conf import ( + "github.com/xtls/xray-core/common/errors" + "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/proxy/dokodemo" "google.golang.org/protobuf/proto" ) type DokodemoConfig struct { - Address *Address `json:"address"` - Port uint16 `json:"port"` - Network *NetworkList `json:"network"` - FollowRedirect bool `json:"followRedirect"` - UserLevel uint32 `json:"userLevel"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + PortMap map[string]string `json:"portMap"` + Network *NetworkList `json:"network"` + FollowRedirect bool `json:"followRedirect"` + UserLevel uint32 `json:"userLevel"` } func (v *DokodemoConfig) Build() (proto.Message, error) { @@ -19,6 +22,12 @@ func (v *DokodemoConfig) Build() (proto.Message, error) { config.Address = v.Address.Build() } config.Port = uint32(v.Port) + config.PortMap = v.PortMap + for _, v := range config.PortMap { + if _, _, err := net.SplitHostPort(v); err != nil { + return nil, errors.New("invalid portMap: ", v).Base(err) + } + } config.Networks = v.Network.Build() config.FollowRedirect = v.FollowRedirect config.UserLevel = v.UserLevel diff --git a/xray-core/infra/conf/transport_internet.go b/xray-core/infra/conf/transport_internet.go index 90f53fac8e..775f61e262 100644 --- a/xray-core/infra/conf/transport_internet.go +++ b/xray-core/infra/conf/transport_internet.go @@ -415,6 +415,7 @@ type TLSConfig struct { ECHServerKeys string `json:"echServerKeys"` ECHConfigList string `json:"echConfigList"` ECHForceQuery bool `json:"echForceQuery"` + ECHSocketSettings *SocketConfig `json:"echSockopt"` } // Build implements Buildable. @@ -438,7 +439,7 @@ func (c *TLSConfig) Build() (proto.Message, error) { } if len(config.NextProtocol) > 1 { for _, p := range config.NextProtocol { - if tcp.IsFromMitm(p) { + if tls.IsFromMitm(p) { return nil, errors.New(`only one element is allowed in "alpn" when using "fromMitm" in it`) } } @@ -495,6 +496,13 @@ func (c *TLSConfig) Build() (proto.Message, error) { } config.EchForceQuery = c.ECHForceQuery config.EchConfigList = c.ECHConfigList + if c.ECHSocketSettings != nil { + ss, err := c.ECHSocketSettings.Build() + if err != nil { + return nil, errors.New("Failed to build ech sockopt.").Base(err) + } + config.EchSocketSettings = ss + } return config, nil } diff --git a/xray-core/proxy/dokodemo/config.pb.go b/xray-core/proxy/dokodemo/config.pb.go index b30c123e40..1596ea8252 100644 --- a/xray-core/proxy/dokodemo/config.pb.go +++ b/xray-core/proxy/dokodemo/config.pb.go @@ -26,8 +26,9 @@ type Config struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` + Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` + PortMap map[string]string `protobuf:"bytes,3,rep,name=port_map,json=portMap,proto3" json:"port_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // List of networks that the Dokodemo accepts. Networks []net.Network `protobuf:"varint,7,rep,packed,name=networks,proto3,enum=xray.common.net.Network" json:"networks,omitempty"` FollowRedirect bool `protobuf:"varint,5,opt,name=follow_redirect,json=followRedirect,proto3" json:"follow_redirect,omitempty"` @@ -78,6 +79,13 @@ func (x *Config) GetPort() uint32 { return 0 } +func (x *Config) GetPortMap() map[string]string { + if x != nil { + return x.PortMap + } + return nil +} + func (x *Config) GetNetworks() []net.Network { if x != nil { return x.Networks @@ -108,26 +116,34 @@ var file_proxy_dokodemo_config_proto_rawDesc = []byte{ 0x6d, 0x6f, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd1, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd2, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x08, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, - 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x66, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x5b, 0x0a, 0x17, 0x63, 0x6f, - 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6f, 0x6b, - 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x50, 0x01, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, - 0x6f, 0xaa, 0x02, 0x13, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x44, - 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x43, 0x0a, 0x08, + 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6f, 0x6b, 0x6f, + 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x6f, 0x72, 0x74, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, + 0x70, 0x12, 0x34, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, + 0x3a, 0x0a, 0x0c, 0x50, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x5b, 0x0a, 0x17, 0x63, + 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6f, + 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x50, 0x01, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6f, 0x6b, 0x6f, 0x64, 0x65, + 0x6d, 0x6f, 0xaa, 0x02, 0x13, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x44, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -142,20 +158,22 @@ func file_proxy_dokodemo_config_proto_rawDescGZIP() []byte { return file_proxy_dokodemo_config_proto_rawDescData } -var file_proxy_dokodemo_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_proxy_dokodemo_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_proxy_dokodemo_config_proto_goTypes = []any{ (*Config)(nil), // 0: xray.proxy.dokodemo.Config - (*net.IPOrDomain)(nil), // 1: xray.common.net.IPOrDomain - (net.Network)(0), // 2: xray.common.net.Network + nil, // 1: xray.proxy.dokodemo.Config.PortMapEntry + (*net.IPOrDomain)(nil), // 2: xray.common.net.IPOrDomain + (net.Network)(0), // 3: xray.common.net.Network } var file_proxy_dokodemo_config_proto_depIdxs = []int32{ - 1, // 0: xray.proxy.dokodemo.Config.address:type_name -> xray.common.net.IPOrDomain - 2, // 1: xray.proxy.dokodemo.Config.networks:type_name -> xray.common.net.Network - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 2, // 0: xray.proxy.dokodemo.Config.address:type_name -> xray.common.net.IPOrDomain + 1, // 1: xray.proxy.dokodemo.Config.port_map:type_name -> xray.proxy.dokodemo.Config.PortMapEntry + 3, // 2: xray.proxy.dokodemo.Config.networks:type_name -> xray.common.net.Network + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_proxy_dokodemo_config_proto_init() } @@ -169,7 +187,7 @@ func file_proxy_dokodemo_config_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_dokodemo_config_proto_rawDesc, NumEnums: 0, - NumMessages: 1, + NumMessages: 2, NumExtensions: 0, NumServices: 0, }, diff --git a/xray-core/proxy/dokodemo/config.proto b/xray-core/proxy/dokodemo/config.proto index 2b60ea6ff7..4200893206 100644 --- a/xray-core/proxy/dokodemo/config.proto +++ b/xray-core/proxy/dokodemo/config.proto @@ -13,6 +13,8 @@ message Config { xray.common.net.IPOrDomain address = 1; uint32 port = 2; + map port_map = 3; + // List of networks that the Dokodemo accepts. repeated xray.common.net.Network networks = 7; diff --git a/xray-core/proxy/dokodemo/dokodemo.go b/xray-core/proxy/dokodemo/dokodemo.go index 7065889820..2a467d9b52 100644 --- a/xray-core/proxy/dokodemo/dokodemo.go +++ b/xray-core/proxy/dokodemo/dokodemo.go @@ -38,6 +38,7 @@ type DokodemoDoor struct { config *Config address net.Address port net.Port + portMap map[string]string sockopt *session.Sockopt } @@ -49,6 +50,7 @@ func (d *DokodemoDoor) Init(config *Config, pm policy.Manager, sockopt *session. d.config = config d.address = config.GetPredefinedAddress() d.port = net.Port(config.Port) + d.portMap = config.PortMap d.policyManager = pm d.sockopt = sockopt @@ -91,7 +93,15 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn st if dest.Port == 0 { dest.Port = net.Port(common.Must2(strconv.Atoi(port)).(int)) } - + if d.portMap != nil && d.portMap[port] != "" { + h, p, _ := net.SplitHostPort(d.portMap[port]) + if len(h) > 0 { + dest.Address = net.ParseAddress(h) + } + if len(p) > 0 { + dest.Port = net.Port(common.Must2(strconv.Atoi(p)).(int)) + } + } } destinationOverridden := false diff --git a/xray-core/transport/internet/tcp/dialer.go b/xray-core/transport/internet/tcp/dialer.go index 63b9d6276a..65bacf3a75 100644 --- a/xray-core/transport/internet/tcp/dialer.go +++ b/xray-core/transport/internet/tcp/dialer.go @@ -2,6 +2,7 @@ package tcp import ( "context" + gotls "crypto/tls" "slices" "strings" @@ -15,10 +16,6 @@ import ( "github.com/xtls/xray-core/transport/internet/tls" ) -func IsFromMitm(str string) bool { - return strings.ToLower(str) == "frommitm" -} - // Dial dials a new TCP connection to the given destination. func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) { errors.LogInfo(ctx, "dialing TCP to ", dest) @@ -30,14 +27,17 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { mitmServerName := session.MitmServerNameFromContext(ctx) mitmAlpn11 := session.MitmAlpn11FromContext(ctx) - tlsConfig := config.GetTLSConfig(tls.WithDestination(dest)) - if IsFromMitm(tlsConfig.ServerName) { - tlsConfig.ServerName = mitmServerName + var tlsConfig *gotls.Config + if tls.IsFromMitm(config.ServerName) { + tlsConfig = config.GetTLSConfig(tls.WithOverrideName(mitmServerName)) + } else { + tlsConfig = config.GetTLSConfig(tls.WithDestination(dest)) } + isFromMitmVerify := false if r, ok := tlsConfig.Rand.(*tls.RandCarrier); ok && len(r.VerifyPeerCertInNames) > 0 { for i, name := range r.VerifyPeerCertInNames { - if IsFromMitm(name) { + if tls.IsFromMitm(name) { isFromMitmVerify = true r.VerifyPeerCertInNames[0], r.VerifyPeerCertInNames[i] = r.VerifyPeerCertInNames[i], r.VerifyPeerCertInNames[0] r.VerifyPeerCertInNames = r.VerifyPeerCertInNames[1:] @@ -56,7 +56,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me } } } - isFromMitmAlpn := len(tlsConfig.NextProtos) == 1 && IsFromMitm(tlsConfig.NextProtos[0]) + isFromMitmAlpn := len(tlsConfig.NextProtos) == 1 && tls.IsFromMitm(tlsConfig.NextProtos[0]) if isFromMitmAlpn { if mitmAlpn11 { tlsConfig.NextProtos[0] = "http/1.1" diff --git a/xray-core/transport/internet/tls/config.go b/xray-core/transport/internet/tls/config.go index cb030776c9..4f7700ca28 100644 --- a/xray-core/transport/internet/tls/config.go +++ b/xray-core/transport/internet/tls/config.go @@ -8,6 +8,7 @@ import ( "crypto/tls" "crypto/x509" "encoding/base64" + "github.com/xtls/xray-core/features/dns" "os" "slices" "strings" @@ -275,6 +276,9 @@ func getNewGetCertificateFunc(certs []*tls.Certificate, rejectUnknownSNI bool) f } func (c *Config) parseServerName() string { + if IsFromMitm(c.ServerName) { + return "" + } return c.ServerName } @@ -447,7 +451,11 @@ func (c *Config) GetTLSConfig(opts ...Option) *tls.Config { if len(c.EchConfigList) > 0 || len(c.EchServerKeys) > 0 { err := ApplyECH(c, config) if err != nil { - errors.LogError(context.Background(), err) + if c.EchForceQuery || errors.Cause(err) != dns.ErrEmptyResponse { + errors.LogError(context.Background(), err) + } else { + errors.LogInfo(context.Background(), err) + } } } @@ -469,6 +477,12 @@ func WithDestination(dest net.Destination) Option { } } +func WithOverrideName(serverName string) Option { + return func(config *tls.Config) { + config.ServerName = serverName + } +} + // WithNextProto sets the ALPN values in TLS config. func WithNextProto(protocol ...string) Option { return func(config *tls.Config) { @@ -509,3 +523,7 @@ func ParseCurveName(curveNames []string) []tls.CurveID { } return curveIDs } + +func IsFromMitm(str string) bool { + return strings.ToLower(str) == "frommitm" +} diff --git a/xray-core/transport/internet/tls/config.pb.go b/xray-core/transport/internet/tls/config.pb.go index c7944ae08e..c30d5ef3c7 100644 --- a/xray-core/transport/internet/tls/config.pb.go +++ b/xray-core/transport/internet/tls/config.pb.go @@ -7,6 +7,7 @@ package tls import ( + internet "github.com/xtls/xray-core/transport/internet" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -216,10 +217,11 @@ type Config struct { // @Document Replaces server_name to verify the peer cert. // @Document After allow_insecure (automatically), if the server's cert can't be verified by any of these names, pinned_peer_certificate_chain_sha256 will be tried. // @Critical - VerifyPeerCertInNames []string `protobuf:"bytes,17,rep,name=verify_peer_cert_in_names,json=verifyPeerCertInNames,proto3" json:"verify_peer_cert_in_names,omitempty"` - EchServerKeys []byte `protobuf:"bytes,18,opt,name=ech_server_keys,json=echServerKeys,proto3" json:"ech_server_keys,omitempty"` - EchConfigList string `protobuf:"bytes,19,opt,name=ech_config_list,json=echConfigList,proto3" json:"ech_config_list,omitempty"` - EchForceQuery bool `protobuf:"varint,20,opt,name=ech_force_query,json=echForceQuery,proto3" json:"ech_force_query,omitempty"` + VerifyPeerCertInNames []string `protobuf:"bytes,17,rep,name=verify_peer_cert_in_names,json=verifyPeerCertInNames,proto3" json:"verify_peer_cert_in_names,omitempty"` + EchServerKeys []byte `protobuf:"bytes,18,opt,name=ech_server_keys,json=echServerKeys,proto3" json:"ech_server_keys,omitempty"` + EchConfigList string `protobuf:"bytes,19,opt,name=ech_config_list,json=echConfigList,proto3" json:"ech_config_list,omitempty"` + EchForceQuery bool `protobuf:"varint,20,opt,name=ech_force_query,json=echForceQuery,proto3" json:"ech_force_query,omitempty"` + EchSocketSettings *internet.SocketConfig `protobuf:"bytes,21,opt,name=ech_socket_settings,json=echSocketSettings,proto3" json:"ech_socket_settings,omitempty"` } func (x *Config) Reset() { @@ -385,6 +387,13 @@ func (x *Config) GetEchForceQuery() bool { return false } +func (x *Config) GetEchSocketSettings() *internet.SocketConfig { + if x != nil { + return x.EchSocketSettings + } + return nil +} + var File_transport_internet_tls_config_proto protoreflect.FileDescriptor var file_transport_internet_tls_config_proto_rawDesc = []byte{ @@ -392,96 +401,104 @@ var file_transport_internet_tls_config_proto_rawDesc = []byte{ 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1b, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, - 0x6c, 0x73, 0x22, 0x83, 0x03, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, - 0x74, 0x6c, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x6f, 0x63, 0x73, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6f, 0x63, 0x73, 0x70, 0x53, 0x74, 0x61, 0x70, 0x6c, 0x69, 0x6e, - 0x67, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x4f, 0x6e, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x4f, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, - 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x22, 0x44, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x45, - 0x4e, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x14, 0x0a, - 0x10, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, - 0x59, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59, - 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, 0x02, 0x22, 0x92, 0x07, 0x0a, 0x06, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x73, - 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x63, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, - 0x6e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x3a, 0x0a, 0x19, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x17, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, - 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x6d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x69, - 0x70, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x6e, 0x69, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, - 0x65, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x6e, 0x69, 0x12, - 0x4e, 0x0a, 0x24, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x20, 0x70, - 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x12, - 0x57, 0x0a, 0x29, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x24, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x67, 0x12, 0x2b, - 0x0a, 0x11, 0x63, 0x75, 0x72, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x76, 0x65, - 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x19, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, - 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x65, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x49, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, - 0x65, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x65, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x63, 0x68, 0x5f, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x65, 0x63, 0x68, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x73, 0x0a, - 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, - 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, - 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x2f, 0x74, 0x6c, 0x73, 0xaa, 0x02, 0x1b, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, - 0x6c, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x73, 0x1a, 0x1f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x83, 0x03, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x6f, 0x63, 0x73, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6f, 0x63, 0x73, 0x70, 0x53, 0x74, 0x61, 0x70, 0x6c, 0x69, + 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x4f, 0x6e, 0x65, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x4f, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x22, 0x44, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x45, 0x4e, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x14, + 0x0a, 0x10, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x56, 0x45, 0x52, 0x49, + 0x46, 0x59, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, + 0x59, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, 0x02, 0x22, 0xe9, 0x07, 0x0a, 0x06, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x63, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x63, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74, + 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x3a, 0x0a, + 0x19, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x72, 0x65, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x17, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x6f, 0x6f, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x6d, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x6d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, + 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, + 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x6e, 0x69, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x6e, 0x69, + 0x12, 0x4e, 0x0a, 0x24, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x20, + 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, + 0x12, 0x57, 0x0a, 0x29, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x18, 0x0e, 0x20, + 0x03, 0x28, 0x0c, 0x52, 0x24, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x67, 0x12, + 0x2b, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x76, + 0x65, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x19, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x63, 0x65, 0x72, 0x74, + 0x5f, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x15, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x65, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x49, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x63, 0x68, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0d, 0x65, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x26, + 0x0a, 0x0f, 0x65, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x63, 0x68, 0x5f, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x65, 0x63, 0x68, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x55, + 0x0a, 0x13, 0x65, 0x63, 0x68, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x72, + 0x61, 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x11, 0x65, 0x63, 0x68, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x73, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, + 0x79, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, + 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x74, 0x6c, 0x73, 0xaa, 0x02, 0x1b, 0x58, + 0x72, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x6c, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -499,18 +516,20 @@ func file_transport_internet_tls_config_proto_rawDescGZIP() []byte { var file_transport_internet_tls_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_transport_internet_tls_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_transport_internet_tls_config_proto_goTypes = []any{ - (Certificate_Usage)(0), // 0: xray.transport.internet.tls.Certificate.Usage - (*Certificate)(nil), // 1: xray.transport.internet.tls.Certificate - (*Config)(nil), // 2: xray.transport.internet.tls.Config + (Certificate_Usage)(0), // 0: xray.transport.internet.tls.Certificate.Usage + (*Certificate)(nil), // 1: xray.transport.internet.tls.Certificate + (*Config)(nil), // 2: xray.transport.internet.tls.Config + (*internet.SocketConfig)(nil), // 3: xray.transport.internet.SocketConfig } var file_transport_internet_tls_config_proto_depIdxs = []int32{ 0, // 0: xray.transport.internet.tls.Certificate.usage:type_name -> xray.transport.internet.tls.Certificate.Usage 1, // 1: xray.transport.internet.tls.Config.certificate:type_name -> xray.transport.internet.tls.Certificate - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 3, // 2: xray.transport.internet.tls.Config.ech_socket_settings:type_name -> xray.transport.internet.SocketConfig + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_transport_internet_tls_config_proto_init() } diff --git a/xray-core/transport/internet/tls/config.proto b/xray-core/transport/internet/tls/config.proto index 97c25d571a..c990633346 100644 --- a/xray-core/transport/internet/tls/config.proto +++ b/xray-core/transport/internet/tls/config.proto @@ -6,6 +6,8 @@ option go_package = "github.com/xtls/xray-core/transport/internet/tls"; option java_package = "com.xray.transport.internet.tls"; option java_multiple_files = true; +import "transport/internet/config.proto"; + message Certificate { // TLS certificate in x509 format. bytes certificate = 1; @@ -97,4 +99,6 @@ message Config { string ech_config_list = 19; bool ech_force_query = 20; -} \ No newline at end of file + + SocketConfig ech_socket_settings = 21; +} diff --git a/xray-core/transport/internet/tls/ech.go b/xray-core/transport/internet/tls/ech.go index 2a78fd2e4b..5069f06dd5 100644 --- a/xray-core/transport/internet/tls/ech.go +++ b/xray-core/transport/internet/tls/ech.go @@ -8,8 +8,14 @@ import ( "crypto/tls" "encoding/base64" "encoding/binary" + "fmt" + utls "github.com/refraction-networking/utls" + "github.com/xtls/xray-core/common/crypto" + dns2 "github.com/xtls/xray-core/features/dns" + "golang.org/x/net/http2" "io" "net/http" + "net/url" "strings" "sync" "sync/atomic" @@ -29,7 +35,10 @@ func ApplyECH(c *Config, config *tls.Config) error { var ECHConfig []byte var err error - nameToQuery := c.ServerName + var nameToQuery string + if net.ParseAddress(config.ServerName).Family().IsDomain() { + nameToQuery = config.ServerName + } var DNSServer string // for server @@ -69,9 +78,9 @@ func ApplyECH(c *Config, config *tls.Config) error { if nameToQuery == "" { return errors.New("Using DNS for ECH Config needs serverName or use Server format example.com+https://1.1.1.1/dns-query") } - ECHConfig, err = QueryRecord(nameToQuery, DNSServer, c.EchForceQuery) + ECHConfig, err = QueryRecord(nameToQuery, DNSServer, c.EchForceQuery, c.EchSocketSettings) if err != nil { - return err + return errors.New("Failed to query ECH DNS record for domain: ", nameToQuery, " at server: ", DNSServer).Base(err) } } else { ECHConfig, err = base64.StdEncoding.DecodeString(c.EchConfigList) @@ -105,7 +114,7 @@ var ( // Update updates the ECH config for given domain and server. // this method is concurrent safe, only one update request will be sent, others get the cache. // if isLockedUpdate is true, it will not try to acquire the lock. -func (c *ECHConfigCache) Update(domain string, server string, forceQuery bool, isLockedUpdate bool) ([]byte, error) { +func (c *ECHConfigCache) Update(domain string, server string, isLockedUpdate bool, forceQuery bool, sockopt *internet.SocketConfig) ([]byte, error) { if !isLockedUpdate { c.UpdateLock.Lock() defer c.UpdateLock.Unlock() @@ -118,32 +127,25 @@ func (c *ECHConfigCache) Update(domain string, server string, forceQuery bool, i } // Query ECH config from DNS server errors.LogDebug(context.Background(), "Trying to query ECH config for domain: ", domain, " with ECH server: ", server) - echConfig, ttl, err := dnsQuery(server, domain) + echConfig, ttl, err := dnsQuery(server, domain, sockopt) if err != nil { - if forceQuery { + if forceQuery || ttl == 0 { return nil, err - } else { - configRecord = &echConfigRecord{ - config: nil, - expire: time.Now().Add(10 * time.Minute), - err: err, - } - c.configRecord.Store(configRecord) - return echConfig, err } } configRecord = &echConfigRecord{ config: echConfig, expire: time.Now().Add(time.Duration(ttl) * time.Second), + err: err, } c.configRecord.Store(configRecord) - return configRecord.config, nil + return configRecord.config, configRecord.err } // QueryRecord returns the ECH config for given domain. // If the record is not in cache or expired, it will query the DNS server and update the cache. -func QueryRecord(domain string, server string, forceQuery bool) ([]byte, error) { - GlobalECHConfigCacheKey := domain + "|" + server +func QueryRecord(domain string, server string, forceQuery bool, sockopt *internet.SocketConfig) ([]byte, error) { + GlobalECHConfigCacheKey := domain + "|" + server + "|" + fmt.Sprintf("%p", sockopt) echConfigCache, ok := GlobalECHConfigCache.Load(GlobalECHConfigCacheKey) if !ok { echConfigCache = &ECHConfigCache{} @@ -160,27 +162,33 @@ func QueryRecord(domain string, server string, forceQuery bool) ([]byte, error) // otherwise return old value immediately and update in a goroutine // but if the cache is too old, wait for update if configRecord.expire == (time.Time{}) || configRecord.expire.Add(time.Hour*6).Before(time.Now()) { - return echConfigCache.Update(domain, server, false, forceQuery) + return echConfigCache.Update(domain, server, false, forceQuery, sockopt) } else { // If someone already acquired the lock, it means it is updating, do not start another update goroutine if echConfigCache.UpdateLock.TryLock() { go func() { defer echConfigCache.UpdateLock.Unlock() - echConfigCache.Update(domain, server, true, forceQuery) + echConfigCache.Update(domain, server, true, forceQuery, sockopt) }() } - return configRecord.config, nil + return configRecord.config, configRecord.err } } // dnsQuery is the real func for sending type65 query for given domain to given DNS server. // return ECH config, TTL and error -func dnsQuery(server string, domain string) ([]byte, uint32, error) { +func dnsQuery(server string, domain string, sockopt *internet.SocketConfig) ([]byte, uint32, error) { m := new(dns.Msg) var dnsResolve []byte m.SetQuestion(dns.Fqdn(domain), dns.TypeHTTPS) // for DOH server - if strings.HasPrefix(server, "https://") { + if strings.HasPrefix(server, "https://") || strings.HasPrefix(server, "h2c://") { + h2c := strings.HasPrefix(server, "h2c://") + m.SetEdns0(4096, false) // 4096 is the buffer size, false means no DNSSEC + padding := &dns.EDNS0_PADDING{Padding: make([]byte, int(crypto.RandBetween(100, 300)))} + if opt := m.IsEdns0(); opt != nil { + opt.Option = append(opt.Option, padding) + } // always 0 in DOH m.Id = 0 msg, err := m.Pack() @@ -188,21 +196,35 @@ func dnsQuery(server string, domain string) ([]byte, uint32, error) { return nil, 0, err } var client *http.Client - if client, _ = clientForECHDOH.Load(server); client == nil { + serverKey := server + "|" + fmt.Sprintf("%p", sockopt) + if client, _ = clientForECHDOH.Load(serverKey); client == nil { // All traffic sent by core should via xray's internet.DialSystem // This involves the behavior of some Android VPN GUI clients - tr := &http.Transport{ - IdleConnTimeout: 90 * time.Second, - ForceAttemptHTTP2: true, - DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + tr := &http2.Transport{ + IdleConnTimeout: net.ConnIdleTimeout, + ReadIdleTimeout: net.ChromeH2KeepAlivePeriod, + DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) { dest, err := net.ParseDestination(network + ":" + addr) if err != nil { return nil, err } - conn, err := internet.DialSystem(ctx, dest, nil) + var conn net.Conn + + conn, err = internet.DialSystem(ctx, dest, sockopt) if err != nil { return nil, err } + + if !h2c { + u, err := url.Parse(server) + if err != nil { + return nil, err + } + conn = utls.UClient(conn, &utls.Config{ServerName: u.Hostname()}, utls.HelloChrome_Auto) + if err := conn.(*utls.UConn).HandshakeContext(ctx); err != nil { + return nil, err + } + } return conn, nil }, } @@ -210,13 +232,15 @@ func dnsQuery(server string, domain string) ([]byte, uint32, error) { Timeout: 5 * time.Second, Transport: tr, } - client, _ = clientForECHDOH.LoadOrStore(server, c) + client, _ = clientForECHDOH.LoadOrStore(serverKey, c) } req, err := http.NewRequest("POST", server, bytes.NewReader(msg)) if err != nil { return nil, 0, err } + req.Header.Set("Accept", "application/dns-message") req.Header.Set("Content-Type", "application/dns-message") + req.Header.Set("X-Padding", strings.Repeat("X", int(crypto.RandBetween(100, 1000)))) resp, err := client.Do(req) if err != nil { return nil, 0, err @@ -243,16 +267,16 @@ func dnsQuery(server string, domain string) ([]byte, uint32, error) { dnsTimeoutCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // use xray's internet.DialSystem as mentioned above - conn, err := internet.DialSystem(dnsTimeoutCtx, dest, nil) + conn, err := internet.DialSystem(dnsTimeoutCtx, dest, sockopt) + if err != nil { + return nil, 0, err + } defer func() { err := conn.Close() if err != nil { errors.LogDebug(context.Background(), "Failed to close connection: ", err) } }() - if err != nil { - return nil, 0, err - } msg, err := m.Pack() if err != nil { return nil, 0, err @@ -283,7 +307,7 @@ func dnsQuery(server string, domain string) ([]byte, uint32, error) { } } } - return nil, 0, errors.New("no ech record found") + return nil, dns2.DefaultTTL, dns2.ErrEmptyResponse } // reference github.com/OmarTariq612/goech diff --git a/xray-core/transport/internet/tls/ech_test.go b/xray-core/transport/internet/tls/ech_test.go index 67aa67dffb..009e80a186 100644 --- a/xray-core/transport/internet/tls/ech_test.go +++ b/xray-core/transport/internet/tls/ech_test.go @@ -1,6 +1,7 @@ package tls import ( + "fmt" "io" "net/http" "strings" @@ -40,7 +41,7 @@ func TestECHDial(t *testing.T) { } wg.Wait() // check cache - echConfigCache, ok := GlobalECHConfigCache.Load("encryptedsni.com|udp://1.1.1.1") + echConfigCache, ok := GlobalECHConfigCache.Load("encryptedsni.com|udp://1.1.1.1" + "|" + fmt.Sprintf("%p", config.EchSocketSettings)) if !ok { t.Error("ECH config cache not found") @@ -74,7 +75,7 @@ func TestECHDialFail(t *testing.T) { _, err = io.ReadAll(resp.Body) common.Must(err) // check cache - echConfigCache, ok := GlobalECHConfigCache.Load("cloudflare.com|udp://1.1.1.1") + echConfigCache, ok := GlobalECHConfigCache.Load("cloudflare.com|udp://1.1.1.1" + "|" + fmt.Sprintf("%p", config.EchSocketSettings)) if !ok { t.Error("ECH config cache not found") } diff --git a/yt-dlp/yt_dlp/extractor/adobetv.py b/yt-dlp/yt_dlp/extractor/adobetv.py index 4608e5c13d..997e1b92cb 100644 --- a/yt-dlp/yt_dlp/extractor/adobetv.py +++ b/yt-dlp/yt_dlp/extractor/adobetv.py @@ -84,9 +84,10 @@ class AdobeTVBaseIE(InfoExtractor): class AdobeTVEmbedIE(AdobeTVBaseIE): + _WORKING = False IE_NAME = 'adobetv:embed' _VALID_URL = r'https?://tv\.adobe\.com/embed/\d+/(?P\d+)' - _TEST = { + _TESTS = [{ 'url': 'https://tv.adobe.com/embed/22/4153', 'md5': 'c8c0461bf04d54574fc2b4d07ac6783a', 'info_dict': { @@ -94,12 +95,12 @@ class AdobeTVEmbedIE(AdobeTVBaseIE): 'ext': 'flv', 'title': 'Creating Graphics Optimized for BlackBerry', 'description': 'md5:eac6e8dced38bdaae51cd94447927459', - 'thumbnail': r're:https?://.*\.jpg$', + 'thumbnail': r're:https?://.+\.jpg', 'upload_date': '20091109', 'duration': 377, 'view_count': int, }, - } + }] def _real_extract(self, url): video_id = self._match_id(url) @@ -110,10 +111,10 @@ class AdobeTVEmbedIE(AdobeTVBaseIE): class AdobeTVIE(AdobeTVBaseIE): + _WORKING = False IE_NAME = 'adobetv' _VALID_URL = r'https?://tv\.adobe\.com/(?:(?Pfr|de|es|jp)/)?watch/(?P[^/]+)/(?P[^/]+)' - - _TEST = { + _TESTS = [{ 'url': 'http://tv.adobe.com/watch/the-complete-picture-with-julieanne-kost/quick-tip-how-to-draw-a-circle-around-an-object-in-photoshop/', 'md5': '9bc5727bcdd55251f35ad311ca74fa1e', 'info_dict': { @@ -121,12 +122,12 @@ class AdobeTVIE(AdobeTVBaseIE): 'ext': 'mp4', 'title': 'Quick Tip - How to Draw a Circle Around an Object in Photoshop', 'description': 'md5:99ec318dc909d7ba2a1f2b038f7d2311', - 'thumbnail': r're:https?://.*\.jpg$', + 'thumbnail': r're:https?://.+\.jpg', 'upload_date': '20110914', 'duration': 60, 'view_count': int, }, - } + }] def _real_extract(self, url): language, show_urlname, urlname = self._match_valid_url(url).groups() @@ -159,10 +160,10 @@ class AdobeTVPlaylistBaseIE(AdobeTVBaseIE): class AdobeTVShowIE(AdobeTVPlaylistBaseIE): + _WORKING = False IE_NAME = 'adobetv:show' _VALID_URL = r'https?://tv\.adobe\.com/(?:(?Pfr|de|es|jp)/)?show/(?P[^/]+)' - - _TEST = { + _TESTS = [{ 'url': 'http://tv.adobe.com/show/the-complete-picture-with-julieanne-kost', 'info_dict': { 'id': '36', @@ -170,7 +171,7 @@ class AdobeTVShowIE(AdobeTVPlaylistBaseIE): 'description': 'md5:fa50867102dcd1aa0ddf2ab039311b27', }, 'playlist_mincount': 136, - } + }] _RESOURCE = 'episode' _process_data = AdobeTVBaseIE._parse_video_data @@ -195,16 +196,16 @@ class AdobeTVShowIE(AdobeTVPlaylistBaseIE): class AdobeTVChannelIE(AdobeTVPlaylistBaseIE): + _WORKING = False IE_NAME = 'adobetv:channel' _VALID_URL = r'https?://tv\.adobe\.com/(?:(?Pfr|de|es|jp)/)?channel/(?P[^/]+)(?:/(?P[^/]+))?' - - _TEST = { + _TESTS = [{ 'url': 'http://tv.adobe.com/channel/development', 'info_dict': { 'id': 'development', }, 'playlist_mincount': 96, - } + }] _RESOURCE = 'show' def _process_data(self, show_data): @@ -231,8 +232,7 @@ class AdobeTVVideoIE(AdobeTVBaseIE): IE_NAME = 'adobetv:video' _VALID_URL = r'https?://video\.tv\.adobe\.com/v/(?P\d+)' _EMBED_REGEX = [r']+src=[\'"](?P(?:https?:)?//video\.tv\.adobe\.com/v/\d+[^"]+)[\'"]'] - - _TEST = { + _TESTS = [{ # From https://helpx.adobe.com/acrobat/how-to/new-experience-acrobat-dc.html?set=acrobat--get-started--essential-beginners 'url': 'https://video.tv.adobe.com/v/2456/', 'md5': '43662b577c018ad707a63766462b1e87', @@ -242,8 +242,20 @@ class AdobeTVVideoIE(AdobeTVBaseIE): 'title': 'New experience with Acrobat DC', 'description': 'New experience with Acrobat DC', 'duration': 248.667, + 'thumbnail': r're:https?://images-tv\.adobe\.com/.+\.jpg', }, - } + }] + _WEBPAGE_TESTS = [{ + # FIXME: Invalid extension + 'url': 'https://www.adobe.com/learn/acrobat/web/customize-toolbar', + 'info_dict': { + 'id': '3463980', + 'ext': 'm3u8', + 'title': 'Adobe Acrobat: How to Customize the Toolbar for Faster PDF Editing', + 'description': 'md5:94368ab95ae24f9c1bee0cb346e03dc3', + 'duration': 97.557, + }, + }] def _real_extract(self, url): video_id = self._match_id(url) diff --git a/yt-dlp/yt_dlp/extractor/apa.py b/yt-dlp/yt_dlp/extractor/apa.py index fed597042a..db82b56187 100644 --- a/yt-dlp/yt_dlp/extractor/apa.py +++ b/yt-dlp/yt_dlp/extractor/apa.py @@ -11,12 +11,11 @@ class APAIE(InfoExtractor): _EMBED_REGEX = [r']+\bsrc=(["\'])(?P(?:https?:)?//[^/]+\.apa\.at/embed/[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}.*?)\1'] _TESTS = [{ 'url': 'http://uvp.apa.at/embed/293f6d17-692a-44e3-9fd5-7b178f3a1029', - 'md5': '2b12292faeb0a7d930c778c7a5b4759b', 'info_dict': { 'id': '293f6d17-692a-44e3-9fd5-7b178f3a1029', 'ext': 'mp4', 'title': '293f6d17-692a-44e3-9fd5-7b178f3a1029', - 'thumbnail': r're:^https?://.*\.jpg$', + 'thumbnail': r're:https?://kf-vn\.sf\.apa\.at/vn/.+\.jpg', }, }, { 'url': 'https://uvp-apapublisher.sf.apa.at/embed/2f94e9e6-d945-4db2-9548-f9a41ebf7b78', @@ -28,6 +27,15 @@ class APAIE(InfoExtractor): 'url': 'http://uvp-kleinezeitung.sf.apa.at/embed/f1c44979-dba2-4ebf-b021-e4cf2cac3c81', 'only_matching': True, }] + _WEBPAGE_TESTS = [{ + 'url': 'https://www.vol.at/blue-man-group/5593454', + 'info_dict': { + 'id': '293f6d17-692a-44e3-9fd5-7b178f3a1029', + 'ext': 'mp4', + 'title': '293f6d17-692a-44e3-9fd5-7b178f3a1029', + 'thumbnail': r're:https?://kf-vn\.sf\.apa\.at/vn/.+\.jpg', + }, + }] def _real_extract(self, url): mobj = self._match_valid_url(url) diff --git a/yt-dlp/yt_dlp/extractor/arcpublishing.py b/yt-dlp/yt_dlp/extractor/arcpublishing.py index 8da9bc4ccb..903f9c739a 100644 --- a/yt-dlp/yt_dlp/extractor/arcpublishing.py +++ b/yt-dlp/yt_dlp/extractor/arcpublishing.py @@ -62,6 +62,20 @@ class ArcPublishingIE(InfoExtractor): 'url': 'arcpublishing:tronc:460f2931-8130-4719-8ea1-ffcb2d7cb685', 'only_matching': True, }] + _WEBPAGE_TESTS = [{ + 'url': 'https://www.uppermichiganssource.com/2025/07/18/scattered-showers-storms-bring-heavy-rain-potential/', + 'info_dict': { + 'id': '508116f7-e999-48db-b7c2-60a04842679b', + 'ext': 'mp4', + 'title': 'Scattered showers & storms bring heavy rain potential', + 'description': 'Scattered showers & storms bring heavy rain potential', + 'duration': 2016, + 'thumbnail': r're:https?://.+\.jpg', + 'timestamp': 1752881287, + 'upload_date': '20250718', + }, + 'expected_warnings': ['Ignoring subtitle tracks found in the HLS manifest'], + }] _POWA_DEFAULTS = [ (['cmg', 'prisa'], '%s-config-prod.api.cdn.arcpublishing.com/video'), ([ diff --git a/yt-dlp/yt_dlp/extractor/arte.py b/yt-dlp/yt_dlp/extractor/arte.py index 142d4b066b..3f17da463d 100644 --- a/yt-dlp/yt_dlp/extractor/arte.py +++ b/yt-dlp/yt_dlp/extractor/arte.py @@ -51,8 +51,8 @@ class ArteTVIE(ArteTVBaseIE): 'id': '109067-000-A', 'ext': 'mp4', 'description': 'md5:d2ca367b8ecee028dddaa8bd1aebc739', + 'thumbnail': r're:https?://api-cdn\.arte\.tv/img/v2/image/.+', 'timestamp': 1713927600, - 'thumbnail': 'https://api-cdn.arte.tv/img/v2/image/3rR6PLzfbigSkkeHtkCZNF/940x530', 'duration': 7599, 'title': 'La loi de Téhéran', 'upload_date': '20240424', @@ -62,6 +62,7 @@ class ArteTVIE(ArteTVBaseIE): 'fr-forced': 'mincount:1', }, }, + 'skip': 'Invalid URL', }, { 'note': 'age-restricted', 'url': 'https://www.arte.tv/de/videos/006785-000-A/the-element-of-crime/', @@ -69,9 +70,9 @@ class ArteTVIE(ArteTVBaseIE): 'id': '006785-000-A', 'description': 'md5:c2f94fdfefc8a280e4dab68ab96ab0ba', 'title': 'The Element of Crime', + 'thumbnail': r're:https?://api-cdn\.arte\.tv/img/v2/image/.+', 'timestamp': 1696111200, 'duration': 5849, - 'thumbnail': 'https://api-cdn.arte.tv/img/v2/image/q82dTTfyuCXupPsGxXsd7B/940x530', 'upload_date': '20230930', 'ext': 'mp4', }, @@ -252,6 +253,30 @@ class ArteTVEmbedIE(InfoExtractor): 'url': 'https://www.arte.tv/player/v3/index.php?json_url=https://api.arte.tv/api/player/v2/config/de/100605-013-A', 'only_matching': True, }] + _WEBPAGE_TESTS = [{ + # FIXME: Embed detection + 'url': 'https://timesofmalta.com/article/watch-sunken-warships-north-sea-arte.1108358', + 'info_dict': { + 'id': '110288-000-A', + 'ext': 'mp4', + 'title': 'Danger on the Seabed', + 'alt_title': 'Sunken Warships in the North Sea', + 'description': 'md5:a2c84cbad37d280bddb6484087120add', + 'duration': 3148, + 'thumbnail': r're:https?://api-cdn\.arte\.tv/img/v2/image/.+', + 'timestamp': 1741686820, + 'upload_date': '20250311', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + # FIXME: Embed detection + 'url': 'https://www.eurockeennes.fr/en-live/', + 'info_dict': { + 'id': 'en-live', + 'title': 'Les Eurocks en live | Les Eurockéennes de Belfort – 3-4-5-6 juillet 2025 sur la Presqu'Île du Malsaucy', + }, + 'playlist_count': 4, + }] def _real_extract(self, url): qs = parse_qs(url) @@ -304,9 +329,9 @@ class ArteTVCategoryIE(ArteTVBaseIE): 'info_dict': { 'id': 'politics-and-society', 'title': 'Politics and society', - 'description': 'Investigative documentary series, geopolitical analysis, and international commentary', + 'description': 'Watch documentaries and reportage about politics, society and current affairs.', }, - 'playlist_mincount': 13, + 'playlist_mincount': 3, }] @classmethod diff --git a/yt-dlp/yt_dlp/extractor/bandcamp.py b/yt-dlp/yt_dlp/extractor/bandcamp.py index d07d6e48b2..0a8f88fa8c 100644 --- a/yt-dlp/yt_dlp/extractor/bandcamp.py +++ b/yt-dlp/yt_dlp/extractor/bandcamp.py @@ -36,14 +36,12 @@ class BandcampIE(InfoExtractor): 'duration': 9.8485, 'uploader': 'youtube-dl "\'/\\ä↭', 'upload_date': '20121129', + 'thumbnail': r're:https?://f4\.bcbits\.com/img/.+\.jpg', 'timestamp': 1354224127, 'track': 'youtube-dl "\'/\\ä↭ - youtube-dl test song "\'/\\ä↭', - 'album_artist': 'youtube-dl "\'/\\ä↭', 'track_id': '1812978515', - 'artist': 'youtube-dl "\'/\\ä↭', 'uploader_url': 'https://youtube-dl.bandcamp.com', 'uploader_id': 'youtube-dl', - 'thumbnail': 'https://f4.bcbits.com/img/a3216802731_5.jpg', 'artists': ['youtube-dl "\'/\\ä↭'], 'album_artists': ['youtube-dl "\'/\\ä↭'], }, @@ -54,10 +52,9 @@ class BandcampIE(InfoExtractor): 'info_dict': { 'id': '2650410135', 'ext': 'm4a', - 'acodec': r're:[fa]lac', 'title': 'Ben Prunty - Lanius (Battle)', - 'thumbnail': r're:^https?://.*\.jpg$', 'uploader': 'Ben Prunty', + 'thumbnail': r're:https?://f4\.bcbits\.com/img/.+\.jpg', 'timestamp': 1396508491, 'upload_date': '20140403', 'release_timestamp': 1396483200, @@ -66,8 +63,6 @@ class BandcampIE(InfoExtractor): 'track': 'Lanius (Battle)', 'track_number': 1, 'track_id': '2650410135', - 'artist': 'Ben Prunty', - 'album_artist': 'Ben Prunty', 'album': 'FTL: Advanced Edition Soundtrack', 'uploader_url': 'https://benprunty.bandcamp.com', 'uploader_id': 'benprunty', @@ -83,8 +78,8 @@ class BandcampIE(InfoExtractor): 'id': '2584466013', 'ext': 'mp3', 'title': 'Mastodon - Hail to Fire', - 'thumbnail': r're:^https?://.*\.jpg$', 'uploader': 'Mastodon', + 'thumbnail': r're:https?://f4\.bcbits\.com/img/.+\.jpg', 'timestamp': 1322005399, 'upload_date': '20111122', 'release_timestamp': 1076112000, @@ -93,8 +88,6 @@ class BandcampIE(InfoExtractor): 'track': 'Hail to Fire', 'track_number': 5, 'track_id': '2584466013', - 'artist': 'Mastodon', - 'album_artist': 'Mastodon', 'album': 'Call of the Mastodon', 'uploader_url': 'https://relapsealumni.bandcamp.com', 'uploader_id': 'relapsealumni', @@ -110,8 +103,8 @@ class BandcampIE(InfoExtractor): 'id': '1978174799', 'ext': 'mp3', 'title': 'submerse - submerse - Safehouse', - 'thumbnail': r're:^https?://.*\.jpg$', 'uploader': 'submerse', + 'thumbnail': r're:https?://f4\.bcbits\.com/img/.+\.jpg', 'timestamp': 1480779297, 'upload_date': '20161203', 'release_timestamp': 1481068800, @@ -120,8 +113,6 @@ class BandcampIE(InfoExtractor): 'track': 'submerse - Safehouse', 'track_number': 3, 'track_id': '1978174799', - 'artist': 'submerse', - 'album_artist': 'Diskotopia', 'album': 'DSK F/W 2016-2017 Free Compilation', 'uploader_url': 'https://diskotopia.bandcamp.com', 'uploader_id': 'diskotopia', @@ -130,6 +121,30 @@ class BandcampIE(InfoExtractor): 'album_artists': ['Diskotopia'], }, }] + _WEBPAGE_TESTS = [{ + # FIXME: Embed detection + 'url': 'https://www.punknews.org/article/85809/stay-inside-super-sonic', + 'info_dict': { + 'id': '2475540375', + 'ext': 'mp3', + 'title': 'Stay Inside - Super Sonic', + 'album': 'Lunger', + 'album_artists': ['Stay Inside'], + 'artists': ['Stay Inside'], + 'duration': 166.157, + 'release_date': '20251003', + 'release_timestamp': 1759449600.0, + 'thumbnail': r're:https?://f4\.bcbits\.com/img/.+\.jpg', + 'timestamp': 1749473029.0, + 'track': 'Super Sonic', + 'track_id': '2475540375', + 'track_number': 3, + 'upload_date': '20250609', + 'uploader': 'Stay Inside', + 'uploader_id': 'stayinside', + 'uploader_url': 'https://stayinside.bandcamp.com', + }, + }] def _extract_data_attr(self, webpage, video_id, attr='tralbum', fatal=True): return self._parse_json(self._html_search_regex( @@ -279,10 +294,10 @@ class BandcampAlbumIE(BandcampIE): # XXX: Do not subclass from concrete IE 'id': '1353101989', 'ext': 'mp3', 'title': 'Blazo - Intro', + 'thumbnail': r're:https?://f4\.bcbits\.com/img/.+\.jpg', 'timestamp': 1311756226, 'upload_date': '20110727', 'uploader': 'Blazo', - 'thumbnail': 'https://f4.bcbits.com/img/a1721150828_5.jpg', 'album_artists': ['Blazo'], 'uploader_url': 'https://blazo.bandcamp.com', 'release_date': '20110727', @@ -302,6 +317,7 @@ class BandcampAlbumIE(BandcampIE): # XXX: Do not subclass from concrete IE 'id': '38097443', 'ext': 'mp3', 'title': 'Blazo - Kero One - Keep It Alive (Blazo remix)', + 'thumbnail': r're:https?://f4\.bcbits\.com/img/.+\.jpg', 'timestamp': 1311757238, 'upload_date': '20110727', 'uploader': 'Blazo', @@ -315,7 +331,6 @@ class BandcampAlbumIE(BandcampIE): # XXX: Do not subclass from concrete IE 'uploader_id': 'blazo', 'album_artists': ['Blazo'], 'artists': ['Blazo'], - 'thumbnail': 'https://f4.bcbits.com/img/a1721150828_5.jpg', 'release_timestamp': 1311724800.0, }, }, diff --git a/yt-dlp/yt_dlp/extractor/blogger.py b/yt-dlp/yt_dlp/extractor/blogger.py index 1614b6f947..6ff72e70d2 100644 --- a/yt-dlp/yt_dlp/extractor/blogger.py +++ b/yt-dlp/yt_dlp/extractor/blogger.py @@ -19,8 +19,19 @@ class BloggerIE(InfoExtractor): 'id': 'BLOGGER-video-3c740e3a49197e16-796', 'title': 'BLOGGER-video-3c740e3a49197e16-796', 'ext': 'mp4', - 'thumbnail': r're:^https?://.*', 'duration': 76.068, + 'thumbnail': r're:https?://i9\.ytimg\.com/vi_blogger/.+', + }, + }] + _WEBPAGE_TESTS = [{ + 'url': 'https://blog.tomeuvizoso.net/2019/01/a-panfrost-milestone.html', + 'md5': 'f1bc19b6ea1b0fd1d81e84ca9ec467ac', + 'info_dict': { + 'id': 'BLOGGER-video-3c740e3a49197e16-12203', + 'ext': 'mp4', + 'title': 'BLOGGER-video-3c740e3a49197e16-12203', + 'duration': 76.068, + 'thumbnail': r're:https?://i9\.ytimg\.com/vi_blogger/.+', }, }] diff --git a/yt-dlp/yt_dlp/extractor/cloudflarestream.py b/yt-dlp/yt_dlp/extractor/cloudflarestream.py index 9e9e89a801..a90fceaacf 100644 --- a/yt-dlp/yt_dlp/extractor/cloudflarestream.py +++ b/yt-dlp/yt_dlp/extractor/cloudflarestream.py @@ -19,18 +19,16 @@ class CloudflareStreamIE(InfoExtractor): 'id': '31c9291ab41fac05471db4e73aa11717', 'ext': 'mp4', 'title': '31c9291ab41fac05471db4e73aa11717', - 'thumbnail': 'https://cloudflarestream.com/31c9291ab41fac05471db4e73aa11717/thumbnails/thumbnail.jpg', - }, - 'params': { - 'skip_download': 'm3u8', + 'thumbnail': r're:https?://cloudflarestream\.com/.+\.jpg', }, + 'params': {'skip_download': 'm3u8'}, }, { 'url': 'https://watch.cloudflarestream.com/embed/sdk-iframe-integration.fla9.latest.js?video=0e8e040aec776862e1d632a699edf59e', 'info_dict': { 'id': '0e8e040aec776862e1d632a699edf59e', 'ext': 'mp4', 'title': '0e8e040aec776862e1d632a699edf59e', - 'thumbnail': 'https://cloudflarestream.com/0e8e040aec776862e1d632a699edf59e/thumbnails/thumbnail.jpg', + 'thumbnail': r're:https?://cloudflarestream\.com/.+\.jpg', }, }, { 'url': 'https://watch.cloudflarestream.com/9df17203414fd1db3e3ed74abbe936c1', @@ -54,11 +52,21 @@ class CloudflareStreamIE(InfoExtractor): 'id': 'eaef9dea5159cf968be84241b5cedfe7', 'ext': 'mp4', 'title': 'eaef9dea5159cf968be84241b5cedfe7', - 'thumbnail': 'https://cloudflarestream.com/eaef9dea5159cf968be84241b5cedfe7/thumbnails/thumbnail.jpg', + 'thumbnail': r're:https?://cloudflarestream\.com/.+\.jpg', }, 'params': { + 'extractor_args': {'generic': {'impersonate': ['chrome']}}, 'skip_download': 'm3u8', }, + }, { + # FIXME: Embed detection + 'url': 'https://www.cloudflare.com/developer-platform/products/cloudflare-stream/', + 'info_dict': { + 'id': 'e7bd2dd67e0f8860b4ae81e33a966049', + 'ext': 'mp4', + 'title': 'e7bd2dd67e0f8860b4ae81e33a966049', + 'thumbnail': r're:https?://cloudflarestream\.com/.+\.jpg', + }, }] def _real_extract(self, url): diff --git a/yt-dlp/yt_dlp/extractor/condenast.py b/yt-dlp/yt_dlp/extractor/condenast.py index 0c84cfdab7..318fa8943b 100644 --- a/yt-dlp/yt_dlp/extractor/condenast.py +++ b/yt-dlp/yt_dlp/extractor/condenast.py @@ -96,6 +96,24 @@ class CondeNastIE(InfoExtractor): 'upload_date': '20150916', 'timestamp': 1442434920, }, + }, { + # FIXME: Subtitles + 'url': 'https://www.vanityfair.com/video/watch/vf-quiz-show-squid-game-s3', + 'info_dict': { + 'id': '6862f999c1afbc5ff06b4803', + 'ext': 'mp4', + 'title': '\'Squid Game\' Cast Tests How Well They Know Each Other', + 'categories': ['Arts & Culture', 'Hollywood'], + 'description': 'md5:7a9c668a1fc87648e77da13842ec1534', + 'duration': 955, + 'season': 'Season 1', + 'series': 'Quizzing Each Other', + 'tags': 'count:2', + 'thumbnail': r're:https?://dwgyu36up6iuz\.cloudfront\.net/.+\.jpg', + 'timestamp': 1751341306, + 'upload_date': '20250701', + 'uploader': 'vanityfair', + }, }, { 'url': 'https://player.cnevids.com/inline/video/59138decb57ac36b83000005.js?target=js-cne-player', 'only_matching': True, diff --git a/yt-dlp/yt_dlp/extractor/crooksandliars.py b/yt-dlp/yt_dlp/extractor/crooksandliars.py index abd3322a95..29bbc2fe6a 100644 --- a/yt-dlp/yt_dlp/extractor/crooksandliars.py +++ b/yt-dlp/yt_dlp/extractor/crooksandliars.py @@ -8,7 +8,6 @@ from ..utils import ( class CrooksAndLiarsIE(InfoExtractor): _VALID_URL = r'https?://embed\.crooksandliars\.com/(?:embed|v)/(?P[A-Za-z0-9]+)' _EMBED_REGEX = [r'<(?:iframe[^>]+src|param[^>]+value)=(["\'])(?P(?:https?:)?//embed\.crooksandliars\.com/(?:embed|v)/.+?)\1'] - _TESTS = [{ 'url': 'https://embed.crooksandliars.com/embed/8RUoRhRi', 'info_dict': { @@ -16,7 +15,7 @@ class CrooksAndLiarsIE(InfoExtractor): 'ext': 'mp4', 'title': 'Fox & Friends Says Protecting Atheists From Discrimination Is Anti-Christian!', 'description': 'md5:e1a46ad1650e3a5ec7196d432799127f', - 'thumbnail': r're:^https?://.*\.jpg', + 'thumbnail': r're:https?://crooksandliars\.com/files/.+', 'timestamp': 1428207000, 'upload_date': '20150405', 'uploader': 'Heather', @@ -26,6 +25,20 @@ class CrooksAndLiarsIE(InfoExtractor): 'url': 'http://embed.crooksandliars.com/v/MTE3MjUtMzQ2MzA', 'only_matching': True, }] + _WEBPAGE_TESTS = [{ + 'url': 'https://crooksandliars.com/2015/04/fox-friends-says-protecting-atheists', + 'info_dict': { + 'id': '8RUoRhRi', + 'ext': 'mp4', + 'title': 'Fox & Friends Says Protecting Atheists From Discrimination Is Anti-Christian!', + 'description': 'md5:e1a46ad1650e3a5ec7196d432799127f', + 'duration': 236, + 'thumbnail': r're:https?://crooksandliars\.com/files/.+', + 'timestamp': 1428207000, + 'upload_date': '20150405', + 'uploader': 'Heather', + }, + }] def _real_extract(self, url): video_id = self._match_id(url) diff --git a/yt-dlp/yt_dlp/extractor/dailymail.py b/yt-dlp/yt_dlp/extractor/dailymail.py index 540676ac0f..3058a0f7b5 100644 --- a/yt-dlp/yt_dlp/extractor/dailymail.py +++ b/yt-dlp/yt_dlp/extractor/dailymail.py @@ -19,11 +19,22 @@ class DailyMailIE(InfoExtractor): 'ext': 'mp4', 'title': 'The Mountain appears in sparkling water ad for \'Heavy Bubbles\'', 'description': 'md5:a93d74b6da172dd5dc4d973e0b766a84', + 'thumbnail': r're:https?://i\.dailymail\.co\.uk/.+\.jpg', }, }, { 'url': 'http://www.dailymail.co.uk/embed/video/1295863.html', 'only_matching': True, }] + _WEBPAGE_TESTS = [{ + 'url': 'https://www.daily-news.gr/lifestyle/%ce%b7-%cf%84%cf%81%ce%b1%ce%b3%ce%bf%cf%85%ce%b4%ce%af%cf%83%cf%84%cf%81%ce%b9%ce%b1-jessie-j-%ce%bc%ce%bf%ce%b9%cf%81%ce%ac%cf%83%cf%84%ce%b7%ce%ba%ce%b5-%cf%83%cf%85%ce%b3%ce%ba%ce%bb%ce%bf%ce%bd/', + 'info_dict': { + 'id': '3463585', + 'ext': 'mp4', + 'title': 'Jessie J reveals she has undergone surgery as she shares clips', + 'description': 'md5:9fa9a25feca5b656b0b4a39c922fad1e', + 'thumbnail': r're:https?://i\.dailymail\.co\.uk/.+\.jpg', + }, + }] def _real_extract(self, url): video_id = self._match_id(url) diff --git a/yt-dlp/yt_dlp/extractor/dailymotion.py b/yt-dlp/yt_dlp/extractor/dailymotion.py index a81f0a26dd..d27a027702 100644 --- a/yt-dlp/yt_dlp/extractor/dailymotion.py +++ b/yt-dlp/yt_dlp/extractor/dailymotion.py @@ -119,13 +119,14 @@ class DailymotionIE(DailymotionBaseInfoExtractor): _EMBED_REGEX = [rf'(?ix)<(?:(?:embed|iframe)[^>]+?src=|input[^>]+id=[\'"]dmcloudUrlEmissionSelect[\'"][^>]+value=)["\'](?P{_VALID_URL[5:]})'] _TESTS = [{ 'url': 'http://www.dailymotion.com/video/x5kesuj_office-christmas-party-review-jason-bateman-olivia-munn-t-j-miller_news', - 'md5': '074b95bdee76b9e3654137aee9c79dfe', 'info_dict': { 'id': 'x5kesuj', 'ext': 'mp4', 'title': 'Office Christmas Party Review – Jason Bateman, Olivia Munn, T.J. Miller', 'description': 'Office Christmas Party Review - Jason Bateman, Olivia Munn, T.J. Miller', 'duration': 187, + 'tags': 'count:5', + 'thumbnail': r're:https?://s[12]\.dmcdn\.net/v/.+', 'timestamp': 1493651285, 'upload_date': '20170501', 'uploader': 'Deadline', @@ -133,18 +134,17 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'age_limit': 0, 'view_count': int, 'like_count': int, - 'tags': ['hollywood', 'celeb', 'celebrity', 'movies', 'red carpet'], - 'thumbnail': r're:https://(?:s[12]\.)dmcdn\.net/v/K456B1cmt4ZcZ9KiM/x1080', }, }, { 'url': 'https://geo.dailymotion.com/player.html?video=x89eyek&mute=true', - 'md5': 'e2f9717c6604773f963f069ca53a07f8', 'info_dict': { 'id': 'x89eyek', 'ext': 'mp4', - 'title': "En quête d'esprit du 27/03/2022", + 'title': 'En quête d\'esprit du 27/03/2022', 'description': 'md5:66542b9f4df2eb23f314fc097488e553', 'duration': 2756, + 'tags': 'count:1', + 'thumbnail': r're:https?://s[12]\.dmcdn\.net/v/.+', 'timestamp': 1648383669, 'upload_date': '20220327', 'uploader': 'CNEWS', @@ -152,8 +152,6 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'age_limit': 0, 'view_count': int, 'like_count': int, - 'tags': ['en_quete_d_esprit'], - 'thumbnail': r're:https://(?:s[12]\.)dmcdn\.net/v/Tncwi1clTH6StrxMP/x1080', }, }, { 'url': 'https://www.dailymotion.com/video/x2iuewm_steam-machine-models-pricing-listed-on-steam-store-ign-news_videogames', @@ -163,8 +161,8 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'ext': 'mp4', 'title': 'Steam Machine Models, Pricing Listed on Steam Store - IGN News', 'description': 'Several come bundled with the Steam Controller.', - 'thumbnail': r're:^https?:.*\.(?:jpg|png)$', 'duration': 74, + 'thumbnail': r're:https?://s[12]\.dmcdn\.net/v/.+', 'timestamp': 1425657362, 'upload_date': '20150306', 'uploader': 'IGN', @@ -183,10 +181,7 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'uploader': 'Katy Perry', 'upload_date': '20130905', }, - 'params': { - 'skip_download': True, - }, - 'skip': 'VEVO is only available in some countries', + 'skip': 'Invalid URL', }, { # age-restricted video 'url': 'http://www.dailymotion.com/video/xyh2zz_leanna-decker-cyber-girl-of-the-year-desires-nude-playboy-plus_redband', @@ -259,9 +254,9 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'uploader_id': 'x2vtgmm', 'age_limit': 0, 'tags': [], + 'thumbnail': r're:https?://s[12]\.dmcdn\.net/v/.+', 'view_count': int, 'like_count': int, - 'thumbnail': r're:https://\w+.dmcdn.net/v/WnEY61cmvMxt2Fi6d/x1080', }, }, { # https://geo.dailymotion.com/player/xf7zn.html?playlist=x7wdsj @@ -276,18 +271,18 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'info_dict': { 'id': 'x8u4owg', 'ext': 'mp4', + 'description': 'À bord du « véloto », l’alternative à la voiture pour la campagne', 'like_count': int, 'uploader': 'Le Parisien', - 'thumbnail': 'https://www.leparisien.fr/resizer/ho_GwveeYftNkLwg_cEta--5Bv4=/1200x675/cloudfront-eu-central-1.images.arcpublishing.com/leparisien/BFXJNEBN75EUNHGYJLORUC3TX4.jpg', 'upload_date': '20240309', 'view_count': int, + 'tags': 'count:7', + 'thumbnail': r're:https?://www\.leparisien\.fr/.+\.jpg', 'timestamp': 1709997866, 'age_limit': 0, 'uploader_id': 'x32f7b', 'title': 'VIDÉO. Le «\xa0véloto\xa0», la voiture à pédales qui aimerait se faire une place sur les routes', 'duration': 428.0, - 'description': 'À bord du « véloto », l’alternative à la voiture pour la campagne', - 'tags': ['biclou', 'vélo', 'véloto', 'campagne', 'voiture', 'environnement', 'véhicules intermédiaires'], }, }, { # https://geo.dailymotion.com/player/xry80.html?video=x8vu47w @@ -297,9 +292,9 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'ext': 'mp4', 'like_count': int, 'uploader': 'Metatube', - 'thumbnail': r're:https://\w+.dmcdn.net/v/W1G_S1coGSFTfkTeR/x1080', 'upload_date': '20240326', 'view_count': int, + 'thumbnail': r're:https?://s[12]\.dmcdn\.net/v/.+', 'timestamp': 1711496732, 'age_limit': 0, 'uploader_id': 'x2xpy74', @@ -308,6 +303,7 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'description': 'Que lindura', 'tags': [], }, + 'skip': 'Invalid URL', }, { # //geo.dailymotion.com/player/xysxq.html?video=k2Y4Mjp7krAF9iCuINM 'url': 'https://lcp.fr/programmes/avant-la-catastrophe-la-naissance-de-la-dictature-nazie-1933-1936-346819', @@ -322,11 +318,30 @@ class DailymotionIE(DailymotionBaseInfoExtractor): 'like_count': int, 'age_limit': 0, 'duration': 3220, - 'thumbnail': 'https://s1.dmcdn.net/v/Xvumk1djJBUZfjj2a/x1080', 'tags': [], + 'thumbnail': r're:https?://s[12]\.dmcdn\.net/v/.+', 'timestamp': 1739919947, 'upload_date': '20250218', }, + 'skip': 'Invalid URL', + }, { + 'url': 'https://forum.ionicframework.com/t/ionic-2-jw-player-dailymotion-player/83248', + 'info_dict': { + 'id': 'xwr14q', + 'ext': 'mp4', + 'title': 'Macklemore & Ryan Lewis - Thrift Shop (feat. Wanz)', + 'age_limit': 0, + 'description': 'md5:47fbe168b5a6ddc4a205e20dd6c841b2', + 'duration': 234, + 'like_count': int, + 'tags': 'count:5', + 'thumbnail': r're:https?://s[12]\.dmcdn\.net/v/.+', + 'timestamp': 1358177670, + 'upload_date': '20130114', + 'uploader': 'Macklemore Official', + 'uploader_id': 'x19qlwr', + 'view_count': int, + }, }] _GEO_BYPASS = False _COMMON_MEDIA_FIELDS = '''description @@ -540,7 +555,7 @@ class DailymotionSearchIE(DailymotionPlaylistBaseIE): 'id': 'king of turtles', 'title': 'king of turtles', }, - 'playlist_mincount': 90, + 'playlist_mincount': 0, }] _SEARCH_QUERY = 'query SEARCH_QUERY( $query: String! $page: Int $limit: Int ) { search { videos( query: $query first: $limit page: $page ) { edges { node { xid } } } } } ' @@ -584,7 +599,7 @@ class DailymotionUserIE(DailymotionPlaylistBaseIE): 'info_dict': { 'id': 'nqtv', }, - 'playlist_mincount': 152, + 'playlist_mincount': 148, }, { 'url': 'http://www.dailymotion.com/user/UnderProject', 'info_dict': { diff --git a/yt-dlp/yt_dlp/extractor/dbtv.py b/yt-dlp/yt_dlp/extractor/dbtv.py index 795fbacc41..ff93c642d2 100644 --- a/yt-dlp/yt_dlp/extractor/dbtv.py +++ b/yt-dlp/yt_dlp/extractor/dbtv.py @@ -12,13 +12,13 @@ class DBTVIE(InfoExtractor): 'ext': 'mp4', 'title': 'Skulle teste ut fornøyelsespark, men kollegaen var bare opptatt av bikinikroppen', 'description': 'md5:49cc8370e7d66e8a2ef15c3b4631fd3f', - 'thumbnail': r're:https?://.*\.jpg', + 'thumbnail': r're:https?://.+\.jpg', 'upload_date': '20160916', 'duration': 69, 'uploader_id': 'UCk5pvsyZJoYJBd7_oFPTlRQ', 'uploader': 'Dagbladet', }, - 'add_ie': ['Youtube'], + 'skip': 'Invalid URL', }, { 'url': 'https://www.dagbladet.no/video/embed/xlGmyIeN9Jo/?autoplay=false', 'only_matching': True, @@ -26,6 +26,20 @@ class DBTVIE(InfoExtractor): 'url': 'https://www.dagbladet.no/video/truer-iran-bor-passe-dere/PalfB2Cw', 'only_matching': True, }] + _WEBPAGE_TESTS = [{ + # FIXME: Embed detection + 'url': 'https://www.dagbladet.no/nyheter/rekordstort-russisk-angrep/83325693', + 'info_dict': { + 'id': '1HW7fYry', + 'ext': 'mp4', + 'title': 'Putin taler - så skjer dette', + 'description': 'md5:3e8bacee33de861a9663d9a3fcc54e5e', + 'display_id': 'putin-taler-sa-skjer-dette', + 'thumbnail': r're:https?://cdn\.jwplayer\.com/v2/media/.+', + 'timestamp': 1751043600, + 'upload_date': '20250627', + }, + }] def _real_extract(self, url): display_id, video_id = self._match_valid_url(url).groups() diff --git a/yt-dlp/yt_dlp/extractor/ertgr.py b/yt-dlp/yt_dlp/extractor/ertgr.py index 6f3f60ff43..ba68d5324d 100644 --- a/yt-dlp/yt_dlp/extractor/ertgr.py +++ b/yt-dlp/yt_dlp/extractor/ertgr.py @@ -64,14 +64,12 @@ class ERTFlixCodenameIE(ERTFlixBaseIE): _VALID_URL = r'ertflix:(?P[\w-]+)' _TESTS = [{ 'url': 'ertflix:monogramma-praxitelis-tzanoylinos', - 'md5': '5b9c2cd171f09126167e4082fc1dd0ef', 'info_dict': { 'id': 'monogramma-praxitelis-tzanoylinos', 'ext': 'mp4', - 'title': 'md5:ef0b439902963d56c43ac83c3f41dd0e', + 'title': 'monogramma-praxitelis-tzanoylinos', }, - }, - ] + }] def _extract_formats_and_subs(self, video_id): media_info = self._call_api(video_id, codename=video_id) @@ -131,13 +129,14 @@ class ERTFlixIE(ERTFlixBaseIE): 'duration': 3166, 'age_limit': 8, }, + 'skip': 'Invalid URL', }, { 'url': 'https://www.ertflix.gr/series/ser.3448-monogramma', 'info_dict': { 'id': 'ser.3448', 'age_limit': 8, - 'description': 'Η εκπομπή σαράντα ετών που σημάδεψε τον πολιτισμό μας.', - 'title': 'Μονόγραμμα', + 'title': 'Monogramma', + 'description': 'md5:e30cc640e6463da87f210a8ed10b2439', }, 'playlist_mincount': 64, }, { @@ -145,28 +144,28 @@ class ERTFlixIE(ERTFlixBaseIE): 'info_dict': { 'id': 'ser.3448', 'age_limit': 8, - 'description': 'Η εκπομπή σαράντα ετών που σημάδεψε τον πολιτισμό μας.', - 'title': 'Μονόγραμμα', + 'title': 'Monogramma', + 'description': 'md5:e30cc640e6463da87f210a8ed10b2439', }, - 'playlist_count': 22, + 'playlist_mincount': 66, }, { 'url': 'https://www.ertflix.gr/series/ser.3448-monogramma?season=1&season=2021%20-%202022', 'info_dict': { 'id': 'ser.3448', 'age_limit': 8, - 'description': 'Η εκπομπή σαράντα ετών που σημάδεψε τον πολιτισμό μας.', - 'title': 'Μονόγραμμα', + 'title': 'Monogramma', + 'description': 'md5:e30cc640e6463da87f210a8ed10b2439', }, - 'playlist_mincount': 36, + 'playlist_mincount': 25, }, { 'url': 'https://www.ertflix.gr/series/ser.164991-to-diktuo-1?season=1-9', 'info_dict': { 'id': 'ser.164991', 'age_limit': 8, - 'description': 'Η πρώτη ελληνική εκπομπή με θεματολογία αποκλειστικά γύρω από το ίντερνετ.', - 'title': 'Το δίκτυο', + 'title': 'The Network', + 'description': 'The first Greek show featuring topics exclusively around the internet.', }, - 'playlist_mincount': 9, + 'playlist_mincount': 0, }, { 'url': 'https://www.ertflix.gr/en/vod/vod.127652-ta-kalytera-mas-chronia-ep1-mia-volta-sto-feggari', 'only_matching': True, @@ -282,6 +281,16 @@ class ERTWebtvEmbedIE(InfoExtractor): 'ext': 'mp4', 'thumbnail': 'https://program.ert.gr/photos/2022/1/to_diktio_ep09_i_istoria_tou_diadiktiou_stin_Ellada_1021x576.jpg', }, + 'skip': 'Invalid URL', + }] + _WEBPAGE_TESTS = [{ + 'url': 'https://www.ertnews.gr/video/manolis-goyalles-o-anthropos-piso-apo-ti-diadiktyaki-vasilopita/', + 'info_dict': { + 'id': '2022/tv/news-themata-ianouarios/20220114-apotis6-gouales-pita.mp4', + 'ext': 'mp4', + 'title': 'VOD - 2022/tv/news-themata-ianouarios/20220114-apotis6-gouales-pita.mp4', + 'thumbnail': r're:https?://www\.ert\.gr/themata/photos/.+\.jpg', + }, }] def _real_extract(self, url): diff --git a/yt-dlp/yt_dlp/extractor/facebook.py b/yt-dlp/yt_dlp/extractor/facebook.py index 24ecb03505..2c35013faa 100644 --- a/yt-dlp/yt_dlp/extractor/facebook.py +++ b/yt-dlp/yt_dlp/extractor/facebook.py @@ -81,13 +81,14 @@ class FacebookIE(InfoExtractor): 'description': 'md5:34675bda53336b1d16400265c2bb9b3b', 'uploader': 'RADIO KICKS FM', 'upload_date': '20230818', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'timestamp': 1692346159, - 'thumbnail': r're:^https?://.*', 'uploader_id': '100063551323670', 'duration': 3133.583, 'view_count': int, 'concurrent_view_count': 0, }, + 'expected_warnings': ['Cannot parse data'], }, { 'url': 'https://www.facebook.com/video.php?v=637842556329505&fref=nf', 'md5': '6a40d33c0eccbb1af76cf0485a052659', @@ -106,17 +107,18 @@ class FacebookIE(InfoExtractor): 'info_dict': { 'id': '274175099429670', 'ext': 'mp4', - 'title': 'Asif', + 'title': '119 reactions · 1.4K shares | Asif Nawab Butt on Reels', 'description': '', 'uploader': 'Asif Nawab Butt', 'upload_date': '20140506', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'timestamp': 1399398998, - 'thumbnail': r're:^https?://.*', - 'uploader_id': 'pfbid05AzrFTXgY37tqwaSgbFTTEpCLBjjEJHkigogwGiRPtKEpAsJYJpzE94H1RxYXWEtl', + 'uploader_id': 'pfbid028xue38TBXRyNbiqBSV2LFs3QK3yopvKjupbqFoL6U9SKbx4p2SMdJjQSBvnjsHGWl', 'duration': 131.03, 'concurrent_view_count': int, 'view_count': int, }, + 'expected_warnings': ['Cannot parse data'], }, { 'note': 'Video with DASH manifest', 'url': 'https://www.facebook.com/video.php?v=957955867617029', @@ -158,7 +160,7 @@ class FacebookIE(InfoExtractor): 'id': '10153664894881749', 'ext': 'mp4', 'title': 'Average time to confirm recent Supreme Court nominees: 67 days Longest it\'s t...', - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'timestamp': 1456259628, 'upload_date': '20160223', 'uploader': 'Barack Obama', @@ -168,7 +170,7 @@ class FacebookIE(InfoExtractor): # have 1080P, but only up to 720p in swf params # data.video.story.attachments[].media 'url': 'https://www.facebook.com/cnn/videos/10155529876156509/', - 'md5': '1659aa21fb3dd1585874f668e81a72c8', + 'md5': '70b82ebf5f0e9b91b2a49d3db3563611', 'info_dict': { 'id': '10155529876156509', 'ext': 'mp4', @@ -177,7 +179,7 @@ class FacebookIE(InfoExtractor): 'timestamp': 1477818095, 'upload_date': '20161030', 'uploader': 'CNN', - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'view_count': int, 'uploader_id': '100059479812265', 'concurrent_view_count': int, @@ -198,13 +200,11 @@ class FacebookIE(InfoExtractor): 'uploader': 'Yaroslav Korpan', 'uploader_id': 'pfbid06AScABAWcW91qpiuGrLt99Ef9tvwHoXP6t8KeFYEqkSfreMtfa9nTveh8b2ZEVSWl', 'concurrent_view_count': int, - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'view_count': int, 'duration': 11736.446, }, - 'params': { - 'skip_download': True, - }, + 'skip': 'Invalid URL', }, { # FIXME: Cannot parse data error 'url': 'https://www.facebook.com/LaGuiaDelVaron/posts/1072691702860471', @@ -215,7 +215,7 @@ class FacebookIE(InfoExtractor): 'timestamp': 1477305000, 'upload_date': '20161024', 'uploader': 'La Guía Del Varón', - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', }, 'skip': 'Requires logging in', }, { @@ -244,9 +244,10 @@ class FacebookIE(InfoExtractor): 'upload_date': '20171124', 'uploader': 'Vickie Gentry', 'uploader_id': 'pfbid0FkkycT95ySNNyfCw4Cho6u5G7WbbZEcxT496Hq8rtx1K3LcTCATpR3wnyYhmyGC5l', - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'duration': 148.224, }, + 'skip': 'Invalid URL', }, { # data.node.comet_sections.content.story.attachments[].styles.attachment.media 'url': 'https://www.facebook.com/attn/posts/pfbid0j1Czf2gGDVqeQ8KiMLFm3pWN8GxsQmeRrVhimWDzMuKQoR8r4b1knNsejELmUgyhl', @@ -260,7 +261,7 @@ class FacebookIE(InfoExtractor): 'duration': 132.675, 'uploader_id': '100064451419378', 'view_count': int, - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'timestamp': 1701975646, }, }, { @@ -271,9 +272,9 @@ class FacebookIE(InfoExtractor): 'ext': 'mp4', 'title': 'Lela Evans', 'description': 'Today Makkovik\'s own Pilot Mandy Smith made her inaugural landing on the airstrip in her hometown. What a proud moment as we all cheered and...', - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'uploader': 'Lela Evans', - 'uploader_id': 'pfbid0swT2y7t6TAsZVBvcyeYPdhTMefGaS26mzUwML3vd1ma6ndGZKxsyS4Ssu3jitZLXl', + 'uploader_id': 'pfbid02wjMpknobSMnyynK3TNKN4Ww1StcpAKXgowqTyge3bz7LwHZMQ68uiXzzbu7xeryBl', 'upload_date': '20231228', 'timestamp': 1703804085, 'duration': 394.347, @@ -326,28 +327,27 @@ class FacebookIE(InfoExtractor): 'uploader_id': '100066514874195', 'duration': 4524.001, 'view_count': int, - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'concurrent_view_count': int, }, - 'params': { - 'skip_download': True, - }, + 'params': {'skip_download': True}, }, { # data.node.comet_sections.content.story.attachments[].style_type_renderer.attachment.all_subattachments.nodes[].media 'url': 'https://www.facebook.com/100033620354545/videos/106560053808006/', 'info_dict': { 'id': '106560053808006', 'ext': 'mp4', - 'title': 'Josef', - 'thumbnail': r're:^https?://.*', + 'title': 'Josef Novak on Reels', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'concurrent_view_count': int, - 'uploader_id': 'pfbid02gpfwRM2XvdEJfsERupwQiNmBiDArc38RMRYZnap372q6Vs7MtFTVy72mmFWpJBTKl', + 'uploader_id': 'pfbid0cjYJYXpePWqhZ9DgpB6gKXrN2q3obwducdKm4wT7K5nkhbfKg5cneocYbsdaji7fl', 'timestamp': 1549275572, 'duration': 3.283, 'uploader': 'Josef Novak', 'description': '', 'upload_date': '20190204', }, + 'expected_warnings': ['Cannot parse data'], }, { # data.video.story.attachments[].media 'url': 'https://www.facebook.com/watch/?v=647537299265662', @@ -406,7 +406,7 @@ class FacebookIE(InfoExtractor): 'ext': 'mp4', 'title': 'ANALISI IN CAMPO OSCURO " Coaguli nel sangue dei vaccinati"', 'description': 'Other event by Comitato Liberi Pensatori on Tuesday, October 18 2022', - 'thumbnail': r're:^https?://.*', + 'thumbnail': r're:https?://scontent\.fitm\d-1\.fna\.fbcdn\.net/.+', 'uploader': 'Comitato Liberi Pensatori', 'uploader_id': '100065709540881', }, @@ -414,6 +414,56 @@ class FacebookIE(InfoExtractor): 'url': 'https://www.facebook.com/groups/1513990329015294/posts/d41d8cd9/2013209885760000/?app=fbl', 'only_matching': True, }] + _WEBPAGE_TESTS = [{ + #