diff --git a/.gitignore b/.gitignore index d95a484..0bb80cd 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,8 @@ vnt_current_config.txt logs/* /.tools/ node_modules -vnt-web/ui/dist \ No newline at end of file +vnt-web/ui/dist +vnt-desktop/dist +vnt-desktop/src-tauri/gen +vnt-desktop/src-tauri/icons/android +vnt-desktop/src-tauri/icons/ios diff --git a/.taurignore b/.taurignore new file mode 100644 index 0000000..421bf0d --- /dev/null +++ b/.taurignore @@ -0,0 +1,5 @@ +/node_modules/ +/vnt-desktop/node_modules/ +/vnt-web/ui/node_modules/ +/vnt-desktop/dist/ +/vnt-web/static/ diff --git a/Cargo.lock b/Cargo.lock index 6973b66..58b9372 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "ahash" version = "0.7.8" @@ -22,6 +28,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -120,7 +141,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", "synstructure", ] @@ -132,7 +153,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -169,6 +190,38 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + [[package]] name = "async-lock" version = "3.4.2" @@ -180,6 +233,35 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "async-scoped" version = "0.9.0" @@ -191,6 +273,24 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + [[package]] name = "async-task" version = "4.7.1" @@ -205,7 +305,30 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", ] [[package]] @@ -272,12 +395,33 @@ dependencies = [ "tracing", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -289,6 +433,9 @@ name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +dependencies = [ + "serde_core", +] [[package]] name = "block-buffer" @@ -308,6 +455,15 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "blocking" version = "1.6.2" @@ -321,12 +477,48 @@ dependencies = [ "piper", ] +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bumpalo" version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + [[package]] name = "byteorder" version = "1.5.0" @@ -338,6 +530,9 @@ name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] [[package]] name = "c2rust-bitfields" @@ -356,7 +551,74 @@ checksum = "3b457277798202ccd365b9c112ebee08ddd57f1033916c8b8ea52f222e5b715d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.10.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.11+spec-1.1.0", ] [[package]] @@ -375,6 +637,27 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -406,6 +689,7 @@ checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "num-traits", + "serde", "windows-link 0.2.1", ] @@ -437,10 +721,10 @@ version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -469,7 +753,7 @@ checksum = "9f7c1b60bae2c3d45228dfb096046aa51ef6c300de70b658d7a13fcb0c4f832e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -516,6 +800,16 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "cookie" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" +dependencies = [ + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -542,6 +836,30 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -560,6 +878,24 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-queue" version = "0.3.12" @@ -594,6 +930,29 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.114", +] + [[package]] name = "csv" version = "1.4.0" @@ -615,6 +974,56 @@ dependencies = [ "memchr", ] +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.114", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.114", +] + [[package]] name = "dashmap" version = "6.1.0" @@ -635,6 +1044,48 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", +] + [[package]] name = "der-parser" version = "10.0.0" @@ -656,6 +1107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", + "serde_core", ] [[package]] @@ -676,7 +1128,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 2.0.114", "unicode-xid", ] @@ -717,6 +1169,39 @@ dependencies = [ "crypto-common 0.2.2", ] +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -725,7 +1210,30 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", ] [[package]] @@ -738,6 +1246,66 @@ dependencies = [ "quick-error", ] +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash 0.2.0", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dyn-clone" version = "1.0.20" @@ -750,6 +1318,26 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.0.6+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -765,12 +1353,50 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" version = "0.3.14" @@ -811,6 +1437,25 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -823,6 +1468,16 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "flume" version = "0.12.0" @@ -847,6 +1502,39 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -910,7 +1598,10 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ + "fastrand", "futures-core", + "futures-io", + "parking", "pin-project-lite", ] @@ -922,7 +1613,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -955,6 +1646,105 @@ dependencies = [ "slab", ] +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + [[package]] name = "generator" version = "0.7.5" @@ -1028,12 +1818,154 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.10.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "glob" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1055,7 +1987,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -1064,12 +1996,24 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "hex" version = "0.4.3" @@ -1087,6 +2031,16 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + [[package]] name = "http" version = "1.4.0" @@ -1172,6 +2126,7 @@ dependencies = [ "pin-utils", "smallvec", "tokio", + "want", ] [[package]] @@ -1180,13 +2135,21 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ + "base64 0.22.1", "bytes", + "futures-channel", + "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", + "socket2 0.6.2", "tokio", "tower-service", + "tracing", ] [[package]] @@ -1213,6 +2176,137 @@ dependencies = [ "cc", ] +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.13.0" @@ -1221,6 +2315,17 @@ checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", ] [[package]] @@ -1241,6 +2346,25 @@ dependencies = [ "serde", ] +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -1262,6 +2386,82 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link 0.2.1", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + [[package]] name = "jni" version = "0.21.1" @@ -1294,18 +2494,94 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.10.0", + "serde", + "unicode-segmentation", +] + [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading 0.7.4", + "once_cell", +] + [[package]] name = "libc" version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + [[package]] name = "libloading" version = "0.9.0" @@ -1322,12 +2598,27 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" +[[package]] +name = "libredox" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a" +dependencies = [ + "libc", +] + [[package]] name = "linux-raw-sys" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + [[package]] name = "lock_api" version = "0.4.14" @@ -1429,6 +2720,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + [[package]] name = "matchers" version = "0.2.0" @@ -1481,6 +2783,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "mio" version = "1.1.1" @@ -1498,12 +2810,57 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6" +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.18", + "windows-sys 0.61.2", +] + [[package]] name = "multimap" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.10.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + [[package]] name = "netconfig-rs" version = "0.1.5" @@ -1595,6 +2952,12 @@ dependencies = [ "log", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.30.1" @@ -1696,10 +3059,10 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1711,6 +3074,201 @@ dependencies = [ "libc", ] +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + [[package]] name = "oid-registry" version = "0.8.1" @@ -1732,12 +3290,29 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "open" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cfef937e9c486488c7e3d949ae31c0f1d06bdacd75b99c086cb35356e30408" +dependencies = [ + "dunce", + "is-wsl", + "libc", +] + [[package]] name = "openssl-probe" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-float" version = "2.10.1" @@ -1747,6 +3322,41 @@ dependencies = [ "num-traits", ] +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "parking" version = "2.2.1" @@ -1813,7 +3423,7 @@ version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ - "base64", + "base64 0.22.1", "serde_core", ] @@ -1831,7 +3441,60 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", "hashbrown 0.15.5", - "indexmap", + "indexmap 2.13.0", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", ] [[package]] @@ -1851,7 +3514,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1877,6 +3540,25 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml", + "serde", + "time", +] + [[package]] name = "pnet_base" version = "0.35.0" @@ -1895,7 +3577,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn", + "syn 2.0.114", ] [[package]] @@ -1919,6 +3601,70 @@ dependencies = [ "pnet_macros_support", ] +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.10.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1934,6 +3680,12 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "prettyplease" version = "0.2.37" @@ -1941,7 +3693,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", ] [[package]] @@ -1950,7 +3722,31 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit", + "toml_edit 0.23.10+spec-1.0.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", ] [[package]] @@ -1978,7 +3774,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ - "heck", + "heck 0.5.0", "itertools", "log", "multimap", @@ -1987,7 +3783,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn", + "syn 2.0.114", "tempfile", ] @@ -2001,7 +3797,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -2083,6 +3879,15 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + [[package]] name = "quinn" version = "0.11.9" @@ -2211,6 +4016,12 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + [[package]] name = "rcgen" version = "0.14.7" @@ -2243,6 +4054,17 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + [[package]] name = "reed-solomon-erasure" version = "6.0.0" @@ -2256,6 +4078,26 @@ dependencies = [ "spin", ] +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + [[package]] name = "regex" version = "1.12.3" @@ -2285,6 +4127,40 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http 0.6.11", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + [[package]] name = "ring" version = "0.17.14" @@ -2333,7 +4209,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn", + "syn 2.0.114", "walkdir", ] @@ -2489,6 +4365,57 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.114", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -2524,11 +4451,34 @@ dependencies = [ "libc", ] +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.10.0", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + [[package]] name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -2540,6 +4490,18 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -2567,7 +4529,18 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", ] [[package]] @@ -2594,6 +4567,26 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_spanned" version = "1.0.4" @@ -2615,19 +4608,83 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap", + "indexmap 2.13.0", "itoa", "ryu", "serde", "unsafe-libyaml", ] +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "sha1" version = "0.11.0" @@ -2686,6 +4743,18 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + [[package]] name = "slab" version = "0.4.12" @@ -2718,6 +4787,54 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall 0.5.18", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "spin" version = "0.9.8" @@ -2727,6 +4844,36 @@ dependencies = [ "lock_api", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot 0.12.5", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + [[package]] name = "strsim" version = "0.11.1" @@ -2758,6 +4905,27 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "swift-rs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45c444e496845d3f2a351146bff59aae4975b2280238df1dfaa0c7d1846f38e" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.114" @@ -2769,11 +4937,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sync_wrapper" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" @@ -2783,7 +4965,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -2796,6 +4978,19 @@ dependencies = [ "libc", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + [[package]] name = "tachyonix" version = "0.3.1" @@ -2809,6 +5004,330 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "tao" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.10.0", + "block2", + "core-foundation 0.10.1", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot 0.12.5", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows 0.61.3", +] + +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2 0.10.9", + "syn 2.0.114", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.114", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows 0.61.3", + "zbus", +] + +[[package]] +name = "tauri-plugin-single-instance" +version = "2.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3214becf9ef5783c0ae99a3bb25adf5353a7a16ebf53e74b909e29205735c6c" +dependencies = [ + "serde", + "serde_json", + "tauri", + "thiserror 2.0.18", + "tokio", + "tracing", + "windows-sys 0.60.2", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows 0.61.3", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows 0.61.3", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 1.0.6+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.0.6+spec-1.1.0", +] + [[package]] name = "tcp_ip" version = "0.2.2" @@ -2840,6 +5359,15 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -2875,7 +5403,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -2886,7 +5414,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -2941,6 +5469,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.10.0" @@ -2981,7 +5519,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -3019,19 +5557,55 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + [[package]] name = "toml" version = "0.9.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" dependencies = [ - "indexmap", + "indexmap 2.13.0", "serde_core", - "serde_spanned", - "toml_datetime", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow", + "winnow 0.7.14", +] + +[[package]] +name = "toml" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "399b1124a3c9e16766831c6bba21e50192572cdd98706ea114f9502509686ffc" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.14", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", ] [[package]] @@ -3043,25 +5617,58 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + [[package]] name = "toml_edit" version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ - "indexmap", - "toml_datetime", + "indexmap 2.13.0", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", - "winnow", + "winnow 0.7.14", ] [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow", + "winnow 1.0.4", ] [[package]] @@ -3086,6 +5693,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + [[package]] name = "tower-http" version = "0.7.0" @@ -3144,7 +5769,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -3186,6 +5811,34 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tray-icon" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045979e3f037cd18ad1cb2a419dfda133c5c29c9f3453370079f2255d46c257e" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.18", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tun-rs" version = "2.8.1" @@ -3202,7 +5855,7 @@ dependencies = [ "getifaddrs", "ipnet", "libc", - "libloading", + "libloading 0.9.0", "log", "netconfig-rs", "nix 0.31.1", @@ -3236,6 +5889,12 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typemap-ors" version = "1.0.0" @@ -3251,6 +5910,58 @@ version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + [[package]] name = "unicase" version = "2.9.0" @@ -3302,6 +6013,37 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -3316,6 +6058,7 @@ checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.4", "js-sys", + "serde_core", "wasm-bindgen", ] @@ -3325,6 +6068,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + [[package]] name = "version_check" version = "0.9.5" @@ -3375,6 +6124,25 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "vnt-desktop" +version = "2.0.0" +dependencies = [ + "anyhow", + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-opener", + "tauri-plugin-single-instance", + "tokio", + "tokio-util", + "toml 0.9.11+spec-1.1.0", + "vnt-web", + "vnt2", +] + [[package]] name = "vnt-ipc" version = "2.0.0" @@ -3420,14 +6188,17 @@ dependencies = [ "log", "mime_guess", "parking_lot 0.12.5", + "rand 0.9.2", "route_manager", "rust-embed", "serde", "serde_json", "time", "tokio", - "toml", - "tower-http", + "tokio-util", + "toml 0.9.11+spec-1.1.0", + "tower", + "tower-http 0.7.0", "vnt-core", ] @@ -3444,11 +6215,31 @@ dependencies = [ "route_manager", "serde", "tokio", - "toml", + "toml 0.9.11+spec-1.1.0", "vnt-ipc", "vnt-web", ] +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "waker-fn" version = "1.2.0" @@ -3465,6 +6256,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -3493,6 +6293,20 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.108" @@ -3512,7 +6326,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.114", "wasm-bindgen-shared", ] @@ -3525,6 +6339,29 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "web-time" version = "1.1.0" @@ -3535,6 +6372,98 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web_atoms" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows 0.61.3", + "windows-core 0.61.2", +] + [[package]] name = "widestring" version = "1.2.1" @@ -3572,6 +6501,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + [[package]] name = "windows" version = "0.48.0" @@ -3648,7 +6592,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -3659,7 +6603,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -3848,6 +6792,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -4028,6 +6981,15 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "0.7.14" @@ -4037,6 +6999,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.55.0" @@ -4053,6 +7024,77 @@ version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2 0.10.9", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + [[package]] name = "x509-parser" version = "0.18.1" @@ -4080,6 +7122,99 @@ dependencies = [ "time", ] +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 3.0.3", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + [[package]] name = "zerocopy" version = "0.8.39" @@ -4097,7 +7232,28 @@ checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", ] [[package]] @@ -4106,8 +7262,82 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + [[package]] name = "zmij" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" + +[[package]] +name = "zvariant" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.4", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 3.0.3", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.3", + "winnow 1.0.4", +] diff --git a/Cargo.toml b/Cargo.toml index 8e2a75d..8419a32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2024" [dependencies] vnt-ipc = { path = "vnt-ipc", optional = true } vnt-web = { path = "vnt-web", optional = true } -clap = { version = "4.5", features = ["derive"] } +clap = { version = "4.5", features = ["derive", "env"] } tokio = { workspace = true, features = ["full"] } @@ -43,7 +43,7 @@ path = "src/main_web.rs" required-features = ["vnt-web"] [workspace] -members = ["vnt-web", "vnt-ipc", "vnt-core", "vnt-jni"] +members = ["vnt-web", "vnt-ipc", "vnt-core", "vnt-jni", "vnt-desktop/src-tauri"] [workspace.dependencies] vnt-core = { path = "vnt-core" } diff --git a/README.md b/README.md index a9be007..d761a43 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ 1. vnt2_cli 是一个纯命令行组网工具,可以从命令行参数或配置文件快速启动组网 2. vnt2_ctrl 和vnt2_cli搭配使用,vnt2_cli后台运行时,可以用vnt2_ctrl来获取组网状态 3. vnt2_web 是一个集成web服务的组网工具,带web页面,可以在页面上操作组网 +4. `vnt-desktop` 是基于 Tauri 2 的 PC 客户端,内置组网服务、桌面工作台和系统托盘 ## 使用vnt2_cli组网 @@ -30,20 +31,32 @@ # 启动程序 ./vnt2_web ``` -2. 浏览器打开 http://127.0.0.1:19099 +2. 从启动日志复制带 `?token=...` 的 Web 访问地址;也可以通过 `--token` 或 `VNT_WEB_TOKEN` 指定固定令牌 3. 在页面上添加组网配置,再启动组网 ## 前端构建 web 前端源码位于 `vnt-web/ui/`(Vite + Vue 3 + Pinia + Tailwind CSS v4),构建产物输出到 `vnt-web/static/`,由 RustEmbed 嵌入二进制。 +项目使用根级 pnpm workspace 统一管理 Web 与桌面前端依赖: + ``` -cd vnt-web/ui pnpm install -pnpm build +pnpm build:web ``` -开发调试使用 `pnpm dev`,Vite dev server 会将 `/api` 代理到 `127.0.0.1:19099`(需先启动 vnt2_web)。 +开发调试使用 `pnpm dev:web`,Vite dev server 会将 `/api` 代理到 `127.0.0.1:19099`。启动 `vnt2_web` 时应指定令牌,并在浏览器登录页输入相同令牌。 + +## PC 客户端 + +桌面客户端源码位于 `vnt-desktop/`(Tauri 2 + Vue 3)。桌面工作台通过 Tauri IPC 直接调用进程内 `vnt-core`;需要浏览器访问时,可在“Web 访问”中按需启用同进程 HTTP 服务,无需单独运行 `vnt2_web`。Tauri 与 Web 端统一使用 `vnt-web/ui/src/` 下的同一套响应式前端代码。 + +``` +pnpm install +pnpm dev:desktop +``` + +构建安装包使用 `pnpm build:desktop`。更多说明见 `vnt-desktop/README.md`。 # VNT2.0新特性 diff --git a/package.json b/package.json new file mode 100644 index 0000000..e386142 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "vnt-workspace", + "private": true, + "packageManager": "pnpm@10.34.5", + "scripts": { + "dev:web": "pnpm --filter vnt-web-ui dev", + "build:web": "pnpm --filter vnt-web-ui build", + "dev:desktop-ui": "pnpm --filter vnt-desktop dev", + "dev:desktop": "pnpm --filter vnt-desktop tauri dev", + "build:desktop-ui": "pnpm --filter vnt-desktop build", + "build:desktop": "pnpm --filter vnt-desktop tauri build" + } +} diff --git a/vnt-web/ui/pnpm-lock.yaml b/pnpm-lock.yaml similarity index 87% rename from vnt-web/ui/pnpm-lock.yaml rename to pnpm-lock.yaml index 95908d7..407f05d 100644 --- a/vnt-web/ui/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,31 +4,88 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@tailwindcss/vite': + specifier: ^4.1.12 + version: 4.3.3 + '@vitejs/plugin-vue': + specifier: ^6.0.1 + version: 6.0.8 + pinia: + specifier: ^3.0.3 + version: 3.0.4 + tailwindcss: + specifier: ^4.1.12 + version: 4.3.3 + vite: + specifier: ^7.1.3 + version: 7.3.6 + vue: + specifier: ^3.5.18 + version: 3.5.41 + vue-router: + specifier: ^4.5.1 + version: 4.6.4 + importers: - .: + .: {} + + vnt-desktop: dependencies: + '@tauri-apps/api': + specifier: ^2.8.0 + version: 2.11.1 pinia: - specifier: ^3.0.3 + specifier: 'catalog:' version: 3.0.4(vue@3.5.41) vue: - specifier: ^3.5.18 + specifier: 'catalog:' version: 3.5.41 vue-router: - specifier: ^4.5.1 + specifier: 'catalog:' version: 4.6.4(vue@3.5.41) devDependencies: '@tailwindcss/vite': - specifier: ^4.1.12 + specifier: 'catalog:' version: 4.3.3(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0)) + '@tauri-apps/cli': + specifier: ^2.8.4 + version: 2.11.4 '@vitejs/plugin-vue': - specifier: ^6.0.1 + specifier: 'catalog:' version: 6.0.8(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.41) tailwindcss: - specifier: ^4.1.12 + specifier: 'catalog:' version: 4.3.3 vite: - specifier: ^7.1.3 + specifier: 'catalog:' + version: 7.3.6(jiti@2.7.0)(lightningcss@1.32.0) + + vnt-web/ui: + dependencies: + pinia: + specifier: 'catalog:' + version: 3.0.4(vue@3.5.41) + vue: + specifier: 'catalog:' + version: 3.5.41 + vue-router: + specifier: 'catalog:' + version: 4.6.4(vue@3.5.41) + devDependencies: + '@tailwindcss/vite': + specifier: 'catalog:' + version: 4.3.3(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0)) + '@vitejs/plugin-vue': + specifier: 'catalog:' + version: 6.0.8(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.41) + tailwindcss: + specifier: 'catalog:' + version: 4.3.3 + vite: + specifier: 'catalog:' version: 7.3.6(jiti@2.7.0)(lightningcss@1.32.0) packages: @@ -464,6 +521,85 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 + '@tauri-apps/api@2.11.1': + resolution: {integrity: sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==} + + '@tauri-apps/cli-darwin-arm64@2.11.4': + resolution: {integrity: sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tauri-apps/cli-darwin-x64@2.11.4': + resolution: {integrity: sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4': + resolution: {integrity: sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tauri-apps/cli-linux-arm64-gnu@2.11.4': + resolution: {integrity: sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tauri-apps/cli-linux-arm64-musl@2.11.4': + resolution: {integrity: sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tauri-apps/cli-linux-riscv64-gnu@2.11.4': + resolution: {integrity: sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@tauri-apps/cli-linux-x64-gnu@2.11.4': + resolution: {integrity: sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tauri-apps/cli-linux-x64-musl@2.11.4': + resolution: {integrity: sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tauri-apps/cli-win32-arm64-msvc@2.11.4': + resolution: {integrity: sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tauri-apps/cli-win32-ia32-msvc@2.11.4': + resolution: {integrity: sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@tauri-apps/cli-win32-x64-msvc@2.11.4': + resolution: {integrity: sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tauri-apps/cli@2.11.4': + resolution: {integrity: sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==} + engines: {node: '>= 10'} + hasBin: true + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} @@ -1019,6 +1155,55 @@ snapshots: tailwindcss: 4.3.3 vite: 7.3.6(jiti@2.7.0)(lightningcss@1.32.0) + '@tauri-apps/api@2.11.1': {} + + '@tauri-apps/cli-darwin-arm64@2.11.4': + optional: true + + '@tauri-apps/cli-darwin-x64@2.11.4': + optional: true + + '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4': + optional: true + + '@tauri-apps/cli-linux-arm64-gnu@2.11.4': + optional: true + + '@tauri-apps/cli-linux-arm64-musl@2.11.4': + optional: true + + '@tauri-apps/cli-linux-riscv64-gnu@2.11.4': + optional: true + + '@tauri-apps/cli-linux-x64-gnu@2.11.4': + optional: true + + '@tauri-apps/cli-linux-x64-musl@2.11.4': + optional: true + + '@tauri-apps/cli-win32-arm64-msvc@2.11.4': + optional: true + + '@tauri-apps/cli-win32-ia32-msvc@2.11.4': + optional: true + + '@tauri-apps/cli-win32-x64-msvc@2.11.4': + optional: true + + '@tauri-apps/cli@2.11.4': + optionalDependencies: + '@tauri-apps/cli-darwin-arm64': 2.11.4 + '@tauri-apps/cli-darwin-x64': 2.11.4 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.11.4 + '@tauri-apps/cli-linux-arm64-gnu': 2.11.4 + '@tauri-apps/cli-linux-arm64-musl': 2.11.4 + '@tauri-apps/cli-linux-riscv64-gnu': 2.11.4 + '@tauri-apps/cli-linux-x64-gnu': 2.11.4 + '@tauri-apps/cli-linux-x64-musl': 2.11.4 + '@tauri-apps/cli-win32-arm64-msvc': 2.11.4 + '@tauri-apps/cli-win32-ia32-msvc': 2.11.4 + '@tauri-apps/cli-win32-x64-msvc': 2.11.4 + '@types/estree@1.0.9': {} '@vitejs/plugin-vue@6.0.8(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.41)': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..536786c --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,12 @@ +packages: + - "vnt-web/ui" + - "vnt-desktop" + +catalog: + "@tailwindcss/vite": ^4.1.12 + "@vitejs/plugin-vue": ^6.0.1 + pinia: ^3.0.3 + tailwindcss: ^4.1.12 + vite: ^7.1.3 + vue: ^3.5.18 + vue-router: ^4.5.1 diff --git a/src/main_web.rs b/src/main_web.rs index abe2eb7..dee3c7b 100644 --- a/src/main_web.rs +++ b/src/main_web.rs @@ -15,6 +15,9 @@ struct Args { /// 加载vnt配置路径,配置内容参考web端的配置格式 #[clap(long)] conf: Option, + /// Web API 访问令牌;未指定时会生成随机令牌并输出到日志 + #[clap(long, env = "VNT_WEB_TOKEN")] + token: Option, } #[tokio::main] @@ -31,6 +34,19 @@ async fn main0() -> anyhow::Result<()> { #[cfg(windows)] extract_wintun_dll::extract_wintun(); let addr = args.addr.unwrap_or("127.0.0.1:19099".parse()?); - vnt_web::run_http_server(addr, args.conf).await?; + let token = args.token.unwrap_or_else(vnt_web::generate_access_token); + let browser_host = if addr.ip().is_unspecified() { + "127.0.0.1".to_string() + } else { + addr.ip().to_string() + }; + log::info!("Web access token: {}", token); + log::info!( + "Web access URL: http://{}:{}/?token={}", + browser_host, + addr.port(), + token + ); + vnt_web::run_http_server(addr, args.conf, token).await?; Ok(()) } diff --git a/vnt-desktop/README.md b/vnt-desktop/README.md new file mode 100644 index 0000000..f71dce3 --- /dev/null +++ b/vnt-desktop/README.md @@ -0,0 +1,59 @@ +# VNT Desktop + +基于 Tauri 2 + Vue 3 的 VNT PC 客户端。桌面端直接内置 `vnt-web` 的服务能力,不需要另行启动 `vnt2_web`。 + +桌面端与 Web 端共用 `vnt-web/ui/src/` 下的同一套 Vue 应用、路由、状态、组件和样式。`vnt-desktop/src/main.js` 只负责注册 Tauri IPC 桥接,不维护第二套界面代码。 + +## 功能 + +- 桌面工作台:总览、实例、在线设备、路由和配置管理 +- 多实例启动、停止、重启及启动日志 +- 表单 / TOML 双模式配置编辑 +- 原生窗口、系统托盘、单实例运行 +- 关闭主窗口时隐藏到托盘,托盘菜单可彻底退出 +- 深浅主题与 `Ctrl/Cmd + 1~5` 页面快捷键 +- 响应式布局:桌面侧栏、移动端顶部栏和抽屉导航 +- 桌面工作台通过 Tauri IPC 直接调用进程内 `vnt-core`,不监听本地 API 端口 +- 可选 Web 访问:启停、端口、本机/局域网监听范围、访问令牌、打开浏览器 +- Web API 强制使用 Bearer 令牌鉴权,令牌可在桌面端重新生成 + +桌面数据存放在系统应用数据目录的 `com.vnt.desktop` 下,包括 `vnt_config`、自启动记录、`web_access.toml`、日志及 Windows 下的 `wintun.dll`。 + +## 开发 + +要求:Rust、Node.js、pnpm,以及 Tauri 2 对应的系统依赖。 + +依赖由仓库根目录的 pnpm workspace 统一管理: + +```powershell +pnpm install +pnpm dev:desktop +``` + +只验证前端: + +```powershell +pnpm build:desktop-ui +``` + +验证 Rust 桌面模块: + +```powershell +cargo check -p vnt-desktop +``` + +## 打包 + +```powershell +pnpm build:desktop +``` + +Windows 使用虚拟网卡模式时,可能需要以管理员身份运行。 + +## 应用图标 + +图标母版保存在 `vnt-desktop/assets/vnt-icon-master.png`。需要重新生成各平台图标时,在仓库根目录执行: + +```powershell +pnpm --filter vnt-desktop tauri icon assets/vnt-icon-master.png --ios-color '#4F46E5' +``` diff --git a/vnt-desktop/assets/vnt-icon-master.png b/vnt-desktop/assets/vnt-icon-master.png new file mode 100644 index 0000000..341e00b Binary files /dev/null and b/vnt-desktop/assets/vnt-icon-master.png differ diff --git a/vnt-desktop/index.html b/vnt-desktop/index.html new file mode 100644 index 0000000..67b84c1 --- /dev/null +++ b/vnt-desktop/index.html @@ -0,0 +1,13 @@ + + + + + + + VNT Desktop + + +
+ + + diff --git a/vnt-desktop/package.json b/vnt-desktop/package.json new file mode 100644 index 0000000..09c2603 --- /dev/null +++ b/vnt-desktop/package.json @@ -0,0 +1,24 @@ +{ + "name": "vnt-desktop", + "private": true, + "version": "2.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "tauri": "tauri" + }, + "dependencies": { + "@tauri-apps/api": "^2.8.0", + "pinia": "catalog:", + "vue": "catalog:", + "vue-router": "catalog:" + }, + "devDependencies": { + "@tailwindcss/vite": "catalog:", + "@tauri-apps/cli": "^2.8.4", + "@vitejs/plugin-vue": "catalog:", + "tailwindcss": "catalog:", + "vite": "catalog:" + } +} diff --git a/vnt-desktop/src-tauri/Cargo.toml b/vnt-desktop/src-tauri/Cargo.toml new file mode 100644 index 0000000..f1ad067 --- /dev/null +++ b/vnt-desktop/src-tauri/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "vnt-desktop" +version = "2.0.0" +description = "VNT virtual network desktop client" +edition = "2024" + +[lib] +name = "vnt_desktop_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2.6.3", features = [] } + +[dependencies] +tauri = { version = "2.11.5", features = ["tray-icon"] } +tauri-plugin-single-instance = "2.4.3" +tauri-plugin-opener = "2" +vnt-web = { path = "../../vnt-web" } +vnt2 = { path = "../.." } +log.workspace = true +tokio = { workspace = true, features = ["full"] } +tokio-util.workspace = true +serde.workspace = true +serde_json.workspace = true +toml.workspace = true +anyhow.workspace = true diff --git a/vnt-desktop/src-tauri/build.rs b/vnt-desktop/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/vnt-desktop/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/vnt-desktop/src-tauri/capabilities/default.json b/vnt-desktop/src-tauri/capabilities/default.json new file mode 100644 index 0000000..c4a35a1 --- /dev/null +++ b/vnt-desktop/src-tauri/capabilities/default.json @@ -0,0 +1,16 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "desktop-capability", + "description": "VNT Desktop main window permissions", + "windows": ["main"], + "permissions": [ + "core:default", + "core:window:allow-close", + "core:window:allow-minimize", + "core:window:allow-maximize", + "core:window:allow-unmaximize", + "core:window:allow-is-maximized", + "core:window:allow-start-dragging", + "opener:allow-open-url" + ] +} diff --git a/vnt-desktop/src-tauri/icons/128x128.png b/vnt-desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000..70a03ec Binary files /dev/null and b/vnt-desktop/src-tauri/icons/128x128.png differ diff --git a/vnt-desktop/src-tauri/icons/128x128@2x.png b/vnt-desktop/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..d33e349 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/128x128@2x.png differ diff --git a/vnt-desktop/src-tauri/icons/32x32.png b/vnt-desktop/src-tauri/icons/32x32.png new file mode 100644 index 0000000..e9a3968 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/32x32.png differ diff --git a/vnt-desktop/src-tauri/icons/64x64.png b/vnt-desktop/src-tauri/icons/64x64.png new file mode 100644 index 0000000..2eae487 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/64x64.png differ diff --git a/vnt-desktop/src-tauri/icons/Square107x107Logo.png b/vnt-desktop/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..9c21f78 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square107x107Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/Square142x142Logo.png b/vnt-desktop/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..ac3ead2 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square142x142Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/Square150x150Logo.png b/vnt-desktop/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..b1bbc19 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square150x150Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/Square284x284Logo.png b/vnt-desktop/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..0bc0eb6 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square284x284Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/Square30x30Logo.png b/vnt-desktop/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..9346435 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square30x30Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/Square310x310Logo.png b/vnt-desktop/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..d563ce1 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square310x310Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/Square44x44Logo.png b/vnt-desktop/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..d9db8d3 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square44x44Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/Square71x71Logo.png b/vnt-desktop/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..63966b7 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square71x71Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/Square89x89Logo.png b/vnt-desktop/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..ce41fdb Binary files /dev/null and b/vnt-desktop/src-tauri/icons/Square89x89Logo.png differ diff --git a/vnt-desktop/src-tauri/icons/StoreLogo.png b/vnt-desktop/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..89d4fe2 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/StoreLogo.png differ diff --git a/vnt-desktop/src-tauri/icons/icon.icns b/vnt-desktop/src-tauri/icons/icon.icns new file mode 100644 index 0000000..6fe123e Binary files /dev/null and b/vnt-desktop/src-tauri/icons/icon.icns differ diff --git a/vnt-desktop/src-tauri/icons/icon.ico b/vnt-desktop/src-tauri/icons/icon.ico new file mode 100644 index 0000000..66f4958 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/icon.ico differ diff --git a/vnt-desktop/src-tauri/icons/icon.png b/vnt-desktop/src-tauri/icons/icon.png new file mode 100644 index 0000000..d5c32a9 Binary files /dev/null and b/vnt-desktop/src-tauri/icons/icon.png differ diff --git a/vnt-desktop/src-tauri/src/lib.rs b/vnt-desktop/src-tauri/src/lib.rs new file mode 100644 index 0000000..371e925 --- /dev/null +++ b/vnt-desktop/src-tauri/src/lib.rs @@ -0,0 +1,322 @@ +use serde::{Deserialize, Serialize}; +use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket}; +use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicBool, Ordering}; +use tauri::menu::{Menu, MenuItem}; +use tauri::tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}; +use tauri::{AppHandle, Manager, WindowEvent}; +use tauri_plugin_opener::OpenerExt; +use tokio_util::sync::CancellationToken; +use vnt_web::VntService; + +#[cfg(windows)] +mod wintun; + +static EXITING: AtomicBool = AtomicBool::new(false); +const WEB_ACCESS_CONFIG: &str = "web_access.toml"; + +#[derive(Clone, Deserialize, Serialize)] +#[serde(default)] +struct WebAccessConfig { + enabled: bool, + port: u16, + global: bool, + token: String, +} + +impl Default for WebAccessConfig { + fn default() -> Self { + Self { + enabled: false, + port: 19099, + global: false, + token: vnt_web::generate_access_token(), + } + } +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct WebAccessStatus { + enabled: bool, + running: bool, + port: u16, + global: bool, + token: String, + url: String, + listen_address: String, +} + +struct WebRuntime { + config: WebAccessConfig, + cancellation: Option, + handle: Option>>, +} + +struct DesktopState { + service: VntService, + web: tokio::sync::Mutex, + config_path: PathBuf, +} + +fn load_web_config(path: &Path) -> WebAccessConfig { + let mut config: WebAccessConfig = std::fs::read_to_string(path) + .ok() + .and_then(|text| toml::from_str(&text).ok()) + .unwrap_or_default(); + if config.port == 0 { + config.port = 19099; + } + if config.token.len() < 16 { + config.token = vnt_web::generate_access_token(); + } + config +} + +fn save_web_config(path: &Path, config: &WebAccessConfig) -> anyhow::Result<()> { + std::fs::write(path, toml::to_string_pretty(config)?)?; + Ok(()) +} + +fn listen_addr(config: &WebAccessConfig) -> SocketAddr { + let ip = if config.global { + IpAddr::V4(Ipv4Addr::UNSPECIFIED) + } else { + IpAddr::V4(Ipv4Addr::LOCALHOST) + }; + SocketAddr::new(ip, config.port) +} + +fn lan_ip() -> Option { + let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 0)).ok()?; + socket.connect((Ipv4Addr::new(8, 8, 8, 8), 80)).ok()?; + Some(socket.local_addr().ok()?.ip()) +} + +fn access_url(config: &WebAccessConfig) -> String { + let host = if config.global { + lan_ip().unwrap_or(IpAddr::V4(Ipv4Addr::LOCALHOST)) + } else { + IpAddr::V4(Ipv4Addr::LOCALHOST) + }; + format!("http://{}:{}/?token={}", host, config.port, config.token) +} + +async fn stop_web(runtime: &mut WebRuntime) { + if let Some(cancellation) = runtime.cancellation.take() { + cancellation.cancel(); + } + if let Some(handle) = runtime.handle.take() { + match handle.await { + Ok(Ok(())) => {} + Ok(Err(error)) => log::warn!("Web service stopped with error: {error:#}"), + Err(error) if !error.is_cancelled() => log::warn!("Web service task failed: {error}"), + Err(_) => {} + } + } +} + +async fn start_web(service: &VntService, runtime: &mut WebRuntime) -> anyhow::Result<()> { + if !runtime.config.enabled { + return Ok(()); + } + let cancellation = CancellationToken::new(); + let handle = service + .start_http( + listen_addr(&runtime.config), + runtime.config.token.clone(), + cancellation.clone(), + ) + .await?; + runtime.cancellation = Some(cancellation); + runtime.handle = Some(handle); + Ok(()) +} + +#[tauri::command] +async fn api_request( + state: tauri::State<'_, DesktopState>, + method: String, + path: String, + body: Option, +) -> Result { + if !path.starts_with("/api/") { + return Err("只允许调用 VNT API".to_string()); + } + state + .service + .request(&method, &path, body) + .await + .map_err(|error| format!("{error:#}")) +} + +fn web_status(runtime: &WebRuntime) -> WebAccessStatus { + WebAccessStatus { + enabled: runtime.config.enabled, + running: runtime + .handle + .as_ref() + .is_some_and(|handle| !handle.is_finished()), + port: runtime.config.port, + global: runtime.config.global, + token: runtime.config.token.clone(), + url: access_url(&runtime.config), + listen_address: listen_addr(&runtime.config).to_string(), + } +} + +#[tauri::command] +async fn web_access_status( + state: tauri::State<'_, DesktopState>, +) -> Result { + let runtime = state.web.lock().await; + Ok(web_status(&runtime)) +} + +#[tauri::command] +async fn update_web_access( + state: tauri::State<'_, DesktopState>, + config: WebAccessConfig, +) -> Result { + if config.port == 0 { + return Err("监听端口必须在 1-65535 之间".to_string()); + } + if config.token.len() < 16 { + return Err("访问令牌至少需要 16 个字符".to_string()); + } + + let mut runtime = state.web.lock().await; + stop_web(&mut runtime).await; + let previous = runtime.config.clone(); + runtime.config = config; + if let Err(error) = start_web(&state.service, &mut runtime).await { + runtime.config = previous; + if let Err(restore_error) = start_web(&state.service, &mut runtime).await { + log::error!("Failed to restore Web service: {restore_error:#}"); + } + return Err(format!("无法启动 Web 服务:{error:#}")); + } + save_web_config(&state.config_path, &runtime.config) + .map_err(|error| format!("保存 Web 访问设置失败:{error:#}"))?; + Ok(web_status(&runtime)) +} + +#[tauri::command] +fn generate_web_token() -> String { + vnt_web::generate_access_token() +} + +#[tauri::command] +fn open_web_url(app: AppHandle, url: String) -> Result<(), String> { + if !url.starts_with("http://") && !url.starts_with("https://") { + return Err("只允许打开 HTTP(S) 地址".to_string()); + } + app.opener() + .open_url(url, None::<&str>) + .map_err(|error| error.to_string()) +} + +fn show_main_window(app: &AppHandle) { + if let Some(window) = app.get_webview_window("main") { + let _ = window.show(); + let _ = window.unminimize(); + let _ = window.set_focus(); + } +} + +fn toggle_main_window(app: &AppHandle) { + if let Some(window) = app.get_webview_window("main") { + match window.is_visible() { + Ok(true) => { + let _ = window.hide(); + } + _ => show_main_window(app), + } + } +} + +pub fn run() { + tauri::Builder::default() + .invoke_handler(tauri::generate_handler![ + api_request, + web_access_status, + update_web_access, + generate_web_token, + open_web_url + ]) + .plugin(tauri_plugin_opener::init()) + .plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| { + show_main_window(app); + })) + .setup(|app| { + let data_dir = app.path().app_data_dir()?; + std::fs::create_dir_all(&data_dir)?; + std::env::set_current_dir(&data_dir)?; + vnt2::log::log_init("vnt-desktop"); + + #[cfg(windows)] + wintun::ensure_wintun(&data_dir)?; + + let config_path = data_dir.join(WEB_ACCESS_CONFIG); + let config = load_web_config(&config_path); + save_web_config(&config_path, &config)?; + let service = tauri::async_runtime::block_on(VntService::new(None))?; + let mut web = WebRuntime { + config, + cancellation: None, + handle: None, + }; + if let Err(error) = tauri::async_runtime::block_on(start_web(&service, &mut web)) { + log::error!("Failed to restore Web access service: {error:#}"); + web.config.enabled = false; + save_web_config(&config_path, &web.config)?; + } + app.manage(DesktopState { + service, + web: tokio::sync::Mutex::new(web), + config_path, + }); + + let show = MenuItem::with_id(app, "show", "显示主窗口", true, None::<&str>)?; + let quit = MenuItem::with_id(app, "quit", "退出 VNT", true, None::<&str>)?; + let menu = Menu::with_items(app, &[&show, &quit])?; + + let mut tray = TrayIconBuilder::with_id("vnt-tray") + .tooltip("VNT Desktop") + .menu(&menu) + .show_menu_on_left_click(false) + .on_menu_event(|app, event| match event.id.as_ref() { + "show" => show_main_window(app), + "quit" => { + EXITING.store(true, Ordering::SeqCst); + app.exit(0); + } + _ => {} + }) + .on_tray_icon_event(|tray, event| { + if let TrayIconEvent::Click { + button: MouseButton::Left, + button_state: MouseButtonState::Up, + .. + } = event + { + toggle_main_window(tray.app_handle()); + } + }); + if let Some(icon) = app.default_window_icon() { + tray = tray.icon(icon.clone()); + } + tray.build(app)?; + Ok(()) + }) + .on_window_event(|window, event| { + if let WindowEvent::CloseRequested { api, .. } = event + && !EXITING.load(Ordering::SeqCst) + { + api.prevent_close(); + let _ = window.hide(); + } + }) + .run(tauri::generate_context!()) + .expect("error while running VNT Desktop"); +} diff --git a/vnt-desktop/src-tauri/src/main.rs b/vnt-desktop/src-tauri/src/main.rs new file mode 100644 index 0000000..39949ae --- /dev/null +++ b/vnt-desktop/src-tauri/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + vnt_desktop_lib::run(); +} diff --git a/vnt-desktop/src-tauri/src/wintun.rs b/vnt-desktop/src-tauri/src/wintun.rs new file mode 100644 index 0000000..a2e4969 --- /dev/null +++ b/vnt-desktop/src-tauri/src/wintun.rs @@ -0,0 +1,20 @@ +use std::io; +use std::path::Path; + +#[cfg(target_arch = "x86_64")] +const WINTUN_DLL: &[u8] = include_bytes!("../../../dll/amd64/wintun.dll"); +#[cfg(target_arch = "x86")] +const WINTUN_DLL: &[u8] = include_bytes!("../../../dll/x86/wintun.dll"); +#[cfg(target_arch = "aarch64")] +const WINTUN_DLL: &[u8] = include_bytes!("../../../dll/arm64/wintun.dll"); +#[cfg(target_arch = "arm")] +const WINTUN_DLL: &[u8] = include_bytes!("../../../dll/arm/wintun.dll"); + +pub fn ensure_wintun(data_dir: &Path) -> io::Result<()> { + let target = data_dir.join("wintun.dll"); + let current = std::fs::read(&target).unwrap_or_default(); + if current != WINTUN_DLL { + std::fs::write(target, WINTUN_DLL)?; + } + Ok(()) +} diff --git a/vnt-desktop/src-tauri/tauri.conf.json b/vnt-desktop/src-tauri/tauri.conf.json new file mode 100644 index 0000000..6756dab --- /dev/null +++ b/vnt-desktop/src-tauri/tauri.conf.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "VNT Desktop", + "version": "2.0.0", + "identifier": "com.vnt.desktop", + "build": { + "beforeDevCommand": "pnpm dev", + "devUrl": "http://127.0.0.1:1420", + "beforeBuildCommand": "pnpm build", + "frontendDist": "../dist" + }, + "app": { + "windows": [ + { + "label": "main", + "title": "VNT Desktop", + "width": 1180, + "height": 760, + "minWidth": 820, + "minHeight": 600, + "center": true, + "decorations": true, + "resizable": true, + "shadow": true + } + ], + "security": { + "csp": "default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' asset: data:; connect-src 'self' ipc: http://ipc.localhost http://127.0.0.1:*" + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "category": "Utility", + "shortDescription": "轻量、高效的虚拟局域网桌面客户端", + "longDescription": "VNT Desktop 用于创建和管理安全、快速的虚拟局域网连接。", + "windows": { + "wix": { "language": "zh-CN" }, + "nsis": { "displayLanguageSelector": false } + } + } +} diff --git a/vnt-desktop/src/main.js b/vnt-desktop/src/main.js new file mode 100644 index 0000000..13f5dd9 --- /dev/null +++ b/vnt-desktop/src/main.js @@ -0,0 +1,14 @@ +import { invoke } from "@tauri-apps/api/core"; + +globalThis.__VNT_DESKTOP__ = true; +globalThis.__VNT_IPC_REQUEST__ = ({ method, path, body }) => + invoke("api_request", { method, path, body }); +globalThis.__VNT_WEB_ACCESS__ = { + status: () => invoke("web_access_status"), + update: (config) => invoke("update_web_access", { config }), + generateToken: () => invoke("generate_web_token"), + openUrl: (url) => invoke("open_web_url", { url }), +}; + +// Tauri 与 Web 端共用同一个 Vue 应用,这里只负责平台初始化。 +await import("@shared/main.js"); diff --git a/vnt-desktop/vite.config.js b/vnt-desktop/vite.config.js new file mode 100644 index 0000000..11a12f0 --- /dev/null +++ b/vnt-desktop/vite.config.js @@ -0,0 +1,24 @@ +import { fileURLToPath, URL } from "node:url"; +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import tailwindcss from "@tailwindcss/vite"; + +const sharedUi = fileURLToPath(new URL("../vnt-web/ui/src", import.meta.url)); +const desktopRoot = fileURLToPath(new URL(".", import.meta.url)); + +export default defineConfig({ + plugins: [vue(), tailwindcss()], + resolve: { + alias: { + "@shared": sharedUi, + }, + }, + server: { + port: 1420, + strictPort: true, + host: "127.0.0.1", + fs: { allow: [desktopRoot, sharedUi] }, + watch: { ignored: ["**/src-tauri/**"] }, + }, + clearScreen: false, +}); diff --git a/vnt-web/Cargo.toml b/vnt-web/Cargo.toml index 0f43490..dd732d6 100644 --- a/vnt-web/Cargo.toml +++ b/vnt-web/Cargo.toml @@ -8,6 +8,7 @@ vnt-core.workspace = true tokio = { workspace = true, features = ["full"] } axum = "0.8.8" tower-http = { version = "0.7", features = ["fs", "cors", "trace"] } +tower = { version = "0.5", features = ["util"] } serde.workspace = true serde_json.workspace = true @@ -21,3 +22,5 @@ rust-embed = "8.0" mime_guess = "2.0" parking_lot.workspace = true time = { workspace = true, features = ["local-offset", "formatting", "macros"] } +tokio-util.workspace = true +rand = "0.9" diff --git a/vnt-web/src/lib.rs b/vnt-web/src/lib.rs index 44d9192..b4fbe71 100644 --- a/vnt-web/src/lib.rs +++ b/vnt-web/src/lib.rs @@ -1,6 +1,6 @@ mod service_http; -pub use service_http::run_http_server; +pub use service_http::{VntService, generate_access_token, run_http_server}; struct ScopeGuard(Option); diff --git a/vnt-web/src/service_http.rs b/vnt-web/src/service_http.rs index 8ccc2bd..42b092a 100644 --- a/vnt-web/src/service_http.rs +++ b/vnt-web/src/service_http.rs @@ -1,7 +1,7 @@ use crate::defer; use anyhow::{Context, anyhow, bail}; -use axum::body::Body; -use axum::http::{HeaderMap, HeaderValue, StatusCode, Uri, header}; +use axum::body::{Body, to_bytes}; +use axum::http::{HeaderMap, HeaderValue, Method, StatusCode, Uri, header}; use axum::response::IntoResponse; use axum::{ Json, Router, @@ -13,6 +13,7 @@ use axum::{ use ipnet::Ipv4Net; use mime_guess::from_path; use parking_lot::Mutex; +use rand::Rng; use rust_embed::RustEmbed; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -23,6 +24,8 @@ use std::time::{Instant, SystemTime, UNIX_EPOCH}; use time::{OffsetDateTime, format_description}; use tokio::fs; use tokio::net::TcpListener; +use tokio_util::sync::CancellationToken; +use tower::ServiceExt; use tower_http::cors::{Any, CorsLayer}; use vnt_core::api::VntApi; use vnt_core::context::config::Config as CoreConfig; @@ -465,37 +468,86 @@ async fn logging_middleware(req: Request, next: axum::middleware::Next) -> Respo #[folder = "static/"] struct Asset; -pub async fn run_http_server( - addr: SocketAddr, - start_config_file_name: Option, -) -> anyhow::Result<()> { - fs::create_dir_all(CONFIG_DIR) - .await - .context("Failed to create config directory")?; +/// 进程内 VNT 业务服务。HTTP 和 Tauri IPC 共用同一组 handler 与状态。 +#[derive(Clone)] +pub struct VntService { + router: Router, +} - let state = HttpAppState { - inner: Arc::new(Default::default()), - }; +impl VntService { + pub async fn new(start_config_file_name: Option) -> anyhow::Result { + fs::create_dir_all(CONFIG_DIR) + .await + .context("Failed to create config directory")?; - // 自动启动逻辑 - let auto_start_files = determine_auto_start_files(start_config_file_name).await; + let state = HttpAppState { + inner: Arc::new(Default::default()), + }; - for (file_name, path) in auto_start_files { - log::info!("Auto starting VNT with config: {:?}", path); - let state_clone = state.clone(); - tokio::spawn(async move { - if let Err(e) = start_vnt_internal(&state_clone, file_name, path).await { - log::error!("Auto start failed: {:?}", e); - } - }); + for (file_name, path) in determine_auto_start_files(start_config_file_name).await { + log::info!("Auto starting VNT with config: {:?}", path); + let state_clone = state.clone(); + tokio::spawn(async move { + if let Err(e) = start_vnt_internal(&state_clone, file_name, path).await { + log::error!("Auto start failed: {:?}", e); + } + }); + } + + Ok(Self { + router: api_router(state), + }) } - let cors = CorsLayer::new() - .allow_origin(Any) - .allow_methods(Any) - .allow_headers(Any); + /// 由 Tauri command 调用,不经过 TCP/HTTP 监听端口。 + pub async fn request( + &self, + method: &str, + path: &str, + body: Option, + ) -> anyhow::Result { + let method = Method::from_bytes(method.as_bytes()).context("Invalid request method")?; + let request = axum::http::Request::builder() + .method(method) + .uri(path) + .header(header::CONTENT_TYPE, "application/json") + .body(Body::from(body.unwrap_or_default()))?; + let response = self.router.clone().oneshot(request).await?; + let status = response.status(); + let bytes = to_bytes(response.into_body(), 8 * 1024 * 1024).await?; + let value: serde_json::Value = serde_json::from_slice(&bytes) + .with_context(|| format!("Invalid service response ({status})"))?; + Ok(value) + } - let app = Router::new() + /// 在当前进程中按需开放带令牌鉴权的 Web 服务。 + pub async fn start_http( + &self, + addr: SocketAddr, + token: String, + cancellation: CancellationToken, + ) -> anyhow::Result>> { + let listener = TcpListener::bind(addr).await?; + let actual_addr = listener.local_addr()?; + let app = http_router(self.router.clone(), token); + log::info!("HTTP API Listening on http://{}", actual_addr); + Ok(tokio::spawn(async move { + axum::serve(listener, app) + .with_graceful_shutdown(cancellation.cancelled_owned()) + .await?; + Ok(()) + })) + } +} + +pub fn generate_access_token() -> String { + let mut bytes = [0_u8; 24]; + rand::rng().fill(&mut bytes); + bytes.iter().map(|byte| format!("{byte:02x}")).collect() +} + +fn api_router(state: HttpAppState) -> Router { + Router::new() .route("/api/version", get(get_version)) .route("/api/info", get(get_info)) .route("/api/peers", get(get_peers)) @@ -511,17 +563,56 @@ pub async fn run_http_server( "/api/config", get(get_config).post(save_config).delete(delete_config), ) + .with_state(state) +} + +async fn token_auth_middleware( + State(token): State, + req: Request, + next: axum::middleware::Next, +) -> Response { + let authorized = req + .headers() + .get(header::AUTHORIZATION) + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.strip_prefix("Bearer ")) + .is_some_and(|provided| provided == token); + if !authorized { + return ( + StatusCode::UNAUTHORIZED, + Json(ApiResponse::<()>::error("访问令牌无效或已过期")), + ) + .into_response(); + } + next.run(req).await +} + +fn http_router(api: Router, token: String) -> Router { + let cors = CorsLayer::new() + .allow_origin(Any) + .allow_methods(Any) + .allow_headers(Any); + Router::new() + .merge(api.layer(middleware::from_fn_with_state( + token, + token_auth_middleware, + ))) + .fallback(static_handler) .layer(cors) .layer(middleware::from_fn(logging_middleware)) - .with_state(state) - .fallback(static_handler); - - log::info!("HTTP API Listening on http://{}", addr); - let listener = TcpListener::bind(addr).await?; - axum::serve(listener, app) - .with_graceful_shutdown(shutdown_signal()) - .await?; +} +pub async fn run_http_server( + addr: SocketAddr, + start_config_file_name: Option, + token: String, +) -> anyhow::Result<()> { + let service = VntService::new(start_config_file_name).await?; + let cancellation = CancellationToken::new(); + let handle = service.start_http(addr, token, cancellation.clone()).await?; + shutdown_signal().await; + cancellation.cancel(); + handle.await??; Ok(()) } @@ -1498,6 +1589,45 @@ async fn get_routes( mod tests { use super::*; + #[tokio::test] + async fn test_ipc_request_uses_in_process_router() { + let service = VntService { + router: api_router(new_test_state()), + }; + let response = service.request("GET", "/api/version", None).await.unwrap(); + assert_eq!(response["code"], 0); + assert!(response["data"].as_str().is_some_and(|value| !value.is_empty())); + } + + #[tokio::test] + async fn test_http_api_requires_bearer_token() { + let token = "test-token-with-enough-entropy".to_string(); + let app = http_router(api_router(new_test_state()), token.clone()); + let unauthorized = app + .clone() + .oneshot( + axum::http::Request::builder() + .uri("/api/version") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(unauthorized.status(), StatusCode::UNAUTHORIZED); + + let authorized = app + .oneshot( + axum::http::Request::builder() + .uri("/api/version") + .header(header::AUTHORIZATION, format!("Bearer {token}")) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(authorized.status(), StatusCode::OK); + } + #[test] fn test_normalize_config_file_name() { // 无扩展名补 .toml diff --git a/vnt-web/static/assets/index-BgNGjSZS.css b/vnt-web/static/assets/index-BgNGjSZS.css new file mode 100644 index 0000000..dbc44ef --- /dev/null +++ b/vnt-web/static/assets/index-BgNGjSZS.css @@ -0,0 +1 @@ +.config-card-actions[data-v-b7dce6ea]{opacity:1}@media(min-width:640px)and (hover:hover)and (pointer:fine){.config-card-actions[data-v-b7dce6ea]{opacity:0}.group:hover .config-card-actions[data-v-b7dce6ea],.group:focus-within .config-card-actions[data-v-b7dce6ea]{opacity:1}}.web-switch[data-v-2bc5d3bf]{position:relative;display:inline-flex;flex:0 0 44px;align-items:center;width:44px;min-width:44px;height:24px;min-height:24px;padding:2px;border:0;border-radius:9999px;cursor:pointer}.web-switch-knob[data-v-2bc5d3bf]{display:block;width:20px;min-width:20px;height:20px;border-radius:9999px;transform:translate(0);transition:transform .16s ease}.web-switch-knob-on[data-v-2bc5d3bf]{transform:translate(20px)}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-divide-y-reverse:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-amber-400:oklch(82.8% .189 84.429);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-2xl:42rem;--container-4xl:56rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.btn-primary{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-primary:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-primary:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-primary:focus-visible{--tw-outline-style:none;outline-style:none}.btn-primary:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-primary:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-primary{background-color:var(--color-indigo-600);color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-primary:hover{background-color:var(--color-indigo-500)}}.btn-primary:where(.dark,.dark *){background-color:var(--color-indigo-500)}@media(hover:hover){.btn-primary:where(.dark,.dark *):hover{background-color:var(--color-indigo-400)}}.btn-ghost{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-ghost:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-ghost:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-ghost:focus-visible{--tw-outline-style:none;outline-style:none}.btn-ghost:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-ghost:disabled{cursor:not-allowed;opacity:.5}.btn-ghost:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-ghost{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-300);background-color:var(--color-white);color:var(--color-slate-700);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-ghost:hover{background-color:var(--color-slate-50)}}.btn-ghost:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-slate-200)}@media(hover:hover){.btn-ghost:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}}.btn-danger{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-danger:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-danger:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-danger:focus-visible{--tw-outline-style:none;outline-style:none}.btn-danger:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-danger:disabled{cursor:not-allowed;opacity:.5}.btn-danger:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-danger{background-color:var(--color-red-600);color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-danger:hover{background-color:var(--color-red-500)}}.btn-sm{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-white);padding:calc(var(--spacing) * 5);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;transition-duration:.2s}@media(hover:hover){.card:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.card:where(.dark,.dark *){border-color:#314158cc}@supports (color:color-mix(in lab,red,red)){.card:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-slate-700) 80%,transparent)}}.card:where(.dark,.dark *){background-color:var(--color-slate-900)}.input{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-300);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-slate-900)}.input::placeholder{color:var(--color-slate-400)}.input{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.input:focus{border-color:var(--color-indigo-500);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.input:focus{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 25%, transparent)}}.input:focus{--tw-outline-style:none;outline-style:none}.input:disabled{cursor:not-allowed;opacity:.5}.input:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-white)}.input:where(.dark,.dark *)::placeholder{color:var(--color-slate-500)}.badge-green{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-green-100);color:var(--color-green-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-green:where(.dark,.dark *){background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.badge-green:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.badge-green:where(.dark,.dark *){color:var(--color-green-300)}.badge-red{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-red-100);color:var(--color-red-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-red:where(.dark,.dark *){background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.badge-red:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.badge-red:where(.dark,.dark *){color:var(--color-red-300)}.badge-yellow{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-yellow-100);color:var(--color-yellow-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-yellow:where(.dark,.dark *){background-color:#733e0a66}@supports (color:color-mix(in lab,red,red)){.badge-yellow:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-yellow-900) 40%,transparent)}}.badge-yellow:where(.dark,.dark *){color:var(--color-yellow-300)}.badge-blue{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-blue-100);color:var(--color-blue-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-blue:where(.dark,.dark *){background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.badge-blue:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.badge-blue:where(.dark,.dark *){color:var(--color-blue-300)}.badge-purple{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-purple-100);color:var(--color-purple-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-purple:where(.dark,.dark *){background-color:#59168b66}@supports (color:color-mix(in lab,red,red)){.badge-purple:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-purple-900) 40%,transparent)}}.badge-purple:where(.dark,.dark *){color:var(--color-purple-300)}.badge-gray{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-slate-100);color:var(--color-slate-500);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-gray:where(.dark,.dark *){background-color:var(--color-slate-700);color:var(--color-slate-300)}.table{min-width:100%}:where(.table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-slate-200)}:where(.table:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-slate-700)}.table thead{background-color:var(--color-slate-50)}.table thead:where(.dark,.dark *){background-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.table thead:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.table thead th{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);text-align:left;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider);white-space:nowrap;color:var(--color-slate-500);text-transform:uppercase}.table thead th:where(.dark,.dark *){color:var(--color-slate-400)}:where(.table tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-slate-200)}.table tbody{background-color:var(--color-white)}:where(.table tbody:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-slate-700)}.table tbody:where(.dark,.dark *){background-color:#0000}.table tbody td{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;color:var(--color-slate-600)}.table tbody td:where(.dark,.dark *){color:var(--color-slate-300)}.tooltip{justify-content:center;align-items:center;display:inline-flex;position:relative}.tooltip .tooltip-text{pointer-events:none;visibility:hidden;z-index:10;width:calc(var(--spacing) * 36);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);text-align:center;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-slate-600);opacity:0;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s;position:absolute;bottom:125%;left:50%}.tooltip .tooltip-text:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-slate-200)}.tooltip:hover .tooltip-text{visibility:visible;opacity:1}.page-title{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-slate-900)}.page-title:where(.dark,.dark *){color:var(--color-white)}.page-subtitle{margin-top:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-slate-500)}.page-subtitle:where(.dark,.dark *){color:var(--color-slate-400)}.page-title,.page-subtitle{display:none}.muted{color:var(--color-slate-500)}.muted:where(.dark,.dark *){color:var(--color-slate-400)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.-top-2{top:calc(var(--spacing) * -2)}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.right-0{right:0}.right-4{right:calc(var(--spacing) * 4)}.left-1\/2{left:50%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.-mt-3{margin-top:calc(var(--spacing) * -3)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-7{margin-bottom:calc(var(--spacing) * 7)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.table{display:table}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-64{height:calc(var(--spacing) * 64)}.h-\[18px\]{height:18px}.h-\[85vh\]{height:85vh}.h-\[100dvh\]{height:100dvh}.h-\[150px\]{height:150px}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.max-h-\[400px\]{max-height:400px}.max-h-\[600px\]{max-height:600px}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[140px\]{min-height:140px}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-60{width:calc(var(--spacing) * 60)}.w-\[18px\]{width:18px}.w-\[min\(82vw\,288px\)\]{width:min(82vw,288px)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[40\%\]{max-width:40%}.max-w-\[200px\]{max-width:200px}.max-w-\[320px\]{max-width:320px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-\[260px\]{min-width:260px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-green-200{border-color:var(--color-green-200)}.border-indigo-400\/50{border-color:#7d87ff80}@supports (color:color-mix(in lab,red,red)){.border-indigo-400\/50{border-color:color-mix(in oklab,var(--color-indigo-400) 50%,transparent)}}.border-indigo-600{border-color:var(--color-indigo-600)}.border-red-200{border-color:var(--color-red-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/60{background-color:#f8fafc99}@supports (color:color-mix(in lab,red,red)){.bg-slate-50\/60{background-color:color-mix(in oklab,var(--color-slate-50) 60%,transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-900\/40{background-color:#0f172b66}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/40{background-color:color-mix(in oklab,var(--color-slate-900) 40%,transparent)}}.bg-slate-950\/45{background-color:#02061873}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/45{background-color:color-mix(in oklab,var(--color-slate-950) 45%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.bg-white\/90{background-color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.fill-none{fill:none}.stroke-current{stroke:currentColor}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-12{padding:calc(var(--spacing) * 12)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.text-blue-600{color:var(--color-blue-600)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-purple-600{color:var(--color-purple-600)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-green-500\/60{--tw-ring-color:#00c75899}@supports (color:color-mix(in lab,red,red)){.ring-green-500\/60{--tw-ring-color:color-mix(in oklab, var(--color-green-500) 60%, transparent)}}.ring-indigo-500{--tw-ring-color:var(--color-indigo-500)}.ring-indigo-500\/60{--tw-ring-color:#625fff99}@supports (color:color-mix(in lab,red,red)){.ring-indigo-500\/60{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 60%, transparent)}}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.hover\:border-indigo-300:hover{border-color:var(--color-indigo-300)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:text-indigo-500:hover{color:var(--color-indigo-500)}.hover\:text-indigo-600:hover{color:var(--color-indigo-600)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:h-80{height:calc(var(--spacing) * 80)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media(min-width:48rem){.md\:block{display:block}.md\:table-cell{display:table-cell}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:block{display:block}.lg\:hidden{display:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:px-6{padding-inline:calc(var(--spacing) * 6)}.lg\:px-7{padding-inline:calc(var(--spacing) * 7)}.lg\:py-6{padding-block:calc(var(--spacing) * 6)}}.dark\:border-green-800:where(.dark,.dark *){border-color:var(--color-green-800)}.dark\:border-indigo-500:where(.dark,.dark *){border-color:var(--color-indigo-500)}.dark\:border-red-900:where(.dark,.dark *){border-color:var(--color-red-900)}.dark\:border-slate-600:where(.dark,.dark *){border-color:var(--color-slate-600)}.dark\:border-slate-700:where(.dark,.dark *){border-color:var(--color-slate-700)}.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.dark\:border-slate-800:where(.dark,.dark *){border-color:var(--color-slate-800)}.dark\:bg-indigo-500:where(.dark,.dark *){background-color:var(--color-indigo-500)}.dark\:bg-indigo-500\/10:where(.dark,.dark *){background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-indigo-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.dark\:bg-indigo-600:where(.dark,.dark *){background-color:var(--color-indigo-600)}.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900) 20%,transparent)}}.dark\:bg-slate-500:where(.dark,.dark *){background-color:var(--color-slate-500)}.dark\:bg-slate-600:where(.dark,.dark *){background-color:var(--color-slate-600)}.dark\:bg-slate-700:where(.dark,.dark *){background-color:var(--color-slate-700)}.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.dark\:bg-slate-800:where(.dark,.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.dark\:bg-slate-900:where(.dark,.dark *){background-color:var(--color-slate-900)}.dark\:bg-slate-900\/50:where(.dark,.dark *){background-color:#0f172b80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 50%,transparent)}}.dark\:bg-slate-900\/90:where(.dark,.dark *){background-color:#0f172be6}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/90:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 90%,transparent)}}.dark\:bg-slate-950:where(.dark,.dark *){background-color:var(--color-slate-950)}.dark\:bg-slate-950\/60:where(.dark,.dark *){background-color:#02061899}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-950\/60:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-950) 60%,transparent)}}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-green-300:where(.dark,.dark *){color:var(--color-green-300)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-indigo-300:where(.dark,.dark *){color:var(--color-indigo-300)}.dark\:text-indigo-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-purple-400:where(.dark,.dark *){color:var(--color-purple-400)}.dark\:text-red-300:where(.dark,.dark *){color:var(--color-red-300)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-red-500:where(.dark,.dark *){color:var(--color-red-500)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\:text-slate-600:where(.dark,.dark *){color:var(--color-slate-600)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-300:where(.dark,.dark *){color:var(--color-yellow-300)}.dark\:text-yellow-400:where(.dark,.dark *){color:var(--color-yellow-400)}.dark\:ring-indigo-400:where(.dark,.dark *){--tw-ring-color:var(--color-indigo-400)}@media(hover:hover){.dark\:hover\:border-indigo-500:where(.dark,.dark *):hover{border-color:var(--color-indigo-500)}.dark\:hover\:bg-red-900\/40:where(.dark,.dark *):hover{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/40:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.dark\:hover\:bg-slate-700:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}.dark\:hover\:bg-slate-800:where(.dark,.dark *):hover{background-color:var(--color-slate-800)}.dark\:hover\:bg-slate-800\/50:where(.dark,.dark *):hover{background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-800\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.dark\:hover\:text-indigo-400:where(.dark,.dark *):hover{color:var(--color-indigo-400)}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}}}body{background-color:var(--color-slate-50);color:var(--color-slate-700);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body:where(.dark,.dark *){background-color:var(--color-slate-950);color:var(--color-slate-200)}html,body,#app{height:100%;overflow:hidden}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.custom-scrollbar::-webkit-scrollbar{width:8px;height:8px}.custom-scrollbar::-webkit-scrollbar-track{background:0 0}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:var(--color-slate-300);border-radius:.25rem}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--color-slate-400)}.custom-scrollbar{scrollbar-width:thin;scrollbar-color:var(--color-slate-300) transparent}.dark .custom-scrollbar{scrollbar-color:var(--color-slate-600) transparent}.fade-enter-active,.fade-leave-active{transition:opacity .2s}.fade-enter-from,.fade-leave-to{opacity:0}.card-list-enter-active,.card-list-leave-active{transition:opacity .3s,transform .3s}.card-list-enter-from,.card-list-leave-to{opacity:0;transform:scale(.96)}.modal-enter-active,.modal-leave-active{transition:opacity .2s}.modal-enter-active .modal-panel,.modal-leave-active .modal-panel{transition:transform .2s,opacity .2s}.modal-enter-from,.modal-leave-to{opacity:0}.modal-enter-from .modal-panel,.modal-leave-to .modal-panel{opacity:0;transform:scale(.96)}.toast-enter-active,.toast-leave-active{transition:opacity .25s,transform .25s}.toast-enter-from{opacity:0;transform:translateY(-10px)}.toast-leave-to{opacity:0;transform:translate(20px)}.navdrop-enter-active,.navdrop-leave-active{transition:opacity .2s,transform .2s}.navdrop-enter-from,.navdrop-leave-to{opacity:0;transform:translateY(-6px)}.drawer-enter-active,.drawer-leave-active{transition:opacity .2s}.drawer-enter-active .drawer-panel,.drawer-leave-active .drawer-panel{transition:transform .2s}.drawer-enter-from,.drawer-leave-to{opacity:0}.drawer-enter-from .drawer-panel,.drawer-leave-to .drawer-panel{transform:translate(-100%)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/vnt-web/static/assets/index-BxCqIugQ.js b/vnt-web/static/assets/index-BxCqIugQ.js new file mode 100644 index 0000000..d5c24db --- /dev/null +++ b/vnt-web/static/assets/index-BxCqIugQ.js @@ -0,0 +1,168 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))n(o);new MutationObserver(o=>{for(const l of o)if(l.type==="childList")for(const r of l.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function s(o){const l={};return o.integrity&&(l.integrity=o.integrity),o.referrerPolicy&&(l.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?l.credentials="include":o.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function n(o){if(o.ep)return;o.ep=!0;const l=s(o);fetch(o.href,l)}})();function Uo(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const ke={},vs=[],_t=()=>{},Tr=()=>!1,An=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),$n=e=>e.startsWith("onUpdate:"),Re=Object.assign,Ho=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},wa=Object.prototype.hasOwnProperty,ve=(e,t)=>wa.call(e,t),J=Array.isArray,bs=e=>nn(e)==="[object Map]",Es=e=>nn(e)==="[object Set]",xl=e=>nn(e)==="[object Date]",le=e=>typeof e=="function",Ce=e=>typeof e=="string",Xe=e=>typeof e=="symbol",be=e=>e!==null&&typeof e=="object",Ar=e=>(be(e)||le(e))&&le(e.then)&&le(e.catch),$r=Object.prototype.toString,nn=e=>$r.call(e),Ca=e=>nn(e).slice(8,-1),Ir=e=>nn(e)==="[object Object]",In=e=>Ce(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ds=Uo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Rn=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},Sa=/-\w/g,Ge=Rn(e=>e.replace(Sa,t=>t.slice(1).toUpperCase())),Ea=/\B([A-Z])/g,is=Rn(e=>e.replace(Ea,"-$1").toLowerCase()),Pn=Rn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Xn=Rn(e=>e?`on${Pn(e)}`:""),vt=(e,t)=>!Object.is(e,t),hn=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},On=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ta=e=>{const t=Ce(e)?Number(e):NaN;return isNaN(t)?e:t};let yl;const Mn=()=>yl||(yl=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ln(e){if(J(e)){const t={};for(let s=0;s{if(s){const n=s.split($a);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function G(e){let t="";if(Ce(e))t=e;else if(J(e))for(let s=0;sTs(s,t))}const Or=e=>!!(e&&e.__v_isRef===!0),V=e=>Ce(e)?e:e==null?"":J(e)||be(e)&&(e.toString===$r||!le(e.toString))?Or(e)?V(e.value):JSON.stringify(e,Mr,2):String(e),Mr=(e,t)=>Or(t)?Mr(e,t.value):bs(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,o],l)=>(s[eo(n,l)+" =>"]=o,s),{})}:Es(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>eo(s))}:Xe(t)?eo(t):be(t)&&!J(t)&&!Ir(t)?String(t):t,eo=(e,t="")=>{var s;return Xe(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let Me;class Lr{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Me&&(Me.active?(this.parent=Me,this.index=(Me.scopes||(Me.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes){const n=this.scopes.slice();for(t=0,s=n.length;t0&&--this._on===0){if(Me===this)Me=this.prevScope;else{let t=Me;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s0)return;if(Fs){let t=Fs;for(Fs=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Bs;){let t=Bs;for(Bs=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Fr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ur(e){let t,s=e.depsTail,n=s;for(;n;){const o=n.prevDep;n.version===-1?(n===s&&(s=o),qo(n),Na(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=o}e.deps=t,e.depsTail=s}function xo(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Hr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Hr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===qs)||(e.globalVersion=qs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!xo(e))))return;e.flags|=2;const t=e.dep,s=we,n=lt;we=e,lt=!0;try{Fr(e);const o=e.fn(e._value);(t.version===0||vt(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{we=s,lt=n,Ur(e),e.flags&=-3}}function qo(e,t=!1){const{dep:s,prevSub:n,nextSub:o}=e;if(n&&(n.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let l=s.computed.deps;l;l=l.nextDep)qo(l,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function Na(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let lt=!0;const Wr=[];function At(){Wr.push(lt),lt=!1}function $t(){const e=Wr.pop();lt=e===void 0?!0:e}function kl(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=we;we=void 0;try{t()}finally{we=s}}}let qs=0;class Va{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class zo{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!we||!lt||we===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==we)s=this.activeLink=new Va(we,this),we.deps?(s.prevDep=we.depsTail,we.depsTail.nextDep=s,we.depsTail=s):we.deps=we.depsTail=s,Kr(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=we.depsTail,s.nextDep=void 0,we.depsTail.nextDep=s,we.depsTail=s,we.deps===s&&(we.deps=n)}return s}trigger(t){this.version++,qs++,this.notify(t)}notify(t){Ko();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Go()}}}function Kr(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Kr(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const gn=new WeakMap,ns=Symbol(""),yo=Symbol(""),zs=Symbol("");function Ve(e,t,s){if(lt&&we){let n=gn.get(e);n||gn.set(e,n=new Map);let o=n.get(s);o||(n.set(s,o=new zo),o.map=n,o.key=s),o.track()}}function Ct(e,t,s,n,o,l){const r=gn.get(e);if(!r){qs++;return}const i=c=>{c&&c.trigger()};if(Ko(),t==="clear")r.forEach(i);else{const c=J(e),f=c&&In(s);if(c&&s==="length"){const u=Number(n);r.forEach((d,g)=>{(g==="length"||g===zs||!Xe(g)&&g>=u)&&i(d)})}else switch((s!==void 0||r.has(void 0))&&i(r.get(s)),f&&i(r.get(zs)),t){case"add":c?f&&i(r.get("length")):(i(r.get(ns)),bs(e)&&i(r.get(yo)));break;case"delete":c||(i(r.get(ns)),bs(e)&&i(r.get(yo)));break;case"set":bs(e)&&i(r.get(ns));break}}Go()}function ja(e,t){const s=gn.get(e);return s&&s.get(t)}function fs(e){const t=pe(e);return t===e?t:(Ve(t,"iterate",zs),Ye(e)?t:t.map(rt))}function Nn(e){return Ve(e=pe(e),"iterate",zs),e}function mt(e,t){return It(e)?ys(Et(e)?rt(t):t):rt(t)}const Da={__proto__:null,[Symbol.iterator](){return so(this,Symbol.iterator,e=>mt(this,e))},concat(...e){return fs(this).concat(...e.map(t=>J(t)?fs(t):t))},entries(){return so(this,"entries",e=>(e[1]=mt(this,e[1]),e))},every(e,t){return xt(this,"every",e,t,void 0,arguments)},filter(e,t){return xt(this,"filter",e,t,s=>s.map(n=>mt(this,n)),arguments)},find(e,t){return xt(this,"find",e,t,s=>mt(this,s),arguments)},findIndex(e,t){return xt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return xt(this,"findLast",e,t,s=>mt(this,s),arguments)},findLastIndex(e,t){return xt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return xt(this,"forEach",e,t,void 0,arguments)},includes(...e){return no(this,"includes",e)},indexOf(...e){return no(this,"indexOf",e)},join(e){return fs(this).join(e)},lastIndexOf(...e){return no(this,"lastIndexOf",e)},map(e,t){return xt(this,"map",e,t,void 0,arguments)},pop(){return Is(this,"pop")},push(...e){return Is(this,"push",e)},reduce(e,...t){return wl(this,"reduce",e,t)},reduceRight(e,...t){return wl(this,"reduceRight",e,t)},shift(){return Is(this,"shift")},some(e,t){return xt(this,"some",e,t,void 0,arguments)},splice(...e){return Is(this,"splice",e)},toReversed(){return fs(this).toReversed()},toSorted(e){return fs(this).toSorted(e)},toSpliced(...e){return fs(this).toSpliced(...e)},unshift(...e){return Is(this,"unshift",e)},values(){return so(this,"values",e=>mt(this,e))}};function so(e,t,s){const n=Nn(e),o=n[t]();return n!==e&&!Ye(e)&&(o._next=o.next,o.next=()=>{const l=o._next();return l.done||(l.value=s(l.value)),l}),o}const Ba=Array.prototype;function xt(e,t,s,n,o,l){const r=Nn(e),i=r!==e&&!Ye(e),c=r[t];if(c!==Ba[t]){const d=c.apply(e,l);return i?rt(d):d}let f=s;r!==e&&(i?f=function(d,g){return s.call(this,mt(e,d),g,e)}:s.length>2&&(f=function(d,g){return s.call(this,d,g,e)}));const u=c.call(r,f,n);return i&&o?o(u):u}function wl(e,t,s,n){const o=Nn(e),l=o!==e&&!Ye(e);let r=s,i=!1;o!==e&&(l?(i=n.length===0,r=function(f,u,d){return i&&(i=!1,f=mt(e,f)),s.call(this,f,mt(e,u),d,e)}):s.length>3&&(r=function(f,u,d){return s.call(this,f,u,d,e)}));const c=o[t](r,...n);return i?mt(e,c):c}function no(e,t,s){const n=pe(e);Ve(n,"iterate",zs);const o=n[t](...s);return(o===-1||o===!1)&&Vn(s[0])?(s[0]=pe(s[0]),n[t](...s)):o}function Is(e,t,s=[]){At(),Ko();const n=pe(e)[t].apply(e,s);return Go(),$t(),n}const Fa=Uo("__proto__,__v_isRef,__isVue"),Gr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xe));function Ua(e){Xe(e)||(e=String(e));const t=pe(this);return Ve(t,"has",e),t.hasOwnProperty(e)}class qr{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const o=this._isReadonly,l=this._isShallow;if(s==="__v_isReactive")return!o;if(s==="__v_isReadonly")return o;if(s==="__v_isShallow")return l;if(s==="__v_raw")return n===(o?l?Qa:Yr:l?Jr:Zr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const r=J(t);if(!o){let c;if(r&&(c=Da[s]))return c;if(s==="hasOwnProperty")return Ua}const i=Reflect.get(t,s,Te(t)?t:n);if((Xe(s)?Gr.has(s):Fa(s))||(o||Ve(t,"get",s),l))return i;if(Te(i)){const c=r&&In(s)?i:i.value;return o&&be(c)?wo(c):c}return be(i)?o?wo(i):Kt(i):i}}class zr extends qr{constructor(t=!1){super(!1,t)}set(t,s,n,o){let l=t[s];const r=J(t)&&In(s);if(!this._isShallow){const f=It(l);if(!Ye(n)&&!It(n)&&(l=pe(l),n=pe(n)),!r&&Te(l)&&!Te(n))return f||(l.value=n),!0}const i=r?Number(s)e,cn=e=>Reflect.getPrototypeOf(e);function qa(e,t,s){return function(...n){const o=this.__v_raw,l=pe(o),r=bs(l),i=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,f=o[e](...n),u=s?ko:t?ys:rt;return!t&&Ve(l,"iterate",c?yo:ns),Re(Object.create(f),{next(){const{value:d,done:g}=f.next();return g?{value:d,done:g}:{value:i?[u(d[0]),u(d[1])]:u(d),done:g}}})}}function un(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function za(e,t){const s={get(o){const l=this.__v_raw,r=pe(l),i=pe(o);e||(vt(o,i)&&Ve(r,"get",o),Ve(r,"get",i));const{has:c}=cn(r),f=t?ko:e?ys:rt;if(c.call(r,o))return f(l.get(o));if(c.call(r,i))return f(l.get(i));l!==r&&l.get(o)},get size(){const o=this.__v_raw;return!e&&Ve(pe(o),"iterate",ns),o.size},has(o){const l=this.__v_raw,r=pe(l),i=pe(o);return e||(vt(o,i)&&Ve(r,"has",o),Ve(r,"has",i)),o===i?l.has(o):l.has(o)||l.has(i)},forEach(o,l){const r=this,i=r.__v_raw,c=pe(i),f=t?ko:e?ys:rt;return!e&&Ve(c,"iterate",ns),i.forEach((u,d)=>o.call(l,f(u),f(d),r))}};return Re(s,e?{add:un("add"),set:un("set"),delete:un("delete"),clear:un("clear")}:{add(o){const l=pe(this),r=cn(l),i=pe(o),c=!t&&!Ye(o)&&!It(o)?i:o;return r.has.call(l,c)||vt(o,c)&&r.has.call(l,o)||vt(i,c)&&r.has.call(l,i)||(l.add(c),Ct(l,"add",c,c)),this},set(o,l){!t&&!Ye(l)&&!It(l)&&(l=pe(l));const r=pe(this),{has:i,get:c}=cn(r);let f=i.call(r,o);f||(o=pe(o),f=i.call(r,o));const u=c.call(r,o);return r.set(o,l),f?vt(l,u)&&Ct(r,"set",o,l):Ct(r,"add",o,l),this},delete(o){const l=pe(this),{has:r,get:i}=cn(l);let c=r.call(l,o);c||(o=pe(o),c=r.call(l,o)),i&&i.call(l,o);const f=l.delete(o);return c&&Ct(l,"delete",o,void 0),f},clear(){const o=pe(this),l=o.size!==0,r=o.clear();return l&&Ct(o,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(o=>{s[o]=qa(o,e,t)}),s}function Zo(e,t){const s=za(e,t);return(n,o,l)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?n:Reflect.get(ve(s,o)&&o in n?s:n,o,l)}const Za={get:Zo(!1,!1)},Ja={get:Zo(!1,!0)},Ya={get:Zo(!0,!1)};const Zr=new WeakMap,Jr=new WeakMap,Yr=new WeakMap,Qa=new WeakMap;function Xa(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Kt(e){return It(e)?e:Jo(e,!1,Wa,Za,Zr)}function Qr(e){return Jo(e,!1,Ga,Ja,Jr)}function wo(e){return Jo(e,!0,Ka,Ya,Yr)}function Jo(e,t,s,n,o){if(!be(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const l=o.get(e);if(l)return l;const r=Xa(Ca(e));if(r===0)return e;const i=new Proxy(e,r===2?n:s);return o.set(e,i),i}function Et(e){return It(e)?Et(e.__v_raw):!!(e&&e.__v_isReactive)}function It(e){return!!(e&&e.__v_isReadonly)}function Ye(e){return!!(e&&e.__v_isShallow)}function Vn(e){return e?!!e.__v_raw:!1}function pe(e){const t=e&&e.__v_raw;return t?pe(t):e}function Yo(e){return!ve(e,"__v_skip")&&Object.isExtensible(e)&&Rr(e,"__v_skip",!0),e}const rt=e=>be(e)?Kt(e):e,ys=e=>be(e)?wo(e):e;function Te(e){return e?e.__v_isRef===!0:!1}function oe(e){return Xr(e,!1)}function ec(e){return Xr(e,!0)}function Xr(e,t){return Te(e)?e:new tc(e,t)}class tc{constructor(t,s){this.dep=new zo,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:pe(t),this._value=s?t:rt(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||Ye(t)||It(t);t=n?t:pe(t),vt(t,s)&&(this._rawValue=t,this._value=n?t:rt(t),this.dep.trigger())}}function O(e){return Te(e)?e.value:e}const sc={get:(e,t,s)=>t==="__v_raw"?e:O(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const o=e[t];return Te(o)&&!Te(s)?(o.value=s,!0):Reflect.set(e,t,s,n)}};function ei(e){return Et(e)?e:new Proxy(e,sc)}function nc(e){const t=J(e)?new Array(e.length):{};for(const s in e)t[s]=lc(e,s);return t}class oc{constructor(t,s,n){this._object=t,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=Xe(s)?s:String(s),this._raw=pe(t);let o=!0,l=t;if(!J(t)||Xe(this._key)||!In(this._key))do o=!Vn(l)||Ye(l);while(o&&(l=l.__v_raw));this._shallow=o}get value(){let t=this._object[this._key];return this._shallow&&(t=O(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&Te(this._raw[this._key])){const s=this._object[this._key];if(Te(s)){s.value=t;return}}this._object[this._key]=t}get dep(){return ja(this._raw,this._key)}}function lc(e,t,s){return new oc(e,t,s)}class rc{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new zo(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=qs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&we!==this)return Br(this,!0),!0}get value(){const t=this.dep.track();return Hr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function ic(e,t,s=!1){let n,o;return le(e)?n=e:(n=e.get,o=e.set),new rc(n,o,s)}const fn={},vn=new WeakMap;let Xt;function ac(e,t=!1,s=Xt){if(s){let n=vn.get(s);n||vn.set(s,n=[]),n.push(e)}}function cc(e,t,s=ke){const{immediate:n,deep:o,once:l,scheduler:r,augmentJob:i,call:c}=s,f=k=>o?k:Ye(k)||o===!1||o===0?St(k,1):St(k);let u,d,g,h,C=!1,x=!1;if(Te(e)?(d=()=>e.value,C=Ye(e)):Et(e)?(d=()=>f(e),C=!0):J(e)?(x=!0,C=e.some(k=>Et(k)||Ye(k)),d=()=>e.map(k=>{if(Te(k))return k.value;if(Et(k))return f(k);if(le(k))return c?c(k,2):k()})):le(e)?t?d=c?()=>c(e,2):e:d=()=>{if(g){At();try{g()}finally{$t()}}const k=Xt;Xt=u;try{return c?c(e,3,[h]):e(h)}finally{Xt=k}}:d=_t,t&&o){const k=d,S=o===!0?1/0:o;d=()=>St(k(),S)}const L=Vr(),w=()=>{u.stop(),L&&L.active&&Ho(L.effects,u)};if(l&&t){const k=t;t=(...S)=>{const q=k(...S);return w(),q}}let p=x?new Array(e.length).fill(fn):fn;const b=k=>{if(!(!(u.flags&1)||!u.dirty&&!k))if(t){const S=u.run();if(k||o||C||(x?S.some((q,D)=>vt(q,p[D])):vt(S,p))){g&&g();const q=Xt;Xt=u;try{const D=[S,p===fn?void 0:x&&p[0]===fn?[]:p,h];p=S,c?c(t,3,D):t(...D)}finally{Xt=q}}}else u.run()};return i&&i(b),u=new jr(d),u.scheduler=r?()=>r(b,!1):b,h=k=>ac(k,!1,u),g=u.onStop=()=>{const k=vn.get(u);if(k){if(c)c(k,4);else for(const S of k)S();vn.delete(u)}},t?n?b(!0):p=u.run():r?r(b.bind(null,!0),!0):u.run(),w.pause=u.pause.bind(u),w.resume=u.resume.bind(u),w.stop=w,w}function St(e,t=1/0,s){if(t<=0||!be(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Te(e))St(e.value,t,s);else if(J(e))for(let n=0;n{St(n,t,s)});else if(Ir(e)){for(const n in e)St(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&St(e[n],t,s)}return e}function on(e,t,s,n){try{return n?e(...n):e()}catch(o){jn(o,t,s)}}function nt(e,t,s,n){if(le(e)){const o=on(e,t,s,n);return o&&Ar(o)&&o.catch(l=>{jn(l,t,s)}),o}if(J(e)){const o=[];for(let l=0;l>>1,o=Ke[n],l=Zs(o);l=Zs(s)?Ke.push(e):Ke.splice(fc(t),0,e),e.flags|=1,si()}}function si(){bn||(bn=ti.then(oi))}function dc(e){if(!J(e))Ft&&e.id===-1?Ft.splice(ms+1,0,e):e.flags&1||(_s.push(e),e.flags|=1);else for(let t=0;tZs(s)-Zs(n));if(_s.length=0,Ft){for(let s=0;se.id==null?e.flags&2?-1:1/0:e.id;function oi(e){try{for(ht=0;ht{n._d&&wn(-1);const l=_n(t),r=Tt.length;let i;try{i=e(...o)}finally{for(let c=Tt.length;c>r;c--)ll();_n(l),n._d&&wn(1)}return i};return n._n=!0,n._c=!0,n._d=!0,n}function me(e,t){if(Ne===null)return e;const s=Kn(Ne),n=e.dirs||(e.dirs=[]);for(let o=0;o1)return s&&le(t)?t.call(n&&n.proxy):t}}function pc(){return!!(ln()||os)}const hc=Symbol.for("v-scx"),mc=()=>Qe(hc);function Be(e,t,s){return ri(e,t,s)}function ri(e,t,s=ke){const{immediate:n,deep:o,flush:l,once:r}=s,i=Re({},s),c=t&&n||!t&&l!=="post";let f;if(en){if(l==="sync"){const h=mc();f=h.__watcherHandles||(h.__watcherHandles=[])}else if(!c){const h=()=>{};return h.stop=_t,h.resume=_t,h.pause=_t,h}}const u=De;i.call=(h,C,x)=>nt(h,u,C,x);let d=!1;l==="post"?i.scheduler=h=>{He(h,u&&u.suspense)}:l!=="sync"&&(d=!0,i.scheduler=(h,C)=>{C?h():Qo(h)}),i.augmentJob=h=>{t&&(h.flags|=4),d&&(h.flags|=2,u&&(h.id=u.uid,h.i=u))};const g=cc(e,t,i);return en&&(f?f.push(g):c&&g()),g}function gc(e,t,s){const n=this.proxy,o=Ce(e)?e.includes(".")?ii(n,e):()=>n[e]:e.bind(n,n);let l;le(t)?l=t:(l=t.handler,s=t);const r=rn(this),i=ri(o,l.bind(n),s);return r(),i}function ii(e,t){const s=t.split(".");return()=>{let n=e;for(let o=0;oe.__isTeleport,es=e=>e&&(e.disabled||e.disabled===""),vc=e=>e&&(e.defer||e.defer===""),Sl=e=>typeof SVGElement<"u"&&e instanceof SVGElement,El=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Co=(e,t)=>{const s=e&&e.to;return Ce(s)?t?t(s):null:s},bc={name:"Teleport",__isTeleport:!0,process(e,t,s,n,o,l,r,i,c,f){const{mc:u,pc:d,pbc:g,o:{insert:h,querySelector:C,createText:x,createComment:L,parentNode:w}}=f,p=es(t.props);let{dynamicChildren:b}=t;const k=(D,U,M)=>{D.shapeFlag&16&&u(D.children,U,M,o,l,r,i,c)},S=(D=t)=>{const U=es(D.props),M=D.target=Co(D.props,C),z=So(M,D,x,h);M&&(r!=="svg"&&Sl(M)?r="svg":r!=="mathml"&&El(M)&&(r="mathml"),o&&o.isCE&&(o.ce._teleportTargets||(o.ce._teleportTargets=new Set)).add(M),U||(k(D,M,z),Ls(D,!1)))},q=D=>{const U=()=>{if(jt.get(D)===U){if(jt.delete(D),es(D.props)){const M=w(D.el)||s;k(D,M,D.anchor),Ls(D,!0)}S(D)}};jt.set(D,U),He(U,l)};if(e==null){const D=t.el=x(""),U=t.anchor=x("");if(h(D,s,n),h(U,s,n),vc(t.props)||l&&l.pendingBranch){q(t);return}p&&(k(t,s,U),Ls(t,!0)),S()}else{t.el=e.el;const D=t.anchor=e.anchor,U=jt.get(e);if(U){U.flags|=8,jt.delete(e),q(t);return}t.targetStart=e.targetStart;const M=t.target=e.target,z=t.targetAnchor=e.targetAnchor,ne=es(e.props),B=ne?s:M,Z=ne?D:z;if(r==="svg"||Sl(M)?r="svg":(r==="mathml"||El(M))&&(r="mathml"),b?(g(e.dynamicChildren,b,B,o,l,r,i),ol(e,t,!0)):c||d(e,t,B,Z,o,l,r,i,!1),p)ne?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):dn(t,s,D,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const R=Co(t.props,C);R&&(t.target=R,dn(t,R,null,f,0))}else ne&&dn(t,M,z,f,1);Ls(t,p)}},remove(e,t,s,{um:n,o:{remove:o}},l){const{shapeFlag:r,children:i,anchor:c,targetStart:f,targetAnchor:u,target:d,props:g}=e,h=es(g),C=l||!h,x=jt.get(e);if(x&&(x.flags|=8,jt.delete(e)),d&&(o(f),o(u)),l&&o(c),!x&&(h||d)&&r&16)for(let L=0;L{e.isMounted=!0}),tl(()=>{e.isUnmounting=!0}),e}const tt=[Function,Array],ui={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:tt,onEnter:tt,onAfterEnter:tt,onEnterCancelled:tt,onBeforeLeave:tt,onLeave:tt,onAfterLeave:tt,onLeaveCancelled:tt,onBeforeAppear:tt,onAppear:tt,onAfterAppear:tt,onAppearCancelled:tt},fi=e=>{const t=e.subTree;return t.component?fi(t.component):t},xc={name:"BaseTransition",props:ui,setup(e,{slots:t}){const s=ln(),n=ci();return()=>{const o=t.default&&el(t.default(),!0),l=o&&o.length?di(o):s.subTree?fe():void 0;if(!l)return;const r=pe(e),{mode:i}=r;if(n.isLeaving)return oo(l);const c=xn(l);if(!c)return oo(l);let f=Js(c,r,n,s,d=>f=d);c.type!==je&&rs(c,f);let u=s.subTree&&xn(s.subTree);if(u&&u.type!==je&&!ts(u,c)&&fi(s).type!==je){let d=Js(u,r,n,s);if(rs(u,d),i==="out-in"&&c.type!==je)return n.isLeaving=!0,d.afterLeave=()=>{n.isLeaving=!1,s.job.flags&8||s.update(),delete d.afterLeave,u=void 0},oo(l);i==="in-out"&&c.type!==je?d.delayLeave=(g,h,C)=>{const x=pi(n,u);x[String(u.key)]=u,g[st]=()=>{h(),g[st]=void 0,delete f.delayedLeave,u=void 0},f.delayedLeave=()=>{C(),delete f.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return l}}};function di(e){let t=e[0];if(e.length>1){for(const s of e)if(s.type!==je){t=s;break}}return t}const yc=xc;function pi(e,t){const{leavingVNodes:s}=e;let n=s.get(t.type);return n||(n=Object.create(null),s.set(t.type,n)),n}function Js(e,t,s,n,o){const{appear:l,mode:r,persisted:i=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:g,onLeave:h,onAfterLeave:C,onLeaveCancelled:x,onBeforeAppear:L,onAppear:w,onAfterAppear:p,onAppearCancelled:b}=t,k=String(e.key),S=pi(s,e),q=(M,z)=>{M&&nt(M,n,9,z)},D=(M,z)=>{const ne=z[1];q(M,z),J(M)?M.every(B=>B.length<=1)&&ne():M.length<=1&&ne()},U={mode:r,persisted:i,beforeEnter(M){let z=c;if(!s.isMounted)if(l)z=L||c;else return;M[st]&&M[st](!0);const ne=S[k];ne&&ts(e,ne)&&ne.el[st]&&ne.el[st](),q(z,[M])},enter(M){if(S[k]===e)return;let z=f,ne=u,B=d;if(!s.isMounted)if(l)z=w||f,ne=p||u,B=b||d;else return;let Z=!1;M[Rs]=ee=>{Z||(Z=!0,ee?q(B,[M]):q(ne,[M]),U.delayedLeave&&U.delayedLeave(),M[Rs]=void 0)};const R=M[Rs].bind(null,!1);z?D(z,[M,R]):R()},leave(M,z){const ne=String(e.key);if(M[Rs]&&M[Rs](!0),s.isUnmounting)return z();q(g,[M]);let B=!1;M[st]=R=>{B||(B=!0,z(),R?q(x,[M]):q(C,[M]),M[st]=void 0,S[ne]===e&&delete S[ne])};const Z=M[st].bind(null,!1);S[ne]=e,h?D(h,[M,Z]):Z()},clone(M){const z=Js(M,t,s,n,o);return o&&o(z),z}};return U}function oo(e){if(Bn(e))return e=Wt(e),e.children=null,e}function xn(e){if(!Bn(e))return Dn(e.type)&&e.children?di(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:s}=e;if(s){if(t&16)return s[0];if(t&32&&le(s.default))return s.default()}}function rs(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const s=e.component.subTree;rs(Dn(s.type)&&xn(s)||s,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function el(e,t=!1,s){let n=[],o=0;for(let l=0;l1)for(let l=0;lHs(x,t&&(J(t)?t[L]:t),s,n,o));return}if(xs(n)&&!o){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Hs(e,t,s,n.component.subTree);return}const l=n.shapeFlag&4?Kn(n.component):n.el,r=o?null:l,{i,r:c}=e,f=t&&t.r,u=i.refs===ke?i.refs={}:i.refs,d=i.setupState,g=pe(d),h=d===ke?Tr:x=>Tl(u,x)?!1:ve(g,x),C=(x,L)=>!(L&&Tl(u,L));if(f!=null&&f!==c){if(Al(t),Ce(f))u[f]=null,h(f)&&(d[f]=null);else if(Te(f)){const x=t;C(f,x.k)&&(f.value=null),x.k&&(u[x.k]=null)}}if(le(c))on(c,i,12,[r,u]);else{const x=Ce(c),L=Te(c);if(x||L){const w=()=>{if(e.f){const p=x?h(c)?d[c]:u[c]:C()||!e.k?c.value:u[e.k];if(o)J(p)&&Ho(p,l);else if(J(p))p.includes(l)||p.push(l);else if(x)u[c]=[l],h(c)&&(d[c]=u[c]);else{const b=[l];C(c,e.k)&&(c.value=b),e.k&&(u[e.k]=b)}}else x?(u[c]=r,h(c)&&(d[c]=r)):L&&(C(c,e.k)&&(c.value=r),e.k&&(u[e.k]=r))};if(r){const p=()=>{w(),yn.delete(e)};p.id=-1,yn.set(e,p),He(p,s)}else Al(e),w()}}}function Al(e){const t=yn.get(e);t&&(t.flags|=8,yn.delete(e))}Mn().requestIdleCallback;Mn().cancelIdleCallback;const xs=e=>!!e.type.__asyncLoader,Bn=e=>e.type.__isKeepAlive;function kc(e,t){gi(e,"a",t)}function wc(e,t){gi(e,"da",t)}function gi(e,t,s=De){const n=e.__wdc||(e.__wdc=()=>{let o=s;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Fn(t,n,s),s){let o=s.parent;for(;o&&o.parent;)Bn(o.parent.vnode)&&Cc(n,t,s,o),o=o.parent}}function Cc(e,t,s,n){const o=Fn(t,e,n,!0);As(()=>{Ho(n[t],o)},s)}function Fn(e,t,s=De,n=!1){if(s){const o=s[e]||(s[e]=[]),l=t.__weh||(t.__weh=(...r)=>{At();const i=rn(s),c=nt(t,s,e,r);return i(),$t(),c});return n?o.unshift(l):o.push(l),l}}const Pt=e=>(t,s=De)=>{(!en||e==="sp")&&Fn(e,(...n)=>t(...n),s)},Sc=Pt("bm"),Ot=Pt("m"),Ec=Pt("bu"),vi=Pt("u"),tl=Pt("bum"),As=Pt("um"),Tc=Pt("sp"),Ac=Pt("rtg"),$c=Pt("rtc");function Ic(e,t=De){Fn("ec",e,t)}const bi="components";function Un(e,t){return xi(bi,e,!0,t)||e}const _i=Symbol.for("v-ndc");function Rc(e){return Ce(e)?xi(bi,e,!1)||e:e||_i}function xi(e,t,s=!0,n=!1){const o=Ne||De;if(o){const l=o.type;{const i=hu(l,!1);if(i&&(i===t||i===Ge(t)||i===Pn(Ge(t))))return l}const r=$l(o[e]||l[e],t)||$l(o.appContext[e],t);return!r&&n?l:r}}function $l(e,t){return e&&(e[t]||e[Ge(t)]||e[Pn(Ge(t))])}function Ee(e,t,s,n){let o;const l=s,r=J(e);if(r||Ce(e)){const i=r&&Et(e);let c=!1,f=!1;i&&(c=!Ye(e),f=It(e),e=Nn(e)),o=new Array(e.length);for(let u=0,d=e.length;ut(i,c,void 0,l));else{const i=Object.keys(e);o=new Array(i.length);for(let c=0,f=i.length;c0;return t!=="default"&&(f.name=t),y(),Ie(ie,null,[ue("slot",f,n)],u?-2:64)}let r=e[t];r&&r._c&&(r._d=!1);const i=Tt.length;y();let c;try{const f=r&&yi(r(s)),u=s.key||l||f&&f.key;c=Ie(ie,{key:(u&&!Xe(u)?u:`_${t}`)+(!f&&n?"_fb":"")},f||(n?n():[]),f&&e._===1?64:-2)}catch(f){for(let u=Tt.length;u>i;u--)ll();throw f}finally{r&&r._c&&(r._d=!0)}return c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),c}function yi(e){return e.some(t=>Qs(t)?!(t.type===je||t.type===ie&&!yi(t.children)):!0)?e:null}const Eo=e=>e?Bi(e)?Kn(e):Eo(e.parent):null,Ws=Re(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Eo(e.parent),$root:e=>Eo(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>wi(e),$forceUpdate:e=>e.f||(e.f=()=>{Qo(e.update)}),$nextTick:e=>e.n||(e.n=Rt.bind(e.proxy)),$watch:e=>gc.bind(e)}),ro=(e,t)=>e!==ke&&!e.__isScriptSetup&&ve(e,t),Pc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:o,props:l,accessCache:r,type:i,appContext:c}=e;if(t[0]!=="$"){const g=r[t];if(g!==void 0)switch(g){case 1:return n[t];case 2:return o[t];case 4:return s[t];case 3:return l[t]}else{if(ro(n,t))return r[t]=1,n[t];if(o!==ke&&ve(o,t))return r[t]=2,o[t];if(ve(l,t))return r[t]=3,l[t];if(s!==ke&&ve(s,t))return r[t]=4,s[t];To&&(r[t]=0)}}const f=Ws[t];let u,d;if(f)return t==="$attrs"&&Ve(e.attrs,"get",""),f(e);if((u=i.__cssModules)&&(u=u[t]))return u;if(s!==ke&&ve(s,t))return r[t]=4,s[t];if(d=c.config.globalProperties,ve(d,t))return d[t]},set({_:e},t,s){const{data:n,setupState:o,ctx:l}=e;return ro(o,t)?(o[t]=s,!0):n!==ke&&ve(n,t)?(n[t]=s,!0):ve(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:o,props:l,type:r}},i){let c;return!!(s[i]||e!==ke&&i[0]!=="$"&&ve(e,i)||ro(t,i)||ve(l,i)||ve(n,i)||ve(Ws,i)||ve(o.config.globalProperties,i)||(c=r.__cssModules)&&c[i])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:ve(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Il(e){return J(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let To=!0;function Oc(e){const t=wi(e),s=e.proxy,n=e.ctx;To=!1,t.beforeCreate&&Rl(t.beforeCreate,e,"bc");const{data:o,computed:l,methods:r,watch:i,provide:c,inject:f,created:u,beforeMount:d,mounted:g,beforeUpdate:h,updated:C,activated:x,deactivated:L,beforeDestroy:w,beforeUnmount:p,destroyed:b,unmounted:k,render:S,renderTracked:q,renderTriggered:D,errorCaptured:U,serverPrefetch:M,expose:z,inheritAttrs:ne,components:B,directives:Z,filters:R}=t;if(f&&Mc(f,n,null),r)for(const te in r){const re=r[te];le(re)&&(n[te]=re.bind(s))}if(o){const te=o.call(s,s);be(te)&&(e.data=Kt(te))}if(To=!0,l)for(const te in l){const re=l[te],Fe=le(re)?re.bind(s,s):le(re.get)?re.get.bind(s,s):_t,qe=!le(re)&&le(re.set)?re.set.bind(s):_t,at=_e({get:Fe,set:qe});Object.defineProperty(n,te,{enumerable:!0,configurable:!0,get:()=>at.value,set:ze=>at.value=ze})}if(i)for(const te in i)ki(i[te],n,s,te);if(c){const te=le(c)?c.call(s):c;Reflect.ownKeys(te).forEach(re=>{Us(re,te[re])})}u&&Rl(u,e,"c");function ce(te,re){J(re)?re.forEach(Fe=>te(Fe.bind(s))):re&&te(re.bind(s))}if(ce(Sc,d),ce(Ot,g),ce(Ec,h),ce(vi,C),ce(kc,x),ce(wc,L),ce(Ic,U),ce($c,q),ce(Ac,D),ce(tl,p),ce(As,k),ce(Tc,M),J(z))if(z.length){const te=e.exposed||(e.exposed={});z.forEach(re=>{Object.defineProperty(te,re,{get:()=>s[re],set:Fe=>s[re]=Fe,enumerable:!0})})}else e.exposed||(e.exposed={});S&&e.render===_t&&(e.render=S),ne!=null&&(e.inheritAttrs=ne),B&&(e.components=B),Z&&(e.directives=Z),M&&mi(e)}function Mc(e,t,s=_t){J(e)&&(e=Ao(e));for(const n in e){const o=e[n];let l;be(o)?"default"in o?l=Qe(o.from||n,o.default,!0):l=Qe(o.from||n):l=Qe(o),Te(l)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>l.value,set:r=>l.value=r}):t[n]=l}}function Rl(e,t,s){nt(J(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function ki(e,t,s,n){let o=n.includes(".")?ii(s,n):()=>s[n];if(Ce(e)){const l=t[e];le(l)&&Be(o,l)}else if(le(e))Be(o,e.bind(s));else if(be(e))if(J(e))e.forEach(l=>ki(l,t,s,n));else{const l=le(e.handler)?e.handler.bind(s):t[e.handler];le(l)&&Be(o,l,e)}}function wi(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:o,optionsCache:l,config:{optionMergeStrategies:r}}=e.appContext,i=l.get(t);let c;return i?c=i:!o.length&&!s&&!n?c=t:(c={},o.length&&o.forEach(f=>kn(c,f,r,!0)),kn(c,t,r)),be(t)&&l.set(t,c),c}function kn(e,t,s,n=!1){const{mixins:o,extends:l}=t;l&&kn(e,l,s,!0),o&&o.forEach(r=>kn(e,r,s,!0));for(const r in t)if(!(n&&r==="expose")){const i=Lc[r]||s&&s[r];e[r]=i?i(e[r],t[r]):t[r]}return e}const Lc={data:Pl,props:Ol,emits:Ol,methods:Ns,computed:Ns,beforeCreate:Ue,created:Ue,beforeMount:Ue,mounted:Ue,beforeUpdate:Ue,updated:Ue,beforeDestroy:Ue,beforeUnmount:Ue,destroyed:Ue,unmounted:Ue,activated:Ue,deactivated:Ue,errorCaptured:Ue,serverPrefetch:Ue,components:Ns,directives:Ns,watch:Vc,provide:Pl,inject:Nc};function Pl(e,t){return t?e?function(){return Re(le(e)?e.call(this,this):e,le(t)?t.call(this,this):t)}:t:e}function Nc(e,t){return Ns(Ao(e),Ao(t))}function Ao(e){if(J(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ge(t)}Modifiers`]||e[`${is(t)}Modifiers`];function Fc(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||ke;let o=s;const l=t.startsWith("update:"),r=l&&Bc(n,t.slice(7));r&&(r.trim&&(o=s.map(u=>Ce(u)?u.trim():u)),r.number&&(o=s.map(On)));let i,c=n[i=Xn(t)]||n[i=Xn(Ge(t))];!c&&l&&(c=n[i=Xn(is(t))]),c&&nt(c,e,6,o);const f=n[i+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[i])return;e.emitted[i]=!0,nt(f,e,6,o)}}const Uc=new WeakMap;function Si(e,t,s=!1){const n=s?Uc:t.emitsCache,o=n.get(e);if(o!==void 0)return o;const l=e.emits;let r={},i=!1;if(!le(e)){const c=f=>{const u=Si(f,t,!0);u&&(i=!0,Re(r,u))};!s&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!l&&!i?(be(e)&&n.set(e,null),null):(J(l)?l.forEach(c=>r[c]=null):Re(r,l),be(e)&&n.set(e,r),r)}function Hn(e,t){return!e||!An(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),ve(e,t[0].toLowerCase()+t.slice(1))||ve(e,is(t))||ve(e,t))}function Ml(e){const{type:t,vnode:s,proxy:n,withProxy:o,propsOptions:[l],slots:r,attrs:i,emit:c,render:f,renderCache:u,props:d,data:g,setupState:h,ctx:C,inheritAttrs:x}=e,L=_n(e);let w,p;try{if(s.shapeFlag&4){const k=o||n,S=k;w=gt(f.call(S,k,u,d,h,g,C)),p=i}else{const k=t;w=gt(k.length>1?k(d,{attrs:i,slots:r,emit:c}):k(d,null)),p=t.props?i:Hc(i)}}catch(k){Tt.length=0,jn(k,e,1),w=ue(je)}let b=w;if(p&&x!==!1){const k=Object.keys(p),{shapeFlag:S}=b;k.length&&S&7&&(l&&k.some($n)&&(p=Wc(p,l)),b=Wt(b,p,!1,!0))}if(s.dirs&&(b=Wt(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(s.dirs):s.dirs),s.transition){const k=Dn(b.type)&&xn(b)||b;rs(k,s.transition)}return w=b,_n(L),w}const Hc=e=>{let t;for(const s in e)(s==="class"||s==="style"||An(s))&&((t||(t={}))[s]=e[s]);return t},Wc=(e,t)=>{const s={};for(const n in e)(!$n(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Kc(e,t,s){const{props:n,children:o,component:l}=e,{props:r,children:i,patchFlag:c}=t,f=l.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&c>=0){if(c&1024)return!0;if(c&16)return n?Ll(n,r,f):!!r;if(c&8){const u=t.dynamicProps;for(let d=0;dObject.create(Ti),$i=e=>Object.getPrototypeOf(e)===Ti;function qc(e,t,s,n=!1){const o={},l=Ai();e.propsDefaults=Object.create(null),Ii(e,t,o,l);for(const r in e.propsOptions[0])r in o||(o[r]=void 0);s?e.props=n?o:Qr(o):e.type.props?e.props=o:e.props=l,e.attrs=l}function zc(e,t,s,n){const{props:o,attrs:l,vnode:{patchFlag:r}}=e,i=pe(o),[c]=e.propsOptions;let f=!1;if((n||r>0)&&!(r&16)){if(r&8){const u=e.vnode.dynamicProps;for(let d=0;d{c=!0;const[g,h]=Ri(d,t,!0);Re(r,g),h&&i.push(...h)};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!l&&!c)return be(e)&&n.set(e,vs),vs;if(J(l))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",nl=e=>J(e)?e.map(gt):[gt(e)],Jc=(e,t,s)=>{if(t._n)return t;const n=Ae((...o)=>nl(t(...o)),s);return n._c=!1,n},Pi=(e,t,s)=>{const n=e._ctx;for(const o in e){if(sl(o))continue;const l=e[o];if(le(l))t[o]=Jc(o,l,n);else if(l!=null){const r=nl(l);t[o]=()=>r}}},Oi=(e,t)=>{const s=nl(t);e.slots.default=()=>s},Mi=(e,t,s)=>{for(const n in t)(s||!sl(n))&&(e[n]=t[n])},Yc=(e,t,s)=>{const n=e.slots=Ai();if(e.vnode.shapeFlag&32){const o=t._;o?(Mi(n,t,s),s&&Rr(n,"_",o,!0)):Pi(t,n)}else t&&Oi(e,t)},Qc=(e,t,s)=>{const{vnode:n,slots:o}=e;let l=!0,r=ke;if(n.shapeFlag&32){const i=t._;i?s&&i===1?l=!1:Mi(o,t,s):(l=!t.$stable,Pi(t,o)),r=t}else t&&(Oi(e,t),r={default:1});if(l)for(const i in o)!sl(i)&&r[i]==null&&delete o[i]},He=nu;function Xc(e){return eu(e)}function eu(e,t){const s=Mn();s.__VUE__=!0;const{insert:n,remove:o,patchProp:l,createElement:r,createText:i,createComment:c,setText:f,setElementText:u,parentNode:d,nextSibling:g,setScopeId:h=_t,insertStaticContent:C}=e,x=(m,v,_,A=null,I=null,T=null,F=void 0,j=null,N=!!v.dynamicChildren)=>{if(m===v)return;m&&!ts(m,v)&&(A=$(m),ze(m,I,T,!0),m=null),v.patchFlag===-2&&(N=!1,v.dynamicChildren=null);const{type:P,ref:X,shapeFlag:W}=v;switch(P){case Wn:L(m,v,_,A);break;case je:w(m,v,_,A);break;case ao:m==null&&p(v,_,A,F);break;case ie:B(m,v,_,A,I,T,F,j,N);break;default:W&1?S(m,v,_,A,I,T,F,j,N):W&6?Z(m,v,_,A,I,T,F,j,N):(W&64||W&128)&&P.process(m,v,_,A,I,T,F,j,N,Y)}X!=null&&I?Hs(X,m&&m.ref,T,v||m,!v):X==null&&m&&m.ref!=null&&Hs(m.ref,null,T,m,!0)},L=(m,v,_,A)=>{if(m==null)n(v.el=i(v.children),_,A);else{const I=v.el=m.el;v.children!==m.children&&f(I,v.children)}},w=(m,v,_,A)=>{m==null?n(v.el=c(v.children||""),_,A):v.el=m.el},p=(m,v,_,A)=>{[m.el,m.anchor]=C(m.children,v,_,A,m.el,m.anchor)},b=({el:m,anchor:v},_,A)=>{let I;for(;m&&m!==v;)I=g(m),n(m,_,A),m=I;n(v,_,A)},k=({el:m,anchor:v})=>{let _;for(;m&&m!==v;)_=g(m),o(m),m=_;o(v)},S=(m,v,_,A,I,T,F,j,N)=>{if(v.type==="svg"?F="svg":v.type==="math"&&(F="mathml"),m==null)q(v,_,A,I,T,F,j,N);else{const P=m.el&&m.el._isVueCE?m.el:null;try{P&&P._beginPatch(),M(m,v,I,T,F,j,N)}finally{P&&P._endPatch()}}},q=(m,v,_,A,I,T,F,j)=>{let N,P;const{props:X,shapeFlag:W,transition:Q,dirs:se}=m;if(N=m.el=r(m.type,T,X&&X.is,X),W&8?u(N,m.children):W&16&&U(m.children,N,null,A,I,io(m,T),F,j),se&&qt(m,null,A,"created"),D(N,m,m.scopeId,F,A),X){for(const ye in X)ye!=="value"&&!Ds(ye)&&l(N,ye,null,X[ye],T,A);"value"in X&&l(N,"value",null,X.value,T),(P=X.onVnodeBeforeMount)&&dt(P,A,m)}se&&qt(m,null,A,"beforeMount");const he=tu(I,Q);he&&Q.beforeEnter(N),n(N,v,_),((P=X&&X.onVnodeMounted)||he||se)&&He(()=>{P&&dt(P,A,m),he&&Q.enter(N),se&&qt(m,null,A,"mounted")},I)},D=(m,v,_,A,I)=>{if(_&&h(m,_),A)for(let T=0;T{for(let P=N;P{const j=v.el=m.el;let{patchFlag:N,dynamicChildren:P,dirs:X}=v;N|=m.patchFlag&16;const W=m.props||ke,Q=v.props||ke;let se;if(_&&zt(_,!1),(se=Q.onVnodeBeforeUpdate)&&dt(se,_,v,m),X&&qt(v,m,_,"beforeUpdate"),_&&zt(_,!0),P&&(!m.dynamicChildren||m.dynamicChildren.length!==P.length)&&(N=0,F=!1,P=null),(W.innerHTML&&Q.innerHTML==null||W.textContent&&Q.textContent==null)&&u(j,""),P?z(m.dynamicChildren,P,j,_,A,io(v,I),T):F||re(m,v,j,null,_,A,io(v,I),T,!1),N>0){if(N&16)ne(j,W,Q,_,I);else if(N&2&&W.class!==Q.class&&l(j,"class",null,Q.class,I),N&4&&l(j,"style",W.style,Q.style,I),N&8){const he=v.dynamicProps;for(let ye=0;ye{se&&dt(se,_,v,m),X&&qt(v,m,_,"updated")},A)},z=(m,v,_,A,I,T,F)=>{for(let j=0;j{if(v!==_){if(v!==ke)for(const T in v)!Ds(T)&&!(T in _)&&l(m,T,v[T],null,I,A);for(const T in _){if(Ds(T))continue;const F=_[T],j=v[T];F!==j&&T!=="value"&&l(m,T,j,F,I,A)}"value"in _&&l(m,"value",v.value,_.value,I)}},B=(m,v,_,A,I,T,F,j,N)=>{const P=v.el=m?m.el:i(""),X=v.anchor=m?m.anchor:i("");let{patchFlag:W,dynamicChildren:Q,slotScopeIds:se}=v;se&&(j=j?j.concat(se):se),m==null?(n(P,_,A),n(X,_,A),U(v.children||[],_,X,I,T,F,j,N)):W>0&&W&64&&Q&&m.dynamicChildren&&m.dynamicChildren.length===Q.length?(z(m.dynamicChildren,Q,_,I,T,F,j),(v.key!=null||I&&v===I.subTree)&&ol(m,v,!0)):re(m,v,_,X,I,T,F,j,N)},Z=(m,v,_,A,I,T,F,j,N)=>{v.slotScopeIds=j,m==null?v.shapeFlag&512?I.ctx.activate(v,_,A,F,N):R(v,_,A,I,T,F,N):ee(m,v,N)},R=(m,v,_,A,I,T,F)=>{const j=m.component=cu(m,A,I);if(Bn(m)&&(j.ctx.renderer=Y),uu(j,!1,F),j.asyncDep){if(I&&I.registerDep(j,ce,F),!m.el){const N=j.subTree=ue(je);w(null,N,v,_),m.placeholder=N.el}}else ce(j,m,v,_,I,T,F)},ee=(m,v,_)=>{const A=v.component=m.component;if(Kc(m,v,_))if(A.asyncDep&&!A.asyncResolved){te(A,v,_);return}else A.next=v,A.update();else v.el=m.el,A.vnode=v},ce=(m,v,_,A,I,T,F)=>{const j=()=>{if(m.isMounted){let{next:W,bu:Q,u:se,parent:he,vnode:ye}=m;{const ut=Li(m);if(ut){W&&(W.el=ye.el,te(m,W,F)),ut.asyncDep.then(()=>{He(()=>{m.isUnmounted||P()},I)});return}}let xe=W,$e;zt(m,!1),W?(W.el=ye.el,te(m,W,F)):W=ye,Q&&hn(Q),($e=W.props&&W.props.onVnodeBeforeUpdate)&&dt($e,he,W,ye),zt(m,!0);const Le=Ml(m),ct=m.subTree;m.subTree=Le,x(ct,Le,d(ct.el),$(ct),m,I,T),W.el=Le.el,xe===null&&Gc(m,Le.el),se&&He(se,I),($e=W.props&&W.props.onVnodeUpdated)&&He(()=>dt($e,he,W,ye),I)}else{let W;const{el:Q,props:se}=v,{bm:he,m:ye,parent:xe,root:$e,type:Le}=m,ct=xs(v);zt(m,!1),he&&hn(he),!ct&&(W=se&&se.onVnodeBeforeMount)&&dt(W,xe,v),zt(m,!0);{$e.ce&&$e.ce._hasShadowRoot()&&$e.ce._injectChildStyle(Le,m.parent?m.parent.type:void 0);const ut=m.subTree=Ml(m);x(null,ut,_,A,m,I,T),v.el=ut.el}if(ye&&He(ye,I),!ct&&(W=se&&se.onVnodeMounted)){const ut=v;He(()=>dt(W,xe,ut),I)}(v.shapeFlag&256||xe&&xs(xe.vnode)&&xe.vnode.shapeFlag&256)&&m.a&&He(m.a,I),m.isMounted=!0,v=_=A=null}};m.scope.on();const N=m.effect=new jr(j);m.scope.off();const P=m.update=N.run.bind(N),X=m.job=N.runIfDirty.bind(N);X.i=m,X.id=m.uid,N.scheduler=()=>Qo(X),zt(m,!0),P()},te=(m,v,_)=>{v.component=m;const A=m.vnode.props;m.vnode=v,m.next=null,zc(m,v.props,A,_),Qc(m,v.children,_),At(),Cl(m),$t()},re=(m,v,_,A,I,T,F,j,N=!1)=>{const P=m&&m.children,X=m?m.shapeFlag:0,W=v.children,{patchFlag:Q,shapeFlag:se}=v;if(Q>0){if(Q&128){qe(P,W,_,A,I,T,F,j,N);return}else if(Q&256){Fe(P,W,_,A,I,T,F,j,N);return}}se&8?(X&16&&et(P,I,T),W!==P&&u(_,W)):X&16?se&16?qe(P,W,_,A,I,T,F,j,N):et(P,I,T,!0):(X&8&&u(_,""),se&16&&U(W,_,A,I,T,F,j,N))},Fe=(m,v,_,A,I,T,F,j,N)=>{m=m||vs,v=v||vs;const P=m.length,X=v.length,W=Math.min(P,X);let Q;for(Q=0;QX?et(m,I,T,!0,!1,W):U(v,_,A,I,T,F,j,N,W)},qe=(m,v,_,A,I,T,F,j,N)=>{let P=0;const X=v.length;let W=m.length-1,Q=X-1;for(;P<=W&&P<=Q;){const se=m[P],he=v[P]=N?wt(v[P]):gt(v[P]);if(ts(se,he))x(se,he,_,null,I,T,F,j,N);else break;P++}for(;P<=W&&P<=Q;){const se=m[W],he=v[Q]=N?wt(v[Q]):gt(v[Q]);if(ts(se,he))x(se,he,_,null,I,T,F,j,N);else break;W--,Q--}if(P>W){if(P<=Q){const se=Q+1,he=seQ)for(;P<=W;)ze(m[P],I,T,!0),P++;else{const se=P,he=P,ye=new Map;for(P=he;P<=Q;P++){const Ze=v[P]=N?wt(v[P]):gt(v[P]);Ze.key!=null&&ye.set(Ze.key,P)}let xe,$e=0;const Le=Q-he+1;let ct=!1,ut=0;const $s=new Array(Le);for(P=0;P=Le){ze(Ze,I,T,!0);continue}let ft;if(Ze.key!=null)ft=ye.get(Ze.key);else for(xe=he;xe<=Q;xe++)if($s[xe-he]===0&&ts(Ze,v[xe])){ft=xe;break}ft===void 0?ze(Ze,I,T,!0):($s[ft-he]=P+1,ft>=ut?ut=ft:ct=!0,x(Ze,v[ft],_,null,I,T,F,j,N),$e++)}const vl=ct?su($s):vs;for(xe=vl.length-1,P=Le-1;P>=0;P--){const Ze=he+P,ft=v[Ze],bl=v[Ze+1],_l=Ze+1{const{el:T,type:F,transition:j,children:N,shapeFlag:P}=m;if(P&6){at(m.component.subTree,v,_,A);return}if(P&128){m.suspense.move(v,_,A);return}if(P&64){F.move(m,v,_,Y);return}if(F===ie){n(T,v,_);for(let W=0;Wj.enter(T),I));else{const{leave:W,delayLeave:Q,afterLeave:se}=j,he=()=>{m.ctx.isUnmounted?o(T):n(T,v,_)},ye=()=>{const xe=T._isLeaving||!!T[st];T._isLeaving&&T[st](!0),j.persisted&&!xe?he():W(T,()=>{he(),se&&se()})};Q?Q(T,he,ye):ye()}else n(T,v,_)},ze=(m,v,_,A=!1,I=!1)=>{const{type:T,props:F,ref:j,children:N,dynamicChildren:P,shapeFlag:X,patchFlag:W,dirs:Q,cacheIndex:se,memo:he}=m;if(W===-2&&(I=!1),j!=null&&(At(),Hs(j,null,_,m,!0),$t()),se!=null&&(v.renderCache[se]=void 0),X&256){v.ctx.deactivate(m);return}const ye=X&1&&Q,xe=!xs(m);let $e;if(xe&&($e=F&&F.onVnodeBeforeUnmount)&&dt($e,v,m),X&6)Gt(m.component,_,A);else{if(X&128){m.suspense.unmount(_,A);return}ye&&qt(m,null,v,"beforeUnmount"),X&64?m.type.remove(m,v,_,Y,A):P&&!P.hasOnce&&(T!==ie||W>0&&W&64)?et(P,v,_,!1,!0):(T===ie&&W&384||!I&&X&16)&&et(N,v,_),A&&cs(m)}const Le=he!=null&&se==null;(xe&&($e=F&&F.onVnodeUnmounted)||ye||Le)&&He(()=>{$e&&dt($e,v,m),ye&&qt(m,null,v,"unmounted"),Le&&(m.el=null)},_)},cs=m=>{const{type:v,el:_,anchor:A,transition:I}=m;if(v===ie){us(_,A);return}if(v===ao){k(m);return}const T=()=>{o(_),I&&!I.persisted&&I.afterLeave&&I.afterLeave()};if(m.shapeFlag&1&&I&&!I.persisted){const{leave:F,delayLeave:j}=I,N=()=>F(_,T);j?j(m.el,T,N):N()}else T()},us=(m,v)=>{let _;for(;m!==v;)_=g(m),o(m),m=_;o(v)},Gt=(m,v,_)=>{const{bum:A,scope:I,job:T,subTree:F,um:j,m:N,a:P}=m;Vl(N),Vl(P),A&&hn(A),I.stop(),T&&(T.flags|=8,ze(F,m,v,_)),j&&He(j,v),He(()=>{m.isUnmounted=!0},v)},et=(m,v,_,A=!1,I=!1,T=0)=>{for(let F=T;F{if(m.shapeFlag&6)return $(m.component.subTree);if(m.shapeFlag&128)return m.suspense.next();const v=g(m.anchor||m.el),_=v&&v[ai];return _?g(_):v};let K=!1;const H=(m,v,_)=>{let A;m==null?v._vnode&&(ze(v._vnode,null,null,!0),A=v._vnode.component):x(v._vnode||null,m,v,null,null,null,_),v._vnode=m,K||(K=!0,Cl(A),ni(),K=!1)},Y={p:x,um:ze,m:at,r:cs,mt:R,mc:U,pc:re,pbc:z,n:$,o:e};return{render:H,hydrate:void 0,createApp:Dc(H)}}function io({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function zt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function tu(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ol(e,t,s=!1){const n=e.children,o=t.children;if(J(n)&&J(o))for(let l=0;l>1,e[s[i]]0&&(t[n]=s[l-1]),s[l]=n)}}for(l=s.length,r=s[l-1];l-- >0;)s[l]=r,r=t[r];return s}function Li(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Li(t)}function Vl(e){if(e)for(let t=0;te.__isSuspense;function nu(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):dc(e)}const ie=Symbol.for("v-fgt"),Wn=Symbol.for("v-txt"),je=Symbol.for("v-cmt"),ao=Symbol.for("v-stc"),Tt=[];let Je=null;function y(e=!1){Tt.push(Je=e?null:[])}function ll(){Tt.pop(),Je=Tt[Tt.length-1]||null}let Ys=1;function wn(e,t=!1){Ys+=e,e<0&&Je&&t&&(Je.hasOnce=!0)}function ji(e){return e.dynamicChildren=Ys>0?Je||vs:null,ll(),Ys>0&&Je&&Je.push(e),e}function E(e,t,s,n,o,l){return ji(a(e,t,s,n,o,l,!0))}function Ie(e,t,s,n,o){return ji(ue(e,t,s,n,o,!0))}function Qs(e){return e?e.__v_isVNode===!0:!1}function ts(e,t){return e.type===t.type&&e.key===t.key}const Di=({key:e})=>e??null,mn=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Ce(e)||Te(e)||le(e)?{i:Ne,r:e,k:t,f:!!s}:e:null);function a(e,t=null,s=null,n=0,o=null,l=e===ie?0:1,r=!1,i=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Di(t),ref:t&&mn(t),scopeId:li,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:n,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Ne};return i?(Cn(c,s),l&128&&e.normalize(c)):s&&(c.shapeFlag|=Ce(s)?8:16),Ys>0&&!r&&Je&&(c.patchFlag>0||l&6)&&c.patchFlag!==32&&Je.push(c),c}const ue=ou;function ou(e,t=null,s=null,n=0,o=null,l=!1){if((!e||e===_i)&&(e=je),Qs(e)){const i=Wt(e,t,!0);return s&&Cn(i,s),Ys>0&&!l&&Je&&(i.shapeFlag&6?Je[Je.indexOf(e)]=i:Je.push(i)),i.patchFlag=-2,i}if(mu(e)&&(e=e.__vccOpts),t){t=lu(t);let{class:i,style:c}=t;i&&!Ce(i)&&(t.class=G(i)),be(c)&&(Vn(c)&&!J(c)&&(c=Re({},c)),t.style=Ln(c))}const r=Ce(e)?1:Vi(e)?128:Dn(e)?64:be(e)?4:le(e)?2:0;return a(e,t,s,n,o,r,l,!0)}function lu(e){return e?Vn(e)||$i(e)?Re({},e):e:null}function Wt(e,t,s=!1,n=!1){const{props:o,ref:l,patchFlag:r,children:i,transition:c}=e,f=t?ru(o||{},t):o,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&Di(f),ref:t&&t.ref?s&&l?J(l)?l.concat(mn(t)):[l,mn(t)]:mn(t):l,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ie?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Wt(e.ssContent),ssFallback:e.ssFallback&&Wt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&n&&rs(u,c.clone(u)),u}function ae(e=" ",t=0){return ue(Wn,null,e,t)}function fe(e="",t=!1){return t?(y(),Ie(je,null,e)):ue(je,null,e)}function gt(e){return e==null||typeof e=="boolean"?ue(je):J(e)?ue(ie,null,e.slice()):Qs(e)?wt(e):ue(Wn,null,String(e))}function wt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Wt(e)}function Cn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(J(t))s=16;else if(typeof t=="object")if(n&65){const o=t.default;o&&(o._c&&(o._d=!1),Cn(e,o()),o._c&&(o._d=!0));return}else{s=32;const o=t._;!o&&!$i(t)?t._ctx=Ne:o===3&&Ne&&(Ne.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(le(t)){if(n&65){Cn(e,{default:t});return}t={default:t,_ctx:Ne},s=32}else t=String(t),n&64?(s=16,t=[ae(t)]):s=8;e.children=t,e.shapeFlag|=s}function ru(...e){const t={};for(let s=0;sDe||Ne;let Sn,Xs;{const e=Mn(),t=(s,n)=>{let o;return(o=e[s])||(o=e[s]=[]),o.push(n),l=>{o.length>1?o.forEach(r=>r(l)):o[0](l)}};Sn=t("__VUE_INSTANCE_SETTERS__",s=>De=s),Xs=t("__VUE_SSR_SETTERS__",s=>en=s)}const rn=e=>{const t=De;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},jl=()=>{De&&De.scope.off(),Sn(null)};function Bi(e){return e.vnode.shapeFlag&4}let en=!1;function uu(e,t=!1,s=!1){t&&Xs(t);const{props:n,children:o}=e.vnode,l=Bi(e);qc(e,n,l,t),Yc(e,o,s||t);const r=l?fu(e,t):void 0;return t&&Xs(!1),r}function fu(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Pc);const{setup:n}=s;if(n){At();const o=e.setupContext=n.length>1?pu(e):null,l=rn(e),r=on(n,e,0,[e.props,o]),i=Ar(r);if($t(),l(),(i||e.sp)&&!xs(e)&&mi(e),i){if(r.then(jl,jl),t)return r.then(c=>{Xs(!0);try{Dl(e,c,t)}finally{Xs(!1)}}).catch(c=>{jn(c,e,0)});e.asyncDep=r}else Dl(e,r)}else Fi(e)}function Dl(e,t,s){le(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:be(t)&&(e.setupState=ei(t)),Fi(e)}function Fi(e,t,s){const n=e.type;e.render||(e.render=n.render||_t);{const o=rn(e);At();try{Oc(e)}finally{$t(),o()}}}const du={get(e,t){return Ve(e,"get",""),e[t]}};function pu(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,du),slots:e.slots,emit:e.emit,expose:t}}function Kn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(ei(Yo(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in Ws)return Ws[s](e)},has(t,s){return s in t||s in Ws}})):e.proxy}function hu(e,t=!0){return le(e)?e.displayName||e.name:e.name||t&&e.__name}function mu(e){return le(e)&&"__vccOpts"in e}const _e=(e,t)=>ic(e,t,en);function rl(e,t,s){try{wn(-1);const n=arguments.length;return n===2?be(t)&&!J(t)?Qs(t)?ue(e,null,[t]):ue(e,t):ue(e,null,t):(n>3?s=Array.prototype.slice.call(arguments,2):n===3&&Qs(s)&&(s=[s]),ue(e,t,s))}finally{wn(1)}}const gu="3.5.41";let Io;const Bl=typeof window<"u"&&window.trustedTypes;if(Bl)try{Io=Bl.createPolicy("vue",{createHTML:e=>e})}catch{}const Ui=Io?e=>Io.createHTML(e):e=>e,vu="http://www.w3.org/2000/svg",bu="http://www.w3.org/1998/Math/MathML",kt=typeof document<"u"?document:null,Fl=kt&&kt.createElement("template"),_u={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const o=t==="svg"?kt.createElementNS(vu,e):t==="mathml"?kt.createElementNS(bu,e):s?kt.createElement(e,{is:s}):kt.createElement(e);return e==="select"&&n&&n.multiple!=null&&o.setAttribute("multiple",n.multiple),o},createText:e=>kt.createTextNode(e),createComment:e=>kt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>kt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,o,l){const r=s?s.previousSibling:t.lastChild;if(o&&(o===l||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),s),!(o===l||!(o=o.nextSibling)););else{Fl.innerHTML=Ui(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const i=Fl.content;if(n==="svg"||n==="mathml"){const c=i.firstChild;for(;c.firstChild;)i.appendChild(c.firstChild);i.removeChild(c)}t.insertBefore(i,s)}return[r?r.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Lt="transition",Ps="animation",ks=Symbol("_vtc"),Hi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Wi=Re({},ui,Hi),xu=e=>(e.displayName="Transition",e.props=Wi,e),Ro=xu((e,{slots:t})=>rl(yc,Ki(e),t)),Zt=(e,t=[])=>{J(e)?e.forEach(s=>s(...t)):e&&e(...t)},Ul=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function Ki(e){const t={};for(const B in e)B in Hi||(t[B]=e[B]);if(e.css===!1)return t;const{name:s="v",type:n,duration:o,enterFromClass:l=`${s}-enter-from`,enterActiveClass:r=`${s}-enter-active`,enterToClass:i=`${s}-enter-to`,appearFromClass:c=l,appearActiveClass:f=r,appearToClass:u=i,leaveFromClass:d=`${s}-leave-from`,leaveActiveClass:g=`${s}-leave-active`,leaveToClass:h=`${s}-leave-to`}=e,C=yu(o),x=C&&C[0],L=C&&C[1],{onBeforeEnter:w,onEnter:p,onEnterCancelled:b,onLeave:k,onLeaveCancelled:S,onBeforeAppear:q=w,onAppear:D=p,onAppearCancelled:U=b}=t,M=(B,Z,R,ee)=>{B._enterCancelled=ee,Dt(B,Z?u:i),Dt(B,Z?f:r),R&&R()},z=(B,Z)=>{B._isLeaving=!1,Dt(B,d),Dt(B,h),Dt(B,g),Z&&Z()},ne=B=>(Z,R)=>{const ee=B?D:p,ce=()=>M(Z,B,R);Zt(ee,[Z,ce]),Hl(()=>{Dt(Z,B?c:l),pt(Z,B?u:i),Ul(ee)||Wl(Z,n,x,ce)})};return Re(t,{onBeforeEnter(B){Zt(w,[B]),pt(B,l),pt(B,r)},onBeforeAppear(B){Zt(q,[B]),pt(B,c),pt(B,f)},onEnter:ne(!1),onAppear:ne(!0),onLeave(B,Z){B._isLeaving=!0;const R=()=>z(B,Z);pt(B,d),B._enterCancelled?(pt(B,g),Po(B)):(Po(B),pt(B,g)),Hl(()=>{B._isLeaving&&(Dt(B,d),pt(B,h),Ul(k)||Wl(B,n,L,R))}),Zt(k,[B,R])},onEnterCancelled(B){M(B,!1,void 0,!0),Zt(b,[B])},onAppearCancelled(B){M(B,!0,void 0,!0),Zt(U,[B])},onLeaveCancelled(B){z(B),Zt(S,[B])}})}function yu(e){if(e==null)return null;if(be(e))return[co(e.enter),co(e.leave)];{const t=co(e);return[t,t]}}function co(e){return Ta(e)}function pt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.add(s)),(e[ks]||(e[ks]=new Set)).add(t)}function Dt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.remove(n));const s=e[ks];s&&(s.delete(t),s.size||(e[ks]=void 0))}function Hl(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ku=0;function Wl(e,t,s,n){const o=e._endId=++ku,l=()=>{o===e._endId&&n()};if(s!=null)return setTimeout(l,s);const{type:r,timeout:i,propCount:c}=Gi(e,t);if(!r)return n();const f=r+"end";let u=0;const d=()=>{e.removeEventListener(f,g),l()},g=h=>{h.target===e&&++u>=c&&d()};setTimeout(()=>{u(s[C]||"").split(", "),o=n(`${Lt}Delay`),l=n(`${Lt}Duration`),r=Kl(o,l),i=n(`${Ps}Delay`),c=n(`${Ps}Duration`),f=Kl(i,c);let u=null,d=0,g=0;t===Lt?r>0&&(u=Lt,d=r,g=l.length):t===Ps?f>0&&(u=Ps,d=f,g=c.length):(d=Math.max(r,f),u=d>0?r>f?Lt:Ps:null,g=u?u===Lt?l.length:c.length:0);const h=u===Lt&&/\b(?:transform|all)(?:,|$)/.test(n(`${Lt}Property`).toString());return{type:u,timeout:d,propCount:g,hasTransform:h}}function Kl(e,t){for(;e.lengthGl(s)+Gl(e[n])))}function Gl(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Po(e){return(e?e.ownerDocument:document).body.offsetHeight}function wu(e,t,s){const n=e[ks];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const En=Symbol("_vod"),il=Symbol("_vsh"),ql={name:"show",beforeMount(e,{value:t},{transition:s}){e[En]=e.style.display==="none"?"":e.style.display,s&&t?s.beforeEnter(e):Os(e,t)},mounted(e,{value:t},{transition:s}){s&&t&&s.enter(e)},updated(e,{value:t,oldValue:s},{transition:n}){!t!=!s&&(n?t?(n.beforeEnter(e),Os(e,!0),n.enter(e)):n.leave(e,()=>{Os(e,!1)}):Os(e,t))},beforeUnmount(e,{value:t}){Os(e,t)}};function Os(e,t){e.style.display=t?e[En]:"none",e[il]=!t}const Cu=Symbol(""),Su=/(?:^|;)\s*display\s*:/;function Eu(e,t,s){const n=e.style,o=Ce(s);let l=!1;if(s&&!o){if(t)if(Ce(t))for(const r of t.split(";")){const i=r.slice(0,r.indexOf(":")).trim();s[i]==null&&Vs(n,i,"")}else for(const r in t)s[r]==null&&Vs(n,r,"");for(const r in s){r==="display"&&(l=!0);const i=s[r];i!=null?Au(e,r,!Ce(t)&&t?t[r]:void 0,i)||Vs(n,r,i):Vs(n,r,"")}}else if(o){if(t!==s){const r=n[Cu];r&&(s+=";"+r),n.cssText=s,l=Su.test(s)}}else t&&e.removeAttribute("style");En in e&&(e[En]=l?n.display:"",e[il]&&(n.display="none"))}const zl=/\s*!important$/;function Vs(e,t,s){if(J(s))s.forEach(n=>Vs(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=Tu(e,t);zl.test(s)?e.setProperty(is(n),s.replace(zl,""),"important"):e[n]=s}}const Zl=["Webkit","Moz","ms"],uo={};function Tu(e,t){const s=uo[t];if(s)return s;let n=Ge(t);if(n!=="filter"&&n in e)return uo[t]=n;n=Pn(n);for(let o=0;ofo||(Mu.then(()=>fo=0),fo=Date.now());function Nu(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;const o=s.value;if(J(o)){const l=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{l.call(n),n._stopped=!0};const r=o.slice(),i=[n];for(let c=0;ce.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Vu=(e,t,s,n,o,l)=>{const r=o==="svg";t==="class"?wu(e,n,r):t==="style"?Eu(e,s,n):An(t)?$n(t)||Iu(e,t,s,n,l):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ju(e,t,n,r))?(Ql(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Yl(e,t,n,r,l,t!=="value")):e._isVueCE&&(Du(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Ce(n)))?Ql(e,Ge(t),n,l,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Yl(e,t,n,r))};function ju(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&er(t)&&le(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return er(t)&&Ce(s)?!1:t in e}function Du(e,t){const s=e._def.props;if(!s)return!1;const n=Ge(t);return Array.isArray(s)?s.some(o=>Ge(o)===n):Object.keys(s).some(o=>Ge(o)===n)}const qi=new WeakMap,zi=new WeakMap,Tn=Symbol("_moveCb"),tr=Symbol("_enterCb"),Bu=e=>(delete e.props.mode,e),Fu=Bu({name:"TransitionGroup",props:Re({},Wi,{tag:String,moveClass:String}),setup(e,{slots:t}){const s=ln(),n=ci();let o,l;return vi(()=>{if(!o.length)return;const r=e.moveClass||`${e.name||"v"}-move`;if(!Ku(o[0].el,s.vnode.el,r)){o=[];return}o.forEach(Uu),o.forEach(Hu);const i=o.filter(Wu);Po(s.vnode.el),i.forEach(c=>{const f=c.el,u=f.style;pt(f,r),u.transform=u.webkitTransform=u.transitionDuration="";const d=f[Tn]=g=>{g&&g.target!==f||(!g||g.propertyName.endsWith("transform"))&&(f.removeEventListener("transitionend",d),f[Tn]=null,Dt(f,r))};f.addEventListener("transitionend",d)}),o=[]}),()=>{const r=pe(e),i=Ki(r);let c=r.tag||ie;if(o=[],l)for(let f=0;f{i.split(/\s+/).forEach(c=>c&&n.classList.remove(c))}),s.split(/\s+/).forEach(i=>i&&n.classList.add(i)),n.style.display="none";const l=t.nodeType===1?t:t.parentNode;l.appendChild(n);const{hasTransform:r}=Gi(n);return l.removeChild(n),r}const ws=e=>{const t=e.props["onUpdate:modelValue"]||!1;return J(t)?s=>hn(t,s):t};function Gu(e){e.target.composing=!0}function sr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const bt=Symbol("_assign"),pn=Symbol("_initialValue");function po(e,t,s){return t&&(e=e.trim()),s&&(e=On(e)),e}const Oe={created(e,{modifiers:{lazy:t,trim:s,number:n}},o){e.parentNode&&(e.type==="text"?e[pn]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[pn]=e.defaultValue.replace(/\r\n?/g,` +`))),e[bt]=ws(o);const l=n||o.props&&o.props.type==="number";Ht(e,t?"change":"input",r=>{r.target.composing||e[bt](po(e.value,s,l))}),(s||l)&&Ht(e,"change",()=>{e.value=po(e.value,s,l)}),t||(Ht(e,"compositionstart",Gu),Ht(e,"compositionend",sr),Ht(e,"change",sr))},mounted(e,{value:t,modifiers:{trim:s,number:n}}){const o=t??"",l=e[pn];delete e[pn],l!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==l?e[bt](po(e.value,s,n)):e.value=o},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:o,number:l}},r){if(e[bt]=ws(r),e.composing)return;const i=(l||e.type==="number")&&!/^0\d/.test(e.value)?On(e.value):e.value,c=t??"";if(i===c)return;const f=e.getRootNode();(f instanceof Document||f instanceof ShadowRoot)&&f.activeElement===e&&e.type!=="range"&&(n&&t===s||o&&e.value.trim()===c)||(e.value=c)}},Jt={deep:!0,created(e,t,s){e[bt]=ws(s),Ht(e,"change",()=>{const n=e._modelValue,o=tn(e),l=e.checked,r=e[bt];if(J(n)){const i=Wo(n,o),c=i!==-1;if(l&&!c)r(n.concat(o));else if(!l&&c){const f=[...n];f.splice(i,1),r(f)}}else if(Es(n)){const i=new Set(n);l?i.add(o):i.delete(o),r(i)}else r(Ji(e,l))})},mounted:nr,beforeUpdate(e,t,s){e[bt]=ws(s),nr(e,t,s)}};function nr(e,{value:t,oldValue:s},n){e._modelValue=t;let o;if(J(t))o=Wo(t,n.props.value)>-1;else if(Es(t))o=t.has(n.props.value);else{if(t===s)return;o=Ts(t,Ji(e,!0))}e.checked!==o&&(e.checked=o)}const cl={deep:!0,created(e,{value:t,modifiers:{number:s}},n){e._modelValue=t,Ht(e,"change",()=>{const o=Array.prototype.filter.call(e.options,l=>l.selected).map(l=>s?On(tn(l)):tn(l));e[bt](e.multiple?Es(e._modelValue)?new Set(o):o:o[0]),e._assigning=!0,Rt(()=>{e._assigning=!1})}),e[bt]=ws(n)},mounted(e,{value:t}){or(e,t)},beforeUpdate(e,{value:t},s){e._modelValue=t,e[bt]=ws(s)},updated(e,{value:t}){e._assigning||or(e,t)}};function or(e,t){const s=e.multiple,n=J(t);if(!(s&&!n&&!Es(t))){for(let o=0,l=e.options.length;oString(f)===String(i)):r.selected=Wo(t,i)>-1}else r.selected=t.has(i);else if(Ts(tn(r),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function tn(e){return"_value"in e?e._value:e.value}function Ji(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const qu=["ctrl","shift","alt","meta"],zu={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>qu.some(s=>e[`${s}Key`]&&!t.includes(s))},ls=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((o,...l)=>{for(let r=0;r{const t=Ju().createApp(...e),{mount:s}=t;return t.mount=n=>{const o=Xu(n);if(!o)return;const l=t._component;!le(l)&&!l.render&&!l.template&&(l.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const r=s(o,!1,Qu(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),r},t});function Qu(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Xu(e){return Ce(e)?document.querySelector(e):e}let Yi;const Gn=e=>Yi=e,Qi=Symbol();function Oo(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Ks;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Ks||(Ks={}));function ef(){const e=Nr(!0),t=e.run(()=>oe({}));let s=[],n=[];const o=Yo({install(l){Gn(o),o._a=l,l.provide(Qi,o),l.config.globalProperties.$pinia=o,n.forEach(r=>s.push(r)),n=[]},use(l){return this._a?s.push(l):n.push(l),this},_p:s,_a:null,_e:e,_s:new Map,state:t});return o}const Xi=()=>{};function rr(e,t,s,n=Xi){e.add(t);const o=()=>{e.delete(t)&&n()};return!s&&Vr()&&La(o),o}function ds(e,...t){e.forEach(s=>{s(...t)})}const tf=e=>e(),ir=Symbol(),ho=Symbol();function Mo(e,t){e instanceof Map&&t instanceof Map?t.forEach((s,n)=>e.set(n,s)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const s in t){if(!t.hasOwnProperty(s))continue;const n=t[s],o=e[s];Oo(o)&&Oo(n)&&e.hasOwnProperty(s)&&!Te(n)&&!Et(n)?e[s]=Mo(o,n):e[s]=n}return e}const sf=Symbol();function nf(e){return!Oo(e)||!Object.prototype.hasOwnProperty.call(e,sf)}const{assign:Bt}=Object;function of(e){return!!(Te(e)&&e.effect)}function lf(e,t,s,n){const{state:o,actions:l,getters:r}=t,i=s.state.value[e];let c;function f(){i||(s.state.value[e]=o?o():{});const u=nc(s.state.value[e]);return Bt(u,l,Object.keys(r||{}).reduce((d,g)=>(d[g]=Yo(_e(()=>{Gn(s);const h=s._s.get(e);return r[g].call(h,h)})),d),{}))}return c=ea(e,f,t,s,n,!0),c}function ea(e,t,s={},n,o,l){let r;const i=Bt({actions:{}},s),c={deep:!0};let f,u,d=new Set,g=new Set,h;const C=n.state.value[e];!l&&!C&&(n.state.value[e]={});let x;function L(U){let M;f=u=!1,typeof U=="function"?(U(n.state.value[e]),M={type:Ks.patchFunction,storeId:e,events:h}):(Mo(n.state.value[e],U),M={type:Ks.patchObject,payload:U,storeId:e,events:h});const z=x=Symbol();Rt().then(()=>{x===z&&(f=!0)}),u=!0,ds(d,M,n.state.value[e])}const w=l?function(){const{state:M}=s,z=M?M():{};this.$patch(ne=>{Bt(ne,z)})}:Xi;function p(){r.stop(),d.clear(),g.clear(),n._s.delete(e)}const b=(U,M="")=>{if(ir in U)return U[ho]=M,U;const z=function(){Gn(n);const ne=Array.from(arguments),B=new Set,Z=new Set;function R(te){B.add(te)}function ee(te){Z.add(te)}ds(g,{args:ne,name:z[ho],store:S,after:R,onError:ee});let ce;try{ce=U.apply(this&&this.$id===e?this:S,ne)}catch(te){throw ds(Z,te),te}return ce instanceof Promise?ce.then(te=>(ds(B,te),te)).catch(te=>(ds(Z,te),Promise.reject(te))):(ds(B,ce),ce)};return z[ir]=!0,z[ho]=M,z},k={_p:n,$id:e,$onAction:rr.bind(null,g),$patch:L,$reset:w,$subscribe(U,M={}){const z=rr(d,U,M.detached,()=>ne()),ne=r.run(()=>Be(()=>n.state.value[e],B=>{(M.flush==="sync"?u:f)&&U({storeId:e,type:Ks.direct,events:h},B)},Bt({},c,M)));return z},$dispose:p},S=Kt(k);n._s.set(e,S);const D=(n._a&&n._a.runWithContext||tf)(()=>n._e.run(()=>(r=Nr()).run(()=>t({action:b}))));for(const U in D){const M=D[U];if(Te(M)&&!of(M)||Et(M))l||(C&&nf(M)&&(Te(M)?M.value=C[U]:Mo(M,C[U])),n.state.value[e][U]=M);else if(typeof M=="function"){const z=b(M,U);D[U]=z,i.actions[U]=M}}return Bt(S,D),Bt(pe(S),D),Object.defineProperty(S,"$state",{get:()=>n.state.value[e],set:U=>{L(M=>{Bt(M,U)})}}),n._p.forEach(U=>{Bt(S,r.run(()=>U({store:S,app:n._a,pinia:n,options:i})))}),C&&l&&s.hydrate&&s.hydrate(S.$state,C),f=!0,u=!0,S}function ul(e,t,s){let n;const o=typeof t=="function";n=o?s:t;function l(r,i){const c=pc();return r=r||(c?Qe(Qi,null):null),r&&Gn(r),r=Yi,r._s.has(e)||(o?ea(e,t,n,r):lf(e,n,r)),r._s.get(e)}return l.$id=e,l}const gs=typeof document<"u";function ta(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function rf(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&ta(e.default)}const ge=Object.assign;function mo(e,t){const s={};for(const n in t){const o=t[n];s[n]=it(o)?o.map(e):e(o)}return s}const Gs=()=>{},it=Array.isArray;function ar(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}const sa=/#/g,af=/&/g,cf=/\//g,uf=/=/g,ff=/\?/g,na=/\+/g,df=/%5B/g,pf=/%5D/g,oa=/%5E/g,hf=/%60/g,la=/%7B/g,mf=/%7C/g,ra=/%7D/g,gf=/%20/g;function fl(e){return e==null?"":encodeURI(""+e).replace(mf,"|").replace(df,"[").replace(pf,"]")}function vf(e){return fl(e).replace(la,"{").replace(ra,"}").replace(oa,"^")}function Lo(e){return fl(e).replace(na,"%2B").replace(gf,"+").replace(sa,"%23").replace(af,"%26").replace(hf,"`").replace(la,"{").replace(ra,"}").replace(oa,"^")}function bf(e){return Lo(e).replace(uf,"%3D")}function _f(e){return fl(e).replace(sa,"%23").replace(ff,"%3F")}function xf(e){return _f(e).replace(cf,"%2F")}function sn(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const yf=/\/$/,kf=e=>e.replace(yf,"");function go(e,t,s="/"){let n,o={},l="",r="";const i=t.indexOf("#");let c=t.indexOf("?");return c=i>=0&&c>i?-1:c,c>=0&&(n=t.slice(0,c),l=t.slice(c,i>0?i:t.length),o=e(l.slice(1))),i>=0&&(n=n||t.slice(0,i),r=t.slice(i,t.length)),n=Ef(n??t,s),{fullPath:n+l+r,path:n,query:o,hash:sn(r)}}function wf(e,t){const s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function cr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Cf(e,t,s){const n=t.matched.length-1,o=s.matched.length-1;return n>-1&&n===o&&Cs(t.matched[n],s.matched[o])&&ia(t.params,s.params)&&e(t.query)===e(s.query)&&t.hash===s.hash}function Cs(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ia(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var s in e)if(!Sf(e[s],t[s]))return!1;return!0}function Sf(e,t){return it(e)?ur(e,t):it(t)?ur(t,e):e?.valueOf()===t?.valueOf()}function ur(e,t){return it(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function Ef(e,t){if(e.startsWith("/"))return e;if(!e)return t;const s=t.split("/"),n=e.split("/"),o=n[n.length-1];(o===".."||o===".")&&n.push("");let l=s.length-1,r,i;for(r=0;r1&&l--;else break;return s.slice(0,l).join("/")+"/"+n.slice(r).join("/")}const Nt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let No=(function(e){return e.pop="pop",e.push="push",e})({}),vo=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function Tf(e){if(!e)if(gs){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),kf(e)}const Af=/^[^#]+#/;function $f(e,t){return e.replace(Af,"#")+t}function If(e,t){const s=document.documentElement.getBoundingClientRect(),n=e.getBoundingClientRect();return{behavior:t.behavior,left:n.left-s.left-(t.left||0),top:n.top-s.top-(t.top||0)}}const qn=()=>({left:window.scrollX,top:window.scrollY});function Rf(e){let t;if("el"in e){const s=e.el,n=typeof s=="string"&&s.startsWith("#"),o=typeof s=="string"?n?document.getElementById(s.slice(1)):document.querySelector(s):s;if(!o)return;t=If(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function fr(e,t){return(history.state?history.state.position-t:-1)+e}const Vo=new Map;function Pf(e,t){Vo.set(e,t)}function Of(e){const t=Vo.get(e);return Vo.delete(e),t}function Mf(e){return typeof e=="string"||e&&typeof e=="object"}function aa(e){return typeof e=="string"||typeof e=="symbol"}let Se=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({});const ca=Symbol("");Se.MATCHER_NOT_FOUND+"",Se.NAVIGATION_GUARD_REDIRECT+"",Se.NAVIGATION_ABORTED+"",Se.NAVIGATION_CANCELLED+"",Se.NAVIGATION_DUPLICATED+"";function Ss(e,t){return ge(new Error,{type:e,[ca]:!0},t)}function yt(e,t){return e instanceof Error&&ca in e&&(t==null||!!(e.type&t))}const Lf=["params","query","hash"];function Nf(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const s of Lf)s in e&&(t[s]=e[s]);return JSON.stringify(t,null,2)}function Vf(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let n=0;no&&Lo(o)):[n&&Lo(n)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+s,o!=null&&(t+="="+o))})}return t}function jf(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=it(n)?n.map(o=>o==null?null:""+o):n==null?n:""+n)}return t}const Df=Symbol(""),pr=Symbol(""),zn=Symbol(""),dl=Symbol(""),jo=Symbol("");function Ms(){let e=[];function t(n){return e.push(n),()=>{const o=e.indexOf(n);o>-1&&e.splice(o,1)}}function s(){e=[]}return{add:t,list:()=>e.slice(),reset:s}}function Ut(e,t,s,n,o,l=r=>r()){const r=n&&(n.enterCallbacks[o]=n.enterCallbacks[o]||[]);return()=>new Promise((i,c)=>{const f=g=>{g===!1?c(Ss(Se.NAVIGATION_ABORTED,{from:s,to:t})):g instanceof Error?c(g):Mf(g)?c(Ss(Se.NAVIGATION_GUARD_REDIRECT,{from:t,to:g})):(r&&n.enterCallbacks[o]===r&&typeof g=="function"&&r.push(g),i())},u=l(()=>e.call(n&&n.instances[o],t,s,f));let d=Promise.resolve(u);e.length<3&&(d=d.then(f)),d.catch(g=>c(g))})}function bo(e,t,s,n,o=l=>l()){const l=[];for(const r of e)for(const i in r.components){let c=r.components[i];if(!(t!=="beforeRouteEnter"&&!r.instances[i]))if(ta(c)){const f=(c.__vccOpts||c)[t];f&&l.push(Ut(f,s,n,r,i,o))}else{let f=c();l.push(()=>f.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${i}" at "${r.path}"`);const d=rf(u)?u.default:u;r.mods[i]=u,r.components[i]=d;const g=(d.__vccOpts||d)[t];return g&&Ut(g,s,n,r,i,o)()}))}}return l}function Bf(e,t){const s=[],n=[],o=[],l=Math.max(t.matched.length,e.matched.length);for(let r=0;rCs(f,i))?n.push(i):s.push(i));const c=e.matched[r];c&&(t.matched.find(f=>Cs(f,c))||o.push(c))}return[s,n,o]}let Ff=()=>location.protocol+"//"+location.host;function ua(e,t){const{pathname:s,search:n,hash:o}=t,l=e.indexOf("#");if(l>-1){let r=o.includes(e.slice(l))?e.slice(l).length:1,i=o.slice(r);return i[0]!=="/"&&(i="/"+i),cr(i,"")}return cr(s,e)+n+o}function Uf(e,t,s,n){let o=[],l=[],r=null;const i=({state:g})=>{const h=ua(e,location),C=s.value,x=t.value;let L=0;if(g){if(s.value=h,t.value=g,r&&r===C){r=null;return}L=x?g.position-x.position:0}else n(h);o.forEach(w=>{w(s.value,C,{delta:L,type:No.pop,direction:L?L>0?vo.forward:vo.back:vo.unknown})})};function c(){r=s.value}function f(g){o.push(g);const h=()=>{const C=o.indexOf(g);C>-1&&o.splice(C,1)};return l.push(h),h}function u(){if(document.visibilityState==="hidden"){const{history:g}=window;if(!g.state)return;g.replaceState(ge({},g.state,{scroll:qn()}),"")}}function d(){for(const g of l)g();l=[],window.removeEventListener("popstate",i),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}return window.addEventListener("popstate",i),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:c,listen:f,destroy:d}}function hr(e,t,s,n=!1,o=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:o?qn():null}}function Hf(e){const{history:t,location:s}=window,n={value:ua(e,s)},o={value:t.state};o.value||l(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function l(c,f,u){const d=e.indexOf("#"),g=d>-1?(s.host&&document.querySelector("base")?e:e.slice(d))+c:Ff()+e+c;try{t[u?"replaceState":"pushState"](f,"",g),o.value=f}catch(h){console.error(h),s[u?"replace":"assign"](g)}}function r(c,f){l(c,ge({},t.state,hr(o.value.back,c,o.value.forward,!0),f,{position:o.value.position}),!0),n.value=c}function i(c,f){const u=ge({},o.value,t.state,{forward:c,scroll:qn()});l(u.current,u,!0),l(c,ge({},hr(n.value,c,null),{position:u.position+1},f),!1),n.value=c}return{location:n,state:o,push:i,replace:r}}function Wf(e){e=Tf(e);const t=Hf(e),s=Uf(e,t.state,t.location,t.replace);function n(l,r=!0){r||s.pauseListeners(),history.go(l)}const o=ge({location:"",base:e,go:n,createHref:$f.bind(null,e)},t,s);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Kf(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Wf(e)}let ss=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var Pe=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Pe||{});const Gf={type:ss.Static,value:""},qf=/[a-zA-Z0-9_]/;function zf(e){if(!e)return[[]];if(e==="/")return[[Gf]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(h){throw new Error(`ERR (${s})/"${f}": ${h}`)}let s=Pe.Static,n=s;const o=[];let l;function r(){l&&o.push(l),l=[]}let i=0,c,f="",u="";function d(){f&&(s===Pe.Static?l.push({type:ss.Static,value:f}):s===Pe.Param||s===Pe.ParamRegExp||s===Pe.ParamRegExpEnd?(l.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),l.push({type:ss.Param,value:f,regexp:u,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),f="")}function g(){f+=c}for(;it.length?t.length===1&&t[0]===We.Static+We.Segment?1:-1:0}function fa(e,t){let s=0;const n=e.score,o=t.score;for(;s0&&t[t.length-1]<0}const Xf={strict:!1,end:!0,sensitive:!1};function ed(e,t,s){const n=Yf(zf(e.path),s),o=ge(n,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function td(e,t){const s=[],n=new Map;t=ar(Xf,t);function o(d){return n.get(d)}function l(d,g,h){const C=!h,x=br(d);x.aliasOf=h&&h.record;const L=ar(t,d),w=[x];if("alias"in d){const k=typeof d.alias=="string"?[d.alias]:d.alias;for(const S of k)w.push(br(ge({},x,{components:h?h.record.components:x.components,path:S,aliasOf:h?h.record:x})))}let p,b;for(const k of w){const{path:S}=k;if(g&&S[0]!=="/"){const q=g.record.path,D=q[q.length-1]==="/"?"":"/";k.path=g.record.path+(S&&D+S)}if(p=ed(k,g,L),h?h.alias.push(p):(b=b||p,b!==p&&b.alias.push(p),C&&d.name&&!_r(p)&&r(d.name)),da(p)&&c(p),x.children){const q=x.children;for(let D=0;D{r(b)}:Gs}function r(d){if(aa(d)){const g=n.get(d);g&&(n.delete(d),s.splice(s.indexOf(g),1),g.children.forEach(r),g.alias.forEach(r))}else{const g=s.indexOf(d);g>-1&&(s.splice(g,1),d.record.name&&n.delete(d.record.name),d.children.forEach(r),d.alias.forEach(r))}}function i(){return s}function c(d){const g=od(d,s);s.splice(g,0,d),d.record.name&&!_r(d)&&n.set(d.record.name,d)}function f(d,g){let h,C={},x,L;if("name"in d&&d.name){if(h=n.get(d.name),!h)throw Ss(Se.MATCHER_NOT_FOUND,{location:d});L=h.record.name,C=ge(vr(g.params,h.keys.filter(b=>!b.optional).concat(h.parent?h.parent.keys.filter(b=>b.optional):[]).map(b=>b.name)),d.params&&vr(d.params,h.keys.map(b=>b.name))),x=h.stringify(C)}else if(d.path!=null)x=d.path,h=s.find(b=>b.re.test(x)),h&&(C=h.parse(x),L=h.record.name);else{if(h=g.name?n.get(g.name):s.find(b=>b.re.test(g.path)),!h)throw Ss(Se.MATCHER_NOT_FOUND,{location:d,currentLocation:g});L=h.record.name,C=ge({},g.params,d.params),x=h.stringify(C)}const w=[];let p=h;for(;p;)w.unshift(p.record),p=p.parent;return{name:L,path:x,params:C,matched:w,meta:nd(w)}}e.forEach(d=>l(d));function u(){s.length=0,n.clear()}return{addRoute:l,resolve:f,removeRoute:r,clearRoutes:u,getRoutes:i,getRecordMatcher:o}}function vr(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function br(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:sd(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function sd(e){const t={},s=e.props||!1;if("component"in e)t.default=s;else for(const n in e.components)t[n]=typeof s=="object"?s[n]:s;return t}function _r(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function nd(e){return e.reduce((t,s)=>ge(t,s.meta),{})}function od(e,t){let s=0,n=t.length;for(;s!==n;){const l=s+n>>1;fa(e,t[l])<0?n=l:s=l+1}const o=ld(e);return o&&(n=t.lastIndexOf(o,n-1)),n}function ld(e){let t=e;for(;t=t.parent;)if(da(t)&&fa(e,t)===0)return t}function da({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function xr(e){const t=Qe(zn),s=Qe(dl),n=_e(()=>{const c=O(e.to);return t.resolve(c)}),o=_e(()=>{const{matched:c}=n.value,{length:f}=c,u=c[f-1],d=s.matched;if(!u||!d.length)return-1;const g=d.findIndex(Cs.bind(null,u));if(g>-1)return g;const h=yr(c[f-2]);return f>1&&yr(u)===h&&d[d.length-1].path!==h?d.findIndex(Cs.bind(null,c[f-2])):g}),l=_e(()=>o.value>-1&&ud(s.params,n.value.params)),r=_e(()=>o.value>-1&&o.value===s.matched.length-1&&ia(s.params,n.value.params));function i(c={}){if(cd(c)){const f=t[O(e.replace)?"replace":"push"](O(e.to)).catch(Gs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:n,href:_e(()=>n.value.href),isActive:l,isExactActive:r,navigate:i}}function rd(e){return e.length===1?e[0]:e}const id=hi({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:xr,setup(e,{slots:t}){const s=Kt(xr(e)),{options:n}=Qe(zn),o=_e(()=>({[kr(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[kr(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const l=t.default&&rd(t.default(s));return e.custom?l:rl("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},l)}}}),ad=id;function cd(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function ud(e,t){for(const s in t){const n=t[s],o=e[s];if(typeof n=="string"){if(n!==o)return!1}else if(!it(o)||o.length!==n.length||n.some((l,r)=>l.valueOf()!==o[r].valueOf()))return!1}return!0}function yr(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const kr=(e,t,s)=>e??t??s,fd=hi({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=Qe(jo),o=_e(()=>e.route||n.value),l=Qe(pr,0),r=_e(()=>{let f=O(l);const{matched:u}=o.value;let d;for(;(d=u[f])&&!d.components;)f++;return f}),i=_e(()=>o.value.matched[r.value]);Us(pr,_e(()=>r.value+1)),Us(Df,i),Us(jo,o);const c=oe();return Be(()=>[c.value,i.value,e.name],([f,u,d],[g,h,C])=>{u&&(u.instances[d]=f,h&&h!==u&&f&&f===g&&(u.leaveGuards.size||(u.leaveGuards=h.leaveGuards),u.updateGuards.size||(u.updateGuards=h.updateGuards))),f&&u&&(!h||!Cs(u,h)||!g)&&(u.enterCallbacks[d]||[]).forEach(x=>x(f))},{flush:"post"}),()=>{const f=o.value,u=e.name,d=i.value,g=d&&d.components[u];if(!g)return wr(s.default,{Component:g,route:f});const h=d.props[u],C=h?h===!0?f.params:typeof h=="function"?h(f):h:null,L=rl(g,ge({},C,t,{onVnodeUnmounted:w=>{w.component.isUnmounted&&(d.instances[u]=null)},ref:c}));return wr(s.default,{Component:L,route:f})||L}}});function wr(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const dd=fd;function pd(e){const t=td(e.routes,e),s=e.parseQuery||Vf,n=e.stringifyQuery||dr,o=e.history,l=Ms(),r=Ms(),i=Ms(),c=ec(Nt);let f=Nt;gs&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=mo.bind(null,$=>""+$),d=mo.bind(null,xf),g=mo.bind(null,sn);function h($,K){let H,Y;return aa($)?(H=t.getRecordMatcher($),Y=K):Y=$,t.addRoute(Y,H)}function C($){const K=t.getRecordMatcher($);K&&t.removeRoute(K)}function x(){return t.getRoutes().map($=>$.record)}function L($){return!!t.getRecordMatcher($)}function w($,K){if(K=ge({},K||c.value),typeof $=="string"){const _=go(s,$,K.path),A=t.resolve({path:_.path},K),I=o.createHref(_.fullPath);return ge(_,A,{params:g(A.params),hash:sn(_.hash),redirectedFrom:void 0,href:I})}let H;if($.path!=null)H=ge({},$,{path:go(s,$.path,K.path).path});else{const _=ge({},$.params);for(const A in _)_[A]==null&&delete _[A];H=ge({},$,{params:d(_)}),K.params=d(K.params)}const Y=t.resolve(H,K),de=$.hash||"";Y.params=u(g(Y.params));const m=wf(n,ge({},$,{hash:vf(de),path:Y.path})),v=o.createHref(m);return ge({fullPath:m,hash:de,query:n===dr?jf($.query):$.query||{}},Y,{redirectedFrom:void 0,href:v})}function p($){return typeof $=="string"?go(s,$,c.value.path):ge({},$)}function b($,K){if(f!==$)return Ss(Se.NAVIGATION_CANCELLED,{from:K,to:$})}function k($){return D($)}function S($){return k(ge(p($),{replace:!0}))}function q($,K){const H=$.matched[$.matched.length-1];if(H&&H.redirect){const{redirect:Y}=H;let de=typeof Y=="function"?Y($,K):Y;return typeof de=="string"&&(de=de.includes("?")||de.includes("#")?de=p(de):{path:de},de.params={}),ge({query:$.query,hash:$.hash,params:de.path!=null?{}:$.params},de)}}function D($,K){const H=f=w($),Y=c.value,de=$.state,m=$.force,v=$.replace===!0,_=q(H,Y);if(_)return D(ge(p(_),{state:typeof _=="object"?ge({},de,_.state):de,force:m,replace:v}),K||H);const A=H;A.redirectedFrom=K;let I;return!m&&Cf(n,Y,H)&&(I=Ss(Se.NAVIGATION_DUPLICATED,{to:A,from:Y}),at(Y,Y,!0,!1)),(I?Promise.resolve(I):z(A,Y)).catch(T=>yt(T)?yt(T,Se.NAVIGATION_GUARD_REDIRECT)?T:qe(T):re(T,A,Y)).then(T=>{if(T){if(yt(T,Se.NAVIGATION_GUARD_REDIRECT))return D(ge({replace:v},p(T.to),{state:typeof T.to=="object"?ge({},de,T.to.state):de,force:m}),K||A)}else T=B(A,Y,!0,v,de);return ne(A,Y,T),T})}function U($,K){const H=b($,K);return H?Promise.reject(H):Promise.resolve()}function M($){const K=us.values().next().value;return K&&typeof K.runWithContext=="function"?K.runWithContext($):$()}function z($,K){let H;const[Y,de,m]=Bf($,K);H=bo(Y.reverse(),"beforeRouteLeave",$,K);for(const _ of Y)_.leaveGuards.forEach(A=>{H.push(Ut(A,$,K))});const v=U.bind(null,$,K);return H.push(v),et(H).then(()=>{H=[];for(const _ of l.list())H.push(Ut(_,$,K));return H.push(v),et(H)}).then(()=>{H=bo(de,"beforeRouteUpdate",$,K);for(const _ of de)_.updateGuards.forEach(A=>{H.push(Ut(A,$,K))});return H.push(v),et(H)}).then(()=>{H=[];for(const _ of m)if(_.beforeEnter)if(it(_.beforeEnter))for(const A of _.beforeEnter)H.push(Ut(A,$,K));else H.push(Ut(_.beforeEnter,$,K));return H.push(v),et(H)}).then(()=>($.matched.forEach(_=>_.enterCallbacks={}),H=bo(m,"beforeRouteEnter",$,K,M),H.push(v),et(H))).then(()=>{H=[];for(const _ of r.list())H.push(Ut(_,$,K));return H.push(v),et(H)}).catch(_=>yt(_,Se.NAVIGATION_CANCELLED)?_:Promise.reject(_))}function ne($,K,H){i.list().forEach(Y=>M(()=>Y($,K,H)))}function B($,K,H,Y,de){const m=b($,K);if(m)return m;const v=K===Nt,_=gs?history.state:{};H&&(Y||v?o.replace($.fullPath,ge({scroll:v&&_&&_.scroll},de)):o.push($.fullPath,de)),c.value=$,at($,K,H,v),qe()}let Z;function R(){Z||(Z=o.listen(($,K,H)=>{if(!Gt.listening)return;const Y=w($),de=q(Y,Gt.currentRoute.value);if(de){D(ge(de,{replace:!0,force:!0}),Y).catch(Gs);return}f=Y;const m=c.value;gs&&Pf(fr(m.fullPath,H.delta),qn()),z(Y,m).catch(v=>yt(v,Se.NAVIGATION_ABORTED|Se.NAVIGATION_CANCELLED)?v:yt(v,Se.NAVIGATION_GUARD_REDIRECT)?(D(ge(p(v.to),{force:!0}),Y).then(_=>{yt(_,Se.NAVIGATION_ABORTED|Se.NAVIGATION_DUPLICATED)&&!H.delta&&H.type===No.pop&&o.go(-1,!1)}).catch(Gs),Promise.reject()):(H.delta&&o.go(-H.delta,!1),re(v,Y,m))).then(v=>{v=v||B(Y,m,!1),v&&(H.delta&&!yt(v,Se.NAVIGATION_CANCELLED)?o.go(-H.delta,!1):H.type===No.pop&&yt(v,Se.NAVIGATION_ABORTED|Se.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),ne(Y,m,v)}).catch(Gs)}))}let ee=Ms(),ce=Ms(),te;function re($,K,H){qe($);const Y=ce.list();return Y.length?Y.forEach(de=>de($,K,H)):console.error($),Promise.reject($)}function Fe(){return te&&c.value!==Nt?Promise.resolve():new Promise(($,K)=>{ee.add([$,K])})}function qe($){return te||(te=!$,R(),ee.list().forEach(([K,H])=>$?H($):K()),ee.reset()),$}function at($,K,H,Y){const{scrollBehavior:de}=e;if(!gs||!de)return Promise.resolve();const m=!H&&Of(fr($.fullPath,0))||(Y||!H)&&history.state&&history.state.scroll||null;return Rt().then(()=>de($,K,m)).then(v=>v&&Rf(v)).catch(v=>re(v,$,K))}const ze=$=>o.go($);let cs;const us=new Set,Gt={currentRoute:c,listening:!0,addRoute:h,removeRoute:C,clearRoutes:t.clearRoutes,hasRoute:L,getRoutes:x,resolve:w,options:e,push:k,replace:S,go:ze,back:()=>ze(-1),forward:()=>ze(1),beforeEach:l.add,beforeResolve:r.add,afterEach:i.add,onError:ce.add,isReady:Fe,install($){$.component("RouterLink",ad),$.component("RouterView",dd),$.config.globalProperties.$router=Gt,Object.defineProperty($.config.globalProperties,"$route",{enumerable:!0,get:()=>O(c)}),gs&&!cs&&c.value===Nt&&(cs=!0,k(o.location).catch(Y=>{}));const K={};for(const Y in Nt)Object.defineProperty(K,Y,{get:()=>c.value[Y],enumerable:!0});$.provide(zn,Gt),$.provide(dl,Qr(K)),$.provide(jo,c);const H=$.unmount;us.add($),$.unmount=function(){us.delete($),us.size<1&&(f=Nt,Z&&Z(),Z=null,c.value=Nt,cs=!1,te=!1),H()}}};function et($){return $.reduce((K,H)=>K.then(()=>M(H)),Promise.resolve())}return Gt}function hd(){return Qe(zn)}function pa(e){return Qe(dl)}const Zn="vnt-web-access-token",Jn=!!globalThis.__VNT_DESKTOP__,js=new URL(window.location.href),Do=js.searchParams.get("token")||"";Do&&(localStorage.setItem(Zn,Do),js.searchParams.delete("token"),window.history.replaceState({},"",`${js.pathname}${js.search}${js.hash}`));const Yn=oe(Jn?"":Do||localStorage.getItem(Zn)||""),pl=oe(Jn||!!Yn.value),ha=()=>Yn.value,md=e=>{const t=e.trim();localStorage.setItem(Zn,t),Yn.value=t,pl.value=!!t},gd=()=>{localStorage.removeItem(Zn),Yn.value="",pl.value=!1},ot=async(e,t={})=>{if(globalThis.__VNT_IPC_REQUEST__){const r=await globalThis.__VNT_IPC_REQUEST__({method:t.method||"GET",path:e,body:t.body||null});if(r.code!==0)throw new Error(r.msg||"请求失败");return r.data}const s=new Headers(t.headers||{}),n=ha();n&&s.set("Authorization",`Bearer ${n}`);const o=await fetch(e,{...t,headers:s}),l=await o.json();if(o.status===401&&gd(),l.code!==0)throw new Error(l.msg||"请求失败");return l.data},ma={"Content-Type":"application/json"},vd=e=>ot(`/api/info?file_name=${encodeURIComponent(e)}`),bd=e=>ot(`/api/peers?file_name=${encodeURIComponent(e)}`),_d=e=>ot(`/api/routes?file_name=${encodeURIComponent(e)}`),xd=e=>ot(`/api/start/status?file_name=${encodeURIComponent(e)}`),yd=()=>ot("/api/version"),kd=()=>ot("/api/instances"),wd=e=>ot(`/api/instance?file_name=${encodeURIComponent(e)}`,{method:"DELETE"}),hl=(e,t)=>ot(e,{method:"POST",headers:ma,body:JSON.stringify({file_name:t})}),Cd=e=>hl("/api/start",e),ga=e=>hl("/api/stop",e),Sd=e=>hl("/api/restart",e),Ed=()=>ot("/api/config/list"),Td=e=>ot(`/api/config?file_name=${encodeURIComponent(e)}`),Ad=(e,t)=>ot("/api/config",{method:"POST",headers:ma,body:JSON.stringify({file_name:e||null,config:t})}),$d=e=>ot(`/api/config?file_name=${encodeURIComponent(e)}`,{method:"DELETE"});let Id=0;const as=ul("ui",()=>{const e=oe([]),t=(i,c,f=3e3)=>{const u=++Id;e.value.push({id:u,type:i,message:c}),setTimeout(()=>{e.value=e.value.filter(d=>d.id!==u)},f)},s={success:i=>t("success",i),error:i=>t("error",i,4500),info:i=>t("info",i)},n=Kt({show:!1,title:"",message:"",danger:!1,confirmText:"确定",resolve:null});return{toasts:e,toast:s,confirmState:n,confirm:({title:i="确认操作",message:c="",danger:f=!1,confirmText:u="确定"}={})=>new Promise(d=>{n.show=!0,n.title=i,n.message=c,n.danger=f,n.confirmText=u,n.resolve=d}),confirmOk:()=>{n.show=!1,n.resolve&&n.resolve(!0),n.resolve=null},confirmCancel:()=>{n.show=!1,n.resolve&&n.resolve(!1),n.resolve=null}}}),va=ul("startLog",()=>{const e=oe(!1),t=oe([]),s=oe("stopped"),n=oe(null),o=oe(null);let l=null,r=null,i=null,c=null;const f=({fetchInstances:w,instanceList:p,configList:b})=>{r=w,i=p,c=b},u=_e(()=>{if(!n.value)return"";const w=(i?.value||[]).find(b=>b.file_name===n.value);if(w)return w.config_name||w.file_name;const p=(c?.value||[]).find(b=>b.file_name===n.value);return p?p.config_name||p.file_name:n.value}),d=async()=>{if(n.value)try{const w=await xd(n.value);t.value=w.logs||[],s.value=w.status,Rt(()=>{o.value&&(o.value.scrollTop=o.value.scrollHeight)}),s.value==="running"?(g(),r&&r(),e.value=!1):s.value==="stopped"&&t.value.length>0&&(g(),r&&r())}catch(w){console.error(w)}},g=()=>{l&&(clearInterval(l),l=null)},h=()=>{g(),l=setInterval(d,1e3),d()};return{showStartLog:e,startLogs:t,startStatus:s,logFileName:n,logContainer:o,logConfigName:u,bindApp:f,openStartLog:w=>{n.value=w,t.value=[],s.value="starting",e.value=!0,h()},pollStartStatus:d,startPolling:h,stopPolling:g,cancelStart:async()=>{g();const w=n.value;if(w)try{await ga(w),t.value.push("启动已手动取消")}catch{}s.value="stopped",r&&r()},close:()=>{e.value=!1}}}),Mt=ul("app",()=>{const e=as(),t=va(),s=oe({}),n=oe([]),o=oe(null),l=oe([]),r=oe({}),i=oe({}),c=oe(!document.hidden),f=()=>{c.value=!document.hidden};let u=null;const d=_e(()=>n.value.filter(R=>R.status==="running").length),g=_e(()=>n.value.filter(R=>R.status==="starting").length),h=_e(()=>d.value>0?`运行中 x${d.value}`:g.value>0?"启动中...":"未启动"),C=_e(()=>o.value&&s.value[o.value]||null),x=_e(()=>{if(!o.value)return"";const R=n.value.find(ee=>ee.file_name===o.value);return R?R.config_name||R.file_name:o.value}),L=oe(""),w=async()=>{try{L.value=await yd()||""}catch(R){console.error("Fetch version error",R)}},p=_e(()=>!!(C.value&&C.value.server_info&&C.value.server_info.some(R=>R.connected))),b=_e(()=>{const R=C.value;return!R||!R.server_info||!R.server_info.length?"未配置服务器":`${R.server_info.filter(ee=>ee.connected).length} / ${R.server_info.length} 已连接`}),k=R=>s.value[R]||{},S=async R=>{try{s.value[R]=await vd(R)}catch(ee){console.error("Fetch info error",ee)}},q=async()=>{try{const R=await kd()||[];n.value=R;for(const ee of Object.keys(s.value))R.some(ce=>ce.file_name===ee)||delete s.value[ee];for(const ee of Object.keys(i.value)){const ce=R.find(te=>te.file_name===ee);(!ce||ce.status==="stopped")&&delete i.value[ee]}if(!o.value||!R.some(ee=>ee.file_name===o.value)){const ee=R.find(ce=>ce.status==="running");o.value=ee?ee.file_name:R.length>0?R[0].file_name:null}for(const ee of R)ee.status==="running"&&S(ee.file_name)}catch(R){console.error("Fetch instances error",R)}},D=async()=>{try{l.value=await Ed()||[]}catch(R){console.error("Fetch list error",R)}},U=async R=>{if(!R){e.toast.error("请先选择一个配置");return}if(!r.value[R]){r.value[R]=!0;try{await Cd(R),t.openStartLog(R),q()}catch(ee){e.toast.error("启动失败: "+ee.message)}finally{r.value[R]=!1}}},M=async R=>{if(!(!R||r.value[R])){r.value[R]=!0,i.value[R]=!0;try{await ga(R),e.toast.success("已停止"),t.logFileName===R&&(t.stopPolling(),t.showStartLog=!1),q()}catch(ee){e.toast.error("停止失败: "+ee.message),console.error(ee),delete i.value[R]}finally{r.value[R]=!1}}},z=async R=>{if(!(!R||r.value[R])){r.value[R]=!0;try{await Sd(R),t.openStartLog(R),q()}catch(ee){e.toast.error("重启失败: "+ee.message)}finally{r.value[R]=!1}}},ne=async R=>{if(!(!R||r.value[R])){r.value[R]=!0;try{await wd(R),e.toast.success("已移除"),t.logFileName===R&&(t.stopPolling(),t.showStartLog=!1),o.value===R&&(o.value=null),q()}catch(ee){e.toast.error("移除失败: "+ee.message)}finally{r.value[R]=!1}}};t.bindApp({fetchInstances:q,instanceList:n,configList:l});const B=async()=>{if(!Jn&&!ha())return;document.addEventListener("visibilitychange",f),w(),await q(),D();const R=n.value.find(ee=>ee.status==="starting");R&&t.openStartLog(R.file_name),u=setInterval(()=>{c.value&&q()},3e3)},Z=()=>{document.removeEventListener("visibilitychange",f),t.stopPolling(),u&&clearInterval(u)};return ln()&&(Ot(B),As(Z)),{instances:s,instanceList:n,selectedInstance:o,configList:l,loadingMap:r,stoppingMap:i,isPageVisible:c,runningCount:d,startingCount:g,headerStatusText:h,selectedInfo:C,selectedConfigName:x,version:L,isServerConnected:p,serverStatusText:b,infoOf:k,fetchInstances:q,fetchInstanceInfo:S,fetchConfigList:D,startVnt:U,stopVnt:M,restartVnt:z,dismissInstance:ne}}),Rd=[{to:"/",label:"网络总览",shortLabel:"总览",icon:"M4 4h6v6H4V4Zm10 0h6v6h-6V4ZM4 14h6v6H4v-6Zm10 0h6v6h-6v-6Z"},{to:"/instances",label:"运行实例",shortLabel:"实例",icon:"M4 18V8m5 10V4m6 14v-7m5 7V6"},{to:"/peers",label:"在线设备",shortLabel:"设备",icon:"M15 19a6 6 0 0 0-12 0m18 0a5 5 0 0 0-5-5m-7-3a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm8 0a3 3 0 1 0 0-6"},{to:"/routes",label:"路由表",shortLabel:"路由",icon:"M6 8a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm12 12a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM8 6h6a4 4 0 0 1 4 4v2m-3-3 3 3 3-3M16 18h-6a4 4 0 0 1-4-4v-2"},{to:"/config",label:"组网配置",shortLabel:"配置",icon:"M12 15.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Zm7.4-.5a1.7 1.7 0 0 0 .3 1.9l.1.1-2.8 2.8-.1-.1a1.7 1.7 0 0 0-1.9-.3A1.7 1.7 0 0 0 14 21v.2h-4V21a1.7 1.7 0 0 0-1-1.6 1.7 1.7 0 0 0-1.9.3l-.1.1L4.2 17l.1-.1a1.7 1.7 0 0 0 .3-1.9A1.7 1.7 0 0 0 3 14h-.2v-4H3a1.7 1.7 0 0 0 1.6-1 1.7 1.7 0 0 0-.3-1.9L4.2 7 7 4.2l.1.1A1.7 1.7 0 0 0 9 4.6 1.7 1.7 0 0 0 10 3v-.2h4V3a1.7 1.7 0 0 0 1 1.6 1.7 1.7 0 0 0 1.9-.3l.1-.1L19.8 7l-.1.1a1.7 1.7 0 0 0-.3 1.9 1.7 1.7 0 0 0 1.6 1h.2v4H21a1.7 1.7 0 0 0-1.6 1Z"},{to:"/web-access",label:"Web 访问",shortLabel:"Web",desktopOnly:!0,icon:"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0 0c2.2-2.5 3.3-5.5 3.3-9S14.2 5.5 12 3m0 18c-2.2-2.5-3.3-5.5-3.3-9S9.8 5.5 12 3M3.5 9h17m-17 6h17"}],ba=()=>Rd.filter(e=>!e.desktopOnly||globalThis.__VNT_DESKTOP__),ml="/assets/vnt-icon-CtSHy0mt.png",Pd={class:"flex h-full min-h-0 flex-col bg-white dark:bg-slate-900"},Od={class:"flex h-16 shrink-0 items-center gap-3 border-b border-slate-200 px-5 dark:border-slate-800"},Md=["src"],Ld={class:"mx-3 mt-4 flex items-center gap-3 rounded-xl border border-slate-200 bg-slate-50 px-3 py-3 dark:border-slate-700 dark:bg-slate-800/60"},Nd={class:"min-w-0"},Vd={class:"mt-0.5 truncate text-xs font-medium text-slate-700 dark:text-slate-200"},jd={class:"mt-4 flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto px-3","aria-label":"主导航"},Dd={class:"h-[18px] w-[18px] shrink-0 fill-none stroke-current",viewBox:"0 0 24 24"},Bd=["d"],Fd={class:"mx-3 mt-3 shrink-0 border-t border-slate-200 px-1 py-4 dark:border-slate-800"},Ud={class:"flex items-center gap-2 text-xs text-slate-400"},Hd={class:"ml-auto font-mono text-[10px]"},Cr={__name:"AppSidebar",emits:["navigate"],setup(e){const t=pa(),s=Mt(),n=ba();return(o,l)=>{const r=Un("router-link");return y(),E("div",Pd,[a("div",Od,[a("img",{src:O(ml),alt:"",class:"h-8 w-8 shrink-0"},null,8,Md),l[1]||(l[1]=a("div",null,[a("div",{class:"text-sm font-bold tracking-wide text-slate-900 dark:text-white"},"VNT"),a("div",{class:"text-[9px] font-semibold tracking-[0.18em] text-slate-400"},"CONTROL CENTER")],-1))]),a("div",Ld,[a("span",{class:G(["h-2.5 w-2.5 shrink-0 rounded-full",O(s).runningCount>0?"bg-green-500":O(s).startingCount>0?"animate-pulse bg-amber-400":"bg-slate-300 dark:bg-slate-600"])},null,2),a("div",Nd,[l[2]||(l[2]=a("div",{class:"text-[9px] font-semibold tracking-wider text-slate-400"},"虚拟网络",-1)),a("div",Vd,V(O(s).headerStatusText),1)])]),a("nav",jd,[(y(!0),E(ie,null,Ee(O(n),i=>(y(),Ie(r,{key:i.to,to:i.to,class:G(["flex min-h-10 items-center gap-3 rounded-lg px-3 text-sm font-medium transition-colors",O(t).path===i.to?"bg-indigo-50 text-indigo-700 dark:bg-indigo-500/10 dark:text-indigo-300":"text-slate-500 hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white"]),onClick:l[0]||(l[0]=c=>o.$emit("navigate"))},{default:Ae(()=>[(y(),E("svg",Dd,[a("path",{d:i.icon,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.7"},null,8,Bd)])),a("span",null,V(i.label),1)]),_:2},1032,["to","class"]))),128))]),a("div",Fd,[a("div",Ud,[a("span",{class:G(["h-1.5 w-1.5 rounded-full",O(s).version?"bg-green-500":"bg-amber-400"])},null,2),a("span",null,V(O(s).version?"本地服务正常":"正在连接服务…"),1),a("span",Hd,"v"+V(O(s).version||"2.0"),1)])])])}}},Wd={key:0,class:"flex shrink-0 items-center justify-between gap-3 border-b border-slate-200 bg-slate-50/60 px-6 py-4 dark:border-slate-700 dark:bg-slate-800/50"},Kd={class:"custom-scrollbar min-h-0 flex-1 overflow-y-auto"},Gd={key:1,class:"flex shrink-0 items-center justify-end gap-3 border-t border-slate-200 bg-slate-50/60 px-6 py-4 dark:border-slate-700 dark:bg-slate-800/50"},gl={__name:"AppModal",props:{show:{type:Boolean,default:!1},maskClosable:{type:Boolean,default:!0},escClosable:{type:Boolean,default:!0},panelClass:{type:String,default:"w-full max-w-2xl"}},emits:["close"],setup(e,{emit:t}){const s=e,n=t,o=r=>{s.escClosable&&r.key==="Escape"&&n("close")};Be(()=>s.show,r=>{r?window.addEventListener("keydown",o):window.removeEventListener("keydown",o)}),As(()=>window.removeEventListener("keydown",o));const l=()=>{s.maskClosable&&n("close")};return(r,i)=>(y(),Ie(Xo,{to:"body"},[ue(Ro,{name:"modal"},{default:Ae(()=>[e.show?(y(),E("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-slate-900/40 p-4 backdrop-blur-sm",onClick:ls(l,["self"])},[a("div",{class:G(["modal-panel flex max-h-[90vh] flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-2xl dark:border-slate-700 dark:bg-slate-900",e.panelClass])},[r.$slots.header?(y(),E("div",Wd,[lo(r.$slots,"header")])):fe("",!0),a("div",Kd,[lo(r.$slots,"body")]),r.$slots.footer?(y(),E("div",Gd,[lo(r.$slots,"footer")])):fe("",!0)],2)])):fe("",!0)]),_:3})]))}},qd={class:"w-auto min-w-[260px] max-w-[320px] rounded-lg border border-slate-200 bg-white p-4 text-left text-sm text-slate-600 shadow-2xl dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200"},zd={class:"relative z-10 mb-2 flex items-center justify-between border-b border-slate-200 pb-2 dark:border-slate-600"},Zd={class:"badge-green border border-green-200 dark:border-green-800"},Jd={key:0,class:"relative z-10 mb-3"},Yd={class:"flex flex-wrap gap-1"},Qd={key:1,class:"relative z-10"},Xd={class:"whitespace-normal break-all rounded border border-slate-200 bg-slate-50 p-1.5 font-mono text-xs leading-relaxed text-slate-600 dark:border-slate-700/50 dark:bg-slate-900/50 dark:text-slate-200"},ep={__name:"AppTooltip",setup(e,{expose:t}){const s=oe({show:!1,x:0,y:0,info:null});let n=null;const o=(c,f)=>{if(!f.nat_info)return;n&&(clearTimeout(n),n=null);const u=c.currentTarget.getBoundingClientRect();s.value={show:!0,x:u.left+u.width/2,y:u.bottom+10,info:f.nat_info}},l=()=>{n=setTimeout(()=>{s.value.show=!1},100)},r=()=>{n&&(clearTimeout(n),n=null)},i=()=>{s.value.show=!1};return t({showPeerTooltip:o,hidePeerTooltip:l}),(c,f)=>(y(),Ie(Xo,{to:"body"},[s.value.show?(y(),E("div",{key:0,style:Ln({top:s.value.y+"px",left:s.value.x+"px"}),class:"fixed z-[9999] mt-1 -translate-x-1/2 transform",onMouseenter:r,onMouseleave:i},[a("div",qd,[f[3]||(f[3]=a("div",{class:"absolute -top-2 left-1/2 h-4 w-4 -translate-x-1/2 rotate-45 transform border-l border-t border-slate-200 bg-white dark:border-slate-600 dark:bg-slate-800"},null,-1)),a("div",zd,[f[0]||(f[0]=a("span",{class:"text-xs font-bold uppercase text-slate-400"},"NAT Type",-1)),a("span",Zd,V(s.value.info.nat_type),1)]),s.value.info.public_ips&&s.value.info.public_ips.length>0?(y(),E("div",Jd,[f[1]||(f[1]=a("span",{class:"mb-1 block text-xs text-slate-400"},"Public IPv4:",-1)),a("div",Yd,[(y(!0),E(ie,null,Ee(s.value.info.public_ips,u=>(y(),E("span",{key:u,class:"rounded border border-slate-200 bg-slate-100 px-1.5 py-0.5 font-mono text-xs tabular-nums text-slate-600 dark:border-slate-600 dark:bg-slate-700 dark:text-slate-200"},V(u),1))),128))])])):fe("",!0),s.value.info.ipv6?(y(),E("div",Qd,[f[2]||(f[2]=a("span",{class:"mb-1 block text-xs text-slate-400"},"IPv6:",-1)),a("div",Xd,V(s.value.info.ipv6),1)])):fe("",!0)])],36)):fe("",!0)]))}},tp={class:"text-lg font-bold text-slate-900 flex items-center gap-2 dark:text-white"},sp={key:0,class:"w-5 h-5 text-red-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},np={class:"px-6 py-5 text-sm text-slate-600 break-all dark:text-slate-300"},op={__name:"ConfirmHost",setup(e){const t=as();return(s,n)=>(y(),Ie(gl,{show:O(t).confirmState.show,"panel-class":"w-full max-w-sm",onClose:O(t).confirmCancel},{header:Ae(()=>[a("h3",tp,[O(t).confirmState.danger?(y(),E("svg",sp,[...n[2]||(n[2]=[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"},null,-1)])])):fe("",!0),ae(" "+V(O(t).confirmState.title),1)])]),body:Ae(()=>[a("p",np,V(O(t).confirmState.message),1)]),footer:Ae(()=>[a("button",{class:"btn-ghost",onClick:n[0]||(n[0]=(...o)=>O(t).confirmCancel&&O(t).confirmCancel(...o))},"取消"),a("button",{class:G(O(t).confirmState.danger?"btn-danger":"btn-primary"),onClick:n[1]||(n[1]=(...o)=>O(t).confirmOk&&O(t).confirmOk(...o))},V(O(t).confirmState.confirmText),3)]),_:1},8,["show","onClose"]))}},lp={class:"pointer-events-none fixed right-4 top-4 z-[100] flex flex-col items-end gap-2"},rp={class:"flex items-center gap-2 px-4 py-2.5"},ip=["d"],ap={class:"break-all text-sm text-slate-700 dark:text-slate-200"},cp={__name:"ToastHost",setup(e){const t=as(),s=l=>l==="success"?"bg-green-500":l==="error"?"bg-red-500":"bg-indigo-500",n=l=>l==="success"?"text-green-500":l==="error"?"text-red-500":"text-indigo-500",o=l=>l==="success"?"M5 13l4 4L19 7":l==="error"?"M6 18L18 6M6 6l12 12":"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z";return(l,r)=>(y(),Ie(Xo,{to:"body"},[a("div",lp,[ue(al,{name:"toast"},{default:Ae(()=>[(y(!0),E(ie,null,Ee(O(t).toasts,i=>(y(),E("div",{key:i.id,class:"pointer-events-auto flex max-w-sm items-stretch overflow-hidden rounded-lg border border-slate-200 bg-white shadow-lg dark:border-slate-700 dark:bg-slate-800"},[a("span",{class:G(["w-1 shrink-0",s(i.type)])},null,2),a("div",rp,[(y(),E("svg",{class:G(["h-4 w-4 shrink-0",n(i.type)]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:o(i.type)},null,8,ip)],2)),a("span",ap,V(i.message),1)])]))),128))]),_:1})])]))}},up={class:"grid h-[100dvh] place-items-center overflow-y-auto bg-slate-50 p-4 text-slate-700 dark:bg-slate-950 dark:text-slate-200"},fp={class:"mb-7 flex items-center gap-3"},dp=["src"],pp=["disabled"],hp={__name:"AccessGate",setup(e){const t=oe(""),s=()=>{t.value.trim()&&(md(t.value),window.location.reload())};return(n,o)=>(y(),E("main",up,[a("form",{class:"w-full max-w-md rounded-2xl border border-slate-200 bg-white p-6 shadow-sm sm:p-8 dark:border-slate-800 dark:bg-slate-900",onSubmit:ls(s,["prevent"])},[a("div",fp,[a("img",{src:O(ml),alt:"",class:"h-10 w-10 shrink-0"},null,8,dp),o[1]||(o[1]=a("div",null,[a("h1",{class:"text-lg font-bold text-slate-900 dark:text-white"},"访问 VNT 控制台"),a("p",{class:"mt-0.5 text-xs text-slate-400"},"请输入桌面端 Web 访问设置中的令牌")],-1))]),o[2]||(o[2]=a("label",{class:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-200",for:"access-token"},"访问令牌",-1)),me(a("input",{id:"access-token","onUpdate:modelValue":o[0]||(o[0]=l=>t.value=l),class:"input font-mono",type:"password",autocomplete:"current-password",autofocus:"",placeholder:"粘贴访问令牌"},null,512),[[Oe,t.value]]),a("button",{class:"btn-primary mt-5 w-full",type:"submit",disabled:!t.value.trim()},"进入控制台",8,pp),o[3]||(o[3]=a("p",{class:"mt-5 text-center text-xs leading-5 text-slate-400"},"令牌只保存在当前浏览器中,可随时在桌面端重新生成。",-1))],32)]))}},mp={key:1,class:"flex h-[100dvh] min-h-0 overflow-hidden bg-slate-50 text-slate-700 dark:bg-slate-950 dark:text-slate-200"},gp={class:"hidden w-60 shrink-0 border-r border-slate-200 dark:border-slate-800 lg:block"},vp={key:0,class:"fixed inset-0 z-40 lg:hidden"},bp={class:"drawer-panel relative h-full w-[min(82vw,288px)] border-r border-slate-200 shadow-2xl dark:border-slate-700"},_p={class:"flex min-w-0 flex-1 flex-col"},xp={class:"flex h-16 shrink-0 items-center gap-3 border-b border-slate-200 bg-white/90 px-4 backdrop-blur lg:px-6 dark:border-slate-800 dark:bg-slate-900/90"},yp={class:"min-w-0"},kp={class:"truncate text-lg font-bold text-slate-900 dark:text-white"},wp={class:"ml-auto flex items-center gap-2"},Cp={class:"flex h-8 items-center gap-2 rounded-lg border border-slate-200 bg-white px-2.5 text-xs font-medium text-slate-500 sm:px-3 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300"},Sp={class:"hidden sm:inline"},Ep=["title","aria-label"],Tp={key:0,class:"h-4 w-4 fill-none stroke-current",viewBox:"0 0 24 24"},Ap={key:1,class:"h-4 w-4 fill-none stroke-current",viewBox:"0 0 24 24"},$p={class:"custom-scrollbar min-h-0 flex-1 overflow-x-hidden overflow-y-auto"},Ip={class:"mx-auto w-full max-w-7xl px-4 py-5 sm:px-5 lg:px-7 lg:py-6"},Rp={class:"flex min-w-0 items-center gap-3"},Pp={class:"truncate text-base font-bold text-slate-900 sm:text-lg dark:text-white"},Op={class:"max-w-[40%] truncate font-mono text-xs text-indigo-600 dark:text-indigo-400"},Mp={class:"break-all"},Lp={key:0,class:"animate-pulse text-indigo-600 dark:text-indigo-400"},Np={__name:"App",setup(e){const t=Mt(),s=va(),n=pa(),o=hd(),l=oe(null);Us("peerTooltip",l);const r=oe(!1),i=ba(),c=_e(()=>i.find(C=>C.to===n.path)||i[0]),f=localStorage.getItem("vnt-theme"),u=oe(f?f==="dark":window.matchMedia("(prefers-color-scheme: dark)").matches),d=()=>document.documentElement.classList.toggle("dark",u.value),g=()=>{u.value=!u.value,localStorage.setItem("vnt-theme",u.value?"dark":"light"),d()};d(),Be(()=>n.path,()=>{r.value=!1});const h=C=>{if(!(C.ctrlKey||C.metaKey)||C.altKey)return;const x=Number(C.key)-1;x>=0&&xwindow.addEventListener("keydown",h)),tl(()=>window.removeEventListener("keydown",h)),(C,x)=>{const L=Un("router-view");return!O(Jn)&&!O(pl)?(y(),Ie(hp,{key:0})):(y(),E("div",mp,[a("aside",gp,[ue(Cr)]),ue(Ro,{name:"drawer"},{default:Ae(()=>[r.value?(y(),E("div",vp,[a("button",{class:"absolute inset-0 bg-slate-950/45 backdrop-blur-[2px]","aria-label":"关闭导航",onClick:x[0]||(x[0]=w=>r.value=!1)}),a("aside",bp,[ue(Cr,{onNavigate:x[1]||(x[1]=w=>r.value=!1)})])])):fe("",!0)]),_:1}),a("div",_p,[a("header",xp,[a("button",{class:"grid h-9 w-9 shrink-0 place-items-center rounded-lg text-slate-500 hover:bg-slate-100 hover:text-slate-900 lg:hidden dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white","aria-label":"打开导航",onClick:x[2]||(x[2]=w=>r.value=!0)},[...x[5]||(x[5]=[a("svg",{class:"h-5 w-5 fill-none stroke-current",viewBox:"0 0 24 24"},[a("path",{d:"M4 7h16M4 12h16M4 17h16","stroke-linecap":"round","stroke-width":"2"})],-1)])]),a("div",yp,[a("h1",kp,V(c.value.label),1),x[6]||(x[6]=a("p",{class:"hidden text-xs text-slate-400 sm:block"},"VNT 虚拟局域网管理",-1))]),a("div",wp,[a("div",Cp,[a("span",{class:G(["h-1.5 w-1.5 rounded-full",O(t).runningCount>0?"bg-green-500":O(t).startingCount>0?"animate-pulse bg-amber-400":"bg-slate-300 dark:bg-slate-600"])},null,2),a("span",Sp,V(O(t).headerStatusText),1)]),a("button",{class:"grid h-8 w-8 place-items-center rounded-lg border border-slate-200 bg-white text-slate-500 hover:border-indigo-300 hover:text-indigo-600 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-400 dark:hover:border-indigo-500 dark:hover:text-indigo-400",title:u.value?"切换浅色模式":"切换深色模式","aria-label":u.value?"切换浅色模式":"切换深色模式",onClick:g},[u.value?(y(),E("svg",Tp,[...x[7]||(x[7]=[a("circle",{cx:"12",cy:"12",r:"4"},null,-1),a("path",{d:"M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4","stroke-linecap":"round","stroke-width":"1.7"},null,-1)])])):(y(),E("svg",Ap,[...x[8]||(x[8]=[a("path",{d:"M20.5 15.2A8.5 8.5 0 0 1 8.8 3.5 8.5 8.5 0 1 0 20.5 15.2Z","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.7"},null,-1)])]))],8,Ep)])]),a("main",$p,[a("div",Ip,[ue(L,null,{default:Ae(({Component:w})=>[ue(Ro,{name:"fade",mode:"out-in"},{default:Ae(()=>[(y(),Ie(Rc(w)))]),_:2},1024)]),_:1})])])]),ue(gl,{show:O(s).showStartLog,"mask-closable":O(s).startStatus!=="starting","esc-closable":O(s).startStatus!=="starting","panel-class":"w-full max-w-2xl",onClose:O(s).close},{header:Ae(()=>[a("div",Rp,[a("span",{class:G(["h-2 w-2 shrink-0 rounded-full",O(s).startStatus==="starting"?"animate-pulse bg-amber-400":O(s).startStatus==="running"?"bg-green-500":"bg-red-500"])},null,2),a("h3",Pp,V(O(s).startStatus==="starting"?"正在建立虚拟网络":O(s).startStatus==="running"?"网络已连接":"连接未完成"),1)]),a("span",Op,V(O(s).logConfigName),1)]),body:Ae(()=>[a("div",{ref:w=>O(s).logContainer=w,class:"custom-scrollbar h-64 space-y-2 overflow-y-auto border-y border-slate-200 bg-slate-50 p-4 font-mono text-xs text-slate-600 sm:h-80 sm:p-6 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-300"},[(y(!0),E(ie,null,Ee(O(s).startLogs,(w,p)=>(y(),E("div",{key:p,class:"flex gap-3"},[x[9]||(x[9]=a("span",{class:"text-indigo-600 dark:text-indigo-400"},"›",-1)),a("span",Mp,V(w),1)]))),128)),O(s).startStatus==="starting"?(y(),E("div",Lp,"等待下一阶段…")):fe("",!0)],512)]),footer:Ae(()=>[O(s).startStatus==="starting"?(y(),E("button",{key:0,class:"btn-ghost",onClick:x[3]||(x[3]=(...w)=>O(s).cancelStart&&O(s).cancelStart(...w))},"取消连接")):(y(),E("button",{key:1,class:"btn-primary",onClick:x[4]||(x[4]=(...w)=>O(s).close&&O(s).close(...w))},"完成"))]),_:1},8,["show","mask-closable","esc-closable","onClose"]),ue(cp),ue(op),ue(ep,{ref_key:"tooltipRef",ref:l},null,512)]))}}},Vp={class:"card"},jp={key:0,class:"flex flex-wrap items-center justify-between gap-3"},Dp={key:1,class:"text-sm muted"},Bp={key:2,class:"flex flex-col gap-3 sm:flex-row sm:items-end"},Fp={class:"flex-1"},Up=["value"],Hp=["disabled"],Wp={key:0,class:"animate-spin"},_a={__name:"StartPanel",setup(e){const t=Mt(),s=as(),n=oe(""),o=_e(()=>t.configList.filter(r=>!t.instanceList.some(i=>i.file_name===r.file_name)));Be(o,r=>{r.some(i=>i.file_name===n.value)||(n.value=r.length?r[0].file_name:"")},{immediate:!0});const l=()=>{if(!n.value){s.toast.error("请先选择一个配置");return}t.startVnt(n.value)};return(r,i)=>{const c=Un("router-link");return y(),E("div",Vp,[i[6]||(i[6]=a("h2",{class:"mb-4 text-base font-bold text-slate-900 dark:text-white"},"启动组网",-1)),O(t).configList.length===0?(y(),E("div",jp,[i[2]||(i[2]=a("p",{class:"text-sm muted"},"还没有任何配置,先创建一个组网配置吧。",-1)),ue(c,{to:"/config",class:"btn-primary btn-sm"},{default:Ae(()=>[...i[1]||(i[1]=[ae("去新建配置",-1)])]),_:1})])):o.value.length===0?(y(),E("div",Dp," 所有配置均已启动。 ")):(y(),E("div",Bp,[a("div",Fp,[i[4]||(i[4]=a("label",{class:"mb-1.5 block text-xs font-medium muted"},"选择配置",-1)),me(a("select",{"onUpdate:modelValue":i[0]||(i[0]=f=>n.value=f),class:"input"},[i[3]||(i[3]=a("option",{value:"",disabled:""},"请选择配置...",-1)),(y(!0),E(ie,null,Ee(o.value,f=>(y(),E("option",{key:f.file_name,value:f.file_name},V(f.config_name||f.file_name),9,Up))),128))],512),[[cl,n.value]])]),a("button",{class:"btn-primary px-8",disabled:!n.value||!!O(t).loadingMap[n.value],onClick:l},[O(t).loadingMap[n.value]?(y(),E("span",Wp,"⟳")):fe("",!0),i[5]||(i[5]=ae(" 启动 ",-1))],8,Hp)]))])}}},Kp={class:"flex items-center justify-between gap-2"},Gp=["title"],qp={class:"flex shrink-0 items-center gap-1.5"},zp={key:0,class:"badge-yellow",title:"配置文件在启动后被修改,重启实例后生效"},Zp={class:"mt-2 text-sm"},Jp={class:"ml-1 font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},Yp={class:"mt-3 flex gap-4 text-xs muted"},Qp={class:"font-bold tabular-nums text-blue-600 dark:text-blue-400"},Xp={class:"font-bold tabular-nums text-green-600 dark:text-green-400"},e0={class:"font-bold tabular-nums text-slate-400"},t0={class:"mt-4 flex flex-wrap justify-end gap-2"},s0={key:0,class:"flex items-center gap-1.5 text-xs muted"},n0=["disabled"],o0={key:0,class:"animate-spin"},l0=["disabled"],r0={key:0,class:"animate-spin"},i0=["disabled"],a0={key:0,class:"animate-spin"},xa={__name:"InstanceCard",props:{inst:{type:Object,required:!0},selectable:{type:Boolean,default:!1}},setup(e){const t=e,s=Mt(),n=as(),o=_e(()=>s.infoOf(t.inst.file_name)),l=_e(()=>!!s.loadingMap[t.inst.file_name]),r=_e(()=>!!s.stoppingMap[t.inst.file_name]),i=_e(()=>t.inst.config_name||t.inst.file_name),c=C=>r.value?"badge-yellow":C==="running"?"badge-green":C==="starting"?"badge-blue":"badge-gray",f=C=>r.value?"停止中":C==="running"?"运行中":C==="starting"?"启动中":"已停止",u=()=>{t.selectable&&(s.selectedInstance=t.inst.file_name)},d=async()=>{await n.confirm({title:"停止组网",message:`确定要停止 ${i.value} 吗?`,danger:!0,confirmText:"停止"})&&s.stopVnt(t.inst.file_name)},g=async()=>{await n.confirm({title:"重启组网",message:`确定要重启 ${i.value} 吗?`})&&s.restartVnt(t.inst.file_name)},h=async()=>{await n.confirm({title:"移除实例",message:`确定要移除已停止的实例 ${i.value} 吗?`,danger:!0,confirmText:"移除"})&&s.dismissInstance(t.inst.file_name)};return(C,x)=>(y(),E("div",{class:G(["card",[e.selectable?"cursor-pointer":"",e.selectable&&O(s).selectedInstance===e.inst.file_name?"ring-2 ring-indigo-500 dark:ring-indigo-400":""]]),onClick:u},[a("div",Kp,[a("h3",{class:"truncate text-base font-bold text-slate-900 dark:text-white",title:e.inst.file_name},V(i.value),9,Gp),a("div",qp,[o.value.config_changed?(y(),E("span",zp," 配置发生变化 ")):fe("",!0),a("span",{class:G([c(e.inst.status),r.value?"animate-pulse":""])},V(f(e.inst.status)),3)])]),a("div",Zp,[x[0]||(x[0]=a("span",{class:"muted"},"虚拟 IP:",-1)),a("span",Jp,V(o.value.ip||"-"),1)]),a("div",Yp,[a("span",null,[x[1]||(x[1]=ae(" 在线 ",-1)),a("span",Qp,V(o.value.online_client_num||0),1)]),a("span",null,[x[2]||(x[2]=ae(" 直连 ",-1)),a("span",Xp,V(o.value.direct_client_num||0),1)]),a("span",null,[x[3]||(x[3]=ae(" 离线 ",-1)),a("span",e0,V(o.value.offline_client_num||0),1)])]),a("div",t0,[r.value?(y(),E("span",s0,[...x[4]||(x[4]=[a("span",{class:"inline-block animate-spin"},"⟳",-1),ae(" 正在停止,请稍候... ",-1)])])):(y(),E(ie,{key:1},[e.inst.status==="running"||e.inst.status==="stopped"?(y(),E("button",{key:0,class:"btn-primary btn-sm",disabled:l.value,onClick:ls(g,["stop"])},[l.value?(y(),E("span",o0,"⟳")):fe("",!0),ae(" "+V(e.inst.status==="stopped"?"重新启动":"重启"),1)],8,n0)):fe("",!0),e.inst.status!=="stopped"?(y(),E("button",{key:1,class:"btn-danger btn-sm",disabled:l.value,onClick:ls(d,["stop"])},[l.value?(y(),E("span",r0,"⟳")):fe("",!0),x[5]||(x[5]=ae(" 停止 ",-1))],8,l0)):fe("",!0),e.inst.status==="stopped"?(y(),E("button",{key:2,class:"btn-ghost btn-sm",disabled:l.value,onClick:ls(h,["stop"])},[l.value?(y(),E("span",a0,"⟳")):fe("",!0),x[6]||(x[6]=ae(" 移除 ",-1))],8,i0)):fe("",!0)],64))])],2))}},c0={class:"card p-12 text-center text-slate-500 dark:text-slate-400"},an={__name:"EmptyState",props:{text:{type:String,default:"暂无数据"}},setup(e){return(t,s)=>(y(),E("div",c0,[s[0]||(s[0]=a("svg",{class:"w-12 h-12 mx-auto mb-3 text-slate-300 dark:text-slate-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"})],-1)),a("p",null,V(e.text),1)]))}},u0={class:"space-y-6"},f0={class:"flex flex-wrap items-end justify-between gap-4"},d0={class:"page-subtitle"},p0={class:"grid grid-cols-2 gap-4 lg:grid-cols-4"},h0={class:"card"},m0={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},g0={class:"ml-1 text-sm font-normal muted"},v0={class:"card"},b0={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},_0={class:"card"},x0={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},y0={class:"card"},k0={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},w0={class:"text-sm font-normal muted"},C0={key:1,class:"muted"},S0={class:"mb-3 flex items-center justify-between"},E0={__name:"DashboardView",setup(e){const t=Mt(),s=_e(()=>Object.values(t.instances).reduce((l,r)=>l+(r?.online_client_num||0),0)),n=_e(()=>{const l=t.instanceList.filter(i=>i.status==="running");return{connected:l.filter(i=>t.instances[i.file_name]?.server_info?.some(f=>f.connected)).length,total:l.length}}),o=_e(()=>t.runningCount>0?`运行中 ${t.runningCount} 个实例`:t.startingCount>0?"有实例正在启动...":"全部实例已停止");return(l,r)=>{const i=Un("router-link");return y(),E("div",u0,[a("div",f0,[a("div",null,[r[0]||(r[0]=a("h1",{class:"page-title"},"总览",-1)),a("p",d0,V(o.value),1)]),ue(i,{to:"/config",class:"btn-ghost btn-sm"},{default:Ae(()=>[...r[1]||(r[1]=[ae("管理配置",-1)])]),_:1})]),a("div",p0,[a("div",h0,[r[2]||(r[2]=a("div",{class:"text-xs font-medium muted"},"运行实例",-1)),a("div",m0,[ae(V(O(t).runningCount),1),a("span",g0,"/ "+V(O(t).instanceList.length),1)])]),a("div",v0,[r[3]||(r[3]=a("div",{class:"text-xs font-medium muted"},"配置总数",-1)),a("div",b0,V(O(t).configList.length),1)]),a("div",_0,[r[4]||(r[4]=a("div",{class:"text-xs font-medium muted"},"在线设备",-1)),a("div",x0,V(s.value),1)]),a("div",y0,[r[5]||(r[5]=a("div",{class:"text-xs font-medium muted"},"服务器连接",-1)),a("div",k0,[n.value.total>0?(y(),E(ie,{key:0},[a("span",{class:G(n.value.connected>0?"text-green-600 dark:text-green-400":"text-red-500")},V(n.value.connected),3),a("span",w0,"/ "+V(n.value.total)+" 已连接",1)],64)):(y(),E("span",C0,"-"))])])]),ue(_a),a("div",null,[a("div",S0,[r[7]||(r[7]=a("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"实例概览",-1)),ue(i,{to:"/instances",class:"text-sm font-medium text-indigo-600 hover:text-indigo-500 dark:text-indigo-400"},{default:Ae(()=>[...r[6]||(r[6]=[ae("查看详情 →",-1)])]),_:1})]),O(t).instanceList.length===0?(y(),Ie(an,{key:0,text:O(t).configList.length===0?"暂无配置,请先新建配置":"暂无运行中的组网,请在上方选择配置启动"},null,8,["text"])):(y(),Ie(al,{key:1,name:"card-list",tag:"div",class:"grid grid-cols-1 gap-4 md:grid-cols-2"},{default:Ae(()=>[(y(!0),E(ie,null,Ee(O(t).instanceList,c=>(y(),Ie(xa,{key:c.file_name,inst:c},null,8,["inst"]))),128))]),_:1}))])])}}},T0={class:"space-y-6"},A0={class:"card"},$0={class:"mb-4 text-lg font-bold text-slate-900 dark:text-white"},I0={class:"ml-2 text-sm font-medium text-indigo-600 dark:text-indigo-400"},R0={class:"grid grid-cols-1 gap-4 text-sm md:grid-cols-2"},P0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},O0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},M0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},L0={class:"font-mono text-slate-900 dark:text-white"},N0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},V0={class:"font-mono text-slate-900 dark:text-white"},j0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},D0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},B0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},F0={class:"font-mono text-indigo-600 dark:text-indigo-400"},U0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},H0=["title"],W0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},K0={class:"text-slate-900 dark:text-white"},G0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},q0=["title"],z0={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-4"},Z0={class:"text-sm text-slate-600 dark:text-slate-300"},J0={class:"mt-4"},Y0={class:"flex flex-wrap gap-2"},Q0={key:0,class:"text-xs text-slate-400"},X0={class:"card p-0 overflow-hidden"},eh={class:"custom-scrollbar max-h-[400px] overflow-x-auto"},th={class:"table"},sh={class:"font-mono"},nh={class:"tabular-nums"},oh={key:0},lh={__name:"InstancesView",setup(e){const t=Mt();return(s,n)=>(y(),E("div",T0,[n[13]||(n[13]=a("div",null,[a("h1",{class:"page-title"},"实例"),a("p",{class:"page-subtitle"},"管理组网实例,点击卡片查看详情")],-1)),ue(_a),O(t).instanceList.length===0?(y(),Ie(an,{key:0,text:"暂无运行中的组网,请在上方选择配置启动"})):(y(),Ie(al,{key:1,name:"card-list",tag:"div",class:"grid grid-cols-1 gap-4 md:grid-cols-2"},{default:Ae(()=>[(y(!0),E(ie,null,Ee(O(t).instanceList,o=>(y(),Ie(xa,{key:o.file_name,inst:o,selectable:""},null,8,["inst"]))),128))]),_:1})),O(t).selectedInstance&&O(t).selectedInfo?(y(),E(ie,{key:2},[a("div",A0,[a("h2",$0,[n[0]||(n[0]=ae(" 网络详情 ",-1)),a("span",I0,V(O(t).selectedConfigName),1)]),a("div",R0,[a("div",P0,[n[1]||(n[1]=a("span",{class:"muted"},"虚拟 IP / 掩码",-1)),a("span",O0,V(O(t).selectedInfo.ip||"-")+" / "+V(O(t).selectedInfo.prefix_len||"-"),1)]),a("div",M0,[n[2]||(n[2]=a("span",{class:"muted"},"网关",-1)),a("span",L0,V(O(t).selectedInfo.gateway||"-"),1)]),a("div",N0,[n[3]||(n[3]=a("span",{class:"muted"},"网络编号",-1)),a("span",V0,V(O(t).selectedInfo.network_code||"-"),1)]),a("div",j0,[n[4]||(n[4]=a("span",{class:"muted"},"MTU",-1)),a("span",D0,V(O(t).selectedInfo.mtu||""),1)]),a("div",B0,[n[5]||(n[5]=a("span",{class:"muted"},"NAT 类型",-1)),a("span",F0,V(O(t).selectedInfo.nat_type||"Unknown"),1)]),a("div",U0,[n[6]||(n[6]=a("span",{class:"muted"},"Public IPv6",-1)),a("span",{class:"max-w-[200px] truncate font-mono text-slate-900 dark:text-white",title:O(t).selectedInfo.public_ipv6},V(O(t).selectedInfo.public_ipv6||"-"),9,H0)]),a("div",W0,[n[7]||(n[7]=a("span",{class:"muted"},"设备名称",-1)),a("span",K0,V(O(t).selectedInfo.name||"-"),1)]),a("div",G0,[n[8]||(n[8]=a("span",{class:"muted"},"设备 ID",-1)),a("span",{class:"max-w-[200px] truncate font-mono text-xs text-slate-500 dark:text-slate-400",title:O(t).selectedInfo.device_id},V(O(t).selectedInfo.device_id||"-"),9,q0)])]),a("div",z0,[(y(),E(ie,null,Ee([{key:"encrypt",label:"加密"},{key:"compress",label:"压缩"},{key:"fec",label:"FEC纠错"},{key:"rtx",label:"QUIC传输"}],o=>a("div",{key:o.key,class:"flex items-center gap-2 rounded-lg bg-slate-50 px-3 py-2 dark:bg-slate-800/50"},[a("span",{class:G(["h-2 w-2 rounded-full",O(t).selectedInfo[o.key]?"bg-green-500":"bg-slate-300 dark:bg-slate-600"])},null,2),a("span",Z0,V(o.label),1)])),64))]),a("div",J0,[n[9]||(n[9]=a("span",{class:"mb-2 block text-sm muted"},"Public IPv4s",-1)),a("div",Y0,[(y(!0),E(ie,null,Ee(O(t).selectedInfo.public_ipv4s,o=>(y(),E("span",{key:o,class:"rounded border border-slate-200 bg-slate-50 px-2 py-1 font-mono text-xs tabular-nums text-green-700 dark:border-slate-600 dark:bg-slate-800 dark:text-green-300"},V(o),1))),128)),!O(t).selectedInfo.public_ipv4s||O(t).selectedInfo.public_ipv4s.length===0?(y(),E("span",Q0,"无")):fe("",!0)])])]),a("div",X0,[n[12]||(n[12]=a("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[a("h2",{class:"text-lg font-bold text-slate-900 dark:text-white"},"服务器连接列表")],-1)),a("div",eh,[a("table",th,[n[11]||(n[11]=a("thead",null,[a("tr",null,[a("th",null,"地址"),a("th",null,"状态"),a("th",null,"延迟"),a("th",null,"版本")])],-1)),a("tbody",null,[(y(!0),E(ie,null,Ee(O(t).selectedInfo.server_info,(o,l)=>(y(),E("tr",{key:l},[a("td",sh,V(o.server),1),a("td",null,[a("span",{class:G(o.connected?"badge-green":"badge-red")},V(o.connected?"已连接":"未连接"),3)]),a("td",nh,V(o.server_rtt?o.server_rtt+" ms":"-"),1),a("td",null,V(o.server_version||"-"),1)]))),128)),!O(t).selectedInfo.server_info||O(t).selectedInfo.server_info.length===0?(y(),E("tr",oh,[...n[10]||(n[10]=[a("td",{colspan:"4",class:"text-center text-slate-400"},"暂无数据",-1)])])):fe("",!0)])])])])],64)):fe("",!0)]))}},Bo=()=>({config_name:"",network_code:"",server:[""],ip:"",mtu:null,rtx:!1,fec:!1,compress:!1,no_punch:!1,input:[],output:[],no_nat:!1,no_tun:!1,port_mapping:[],allow_mapping:!1,device_name:"",device_id:"",tun_name:"",password:"",cert_mode:"skip",fingerprint:"",udp_stun:[],tcp_stun:[],tunnel_port:null}),Sr=e=>{const t=Bo(),s=e.split(` +`);for(const n of s){const o=n.trim();if(!(!o||o.startsWith("#"))){if(o.includes("config_name")){const l=o.match(/config_name\s*=\s*"([^"]*)"/);l&&(t.config_name=l[1])}else if(o.includes("network_code")){const l=o.match(/network_code\s*=\s*"([^"]*)"/);l&&(t.network_code=l[1])}else if(o.startsWith("server")){const l=o.match(/server\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.server=r.map(i=>i.replace(/"/g,"")))}}else if(o.includes("ip =")){const l=o.match(/ip\s*=\s*"([^"]*)"/);l&&(t.ip=l[1])}else if(o.includes("mtu =")){const l=o.match(/mtu\s*=\s*(\d+)/);l&&(t.mtu=parseInt(l[1]))}else if(o.match(/^rtx\s*=/))t.rtx=o.includes("true");else if(o.match(/^fec\s*=/))t.fec=o.includes("true");else if(o.match(/^compress\s*=/))t.compress=o.includes("true");else if(o.match(/^no_punch\s*=/))t.no_punch=o.includes("true");else if(o.startsWith("input")){const l=o.match(/input\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.input=r.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("output")){const l=o.match(/output\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.output=r.map(i=>i.replace(/"/g,"")))}}else if(o.match(/^no_nat\s*=/))t.no_nat=o.includes("true");else if(o.match(/^no_tun\s*=/))t.no_tun=o.includes("true");else if(o.startsWith("port_mapping")){const l=o.match(/port_mapping\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.port_mapping=r.map(i=>i.replace(/"/g,"")))}}else if(o.match(/^allow_mapping\s*=/))t.allow_mapping=o.includes("true");else if(o.includes("device_name")){const l=o.match(/device_name\s*=\s*"([^"]*)"/);l&&(t.device_name=l[1])}else if(o.includes("device_id")){const l=o.match(/device_id\s*=\s*"([^"]*)"/);l&&(t.device_id=l[1])}else if(o.includes("tun_name")){const l=o.match(/tun_name\s*=\s*"([^"]*)"/);l&&(t.tun_name=l[1])}else if(o.includes("password =")){const l=o.match(/password\s*=\s*"([^"]*)"/);l&&(t.password=l[1])}else if(o.includes("cert_mode")){const l=o.match(/cert_mode\s*=\s*"([^"]*)"/);if(l){const r=l[1];r.startsWith("finger:")?(t.cert_mode="finger",t.fingerprint=r.substring(7)):t.cert_mode=r}}else if(o.startsWith("udp_stun")){const l=o.match(/udp_stun\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.udp_stun=r.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("tcp_stun")){const l=o.match(/tcp_stun\s*=\s*\[(.*)\]/);if(l){const r=l[1].match(/"([^"]*)"/g);r&&(t.tcp_stun=r.map(i=>i.replace(/"/g,"")))}}}}return t},_o=e=>{let t="";e.config_name&&(t+=`# 配置名称 +config_name = "${e.config_name}" +`),t+=` +# --- 网络配置 --- +`,t+=`# 网络编号,相同网络编号的会组在同一个虚拟网 (必填) +`,t+=`network_code = "${e.network_code}" + +`;const s=e.server.filter(c=>c.trim());s.length>0&&(t+=`# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填) +`,t+=`# dynamic 协议使用dns txt解析记录值 +`,t+=`server = [${s.map(c=>`"${c}"`).join(", ")}] +`),e.ip&&(t+=` +# 自定义虚拟 IP (可选) +`,t+=`ip = "${e.ip}" +`),e.rtx&&(t+=` +# 是否启用quic优化传输 (默认 false) +`,t+=`# 开启后传输过程几乎不会丢包,但是延迟可能会有波动 +`,t+=`rtx = true +`),e.fec&&(t+=` +# 是否启用 FEC 前向纠错 (默认 false) +`,t+=`# 开启后可以减少丢包率,损失带宽但是延迟比较稳定,带宽充足时可以使用此功能 +`,t+=`fec = true +`),e.no_punch&&(t+=` +# 是否关闭 P2P 打洞 (默认 false) +`,t+=`no_punch = true +`),e.compress&&(t+=` +# 是否启用 LZ4 压缩 (默认 false) +`,t+=`compress = true +`);const n=e.input.filter(c=>c.trim());n.length>0&&(t+=` +# 入栈监听网段 (逗号分隔的 CIDR 和目标 IP),用于点对网,将指定网段的流量发送到目标节点 +`,t+=`# 例如192.168.0.0/24,10.26.0.2 表示将192.168.0.0/24网段的数据转发到10.26.0.2 +`,t+=`input = [${n.map(c=>`"${c}"`).join(", ")}] +`);const o=e.output.filter(c=>c.trim());o.length>0&&(t+=` +# 出栈允许网段,用于点对网,允许指定网段的转发 +`,t+=`output = [${o.map(c=>`"${c}"`).join(", ")}] +`),e.no_nat&&(t+=` +# 是否关闭内置子网NAT,关闭后需要配置网卡转发,否则无法使用点对网 +`,t+=`# 通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好 +`,t+=`no_nat = true +`),e.no_tun&&(t+=` +# 是否关闭TUN虚拟网卡,关闭后只能充当流量出口或者进行端口映射,关闭后无需管理员权限 +`,t+=`no_tun = true +`);const l=e.port_mapping.filter(c=>c.trim());l.length>0&&(t+=` +# 端口映射,格式为:协议://本地监听地址-目标虚拟IP-目标映射地址 +`,t+=`# 端口映射用于在本地监听指定端口,并将收到的网络流量经由指定虚拟节点转发到目标地址 +`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80 表示将本地tcp的81端口的数据转发到10.0.0.2:80 +`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-192.168.1.10:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到192.168.1.10:80 +`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-anyonehost:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到anyonehost:80 +`,t+=`port_mapping = [${l.map(c=>`"${c}"`).join(", ")}] +`),e.allow_mapping&&(t+=` +# 是否允许作为端口映射出口,开启后其他设备才可使用本设备的ip为"目标虚拟IP" +`,t+=`# 开启后虚拟网络其他设备可以使用此设备当跳板访问其他网络 +`,t+=`allow_mapping = true +`),e.mtu&&(t+=` +# MTU 设置 +`,t+=`mtu = ${e.mtu} +`),t+=` +# --- 设备配置 --- +`,e.device_name&&(t+=` +# 设备名称 (可选,默认读取本机 hostname) +`,t+=`device_name = "${e.device_name}" +`),e.device_id&&(t+=` +# 设备 ID (可选,不填自动生成,不同设备ID不能相同) +`,t+=`device_id = "${e.device_id}" +`),e.tun_name&&(t+=` +# 虚拟网卡名称 +`,t+=`tun_name = "${e.tun_name}" +`),t+=` +# --- 安全配置 --- +`,e.password&&(t+=` +# 组网加密密码 (可选) +`,t+=`password = "${e.password}" +`),e.cert_mode&&e.cert_mode!=="skip"&&(t+=` +# 证书校验方式: +`,t+=`# skip 跳过验证(默认) +`,t+=`# standard 使用系统证书验证 +`,t+=`# finger 使用证书指纹验证,服务端启动时日志会输出指纹 +`,e.cert_mode==="finger"&&e.fingerprint?t+=`cert_mode = "finger:${e.fingerprint}" +`:t+=`cert_mode = "${e.cert_mode}" +`);const r=e.udp_stun.filter(c=>c.trim());r.length>0&&(t+=` +# 自定义UDP STUN地址,不设置则用默认stun +`,t+=`udp_stun = [${r.map(c=>`"${c}"`).join(", ")}] +`);const i=e.tcp_stun.filter(c=>c.trim());return i.length>0&&(t+=` +# 自定义TCP STUN地址,不设置则用默认stun +`,t+=`tcp_stun = [${i.map(c=>`"${c}"`).join(", ")}] +`),t},rh=`# config_name = "配置名称" +# --- 网络配置 --- +# 网络编号,相同网络编号的会组在同一个虚拟网 (必填) +network_code = "your_network_code" + +# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填) +# dynamic 协议使用dns txt解析记录值 +server = ["quic://1.2.3.4:29872"] + +# ===简单使用以下参数可以不动=== + +# 自定义虚拟 IP (可选) +# ip = "10.10.0.2" + +# 是否启用quic优化传输 (默认 false,设置为true时开启) +# 开启后传输过程几乎不会丢包,但是延迟会有波动 +# rtx = false + +# 是否启用 FEC 前向纠错,损失一定带宽来提升网络稳定性(默认 false,设置为true时开启) +# 开启后可以减少丢包率,损失带宽但是延迟比较稳定,带宽充足时可以使用此功能 +# fec = false + +# 是否关闭 P2P 打洞 (默认 false,设置为true时关闭) +# no_punch = false + +# 是否启用 LZ4 压缩 (默认 false,设置为true时开启) +# compress = false + +# 入栈监听网段 (逗号分隔的 CIDR 和目标 IP),用于点对网,将指定网段的流量发送到目标节点 +# input = ["192.168.0.0/24,10.26.0.2", "192.168.1.0/24,10.26.0.3"] + +# 出栈允许网段,用于点对网,允许指定网段的转发 +# output = ["0.0.0.0/0"] + +# 是否关闭内置子网NAT,关闭(设为true)后需要配置网卡转发,否则无法使用点对网。通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好 +# no_nat = false + +# 是否关闭TUN虚拟网卡,关闭(设为true)后只能充当流量出口或者进行端口映射,关闭后无需管理员权限 +# no_tun = false + +# 端口映射,格式为:协议://本地监听地址-目标虚拟IP-目标映射地址 +# 端口映射用于在本地监听指定端口,并将收到的网络流量经由指定虚拟节点转发到目标地址,从而实现跨网络或内网服务访问 +# 例如 port_mapping = ["tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80"] +# tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80 则表示将本地tcp的81端口的数据转发到10.0.0.2:80 +# tcp://0.0.0.0:81-10.0.0.2-192.168.1.10:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到192.168.1.10:80 +# tcp://0.0.0.0:81-10.0.0.2-anyonehost:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到anyonehost:80 +# port_mapping = [] + +# 是否允许作为端口映射出口,开启(设置为true)后其他设备才可使用本设备的ip为"目标虚拟IP" +# 开启后虚拟网络其他设备可以使用此设备当跳板访问其他网络 +# allow_mapping = false + +# MTU 设置 +# mtu = 1400 + +# --- 设备配置 --- + +# 设备名称 (可选,默认读取本机 hostname) +# device_name = "my-device" + +# 设备 ID (可选,不填自动生成,不同设备ID不能相同) +# device_id = "device-id-xxxx" + +# 虚拟网卡名称 +# tun_name = "vnt-tun" + +# --- 安全配置 --- + +# 加密密码 (可选) +# password = "123456" + +# 证书校验方式: +# skip 跳过验证(默认) +# standard 使用系统证书验证 +# finger 使用证书指纹验证,服务端启动时日志会输出指纹, +# 例如 finger:3bdd8675606837cdf95d5e13445606315762315a78555f9da652940a25feaec1 +# cert_mode = "skip" + +# --- 其他配置 --- +# 自定义stun地址,分别用于udp打洞和tcp打洞,需要单独配置,不设置则用默认stun +# udp_stun = ["stun.chat.bilibili.com"] +# tcp_stun = ["stun.nextcloud.com:443"]`,ih={class:"text-lg font-bold text-slate-900 dark:text-white"},ah={class:"flex items-center gap-4"},ch={class:"flex rounded-lg border border-slate-300 bg-slate-100 p-1 dark:border-slate-600 dark:bg-slate-800"},uh={key:0,class:"text-sm text-slate-500 font-mono hidden md:block"},fh={class:"h-full overflow-y-auto scrollbar-hide p-6"},dh={class:"max-w-4xl mx-auto space-y-6"},ph={class:"card"},hh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},mh={class:"mt-4"},gh={class:"space-y-2"},vh=["onUpdate:modelValue"],bh=["onClick"],_h={class:"card"},xh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},yh={class:"card"},kh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},wh={class:"card"},Ch={class:"space-y-4"},Sh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Eh={key:0},Th={class:"card"},Ah={class:"space-y-4"},$h={class:"space-y-2"},Ih=["onUpdate:modelValue"],Rh=["onClick"],Ph={class:"space-y-2"},Oh=["onUpdate:modelValue"],Mh=["onClick"],Lh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Nh={class:"card"},Vh={class:"space-y-4"},jh={class:"space-y-2"},Dh=["onUpdate:modelValue"],Bh=["onClick"],Fh={class:"card"},Uh={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Hh={class:"card"},Wh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Kh={class:"space-y-2"},Gh=["onUpdate:modelValue"],qh=["onClick"],zh={class:"space-y-2"},Zh=["onUpdate:modelValue"],Jh=["onClick"],Yh={class:"h-full"},Qh={class:"flex-1 text-left text-xs text-slate-500"},Xh={key:0},em={key:1},Yt="h-5 w-5 rounded border-slate-300 bg-white text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700",Qt="flex cursor-pointer items-center justify-between gap-2 rounded-lg border border-slate-200 bg-slate-50 p-3 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800/50 dark:hover:bg-slate-800",ps="shrink-0 rounded-lg bg-red-50 px-3 py-2 text-red-500 transition-colors hover:bg-red-100 dark:bg-red-900/20 dark:text-red-500 dark:hover:bg-red-900/40",hs="flex w-full items-center justify-center gap-1 rounded-lg bg-slate-100 px-3 py-2 text-sm text-slate-600 transition-colors hover:bg-slate-200 dark:bg-slate-700/50 dark:text-slate-300 dark:hover:bg-slate-700",Vt="text-md mb-4 flex items-center font-bold text-slate-900 dark:text-white",tm={__name:"ConfigEditor",props:{show:{type:Boolean,default:!1},fileName:{type:String,default:null}},emits:["close","saved"],setup(e,{emit:t}){const s=e,n=t,o=as(),l=oe(""),r=oe(""),i=oe("new"),c=oe("form"),f=oe(""),u=oe(!1),d=oe(!1),g=oe(!1),h=oe(Bo());Be(()=>s.show,async w=>{if(w)if(r.value=s.fileName||"",i.value=s.fileName?"edit":"new",c.value="form",u.value=!1,d.value=!1,s.fileName)try{const p=await Td(s.fileName);l.value=p,f.value=p,g.value=!0,h.value=Sr(p),Rt(()=>{g.value=!1})}catch(p){o.toast.error("获取配置失败: "+p.message),n("close")}else f.value="",h.value=Bo(),l.value=rh});const C=()=>{c.value==="toml"?(c.value="form",g.value=!0,h.value=Sr(l.value),Rt(()=>{g.value=!1})):c.value="form"},x=()=>{c.value==="form"&&(d.value?(l.value=_o(h.value),d.value=!1):f.value&&!u.value?l.value=f.value:l.value=_o(h.value)),c.value="toml"};Be(l,(w,p)=>{c.value==="toml"&&p!==void 0&&(u.value=!0)}),Be(h,()=>{c.value==="form"&&s.show&&!g.value&&(d.value=!0)},{deep:!0});const L=async()=>{try{let w=l.value;if(c.value==="form"){if(!h.value.network_code.trim()){o.toast.error("请填写网络编号");return}if(h.value.server.filter(b=>b.trim()).length===0){o.toast.error("请至少填写一个服务器地址");return}w=_o(h.value)}await Ad(r.value||null,w),o.toast.success("配置已保存"),n("close"),n("saved")}catch(w){o.toast.error("保存失败: "+w.message)}};return(w,p)=>(y(),Ie(gl,{show:e.show,"mask-closable":!1,"panel-class":"w-full max-w-6xl h-[85vh]",onClose:p[26]||(p[26]=b=>n("close"))},{header:Ae(()=>[a("h3",ih,V(i.value==="new"?"新建配置":"编辑配置"),1),a("div",ah,[a("div",ch,[a("button",{onClick:C,class:G([c.value==="form"?"bg-white text-slate-900 shadow-sm dark:bg-indigo-600 dark:text-white":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white","px-4 py-1.5 rounded text-sm font-medium transition-colors flex items-center"])},[...p[27]||(p[27]=[a("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1),ae(" 表单模式 ",-1)])],2),a("button",{onClick:x,class:G([c.value==="toml"?"bg-white text-slate-900 shadow-sm dark:bg-indigo-600 dark:text-white":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white","px-4 py-1.5 rounded text-sm font-medium transition-colors flex items-center"])},[...p[28]||(p[28]=[a("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"})],-1),ae(" TOML模式 ",-1)])],2)]),r.value?(y(),E("div",uh,V(r.value),1)):fe("",!0)])]),body:Ae(()=>[me(a("div",fh,[a("div",dh,[a("div",ph,[a("h4",{class:G(Vt)},[...p[29]||(p[29]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),ae(" 基础配置 ",-1)])]),a("div",hh,[a("div",null,[p[30]||(p[30]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"配置名称",-1)),me(a("input",{"onUpdate:modelValue":p[0]||(p[0]=b=>h.value.config_name=b),type:"text",placeholder:"例如: 我的VPN配置",class:"input"},null,512),[[Oe,h.value.config_name]])]),a("div",null,[p[31]||(p[31]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ae(" 网络编号 "),a("span",{class:"text-red-500"},"*")],-1)),me(a("input",{"onUpdate:modelValue":p[1]||(p[1]=b=>h.value.network_code=b),type:"text",placeholder:"例如: my_network",required:"",class:"input"},null,512),[[Oe,h.value.network_code]])])]),a("div",mh,[p[34]||(p[34]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ae(" 服务器地址 "),a("span",{class:"text-red-500"},"*"),a("span",{class:"text-xs text-slate-500 ml-2"},"支持 quic:// tcp:// wss:// dynamic://")],-1)),a("div",gh,[(y(!0),E(ie,null,Ee(h.value.server,(b,k)=>(y(),E("div",{key:k,class:"flex gap-2"},[me(a("input",{"onUpdate:modelValue":S=>h.value.server[k]=S,type:"text",placeholder:"例如: quic://1.2.3.4:29872",class:"input flex-1"},null,8,vh),[[Oe,h.value.server[k]]]),h.value.server.length>1?(y(),E("button",{key:0,onClick:S=>h.value.server.splice(k,1),class:G(ps)},[...p[32]||(p[32]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,bh)):fe("",!0)]))),128)),a("button",{onClick:p[2]||(p[2]=b=>h.value.server.push("")),class:G(hs)},[...p[33]||(p[33]=[a("svg",{class:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),ae(" 添加服务器 ",-1)])])])])]),a("div",_h,[a("h4",{class:G(Vt)},[...p[35]||(p[35]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})],-1),ae(" 网络设置 ",-1)])]),a("div",xh,[a("div",null,[p[36]||(p[36]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ae(" 自定义虚拟IP "),a("span",{class:"text-xs text-slate-500 ml-1"},"(可选)")],-1)),me(a("input",{"onUpdate:modelValue":p[3]||(p[3]=b=>h.value.ip=b),type:"text",placeholder:"例如: 10.26.0.2",class:"input"},null,512),[[Oe,h.value.ip]])]),a("div",null,[p[37]||(p[37]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"MTU",-1)),me(a("input",{"onUpdate:modelValue":p[4]||(p[4]=b=>h.value.mtu=b),type:"number",placeholder:"1380",class:"input"},null,512),[[Oe,h.value.mtu,void 0,{number:!0}]])]),a("div",null,[p[38]||(p[38]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"隧道端口",-1)),me(a("input",{"onUpdate:modelValue":p[5]||(p[5]=b=>h.value.tunnel_port=b),type:"number",placeholder:"0 (自动分配)",class:"input"},null,512),[[Oe,h.value.tunnel_port,void 0,{number:!0}]])])])]),a("div",yh,[a("h4",{class:G(Vt)},[...p[39]||(p[39]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),ae(" 传输优化 ",-1)])]),a("div",kh,[a("label",{class:G(Qt)},[p[40]||(p[40]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"QUIC传输优化"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"重传丢包")],-1)),me(a("input",{"onUpdate:modelValue":p[6]||(p[6]=b=>h.value.rtx=b),type:"checkbox",class:G(Yt)},null,512),[[Jt,h.value.rtx]])]),a("label",{class:G(Qt)},[p[41]||(p[41]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"FEC前向纠错"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"损失部分带宽提升稳定性")],-1)),me(a("input",{"onUpdate:modelValue":p[7]||(p[7]=b=>h.value.fec=b),type:"checkbox",class:G(Yt)},null,512),[[Jt,h.value.fec]])]),a("label",{class:G(Qt)},[p[42]||(p[42]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"LZ4压缩"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"减少传输数据量")],-1)),me(a("input",{"onUpdate:modelValue":p[8]||(p[8]=b=>h.value.compress=b),type:"checkbox",class:G(Yt)},null,512),[[Jt,h.value.compress]])]),a("label",{class:G(Qt)},[p[43]||(p[43]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭P2P打洞"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"仅通过服务器中转")],-1)),me(a("input",{"onUpdate:modelValue":p[9]||(p[9]=b=>h.value.no_punch=b),type:"checkbox",class:G(Yt)},null,512),[[Jt,h.value.no_punch]])])])]),a("div",wh,[a("h4",{class:G(Vt)},[...p[44]||(p[44]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1),ae(" 安全配置 ",-1)])]),a("div",Ch,[a("div",Sh,[a("div",null,[p[45]||(p[45]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"组网加密密码(连接公共服务器时建议填写,同一组网密码需要相同)",-1)),me(a("input",{"onUpdate:modelValue":p[10]||(p[10]=b=>h.value.password=b),type:"password",placeholder:"留空则不加密",class:"input"},null,512),[[Oe,h.value.password]])]),a("div",null,[p[47]||(p[47]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"服务端证书校验模式",-1)),me(a("select",{"onUpdate:modelValue":p[11]||(p[11]=b=>h.value.cert_mode=b),class:"input"},[...p[46]||(p[46]=[a("option",{value:"skip"},"跳过验证 (默认)",-1),a("option",{value:"standard"},"系统证书验证",-1),a("option",{value:"finger"},"证书指纹验证",-1)])],512),[[cl,h.value.cert_mode]])])]),h.value.cert_mode==="finger"?(y(),E("div",Eh,[p[48]||(p[48]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ae(" 证书指纹 "),a("span",{class:"text-xs text-slate-500 ml-1"},"(服务端启动时日志会输出指纹)")],-1)),me(a("input",{"onUpdate:modelValue":p[12]||(p[12]=b=>h.value.fingerprint=b),type:"text",placeholder:"例如: 3bdd8675606837cdf95d5e13445606315762315a78555f9da652940a25feaec1",class:"input font-mono text-sm"},null,512),[[Oe,h.value.fingerprint]])])):fe("",!0)])]),a("div",Th,[a("h4",{class:G(Vt)},[...p[49]||(p[49]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 01-.806-.98L15 9m0 0V7m0 2v6"})],-1),ae(" NAT与路由 (点对网) ",-1)])]),a("div",Ah,[a("div",null,[p[51]||(p[51]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ae(" 入栈网段 "),a("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR,目标IP")],-1)),a("div",$h,[(y(!0),E(ie,null,Ee(h.value.input,(b,k)=>(y(),E("div",{key:k,class:"flex gap-2"},[me(a("input",{"onUpdate:modelValue":S=>h.value.input[k]=S,type:"text",placeholder:"例如: 192.168.0.0/24,10.26.0.2",class:"input flex-1"},null,8,Ih),[[Oe,h.value.input[k]]]),a("button",{onClick:S=>h.value.input.splice(k,1),class:G(ps)},[...p[50]||(p[50]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Rh)]))),128)),a("button",{onClick:p[13]||(p[13]=b=>h.value.input.push("")),class:G(hs)}," + 添加入栈网段 ")])]),a("div",null,[p[53]||(p[53]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ae(" 出栈网段 "),a("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR (允许转发的网段)")],-1)),a("div",Ph,[(y(!0),E(ie,null,Ee(h.value.output,(b,k)=>(y(),E("div",{key:k,class:"flex gap-2"},[me(a("input",{"onUpdate:modelValue":S=>h.value.output[k]=S,type:"text",placeholder:"例如: 0.0.0.0/0",class:"input flex-1"},null,8,Oh),[[Oe,h.value.output[k]]]),a("button",{onClick:S=>h.value.output.splice(k,1),class:G(ps)},[...p[52]||(p[52]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Mh)]))),128)),a("button",{onClick:p[14]||(p[14]=b=>h.value.output.push("")),class:G(hs)}," + 添加出栈网段 ")])]),a("div",Lh,[a("label",{class:G(Qt)},[p[54]||(p[54]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭内置NAT"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"使用系统网卡转发")],-1)),me(a("input",{"onUpdate:modelValue":p[15]||(p[15]=b=>h.value.no_nat=b),type:"checkbox",class:G(Yt)},null,512),[[Jt,h.value.no_nat]])]),a("label",{class:G(Qt)},[p[55]||(p[55]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭TUN网卡"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"仅作流量出口或端口映射")],-1)),me(a("input",{"onUpdate:modelValue":p[16]||(p[16]=b=>h.value.no_tun=b),type:"checkbox",class:G(Yt)},null,512),[[Jt,h.value.no_tun]])])])])]),a("div",Nh,[a("h4",{class:G(Vt)},[...p[56]||(p[56]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})],-1),ae(" 端口映射 ",-1)])]),a("div",Vh,[a("div",null,[p[58]||(p[58]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[ae(" 映射规则 "),a("span",{class:"text-xs text-slate-500 ml-1"},"格式: 协议://监听地址-虚拟IP-目标地址")],-1)),a("div",jh,[(y(!0),E(ie,null,Ee(h.value.port_mapping,(b,k)=>(y(),E("div",{key:k,class:"flex gap-2"},[me(a("input",{"onUpdate:modelValue":S=>h.value.port_mapping[k]=S,type:"text",placeholder:"例如: tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80",class:"input flex-1 font-mono"},null,8,Dh),[[Oe,h.value.port_mapping[k]]]),a("button",{onClick:S=>h.value.port_mapping.splice(k,1),class:G(ps)},[...p[57]||(p[57]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Bh)]))),128)),a("button",{onClick:p[17]||(p[17]=b=>h.value.port_mapping.push("")),class:G(hs)}," + 添加映射规则 ")])]),a("label",{class:G(Qt)},[p[59]||(p[59]=a("div",{class:"flex-1"},[a("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"允许作为映射出口"),a("div",{class:"text-xs text-slate-400 mt-0.5"},"允许其他设备使用本机作跳板")],-1)),me(a("input",{"onUpdate:modelValue":p[18]||(p[18]=b=>h.value.allow_mapping=b),type:"checkbox",class:G(Yt)},null,512),[[Jt,h.value.allow_mapping]])])])]),a("div",Fh,[a("h4",{class:G(Vt)},[...p[60]||(p[60]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})],-1),ae(" 设备配置 ",-1)])]),a("div",Uh,[a("div",null,[p[61]||(p[61]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备名称",-1)),me(a("input",{"onUpdate:modelValue":p[19]||(p[19]=b=>h.value.device_name=b),type:"text",placeholder:"默认为主机名",class:"input"},null,512),[[Oe,h.value.device_name]])]),a("div",null,[p[62]||(p[62]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备ID",-1)),me(a("input",{"onUpdate:modelValue":p[20]||(p[20]=b=>h.value.device_id=b),type:"text",placeholder:"自动生成",class:"input"},null,512),[[Oe,h.value.device_id]])]),a("div",null,[p[63]||(p[63]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"虚拟网卡名",-1)),me(a("input",{"onUpdate:modelValue":p[21]||(p[21]=b=>h.value.tun_name=b),type:"text",placeholder:"默认为vnt-tun",class:"input"},null,512),[[Oe,h.value.tun_name]])])])]),a("div",Hh,[a("h4",{class:G(Vt)},[...p[64]||(p[64]=[a("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1),ae(" STUN配置 (高级) ",-1)])]),a("div",Wh,[a("div",null,[p[66]||(p[66]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"UDP STUN服务器",-1)),a("div",Kh,[(y(!0),E(ie,null,Ee(h.value.udp_stun,(b,k)=>(y(),E("div",{key:k,class:"flex gap-2"},[me(a("input",{"onUpdate:modelValue":S=>h.value.udp_stun[k]=S,type:"text",placeholder:"例如: stun.l.google.com:19302",class:"input flex-1"},null,8,Gh),[[Oe,h.value.udp_stun[k]]]),a("button",{onClick:S=>h.value.udp_stun.splice(k,1),class:G(ps)},[...p[65]||(p[65]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,qh)]))),128)),a("button",{onClick:p[22]||(p[22]=b=>h.value.udp_stun.push("")),class:G(hs)}," + 添加UDP STUN ")])]),a("div",null,[p[68]||(p[68]=a("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"TCP STUN服务器",-1)),a("div",zh,[(y(!0),E(ie,null,Ee(h.value.tcp_stun,(b,k)=>(y(),E("div",{key:k,class:"flex gap-2"},[me(a("input",{"onUpdate:modelValue":S=>h.value.tcp_stun[k]=S,type:"text",placeholder:"例如: stun.nextcloud.com:443",class:"input flex-1"},null,8,Zh),[[Oe,h.value.tcp_stun[k]]]),a("button",{onClick:S=>h.value.tcp_stun.splice(k,1),class:G(ps)},[...p[67]||(p[67]=[a("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Jh)]))),128)),a("button",{onClick:p[23]||(p[23]=b=>h.value.tcp_stun.push("")),class:G(hs)}," + 添加TCP STUN ")])])])])])],512),[[ql,c.value==="form"]]),me(a("div",Yh,[me(a("textarea",{"onUpdate:modelValue":p[24]||(p[24]=b=>l.value=b),class:"h-full w-full resize-none bg-slate-50 p-4 font-mono text-sm text-slate-800 focus:outline-none dark:bg-slate-950 dark:text-slate-200",spellcheck:"false",placeholder:"# 在此处输入 TOML 配置..."},null,512),[[Oe,l.value]])],512),[[ql,c.value==="toml"]])]),footer:Ae(()=>[a("div",Qh,[c.value==="form"?(y(),E("span",Xh,"填写完成后保存即可生成配置文件")):(y(),E("span",em,"* 请使用标准 TOML 格式"))]),a("button",{class:"btn-ghost",onClick:p[25]||(p[25]=b=>n("close"))},"取消"),a("button",{class:"btn-primary",onClick:L},"保存配置")]),_:1},8,["show"]))}},ya=(e,t)=>{const s=e.__vccOpts||e;for(const[n,o]of t)s[n]=o;return s},sm={class:"space-y-6"},nm={class:"flex items-end justify-between gap-4"},om={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},lm=["onClick"],rm={key:0,class:"absolute right-0 top-0 rounded-bl bg-green-500 px-2 py-1 text-xs text-white"},im={key:1,class:"absolute right-0 top-0 rounded-bl bg-indigo-500 px-2 py-1 text-xs text-white"},am={class:"flex items-start"},cm={class:"overflow-hidden"},um=["title"],fm=["title"],dm={class:"config-card-actions mt-4 flex justify-end transition-opacity"},pm=["onClick"],hm=["onClick"],mm={__name:"ConfigView",setup(e){const t=Mt(),s=as(),n=oe(!1),o=oe(null),l=u=>{const d=t.instanceList.find(g=>g.file_name===u);return d?d.status:null},r=u=>{const d=l(u);return d==="running"?"ring-2 ring-green-500/60":d==="starting"?"ring-2 ring-indigo-500/60":""},i=u=>{o.value=u,n.value=!0},c=()=>{t.fetchConfigList()},f=async u=>{if(await s.confirm({title:"删除配置",message:`确定要删除配置 ${u} 吗?`,danger:!0,confirmText:"删除"}))try{await $d(u),s.toast.success("配置已删除"),t.fetchConfigList()}catch(g){s.toast.error(g.message)}};return Ot(()=>t.fetchConfigList()),(u,d)=>(y(),E("div",sm,[a("div",nm,[d[3]||(d[3]=a("div",null,[a("h1",{class:"page-title"},"配置"),a("p",{class:"page-subtitle"},"管理组网配置文件")],-1)),a("button",{class:"btn-primary",onClick:d[0]||(d[0]=g=>i(null))},[...d[2]||(d[2]=[a("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),ae(" 新建配置 ",-1)])])]),O(t).configList.length===0?(y(),Ie(an,{key:0,text:"暂无配置,点击右上角新建"})):(y(),E("div",om,[(y(!0),E(ie,null,Ee(O(t).configList,g=>(y(),E("div",{key:g.file_name,class:G([r(g.file_name),"card group relative flex min-h-[140px] cursor-pointer flex-col justify-between overflow-hidden"]),onClick:h=>i(g.file_name)},[l(g.file_name)==="running"?(y(),E("div",rm," 运行中 ")):l(g.file_name)==="starting"?(y(),E("div",im," 启动中 ")):fe("",!0),a("div",am,[d[4]||(d[4]=a("div",{class:"mr-3 mt-1 rounded-lg bg-indigo-50 p-2 text-indigo-600 dark:bg-indigo-500/10 dark:text-indigo-400"},[a("svg",{class:"h-6 w-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})])],-1)),a("div",cm,[a("h3",{class:"truncate text-lg font-bold text-slate-900 dark:text-white",title:g.config_name},V(g.config_name||"Unnamed"),9,um),a("p",{class:"truncate font-mono text-xs text-slate-400",title:g.file_name},V(g.file_name),9,fm)])]),a("div",dm,[a("button",{class:"mr-4 text-sm text-indigo-600 hover:text-indigo-500 dark:text-indigo-400",onClick:ls(h=>i(g.file_name),["stop"])}," 编辑 ",8,pm),a("button",{class:"text-sm text-red-500 hover:text-red-400",onClick:ls(h=>f(g.file_name),["stop"])}," 删除 ",8,hm)])],10,lm))),128))])),ue(tm,{show:n.value,"file-name":o.value,onClose:d[1]||(d[1]=g=>n.value=!1),onSaved:c},null,8,["show","file-name"])]))}},gm=ya(mm,[["__scopeId","data-v-b7dce6ea"]]),vm=e=>{if(!e)return"-";const t=new Date(e*1e3),s=n=>n<10?"0"+n:n;return`${t.getFullYear()}-${s(t.getMonth()+1)}-${s(t.getDate())} ${s(t.getHours())}:${s(t.getMinutes())}:${s(t.getSeconds())}`},Er=e=>{if(e===0||e===void 0||e===null)return"0B";const t=["B","KB","MB","GB","TB"];let s=0,n=e;for(;n>=1024&&s{if(e===0||e===void 0||e===null)return"0B/s";const t=["B/s","KB/s","MB/s","GB/s"];let s=0,n=e;for(;n>=1024&&s{const t=[1024,10240,102400,1048576,10485760,104857600,1073741824];for(const s of t)if(e<=s)return s;return Math.ceil(e/(1024*1024*1024))*1024*1024*1024},ka={__name:"StatusDot",props:{status:{type:String,default:"stopped"},size:{type:String,default:"w-2.5 h-2.5"}},setup(e){const t=s=>s==="running"?"bg-green-500":s==="starting"?"bg-blue-500 animate-pulse":"bg-slate-400 dark:bg-slate-500";return(s,n)=>(y(),E("span",{class:G(["rounded-full inline-block shrink-0",[e.size,t(e.status)]])},null,2))}},_m={class:"flex items-center gap-4 mb-2 text-xs text-slate-400"},xm={class:"ml-auto"},ym={__name:"SpeedChart",props:{history:{type:Object,required:!0},size:{type:Number,default:60}},setup(e,{expose:t}){const s=e,n=oe(null),o=oe(""),l=()=>{const r=n.value;if(!r)return;const i=r.getContext("2d"),c=s.history?s.history.tx:[],f=s.history?s.history.rx:[],u=s.size,d=window.devicePixelRatio||1,g=r.getBoundingClientRect();if(g.width===0)return;r.width=g.width*d,r.height=g.height*d,i.setTransform(d,0,0,d,0,0);const h=g.width,C=g.height,L=document.documentElement.classList.contains("dark")?{bg:"#0c1222",grid:"rgba(71, 85, 105, 0.3)",rx:"#60a5fa",rxFill:"rgba(96, 165, 250, 0.15)",tx:"#4ade80",txFill:"rgba(74, 222, 128, 0.15)"}:{bg:"#f8fafc",grid:"rgba(148, 163, 184, 0.35)",rx:"#3b82f6",rxFill:"rgba(59, 130, 246, 0.12)",tx:"#22c55e",txFill:"rgba(34, 197, 94, 0.12)"},w=8,p=4,b=0,S=h-b-0,q=C-w-p;i.fillStyle=L.bg,i.fillRect(0,0,h,C);const D=[...c,...f];let U=D.length>0?Math.max(...D):0;U<1024&&(U=1024);const M=bm(U);o.value="峰值: "+Fo(M);const z=4;i.strokeStyle=L.grid,i.lineWidth=1;for(let Z=0;Z<=z;Z++){const R=w+q/z*Z;i.beginPath(),i.moveTo(b,R),i.lineTo(b+S,R),i.stroke()}const ne=6;for(let Z=0;Z<=ne;Z++){const R=b+S/ne*Z;i.beginPath(),i.moveTo(R,w),i.lineTo(R,w+q),i.stroke()}const B=(Z,R,ee)=>{if(Z.length<2)return;const ce=S/(u-1),te=u-Z.length;i.beginPath(),i.moveTo(b+te*ce,w+q);for(let re=0;reRt(l)),Be(()=>[s.history?.tx?.length,s.history?.rx?.length,s.history?.tx?.at(-1),s.history?.rx?.at(-1)],()=>Rt(l)),t({draw:l}),(r,i)=>(y(),E("div",null,[a("div",_m,[i[0]||(i[0]=a("span",{class:"flex items-center"},[a("span",{class:"inline-block w-3 h-0.5 bg-green-400 mr-1"}),ae("上传速度")],-1)),i[1]||(i[1]=a("span",{class:"flex items-center"},[a("span",{class:"inline-block w-3 h-0.5 bg-blue-400 mr-1"}),ae("下载速度")],-1)),a("span",xm,V(o.value),1)]),a("canvas",{ref_key:"canvasRef",ref:n,class:"rounded w-full block h-[150px]"},null,512)]))}},km={class:"space-y-4"},wm={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},Cm=["onClick"],Sm={key:2,class:"card overflow-hidden p-0"},Em={class:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-700"},Tm={class:"flex gap-4 text-sm muted"},Am={class:"font-medium tabular-nums text-slate-900 dark:text-white"},$m={class:"font-medium tabular-nums text-slate-900 dark:text-white"},Im={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},Rm={class:"table"},Pm={class:"transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50"},Om=["onClick"],Mm={class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},Lm=["onMouseenter"],Nm={class:"hidden text-xs text-slate-400 md:table-cell"},Vm={class:"flex items-center gap-2"},jm={key:0,class:"tooltip"},Dm={key:1,class:"tooltip"},Bm={key:2,class:"tooltip cursor-help"},Fm={class:"tooltip-text"},Um={key:1,class:"text-yellow-600 dark:text-yellow-400"},Hm={key:2,class:"text-slate-400"},Wm={class:"tabular-nums"},Km=["title"],Gm={key:1,class:"text-slate-400"},qm={class:"text-xs"},zm={key:0,class:"leading-relaxed"},Zm={class:"text-green-600 tabular-nums dark:text-green-400"},Jm={class:"text-blue-600 tabular-nums dark:text-blue-400"},Ym={key:1,class:"text-slate-400"},Qm={class:"hidden font-mono text-xs text-slate-400 md:table-cell"},Xm={key:0},eg={colspan:"10",class:"p-0"},tg={class:"border-t border-slate-200 bg-slate-50 px-4 py-3 dark:border-slate-700/50 dark:bg-slate-950/60"},sg=60,ng={__name:"PeersView",setup(e){const t=Mt(),s=Qe("peerTooltip"),n=(b,k)=>s.value?.showPeerTooltip(b,k),o=()=>s.value?.hidePeerTooltip(),l=oe([]);let r=null,i={},c=0;const f=Kt({}),u={},d=b=>{f[b]=!f[b]},g=()=>{const b=t.instanceList.find(k=>k.file_name===t.selectedInstance);return b?b.status:null},h=()=>{l.value=[],i={},c=0;for(const b in u)delete u[b];for(const b in f)delete f[b]},C=async()=>{if(!t.selectedInstance||g()!=="running"){h();return}try{const b=await bd(t.selectedInstance)||[],k=Date.now(),S=c>0?(k-c)/1e3:0,q={};for(const D of b)if(D.traffic){const U=D.ip,M=i[U];if(M&&S>0){const z=Math.max(0,D.traffic.tx_bytes-M.tx_bytes),ne=Math.max(0,D.traffic.rx_bytes-M.rx_bytes);D.traffic.tx_speed=Math.round(z/S),D.traffic.rx_speed=Math.round(ne/S)}else D.traffic.tx_speed=0,D.traffic.rx_speed=0;q[U]={tx_bytes:D.traffic.tx_bytes,rx_bytes:D.traffic.rx_bytes},u[U]||(u[U]={tx:[],rx:[]}),u[U].tx.push(D.traffic.tx_speed),u[U].rx.push(D.traffic.rx_speed),u[U].tx.length>sg&&(u[U].tx.shift(),u[U].rx.shift())}i=q,c=k,l.value=b}catch(b){console.error(b)}};Ot(()=>{C(),r=setInterval(()=>{t.isPageVisible&&C()},3e3)}),As(()=>{r&&clearInterval(r)}),Be(()=>t.selectedInstance,()=>{h(),C()}),Be(g,b=>{b==="running"&&C()});const x=b=>b.metric===1?"text-purple-600 font-medium dark:text-purple-400":"text-blue-600 dark:text-blue-400",L=b=>{const k=b.metric===1,S=b.protocol.includes("Tcp");return k?S?"打洞TCP直连":"打洞UDP直连":S?"客户端TCP中继":"客户端UDP中继"},w=b=>b===3?"己方加密对方未加密":b===4?"己方未加密对方加密":b===5?"密钥不一致":"未知错误",p=b=>t.selectedInstance===b?"border-indigo-600 bg-indigo-600 text-white dark:border-indigo-500 dark:bg-indigo-500":"border-slate-300 bg-white text-slate-600 hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700";return(b,k)=>(y(),E("div",km,[k[8]||(k[8]=a("div",null,[a("h1",{class:"page-title"},"设备列表"),a("p",{class:"page-subtitle"},"查看各实例的设备连接与流量状况")],-1)),O(t).instanceList.length>0?(y(),E("div",wm,[(y(!0),E(ie,null,Ee(O(t).instanceList,S=>(y(),E("button",{key:S.file_name,onClick:q=>O(t).selectedInstance=S.file_name,class:G([p(S.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[ue(ka,{status:S.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),ae(" "+V(S.config_name||S.file_name),1)],10,Cm))),128))])):fe("",!0),O(t).selectedInstance?(y(),E("div",Sm,[a("div",Em,[k[2]||(k[2]=a("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"设备列表",-1)),a("div",Tm,[a("span",null,[k[0]||(k[0]=ae(" Online: ",-1)),a("span",Am,V(l.value.filter(S=>S.online).length),1)]),a("span",null,[k[1]||(k[1]=ae(" Total: ",-1)),a("span",$m,V(l.value.length),1)])])]),a("div",Im,[a("table",Rm,[k[7]||(k[7]=a("thead",null,[a("tr",null,[a("th",{class:"w-8 px-2"}),a("th",null,"IP地址"),a("th",null,"名称"),a("th",{class:"hidden md:table-cell"},"版本"),a("th",null,"状态"),a("th",null,"模式"),a("th",null,"延迟"),a("th",null,"丢包率"),a("th",null,"流量"),a("th",{class:"hidden md:table-cell"},"最后在线")])],-1)),a("tbody",null,[(y(!0),E(ie,null,Ee(l.value,S=>(y(),E(ie,{key:S.ip},[a("tr",Pm,[a("td",{class:"cursor-pointer select-none px-2 text-center",onClick:q=>d(S.ip)},[(y(),E("svg",{class:G(["inline-block h-4 w-4 text-slate-400 transition-transform duration-200",{"rotate-90":f[S.ip]}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...k[3]||(k[3]=[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2))],8,Om),a("td",Mm,[a("span",{class:"cursor-help border-b border-dotted border-indigo-400/50 pb-0.5",onMouseenter:q=>n(q,S),onMouseleave:o},V(S.ip),41,Lm)]),a("td",null,V(S.name||"-"),1),a("td",Nm,V(S.version||"-"),1),a("td",null,[a("div",Vm,[a("span",{class:G(S.online?"badge-green":"badge-gray")},V(S.online?"Online":"Offline"),3),S.online&&S.key_equal===1?(y(),E("div",jm,[...k[4]||(k[4]=[a("svg",{class:"h-4 w-4 text-green-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1),a("span",{class:"tooltip-text"},"双方加密传输",-1)])])):S.online&&S.key_equal===2?(y(),E("div",Dm,[...k[5]||(k[5]=[a("svg",{class:"h-4 w-4 text-yellow-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"})],-1),a("span",{class:"tooltip-text"},"双方未加密",-1)])])):S.online&&[3,4,5].includes(S.key_equal)?(y(),E("div",Bm,[k[6]||(k[6]=a("svg",{class:"h-4 w-4 text-red-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),a("span",Fm,V(w(S.key_equal)),1)])):fe("",!0)])]),a("td",null,[S.online&&S.route?(y(),E("span",{key:0,class:G(x(S.route))},V(L(S.route)),3)):S.online?(y(),E("span",Um,"服务器中继")):(y(),E("span",Hm,"-"))]),a("td",Wm,V(S.route?S.route.rtt+" ms":"-"),1),a("td",null,[S.packet_loss?(y(),E("span",{key:0,class:G(S.packet_loss.loss_rate>10?"text-red-600 dark:text-red-400":S.packet_loss.loss_rate>5?"text-yellow-600 dark:text-yellow-400":"text-green-600 dark:text-green-400"),title:"Sent: "+S.packet_loss.sent+", Received: "+S.packet_loss.received},V(S.packet_loss.loss_rate.toFixed(1))+"%",11,Km)):(y(),E("span",Gm,"-"))]),a("td",qm,[S.traffic?(y(),E("div",zm,[a("div",Zm," ↑ "+V(O(Er)(S.traffic.tx_bytes))+" ("+V(O(Fo)(S.traffic.tx_speed))+") ",1),a("div",Jm," ↓ "+V(O(Er)(S.traffic.rx_bytes))+" ("+V(O(Fo)(S.traffic.rx_speed))+") ",1)])):(y(),E("span",Ym,"-"))]),a("td",Qm,V(O(vm)(S.last_connected_time)),1)]),f[S.ip]?(y(),E("tr",Xm,[a("td",eg,[a("div",tg,[ue(ym,{history:u[S.ip]||{tx:[],rx:[]},size:60},null,8,["history"])])])])):fe("",!0)],64))),128))])])])])):(y(),Ie(an,{key:1,text:"暂无运行中的组网实例"}))]))}},og={class:"space-y-4"},lg={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},rg=["onClick"],ig={key:2,class:"card overflow-hidden p-0"},ag={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},cg={class:"table"},ug=["rowspan"],fg={class:"font-mono tabular-nums text-yellow-700 dark:text-yellow-300"},dg={class:"tabular-nums"},pg={class:"tabular-nums"},hg={__name:"RoutesView",setup(e){const t=Mt(),s=oe([]);let n=null;const o=()=>{const i=t.instanceList.find(c=>c.file_name===t.selectedInstance);return i?i.status:null},l=async()=>{if(!t.selectedInstance||o()!=="running"){s.value=[];return}try{s.value=await _d(t.selectedInstance)||[]}catch(i){console.error(i)}};Ot(()=>{l(),n=setInterval(()=>{t.isPageVisible&&l()},3e3)}),As(()=>{n&&clearInterval(n)}),Be(()=>t.selectedInstance,()=>{l()}),Be(o,i=>{i==="running"&&l()});const r=i=>t.selectedInstance===i?"border-indigo-600 bg-indigo-600 text-white dark:border-indigo-500 dark:bg-indigo-500":"border-slate-300 bg-white text-slate-600 hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700";return(i,c)=>(y(),E("div",og,[c[2]||(c[2]=a("div",null,[a("h1",{class:"page-title"},"路由"),a("p",{class:"page-subtitle"},"查看各实例的路由表")],-1)),O(t).instanceList.length>0?(y(),E("div",lg,[(y(!0),E(ie,null,Ee(O(t).instanceList,f=>(y(),E("button",{key:f.file_name,onClick:u=>O(t).selectedInstance=f.file_name,class:G([r(f.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[ue(ka,{status:f.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),ae(" "+V(f.config_name||f.file_name),1)],10,rg))),128))])):fe("",!0),O(t).selectedInstance?(y(),E("div",ig,[c[1]||(c[1]=a("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[a("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"路由表")],-1)),a("div",ag,[a("table",cg,[c[0]||(c[0]=a("thead",null,[a("tr",null,[a("th",null,"目标节点IP"),a("th",null,"目标网络"),a("th",null,"跳数"),a("th",null,"延迟")])],-1)),a("tbody",null,[(y(!0),E(ie,null,Ee(s.value,f=>(y(),E(ie,{key:f.ip},[(y(!0),E(ie,null,Ee(f.routes,(u,d)=>(y(),E("tr",{key:d,class:"hover:bg-slate-50 dark:hover:bg-slate-800/50"},[d===0?(y(),E("td",{key:0,rowspan:f.routes.length,class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},V(f.ip),9,ug)):fe("",!0),a("td",fg,V(u.addr),1),a("td",dg,V(u.metric),1),a("td",pg,V(u.rtt)+" ms",1)]))),128))],64))),128))])])])])):(y(),Ie(an,{key:1,text:"暂无运行中的组网实例"}))]))}},mg={class:"mx-auto max-w-4xl space-y-5"},gg={key:0,class:"card text-sm text-slate-400"},vg={key:1,class:"card border-red-200 text-sm text-red-600 dark:border-red-900 dark:text-red-300"},bg={class:"card space-y-6"},_g={class:"flex items-start justify-between gap-5"},xg=["aria-checked","disabled"],yg={class:"grid gap-5 sm:grid-cols-2"},kg={class:"block"},wg=["disabled"],Cg={class:"block"},Sg=["disabled"],Eg={class:"mb-2 flex items-center justify-between gap-3"},Tg=["disabled"],Ag={class:"flex items-center gap-2"},$g={class:"min-w-0 flex-1 truncate rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-300"},Ig=["disabled"],Rg={key:0,class:"border-t border-slate-200 pt-5 dark:border-slate-800"},Pg={key:0,class:"text-xs text-green-600 dark:text-green-400"},Og={key:1,class:"text-xs text-red-600 dark:text-red-400"},Mg={class:"card"},Lg={class:"flex items-start gap-3"},Ng={class:"min-w-0 flex-1"},Vg={class:"text-sm font-semibold text-slate-900 dark:text-white"},jg={class:"mt-1 text-xs text-slate-400"},Dg={key:0,class:"mt-4 rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 font-mono text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-950 dark:text-slate-300"},Bg={class:"block truncate"},Fg={key:1,class:"mt-3 flex flex-wrap gap-2"},Ug={__name:"WebAccessView",setup(e){const t=globalThis.__VNT_WEB_ACCESS__,s=Kt({enabled:!1,port:19099,global:!1,token:""}),n=oe(null),o=oe(!0),l=oe(!1),r=oe(""),i=oe(""),c=w=>{n.value=w,Object.assign(s,{enabled:w.enabled,port:w.port,global:w.global,token:w.token})},f=async()=>{o.value=!0,i.value="";try{if(!t)throw new Error("Web 访问设置仅在桌面客户端中提供");c(await t.status())}catch(w){i.value=w.message||String(w)}finally{o.value=!1}},u=async(w,p)=>{l.value=!0,i.value="",r.value="";try{c(await t.update({...s,...w,port:Number(w.port??s.port)})),r.value=p}catch(b){const k=b.message||String(b);try{c(await t.status())}catch{}i.value=k}finally{l.value=!1}},d=async()=>{const w=!s.enabled;await u({enabled:w},w?"Web 服务已启动":"Web 服务已关闭")},g=async()=>{const w=await t.generateToken();await u({token:w},s.enabled?"新令牌已生效,Web 服务已重新加载":"新令牌已生成")},h=async()=>{s.enabled||await u({},"监听设置已自动保存")},C=async()=>{await navigator.clipboard.writeText(s.token),r.value="访问令牌已复制"},x=async()=>{await navigator.clipboard.writeText(n.value.url),r.value="访问地址已复制"},L=async()=>{await t.openUrl(n.value.url)};return Ot(f),(w,p)=>(y(),E("div",mg,[p[9]||(p[9]=a("div",{class:"page-title"},[a("div",null,[a("h2",null,"Web 访问"),a("p",null,"从浏览器访问当前 VNT 进程,API 请求由持久访问令牌保护。")])],-1)),o.value?(y(),E("div",gg,"正在读取 Web 服务状态…")):O(t)?(y(),E(ie,{key:2},[a("section",bg,[a("div",_g,[p[2]||(p[2]=a("div",null,[a("h3",{class:"text-sm font-semibold text-slate-900 dark:text-white"},"启用 Web 服务"),a("p",{class:"mt-1 text-xs leading-5 text-slate-400"},"服务内置于桌面客户端,不会启动单独的 vnt2_web 进程。")],-1)),a("button",{type:"button",role:"switch","aria-label":"启用 Web 服务","aria-checked":s.enabled,disabled:l.value,class:G(["web-switch transition-colors disabled:opacity-50",s.enabled?"bg-indigo-600 dark:bg-indigo-500":"bg-slate-300 dark:bg-slate-600"]),onClick:d},[a("span",{class:G(["web-switch-knob bg-white shadow-sm",{"web-switch-knob-on":s.enabled}])},null,2)],10,xg)]),a("div",yg,[a("label",kg,[p[3]||(p[3]=a("span",{class:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-200"},"监听端口",-1)),me(a("input",{"onUpdate:modelValue":p[0]||(p[0]=b=>s.port=b),class:"input font-mono",type:"number",min:"1",max:"65535",disabled:l.value||s.enabled,onChange:h},null,40,wg),[[Oe,s.port,void 0,{number:!0}]])]),a("label",Cg,[p[5]||(p[5]=a("span",{class:"mb-2 block text-sm font-medium text-slate-700 dark:text-slate-200"},"监听范围",-1)),me(a("select",{"onUpdate:modelValue":p[1]||(p[1]=b=>s.global=b),class:"input",disabled:l.value||s.enabled,onChange:h},[...p[4]||(p[4]=[a("option",{value:!1},"仅本机(推荐)",-1),a("option",{value:!0},"局域网内所有设备",-1)])],40,Sg),[[cl,s.global]])])]),p[8]||(p[8]=a("p",{class:"-mt-3 text-xs text-slate-400"},"端口和监听范围会自动保存;需要修改时请先关闭 Web 服务。",-1)),a("div",null,[a("div",Eg,[p[6]||(p[6]=a("span",{class:"text-sm font-medium text-slate-700 dark:text-slate-200"},"访问令牌",-1)),a("button",{class:"text-xs font-medium text-indigo-600 hover:text-indigo-500 disabled:opacity-50 dark:text-indigo-400",type:"button",disabled:l.value,onClick:g},"更换令牌",8,Tg)]),a("div",Ag,[a("code",$g,V(s.token),1),a("button",{class:"btn-ghost shrink-0",type:"button",disabled:l.value,onClick:C},"复制令牌",8,Ig)]),p[7]||(p[7]=a("p",{class:"mt-2 text-xs text-slate-400"},"更换令牌后,已登录的浏览器需要使用新令牌重新鉴权。",-1))]),r.value||i.value?(y(),E("div",Rg,[r.value?(y(),E("span",Pg,V(r.value),1)):fe("",!0),i.value?(y(),E("span",Og,V(i.value),1)):fe("",!0)])):fe("",!0)]),a("section",Mg,[a("div",Lg,[a("span",{class:G(["mt-1 h-2.5 w-2.5 shrink-0 rounded-full",n.value?.running?"bg-green-500":"bg-slate-300 dark:bg-slate-600"])},null,2),a("div",Ng,[a("div",Vg,V(n.value?.running?"运行中":"未运行"),1),a("div",jg,"监听地址:"+V(n.value?.listenAddress),1),n.value?.running?(y(),E("div",Dg,[a("span",Bg,V(n.value.url),1)])):fe("",!0),n.value?.running?(y(),E("div",Fg,[a("button",{class:"btn-primary btn-sm",type:"button",onClick:L},"打开浏览器"),a("button",{class:"btn-ghost btn-sm",type:"button",onClick:x},"复制访问地址")])):fe("",!0)])])])],64)):(y(),E("div",vg,V(i.value),1))]))}},Hg=ya(Ug,[["__scopeId","data-v-2bc5d3bf"]]),Wg=[{path:"/",component:E0},{path:"/instances",component:lh},{path:"/general",redirect:"/instances"},{path:"/config",component:gm},{path:"/peers",component:ng},{path:"/routes",component:hg},{path:"/web-access",component:Hg}],Kg=pd({history:Kf(),routes:Wg}),Qn=document.querySelector('link[rel~="icon"]')||document.createElement("link");Qn.rel="icon";Qn.type="image/png";Qn.href=ml;document.head.appendChild(Qn);Yu(Np).use(ef()).use(Kg).mount("#app"); diff --git a/vnt-web/static/assets/index-DM6YOQ55.js b/vnt-web/static/assets/index-DM6YOQ55.js deleted file mode 100644 index 1e9b596..0000000 --- a/vnt-web/static/assets/index-DM6YOQ55.js +++ /dev/null @@ -1,168 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))n(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const l of r.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function s(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function n(o){if(o.ep)return;o.ep=!0;const r=s(o);fetch(o.href,r)}})();function Lo(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const ke={},gs=[],bt=()=>{},gl=()=>!1,An=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),In=e=>e.startsWith("onUpdate:"),Re=Object.assign,No=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},ua=Object.prototype.hasOwnProperty,ge=(e,t)=>ua.call(e,t),Y=Array.isArray,vs=e=>sn(e)==="[object Map]",Es=e=>sn(e)==="[object Set]",ur=e=>sn(e)==="[object Date]",oe=e=>typeof e=="function",Ce=e=>typeof e=="string",Ze=e=>typeof e=="symbol",ve=e=>e!==null&&typeof e=="object",vl=e=>(ve(e)||oe(e))&&oe(e.then)&&oe(e.catch),_l=Object.prototype.toString,sn=e=>_l.call(e),fa=e=>sn(e).slice(8,-1),bl=e=>sn(e)==="[object Object]",Rn=e=>Ce(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,js=Lo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),$n=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},da=/-\w/g,Ke=$n(e=>e.replace(da,t=>t.slice(1).toUpperCase())),pa=/\B([A-Z])/g,os=$n(e=>e.replace(pa,"-$1").toLowerCase()),Pn=$n(e=>e.charAt(0).toUpperCase()+e.slice(1)),qn=$n(e=>e?`on${Pn(e)}`:""),vt=(e,t)=>!Object.is(e,t),pn=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Mn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ha=e=>{const t=Ce(e)?Number(e):NaN;return isNaN(t)?e:t};let fr;const On=()=>fr||(fr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ln(e){if(Y(e)){const t={};for(let s=0;s{if(s){const n=s.split(ga);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function q(e){let t="";if(Ce(e))t=e;else if(Y(e))for(let s=0;sTs(s,t))}const kl=e=>!!(e&&e.__v_isRef===!0),B=e=>Ce(e)?e:e==null?"":Y(e)||ve(e)&&(e.toString===_l||!oe(e.toString))?kl(e)?B(e.value):JSON.stringify(e,wl,2):String(e),wl=(e,t)=>kl(t)?wl(e,t.value):vs(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,o],r)=>(s[zn(n,r)+" =>"]=o,s),{})}:Es(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>zn(s))}:Ze(t)?zn(t):ve(t)&&!Y(t)&&!bl(t)?String(t):t,zn=(e,t="")=>{var s;return Ze(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let Pe;class Cl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Pe&&(Pe.active?(this.parent=Pe,this.index=(Pe.scopes||(Pe.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes){const n=this.scopes.slice();for(t=0,s=n.length;t0&&--this._on===0){if(Pe===this)Pe=this.prevScope;else{let t=Pe;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s0)return;if(Fs){let t=Fs;for(Fs=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Ds;){let t=Ds;for(Ds=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Rl(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function $l(e){let t,s=e.depsTail,n=s;for(;n;){const o=n.prevDep;n.version===-1?(n===s&&(s=o),Fo(n),wa(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=o}e.deps=t,e.depsTail=s}function ho(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Pl(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Pl(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Gs)||(e.globalVersion=Gs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!ho(e))))return;e.flags|=2;const t=e.dep,s=we,n=ot;we=e,ot=!0;try{Rl(e);const o=e.fn(e._value);(t.version===0||vt(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{we=s,ot=n,$l(e),e.flags&=-3}}function Fo(e,t=!1){const{dep:s,prevSub:n,nextSub:o}=e;if(n&&(n.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let r=s.computed.deps;r;r=r.nextDep)Fo(r,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function wa(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let ot=!0;const Ml=[];function At(){Ml.push(ot),ot=!1}function It(){const e=Ml.pop();ot=e===void 0?!0:e}function dr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=we;we=void 0;try{t()}finally{we=s}}}let Gs=0;class Ca{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Bo{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!we||!ot||we===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==we)s=this.activeLink=new Ca(we,this),we.deps?(s.prevDep=we.depsTail,we.depsTail.nextDep=s,we.depsTail=s):we.deps=we.depsTail=s,Ol(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=we.depsTail,s.nextDep=void 0,we.depsTail.nextDep=s,we.depsTail=s,we.deps===s&&(we.deps=n)}return s}trigger(t){this.version++,Gs++,this.notify(t)}notify(t){jo();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Do()}}}function Ol(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Ol(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const mn=new WeakMap,ts=Symbol(""),mo=Symbol(""),qs=Symbol("");function Ve(e,t,s){if(ot&&we){let n=mn.get(e);n||mn.set(e,n=new Map);let o=n.get(s);o||(n.set(s,o=new Bo),o.map=n,o.key=s),o.track()}}function Ct(e,t,s,n,o,r){const l=mn.get(e);if(!l){Gs++;return}const i=a=>{a&&a.trigger()};if(jo(),t==="clear")l.forEach(i);else{const a=Y(e),f=a&&Rn(s);if(a&&s==="length"){const u=Number(n);l.forEach((d,g)=>{(g==="length"||g===qs||!Ze(g)&&g>=u)&&i(d)})}else switch((s!==void 0||l.has(void 0))&&i(l.get(s)),f&&i(l.get(qs)),t){case"add":a?f&&i(l.get("length")):(i(l.get(ts)),vs(e)&&i(l.get(mo)));break;case"delete":a||(i(l.get(ts)),vs(e)&&i(l.get(mo)));break;case"set":vs(e)&&i(l.get(ts));break}}Do()}function Sa(e,t){const s=mn.get(e);return s&&s.get(t)}function us(e){const t=pe(e);return t===e?t:(Ve(t,"iterate",qs),Qe(e)?t:t.map(lt))}function Nn(e){return Ve(e=pe(e),"iterate",qs),e}function mt(e,t){return Rt(e)?ys(Et(e)?lt(t):t):lt(t)}const Ea={__proto__:null,[Symbol.iterator](){return Yn(this,Symbol.iterator,e=>mt(this,e))},concat(...e){return us(this).concat(...e.map(t=>Y(t)?us(t):t))},entries(){return Yn(this,"entries",e=>(e[1]=mt(this,e[1]),e))},every(e,t){return xt(this,"every",e,t,void 0,arguments)},filter(e,t){return xt(this,"filter",e,t,s=>s.map(n=>mt(this,n)),arguments)},find(e,t){return xt(this,"find",e,t,s=>mt(this,s),arguments)},findIndex(e,t){return xt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return xt(this,"findLast",e,t,s=>mt(this,s),arguments)},findLastIndex(e,t){return xt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return xt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Qn(this,"includes",e)},indexOf(...e){return Qn(this,"indexOf",e)},join(e){return us(this).join(e)},lastIndexOf(...e){return Qn(this,"lastIndexOf",e)},map(e,t){return xt(this,"map",e,t,void 0,arguments)},pop(){return Rs(this,"pop")},push(...e){return Rs(this,"push",e)},reduce(e,...t){return pr(this,"reduce",e,t)},reduceRight(e,...t){return pr(this,"reduceRight",e,t)},shift(){return Rs(this,"shift")},some(e,t){return xt(this,"some",e,t,void 0,arguments)},splice(...e){return Rs(this,"splice",e)},toReversed(){return us(this).toReversed()},toSorted(e){return us(this).toSorted(e)},toSpliced(...e){return us(this).toSpliced(...e)},unshift(...e){return Rs(this,"unshift",e)},values(){return Yn(this,"values",e=>mt(this,e))}};function Yn(e,t,s){const n=Nn(e),o=n[t]();return n!==e&&!Qe(e)&&(o._next=o.next,o.next=()=>{const r=o._next();return r.done||(r.value=s(r.value)),r}),o}const Ta=Array.prototype;function xt(e,t,s,n,o,r){const l=Nn(e),i=l!==e&&!Qe(e),a=l[t];if(a!==Ta[t]){const d=a.apply(e,r);return i?lt(d):d}let f=s;l!==e&&(i?f=function(d,g){return s.call(this,mt(e,d),g,e)}:s.length>2&&(f=function(d,g){return s.call(this,d,g,e)}));const u=a.call(l,f,n);return i&&o?o(u):u}function pr(e,t,s,n){const o=Nn(e),r=o!==e&&!Qe(e);let l=s,i=!1;o!==e&&(r?(i=n.length===0,l=function(f,u,d){return i&&(i=!1,f=mt(e,f)),s.call(this,f,mt(e,u),d,e)}):s.length>3&&(l=function(f,u,d){return s.call(this,f,u,d,e)}));const a=o[t](l,...n);return i?mt(e,a):a}function Qn(e,t,s){const n=pe(e);Ve(n,"iterate",qs);const o=n[t](...s);return(o===-1||o===!1)&&Vn(s[0])?(s[0]=pe(s[0]),n[t](...s)):o}function Rs(e,t,s=[]){At(),jo();const n=pe(e)[t].apply(e,s);return Do(),It(),n}const Aa=Lo("__proto__,__v_isRef,__isVue"),Ll=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ze));function Ia(e){Ze(e)||(e=String(e));const t=pe(this);return Ve(t,"has",e),t.hasOwnProperty(e)}class Nl{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const o=this._isReadonly,r=this._isShallow;if(s==="__v_isReactive")return!o;if(s==="__v_isReadonly")return o;if(s==="__v_isShallow")return r;if(s==="__v_raw")return n===(o?r?Da:Fl:r?Dl:jl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const l=Y(t);if(!o){let a;if(l&&(a=Ea[s]))return a;if(s==="hasOwnProperty")return Ia}const i=Reflect.get(t,s,Ae(t)?t:n);if((Ze(s)?Ll.has(s):Aa(s))||(o||Ve(t,"get",s),r))return i;if(Ae(i)){const a=l&&Rn(s)?i:i.value;return o&&ve(a)?vo(a):a}return ve(i)?o?vo(i):rs(i):i}}class Vl extends Nl{constructor(t=!1){super(!1,t)}set(t,s,n,o){let r=t[s];const l=Y(t)&&Rn(s);if(!this._isShallow){const f=Rt(r);if(!Qe(n)&&!Rt(n)&&(r=pe(r),n=pe(n)),!l&&Ae(r)&&!Ae(n))return f||(r.value=n),!0}const i=l?Number(s)e,an=e=>Reflect.getPrototypeOf(e);function Oa(e,t,s){return function(...n){const o=this.__v_raw,r=pe(o),l=vs(r),i=e==="entries"||e===Symbol.iterator&&l,a=e==="keys"&&l,f=o[e](...n),u=s?go:t?ys:lt;return!t&&Ve(r,"iterate",a?mo:ts),Re(Object.create(f),{next(){const{value:d,done:g}=f.next();return g?{value:d,done:g}:{value:i?[u(d[0]),u(d[1])]:u(d),done:g}}})}}function cn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function La(e,t){const s={get(o){const r=this.__v_raw,l=pe(r),i=pe(o);e||(vt(o,i)&&Ve(l,"get",o),Ve(l,"get",i));const{has:a}=an(l),f=t?go:e?ys:lt;if(a.call(l,o))return f(r.get(o));if(a.call(l,i))return f(r.get(i));r!==l&&r.get(o)},get size(){const o=this.__v_raw;return!e&&Ve(pe(o),"iterate",ts),o.size},has(o){const r=this.__v_raw,l=pe(r),i=pe(o);return e||(vt(o,i)&&Ve(l,"has",o),Ve(l,"has",i)),o===i?r.has(o):r.has(o)||r.has(i)},forEach(o,r){const l=this,i=l.__v_raw,a=pe(i),f=t?go:e?ys:lt;return!e&&Ve(a,"iterate",ts),i.forEach((u,d)=>o.call(r,f(u),f(d),l))}};return Re(s,e?{add:cn("add"),set:cn("set"),delete:cn("delete"),clear:cn("clear")}:{add(o){const r=pe(this),l=an(r),i=pe(o),a=!t&&!Qe(o)&&!Rt(o)?i:o;return l.has.call(r,a)||vt(o,a)&&l.has.call(r,o)||vt(i,a)&&l.has.call(r,i)||(r.add(a),Ct(r,"add",a,a)),this},set(o,r){!t&&!Qe(r)&&!Rt(r)&&(r=pe(r));const l=pe(this),{has:i,get:a}=an(l);let f=i.call(l,o);f||(o=pe(o),f=i.call(l,o));const u=a.call(l,o);return l.set(o,r),f?vt(r,u)&&Ct(l,"set",o,r):Ct(l,"add",o,r),this},delete(o){const r=pe(this),{has:l,get:i}=an(r);let a=l.call(r,o);a||(o=pe(o),a=l.call(r,o)),i&&i.call(r,o);const f=r.delete(o);return a&&Ct(r,"delete",o,void 0),f},clear(){const o=pe(this),r=o.size!==0,l=o.clear();return r&&Ct(o,"clear",void 0,void 0),l}}),["keys","values","entries",Symbol.iterator].forEach(o=>{s[o]=Oa(o,e,t)}),s}function Uo(e,t){const s=La(e,t);return(n,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?n:Reflect.get(ge(s,o)&&o in n?s:n,o,r)}const Na={get:Uo(!1,!1)},Va={get:Uo(!1,!0)},ja={get:Uo(!0,!1)};const jl=new WeakMap,Dl=new WeakMap,Fl=new WeakMap,Da=new WeakMap;function Fa(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function rs(e){return Rt(e)?e:Ho(e,!1,$a,Na,jl)}function Bl(e){return Ho(e,!1,Ma,Va,Dl)}function vo(e){return Ho(e,!0,Pa,ja,Fl)}function Ho(e,t,s,n,o){if(!ve(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const r=o.get(e);if(r)return r;const l=Fa(fa(e));if(l===0)return e;const i=new Proxy(e,l===2?n:s);return o.set(e,i),i}function Et(e){return Rt(e)?Et(e.__v_raw):!!(e&&e.__v_isReactive)}function Rt(e){return!!(e&&e.__v_isReadonly)}function Qe(e){return!!(e&&e.__v_isShallow)}function Vn(e){return e?!!e.__v_raw:!1}function pe(e){const t=e&&e.__v_raw;return t?pe(t):e}function Wo(e){return!ge(e,"__v_skip")&&Object.isExtensible(e)&&xl(e,"__v_skip",!0),e}const lt=e=>ve(e)?rs(e):e,ys=e=>ve(e)?vo(e):e;function Ae(e){return e?e.__v_isRef===!0:!1}function ue(e){return Ul(e,!1)}function Ba(e){return Ul(e,!0)}function Ul(e,t){return Ae(e)?e:new Ua(e,t)}class Ua{constructor(t,s){this.dep=new Bo,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:pe(t),this._value=s?t:lt(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||Qe(t)||Rt(t);t=n?t:pe(t),vt(t,s)&&(this._rawValue=t,this._value=n?t:lt(t),this.dep.trigger())}}function O(e){return Ae(e)?e.value:e}const Ha={get:(e,t,s)=>t==="__v_raw"?e:O(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const o=e[t];return Ae(o)&&!Ae(s)?(o.value=s,!0):Reflect.set(e,t,s,n)}};function Hl(e){return Et(e)?e:new Proxy(e,Ha)}function Wa(e){const t=Y(e)?new Array(e.length):{};for(const s in e)t[s]=Ga(e,s);return t}class Ka{constructor(t,s,n){this._object=t,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=Ze(s)?s:String(s),this._raw=pe(t);let o=!0,r=t;if(!Y(t)||Ze(this._key)||!Rn(this._key))do o=!Vn(r)||Qe(r);while(o&&(r=r.__v_raw));this._shallow=o}get value(){let t=this._object[this._key];return this._shallow&&(t=O(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&Ae(this._raw[this._key])){const s=this._object[this._key];if(Ae(s)){s.value=t;return}}this._object[this._key]=t}get dep(){return Sa(this._raw,this._key)}}function Ga(e,t,s){return new Ka(e,t,s)}class qa{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Bo(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Gs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&we!==this)return Il(this,!0),!0}get value(){const t=this.dep.track();return Pl(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function za(e,t,s=!1){let n,o;return oe(e)?n=e:(n=e.get,o=e.set),new qa(n,o,s)}const un={},gn=new WeakMap;let Qt;function Ja(e,t=!1,s=Qt){if(s){let n=gn.get(s);n||gn.set(s,n=[]),n.push(e)}}function Ya(e,t,s=ke){const{immediate:n,deep:o,once:r,scheduler:l,augmentJob:i,call:a}=s,f=x=>o?x:Qe(x)||o===!1||o===0?St(x,1):St(x);let u,d,g,p,w=!1,C=!1;if(Ae(e)?(d=()=>e.value,w=Qe(e)):Et(e)?(d=()=>f(e),w=!0):Y(e)?(C=!0,w=e.some(x=>Et(x)||Qe(x)),d=()=>e.map(x=>{if(Ae(x))return x.value;if(Et(x))return f(x);if(oe(x))return a?a(x,2):x()})):oe(e)?t?d=a?()=>a(e,2):e:d=()=>{if(g){At();try{g()}finally{It()}}const x=Qt;Qt=u;try{return a?a(e,3,[p]):e(p)}finally{Qt=x}}:d=bt,t&&o){const x=d,k=o===!0?1/0:o;d=()=>St(x(),k)}const L=El(),R=()=>{u.stop(),L&&L.active&&No(L.effects,u)};if(r&&t){const x=t;t=(...k)=>{const G=x(...k);return R(),G}}let m=C?new Array(e.length).fill(un):un;const _=x=>{if(!(!(u.flags&1)||!u.dirty&&!x))if(t){const k=u.run();if(x||o||w||(C?k.some((G,j)=>vt(G,m[j])):vt(k,m))){g&&g();const G=Qt;Qt=u;try{const j=[k,m===un?void 0:C&&m[0]===un?[]:m,p];m=k,a?a(t,3,j):t(...j)}finally{Qt=G}}}else u.run()};return i&&i(_),u=new Tl(d),u.scheduler=l?()=>l(_,!1):_,p=x=>Ja(x,!1,u),g=u.onStop=()=>{const x=gn.get(u);if(x){if(a)a(x,4);else for(const k of x)k();gn.delete(u)}},t?n?_(!0):m=u.run():l?l(_.bind(null,!0),!0):u.run(),R.pause=u.pause.bind(u),R.resume=u.resume.bind(u),R.stop=R,R}function St(e,t=1/0,s){if(t<=0||!ve(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Ae(e))St(e.value,t,s);else if(Y(e))for(let n=0;n{St(n,t,s)});else if(bl(e)){for(const n in e)St(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&St(e[n],t,s)}return e}function nn(e,t,s,n){try{return n?e(...n):e()}catch(o){jn(o,t,s)}}function st(e,t,s,n){if(oe(e)){const o=nn(e,t,s,n);return o&&vl(o)&&o.catch(r=>{jn(r,t,s)}),o}if(Y(e)){const o=[];for(let r=0;r>>1,o=We[n],r=zs(o);r=zs(s)?We.push(e):We.splice(Za(t),0,e),e.flags|=1,Kl()}}function Kl(){vn||(vn=Wl.then(ql))}function Xa(e){if(!Y(e))Dt&&e.id===-1?Dt.splice(hs+1,0,e):e.flags&1||(_s.push(e),e.flags|=1);else for(let t=0;tzs(s)-zs(n));if(_s.length=0,Dt){for(let s=0;se.id==null?e.flags&2?-1:1/0:e.id;function ql(e){try{for(ht=0;ht{n._d&&wn(-1);const r=_n(t),l=Tt.length;let i;try{i=e(...o)}finally{for(let a=Tt.length;a>l;a--)Qo();_n(r),n._d&&wn(1)}return i};return n._n=!0,n._c=!0,n._d=!0,n}function be(e,t){if(Ne===null)return e;const s=Wn(Ne),n=e.dirs||(e.dirs=[]);for(let o=0;o1)return s&&oe(t)?t.call(n&&n.proxy):t}}function ec(){return!!(on()||ss)}const tc=Symbol.for("v-scx"),sc=()=>rt(tc);function Ge(e,t,s){return Jl(e,t,s)}function Jl(e,t,s=ke){const{immediate:n,deep:o,flush:r,once:l}=s,i=Re({},s),a=t&&n||!t&&r!=="post";let f;if(Xs){if(r==="sync"){const p=sc();f=p.__watcherHandles||(p.__watcherHandles=[])}else if(!a){const p=()=>{};return p.stop=bt,p.resume=bt,p.pause=bt,p}}const u=De;i.call=(p,w,C)=>st(p,u,w,C);let d=!1;r==="post"?i.scheduler=p=>{Ue(p,u&&u.suspense)}:r!=="sync"&&(d=!0,i.scheduler=(p,w)=>{w?p():Ko(p)}),i.augmentJob=p=>{t&&(p.flags|=4),d&&(p.flags|=2,u&&(p.id=u.uid,p.i=u))};const g=Ya(e,t,i);return Xs&&(f?f.push(g):a&&g()),g}function nc(e,t,s){const n=this.proxy,o=Ce(e)?e.includes(".")?Yl(n,e):()=>n[e]:e.bind(n,n);let r;oe(t)?r=t:(r=t.handler,s=t);const l=rn(this),i=Jl(o,r.bind(n),s);return l(),i}function Yl(e,t){const s=t.split(".");return()=>{let n=e;for(let o=0;oe.__isTeleport,Zt=e=>e&&(e.disabled||e.disabled===""),oc=e=>e&&(e.defer||e.defer===""),mr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,gr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,_o=(e,t)=>{const s=e&&e.to;return Ce(s)?t?t(s):null:s},rc={name:"Teleport",__isTeleport:!0,process(e,t,s,n,o,r,l,i,a,f){const{mc:u,pc:d,pbc:g,o:{insert:p,querySelector:w,createText:C,createComment:L,parentNode:R}}=f,m=Zt(t.props);let{dynamicChildren:_}=t;const x=(j,U,M)=>{j.shapeFlag&16&&u(j.children,U,M,o,r,l,i,a)},k=(j=t)=>{const U=Zt(j.props),M=j.target=_o(j.props,w),z=bo(M,j,C,p);M&&(l!=="svg"&&mr(M)?l="svg":l!=="mathml"&&gr(M)&&(l="mathml"),o&&o.isCE&&(o.ce._teleportTargets||(o.ce._teleportTargets=new Set)).add(M),U||(x(j,M,z),Ls(j,!1)))},G=j=>{const U=()=>{if(Nt.get(j)===U){if(Nt.delete(j),Zt(j.props)){const M=R(j.el)||s;x(j,M,j.anchor),Ls(j,!0)}k(j)}};Nt.set(j,U),Ue(U,r)};if(e==null){const j=t.el=C(""),U=t.anchor=C("");if(p(j,s,n),p(U,s,n),oc(t.props)||r&&r.pendingBranch){G(t);return}m&&(x(t,s,U),Ls(t,!0)),k()}else{t.el=e.el;const j=t.anchor=e.anchor,U=Nt.get(e);if(U){U.flags|=8,Nt.delete(e),G(t);return}t.targetStart=e.targetStart;const M=t.target=e.target,z=t.targetAnchor=e.targetAnchor,ne=Zt(e.props),D=ne?s:M,J=ne?j:z;if(l==="svg"||mr(M)?l="svg":(l==="mathml"||gr(M))&&(l="mathml"),_?(g(e.dynamicChildren,_,D,o,r,l,i),Yo(e,t,!0)):a||d(e,t,D,J,o,r,l,i,!1),m)ne?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):fn(t,s,j,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const $=_o(t.props,w);$&&(t.target=$,fn(t,$,null,f,0))}else ne&&fn(t,M,z,f,1);Ls(t,m)}},remove(e,t,s,{um:n,o:{remove:o}},r){const{shapeFlag:l,children:i,anchor:a,targetStart:f,targetAnchor:u,target:d,props:g}=e,p=Zt(g),w=r||!p,C=Nt.get(e);if(C&&(C.flags|=8,Nt.delete(e)),d&&(o(f),o(u)),r&&o(a),!C&&(p||d)&&l&16)for(let L=0;L{e.isMounted=!0}),ii(()=>{e.isUnmounting=!0}),e}const et=[Function,Array],Xl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:et,onEnter:et,onAfterEnter:et,onEnterCancelled:et,onBeforeLeave:et,onLeave:et,onAfterLeave:et,onLeaveCancelled:et,onBeforeAppear:et,onAppear:et,onAfterAppear:et,onAppearCancelled:et},ei=e=>{const t=e.subTree;return t.component?ei(t.component):t},ic={name:"BaseTransition",props:Xl,setup(e,{slots:t}){const s=on(),n=Zl();return()=>{const o=t.default&&qo(t.default(),!0),r=o&&o.length?ti(o):s.subTree?fe():void 0;if(!r)return;const l=pe(e),{mode:i}=l;if(n.isLeaving)return Zn(r);const a=bn(r);if(!a)return Zn(r);let f=Js(a,l,n,s,d=>f=d);a.type!==je&&ns(a,f);let u=s.subTree&&bn(s.subTree);if(u&&u.type!==je&&!Xt(u,a)&&ei(s).type!==je){let d=Js(u,l,n,s);if(ns(u,d),i==="out-in"&&a.type!==je)return n.isLeaving=!0,d.afterLeave=()=>{n.isLeaving=!1,s.job.flags&8||s.update(),delete d.afterLeave,u=void 0},Zn(r);i==="in-out"&&a.type!==je?d.delayLeave=(g,p,w)=>{const C=si(n,u);C[String(u.key)]=u,g[tt]=()=>{p(),g[tt]=void 0,delete f.delayedLeave,u=void 0},f.delayedLeave=()=>{w(),delete f.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return r}}};function ti(e){let t=e[0];if(e.length>1){for(const s of e)if(s.type!==je){t=s;break}}return t}const ac=ic;function si(e,t){const{leavingVNodes:s}=e;let n=s.get(t.type);return n||(n=Object.create(null),s.set(t.type,n)),n}function Js(e,t,s,n,o){const{appear:r,mode:l,persisted:i=!1,onBeforeEnter:a,onEnter:f,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:g,onLeave:p,onAfterLeave:w,onLeaveCancelled:C,onBeforeAppear:L,onAppear:R,onAfterAppear:m,onAppearCancelled:_}=t,x=String(e.key),k=si(s,e),G=(M,z)=>{M&&st(M,n,9,z)},j=(M,z)=>{const ne=z[1];G(M,z),Y(M)?M.every(D=>D.length<=1)&&ne():M.length<=1&&ne()},U={mode:l,persisted:i,beforeEnter(M){let z=a;if(!s.isMounted)if(r)z=L||a;else return;M[tt]&&M[tt](!0);const ne=k[x];ne&&Xt(e,ne)&&ne.el[tt]&&ne.el[tt](),G(z,[M])},enter(M){if(k[x]===e)return;let z=f,ne=u,D=d;if(!s.isMounted)if(r)z=R||f,ne=m||u,D=_||d;else return;let J=!1;M[$s]=ee=>{J||(J=!0,ee?G(D,[M]):G(ne,[M]),U.delayedLeave&&U.delayedLeave(),M[$s]=void 0)};const $=M[$s].bind(null,!1);z?j(z,[M,$]):$()},leave(M,z){const ne=String(e.key);if(M[$s]&&M[$s](!0),s.isUnmounting)return z();G(g,[M]);let D=!1;M[tt]=$=>{D||(D=!0,z(),$?G(C,[M]):G(w,[M]),M[tt]=void 0,k[ne]===e&&delete k[ne])};const J=M[tt].bind(null,!1);k[ne]=e,p?j(p,[M,J]):J()},clone(M){const z=Js(M,t,s,n,o);return o&&o(z),z}};return U}function Zn(e){if(Fn(e))return e=Ut(e),e.children=null,e}function bn(e){if(!Fn(e))return Dn(e.type)&&e.children?ti(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:s}=e;if(s){if(t&16)return s[0];if(t&32&&oe(s.default))return s.default()}}function ns(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const s=e.component.subTree;ns(Dn(s.type)&&bn(s)||s,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function qo(e,t=!1,s){let n=[],o=0;for(let r=0;r1)for(let r=0;rUs(C,t&&(Y(t)?t[L]:t),s,n,o));return}if(bs(n)&&!o){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Us(e,t,s,n.component.subTree);return}const r=n.shapeFlag&4?Wn(n.component):n.el,l=o?null:r,{i,r:a}=e,f=t&&t.r,u=i.refs===ke?i.refs={}:i.refs,d=i.setupState,g=pe(d),p=d===ke?gl:C=>vr(u,C)?!1:ge(g,C),w=(C,L)=>!(L&&vr(u,L));if(f!=null&&f!==a){if(_r(t),Ce(f))u[f]=null,p(f)&&(d[f]=null);else if(Ae(f)){const C=t;w(f,C.k)&&(f.value=null),C.k&&(u[C.k]=null)}}if(oe(a))nn(a,i,12,[l,u]);else{const C=Ce(a),L=Ae(a);if(C||L){const R=()=>{if(e.f){const m=C?p(a)?d[a]:u[a]:w()||!e.k?a.value:u[e.k];if(o)Y(m)&&No(m,r);else if(Y(m))m.includes(r)||m.push(r);else if(C)u[a]=[r],p(a)&&(d[a]=u[a]);else{const _=[r];w(a,e.k)&&(a.value=_),e.k&&(u[e.k]=_)}}else C?(u[a]=l,p(a)&&(d[a]=l)):L&&(w(a,e.k)&&(a.value=l),e.k&&(u[e.k]=l))};if(l){const m=()=>{R(),xn.delete(e)};m.id=-1,xn.set(e,m),Ue(m,s)}else _r(e),R()}}}function _r(e){const t=xn.get(e);t&&(t.flags|=8,xn.delete(e))}On().requestIdleCallback;On().cancelIdleCallback;const bs=e=>!!e.type.__asyncLoader,Fn=e=>e.type.__isKeepAlive;function cc(e,t){ri(e,"a",t)}function uc(e,t){ri(e,"da",t)}function ri(e,t,s=De){const n=e.__wdc||(e.__wdc=()=>{let o=s;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Bn(t,n,s),s){let o=s.parent;for(;o&&o.parent;)Fn(o.parent.vnode)&&fc(n,t,s,o),o=o.parent}}function fc(e,t,s,n){const o=Bn(t,e,n,!0);As(()=>{No(n[t],o)},s)}function Bn(e,t,s=De,n=!1){if(s){const o=s[e]||(s[e]=[]),r=t.__weh||(t.__weh=(...l)=>{At();const i=rn(s),a=st(t,s,e,l);return i(),It(),a});return n?o.unshift(r):o.push(r),r}}const Pt=e=>(t,s=De)=>{(!Xs||e==="sp")&&Bn(e,(...n)=>t(...n),s)},dc=Pt("bm"),ls=Pt("m"),pc=Pt("bu"),li=Pt("u"),ii=Pt("bum"),As=Pt("um"),hc=Pt("sp"),mc=Pt("rtg"),gc=Pt("rtc");function vc(e,t=De){Bn("ec",e,t)}const ai="components";function yn(e,t){return ui(ai,e,!0,t)||e}const ci=Symbol.for("v-ndc");function _c(e){return Ce(e)?ui(ai,e,!1)||e:e||ci}function ui(e,t,s=!0,n=!1){const o=Ne||De;if(o){const r=o.type;{const i=tu(r,!1);if(i&&(i===t||i===Ke(t)||i===Pn(Ke(t))))return r}const l=br(o[e]||r[e],t)||br(o.appContext[e],t);return!l&&n?r:l}}function br(e,t){return e&&(e[t]||e[Ke(t)]||e[Pn(Ke(t))])}function Ee(e,t,s,n){let o;const r=s,l=Y(e);if(l||Ce(e)){const i=l&&Et(e);let a=!1,f=!1;i&&(a=!Qe(e),f=Rt(e),e=Nn(e)),o=new Array(e.length);for(let u=0,d=e.length;ut(i,a,void 0,r));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,f=i.length;a0;return t!=="default"&&(f.name=t),y(),Me(ie,null,[ce("slot",f,n)],u?-2:64)}let l=e[t];l&&l._c&&(l._d=!1);const i=Tt.length;y();let a;try{const f=l&&fi(l(s)),u=s.key||r||f&&f.key;a=Me(ie,{key:(u&&!Ze(u)?u:`_${t}`)+(!f&&n?"_fb":"")},f||(n?n():[]),f&&e._===1?64:-2)}catch(f){for(let u=Tt.length;u>i;u--)Qo();throw f}finally{l&&l._c&&(l._d=!0)}return a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),a}function fi(e){return e.some(t=>Qs(t)?!(t.type===je||t.type===ie&&!fi(t.children)):!0)?e:null}const xo=e=>e?Ri(e)?Wn(e):xo(e.parent):null,Hs=Re(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>xo(e.parent),$root:e=>xo(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>pi(e),$forceUpdate:e=>e.f||(e.f=()=>{Ko(e.update)}),$nextTick:e=>e.n||(e.n=$t.bind(e.proxy)),$watch:e=>nc.bind(e)}),eo=(e,t)=>e!==ke&&!e.__isScriptSetup&&ge(e,t),bc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:o,props:r,accessCache:l,type:i,appContext:a}=e;if(t[0]!=="$"){const g=l[t];if(g!==void 0)switch(g){case 1:return n[t];case 2:return o[t];case 4:return s[t];case 3:return r[t]}else{if(eo(n,t))return l[t]=1,n[t];if(o!==ke&&ge(o,t))return l[t]=2,o[t];if(ge(r,t))return l[t]=3,r[t];if(s!==ke&&ge(s,t))return l[t]=4,s[t];yo&&(l[t]=0)}}const f=Hs[t];let u,d;if(f)return t==="$attrs"&&Ve(e.attrs,"get",""),f(e);if((u=i.__cssModules)&&(u=u[t]))return u;if(s!==ke&&ge(s,t))return l[t]=4,s[t];if(d=a.config.globalProperties,ge(d,t))return d[t]},set({_:e},t,s){const{data:n,setupState:o,ctx:r}=e;return eo(o,t)?(o[t]=s,!0):n!==ke&&ge(n,t)?(n[t]=s,!0):ge(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:o,props:r,type:l}},i){let a;return!!(s[i]||e!==ke&&i[0]!=="$"&&ge(e,i)||eo(t,i)||ge(r,i)||ge(n,i)||ge(Hs,i)||ge(o.config.globalProperties,i)||(a=l.__cssModules)&&a[i])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:ge(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function xr(e){return Y(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let yo=!0;function xc(e){const t=pi(e),s=e.proxy,n=e.ctx;yo=!1,t.beforeCreate&&yr(t.beforeCreate,e,"bc");const{data:o,computed:r,methods:l,watch:i,provide:a,inject:f,created:u,beforeMount:d,mounted:g,beforeUpdate:p,updated:w,activated:C,deactivated:L,beforeDestroy:R,beforeUnmount:m,destroyed:_,unmounted:x,render:k,renderTracked:G,renderTriggered:j,errorCaptured:U,serverPrefetch:M,expose:z,inheritAttrs:ne,components:D,directives:J,filters:$}=t;if(f&&yc(f,n,null),l)for(const te in l){const le=l[te];oe(le)&&(n[te]=le.bind(s))}if(o){const te=o.call(s,s);ve(te)&&(e.data=rs(te))}if(yo=!0,r)for(const te in r){const le=r[te],Fe=oe(le)?le.bind(s,s):oe(le.get)?le.get.bind(s,s):bt,qe=!oe(le)&&oe(le.set)?le.set.bind(s):bt,at=xe({get:Fe,set:qe});Object.defineProperty(n,te,{enumerable:!0,configurable:!0,get:()=>at.value,set:ze=>at.value=ze})}if(i)for(const te in i)di(i[te],n,s,te);if(a){const te=oe(a)?a.call(s):a;Reflect.ownKeys(te).forEach(le=>{Bs(le,te[le])})}u&&yr(u,e,"c");function ae(te,le){Y(le)?le.forEach(Fe=>te(Fe.bind(s))):le&&te(le.bind(s))}if(ae(dc,d),ae(ls,g),ae(pc,p),ae(li,w),ae(cc,C),ae(uc,L),ae(vc,U),ae(gc,G),ae(mc,j),ae(ii,m),ae(As,x),ae(hc,M),Y(z))if(z.length){const te=e.exposed||(e.exposed={});z.forEach(le=>{Object.defineProperty(te,le,{get:()=>s[le],set:Fe=>s[le]=Fe,enumerable:!0})})}else e.exposed||(e.exposed={});k&&e.render===bt&&(e.render=k),ne!=null&&(e.inheritAttrs=ne),D&&(e.components=D),J&&(e.directives=J),M&&oi(e)}function yc(e,t,s=bt){Y(e)&&(e=ko(e));for(const n in e){const o=e[n];let r;ve(o)?"default"in o?r=rt(o.from||n,o.default,!0):r=rt(o.from||n):r=rt(o),Ae(r)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):t[n]=r}}function yr(e,t,s){st(Y(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function di(e,t,s,n){let o=n.includes(".")?Yl(s,n):()=>s[n];if(Ce(e)){const r=t[e];oe(r)&&Ge(o,r)}else if(oe(e))Ge(o,e.bind(s));else if(ve(e))if(Y(e))e.forEach(r=>di(r,t,s,n));else{const r=oe(e.handler)?e.handler.bind(s):t[e.handler];oe(r)&&Ge(o,r,e)}}function pi(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:l}}=e.appContext,i=r.get(t);let a;return i?a=i:!o.length&&!s&&!n?a=t:(a={},o.length&&o.forEach(f=>kn(a,f,l,!0)),kn(a,t,l)),ve(t)&&r.set(t,a),a}function kn(e,t,s,n=!1){const{mixins:o,extends:r}=t;r&&kn(e,r,s,!0),o&&o.forEach(l=>kn(e,l,s,!0));for(const l in t)if(!(n&&l==="expose")){const i=kc[l]||s&&s[l];e[l]=i?i(e[l],t[l]):t[l]}return e}const kc={data:kr,props:wr,emits:wr,methods:Ns,computed:Ns,beforeCreate:Be,created:Be,beforeMount:Be,mounted:Be,beforeUpdate:Be,updated:Be,beforeDestroy:Be,beforeUnmount:Be,destroyed:Be,unmounted:Be,activated:Be,deactivated:Be,errorCaptured:Be,serverPrefetch:Be,components:Ns,directives:Ns,watch:Cc,provide:kr,inject:wc};function kr(e,t){return t?e?function(){return Re(oe(e)?e.call(this,this):e,oe(t)?t.call(this,this):t)}:t:e}function wc(e,t){return Ns(ko(e),ko(t))}function ko(e){if(Y(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ke(t)}Modifiers`]||e[`${os(t)}Modifiers`];function Ac(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||ke;let o=s;const r=t.startsWith("update:"),l=r&&Tc(n,t.slice(7));l&&(l.trim&&(o=s.map(u=>Ce(u)?u.trim():u)),l.number&&(o=s.map(Mn)));let i,a=n[i=qn(t)]||n[i=qn(Ke(t))];!a&&r&&(a=n[i=qn(os(t))]),a&&st(a,e,6,o);const f=n[i+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[i])return;e.emitted[i]=!0,st(f,e,6,o)}}const Ic=new WeakMap;function mi(e,t,s=!1){const n=s?Ic:t.emitsCache,o=n.get(e);if(o!==void 0)return o;const r=e.emits;let l={},i=!1;if(!oe(e)){const a=f=>{const u=mi(f,t,!0);u&&(i=!0,Re(l,u))};!s&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!r&&!i?(ve(e)&&n.set(e,null),null):(Y(r)?r.forEach(a=>l[a]=null):Re(l,r),ve(e)&&n.set(e,l),l)}function Un(e,t){return!e||!An(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),ge(e,t[0].toLowerCase()+t.slice(1))||ge(e,os(t))||ge(e,t))}function Cr(e){const{type:t,vnode:s,proxy:n,withProxy:o,propsOptions:[r],slots:l,attrs:i,emit:a,render:f,renderCache:u,props:d,data:g,setupState:p,ctx:w,inheritAttrs:C}=e,L=_n(e);let R,m;try{if(s.shapeFlag&4){const x=o||n,k=x;R=gt(f.call(k,x,u,d,p,g,w)),m=i}else{const x=t;R=gt(x.length>1?x(d,{attrs:i,slots:l,emit:a}):x(d,null)),m=t.props?i:Rc(i)}}catch(x){Tt.length=0,jn(x,e,1),R=ce(je)}let _=R;if(m&&C!==!1){const x=Object.keys(m),{shapeFlag:k}=_;x.length&&k&7&&(r&&x.some(In)&&(m=$c(m,r)),_=Ut(_,m,!1,!0))}if(s.dirs&&(_=Ut(_,null,!1,!0),_.dirs=_.dirs?_.dirs.concat(s.dirs):s.dirs),s.transition){const x=Dn(_.type)&&bn(_)||_;ns(x,s.transition)}return R=_,_n(L),R}const Rc=e=>{let t;for(const s in e)(s==="class"||s==="style"||An(s))&&((t||(t={}))[s]=e[s]);return t},$c=(e,t)=>{const s={};for(const n in e)(!In(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Pc(e,t,s){const{props:n,children:o,component:r}=e,{props:l,children:i,patchFlag:a}=t,f=r.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&a>=0){if(a&1024)return!0;if(a&16)return n?Sr(n,l,f):!!l;if(a&8){const u=t.dynamicProps;for(let d=0;dObject.create(vi),bi=e=>Object.getPrototypeOf(e)===vi;function Oc(e,t,s,n=!1){const o={},r=_i();e.propsDefaults=Object.create(null),xi(e,t,o,r);for(const l in e.propsOptions[0])l in o||(o[l]=void 0);s?e.props=n?o:Bl(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function Lc(e,t,s,n){const{props:o,attrs:r,vnode:{patchFlag:l}}=e,i=pe(o),[a]=e.propsOptions;let f=!1;if((n||l>0)&&!(l&16)){if(l&8){const u=e.vnode.dynamicProps;for(let d=0;d{a=!0;const[g,p]=yi(d,t,!0);Re(l,g),p&&i.push(...p)};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!r&&!a)return ve(e)&&n.set(e,gs),gs;if(Y(r))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Jo=e=>Y(e)?e.map(gt):[gt(e)],Vc=(e,t,s)=>{if(t._n)return t;const n=Se((...o)=>Jo(t(...o)),s);return n._c=!1,n},ki=(e,t,s)=>{const n=e._ctx;for(const o in e){if(zo(o))continue;const r=e[o];if(oe(r))t[o]=Vc(o,r,n);else if(r!=null){const l=Jo(r);t[o]=()=>l}}},wi=(e,t)=>{const s=Jo(t);e.slots.default=()=>s},Ci=(e,t,s)=>{for(const n in t)(s||!zo(n))&&(e[n]=t[n])},jc=(e,t,s)=>{const n=e.slots=_i();if(e.vnode.shapeFlag&32){const o=t._;o?(Ci(n,t,s),s&&xl(n,"_",o,!0)):ki(t,n)}else t&&wi(e,t)},Dc=(e,t,s)=>{const{vnode:n,slots:o}=e;let r=!0,l=ke;if(n.shapeFlag&32){const i=t._;i?s&&i===1?r=!1:Ci(o,t,s):(r=!t.$stable,ki(t,o)),l=t}else t&&(wi(e,t),l={default:1});if(r)for(const i in o)!zo(i)&&l[i]==null&&delete o[i]},Ue=Wc;function Fc(e){return Bc(e)}function Bc(e,t){const s=On();s.__VUE__=!0;const{insert:n,remove:o,patchProp:r,createElement:l,createText:i,createComment:a,setText:f,setElementText:u,parentNode:d,nextSibling:g,setScopeId:p=bt,insertStaticContent:w}=e,C=(h,v,b,T=null,I=null,S=null,F=void 0,V=null,N=!!v.dynamicChildren)=>{if(h===v)return;h&&!Xt(h,v)&&(T=A(h),ze(h,I,S,!0),h=null),v.patchFlag===-2&&(N=!1,v.dynamicChildren=null);const{type:P,ref:X,shapeFlag:W}=v;switch(P){case Hn:L(h,v,b,T);break;case je:R(h,v,b,T);break;case so:h==null&&m(v,b,T,F);break;case ie:D(h,v,b,T,I,S,F,V,N);break;default:W&1?k(h,v,b,T,I,S,F,V,N):W&6?J(h,v,b,T,I,S,F,V,N):(W&64||W&128)&&P.process(h,v,b,T,I,S,F,V,N,Q)}X!=null&&I?Us(X,h&&h.ref,S,v||h,!v):X==null&&h&&h.ref!=null&&Us(h.ref,null,S,h,!0)},L=(h,v,b,T)=>{if(h==null)n(v.el=i(v.children),b,T);else{const I=v.el=h.el;v.children!==h.children&&f(I,v.children)}},R=(h,v,b,T)=>{h==null?n(v.el=a(v.children||""),b,T):v.el=h.el},m=(h,v,b,T)=>{[h.el,h.anchor]=w(h.children,v,b,T,h.el,h.anchor)},_=({el:h,anchor:v},b,T)=>{let I;for(;h&&h!==v;)I=g(h),n(h,b,T),h=I;n(v,b,T)},x=({el:h,anchor:v})=>{let b;for(;h&&h!==v;)b=g(h),o(h),h=b;o(v)},k=(h,v,b,T,I,S,F,V,N)=>{if(v.type==="svg"?F="svg":v.type==="math"&&(F="mathml"),h==null)G(v,b,T,I,S,F,V,N);else{const P=h.el&&h.el._isVueCE?h.el:null;try{P&&P._beginPatch(),M(h,v,I,S,F,V,N)}finally{P&&P._endPatch()}}},G=(h,v,b,T,I,S,F,V)=>{let N,P;const{props:X,shapeFlag:W,transition:Z,dirs:se}=h;if(N=h.el=l(h.type,S,X&&X.is,X),W&8?u(N,h.children):W&16&&U(h.children,N,null,T,I,to(h,S),F,V),se&&Kt(h,null,T,"created"),j(N,h,h.scopeId,F,T),X){for(const ye in X)ye!=="value"&&!js(ye)&&r(N,ye,null,X[ye],S,T);"value"in X&&r(N,"value",null,X.value,S),(P=X.onVnodeBeforeMount)&&dt(P,T,h)}se&&Kt(h,null,T,"beforeMount");const he=Uc(I,Z);he&&Z.beforeEnter(N),n(N,v,b),((P=X&&X.onVnodeMounted)||he||se)&&Ue(()=>{P&&dt(P,T,h),he&&Z.enter(N),se&&Kt(h,null,T,"mounted")},I)},j=(h,v,b,T,I)=>{if(b&&p(h,b),T)for(let S=0;S{for(let P=N;P{const V=v.el=h.el;let{patchFlag:N,dynamicChildren:P,dirs:X}=v;N|=h.patchFlag&16;const W=h.props||ke,Z=v.props||ke;let se;if(b&&Gt(b,!1),(se=Z.onVnodeBeforeUpdate)&&dt(se,b,v,h),X&&Kt(v,h,b,"beforeUpdate"),b&&Gt(b,!0),P&&(!h.dynamicChildren||h.dynamicChildren.length!==P.length)&&(N=0,F=!1,P=null),(W.innerHTML&&Z.innerHTML==null||W.textContent&&Z.textContent==null)&&u(V,""),P?z(h.dynamicChildren,P,V,b,T,to(v,I),S):F||le(h,v,V,null,b,T,to(v,I),S,!1),N>0){if(N&16)ne(V,W,Z,b,I);else if(N&2&&W.class!==Z.class&&r(V,"class",null,Z.class,I),N&4&&r(V,"style",W.style,Z.style,I),N&8){const he=v.dynamicProps;for(let ye=0;ye{se&&dt(se,b,v,h),X&&Kt(v,h,b,"updated")},T)},z=(h,v,b,T,I,S,F)=>{for(let V=0;V{if(v!==b){if(v!==ke)for(const S in v)!js(S)&&!(S in b)&&r(h,S,v[S],null,I,T);for(const S in b){if(js(S))continue;const F=b[S],V=v[S];F!==V&&S!=="value"&&r(h,S,V,F,I,T)}"value"in b&&r(h,"value",v.value,b.value,I)}},D=(h,v,b,T,I,S,F,V,N)=>{const P=v.el=h?h.el:i(""),X=v.anchor=h?h.anchor:i("");let{patchFlag:W,dynamicChildren:Z,slotScopeIds:se}=v;se&&(V=V?V.concat(se):se),h==null?(n(P,b,T),n(X,b,T),U(v.children||[],b,X,I,S,F,V,N)):W>0&&W&64&&Z&&h.dynamicChildren&&h.dynamicChildren.length===Z.length?(z(h.dynamicChildren,Z,b,I,S,F,V),(v.key!=null||I&&v===I.subTree)&&Yo(h,v,!0)):le(h,v,b,X,I,S,F,V,N)},J=(h,v,b,T,I,S,F,V,N)=>{v.slotScopeIds=V,h==null?v.shapeFlag&512?I.ctx.activate(v,b,T,F,N):$(v,b,T,I,S,F,N):ee(h,v,N)},$=(h,v,b,T,I,S,F)=>{const V=h.component=Yc(h,T,I);if(Fn(h)&&(V.ctx.renderer=Q),Qc(V,!1,F),V.asyncDep){if(I&&I.registerDep(V,ae,F),!h.el){const N=V.subTree=ce(je);R(null,N,v,b),h.placeholder=N.el}}else ae(V,h,v,b,I,S,F)},ee=(h,v,b)=>{const T=v.component=h.component;if(Pc(h,v,b))if(T.asyncDep&&!T.asyncResolved){te(T,v,b);return}else T.next=v,T.update();else v.el=h.el,T.vnode=v},ae=(h,v,b,T,I,S,F)=>{const V=()=>{if(h.isMounted){let{next:W,bu:Z,u:se,parent:he,vnode:ye}=h;{const ut=Si(h);if(ut){W&&(W.el=ye.el,te(h,W,F)),ut.asyncDep.then(()=>{Ue(()=>{h.isUnmounted||P()},I)});return}}let _e=W,Ie;Gt(h,!1),W?(W.el=ye.el,te(h,W,F)):W=ye,Z&&pn(Z),(Ie=W.props&&W.props.onVnodeBeforeUpdate)&&dt(Ie,he,W,ye),Gt(h,!0);const Oe=Cr(h),ct=h.subTree;h.subTree=Oe,C(ct,Oe,d(ct.el),A(ct),h,I,S),W.el=Oe.el,_e===null&&Mc(h,Oe.el),se&&Ue(se,I),(Ie=W.props&&W.props.onVnodeUpdated)&&Ue(()=>dt(Ie,he,W,ye),I)}else{let W;const{el:Z,props:se}=v,{bm:he,m:ye,parent:_e,root:Ie,type:Oe}=h,ct=bs(v);Gt(h,!1),he&&pn(he),!ct&&(W=se&&se.onVnodeBeforeMount)&&dt(W,_e,v),Gt(h,!0);{Ie.ce&&Ie.ce._hasShadowRoot()&&Ie.ce._injectChildStyle(Oe,h.parent?h.parent.type:void 0);const ut=h.subTree=Cr(h);C(null,ut,b,T,h,I,S),v.el=ut.el}if(ye&&Ue(ye,I),!ct&&(W=se&&se.onVnodeMounted)){const ut=v;Ue(()=>dt(W,_e,ut),I)}(v.shapeFlag&256||_e&&bs(_e.vnode)&&_e.vnode.shapeFlag&256)&&h.a&&Ue(h.a,I),h.isMounted=!0,v=b=T=null}};h.scope.on();const N=h.effect=new Tl(V);h.scope.off();const P=h.update=N.run.bind(N),X=h.job=N.runIfDirty.bind(N);X.i=h,X.id=h.uid,N.scheduler=()=>Ko(X),Gt(h,!0),P()},te=(h,v,b)=>{v.component=h;const T=h.vnode.props;h.vnode=v,h.next=null,Lc(h,v.props,T,b),Dc(h,v.children,b),At(),hr(h),It()},le=(h,v,b,T,I,S,F,V,N=!1)=>{const P=h&&h.children,X=h?h.shapeFlag:0,W=v.children,{patchFlag:Z,shapeFlag:se}=v;if(Z>0){if(Z&128){qe(P,W,b,T,I,S,F,V,N);return}else if(Z&256){Fe(P,W,b,T,I,S,F,V,N);return}}se&8?(X&16&&Xe(P,I,S),W!==P&&u(b,W)):X&16?se&16?qe(P,W,b,T,I,S,F,V,N):Xe(P,I,S,!0):(X&8&&u(b,""),se&16&&U(W,b,T,I,S,F,V,N))},Fe=(h,v,b,T,I,S,F,V,N)=>{h=h||gs,v=v||gs;const P=h.length,X=v.length,W=Math.min(P,X);let Z;for(Z=0;ZX?Xe(h,I,S,!0,!1,W):U(v,b,T,I,S,F,V,N,W)},qe=(h,v,b,T,I,S,F,V,N)=>{let P=0;const X=v.length;let W=h.length-1,Z=X-1;for(;P<=W&&P<=Z;){const se=h[P],he=v[P]=N?wt(v[P]):gt(v[P]);if(Xt(se,he))C(se,he,b,null,I,S,F,V,N);else break;P++}for(;P<=W&&P<=Z;){const se=h[W],he=v[Z]=N?wt(v[Z]):gt(v[Z]);if(Xt(se,he))C(se,he,b,null,I,S,F,V,N);else break;W--,Z--}if(P>W){if(P<=Z){const se=Z+1,he=seZ)for(;P<=W;)ze(h[P],I,S,!0),P++;else{const se=P,he=P,ye=new Map;for(P=he;P<=Z;P++){const Je=v[P]=N?wt(v[P]):gt(v[P]);Je.key!=null&&ye.set(Je.key,P)}let _e,Ie=0;const Oe=Z-he+1;let ct=!1,ut=0;const Is=new Array(Oe);for(P=0;P=Oe){ze(Je,I,S,!0);continue}let ft;if(Je.key!=null)ft=ye.get(Je.key);else for(_e=he;_e<=Z;_e++)if(Is[_e-he]===0&&Xt(Je,v[_e])){ft=_e;break}ft===void 0?ze(Je,I,S,!0):(Is[ft-he]=P+1,ft>=ut?ut=ft:ct=!0,C(Je,v[ft],b,null,I,S,F,V,N),Ie++)}const ir=ct?Hc(Is):gs;for(_e=ir.length-1,P=Oe-1;P>=0;P--){const Je=he+P,ft=v[Je],ar=v[Je+1],cr=Je+1{const{el:S,type:F,transition:V,children:N,shapeFlag:P}=h;if(P&6){at(h.component.subTree,v,b,T);return}if(P&128){h.suspense.move(v,b,T);return}if(P&64){F.move(h,v,b,Q);return}if(F===ie){n(S,v,b);for(let W=0;WV.enter(S),I));else{const{leave:W,delayLeave:Z,afterLeave:se}=V,he=()=>{h.ctx.isUnmounted?o(S):n(S,v,b)},ye=()=>{const _e=S._isLeaving||!!S[tt];S._isLeaving&&S[tt](!0),V.persisted&&!_e?he():W(S,()=>{he(),se&&se()})};Z?Z(S,he,ye):ye()}else n(S,v,b)},ze=(h,v,b,T=!1,I=!1)=>{const{type:S,props:F,ref:V,children:N,dynamicChildren:P,shapeFlag:X,patchFlag:W,dirs:Z,cacheIndex:se,memo:he}=h;if(W===-2&&(I=!1),V!=null&&(At(),Us(V,null,b,h,!0),It()),se!=null&&(v.renderCache[se]=void 0),X&256){v.ctx.deactivate(h);return}const ye=X&1&&Z,_e=!bs(h);let Ie;if(_e&&(Ie=F&&F.onVnodeBeforeUnmount)&&dt(Ie,v,h),X&6)Wt(h.component,b,T);else{if(X&128){h.suspense.unmount(b,T);return}ye&&Kt(h,null,v,"beforeUnmount"),X&64?h.type.remove(h,v,b,Q,T):P&&!P.hasOnce&&(S!==ie||W>0&&W&64)?Xe(P,v,b,!1,!0):(S===ie&&W&384||!I&&X&16)&&Xe(N,v,b),T&&as(h)}const Oe=he!=null&&se==null;(_e&&(Ie=F&&F.onVnodeUnmounted)||ye||Oe)&&Ue(()=>{Ie&&dt(Ie,v,h),ye&&Kt(h,null,v,"unmounted"),Oe&&(h.el=null)},b)},as=h=>{const{type:v,el:b,anchor:T,transition:I}=h;if(v===ie){cs(b,T);return}if(v===so){x(h);return}const S=()=>{o(b),I&&!I.persisted&&I.afterLeave&&I.afterLeave()};if(h.shapeFlag&1&&I&&!I.persisted){const{leave:F,delayLeave:V}=I,N=()=>F(b,S);V?V(h.el,S,N):N()}else S()},cs=(h,v)=>{let b;for(;h!==v;)b=g(h),o(h),h=b;o(v)},Wt=(h,v,b)=>{const{bum:T,scope:I,job:S,subTree:F,um:V,m:N,a:P}=h;Tr(N),Tr(P),T&&pn(T),I.stop(),S&&(S.flags|=8,ze(F,h,v,b)),V&&Ue(V,v),Ue(()=>{h.isUnmounted=!0},v)},Xe=(h,v,b,T=!1,I=!1,S=0)=>{for(let F=S;F{if(h.shapeFlag&6)return A(h.component.subTree);if(h.shapeFlag&128)return h.suspense.next();const v=g(h.anchor||h.el),b=v&&v[Ql];return b?g(b):v};let K=!1;const H=(h,v,b)=>{let T;h==null?v._vnode&&(ze(v._vnode,null,null,!0),T=v._vnode.component):C(v._vnode||null,h,v,null,null,null,b),v._vnode=h,K||(K=!0,hr(T),Gl(),K=!1)},Q={p:C,um:ze,m:at,r:as,mt:$,mc:U,pc:le,pbc:z,n:A,o:e};return{render:H,hydrate:void 0,createApp:Ec(H)}}function to({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function Gt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Uc(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Yo(e,t,s=!1){const n=e.children,o=t.children;if(Y(n)&&Y(o))for(let r=0;r>1,e[s[i]]0&&(t[n]=s[r-1]),s[r]=n)}}for(r=s.length,l=s[r-1];r-- >0;)s[r]=l,l=t[l];return s}function Si(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Si(t)}function Tr(e){if(e)for(let t=0;te.__isSuspense;function Wc(e,t){t&&t.pendingBranch?Y(e)?t.effects.push(...e):t.effects.push(e):Xa(e)}const ie=Symbol.for("v-fgt"),Hn=Symbol.for("v-txt"),je=Symbol.for("v-cmt"),so=Symbol.for("v-stc"),Tt=[];let Ye=null;function y(e=!1){Tt.push(Ye=e?null:[])}function Qo(){Tt.pop(),Ye=Tt[Tt.length-1]||null}let Ys=1;function wn(e,t=!1){Ys+=e,e<0&&Ye&&t&&(Ye.hasOnce=!0)}function Ai(e){return e.dynamicChildren=Ys>0?Ye||gs:null,Qo(),Ys>0&&Ye&&Ye.push(e),e}function E(e,t,s,n,o,r){return Ai(c(e,t,s,n,o,r,!0))}function Me(e,t,s,n,o){return Ai(ce(e,t,s,n,o,!0))}function Qs(e){return e?e.__v_isVNode===!0:!1}function Xt(e,t){return e.type===t.type&&e.key===t.key}const Ii=({key:e})=>e??null,hn=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Ce(e)||Ae(e)||oe(e)?{i:Ne,r:e,k:t,f:!!s}:e:null);function c(e,t=null,s=null,n=0,o=null,r=e===ie?0:1,l=!1,i=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ii(t),ref:t&&hn(t),scopeId:zl,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:n,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Ne};return i?(Cn(a,s),r&128&&e.normalize(a)):s&&(a.shapeFlag|=Ce(s)?8:16),Ys>0&&!l&&Ye&&(a.patchFlag>0||r&6)&&a.patchFlag!==32&&Ye.push(a),a}const ce=Kc;function Kc(e,t=null,s=null,n=0,o=null,r=!1){if((!e||e===ci)&&(e=je),Qs(e)){const i=Ut(e,t,!0);return s&&Cn(i,s),Ys>0&&!r&&Ye&&(i.shapeFlag&6?Ye[Ye.indexOf(e)]=i:Ye.push(i)),i.patchFlag=-2,i}if(su(e)&&(e=e.__vccOpts),t){t=Gc(t);let{class:i,style:a}=t;i&&!Ce(i)&&(t.class=q(i)),ve(a)&&(Vn(a)&&!Y(a)&&(a=Re({},a)),t.style=Ln(a))}const l=Ce(e)?1:Ti(e)?128:Dn(e)?64:ve(e)?4:oe(e)?2:0;return c(e,t,s,n,o,l,r,!0)}function Gc(e){return e?Vn(e)||bi(e)?Re({},e):e:null}function Ut(e,t,s=!1,n=!1){const{props:o,ref:r,patchFlag:l,children:i,transition:a}=e,f=t?qc(o||{},t):o,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&Ii(f),ref:t&&t.ref?s&&r?Y(r)?r.concat(hn(t)):[r,hn(t)]:hn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ie?l===-1?16:l|16:l,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ut(e.ssContent),ssFallback:e.ssFallback&&Ut(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&n&&ns(u,a.clone(u)),u}function re(e=" ",t=0){return ce(Hn,null,e,t)}function fe(e="",t=!1){return t?(y(),Me(je,null,e)):ce(je,null,e)}function gt(e){return e==null||typeof e=="boolean"?ce(je):Y(e)?ce(ie,null,e.slice()):Qs(e)?wt(e):ce(Hn,null,String(e))}function wt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ut(e)}function Cn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(Y(t))s=16;else if(typeof t=="object")if(n&65){const o=t.default;o&&(o._c&&(o._d=!1),Cn(e,o()),o._c&&(o._d=!0));return}else{s=32;const o=t._;!o&&!bi(t)?t._ctx=Ne:o===3&&Ne&&(Ne.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(oe(t)){if(n&65){Cn(e,{default:t});return}t={default:t,_ctx:Ne},s=32}else t=String(t),n&64?(s=16,t=[re(t)]):s=8;e.children=t,e.shapeFlag|=s}function qc(...e){const t={};for(let s=0;sDe||Ne;let Sn,Zs;{const e=On(),t=(s,n)=>{let o;return(o=e[s])||(o=e[s]=[]),o.push(n),r=>{o.length>1?o.forEach(l=>l(r)):o[0](r)}};Sn=t("__VUE_INSTANCE_SETTERS__",s=>De=s),Zs=t("__VUE_SSR_SETTERS__",s=>Xs=s)}const rn=e=>{const t=De;return Sn(e),e.scope.on(),()=>{e.scope.off(),Sn(t)}},Ar=()=>{De&&De.scope.off(),Sn(null)};function Ri(e){return e.vnode.shapeFlag&4}let Xs=!1;function Qc(e,t=!1,s=!1){t&&Zs(t);const{props:n,children:o}=e.vnode,r=Ri(e);Oc(e,n,r,t),jc(e,o,s||t);const l=r?Zc(e,t):void 0;return t&&Zs(!1),l}function Zc(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,bc);const{setup:n}=s;if(n){At();const o=e.setupContext=n.length>1?eu(e):null,r=rn(e),l=nn(n,e,0,[e.props,o]),i=vl(l);if(It(),r(),(i||e.sp)&&!bs(e)&&oi(e),i){if(l.then(Ar,Ar),t)return l.then(a=>{Zs(!0);try{Ir(e,a,t)}finally{Zs(!1)}}).catch(a=>{jn(a,e,0)});e.asyncDep=l}else Ir(e,l)}else $i(e)}function Ir(e,t,s){oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ve(t)&&(e.setupState=Hl(t)),$i(e)}function $i(e,t,s){const n=e.type;e.render||(e.render=n.render||bt);{const o=rn(e);At();try{xc(e)}finally{It(),o()}}}const Xc={get(e,t){return Ve(e,"get",""),e[t]}};function eu(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,Xc),slots:e.slots,emit:e.emit,expose:t}}function Wn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Hl(Wo(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in Hs)return Hs[s](e)},has(t,s){return s in t||s in Hs}})):e.proxy}function tu(e,t=!0){return oe(e)?e.displayName||e.name:e.name||t&&e.__name}function su(e){return oe(e)&&"__vccOpts"in e}const xe=(e,t)=>za(e,t,Xs);function Zo(e,t,s){try{wn(-1);const n=arguments.length;return n===2?ve(t)&&!Y(t)?Qs(t)?ce(e,null,[t]):ce(e,t):ce(e,null,t):(n>3?s=Array.prototype.slice.call(arguments,2):n===3&&Qs(s)&&(s=[s]),ce(e,t,s))}finally{wn(1)}}const nu="3.5.41";let Co;const Rr=typeof window<"u"&&window.trustedTypes;if(Rr)try{Co=Rr.createPolicy("vue",{createHTML:e=>e})}catch{}const Pi=Co?e=>Co.createHTML(e):e=>e,ou="http://www.w3.org/2000/svg",ru="http://www.w3.org/1998/Math/MathML",kt=typeof document<"u"?document:null,$r=kt&&kt.createElement("template"),lu={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const o=t==="svg"?kt.createElementNS(ou,e):t==="mathml"?kt.createElementNS(ru,e):s?kt.createElement(e,{is:s}):kt.createElement(e);return e==="select"&&n&&n.multiple!=null&&o.setAttribute("multiple",n.multiple),o},createText:e=>kt.createTextNode(e),createComment:e=>kt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>kt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,o,r){const l=s?s.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),s),!(o===r||!(o=o.nextSibling)););else{$r.innerHTML=Pi(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const i=$r.content;if(n==="svg"||n==="mathml"){const a=i.firstChild;for(;a.firstChild;)i.appendChild(a.firstChild);i.removeChild(a)}t.insertBefore(i,s)}return[l?l.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Mt="transition",Ps="animation",ks=Symbol("_vtc"),Mi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Oi=Re({},Xl,Mi),iu=e=>(e.displayName="Transition",e.props=Oi,e),So=iu((e,{slots:t})=>Zo(ac,Li(e),t)),qt=(e,t=[])=>{Y(e)?e.forEach(s=>s(...t)):e&&e(...t)},Pr=e=>e?Y(e)?e.some(t=>t.length>1):e.length>1:!1;function Li(e){const t={};for(const D in e)D in Mi||(t[D]=e[D]);if(e.css===!1)return t;const{name:s="v",type:n,duration:o,enterFromClass:r=`${s}-enter-from`,enterActiveClass:l=`${s}-enter-active`,enterToClass:i=`${s}-enter-to`,appearFromClass:a=r,appearActiveClass:f=l,appearToClass:u=i,leaveFromClass:d=`${s}-leave-from`,leaveActiveClass:g=`${s}-leave-active`,leaveToClass:p=`${s}-leave-to`}=e,w=au(o),C=w&&w[0],L=w&&w[1],{onBeforeEnter:R,onEnter:m,onEnterCancelled:_,onLeave:x,onLeaveCancelled:k,onBeforeAppear:G=R,onAppear:j=m,onAppearCancelled:U=_}=t,M=(D,J,$,ee)=>{D._enterCancelled=ee,Vt(D,J?u:i),Vt(D,J?f:l),$&&$()},z=(D,J)=>{D._isLeaving=!1,Vt(D,d),Vt(D,p),Vt(D,g),J&&J()},ne=D=>(J,$)=>{const ee=D?j:m,ae=()=>M(J,D,$);qt(ee,[J,ae]),Mr(()=>{Vt(J,D?a:r),pt(J,D?u:i),Pr(ee)||Or(J,n,C,ae)})};return Re(t,{onBeforeEnter(D){qt(R,[D]),pt(D,r),pt(D,l)},onBeforeAppear(D){qt(G,[D]),pt(D,a),pt(D,f)},onEnter:ne(!1),onAppear:ne(!0),onLeave(D,J){D._isLeaving=!0;const $=()=>z(D,J);pt(D,d),D._enterCancelled?(pt(D,g),Eo(D)):(Eo(D),pt(D,g)),Mr(()=>{D._isLeaving&&(Vt(D,d),pt(D,p),Pr(x)||Or(D,n,L,$))}),qt(x,[D,$])},onEnterCancelled(D){M(D,!1,void 0,!0),qt(_,[D])},onAppearCancelled(D){M(D,!0,void 0,!0),qt(U,[D])},onLeaveCancelled(D){z(D),qt(k,[D])}})}function au(e){if(e==null)return null;if(ve(e))return[no(e.enter),no(e.leave)];{const t=no(e);return[t,t]}}function no(e){return ha(e)}function pt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.add(s)),(e[ks]||(e[ks]=new Set)).add(t)}function Vt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.remove(n));const s=e[ks];s&&(s.delete(t),s.size||(e[ks]=void 0))}function Mr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let cu=0;function Or(e,t,s,n){const o=e._endId=++cu,r=()=>{o===e._endId&&n()};if(s!=null)return setTimeout(r,s);const{type:l,timeout:i,propCount:a}=Ni(e,t);if(!l)return n();const f=l+"end";let u=0;const d=()=>{e.removeEventListener(f,g),r()},g=p=>{p.target===e&&++u>=a&&d()};setTimeout(()=>{u(s[w]||"").split(", "),o=n(`${Mt}Delay`),r=n(`${Mt}Duration`),l=Lr(o,r),i=n(`${Ps}Delay`),a=n(`${Ps}Duration`),f=Lr(i,a);let u=null,d=0,g=0;t===Mt?l>0&&(u=Mt,d=l,g=r.length):t===Ps?f>0&&(u=Ps,d=f,g=a.length):(d=Math.max(l,f),u=d>0?l>f?Mt:Ps:null,g=u?u===Mt?r.length:a.length:0);const p=u===Mt&&/\b(?:transform|all)(?:,|$)/.test(n(`${Mt}Property`).toString());return{type:u,timeout:d,propCount:g,hasTransform:p}}function Lr(e,t){for(;e.lengthNr(s)+Nr(e[n])))}function Nr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Eo(e){return(e?e.ownerDocument:document).body.offsetHeight}function uu(e,t,s){const n=e[ks];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const En=Symbol("_vod"),Xo=Symbol("_vsh"),Vr={name:"show",beforeMount(e,{value:t},{transition:s}){e[En]=e.style.display==="none"?"":e.style.display,s&&t?s.beforeEnter(e):Ms(e,t)},mounted(e,{value:t},{transition:s}){s&&t&&s.enter(e)},updated(e,{value:t,oldValue:s},{transition:n}){!t!=!s&&(n?t?(n.beforeEnter(e),Ms(e,!0),n.enter(e)):n.leave(e,()=>{Ms(e,!1)}):Ms(e,t))},beforeUnmount(e,{value:t}){Ms(e,t)}};function Ms(e,t){e.style.display=t?e[En]:"none",e[Xo]=!t}const fu=Symbol(""),du=/(?:^|;)\s*display\s*:/;function pu(e,t,s){const n=e.style,o=Ce(s);let r=!1;if(s&&!o){if(t)if(Ce(t))for(const l of t.split(";")){const i=l.slice(0,l.indexOf(":")).trim();s[i]==null&&Vs(n,i,"")}else for(const l in t)s[l]==null&&Vs(n,l,"");for(const l in s){l==="display"&&(r=!0);const i=s[l];i!=null?mu(e,l,!Ce(t)&&t?t[l]:void 0,i)||Vs(n,l,i):Vs(n,l,"")}}else if(o){if(t!==s){const l=n[fu];l&&(s+=";"+l),n.cssText=s,r=du.test(s)}}else t&&e.removeAttribute("style");En in e&&(e[En]=r?n.display:"",e[Xo]&&(n.display="none"))}const jr=/\s*!important$/;function Vs(e,t,s){if(Y(s))s.forEach(n=>Vs(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=hu(e,t);jr.test(s)?e.setProperty(os(n),s.replace(jr,""),"important"):e[n]=s}}const Dr=["Webkit","Moz","ms"],oo={};function hu(e,t){const s=oo[t];if(s)return s;let n=Ke(t);if(n!=="filter"&&n in e)return oo[t]=n;n=Pn(n);for(let o=0;oro||(yu.then(()=>ro=0),ro=Date.now());function wu(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;const o=s.value;if(Y(o)){const r=n.stopImmediatePropagation;n.stopImmediatePropagation=()=>{r.call(n),n._stopped=!0};const l=o.slice(),i=[n];for(let a=0;ae.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Cu=(e,t,s,n,o,r)=>{const l=o==="svg";t==="class"?uu(e,n,l):t==="style"?pu(e,s,n):An(t)?In(t)||vu(e,t,s,n,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Su(e,t,n,l))?(Ur(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Br(e,t,n,l,r,t!=="value")):e._isVueCE&&(Eu(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Ce(n)))?Ur(e,Ke(t),n,r,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Br(e,t,n,l))};function Su(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&Wr(t)&&oe(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Wr(t)&&Ce(s)?!1:t in e}function Eu(e,t){const s=e._def.props;if(!s)return!1;const n=Ke(t);return Array.isArray(s)?s.some(o=>Ke(o)===n):Object.keys(s).some(o=>Ke(o)===n)}const Vi=new WeakMap,ji=new WeakMap,Tn=Symbol("_moveCb"),Kr=Symbol("_enterCb"),Tu=e=>(delete e.props.mode,e),Au=Tu({name:"TransitionGroup",props:Re({},Oi,{tag:String,moveClass:String}),setup(e,{slots:t}){const s=on(),n=Zl();let o,r;return li(()=>{if(!o.length)return;const l=e.moveClass||`${e.name||"v"}-move`;if(!Pu(o[0].el,s.vnode.el,l)){o=[];return}o.forEach(Iu),o.forEach(Ru);const i=o.filter($u);Eo(s.vnode.el),i.forEach(a=>{const f=a.el,u=f.style;pt(f,l),u.transform=u.webkitTransform=u.transitionDuration="";const d=f[Tn]=g=>{g&&g.target!==f||(!g||g.propertyName.endsWith("transform"))&&(f.removeEventListener("transitionend",d),f[Tn]=null,Vt(f,l))};f.addEventListener("transitionend",d)}),o=[]}),()=>{const l=pe(e),i=Li(l);let a=l.tag||ie;if(o=[],r)for(let f=0;f{i.split(/\s+/).forEach(a=>a&&n.classList.remove(a))}),s.split(/\s+/).forEach(i=>i&&n.classList.add(i)),n.style.display="none";const r=t.nodeType===1?t:t.parentNode;r.appendChild(n);const{hasTransform:l}=Ni(n);return r.removeChild(n),l}const ws=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Y(t)?s=>pn(t,s):t};function Mu(e){e.target.composing=!0}function Gr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const _t=Symbol("_assign"),dn=Symbol("_initialValue");function lo(e,t,s){return t&&(e=e.trim()),s&&(e=Mn(e)),e}const Le={created(e,{modifiers:{lazy:t,trim:s,number:n}},o){e.parentNode&&(e.type==="text"?e[dn]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[dn]=e.defaultValue.replace(/\r\n?/g,` -`))),e[_t]=ws(o);const r=n||o.props&&o.props.type==="number";Bt(e,t?"change":"input",l=>{l.target.composing||e[_t](lo(e.value,s,r))}),(s||r)&&Bt(e,"change",()=>{e.value=lo(e.value,s,r)}),t||(Bt(e,"compositionstart",Mu),Bt(e,"compositionend",Gr),Bt(e,"change",Gr))},mounted(e,{value:t,modifiers:{trim:s,number:n}}){const o=t??"",r=e[dn];delete e[dn],r!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==r?e[_t](lo(e.value,s,n)):e.value=o},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:o,number:r}},l){if(e[_t]=ws(l),e.composing)return;const i=(r||e.type==="number")&&!/^0\d/.test(e.value)?Mn(e.value):e.value,a=t??"";if(i===a)return;const f=e.getRootNode();(f instanceof Document||f instanceof ShadowRoot)&&f.activeElement===e&&e.type!=="range"&&(n&&t===s||o&&e.value.trim()===a)||(e.value=a)}},zt={deep:!0,created(e,t,s){e[_t]=ws(s),Bt(e,"change",()=>{const n=e._modelValue,o=en(e),r=e.checked,l=e[_t];if(Y(n)){const i=Vo(n,o),a=i!==-1;if(r&&!a)l(n.concat(o));else if(!r&&a){const f=[...n];f.splice(i,1),l(f)}}else if(Es(n)){const i=new Set(n);r?i.add(o):i.delete(o),l(i)}else l(Bi(e,r))})},mounted:qr,beforeUpdate(e,t,s){e[_t]=ws(s),qr(e,t,s)}};function qr(e,{value:t,oldValue:s},n){e._modelValue=t;let o;if(Y(t))o=Vo(t,n.props.value)>-1;else if(Es(t))o=t.has(n.props.value);else{if(t===s)return;o=Ts(t,Bi(e,!0))}e.checked!==o&&(e.checked=o)}const Fi={deep:!0,created(e,{value:t,modifiers:{number:s}},n){e._modelValue=t,Bt(e,"change",()=>{const o=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>s?Mn(en(r)):en(r));e[_t](e.multiple?Es(e._modelValue)?new Set(o):o:o[0]),e._assigning=!0,$t(()=>{e._assigning=!1})}),e[_t]=ws(n)},mounted(e,{value:t}){zr(e,t)},beforeUpdate(e,{value:t},s){e._modelValue=t,e[_t]=ws(s)},updated(e,{value:t}){e._assigning||zr(e,t)}};function zr(e,t){const s=e.multiple,n=Y(t);if(!(s&&!n&&!Es(t))){for(let o=0,r=e.options.length;oString(f)===String(i)):l.selected=Vo(t,i)>-1}else l.selected=t.has(i);else if(Ts(en(l),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function en(e){return"_value"in e?e._value:e.value}function Bi(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const Ou=["ctrl","shift","alt","meta"],Lu={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ou.some(s=>e[`${s}Key`]&&!t.includes(s))},xs=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((o,...r)=>{for(let l=0;l{const t=Vu().createApp(...e),{mount:s}=t;return t.mount=n=>{const o=Fu(n);if(!o)return;const r=t._component;!oe(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const l=s(o,!1,Du(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),l},t});function Du(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Fu(e){return Ce(e)?document.querySelector(e):e}let Ui;const Kn=e=>Ui=e,Hi=Symbol();function To(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Ws;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Ws||(Ws={}));function Bu(){const e=Sl(!0),t=e.run(()=>ue({}));let s=[],n=[];const o=Wo({install(r){Kn(o),o._a=r,r.provide(Hi,o),r.config.globalProperties.$pinia=o,n.forEach(l=>s.push(l)),n=[]},use(r){return this._a?s.push(r):n.push(r),this},_p:s,_a:null,_e:e,_s:new Map,state:t});return o}const Wi=()=>{};function Yr(e,t,s,n=Wi){e.add(t);const o=()=>{e.delete(t)&&n()};return!s&&El()&&ka(o),o}function fs(e,...t){e.forEach(s=>{s(...t)})}const Uu=e=>e(),Qr=Symbol(),io=Symbol();function Ao(e,t){e instanceof Map&&t instanceof Map?t.forEach((s,n)=>e.set(n,s)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const s in t){if(!t.hasOwnProperty(s))continue;const n=t[s],o=e[s];To(o)&&To(n)&&e.hasOwnProperty(s)&&!Ae(n)&&!Et(n)?e[s]=Ao(o,n):e[s]=n}return e}const Hu=Symbol();function Wu(e){return!To(e)||!Object.prototype.hasOwnProperty.call(e,Hu)}const{assign:jt}=Object;function Ku(e){return!!(Ae(e)&&e.effect)}function Gu(e,t,s,n){const{state:o,actions:r,getters:l}=t,i=s.state.value[e];let a;function f(){i||(s.state.value[e]=o?o():{});const u=Wa(s.state.value[e]);return jt(u,r,Object.keys(l||{}).reduce((d,g)=>(d[g]=Wo(xe(()=>{Kn(s);const p=s._s.get(e);return l[g].call(p,p)})),d),{}))}return a=Ki(e,f,t,s,n,!0),a}function Ki(e,t,s={},n,o,r){let l;const i=jt({actions:{}},s),a={deep:!0};let f,u,d=new Set,g=new Set,p;const w=n.state.value[e];!r&&!w&&(n.state.value[e]={});let C;function L(U){let M;f=u=!1,typeof U=="function"?(U(n.state.value[e]),M={type:Ws.patchFunction,storeId:e,events:p}):(Ao(n.state.value[e],U),M={type:Ws.patchObject,payload:U,storeId:e,events:p});const z=C=Symbol();$t().then(()=>{C===z&&(f=!0)}),u=!0,fs(d,M,n.state.value[e])}const R=r?function(){const{state:M}=s,z=M?M():{};this.$patch(ne=>{jt(ne,z)})}:Wi;function m(){l.stop(),d.clear(),g.clear(),n._s.delete(e)}const _=(U,M="")=>{if(Qr in U)return U[io]=M,U;const z=function(){Kn(n);const ne=Array.from(arguments),D=new Set,J=new Set;function $(te){D.add(te)}function ee(te){J.add(te)}fs(g,{args:ne,name:z[io],store:k,after:$,onError:ee});let ae;try{ae=U.apply(this&&this.$id===e?this:k,ne)}catch(te){throw fs(J,te),te}return ae instanceof Promise?ae.then(te=>(fs(D,te),te)).catch(te=>(fs(J,te),Promise.reject(te))):(fs(D,ae),ae)};return z[Qr]=!0,z[io]=M,z},x={_p:n,$id:e,$onAction:Yr.bind(null,g),$patch:L,$reset:R,$subscribe(U,M={}){const z=Yr(d,U,M.detached,()=>ne()),ne=l.run(()=>Ge(()=>n.state.value[e],D=>{(M.flush==="sync"?u:f)&&U({storeId:e,type:Ws.direct,events:p},D)},jt({},a,M)));return z},$dispose:m},k=rs(x);n._s.set(e,k);const j=(n._a&&n._a.runWithContext||Uu)(()=>n._e.run(()=>(l=Sl()).run(()=>t({action:_}))));for(const U in j){const M=j[U];if(Ae(M)&&!Ku(M)||Et(M))r||(w&&Wu(M)&&(Ae(M)?M.value=w[U]:Ao(M,w[U])),n.state.value[e][U]=M);else if(typeof M=="function"){const z=_(M,U);j[U]=z,i.actions[U]=M}}return jt(k,j),jt(pe(k),j),Object.defineProperty(k,"$state",{get:()=>n.state.value[e],set:U=>{L(M=>{jt(M,U)})}}),n._p.forEach(U=>{jt(k,l.run(()=>U({store:k,app:n._a,pinia:n,options:i})))}),w&&r&&s.hydrate&&s.hydrate(k.$state,w),f=!0,u=!0,k}function tr(e,t,s){let n;const o=typeof t=="function";n=o?s:t;function r(l,i){const a=ec();return l=l||(a?rt(Hi,null):null),l&&Kn(l),l=Ui,l._s.has(e)||(o?Ki(e,t,n,l):Gu(e,n,l)),l._s.get(e)}return r.$id=e,r}const nt=async(e,t)=>{const n=await(await fetch(e,t)).json();if(n.code!==0)throw new Error(n.msg||"请求失败");return n.data},Gi={"Content-Type":"application/json"},qu=e=>nt(`/api/info?file_name=${encodeURIComponent(e)}`),zu=e=>nt(`/api/peers?file_name=${encodeURIComponent(e)}`),Ju=e=>nt(`/api/routes?file_name=${encodeURIComponent(e)}`),Yu=e=>nt(`/api/start/status?file_name=${encodeURIComponent(e)}`),Qu=()=>nt("/api/version"),Zu=()=>nt("/api/instances"),Xu=e=>nt(`/api/instance?file_name=${encodeURIComponent(e)}`,{method:"DELETE"}),sr=(e,t)=>nt(e,{method:"POST",headers:Gi,body:JSON.stringify({file_name:t})}),ef=e=>sr("/api/start",e),qi=e=>sr("/api/stop",e),tf=e=>sr("/api/restart",e),sf=()=>nt("/api/config/list"),nf=e=>nt(`/api/config?file_name=${encodeURIComponent(e)}`),of=(e,t)=>nt("/api/config",{method:"POST",headers:Gi,body:JSON.stringify({file_name:e||null,config:t})}),rf=e=>nt(`/api/config?file_name=${encodeURIComponent(e)}`,{method:"DELETE"});let lf=0;const is=tr("ui",()=>{const e=ue([]),t=(i,a,f=3e3)=>{const u=++lf;e.value.push({id:u,type:i,message:a}),setTimeout(()=>{e.value=e.value.filter(d=>d.id!==u)},f)},s={success:i=>t("success",i),error:i=>t("error",i,4500),info:i=>t("info",i)},n=rs({show:!1,title:"",message:"",danger:!1,confirmText:"确定",resolve:null});return{toasts:e,toast:s,confirmState:n,confirm:({title:i="确认操作",message:a="",danger:f=!1,confirmText:u="确定"}={})=>new Promise(d=>{n.show=!0,n.title=i,n.message=a,n.danger=f,n.confirmText=u,n.resolve=d}),confirmOk:()=>{n.show=!1,n.resolve&&n.resolve(!0),n.resolve=null},confirmCancel:()=>{n.show=!1,n.resolve&&n.resolve(!1),n.resolve=null}}}),zi=tr("startLog",()=>{const e=ue(!1),t=ue([]),s=ue("stopped"),n=ue(null),o=ue(null);let r=null,l=null,i=null,a=null;const f=({fetchInstances:R,instanceList:m,configList:_})=>{l=R,i=m,a=_},u=xe(()=>{if(!n.value)return"";const R=(i?.value||[]).find(_=>_.file_name===n.value);if(R)return R.config_name||R.file_name;const m=(a?.value||[]).find(_=>_.file_name===n.value);return m?m.config_name||m.file_name:n.value}),d=async()=>{if(n.value)try{const R=await Yu(n.value);t.value=R.logs||[],s.value=R.status,$t(()=>{o.value&&(o.value.scrollTop=o.value.scrollHeight)}),s.value==="running"?(g(),l&&l(),e.value=!1):s.value==="stopped"&&t.value.length>0&&(g(),l&&l())}catch(R){console.error(R)}},g=()=>{r&&(clearInterval(r),r=null)},p=()=>{g(),r=setInterval(d,1e3),d()};return{showStartLog:e,startLogs:t,startStatus:s,logFileName:n,logContainer:o,logConfigName:u,bindApp:f,openStartLog:R=>{n.value=R,t.value=[],s.value="starting",e.value=!0,p()},pollStartStatus:d,startPolling:p,stopPolling:g,cancelStart:async()=>{g();const R=n.value;if(R)try{await qi(R),t.value.push("启动已手动取消")}catch{}s.value="stopped",l&&l()},close:()=>{e.value=!1}}}),Ht=tr("app",()=>{const e=is(),t=zi(),s=ue({}),n=ue([]),o=ue(null),r=ue([]),l=ue({}),i=ue({}),a=ue(!document.hidden),f=()=>{a.value=!document.hidden};let u=null;const d=xe(()=>n.value.filter($=>$.status==="running").length),g=xe(()=>n.value.filter($=>$.status==="starting").length),p=xe(()=>d.value>0?`运行中 x${d.value}`:g.value>0?"启动中...":"未启动"),w=xe(()=>o.value&&s.value[o.value]||null),C=xe(()=>{if(!o.value)return"";const $=n.value.find(ee=>ee.file_name===o.value);return $?$.config_name||$.file_name:o.value}),L=ue(""),R=async()=>{try{L.value=await Qu()||""}catch($){console.error("Fetch version error",$)}},m=xe(()=>!!(w.value&&w.value.server_info&&w.value.server_info.some($=>$.connected))),_=xe(()=>{const $=w.value;return!$||!$.server_info||!$.server_info.length?"未配置服务器":`${$.server_info.filter(ee=>ee.connected).length} / ${$.server_info.length} 已连接`}),x=$=>s.value[$]||{},k=async $=>{try{s.value[$]=await qu($)}catch(ee){console.error("Fetch info error",ee)}},G=async()=>{try{const $=await Zu()||[];n.value=$;for(const ee of Object.keys(s.value))$.some(ae=>ae.file_name===ee)||delete s.value[ee];for(const ee of Object.keys(i.value)){const ae=$.find(te=>te.file_name===ee);(!ae||ae.status==="stopped")&&delete i.value[ee]}if(!o.value||!$.some(ee=>ee.file_name===o.value)){const ee=$.find(ae=>ae.status==="running");o.value=ee?ee.file_name:$.length>0?$[0].file_name:null}for(const ee of $)ee.status==="running"&&k(ee.file_name)}catch($){console.error("Fetch instances error",$)}},j=async()=>{try{r.value=await sf()||[]}catch($){console.error("Fetch list error",$)}},U=async $=>{if(!$){e.toast.error("请先选择一个配置");return}if(!l.value[$]){l.value[$]=!0;try{await ef($),t.openStartLog($),G()}catch(ee){e.toast.error("启动失败: "+ee.message)}finally{l.value[$]=!1}}},M=async $=>{if(!(!$||l.value[$])){l.value[$]=!0,i.value[$]=!0;try{await qi($),e.toast.success("已停止"),t.logFileName===$&&(t.stopPolling(),t.showStartLog=!1),G()}catch(ee){e.toast.error("停止失败: "+ee.message),console.error(ee),delete i.value[$]}finally{l.value[$]=!1}}},z=async $=>{if(!(!$||l.value[$])){l.value[$]=!0;try{await tf($),t.openStartLog($),G()}catch(ee){e.toast.error("重启失败: "+ee.message)}finally{l.value[$]=!1}}},ne=async $=>{if(!(!$||l.value[$])){l.value[$]=!0;try{await Xu($),e.toast.success("已移除"),t.logFileName===$&&(t.stopPolling(),t.showStartLog=!1),o.value===$&&(o.value=null),G()}catch(ee){e.toast.error("移除失败: "+ee.message)}finally{l.value[$]=!1}}};t.bindApp({fetchInstances:G,instanceList:n,configList:r});const D=async()=>{document.addEventListener("visibilitychange",f),R(),await G(),j();const $=n.value.find(ee=>ee.status==="starting");$&&t.openStartLog($.file_name),u=setInterval(()=>{a.value&&G()},3e3)},J=()=>{document.removeEventListener("visibilitychange",f),t.stopPolling(),u&&clearInterval(u)};return on()&&(ls(D),As(J)),{instances:s,instanceList:n,selectedInstance:o,configList:r,loadingMap:l,stoppingMap:i,isPageVisible:a,runningCount:d,startingCount:g,headerStatusText:p,selectedInfo:w,selectedConfigName:C,version:L,isServerConnected:m,serverStatusText:_,infoOf:x,fetchInstances:G,fetchInstanceInfo:k,fetchConfigList:j,startVnt:U,stopVnt:M,restartVnt:z,dismissInstance:ne}}),af={key:0,class:"flex shrink-0 items-center justify-between gap-3 border-b border-slate-200 bg-slate-50/60 px-6 py-4 dark:border-slate-700 dark:bg-slate-800/50"},cf={class:"custom-scrollbar min-h-0 flex-1 overflow-y-auto"},uf={key:1,class:"flex shrink-0 items-center justify-end gap-3 border-t border-slate-200 bg-slate-50/60 px-6 py-4 dark:border-slate-700 dark:bg-slate-800/50"},nr={__name:"AppModal",props:{show:{type:Boolean,default:!1},maskClosable:{type:Boolean,default:!0},escClosable:{type:Boolean,default:!0},panelClass:{type:String,default:"w-full max-w-2xl"}},emits:["close"],setup(e,{emit:t}){const s=e,n=t,o=l=>{s.escClosable&&l.key==="Escape"&&n("close")};Ge(()=>s.show,l=>{l?window.addEventListener("keydown",o):window.removeEventListener("keydown",o)}),As(()=>window.removeEventListener("keydown",o));const r=()=>{s.maskClosable&&n("close")};return(l,i)=>(y(),Me(Go,{to:"body"},[ce(So,{name:"modal"},{default:Se(()=>[e.show?(y(),E("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-slate-900/40 p-4 backdrop-blur-sm",onClick:xs(r,["self"])},[c("div",{class:q(["modal-panel flex max-h-[90vh] flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-2xl dark:border-slate-700 dark:bg-slate-900",e.panelClass])},[l.$slots.header?(y(),E("div",af,[Xn(l.$slots,"header")])):fe("",!0),c("div",cf,[Xn(l.$slots,"body")]),l.$slots.footer?(y(),E("div",uf,[Xn(l.$slots,"footer")])):fe("",!0)],2)])):fe("",!0)]),_:3})]))}},ff={class:"pointer-events-none fixed right-4 top-4 z-[100] flex flex-col items-end gap-2"},df={class:"flex items-center gap-2 px-4 py-2.5"},pf=["d"],hf={class:"break-all text-sm text-slate-700 dark:text-slate-200"},mf={__name:"ToastHost",setup(e){const t=is(),s=r=>r==="success"?"bg-green-500":r==="error"?"bg-red-500":"bg-indigo-500",n=r=>r==="success"?"text-green-500":r==="error"?"text-red-500":"text-indigo-500",o=r=>r==="success"?"M5 13l4 4L19 7":r==="error"?"M6 18L18 6M6 6l12 12":"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z";return(r,l)=>(y(),Me(Go,{to:"body"},[c("div",ff,[ce(er,{name:"toast"},{default:Se(()=>[(y(!0),E(ie,null,Ee(O(t).toasts,i=>(y(),E("div",{key:i.id,class:"pointer-events-auto flex max-w-sm items-stretch overflow-hidden rounded-lg border border-slate-200 bg-white shadow-lg dark:border-slate-700 dark:bg-slate-800"},[c("span",{class:q(["w-1 shrink-0",s(i.type)])},null,2),c("div",df,[(y(),E("svg",{class:q(["h-4 w-4 shrink-0",n(i.type)]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:o(i.type)},null,8,pf)],2)),c("span",hf,B(i.message),1)])]))),128))]),_:1})])]))}},gf={class:"text-lg font-bold text-slate-900 flex items-center gap-2 dark:text-white"},vf={key:0,class:"w-5 h-5 text-red-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},_f={class:"px-6 py-5 text-sm text-slate-600 break-all dark:text-slate-300"},bf={__name:"ConfirmHost",setup(e){const t=is();return(s,n)=>(y(),Me(nr,{show:O(t).confirmState.show,"panel-class":"w-full max-w-sm",onClose:O(t).confirmCancel},{header:Se(()=>[c("h3",gf,[O(t).confirmState.danger?(y(),E("svg",vf,[...n[2]||(n[2]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"},null,-1)])])):fe("",!0),re(" "+B(O(t).confirmState.title),1)])]),body:Se(()=>[c("p",_f,B(O(t).confirmState.message),1)]),footer:Se(()=>[c("button",{class:"btn-ghost",onClick:n[0]||(n[0]=(...o)=>O(t).confirmCancel&&O(t).confirmCancel(...o))},"取消"),c("button",{class:q(O(t).confirmState.danger?"btn-danger":"btn-primary"),onClick:n[1]||(n[1]=(...o)=>O(t).confirmOk&&O(t).confirmOk(...o))},B(O(t).confirmState.confirmText),3)]),_:1},8,["show","onClose"]))}},or={__name:"StatusDot",props:{status:{type:String,default:"stopped"},size:{type:String,default:"w-2.5 h-2.5"}},setup(e){const t=s=>s==="running"?"bg-green-500":s==="starting"?"bg-blue-500 animate-pulse":"bg-slate-400 dark:bg-slate-500";return(s,n)=>(y(),E("span",{class:q(["rounded-full inline-block shrink-0",[e.size,t(e.status)]])},null,2))}},xf={class:"w-auto min-w-[260px] max-w-[320px] rounded-lg border border-slate-200 bg-white p-4 text-left text-sm text-slate-600 shadow-2xl dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200"},yf={class:"relative z-10 mb-2 flex items-center justify-between border-b border-slate-200 pb-2 dark:border-slate-600"},kf={class:"badge-green border border-green-200 dark:border-green-800"},wf={key:0,class:"relative z-10 mb-3"},Cf={class:"flex flex-wrap gap-1"},Sf={key:1,class:"relative z-10"},Ef={class:"whitespace-normal break-all rounded border border-slate-200 bg-slate-50 p-1.5 font-mono text-xs leading-relaxed text-slate-600 dark:border-slate-700/50 dark:bg-slate-900/50 dark:text-slate-200"},Tf={__name:"AppTooltip",setup(e,{expose:t}){const s=ue({show:!1,x:0,y:0,info:null});let n=null;const o=(a,f)=>{if(!f.nat_info)return;n&&(clearTimeout(n),n=null);const u=a.currentTarget.getBoundingClientRect();s.value={show:!0,x:u.left+u.width/2,y:u.bottom+10,info:f.nat_info}},r=()=>{n=setTimeout(()=>{s.value.show=!1},100)},l=()=>{n&&(clearTimeout(n),n=null)},i=()=>{s.value.show=!1};return t({showPeerTooltip:o,hidePeerTooltip:r}),(a,f)=>(y(),Me(Go,{to:"body"},[s.value.show?(y(),E("div",{key:0,style:Ln({top:s.value.y+"px",left:s.value.x+"px"}),class:"fixed z-[9999] mt-1 -translate-x-1/2 transform",onMouseenter:l,onMouseleave:i},[c("div",xf,[f[3]||(f[3]=c("div",{class:"absolute -top-2 left-1/2 h-4 w-4 -translate-x-1/2 rotate-45 transform border-l border-t border-slate-200 bg-white dark:border-slate-600 dark:bg-slate-800"},null,-1)),c("div",yf,[f[0]||(f[0]=c("span",{class:"text-xs font-bold uppercase text-slate-400"},"NAT Type",-1)),c("span",kf,B(s.value.info.nat_type),1)]),s.value.info.public_ips&&s.value.info.public_ips.length>0?(y(),E("div",wf,[f[1]||(f[1]=c("span",{class:"mb-1 block text-xs text-slate-400"},"Public IPv4:",-1)),c("div",Cf,[(y(!0),E(ie,null,Ee(s.value.info.public_ips,u=>(y(),E("span",{key:u,class:"rounded border border-slate-200 bg-slate-100 px-1.5 py-0.5 font-mono text-xs tabular-nums text-slate-600 dark:border-slate-600 dark:bg-slate-700 dark:text-slate-200"},B(u),1))),128))])])):fe("",!0),s.value.info.ipv6?(y(),E("div",Sf,[f[2]||(f[2]=c("span",{class:"mb-1 block text-xs text-slate-400"},"IPv6:",-1)),c("div",Ef,B(s.value.info.ipv6),1)])):fe("",!0)])],36)):fe("",!0)]))}},Af={class:"flex min-h-screen flex-col"},If={class:"sticky top-0 z-30 border-b border-slate-200 bg-white/80 backdrop-blur dark:border-slate-800 dark:bg-slate-900/80"},Rf={class:"mx-auto flex h-14 max-w-6xl items-center gap-3 px-4 lg:px-8"},$f={class:"ml-6 hidden h-14 items-stretch gap-1 lg:flex"},Pf=["onClick"],Mf={key:0,class:"absolute inset-x-3 bottom-0 h-0.5 rounded-full bg-indigo-600 dark:bg-indigo-400"},Of={class:"ml-auto flex items-center gap-3"},Lf=["title"],Nf={class:"hidden text-xs font-medium text-slate-600 sm:inline dark:text-slate-300"},Vf={class:"hidden text-xs text-slate-400 md:inline dark:text-slate-500"},jf=["title"],Df={key:0,class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Ff={key:1,class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Bf={key:0,class:"border-t border-slate-200 bg-white px-4 py-2 lg:hidden dark:border-slate-800 dark:bg-slate-900"},Uf=["onClick"],Hf={class:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Wf=["d"],Kf=["d"],Gf={class:"flex-1 overflow-x-hidden"},qf={class:"mx-auto w-full max-w-6xl px-4 py-6 lg:px-8"},zf={class:"flex items-center gap-3"},Jf={key:0,class:"h-3 w-3 animate-ping rounded-full bg-blue-500"},Yf={key:1,class:"h-3 w-3 rounded-full bg-green-500"},Qf={key:2,class:"h-3 w-3 rounded-full bg-red-500"},Zf={class:"text-lg font-bold text-slate-900 dark:text-white"},Xf={class:"flex items-center gap-3"},ed=["title"],td={class:"font-mono text-xs uppercase tracking-widest text-slate-400"},sd={class:"break-all text-slate-600 dark:text-slate-300"},nd={key:0,class:"mt-4 animate-pulse italic text-blue-500"},od={key:1,class:"mt-4 rounded-lg border border-red-200 bg-red-50 p-3 text-red-600 dark:border-red-900/50 dark:bg-red-900/20 dark:text-red-400"},rd={__name:"App",setup(e){const t=Ht(),s=zi(),n=ue(null);Bs("peerTooltip",n);const o=ue(document.documentElement.classList.contains("dark")),r=()=>{o.value=!o.value,document.documentElement.classList.toggle("dark",o.value),localStorage.setItem("vnt-theme",o.value?"dark":"light")},l=ue(!1),i=()=>{l.value=!1},a=[{to:"/",label:"总览",exact:!0,icon:"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"},{to:"/instances",label:"实例",icon:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"},{to:"/config",label:"配置",icon:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z",icon2:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},{to:"/peers",label:"设备列表",icon:"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"},{to:"/routes",label:"路由",icon:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 01-.806-.98l-3.747-1.874M12 7v13m3-13v13m-3 0l3 3"}];return(f,u)=>{const d=yn("router-link"),g=yn("router-view");return y(),E("div",Af,[c("header",If,[c("div",Rf,[c("button",{class:"rounded-lg p-1.5 text-slate-500 hover:bg-slate-100 hover:text-slate-900 lg:hidden dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white",onClick:u[0]||(u[0]=p=>l.value=!l.value)},[...u[3]||(u[3]=[c("svg",{class:"h-5 w-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 12h16M4 18h16"})],-1)])]),ce(d,{to:"/",class:"flex items-center gap-2",onClick:i},{default:Se(()=>[...u[4]||(u[4]=[c("span",{class:"text-lg font-bold tracking-wide text-indigo-600 dark:text-indigo-400"},"VNT",-1),c("span",{class:"text-sm font-medium text-slate-400 dark:text-slate-500"},"Web",-1)])]),_:1}),c("nav",$f,[(y(),E(ie,null,Ee(a,p=>ce(d,{key:p.to,to:p.to,custom:""},{default:Se(({navigate:w,isActive:C,isExactActive:L})=>[c("button",{onClick:w,class:q(["relative flex items-center px-3 text-sm font-medium transition-colors",(p.exact?L:C)?"text-indigo-600 dark:text-indigo-400":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white"])},[re(B(p.label)+" ",1),(p.exact?L:C)?(y(),E("span",Mf)):fe("",!0)],10,Pf)]),_:2},1032,["to"])),64))]),c("div",Of,[c("div",{class:"flex items-center gap-2 rounded-full border border-slate-200 bg-white px-3 py-1 dark:border-slate-700 dark:bg-slate-800",title:O(t).headerStatusText},[ce(or,{status:O(t).runningCount>0?"running":O(t).startingCount>0?"starting":"stopped"},null,8,["status"]),c("span",Nf,B(O(t).headerStatusText),1)],8,Lf),c("span",Vf,"v"+B(O(t).version||"-"),1),c("button",{class:"rounded-lg border border-slate-200 bg-white p-1.5 text-slate-500 shadow-sm transition-colors hover:bg-slate-50 hover:text-slate-900 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-400 dark:hover:bg-slate-700 dark:hover:text-white",title:o.value?"切换到浅色模式":"切换到深色模式",onClick:r},[o.value?(y(),E("svg",Df,[...u[5]||(u[5]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"},null,-1)])])):(y(),E("svg",Ff,[...u[6]||(u[6]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"},null,-1)])]))],8,jf)])]),ce(So,{name:"navdrop"},{default:Se(()=>[l.value?(y(),E("nav",Bf,[(y(),E(ie,null,Ee(a,p=>ce(d,{key:p.to,to:p.to,custom:""},{default:Se(({navigate:w,isActive:C,isExactActive:L})=>[c("button",{onClick:R=>{w(),i()},class:q(["flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-sm font-medium transition-colors",(p.exact?L:C)?"bg-indigo-50 text-indigo-600 dark:bg-indigo-500/10 dark:text-indigo-400":"text-slate-500 hover:bg-slate-50 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white"])},[(y(),E("svg",Hf,[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:p.icon},null,8,Wf),p.icon2?(y(),E("path",{key:0,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:p.icon2},null,8,Kf)):fe("",!0)])),re(" "+B(p.label),1)],10,Uf)]),_:2},1032,["to"])),64))])):fe("",!0)]),_:1})]),c("main",Gf,[c("div",qf,[ce(g,null,{default:Se(({Component:p})=>[ce(So,{name:"fade",mode:"out-in"},{default:Se(()=>[(y(),Me(_c(p)))]),_:2},1024)]),_:1})])]),ce(nr,{show:O(s).showStartLog,"mask-closable":O(s).startStatus!=="starting","esc-closable":O(s).startStatus!=="starting","panel-class":"w-full max-w-2xl",onClose:O(s).close},{header:Se(()=>[c("div",zf,[O(s).startStatus==="starting"?(y(),E("div",Jf)):O(s).startStatus==="running"?(y(),E("div",Yf)):(y(),E("div",Qf)),c("h3",Zf,B(O(s).startStatus==="starting"?"正在启动组网...":O(s).startStatus==="running"?"启动成功":"启动失败"),1)]),c("div",Xf,[c("span",{class:"max-w-[200px] truncate text-sm font-medium text-indigo-600 dark:text-indigo-400",title:O(s).logFileName},B(O(s).logConfigName),9,ed),c("span",td,B(O(s).startStatus),1)])]),body:Se(()=>[c("div",{ref:p=>O(s).logContainer=p,class:"scrollbar-hide h-80 space-y-2 overflow-y-auto bg-slate-50 p-6 font-mono text-sm dark:bg-black/20"},[(y(!0),E(ie,null,Ee(O(s).startLogs,(p,w)=>(y(),E("div",{key:w,class:"flex gap-3"},[u[7]||(u[7]=c("span",{class:"shrink-0 text-indigo-500 dark:text-indigo-400"},">>>",-1)),c("span",sd,B(p),1)]))),128)),O(s).startStatus==="starting"?(y(),E("div",nd," 等待后续步骤... ")):fe("",!0),O(s).startStatus==="stopped"&&O(s).startLogs.length>0?(y(),E("div",od,[...u[8]||(u[8]=[c("strong",null,"启动失败:",-1),re(" 请检查配置或网络连接。 ",-1)])])):fe("",!0)],512)]),footer:Se(()=>[O(s).startStatus==="starting"?(y(),E("button",{key:0,class:"btn-ghost",onClick:u[1]||(u[1]=(...p)=>O(s).cancelStart&&O(s).cancelStart(...p))}," 取消组网 ")):fe("",!0),O(s).startStatus==="stopped"||O(s).startStatus==="running"?(y(),E("button",{key:1,class:"btn-primary",onClick:u[2]||(u[2]=(...p)=>O(s).close&&O(s).close(...p))}," 关闭窗口 ")):fe("",!0)]),_:1},8,["show","mask-closable","esc-closable","onClose"]),ce(mf),ce(bf),ce(Tf,{ref_key:"tooltipRef",ref:n},null,512)])}}};const ms=typeof document<"u";function Ji(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function ld(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Ji(e.default)}const me=Object.assign;function ao(e,t){const s={};for(const n in t){const o=t[n];s[n]=it(o)?o.map(e):e(o)}return s}const Ks=()=>{},it=Array.isArray;function Zr(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}const Yi=/#/g,id=/&/g,ad=/\//g,cd=/=/g,ud=/\?/g,Qi=/\+/g,fd=/%5B/g,dd=/%5D/g,Zi=/%5E/g,pd=/%60/g,Xi=/%7B/g,hd=/%7C/g,ea=/%7D/g,md=/%20/g;function rr(e){return e==null?"":encodeURI(""+e).replace(hd,"|").replace(fd,"[").replace(dd,"]")}function gd(e){return rr(e).replace(Xi,"{").replace(ea,"}").replace(Zi,"^")}function Io(e){return rr(e).replace(Qi,"%2B").replace(md,"+").replace(Yi,"%23").replace(id,"%26").replace(pd,"`").replace(Xi,"{").replace(ea,"}").replace(Zi,"^")}function vd(e){return Io(e).replace(cd,"%3D")}function _d(e){return rr(e).replace(Yi,"%23").replace(ud,"%3F")}function bd(e){return _d(e).replace(ad,"%2F")}function tn(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const xd=/\/$/,yd=e=>e.replace(xd,"");function co(e,t,s="/"){let n,o={},r="",l="";const i=t.indexOf("#");let a=t.indexOf("?");return a=i>=0&&a>i?-1:a,a>=0&&(n=t.slice(0,a),r=t.slice(a,i>0?i:t.length),o=e(r.slice(1))),i>=0&&(n=n||t.slice(0,i),l=t.slice(i,t.length)),n=Sd(n??t,s),{fullPath:n+r+l,path:n,query:o,hash:tn(l)}}function kd(e,t){const s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function Xr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function wd(e,t,s){const n=t.matched.length-1,o=s.matched.length-1;return n>-1&&n===o&&Cs(t.matched[n],s.matched[o])&&ta(t.params,s.params)&&e(t.query)===e(s.query)&&t.hash===s.hash}function Cs(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ta(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var s in e)if(!Cd(e[s],t[s]))return!1;return!0}function Cd(e,t){return it(e)?el(e,t):it(t)?el(t,e):e?.valueOf()===t?.valueOf()}function el(e,t){return it(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function Sd(e,t){if(e.startsWith("/"))return e;if(!e)return t;const s=t.split("/"),n=e.split("/"),o=n[n.length-1];(o===".."||o===".")&&n.push("");let r=s.length-1,l,i;for(l=0;l1&&r--;else break;return s.slice(0,r).join("/")+"/"+n.slice(l).join("/")}const Ot={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let Ro=(function(e){return e.pop="pop",e.push="push",e})({}),uo=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function Ed(e){if(!e)if(ms){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),yd(e)}const Td=/^[^#]+#/;function Ad(e,t){return e.replace(Td,"#")+t}function Id(e,t){const s=document.documentElement.getBoundingClientRect(),n=e.getBoundingClientRect();return{behavior:t.behavior,left:n.left-s.left-(t.left||0),top:n.top-s.top-(t.top||0)}}const Gn=()=>({left:window.scrollX,top:window.scrollY});function Rd(e){let t;if("el"in e){const s=e.el,n=typeof s=="string"&&s.startsWith("#"),o=typeof s=="string"?n?document.getElementById(s.slice(1)):document.querySelector(s):s;if(!o)return;t=Id(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function tl(e,t){return(history.state?history.state.position-t:-1)+e}const $o=new Map;function $d(e,t){$o.set(e,t)}function Pd(e){const t=$o.get(e);return $o.delete(e),t}function Md(e){return typeof e=="string"||e&&typeof e=="object"}function sa(e){return typeof e=="string"||typeof e=="symbol"}let Te=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({});const na=Symbol("");Te.MATCHER_NOT_FOUND+"",Te.NAVIGATION_GUARD_REDIRECT+"",Te.NAVIGATION_ABORTED+"",Te.NAVIGATION_CANCELLED+"",Te.NAVIGATION_DUPLICATED+"";function Ss(e,t){return me(new Error,{type:e,[na]:!0},t)}function yt(e,t){return e instanceof Error&&na in e&&(t==null||!!(e.type&t))}const Od=["params","query","hash"];function Ld(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const s of Od)s in e&&(t[s]=e[s]);return JSON.stringify(t,null,2)}function Nd(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let n=0;no&&Io(o)):[n&&Io(n)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+s,o!=null&&(t+="="+o))})}return t}function Vd(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=it(n)?n.map(o=>o==null?null:""+o):n==null?n:""+n)}return t}const jd=Symbol(""),nl=Symbol(""),lr=Symbol(""),oa=Symbol(""),Po=Symbol("");function Os(){let e=[];function t(n){return e.push(n),()=>{const o=e.indexOf(n);o>-1&&e.splice(o,1)}}function s(){e=[]}return{add:t,list:()=>e.slice(),reset:s}}function Ft(e,t,s,n,o,r=l=>l()){const l=n&&(n.enterCallbacks[o]=n.enterCallbacks[o]||[]);return()=>new Promise((i,a)=>{const f=g=>{g===!1?a(Ss(Te.NAVIGATION_ABORTED,{from:s,to:t})):g instanceof Error?a(g):Md(g)?a(Ss(Te.NAVIGATION_GUARD_REDIRECT,{from:t,to:g})):(l&&n.enterCallbacks[o]===l&&typeof g=="function"&&l.push(g),i())},u=r(()=>e.call(n&&n.instances[o],t,s,f));let d=Promise.resolve(u);e.length<3&&(d=d.then(f)),d.catch(g=>a(g))})}function fo(e,t,s,n,o=r=>r()){const r=[];for(const l of e)for(const i in l.components){let a=l.components[i];if(!(t!=="beforeRouteEnter"&&!l.instances[i]))if(Ji(a)){const f=(a.__vccOpts||a)[t];f&&r.push(Ft(f,s,n,l,i,o))}else{let f=a();r.push(()=>f.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${i}" at "${l.path}"`);const d=ld(u)?u.default:u;l.mods[i]=u,l.components[i]=d;const g=(d.__vccOpts||d)[t];return g&&Ft(g,s,n,l,i,o)()}))}}return r}function Dd(e,t){const s=[],n=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let l=0;lCs(f,i))?n.push(i):s.push(i));const a=e.matched[l];a&&(t.matched.find(f=>Cs(f,a))||o.push(a))}return[s,n,o]}let Fd=()=>location.protocol+"//"+location.host;function ra(e,t){const{pathname:s,search:n,hash:o}=t,r=e.indexOf("#");if(r>-1){let l=o.includes(e.slice(r))?e.slice(r).length:1,i=o.slice(l);return i[0]!=="/"&&(i="/"+i),Xr(i,"")}return Xr(s,e)+n+o}function Bd(e,t,s,n){let o=[],r=[],l=null;const i=({state:g})=>{const p=ra(e,location),w=s.value,C=t.value;let L=0;if(g){if(s.value=p,t.value=g,l&&l===w){l=null;return}L=C?g.position-C.position:0}else n(p);o.forEach(R=>{R(s.value,w,{delta:L,type:Ro.pop,direction:L?L>0?uo.forward:uo.back:uo.unknown})})};function a(){l=s.value}function f(g){o.push(g);const p=()=>{const w=o.indexOf(g);w>-1&&o.splice(w,1)};return r.push(p),p}function u(){if(document.visibilityState==="hidden"){const{history:g}=window;if(!g.state)return;g.replaceState(me({},g.state,{scroll:Gn()}),"")}}function d(){for(const g of r)g();r=[],window.removeEventListener("popstate",i),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}return window.addEventListener("popstate",i),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:a,listen:f,destroy:d}}function ol(e,t,s,n=!1,o=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:o?Gn():null}}function Ud(e){const{history:t,location:s}=window,n={value:ra(e,s)},o={value:t.state};o.value||r(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(a,f,u){const d=e.indexOf("#"),g=d>-1?(s.host&&document.querySelector("base")?e:e.slice(d))+a:Fd()+e+a;try{t[u?"replaceState":"pushState"](f,"",g),o.value=f}catch(p){console.error(p),s[u?"replace":"assign"](g)}}function l(a,f){r(a,me({},t.state,ol(o.value.back,a,o.value.forward,!0),f,{position:o.value.position}),!0),n.value=a}function i(a,f){const u=me({},o.value,t.state,{forward:a,scroll:Gn()});r(u.current,u,!0),r(a,me({},ol(n.value,a,null),{position:u.position+1},f),!1),n.value=a}return{location:n,state:o,push:i,replace:l}}function Hd(e){e=Ed(e);const t=Ud(e),s=Bd(e,t.state,t.location,t.replace);function n(r,l=!0){l||s.pauseListeners(),history.go(r)}const o=me({location:"",base:e,go:n,createHref:Ad.bind(null,e)},t,s);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Wd(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Hd(e)}let es=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var $e=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})($e||{});const Kd={type:es.Static,value:""},Gd=/[a-zA-Z0-9_]/;function qd(e){if(!e)return[[]];if(e==="/")return[[Kd]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(p){throw new Error(`ERR (${s})/"${f}": ${p}`)}let s=$e.Static,n=s;const o=[];let r;function l(){r&&o.push(r),r=[]}let i=0,a,f="",u="";function d(){f&&(s===$e.Static?r.push({type:es.Static,value:f}):s===$e.Param||s===$e.ParamRegExp||s===$e.ParamRegExpEnd?(r.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),r.push({type:es.Param,value:f,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),f="")}function g(){f+=a}for(;it.length?t.length===1&&t[0]===He.Static+He.Segment?1:-1:0}function la(e,t){let s=0;const n=e.score,o=t.score;for(;s0&&t[t.length-1]<0}const Zd={strict:!1,end:!0,sensitive:!1};function Xd(e,t,s){const n=Yd(qd(e.path),s),o=me(n,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function ep(e,t){const s=[],n=new Map;t=Zr(Zd,t);function o(d){return n.get(d)}function r(d,g,p){const w=!p,C=al(d);C.aliasOf=p&&p.record;const L=Zr(t,d),R=[C];if("alias"in d){const x=typeof d.alias=="string"?[d.alias]:d.alias;for(const k of x)R.push(al(me({},C,{components:p?p.record.components:C.components,path:k,aliasOf:p?p.record:C})))}let m,_;for(const x of R){const{path:k}=x;if(g&&k[0]!=="/"){const G=g.record.path,j=G[G.length-1]==="/"?"":"/";x.path=g.record.path+(k&&j+k)}if(m=Xd(x,g,L),p?p.alias.push(m):(_=_||m,_!==m&&_.alias.push(m),w&&d.name&&!cl(m)&&l(d.name)),ia(m)&&a(m),C.children){const G=C.children;for(let j=0;j{l(_)}:Ks}function l(d){if(sa(d)){const g=n.get(d);g&&(n.delete(d),s.splice(s.indexOf(g),1),g.children.forEach(l),g.alias.forEach(l))}else{const g=s.indexOf(d);g>-1&&(s.splice(g,1),d.record.name&&n.delete(d.record.name),d.children.forEach(l),d.alias.forEach(l))}}function i(){return s}function a(d){const g=np(d,s);s.splice(g,0,d),d.record.name&&!cl(d)&&n.set(d.record.name,d)}function f(d,g){let p,w={},C,L;if("name"in d&&d.name){if(p=n.get(d.name),!p)throw Ss(Te.MATCHER_NOT_FOUND,{location:d});L=p.record.name,w=me(il(g.params,p.keys.filter(_=>!_.optional).concat(p.parent?p.parent.keys.filter(_=>_.optional):[]).map(_=>_.name)),d.params&&il(d.params,p.keys.map(_=>_.name))),C=p.stringify(w)}else if(d.path!=null)C=d.path,p=s.find(_=>_.re.test(C)),p&&(w=p.parse(C),L=p.record.name);else{if(p=g.name?n.get(g.name):s.find(_=>_.re.test(g.path)),!p)throw Ss(Te.MATCHER_NOT_FOUND,{location:d,currentLocation:g});L=p.record.name,w=me({},g.params,d.params),C=p.stringify(w)}const R=[];let m=p;for(;m;)R.unshift(m.record),m=m.parent;return{name:L,path:C,params:w,matched:R,meta:sp(R)}}e.forEach(d=>r(d));function u(){s.length=0,n.clear()}return{addRoute:r,resolve:f,removeRoute:l,clearRoutes:u,getRoutes:i,getRecordMatcher:o}}function il(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function al(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:tp(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function tp(e){const t={},s=e.props||!1;if("component"in e)t.default=s;else for(const n in e.components)t[n]=typeof s=="object"?s[n]:s;return t}function cl(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function sp(e){return e.reduce((t,s)=>me(t,s.meta),{})}function np(e,t){let s=0,n=t.length;for(;s!==n;){const r=s+n>>1;la(e,t[r])<0?n=r:s=r+1}const o=op(e);return o&&(n=t.lastIndexOf(o,n-1)),n}function op(e){let t=e;for(;t=t.parent;)if(ia(t)&&la(e,t)===0)return t}function ia({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function ul(e){const t=rt(lr),s=rt(oa),n=xe(()=>{const a=O(e.to);return t.resolve(a)}),o=xe(()=>{const{matched:a}=n.value,{length:f}=a,u=a[f-1],d=s.matched;if(!u||!d.length)return-1;const g=d.findIndex(Cs.bind(null,u));if(g>-1)return g;const p=fl(a[f-2]);return f>1&&fl(u)===p&&d[d.length-1].path!==p?d.findIndex(Cs.bind(null,a[f-2])):g}),r=xe(()=>o.value>-1&&cp(s.params,n.value.params)),l=xe(()=>o.value>-1&&o.value===s.matched.length-1&&ta(s.params,n.value.params));function i(a={}){if(ap(a)){const f=t[O(e.replace)?"replace":"push"](O(e.to)).catch(Ks);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:n,href:xe(()=>n.value.href),isActive:r,isExactActive:l,navigate:i}}function rp(e){return e.length===1?e[0]:e}const lp=ni({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:ul,setup(e,{slots:t}){const s=rs(ul(e)),{options:n}=rt(lr),o=xe(()=>({[dl(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[dl(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const r=t.default&&rp(t.default(s));return e.custom?r:Zo("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},r)}}}),ip=lp;function ap(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function cp(e,t){for(const s in t){const n=t[s],o=e[s];if(typeof n=="string"){if(n!==o)return!1}else if(!it(o)||o.length!==n.length||n.some((r,l)=>r.valueOf()!==o[l].valueOf()))return!1}return!0}function fl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const dl=(e,t,s)=>e??t??s,up=ni({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=rt(Po),o=xe(()=>e.route||n.value),r=rt(nl,0),l=xe(()=>{let f=O(r);const{matched:u}=o.value;let d;for(;(d=u[f])&&!d.components;)f++;return f}),i=xe(()=>o.value.matched[l.value]);Bs(nl,xe(()=>l.value+1)),Bs(jd,i),Bs(Po,o);const a=ue();return Ge(()=>[a.value,i.value,e.name],([f,u,d],[g,p,w])=>{u&&(u.instances[d]=f,p&&p!==u&&f&&f===g&&(u.leaveGuards.size||(u.leaveGuards=p.leaveGuards),u.updateGuards.size||(u.updateGuards=p.updateGuards))),f&&u&&(!p||!Cs(u,p)||!g)&&(u.enterCallbacks[d]||[]).forEach(C=>C(f))},{flush:"post"}),()=>{const f=o.value,u=e.name,d=i.value,g=d&&d.components[u];if(!g)return pl(s.default,{Component:g,route:f});const p=d.props[u],w=p?p===!0?f.params:typeof p=="function"?p(f):p:null,L=Zo(g,me({},w,t,{onVnodeUnmounted:R=>{R.component.isUnmounted&&(d.instances[u]=null)},ref:a}));return pl(s.default,{Component:L,route:f})||L}}});function pl(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const fp=up;function dp(e){const t=ep(e.routes,e),s=e.parseQuery||Nd,n=e.stringifyQuery||sl,o=e.history,r=Os(),l=Os(),i=Os(),a=Ba(Ot);let f=Ot;ms&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=ao.bind(null,A=>""+A),d=ao.bind(null,bd),g=ao.bind(null,tn);function p(A,K){let H,Q;return sa(A)?(H=t.getRecordMatcher(A),Q=K):Q=A,t.addRoute(Q,H)}function w(A){const K=t.getRecordMatcher(A);K&&t.removeRoute(K)}function C(){return t.getRoutes().map(A=>A.record)}function L(A){return!!t.getRecordMatcher(A)}function R(A,K){if(K=me({},K||a.value),typeof A=="string"){const b=co(s,A,K.path),T=t.resolve({path:b.path},K),I=o.createHref(b.fullPath);return me(b,T,{params:g(T.params),hash:tn(b.hash),redirectedFrom:void 0,href:I})}let H;if(A.path!=null)H=me({},A,{path:co(s,A.path,K.path).path});else{const b=me({},A.params);for(const T in b)b[T]==null&&delete b[T];H=me({},A,{params:d(b)}),K.params=d(K.params)}const Q=t.resolve(H,K),de=A.hash||"";Q.params=u(g(Q.params));const h=kd(n,me({},A,{hash:gd(de),path:Q.path})),v=o.createHref(h);return me({fullPath:h,hash:de,query:n===sl?Vd(A.query):A.query||{}},Q,{redirectedFrom:void 0,href:v})}function m(A){return typeof A=="string"?co(s,A,a.value.path):me({},A)}function _(A,K){if(f!==A)return Ss(Te.NAVIGATION_CANCELLED,{from:K,to:A})}function x(A){return j(A)}function k(A){return x(me(m(A),{replace:!0}))}function G(A,K){const H=A.matched[A.matched.length-1];if(H&&H.redirect){const{redirect:Q}=H;let de=typeof Q=="function"?Q(A,K):Q;return typeof de=="string"&&(de=de.includes("?")||de.includes("#")?de=m(de):{path:de},de.params={}),me({query:A.query,hash:A.hash,params:de.path!=null?{}:A.params},de)}}function j(A,K){const H=f=R(A),Q=a.value,de=A.state,h=A.force,v=A.replace===!0,b=G(H,Q);if(b)return j(me(m(b),{state:typeof b=="object"?me({},de,b.state):de,force:h,replace:v}),K||H);const T=H;T.redirectedFrom=K;let I;return!h&&wd(n,Q,H)&&(I=Ss(Te.NAVIGATION_DUPLICATED,{to:T,from:Q}),at(Q,Q,!0,!1)),(I?Promise.resolve(I):z(T,Q)).catch(S=>yt(S)?yt(S,Te.NAVIGATION_GUARD_REDIRECT)?S:qe(S):le(S,T,Q)).then(S=>{if(S){if(yt(S,Te.NAVIGATION_GUARD_REDIRECT))return j(me({replace:v},m(S.to),{state:typeof S.to=="object"?me({},de,S.to.state):de,force:h}),K||T)}else S=D(T,Q,!0,v,de);return ne(T,Q,S),S})}function U(A,K){const H=_(A,K);return H?Promise.reject(H):Promise.resolve()}function M(A){const K=cs.values().next().value;return K&&typeof K.runWithContext=="function"?K.runWithContext(A):A()}function z(A,K){let H;const[Q,de,h]=Dd(A,K);H=fo(Q.reverse(),"beforeRouteLeave",A,K);for(const b of Q)b.leaveGuards.forEach(T=>{H.push(Ft(T,A,K))});const v=U.bind(null,A,K);return H.push(v),Xe(H).then(()=>{H=[];for(const b of r.list())H.push(Ft(b,A,K));return H.push(v),Xe(H)}).then(()=>{H=fo(de,"beforeRouteUpdate",A,K);for(const b of de)b.updateGuards.forEach(T=>{H.push(Ft(T,A,K))});return H.push(v),Xe(H)}).then(()=>{H=[];for(const b of h)if(b.beforeEnter)if(it(b.beforeEnter))for(const T of b.beforeEnter)H.push(Ft(T,A,K));else H.push(Ft(b.beforeEnter,A,K));return H.push(v),Xe(H)}).then(()=>(A.matched.forEach(b=>b.enterCallbacks={}),H=fo(h,"beforeRouteEnter",A,K,M),H.push(v),Xe(H))).then(()=>{H=[];for(const b of l.list())H.push(Ft(b,A,K));return H.push(v),Xe(H)}).catch(b=>yt(b,Te.NAVIGATION_CANCELLED)?b:Promise.reject(b))}function ne(A,K,H){i.list().forEach(Q=>M(()=>Q(A,K,H)))}function D(A,K,H,Q,de){const h=_(A,K);if(h)return h;const v=K===Ot,b=ms?history.state:{};H&&(Q||v?o.replace(A.fullPath,me({scroll:v&&b&&b.scroll},de)):o.push(A.fullPath,de)),a.value=A,at(A,K,H,v),qe()}let J;function $(){J||(J=o.listen((A,K,H)=>{if(!Wt.listening)return;const Q=R(A),de=G(Q,Wt.currentRoute.value);if(de){j(me(de,{replace:!0,force:!0}),Q).catch(Ks);return}f=Q;const h=a.value;ms&&$d(tl(h.fullPath,H.delta),Gn()),z(Q,h).catch(v=>yt(v,Te.NAVIGATION_ABORTED|Te.NAVIGATION_CANCELLED)?v:yt(v,Te.NAVIGATION_GUARD_REDIRECT)?(j(me(m(v.to),{force:!0}),Q).then(b=>{yt(b,Te.NAVIGATION_ABORTED|Te.NAVIGATION_DUPLICATED)&&!H.delta&&H.type===Ro.pop&&o.go(-1,!1)}).catch(Ks),Promise.reject()):(H.delta&&o.go(-H.delta,!1),le(v,Q,h))).then(v=>{v=v||D(Q,h,!1),v&&(H.delta&&!yt(v,Te.NAVIGATION_CANCELLED)?o.go(-H.delta,!1):H.type===Ro.pop&&yt(v,Te.NAVIGATION_ABORTED|Te.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),ne(Q,h,v)}).catch(Ks)}))}let ee=Os(),ae=Os(),te;function le(A,K,H){qe(A);const Q=ae.list();return Q.length?Q.forEach(de=>de(A,K,H)):console.error(A),Promise.reject(A)}function Fe(){return te&&a.value!==Ot?Promise.resolve():new Promise((A,K)=>{ee.add([A,K])})}function qe(A){return te||(te=!A,$(),ee.list().forEach(([K,H])=>A?H(A):K()),ee.reset()),A}function at(A,K,H,Q){const{scrollBehavior:de}=e;if(!ms||!de)return Promise.resolve();const h=!H&&Pd(tl(A.fullPath,0))||(Q||!H)&&history.state&&history.state.scroll||null;return $t().then(()=>de(A,K,h)).then(v=>v&&Rd(v)).catch(v=>le(v,A,K))}const ze=A=>o.go(A);let as;const cs=new Set,Wt={currentRoute:a,listening:!0,addRoute:p,removeRoute:w,clearRoutes:t.clearRoutes,hasRoute:L,getRoutes:C,resolve:R,options:e,push:x,replace:k,go:ze,back:()=>ze(-1),forward:()=>ze(1),beforeEach:r.add,beforeResolve:l.add,afterEach:i.add,onError:ae.add,isReady:Fe,install(A){A.component("RouterLink",ip),A.component("RouterView",fp),A.config.globalProperties.$router=Wt,Object.defineProperty(A.config.globalProperties,"$route",{enumerable:!0,get:()=>O(a)}),ms&&!as&&a.value===Ot&&(as=!0,x(o.location).catch(Q=>{}));const K={};for(const Q in Ot)Object.defineProperty(K,Q,{get:()=>a.value[Q],enumerable:!0});A.provide(lr,Wt),A.provide(oa,Bl(K)),A.provide(Po,a);const H=A.unmount;cs.add(A),A.unmount=function(){cs.delete(A),cs.size<1&&(f=Ot,J&&J(),J=null,a.value=Ot,as=!1,te=!1),H()}}};function Xe(A){return A.reduce((K,H)=>K.then(()=>M(H)),Promise.resolve())}return Wt}const pp={class:"card"},hp={key:0,class:"flex flex-wrap items-center justify-between gap-3"},mp={key:1,class:"text-sm muted"},gp={key:2,class:"flex flex-col gap-3 sm:flex-row sm:items-end"},vp={class:"flex-1"},_p=["value"],bp=["disabled"],xp={key:0,class:"animate-spin"},aa={__name:"StartPanel",setup(e){const t=Ht(),s=is(),n=ue(""),o=xe(()=>t.configList.filter(l=>!t.instanceList.some(i=>i.file_name===l.file_name)));Ge(o,l=>{l.some(i=>i.file_name===n.value)||(n.value=l.length?l[0].file_name:"")},{immediate:!0});const r=()=>{if(!n.value){s.toast.error("请先选择一个配置");return}t.startVnt(n.value)};return(l,i)=>{const a=yn("router-link");return y(),E("div",pp,[i[6]||(i[6]=c("h2",{class:"mb-4 text-base font-bold text-slate-900 dark:text-white"},"启动组网",-1)),O(t).configList.length===0?(y(),E("div",hp,[i[2]||(i[2]=c("p",{class:"text-sm muted"},"还没有任何配置,先创建一个组网配置吧。",-1)),ce(a,{to:"/config",class:"btn-primary btn-sm"},{default:Se(()=>[...i[1]||(i[1]=[re("去新建配置",-1)])]),_:1})])):o.value.length===0?(y(),E("div",mp," 所有配置均已启动。 ")):(y(),E("div",gp,[c("div",vp,[i[4]||(i[4]=c("label",{class:"mb-1.5 block text-xs font-medium muted"},"选择配置",-1)),be(c("select",{"onUpdate:modelValue":i[0]||(i[0]=f=>n.value=f),class:"input"},[i[3]||(i[3]=c("option",{value:"",disabled:""},"请选择配置...",-1)),(y(!0),E(ie,null,Ee(o.value,f=>(y(),E("option",{key:f.file_name,value:f.file_name},B(f.config_name||f.file_name),9,_p))),128))],512),[[Fi,n.value]])]),c("button",{class:"btn-primary px-8",disabled:!n.value||!!O(t).loadingMap[n.value],onClick:r},[O(t).loadingMap[n.value]?(y(),E("span",xp,"⟳")):fe("",!0),i[5]||(i[5]=re(" 启动 ",-1))],8,bp)]))])}}},yp={class:"flex items-center justify-between gap-2"},kp=["title"],wp={class:"flex shrink-0 items-center gap-1.5"},Cp={key:0,class:"badge-yellow",title:"配置文件在启动后被修改,重启实例后生效"},Sp={class:"mt-2 text-sm"},Ep={class:"ml-1 font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},Tp={class:"mt-3 flex gap-4 text-xs muted"},Ap={class:"font-bold tabular-nums text-blue-600 dark:text-blue-400"},Ip={class:"font-bold tabular-nums text-green-600 dark:text-green-400"},Rp={class:"font-bold tabular-nums text-slate-400"},$p={class:"mt-4 flex flex-wrap justify-end gap-2"},Pp={key:0,class:"flex items-center gap-1.5 text-xs muted"},Mp=["disabled"],Op={key:0,class:"animate-spin"},Lp=["disabled"],Np={key:0,class:"animate-spin"},Vp=["disabled"],jp={key:0,class:"animate-spin"},ca={__name:"InstanceCard",props:{inst:{type:Object,required:!0},selectable:{type:Boolean,default:!1}},setup(e){const t=e,s=Ht(),n=is(),o=xe(()=>s.infoOf(t.inst.file_name)),r=xe(()=>!!s.loadingMap[t.inst.file_name]),l=xe(()=>!!s.stoppingMap[t.inst.file_name]),i=xe(()=>t.inst.config_name||t.inst.file_name),a=w=>l.value?"badge-yellow":w==="running"?"badge-green":w==="starting"?"badge-blue":"badge-gray",f=w=>l.value?"停止中":w==="running"?"运行中":w==="starting"?"启动中":"已停止",u=()=>{t.selectable&&(s.selectedInstance=t.inst.file_name)},d=async()=>{await n.confirm({title:"停止组网",message:`确定要停止 ${i.value} 吗?`,danger:!0,confirmText:"停止"})&&s.stopVnt(t.inst.file_name)},g=async()=>{await n.confirm({title:"重启组网",message:`确定要重启 ${i.value} 吗?`})&&s.restartVnt(t.inst.file_name)},p=async()=>{await n.confirm({title:"移除实例",message:`确定要移除已停止的实例 ${i.value} 吗?`,danger:!0,confirmText:"移除"})&&s.dismissInstance(t.inst.file_name)};return(w,C)=>(y(),E("div",{class:q(["card",[e.selectable?"cursor-pointer":"",e.selectable&&O(s).selectedInstance===e.inst.file_name?"ring-2 ring-indigo-500 dark:ring-indigo-400":""]]),onClick:u},[c("div",yp,[c("h3",{class:"truncate text-base font-bold text-slate-900 dark:text-white",title:e.inst.file_name},B(i.value),9,kp),c("div",wp,[o.value.config_changed?(y(),E("span",Cp," 配置发生变化 ")):fe("",!0),c("span",{class:q([a(e.inst.status),l.value?"animate-pulse":""])},B(f(e.inst.status)),3)])]),c("div",Sp,[C[0]||(C[0]=c("span",{class:"muted"},"虚拟 IP:",-1)),c("span",Ep,B(o.value.ip||"-"),1)]),c("div",Tp,[c("span",null,[C[1]||(C[1]=re(" 在线 ",-1)),c("span",Ap,B(o.value.online_client_num||0),1)]),c("span",null,[C[2]||(C[2]=re(" 直连 ",-1)),c("span",Ip,B(o.value.direct_client_num||0),1)]),c("span",null,[C[3]||(C[3]=re(" 离线 ",-1)),c("span",Rp,B(o.value.offline_client_num||0),1)])]),c("div",$p,[l.value?(y(),E("span",Pp,[...C[4]||(C[4]=[c("span",{class:"inline-block animate-spin"},"⟳",-1),re(" 正在停止,请稍候... ",-1)])])):(y(),E(ie,{key:1},[e.inst.status==="running"||e.inst.status==="stopped"?(y(),E("button",{key:0,class:"btn-primary btn-sm",disabled:r.value,onClick:xs(g,["stop"])},[r.value?(y(),E("span",Op,"⟳")):fe("",!0),re(" "+B(e.inst.status==="stopped"?"重新启动":"重启"),1)],8,Mp)):fe("",!0),e.inst.status!=="stopped"?(y(),E("button",{key:1,class:"btn-danger btn-sm",disabled:r.value,onClick:xs(d,["stop"])},[r.value?(y(),E("span",Np,"⟳")):fe("",!0),C[5]||(C[5]=re(" 停止 ",-1))],8,Lp)):fe("",!0),e.inst.status==="stopped"?(y(),E("button",{key:2,class:"btn-ghost btn-sm",disabled:r.value,onClick:xs(p,["stop"])},[r.value?(y(),E("span",jp,"⟳")):fe("",!0),C[6]||(C[6]=re(" 移除 ",-1))],8,Vp)):fe("",!0)],64))])],2))}},Dp={class:"card p-12 text-center text-slate-500 dark:text-slate-400"},ln={__name:"EmptyState",props:{text:{type:String,default:"暂无数据"}},setup(e){return(t,s)=>(y(),E("div",Dp,[s[0]||(s[0]=c("svg",{class:"w-12 h-12 mx-auto mb-3 text-slate-300 dark:text-slate-600",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"})],-1)),c("p",null,B(e.text),1)]))}},Fp={class:"space-y-6"},Bp={class:"flex flex-wrap items-end justify-between gap-4"},Up={class:"page-subtitle"},Hp={class:"grid grid-cols-2 gap-4 lg:grid-cols-4"},Wp={class:"card"},Kp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Gp={class:"ml-1 text-sm font-normal muted"},qp={class:"card"},zp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Jp={class:"card"},Yp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Qp={class:"card"},Zp={class:"mt-2 text-2xl font-bold tabular-nums text-slate-900 dark:text-white"},Xp={class:"text-sm font-normal muted"},e0={key:1,class:"muted"},t0={class:"mb-3 flex items-center justify-between"},s0={__name:"DashboardView",setup(e){const t=Ht(),s=xe(()=>Object.values(t.instances).reduce((r,l)=>r+(l?.online_client_num||0),0)),n=xe(()=>{const r=t.instanceList.filter(i=>i.status==="running");return{connected:r.filter(i=>t.instances[i.file_name]?.server_info?.some(f=>f.connected)).length,total:r.length}}),o=xe(()=>t.runningCount>0?`运行中 ${t.runningCount} 个实例`:t.startingCount>0?"有实例正在启动...":"全部实例已停止");return(r,l)=>{const i=yn("router-link");return y(),E("div",Fp,[c("div",Bp,[c("div",null,[l[0]||(l[0]=c("h1",{class:"page-title"},"总览",-1)),c("p",Up,B(o.value),1)]),ce(i,{to:"/config",class:"btn-ghost btn-sm"},{default:Se(()=>[...l[1]||(l[1]=[re("管理配置",-1)])]),_:1})]),c("div",Hp,[c("div",Wp,[l[2]||(l[2]=c("div",{class:"text-xs font-medium muted"},"运行实例",-1)),c("div",Kp,[re(B(O(t).runningCount),1),c("span",Gp,"/ "+B(O(t).instanceList.length),1)])]),c("div",qp,[l[3]||(l[3]=c("div",{class:"text-xs font-medium muted"},"配置总数",-1)),c("div",zp,B(O(t).configList.length),1)]),c("div",Jp,[l[4]||(l[4]=c("div",{class:"text-xs font-medium muted"},"在线设备",-1)),c("div",Yp,B(s.value),1)]),c("div",Qp,[l[5]||(l[5]=c("div",{class:"text-xs font-medium muted"},"服务器连接",-1)),c("div",Zp,[n.value.total>0?(y(),E(ie,{key:0},[c("span",{class:q(n.value.connected>0?"text-green-600 dark:text-green-400":"text-red-500")},B(n.value.connected),3),c("span",Xp,"/ "+B(n.value.total)+" 已连接",1)],64)):(y(),E("span",e0,"-"))])])]),ce(aa),c("div",null,[c("div",t0,[l[7]||(l[7]=c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"实例概览",-1)),ce(i,{to:"/instances",class:"text-sm font-medium text-indigo-600 hover:text-indigo-500 dark:text-indigo-400"},{default:Se(()=>[...l[6]||(l[6]=[re("查看详情 →",-1)])]),_:1})]),O(t).instanceList.length===0?(y(),Me(ln,{key:0,text:O(t).configList.length===0?"暂无配置,请先新建配置":"暂无运行中的组网,请在上方选择配置启动"},null,8,["text"])):(y(),Me(er,{key:1,name:"card-list",tag:"div",class:"grid grid-cols-1 gap-4 md:grid-cols-2"},{default:Se(()=>[(y(!0),E(ie,null,Ee(O(t).instanceList,a=>(y(),Me(ca,{key:a.file_name,inst:a},null,8,["inst"]))),128))]),_:1}))])])}}},n0={class:"space-y-6"},o0={class:"card"},r0={class:"mb-4 text-lg font-bold text-slate-900 dark:text-white"},l0={class:"ml-2 text-sm font-medium text-indigo-600 dark:text-indigo-400"},i0={class:"grid grid-cols-1 gap-4 text-sm md:grid-cols-2"},a0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},c0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},u0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},f0={class:"font-mono text-slate-900 dark:text-white"},d0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},p0={class:"font-mono text-slate-900 dark:text-white"},h0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},m0={class:"font-mono tabular-nums text-slate-900 dark:text-white"},g0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},v0={class:"font-mono text-indigo-600 dark:text-indigo-400"},_0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},b0=["title"],x0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},y0={class:"text-slate-900 dark:text-white"},k0={class:"flex justify-between border-b border-slate-100 pb-2 dark:border-slate-700"},w0=["title"],C0={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-4"},S0={class:"text-sm text-slate-600 dark:text-slate-300"},E0={class:"mt-4"},T0={class:"flex flex-wrap gap-2"},A0={key:0,class:"text-xs text-slate-400"},I0={class:"card p-0 overflow-hidden"},R0={class:"custom-scrollbar max-h-[400px] overflow-x-auto"},$0={class:"table"},P0={class:"font-mono"},M0={class:"tabular-nums"},O0={key:0},L0={__name:"InstancesView",setup(e){const t=Ht();return(s,n)=>(y(),E("div",n0,[n[13]||(n[13]=c("div",null,[c("h1",{class:"page-title"},"实例"),c("p",{class:"page-subtitle"},"管理组网实例,点击卡片查看详情")],-1)),ce(aa),O(t).instanceList.length===0?(y(),Me(ln,{key:0,text:"暂无运行中的组网,请在上方选择配置启动"})):(y(),Me(er,{key:1,name:"card-list",tag:"div",class:"grid grid-cols-1 gap-4 md:grid-cols-2"},{default:Se(()=>[(y(!0),E(ie,null,Ee(O(t).instanceList,o=>(y(),Me(ca,{key:o.file_name,inst:o,selectable:""},null,8,["inst"]))),128))]),_:1})),O(t).selectedInstance&&O(t).selectedInfo?(y(),E(ie,{key:2},[c("div",o0,[c("h2",r0,[n[0]||(n[0]=re(" 网络详情 ",-1)),c("span",l0,B(O(t).selectedConfigName),1)]),c("div",i0,[c("div",a0,[n[1]||(n[1]=c("span",{class:"muted"},"虚拟 IP / 掩码",-1)),c("span",c0,B(O(t).selectedInfo.ip||"-")+" / "+B(O(t).selectedInfo.prefix_len||"-"),1)]),c("div",u0,[n[2]||(n[2]=c("span",{class:"muted"},"网关",-1)),c("span",f0,B(O(t).selectedInfo.gateway||"-"),1)]),c("div",d0,[n[3]||(n[3]=c("span",{class:"muted"},"网络编号",-1)),c("span",p0,B(O(t).selectedInfo.network_code||"-"),1)]),c("div",h0,[n[4]||(n[4]=c("span",{class:"muted"},"MTU",-1)),c("span",m0,B(O(t).selectedInfo.mtu||""),1)]),c("div",g0,[n[5]||(n[5]=c("span",{class:"muted"},"NAT 类型",-1)),c("span",v0,B(O(t).selectedInfo.nat_type||"Unknown"),1)]),c("div",_0,[n[6]||(n[6]=c("span",{class:"muted"},"Public IPv6",-1)),c("span",{class:"max-w-[200px] truncate font-mono text-slate-900 dark:text-white",title:O(t).selectedInfo.public_ipv6},B(O(t).selectedInfo.public_ipv6||"-"),9,b0)]),c("div",x0,[n[7]||(n[7]=c("span",{class:"muted"},"设备名称",-1)),c("span",y0,B(O(t).selectedInfo.name||"-"),1)]),c("div",k0,[n[8]||(n[8]=c("span",{class:"muted"},"设备 ID",-1)),c("span",{class:"max-w-[200px] truncate font-mono text-xs text-slate-500 dark:text-slate-400",title:O(t).selectedInfo.device_id},B(O(t).selectedInfo.device_id||"-"),9,w0)])]),c("div",C0,[(y(),E(ie,null,Ee([{key:"encrypt",label:"加密"},{key:"compress",label:"压缩"},{key:"fec",label:"FEC纠错"},{key:"rtx",label:"QUIC传输"}],o=>c("div",{key:o.key,class:"flex items-center gap-2 rounded-lg bg-slate-50 px-3 py-2 dark:bg-slate-800/50"},[c("span",{class:q(["h-2 w-2 rounded-full",O(t).selectedInfo[o.key]?"bg-green-500":"bg-slate-300 dark:bg-slate-600"])},null,2),c("span",S0,B(o.label),1)])),64))]),c("div",E0,[n[9]||(n[9]=c("span",{class:"mb-2 block text-sm muted"},"Public IPv4s",-1)),c("div",T0,[(y(!0),E(ie,null,Ee(O(t).selectedInfo.public_ipv4s,o=>(y(),E("span",{key:o,class:"rounded border border-slate-200 bg-slate-50 px-2 py-1 font-mono text-xs tabular-nums text-green-700 dark:border-slate-600 dark:bg-slate-800 dark:text-green-300"},B(o),1))),128)),!O(t).selectedInfo.public_ipv4s||O(t).selectedInfo.public_ipv4s.length===0?(y(),E("span",A0,"无")):fe("",!0)])])]),c("div",I0,[n[12]||(n[12]=c("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[c("h2",{class:"text-lg font-bold text-slate-900 dark:text-white"},"服务器连接列表")],-1)),c("div",R0,[c("table",$0,[n[11]||(n[11]=c("thead",null,[c("tr",null,[c("th",null,"地址"),c("th",null,"状态"),c("th",null,"延迟"),c("th",null,"版本")])],-1)),c("tbody",null,[(y(!0),E(ie,null,Ee(O(t).selectedInfo.server_info,(o,r)=>(y(),E("tr",{key:r},[c("td",P0,B(o.server),1),c("td",null,[c("span",{class:q(o.connected?"badge-green":"badge-red")},B(o.connected?"已连接":"未连接"),3)]),c("td",M0,B(o.server_rtt?o.server_rtt+" ms":"-"),1),c("td",null,B(o.server_version||"-"),1)]))),128)),!O(t).selectedInfo.server_info||O(t).selectedInfo.server_info.length===0?(y(),E("tr",O0,[...n[10]||(n[10]=[c("td",{colspan:"4",class:"text-center text-slate-400"},"暂无数据",-1)])])):fe("",!0)])])])])],64)):fe("",!0)]))}},Mo=()=>({config_name:"",network_code:"",server:[""],ip:"",mtu:null,rtx:!1,fec:!1,compress:!1,no_punch:!1,input:[],output:[],no_nat:!1,no_tun:!1,port_mapping:[],allow_mapping:!1,device_name:"",device_id:"",tun_name:"",password:"",cert_mode:"skip",fingerprint:"",udp_stun:[],tcp_stun:[],tunnel_port:null}),hl=e=>{const t=Mo(),s=e.split(` -`);for(const n of s){const o=n.trim();if(!(!o||o.startsWith("#"))){if(o.includes("config_name")){const r=o.match(/config_name\s*=\s*"([^"]*)"/);r&&(t.config_name=r[1])}else if(o.includes("network_code")){const r=o.match(/network_code\s*=\s*"([^"]*)"/);r&&(t.network_code=r[1])}else if(o.startsWith("server")){const r=o.match(/server\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.server=l.map(i=>i.replace(/"/g,"")))}}else if(o.includes("ip =")){const r=o.match(/ip\s*=\s*"([^"]*)"/);r&&(t.ip=r[1])}else if(o.includes("mtu =")){const r=o.match(/mtu\s*=\s*(\d+)/);r&&(t.mtu=parseInt(r[1]))}else if(o.match(/^rtx\s*=/))t.rtx=o.includes("true");else if(o.match(/^fec\s*=/))t.fec=o.includes("true");else if(o.match(/^compress\s*=/))t.compress=o.includes("true");else if(o.match(/^no_punch\s*=/))t.no_punch=o.includes("true");else if(o.startsWith("input")){const r=o.match(/input\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.input=l.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("output")){const r=o.match(/output\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.output=l.map(i=>i.replace(/"/g,"")))}}else if(o.match(/^no_nat\s*=/))t.no_nat=o.includes("true");else if(o.match(/^no_tun\s*=/))t.no_tun=o.includes("true");else if(o.startsWith("port_mapping")){const r=o.match(/port_mapping\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.port_mapping=l.map(i=>i.replace(/"/g,"")))}}else if(o.match(/^allow_mapping\s*=/))t.allow_mapping=o.includes("true");else if(o.includes("device_name")){const r=o.match(/device_name\s*=\s*"([^"]*)"/);r&&(t.device_name=r[1])}else if(o.includes("device_id")){const r=o.match(/device_id\s*=\s*"([^"]*)"/);r&&(t.device_id=r[1])}else if(o.includes("tun_name")){const r=o.match(/tun_name\s*=\s*"([^"]*)"/);r&&(t.tun_name=r[1])}else if(o.includes("password =")){const r=o.match(/password\s*=\s*"([^"]*)"/);r&&(t.password=r[1])}else if(o.includes("cert_mode")){const r=o.match(/cert_mode\s*=\s*"([^"]*)"/);if(r){const l=r[1];l.startsWith("finger:")?(t.cert_mode="finger",t.fingerprint=l.substring(7)):t.cert_mode=l}}else if(o.startsWith("udp_stun")){const r=o.match(/udp_stun\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.udp_stun=l.map(i=>i.replace(/"/g,"")))}}else if(o.startsWith("tcp_stun")){const r=o.match(/tcp_stun\s*=\s*\[(.*)\]/);if(r){const l=r[1].match(/"([^"]*)"/g);l&&(t.tcp_stun=l.map(i=>i.replace(/"/g,"")))}}}}return t},po=e=>{let t="";e.config_name&&(t+=`# 配置名称 -config_name = "${e.config_name}" -`),t+=` -# --- 网络配置 --- -`,t+=`# 网络编号,相同网络编号的会组在同一个虚拟网 (必填) -`,t+=`network_code = "${e.network_code}" - -`;const s=e.server.filter(a=>a.trim());s.length>0&&(t+=`# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填) -`,t+=`# dynamic 协议使用dns txt解析记录值 -`,t+=`server = [${s.map(a=>`"${a}"`).join(", ")}] -`),e.ip&&(t+=` -# 自定义虚拟 IP (可选) -`,t+=`ip = "${e.ip}" -`),e.rtx&&(t+=` -# 是否启用quic优化传输 (默认 false) -`,t+=`# 开启后传输过程几乎不会丢包,但是延迟可能会有波动 -`,t+=`rtx = true -`),e.fec&&(t+=` -# 是否启用 FEC 前向纠错 (默认 false) -`,t+=`# 开启后可以减少丢包率,损失带宽但是延迟比较稳定,带宽充足时可以使用此功能 -`,t+=`fec = true -`),e.no_punch&&(t+=` -# 是否关闭 P2P 打洞 (默认 false) -`,t+=`no_punch = true -`),e.compress&&(t+=` -# 是否启用 LZ4 压缩 (默认 false) -`,t+=`compress = true -`);const n=e.input.filter(a=>a.trim());n.length>0&&(t+=` -# 入栈监听网段 (逗号分隔的 CIDR 和目标 IP),用于点对网,将指定网段的流量发送到目标节点 -`,t+=`# 例如192.168.0.0/24,10.26.0.2 表示将192.168.0.0/24网段的数据转发到10.26.0.2 -`,t+=`input = [${n.map(a=>`"${a}"`).join(", ")}] -`);const o=e.output.filter(a=>a.trim());o.length>0&&(t+=` -# 出栈允许网段,用于点对网,允许指定网段的转发 -`,t+=`output = [${o.map(a=>`"${a}"`).join(", ")}] -`),e.no_nat&&(t+=` -# 是否关闭内置子网NAT,关闭后需要配置网卡转发,否则无法使用点对网 -`,t+=`# 通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好 -`,t+=`no_nat = true -`),e.no_tun&&(t+=` -# 是否关闭TUN虚拟网卡,关闭后只能充当流量出口或者进行端口映射,关闭后无需管理员权限 -`,t+=`no_tun = true -`);const r=e.port_mapping.filter(a=>a.trim());r.length>0&&(t+=` -# 端口映射,格式为:协议://本地监听地址-目标虚拟IP-目标映射地址 -`,t+=`# 端口映射用于在本地监听指定端口,并将收到的网络流量经由指定虚拟节点转发到目标地址 -`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80 表示将本地tcp的81端口的数据转发到10.0.0.2:80 -`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-192.168.1.10:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到192.168.1.10:80 -`,t+=`# 例如: tcp://0.0.0.0:81-10.0.0.2-anyonehost:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到anyonehost:80 -`,t+=`port_mapping = [${r.map(a=>`"${a}"`).join(", ")}] -`),e.allow_mapping&&(t+=` -# 是否允许作为端口映射出口,开启后其他设备才可使用本设备的ip为"目标虚拟IP" -`,t+=`# 开启后虚拟网络其他设备可以使用此设备当跳板访问其他网络 -`,t+=`allow_mapping = true -`),e.mtu&&(t+=` -# MTU 设置 -`,t+=`mtu = ${e.mtu} -`),t+=` -# --- 设备配置 --- -`,e.device_name&&(t+=` -# 设备名称 (可选,默认读取本机 hostname) -`,t+=`device_name = "${e.device_name}" -`),e.device_id&&(t+=` -# 设备 ID (可选,不填自动生成,不同设备ID不能相同) -`,t+=`device_id = "${e.device_id}" -`),e.tun_name&&(t+=` -# 虚拟网卡名称 -`,t+=`tun_name = "${e.tun_name}" -`),t+=` -# --- 安全配置 --- -`,e.password&&(t+=` -# 组网加密密码 (可选) -`,t+=`password = "${e.password}" -`),e.cert_mode&&e.cert_mode!=="skip"&&(t+=` -# 证书校验方式: -`,t+=`# skip 跳过验证(默认) -`,t+=`# standard 使用系统证书验证 -`,t+=`# finger 使用证书指纹验证,服务端启动时日志会输出指纹 -`,e.cert_mode==="finger"&&e.fingerprint?t+=`cert_mode = "finger:${e.fingerprint}" -`:t+=`cert_mode = "${e.cert_mode}" -`);const l=e.udp_stun.filter(a=>a.trim());l.length>0&&(t+=` -# 自定义UDP STUN地址,不设置则用默认stun -`,t+=`udp_stun = [${l.map(a=>`"${a}"`).join(", ")}] -`);const i=e.tcp_stun.filter(a=>a.trim());return i.length>0&&(t+=` -# 自定义TCP STUN地址,不设置则用默认stun -`,t+=`tcp_stun = [${i.map(a=>`"${a}"`).join(", ")}] -`),t},N0=`# config_name = "配置名称" -# --- 网络配置 --- -# 网络编号,相同网络编号的会组在同一个虚拟网 (必填) -network_code = "your_network_code" - -# 服务器地址列表(支持 quic / tcp / wss / dynamic) (必填) -# dynamic 协议使用dns txt解析记录值 -server = ["quic://1.2.3.4:29872"] - -# ===简单使用以下参数可以不动=== - -# 自定义虚拟 IP (可选) -# ip = "10.10.0.2" - -# 是否启用quic优化传输 (默认 false,设置为true时开启) -# 开启后传输过程几乎不会丢包,但是延迟会有波动 -# rtx = false - -# 是否启用 FEC 前向纠错,损失一定带宽来提升网络稳定性(默认 false,设置为true时开启) -# 开启后可以减少丢包率,损失带宽但是延迟比较稳定,带宽充足时可以使用此功能 -# fec = false - -# 是否关闭 P2P 打洞 (默认 false,设置为true时关闭) -# no_punch = false - -# 是否启用 LZ4 压缩 (默认 false,设置为true时开启) -# compress = false - -# 入栈监听网段 (逗号分隔的 CIDR 和目标 IP),用于点对网,将指定网段的流量发送到目标节点 -# input = ["192.168.0.0/24,10.26.0.2", "192.168.1.0/24,10.26.0.3"] - -# 出栈允许网段,用于点对网,允许指定网段的转发 -# output = ["0.0.0.0/0"] - -# 是否关闭内置子网NAT,关闭(设为true)后需要配置网卡转发,否则无法使用点对网。通常关闭内置子网NAT,使用系统的网卡转发,点对网性能会更好 -# no_nat = false - -# 是否关闭TUN虚拟网卡,关闭(设为true)后只能充当流量出口或者进行端口映射,关闭后无需管理员权限 -# no_tun = false - -# 端口映射,格式为:协议://本地监听地址-目标虚拟IP-目标映射地址 -# 端口映射用于在本地监听指定端口,并将收到的网络流量经由指定虚拟节点转发到目标地址,从而实现跨网络或内网服务访问 -# 例如 port_mapping = ["tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80"] -# tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80 则表示将本地tcp的81端口的数据转发到10.0.0.2:80 -# tcp://0.0.0.0:81-10.0.0.2-192.168.1.10:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到192.168.1.10:80 -# tcp://0.0.0.0:81-10.0.0.2-anyonehost:80 则表示将本地tcp的81端口的数据经过10.0.0.2转到anyonehost:80 -# port_mapping = [] - -# 是否允许作为端口映射出口,开启(设置为true)后其他设备才可使用本设备的ip为"目标虚拟IP" -# 开启后虚拟网络其他设备可以使用此设备当跳板访问其他网络 -# allow_mapping = false - -# MTU 设置 -# mtu = 1400 - -# --- 设备配置 --- - -# 设备名称 (可选,默认读取本机 hostname) -# device_name = "my-device" - -# 设备 ID (可选,不填自动生成,不同设备ID不能相同) -# device_id = "device-id-xxxx" - -# 虚拟网卡名称 -# tun_name = "vnt-tun" - -# --- 安全配置 --- - -# 加密密码 (可选) -# password = "123456" - -# 证书校验方式: -# skip 跳过验证(默认) -# standard 使用系统证书验证 -# finger 使用证书指纹验证,服务端启动时日志会输出指纹, -# 例如 finger:3bdd8675606837cdf95d5e13445606315762315a78555f9da652940a25feaec1 -# cert_mode = "skip" - -# --- 其他配置 --- -# 自定义stun地址,分别用于udp打洞和tcp打洞,需要单独配置,不设置则用默认stun -# udp_stun = ["stun.chat.bilibili.com"] -# tcp_stun = ["stun.nextcloud.com:443"]`,V0={class:"text-lg font-bold text-slate-900 dark:text-white"},j0={class:"flex items-center gap-4"},D0={class:"flex rounded-lg border border-slate-300 bg-slate-100 p-1 dark:border-slate-600 dark:bg-slate-800"},F0={key:0,class:"text-sm text-slate-500 font-mono hidden md:block"},B0={class:"h-full overflow-y-auto scrollbar-hide p-6"},U0={class:"max-w-4xl mx-auto space-y-6"},H0={class:"card"},W0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},K0={class:"mt-4"},G0={class:"space-y-2"},q0=["onUpdate:modelValue"],z0=["onClick"],J0={class:"card"},Y0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Q0={class:"card"},Z0={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},X0={class:"card"},eh={class:"space-y-4"},th={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},sh={key:0},nh={class:"card"},oh={class:"space-y-4"},rh={class:"space-y-2"},lh=["onUpdate:modelValue"],ih=["onClick"],ah={class:"space-y-2"},ch=["onUpdate:modelValue"],uh=["onClick"],fh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},dh={class:"card"},ph={class:"space-y-4"},hh={class:"space-y-2"},mh=["onUpdate:modelValue"],gh=["onClick"],vh={class:"card"},_h={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},bh={class:"card"},xh={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},yh={class:"space-y-2"},kh=["onUpdate:modelValue"],wh=["onClick"],Ch={class:"space-y-2"},Sh=["onUpdate:modelValue"],Eh=["onClick"],Th={class:"h-full"},Ah={class:"flex-1 text-left text-xs text-slate-500"},Ih={key:0},Rh={key:1},Jt="h-5 w-5 rounded border-slate-300 bg-white text-indigo-600 focus:ring-indigo-500 dark:border-slate-600 dark:bg-slate-700",Yt="flex cursor-pointer items-center justify-between gap-2 rounded-lg border border-slate-200 bg-slate-50 p-3 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:bg-slate-800/50 dark:hover:bg-slate-800",ds="shrink-0 rounded-lg bg-red-50 px-3 py-2 text-red-500 transition-colors hover:bg-red-100 dark:bg-red-900/20 dark:text-red-500 dark:hover:bg-red-900/40",ps="flex w-full items-center justify-center gap-1 rounded-lg bg-slate-100 px-3 py-2 text-sm text-slate-600 transition-colors hover:bg-slate-200 dark:bg-slate-700/50 dark:text-slate-300 dark:hover:bg-slate-700",Lt="text-md mb-4 flex items-center font-bold text-slate-900 dark:text-white",$h={__name:"ConfigEditor",props:{show:{type:Boolean,default:!1},fileName:{type:String,default:null}},emits:["close","saved"],setup(e,{emit:t}){const s=e,n=t,o=is(),r=ue(""),l=ue(""),i=ue("new"),a=ue("form"),f=ue(""),u=ue(!1),d=ue(!1),g=ue(!1),p=ue(Mo());Ge(()=>s.show,async R=>{if(R)if(l.value=s.fileName||"",i.value=s.fileName?"edit":"new",a.value="form",u.value=!1,d.value=!1,s.fileName)try{const m=await nf(s.fileName);r.value=m,f.value=m,g.value=!0,p.value=hl(m),$t(()=>{g.value=!1})}catch(m){o.toast.error("获取配置失败: "+m.message),n("close")}else f.value="",p.value=Mo(),r.value=N0});const w=()=>{a.value==="toml"?(a.value="form",g.value=!0,p.value=hl(r.value),$t(()=>{g.value=!1})):a.value="form"},C=()=>{a.value==="form"&&(d.value?(r.value=po(p.value),d.value=!1):f.value&&!u.value?r.value=f.value:r.value=po(p.value)),a.value="toml"};Ge(r,(R,m)=>{a.value==="toml"&&m!==void 0&&(u.value=!0)}),Ge(p,()=>{a.value==="form"&&s.show&&!g.value&&(d.value=!0)},{deep:!0});const L=async()=>{try{let R=r.value;if(a.value==="form"){if(!p.value.network_code.trim()){o.toast.error("请填写网络编号");return}if(p.value.server.filter(_=>_.trim()).length===0){o.toast.error("请至少填写一个服务器地址");return}R=po(p.value)}await of(l.value||null,R),o.toast.success("配置已保存"),n("close"),n("saved")}catch(R){o.toast.error("保存失败: "+R.message)}};return(R,m)=>(y(),Me(nr,{show:e.show,"mask-closable":!1,"panel-class":"w-full max-w-6xl h-[85vh]",onClose:m[26]||(m[26]=_=>n("close"))},{header:Se(()=>[c("h3",V0,B(i.value==="new"?"新建配置":"编辑配置"),1),c("div",j0,[c("div",D0,[c("button",{onClick:w,class:q([a.value==="form"?"bg-white text-slate-900 shadow-sm dark:bg-indigo-600 dark:text-white":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white","px-4 py-1.5 rounded text-sm font-medium transition-colors flex items-center"])},[...m[27]||(m[27]=[c("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1),re(" 表单模式 ",-1)])],2),c("button",{onClick:C,class:q([a.value==="toml"?"bg-white text-slate-900 shadow-sm dark:bg-indigo-600 dark:text-white":"text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white","px-4 py-1.5 rounded text-sm font-medium transition-colors flex items-center"])},[...m[28]||(m[28]=[c("svg",{class:"w-4 h-4 mr-1.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"})],-1),re(" TOML模式 ",-1)])],2)]),l.value?(y(),E("div",F0,B(l.value),1)):fe("",!0)])]),body:Se(()=>[be(c("div",B0,[c("div",U0,[c("div",H0,[c("h4",{class:q(Lt)},[...m[29]||(m[29]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),re(" 基础配置 ",-1)])]),c("div",W0,[c("div",null,[m[30]||(m[30]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"配置名称",-1)),be(c("input",{"onUpdate:modelValue":m[0]||(m[0]=_=>p.value.config_name=_),type:"text",placeholder:"例如: 我的VPN配置",class:"input"},null,512),[[Le,p.value.config_name]])]),c("div",null,[m[31]||(m[31]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[re(" 网络编号 "),c("span",{class:"text-red-500"},"*")],-1)),be(c("input",{"onUpdate:modelValue":m[1]||(m[1]=_=>p.value.network_code=_),type:"text",placeholder:"例如: my_network",required:"",class:"input"},null,512),[[Le,p.value.network_code]])])]),c("div",K0,[m[34]||(m[34]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[re(" 服务器地址 "),c("span",{class:"text-red-500"},"*"),c("span",{class:"text-xs text-slate-500 ml-2"},"支持 quic:// tcp:// wss:// dynamic://")],-1)),c("div",G0,[(y(!0),E(ie,null,Ee(p.value.server,(_,x)=>(y(),E("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":k=>p.value.server[x]=k,type:"text",placeholder:"例如: quic://1.2.3.4:29872",class:"input flex-1"},null,8,q0),[[Le,p.value.server[x]]]),p.value.server.length>1?(y(),E("button",{key:0,onClick:k=>p.value.server.splice(x,1),class:q(ds)},[...m[32]||(m[32]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,z0)):fe("",!0)]))),128)),c("button",{onClick:m[2]||(m[2]=_=>p.value.server.push("")),class:q(ps)},[...m[33]||(m[33]=[c("svg",{class:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),re(" 添加服务器 ",-1)])])])])]),c("div",J0,[c("h4",{class:q(Lt)},[...m[35]||(m[35]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})],-1),re(" 网络设置 ",-1)])]),c("div",Y0,[c("div",null,[m[36]||(m[36]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[re(" 自定义虚拟IP "),c("span",{class:"text-xs text-slate-500 ml-1"},"(可选)")],-1)),be(c("input",{"onUpdate:modelValue":m[3]||(m[3]=_=>p.value.ip=_),type:"text",placeholder:"例如: 10.26.0.2",class:"input"},null,512),[[Le,p.value.ip]])]),c("div",null,[m[37]||(m[37]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"MTU",-1)),be(c("input",{"onUpdate:modelValue":m[4]||(m[4]=_=>p.value.mtu=_),type:"number",placeholder:"1380",class:"input"},null,512),[[Le,p.value.mtu,void 0,{number:!0}]])]),c("div",null,[m[38]||(m[38]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"隧道端口",-1)),be(c("input",{"onUpdate:modelValue":m[5]||(m[5]=_=>p.value.tunnel_port=_),type:"number",placeholder:"0 (自动分配)",class:"input"},null,512),[[Le,p.value.tunnel_port,void 0,{number:!0}]])])])]),c("div",Q0,[c("h4",{class:q(Lt)},[...m[39]||(m[39]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),re(" 传输优化 ",-1)])]),c("div",Z0,[c("label",{class:q(Yt)},[m[40]||(m[40]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"QUIC传输优化"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"重传丢包")],-1)),be(c("input",{"onUpdate:modelValue":m[6]||(m[6]=_=>p.value.rtx=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.rtx]])]),c("label",{class:q(Yt)},[m[41]||(m[41]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"FEC前向纠错"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"损失部分带宽提升稳定性")],-1)),be(c("input",{"onUpdate:modelValue":m[7]||(m[7]=_=>p.value.fec=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.fec]])]),c("label",{class:q(Yt)},[m[42]||(m[42]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"LZ4压缩"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"减少传输数据量")],-1)),be(c("input",{"onUpdate:modelValue":m[8]||(m[8]=_=>p.value.compress=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.compress]])]),c("label",{class:q(Yt)},[m[43]||(m[43]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭P2P打洞"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"仅通过服务器中转")],-1)),be(c("input",{"onUpdate:modelValue":m[9]||(m[9]=_=>p.value.no_punch=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.no_punch]])])])]),c("div",X0,[c("h4",{class:q(Lt)},[...m[44]||(m[44]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1),re(" 安全配置 ",-1)])]),c("div",eh,[c("div",th,[c("div",null,[m[45]||(m[45]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"组网加密密码(连接公共服务器时建议填写,同一组网密码需要相同)",-1)),be(c("input",{"onUpdate:modelValue":m[10]||(m[10]=_=>p.value.password=_),type:"password",placeholder:"留空则不加密",class:"input"},null,512),[[Le,p.value.password]])]),c("div",null,[m[47]||(m[47]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"服务端证书校验模式",-1)),be(c("select",{"onUpdate:modelValue":m[11]||(m[11]=_=>p.value.cert_mode=_),class:"input"},[...m[46]||(m[46]=[c("option",{value:"skip"},"跳过验证 (默认)",-1),c("option",{value:"standard"},"系统证书验证",-1),c("option",{value:"finger"},"证书指纹验证",-1)])],512),[[Fi,p.value.cert_mode]])])]),p.value.cert_mode==="finger"?(y(),E("div",sh,[m[48]||(m[48]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[re(" 证书指纹 "),c("span",{class:"text-xs text-slate-500 ml-1"},"(服务端启动时日志会输出指纹)")],-1)),be(c("input",{"onUpdate:modelValue":m[12]||(m[12]=_=>p.value.fingerprint=_),type:"text",placeholder:"例如: 3bdd8675606837cdf95d5e13445606315762315a78555f9da652940a25feaec1",class:"input font-mono text-sm"},null,512),[[Le,p.value.fingerprint]])])):fe("",!0)])]),c("div",nh,[c("h4",{class:q(Lt)},[...m[49]||(m[49]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 01-.806-.98L15 9m0 0V7m0 2v6"})],-1),re(" NAT与路由 (点对网) ",-1)])]),c("div",oh,[c("div",null,[m[51]||(m[51]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[re(" 入栈网段 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR,目标IP")],-1)),c("div",rh,[(y(!0),E(ie,null,Ee(p.value.input,(_,x)=>(y(),E("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":k=>p.value.input[x]=k,type:"text",placeholder:"例如: 192.168.0.0/24,10.26.0.2",class:"input flex-1"},null,8,lh),[[Le,p.value.input[x]]]),c("button",{onClick:k=>p.value.input.splice(x,1),class:q(ds)},[...m[50]||(m[50]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,ih)]))),128)),c("button",{onClick:m[13]||(m[13]=_=>p.value.input.push("")),class:q(ps)}," + 添加入栈网段 ")])]),c("div",null,[m[53]||(m[53]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[re(" 出栈网段 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: CIDR (允许转发的网段)")],-1)),c("div",ah,[(y(!0),E(ie,null,Ee(p.value.output,(_,x)=>(y(),E("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":k=>p.value.output[x]=k,type:"text",placeholder:"例如: 0.0.0.0/0",class:"input flex-1"},null,8,ch),[[Le,p.value.output[x]]]),c("button",{onClick:k=>p.value.output.splice(x,1),class:q(ds)},[...m[52]||(m[52]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,uh)]))),128)),c("button",{onClick:m[14]||(m[14]=_=>p.value.output.push("")),class:q(ps)}," + 添加出栈网段 ")])]),c("div",fh,[c("label",{class:q(Yt)},[m[54]||(m[54]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭内置NAT"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"使用系统网卡转发")],-1)),be(c("input",{"onUpdate:modelValue":m[15]||(m[15]=_=>p.value.no_nat=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.no_nat]])]),c("label",{class:q(Yt)},[m[55]||(m[55]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"关闭TUN网卡"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"仅作流量出口或端口映射")],-1)),be(c("input",{"onUpdate:modelValue":m[16]||(m[16]=_=>p.value.no_tun=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.no_tun]])])])])]),c("div",dh,[c("h4",{class:q(Lt)},[...m[56]||(m[56]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})],-1),re(" 端口映射 ",-1)])]),c("div",ph,[c("div",null,[m[58]||(m[58]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},[re(" 映射规则 "),c("span",{class:"text-xs text-slate-500 ml-1"},"格式: 协议://监听地址-虚拟IP-目标地址")],-1)),c("div",hh,[(y(!0),E(ie,null,Ee(p.value.port_mapping,(_,x)=>(y(),E("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":k=>p.value.port_mapping[x]=k,type:"text",placeholder:"例如: tcp://0.0.0.0:81-10.0.0.2-10.0.0.2:80",class:"input flex-1 font-mono"},null,8,mh),[[Le,p.value.port_mapping[x]]]),c("button",{onClick:k=>p.value.port_mapping.splice(x,1),class:q(ds)},[...m[57]||(m[57]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,gh)]))),128)),c("button",{onClick:m[17]||(m[17]=_=>p.value.port_mapping.push("")),class:q(ps)}," + 添加映射规则 ")])]),c("label",{class:q(Yt)},[m[59]||(m[59]=c("div",{class:"flex-1"},[c("div",{class:"text-sm font-medium text-slate-800 dark:text-white"},"允许作为映射出口"),c("div",{class:"text-xs text-slate-400 mt-0.5"},"允许其他设备使用本机作跳板")],-1)),be(c("input",{"onUpdate:modelValue":m[18]||(m[18]=_=>p.value.allow_mapping=_),type:"checkbox",class:q(Jt)},null,512),[[zt,p.value.allow_mapping]])])])]),c("div",vh,[c("h4",{class:q(Lt)},[...m[60]||(m[60]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})],-1),re(" 设备配置 ",-1)])]),c("div",_h,[c("div",null,[m[61]||(m[61]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备名称",-1)),be(c("input",{"onUpdate:modelValue":m[19]||(m[19]=_=>p.value.device_name=_),type:"text",placeholder:"默认为主机名",class:"input"},null,512),[[Le,p.value.device_name]])]),c("div",null,[m[62]||(m[62]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"设备ID",-1)),be(c("input",{"onUpdate:modelValue":m[20]||(m[20]=_=>p.value.device_id=_),type:"text",placeholder:"自动生成",class:"input"},null,512),[[Le,p.value.device_id]])]),c("div",null,[m[63]||(m[63]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"虚拟网卡名",-1)),be(c("input",{"onUpdate:modelValue":m[21]||(m[21]=_=>p.value.tun_name=_),type:"text",placeholder:"默认为vnt-tun",class:"input"},null,512),[[Le,p.value.tun_name]])])])]),c("div",bh,[c("h4",{class:q(Lt)},[...m[64]||(m[64]=[c("svg",{class:"w-5 h-5 mr-2",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1),re(" STUN配置 (高级) ",-1)])]),c("div",xh,[c("div",null,[m[66]||(m[66]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"UDP STUN服务器",-1)),c("div",yh,[(y(!0),E(ie,null,Ee(p.value.udp_stun,(_,x)=>(y(),E("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":k=>p.value.udp_stun[x]=k,type:"text",placeholder:"例如: stun.l.google.com:19302",class:"input flex-1"},null,8,kh),[[Le,p.value.udp_stun[x]]]),c("button",{onClick:k=>p.value.udp_stun.splice(x,1),class:q(ds)},[...m[65]||(m[65]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,wh)]))),128)),c("button",{onClick:m[22]||(m[22]=_=>p.value.udp_stun.push("")),class:q(ps)}," + 添加UDP STUN ")])]),c("div",null,[m[68]||(m[68]=c("label",{class:"mb-2 block text-sm font-medium text-slate-600 dark:text-slate-300"},"TCP STUN服务器",-1)),c("div",Ch,[(y(!0),E(ie,null,Ee(p.value.tcp_stun,(_,x)=>(y(),E("div",{key:x,class:"flex gap-2"},[be(c("input",{"onUpdate:modelValue":k=>p.value.tcp_stun[x]=k,type:"text",placeholder:"例如: stun.nextcloud.com:443",class:"input flex-1"},null,8,Sh),[[Le,p.value.tcp_stun[x]]]),c("button",{onClick:k=>p.value.tcp_stun.splice(x,1),class:q(ds)},[...m[67]||(m[67]=[c("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Eh)]))),128)),c("button",{onClick:m[23]||(m[23]=_=>p.value.tcp_stun.push("")),class:q(ps)}," + 添加TCP STUN ")])])])])])],512),[[Vr,a.value==="form"]]),be(c("div",Th,[be(c("textarea",{"onUpdate:modelValue":m[24]||(m[24]=_=>r.value=_),class:"h-full w-full resize-none bg-slate-50 p-4 font-mono text-sm text-slate-800 focus:outline-none dark:bg-slate-950 dark:text-slate-200",spellcheck:"false",placeholder:"# 在此处输入 TOML 配置..."},null,512),[[Le,r.value]])],512),[[Vr,a.value==="toml"]])]),footer:Se(()=>[c("div",Ah,[a.value==="form"?(y(),E("span",Ih,"填写完成后保存即可生成配置文件")):(y(),E("span",Rh,"* 请使用标准 TOML 格式"))]),c("button",{class:"btn-ghost",onClick:m[25]||(m[25]=_=>n("close"))},"取消"),c("button",{class:"btn-primary",onClick:L},"保存配置")]),_:1},8,["show"]))}},Ph={class:"space-y-6"},Mh={class:"flex items-end justify-between gap-4"},Oh={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},Lh=["onClick"],Nh={key:0,class:"absolute right-0 top-0 rounded-bl bg-green-500 px-2 py-1 text-xs text-white"},Vh={key:1,class:"absolute right-0 top-0 rounded-bl bg-indigo-500 px-2 py-1 text-xs text-white"},jh={class:"flex items-start"},Dh={class:"overflow-hidden"},Fh=["title"],Bh=["title"],Uh={class:"mt-4 flex justify-end opacity-0 transition-opacity group-hover:opacity-100"},Hh=["onClick"],Wh=["onClick"],Kh={__name:"ConfigView",setup(e){const t=Ht(),s=is(),n=ue(!1),o=ue(null),r=u=>{const d=t.instanceList.find(g=>g.file_name===u);return d?d.status:null},l=u=>{const d=r(u);return d==="running"?"ring-2 ring-green-500/60":d==="starting"?"ring-2 ring-indigo-500/60":""},i=u=>{o.value=u,n.value=!0},a=()=>{t.fetchConfigList()},f=async u=>{if(await s.confirm({title:"删除配置",message:`确定要删除配置 ${u} 吗?`,danger:!0,confirmText:"删除"}))try{await rf(u),s.toast.success("配置已删除"),t.fetchConfigList()}catch(g){s.toast.error(g.message)}};return ls(()=>t.fetchConfigList()),(u,d)=>(y(),E("div",Ph,[c("div",Mh,[d[3]||(d[3]=c("div",null,[c("h1",{class:"page-title"},"配置"),c("p",{class:"page-subtitle"},"管理组网配置文件")],-1)),c("button",{class:"btn-primary",onClick:d[0]||(d[0]=g=>i(null))},[...d[2]||(d[2]=[c("svg",{class:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),re(" 新建配置 ",-1)])])]),O(t).configList.length===0?(y(),Me(ln,{key:0,text:"暂无配置,点击右上角新建"})):(y(),E("div",Oh,[(y(!0),E(ie,null,Ee(O(t).configList,g=>(y(),E("div",{key:g.file_name,class:q([l(g.file_name),"card group relative flex min-h-[140px] cursor-pointer flex-col justify-between overflow-hidden"]),onClick:p=>i(g.file_name)},[r(g.file_name)==="running"?(y(),E("div",Nh," 运行中 ")):r(g.file_name)==="starting"?(y(),E("div",Vh," 启动中 ")):fe("",!0),c("div",jh,[d[4]||(d[4]=c("div",{class:"mr-3 mt-1 rounded-lg bg-indigo-50 p-2 text-indigo-600 dark:bg-indigo-500/10 dark:text-indigo-400"},[c("svg",{class:"h-6 w-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})])],-1)),c("div",Dh,[c("h3",{class:"truncate text-lg font-bold text-slate-900 dark:text-white",title:g.config_name},B(g.config_name||"Unnamed"),9,Fh),c("p",{class:"truncate font-mono text-xs text-slate-400",title:g.file_name},B(g.file_name),9,Bh)])]),c("div",Uh,[c("button",{class:"mr-4 text-sm text-indigo-600 hover:text-indigo-500 dark:text-indigo-400",onClick:xs(p=>i(g.file_name),["stop"])}," 编辑 ",8,Hh),c("button",{class:"text-sm text-red-500 hover:text-red-400",onClick:xs(p=>f(g.file_name),["stop"])}," 删除 ",8,Wh)])],10,Lh))),128))])),ce($h,{show:n.value,"file-name":o.value,onClose:d[1]||(d[1]=g=>n.value=!1),onSaved:a},null,8,["show","file-name"])]))}},Gh=e=>{if(!e)return"-";const t=new Date(e*1e3),s=n=>n<10?"0"+n:n;return`${t.getFullYear()}-${s(t.getMonth()+1)}-${s(t.getDate())} ${s(t.getHours())}:${s(t.getMinutes())}:${s(t.getSeconds())}`},ml=e=>{if(e===0||e===void 0||e===null)return"0B";const t=["B","KB","MB","GB","TB"];let s=0,n=e;for(;n>=1024&&s{if(e===0||e===void 0||e===null)return"0B/s";const t=["B/s","KB/s","MB/s","GB/s"];let s=0,n=e;for(;n>=1024&&s{const t=[1024,10240,102400,1048576,10485760,104857600,1073741824];for(const s of t)if(e<=s)return s;return Math.ceil(e/(1024*1024*1024))*1024*1024*1024},zh={class:"flex items-center gap-4 mb-2 text-xs text-slate-400"},Jh={class:"ml-auto"},Yh={__name:"SpeedChart",props:{history:{type:Object,required:!0},size:{type:Number,default:60}},setup(e,{expose:t}){const s=e,n=ue(null),o=ue(""),r=()=>{const l=n.value;if(!l)return;const i=l.getContext("2d"),a=s.history?s.history.tx:[],f=s.history?s.history.rx:[],u=s.size,d=window.devicePixelRatio||1,g=l.getBoundingClientRect();if(g.width===0)return;l.width=g.width*d,l.height=g.height*d,i.setTransform(d,0,0,d,0,0);const p=g.width,w=g.height,L=document.documentElement.classList.contains("dark")?{bg:"#0c1222",grid:"rgba(71, 85, 105, 0.3)",rx:"#60a5fa",rxFill:"rgba(96, 165, 250, 0.15)",tx:"#4ade80",txFill:"rgba(74, 222, 128, 0.15)"}:{bg:"#f8fafc",grid:"rgba(148, 163, 184, 0.35)",rx:"#3b82f6",rxFill:"rgba(59, 130, 246, 0.12)",tx:"#22c55e",txFill:"rgba(34, 197, 94, 0.12)"},R=8,m=4,_=0,k=p-_-0,G=w-R-m;i.fillStyle=L.bg,i.fillRect(0,0,p,w);const j=[...a,...f];let U=j.length>0?Math.max(...j):0;U<1024&&(U=1024);const M=qh(U);o.value="峰值: "+Oo(M);const z=4;i.strokeStyle=L.grid,i.lineWidth=1;for(let J=0;J<=z;J++){const $=R+G/z*J;i.beginPath(),i.moveTo(_,$),i.lineTo(_+k,$),i.stroke()}const ne=6;for(let J=0;J<=ne;J++){const $=_+k/ne*J;i.beginPath(),i.moveTo($,R),i.lineTo($,R+G),i.stroke()}const D=(J,$,ee)=>{if(J.length<2)return;const ae=k/(u-1),te=u-J.length;i.beginPath(),i.moveTo(_+te*ae,R+G);for(let le=0;le$t(r)),Ge(()=>[s.history?.tx?.length,s.history?.rx?.length,s.history?.tx?.at(-1),s.history?.rx?.at(-1)],()=>$t(r)),t({draw:r}),(l,i)=>(y(),E("div",null,[c("div",zh,[i[0]||(i[0]=c("span",{class:"flex items-center"},[c("span",{class:"inline-block w-3 h-0.5 bg-green-400 mr-1"}),re("上传速度")],-1)),i[1]||(i[1]=c("span",{class:"flex items-center"},[c("span",{class:"inline-block w-3 h-0.5 bg-blue-400 mr-1"}),re("下载速度")],-1)),c("span",Jh,B(o.value),1)]),c("canvas",{ref_key:"canvasRef",ref:n,class:"rounded w-full block h-[150px]"},null,512)]))}},Qh={class:"space-y-4"},Zh={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},Xh=["onClick"],em={key:2,class:"card overflow-hidden p-0"},tm={class:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-700"},sm={class:"flex gap-4 text-sm muted"},nm={class:"font-medium tabular-nums text-slate-900 dark:text-white"},om={class:"font-medium tabular-nums text-slate-900 dark:text-white"},rm={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},lm={class:"table"},im={class:"transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/50"},am=["onClick"],cm={class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},um=["onMouseenter"],fm={class:"hidden text-xs text-slate-400 md:table-cell"},dm={class:"flex items-center gap-2"},pm={key:0,class:"tooltip"},hm={key:1,class:"tooltip"},mm={key:2,class:"tooltip cursor-help"},gm={class:"tooltip-text"},vm={key:1,class:"text-yellow-600 dark:text-yellow-400"},_m={key:2,class:"text-slate-400"},bm={class:"tabular-nums"},xm=["title"],ym={key:1,class:"text-slate-400"},km={class:"text-xs"},wm={key:0,class:"leading-relaxed"},Cm={class:"text-green-600 tabular-nums dark:text-green-400"},Sm={class:"text-blue-600 tabular-nums dark:text-blue-400"},Em={key:1,class:"text-slate-400"},Tm={class:"hidden font-mono text-xs text-slate-400 md:table-cell"},Am={key:0},Im={colspan:"10",class:"p-0"},Rm={class:"border-t border-slate-200 bg-slate-50 px-4 py-3 dark:border-slate-700/50 dark:bg-slate-950/60"},$m=60,Pm={__name:"PeersView",setup(e){const t=Ht(),s=rt("peerTooltip"),n=(_,x)=>s.value?.showPeerTooltip(_,x),o=()=>s.value?.hidePeerTooltip(),r=ue([]);let l=null,i={},a=0;const f=rs({}),u={},d=_=>{f[_]=!f[_]},g=()=>{const _=t.instanceList.find(x=>x.file_name===t.selectedInstance);return _?_.status:null},p=()=>{r.value=[],i={},a=0;for(const _ in u)delete u[_];for(const _ in f)delete f[_]},w=async()=>{if(!t.selectedInstance||g()!=="running"){p();return}try{const _=await zu(t.selectedInstance)||[],x=Date.now(),k=a>0?(x-a)/1e3:0,G={};for(const j of _)if(j.traffic){const U=j.ip,M=i[U];if(M&&k>0){const z=Math.max(0,j.traffic.tx_bytes-M.tx_bytes),ne=Math.max(0,j.traffic.rx_bytes-M.rx_bytes);j.traffic.tx_speed=Math.round(z/k),j.traffic.rx_speed=Math.round(ne/k)}else j.traffic.tx_speed=0,j.traffic.rx_speed=0;G[U]={tx_bytes:j.traffic.tx_bytes,rx_bytes:j.traffic.rx_bytes},u[U]||(u[U]={tx:[],rx:[]}),u[U].tx.push(j.traffic.tx_speed),u[U].rx.push(j.traffic.rx_speed),u[U].tx.length>$m&&(u[U].tx.shift(),u[U].rx.shift())}i=G,a=x,r.value=_}catch(_){console.error(_)}};ls(()=>{w(),l=setInterval(()=>{t.isPageVisible&&w()},3e3)}),As(()=>{l&&clearInterval(l)}),Ge(()=>t.selectedInstance,()=>{p(),w()}),Ge(g,_=>{_==="running"&&w()});const C=_=>_.metric===1?"text-purple-600 font-medium dark:text-purple-400":"text-blue-600 dark:text-blue-400",L=_=>{const x=_.metric===1,k=_.protocol.includes("Tcp");return x?k?"打洞TCP直连":"打洞UDP直连":k?"客户端TCP中继":"客户端UDP中继"},R=_=>_===3?"己方加密对方未加密":_===4?"己方未加密对方加密":_===5?"密钥不一致":"未知错误",m=_=>t.selectedInstance===_?"border-indigo-600 bg-indigo-600 text-white dark:border-indigo-500 dark:bg-indigo-500":"border-slate-300 bg-white text-slate-600 hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700";return(_,x)=>(y(),E("div",Qh,[x[8]||(x[8]=c("div",null,[c("h1",{class:"page-title"},"设备列表"),c("p",{class:"page-subtitle"},"查看各实例的设备连接与流量状况")],-1)),O(t).instanceList.length>0?(y(),E("div",Zh,[(y(!0),E(ie,null,Ee(O(t).instanceList,k=>(y(),E("button",{key:k.file_name,onClick:G=>O(t).selectedInstance=k.file_name,class:q([m(k.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[ce(or,{status:k.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),re(" "+B(k.config_name||k.file_name),1)],10,Xh))),128))])):fe("",!0),O(t).selectedInstance?(y(),E("div",em,[c("div",tm,[x[2]||(x[2]=c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"设备列表",-1)),c("div",sm,[c("span",null,[x[0]||(x[0]=re(" Online: ",-1)),c("span",nm,B(r.value.filter(k=>k.online).length),1)]),c("span",null,[x[1]||(x[1]=re(" Total: ",-1)),c("span",om,B(r.value.length),1)])])]),c("div",rm,[c("table",lm,[x[7]||(x[7]=c("thead",null,[c("tr",null,[c("th",{class:"w-8 px-2"}),c("th",null,"IP地址"),c("th",null,"名称"),c("th",{class:"hidden md:table-cell"},"版本"),c("th",null,"状态"),c("th",null,"模式"),c("th",null,"延迟"),c("th",null,"丢包率"),c("th",null,"流量"),c("th",{class:"hidden md:table-cell"},"最后在线")])],-1)),c("tbody",null,[(y(!0),E(ie,null,Ee(r.value,k=>(y(),E(ie,{key:k.ip},[c("tr",im,[c("td",{class:"cursor-pointer select-none px-2 text-center",onClick:G=>d(k.ip)},[(y(),E("svg",{class:q(["inline-block h-4 w-4 text-slate-400 transition-transform duration-200",{"rotate-90":f[k.ip]}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...x[3]||(x[3]=[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2))],8,am),c("td",cm,[c("span",{class:"cursor-help border-b border-dotted border-indigo-400/50 pb-0.5",onMouseenter:G=>n(G,k),onMouseleave:o},B(k.ip),41,um)]),c("td",null,B(k.name||"-"),1),c("td",fm,B(k.version||"-"),1),c("td",null,[c("div",dm,[c("span",{class:q(k.online?"badge-green":"badge-gray")},B(k.online?"Online":"Offline"),3),k.online&&k.key_equal===1?(y(),E("div",pm,[...x[4]||(x[4]=[c("svg",{class:"h-4 w-4 text-green-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1),c("span",{class:"tooltip-text"},"双方加密传输",-1)])])):k.online&&k.key_equal===2?(y(),E("div",hm,[...x[5]||(x[5]=[c("svg",{class:"h-4 w-4 text-yellow-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"})],-1),c("span",{class:"tooltip-text"},"双方未加密",-1)])])):k.online&&[3,4,5].includes(k.key_equal)?(y(),E("div",mm,[x[6]||(x[6]=c("svg",{class:"h-4 w-4 text-red-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),c("span",gm,B(R(k.key_equal)),1)])):fe("",!0)])]),c("td",null,[k.online&&k.route?(y(),E("span",{key:0,class:q(C(k.route))},B(L(k.route)),3)):k.online?(y(),E("span",vm,"服务器中继")):(y(),E("span",_m,"-"))]),c("td",bm,B(k.route?k.route.rtt+" ms":"-"),1),c("td",null,[k.packet_loss?(y(),E("span",{key:0,class:q(k.packet_loss.loss_rate>10?"text-red-600 dark:text-red-400":k.packet_loss.loss_rate>5?"text-yellow-600 dark:text-yellow-400":"text-green-600 dark:text-green-400"),title:"Sent: "+k.packet_loss.sent+", Received: "+k.packet_loss.received},B(k.packet_loss.loss_rate.toFixed(1))+"%",11,xm)):(y(),E("span",ym,"-"))]),c("td",km,[k.traffic?(y(),E("div",wm,[c("div",Cm," ↑ "+B(O(ml)(k.traffic.tx_bytes))+" ("+B(O(Oo)(k.traffic.tx_speed))+") ",1),c("div",Sm," ↓ "+B(O(ml)(k.traffic.rx_bytes))+" ("+B(O(Oo)(k.traffic.rx_speed))+") ",1)])):(y(),E("span",Em,"-"))]),c("td",Tm,B(O(Gh)(k.last_connected_time)),1)]),f[k.ip]?(y(),E("tr",Am,[c("td",Im,[c("div",Rm,[ce(Yh,{history:u[k.ip]||{tx:[],rx:[]},size:60},null,8,["history"])])])])):fe("",!0)],64))),128))])])])])):(y(),Me(ln,{key:1,text:"暂无运行中的组网实例"}))]))}},Mm={class:"space-y-4"},Om={key:0,class:"scrollbar-hide flex items-center gap-2 overflow-x-auto"},Lm=["onClick"],Nm={key:2,class:"card overflow-hidden p-0"},Vm={class:"custom-scrollbar max-h-[600px] overflow-x-auto"},jm={class:"table"},Dm=["rowspan"],Fm={class:"font-mono tabular-nums text-yellow-700 dark:text-yellow-300"},Bm={class:"tabular-nums"},Um={class:"tabular-nums"},Hm={__name:"RoutesView",setup(e){const t=Ht(),s=ue([]);let n=null;const o=()=>{const i=t.instanceList.find(a=>a.file_name===t.selectedInstance);return i?i.status:null},r=async()=>{if(!t.selectedInstance||o()!=="running"){s.value=[];return}try{s.value=await Ju(t.selectedInstance)||[]}catch(i){console.error(i)}};ls(()=>{r(),n=setInterval(()=>{t.isPageVisible&&r()},3e3)}),As(()=>{n&&clearInterval(n)}),Ge(()=>t.selectedInstance,()=>{r()}),Ge(o,i=>{i==="running"&&r()});const l=i=>t.selectedInstance===i?"border-indigo-600 bg-indigo-600 text-white dark:border-indigo-500 dark:bg-indigo-500":"border-slate-300 bg-white text-slate-600 hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700";return(i,a)=>(y(),E("div",Mm,[a[2]||(a[2]=c("div",null,[c("h1",{class:"page-title"},"路由"),c("p",{class:"page-subtitle"},"查看各实例的路由表")],-1)),O(t).instanceList.length>0?(y(),E("div",Om,[(y(!0),E(ie,null,Ee(O(t).instanceList,f=>(y(),E("button",{key:f.file_name,onClick:u=>O(t).selectedInstance=f.file_name,class:q([l(f.file_name),"flex shrink-0 items-center rounded-lg border px-4 py-2 text-sm font-medium transition-colors"])},[ce(or,{status:f.status,size:"w-2 h-2",class:"mr-2"},null,8,["status"]),re(" "+B(f.config_name||f.file_name),1)],10,Lm))),128))])):fe("",!0),O(t).selectedInstance?(y(),E("div",Nm,[a[1]||(a[1]=c("div",{class:"border-b border-slate-200 px-6 py-4 dark:border-slate-700"},[c("h2",{class:"text-base font-bold text-slate-900 dark:text-white"},"路由表")],-1)),c("div",Vm,[c("table",jm,[a[0]||(a[0]=c("thead",null,[c("tr",null,[c("th",null,"目标节点IP"),c("th",null,"目标网络"),c("th",null,"跳数"),c("th",null,"延迟")])],-1)),c("tbody",null,[(y(!0),E(ie,null,Ee(s.value,f=>(y(),E(ie,{key:f.ip},[(y(!0),E(ie,null,Ee(f.routes,(u,d)=>(y(),E("tr",{key:d,class:"hover:bg-slate-50 dark:hover:bg-slate-800/50"},[d===0?(y(),E("td",{key:0,rowspan:f.routes.length,class:"font-mono tabular-nums text-indigo-600 dark:text-indigo-400"},B(f.ip),9,Dm)):fe("",!0),c("td",Fm,B(u.addr),1),c("td",Bm,B(u.metric),1),c("td",Um,B(u.rtt)+" ms",1)]))),128))],64))),128))])])])])):(y(),Me(ln,{key:1,text:"暂无运行中的组网实例"}))]))}},Wm=[{path:"/",component:s0},{path:"/instances",component:L0},{path:"/general",redirect:"/instances"},{path:"/config",component:Kh},{path:"/peers",component:Pm},{path:"/routes",component:Hm}],Km=dp({history:Wd(),routes:Wm});ju(rd).use(Bu()).use(Km).mount("#app"); diff --git a/vnt-web/static/assets/index-xUGHQxai.css b/vnt-web/static/assets/index-xUGHQxai.css deleted file mode 100644 index 409ebd9..0000000 --- a/vnt-web/static/assets/index-xUGHQxai.css +++ /dev/null @@ -1 +0,0 @@ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-divide-y-reverse:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-2xl:42rem;--container-4xl:56rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.btn-primary{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-primary:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-primary:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-primary:focus-visible{--tw-outline-style:none;outline-style:none}.btn-primary:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-primary:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-primary{background-color:var(--color-indigo-600);color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-primary:hover{background-color:var(--color-indigo-500)}}.btn-primary:where(.dark,.dark *){background-color:var(--color-indigo-500)}@media(hover:hover){.btn-primary:where(.dark,.dark *):hover{background-color:var(--color-indigo-400)}}.btn-ghost{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-ghost:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-ghost:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-ghost:focus-visible{--tw-outline-style:none;outline-style:none}.btn-ghost:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-ghost:disabled{cursor:not-allowed;opacity:.5}.btn-ghost:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-ghost{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-300);background-color:var(--color-white);color:var(--color-slate-700);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-ghost:hover{background-color:var(--color-slate-50)}}.btn-ghost:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-slate-200)}@media(hover:hover){.btn-ghost:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}}.btn-danger{cursor:pointer;justify-content:center;align-items:center;gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;transition-duration:.15s;display:inline-flex}.btn-danger:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.btn-danger:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 40%, transparent)}}.btn-danger:focus-visible{--tw-outline-style:none;outline-style:none}.btn-danger:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-danger:disabled{cursor:not-allowed;opacity:.5}.btn-danger:disabled:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.btn-danger{background-color:var(--color-red-600);color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.btn-danger:hover{background-color:var(--color-red-500)}}.btn-sm{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-white);padding:calc(var(--spacing) * 5);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;transition-duration:.2s}@media(hover:hover){.card:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.card:where(.dark,.dark *){border-color:#314158cc}@supports (color:color-mix(in lab,red,red)){.card:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-slate-700) 80%,transparent)}}.card:where(.dark,.dark *){background-color:var(--color-slate-900)}.input{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-300);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-slate-900)}.input::placeholder{color:var(--color-slate-400)}.input{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.input:focus{border-color:var(--color-indigo-500);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.input:focus{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 25%, transparent)}}.input:focus{--tw-outline-style:none;outline-style:none}.input:disabled{cursor:not-allowed;opacity:.5}.input:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-white)}.input:where(.dark,.dark *)::placeholder{color:var(--color-slate-500)}.badge-green{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-green-100);color:var(--color-green-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-green:where(.dark,.dark *){background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.badge-green:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.badge-green:where(.dark,.dark *){color:var(--color-green-300)}.badge-red{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-red-100);color:var(--color-red-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-red:where(.dark,.dark *){background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.badge-red:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.badge-red:where(.dark,.dark *){color:var(--color-red-300)}.badge-yellow{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-yellow-100);color:var(--color-yellow-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-yellow:where(.dark,.dark *){background-color:#733e0a66}@supports (color:color-mix(in lab,red,red)){.badge-yellow:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-yellow-900) 40%,transparent)}}.badge-yellow:where(.dark,.dark *){color:var(--color-yellow-300)}.badge-blue{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-blue-100);color:var(--color-blue-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-blue:where(.dark,.dark *){background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.badge-blue:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.badge-blue:where(.dark,.dark *){color:var(--color-blue-300)}.badge-purple{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-purple-100);color:var(--color-purple-700);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-purple:where(.dark,.dark *){background-color:#59168b66}@supports (color:color-mix(in lab,red,red)){.badge-purple:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-purple-900) 40%,transparent)}}.badge-purple:where(.dark,.dark *){color:var(--color-purple-300)}.badge-gray{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);background-color:var(--color-slate-100);color:var(--color-slate-500);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-gray:where(.dark,.dark *){background-color:var(--color-slate-700);color:var(--color-slate-300)}.table{min-width:100%}:where(.table>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-slate-200)}:where(.table:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-slate-700)}.table thead{background-color:var(--color-slate-50)}.table thead:where(.dark,.dark *){background-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.table thead:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.table thead th{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);text-align:left;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider);white-space:nowrap;color:var(--color-slate-500);text-transform:uppercase}.table thead th:where(.dark,.dark *){color:var(--color-slate-400)}:where(.table tbody>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-color:var(--color-slate-200)}.table tbody{background-color:var(--color-white)}:where(.table tbody:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-slate-700)}.table tbody:where(.dark,.dark *){background-color:#0000}.table tbody td{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;color:var(--color-slate-600)}.table tbody td:where(.dark,.dark *){color:var(--color-slate-300)}.tooltip{justify-content:center;align-items:center;display:inline-flex;position:relative}.tooltip .tooltip-text{pointer-events:none;visibility:hidden;z-index:10;width:calc(var(--spacing) * 36);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-slate-200);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);text-align:center;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-slate-600);opacity:0;--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s;position:absolute;bottom:125%;left:50%}.tooltip .tooltip-text:where(.dark,.dark *){border-color:var(--color-slate-600);background-color:var(--color-slate-800);color:var(--color-slate-200)}.tooltip:hover .tooltip-text{visibility:visible;opacity:1}.page-title{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-slate-900)}.page-title:where(.dark,.dark *){color:var(--color-white)}.page-subtitle{margin-top:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-slate-500)}.page-subtitle:where(.dark,.dark *){color:var(--color-slate-400)}.muted{color:var(--color-slate-500)}.muted:where(.dark,.dark *){color:var(--color-slate-400)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.-top-2{top:calc(var(--spacing) * -2)}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.right-0{right:0}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.left-1\/2{left:50%}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.table{display:table}.h-0\.5{height:calc(var(--spacing) * .5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-80{height:calc(var(--spacing) * 80)}.h-\[85vh\]{height:85vh}.h-\[150px\]{height:150px}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.max-h-\[400px\]{max-height:400px}.max-h-\[600px\]{max-height:600px}.min-h-0{min-height:0}.min-h-\[140px\]{min-height:140px}.min-h-screen{min-height:100vh}.w-1{width:var(--spacing)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[200px\]{max-width:200px}.max-w-\[320px\]{max-width:320px}.max-w-sm{max-width:var(--container-sm)}.min-w-\[260px\]{min-width:260px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-green-200{border-color:var(--color-green-200)}.border-indigo-400\/50{border-color:#7d87ff80}@supports (color:color-mix(in lab,red,red)){.border-indigo-400\/50{border-color:color-mix(in oklab,var(--color-indigo-400) 50%,transparent)}}.border-indigo-600{border-color:var(--color-indigo-600)}.border-red-200{border-color:var(--color-red-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/60{background-color:#f8fafc99}@supports (color:color-mix(in lab,red,red)){.bg-slate-50\/60{background-color:color-mix(in oklab,var(--color-slate-50) 60%,transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-900\/40{background-color:#0f172b66}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/40{background-color:color-mix(in oklab,var(--color-slate-900) 40%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-12{padding:calc(var(--spacing) * 12)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-600{color:var(--color-indigo-600)}.text-purple-600{color:var(--color-purple-600)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-green-500\/60{--tw-ring-color:#00c75899}@supports (color:color-mix(in lab,red,red)){.ring-green-500\/60{--tw-ring-color:color-mix(in oklab, var(--color-green-500) 60%, transparent)}}.ring-indigo-500{--tw-ring-color:var(--color-indigo-500)}.ring-indigo-500\/60{--tw-ring-color:#625fff99}@supports (color:color-mix(in lab,red,red)){.ring-indigo-500\/60{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 60%, transparent)}}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:text-indigo-500:hover{color:var(--color-indigo-500)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}}@media(min-width:48rem){.md\:block{display:block}.md\:inline{display:inline}.md\:table-cell{display:table-cell}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}.dark\:border-green-800:where(.dark,.dark *){border-color:var(--color-green-800)}.dark\:border-indigo-500:where(.dark,.dark *){border-color:var(--color-indigo-500)}.dark\:border-red-900\/50:where(.dark,.dark *){border-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark\:border-red-900\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-red-900) 50%,transparent)}}.dark\:border-slate-600:where(.dark,.dark *){border-color:var(--color-slate-600)}.dark\:border-slate-700:where(.dark,.dark *){border-color:var(--color-slate-700)}.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.dark\:border-slate-800:where(.dark,.dark *){border-color:var(--color-slate-800)}.dark\:bg-black\/20:where(.dark,.dark *){background-color:#0003}@supports (color:color-mix(in lab,red,red)){.dark\:bg-black\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.dark\:bg-indigo-400:where(.dark,.dark *){background-color:var(--color-indigo-400)}.dark\:bg-indigo-500:where(.dark,.dark *){background-color:var(--color-indigo-500)}.dark\:bg-indigo-500\/10:where(.dark,.dark *){background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-indigo-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.dark\:bg-indigo-600:where(.dark,.dark *){background-color:var(--color-indigo-600)}.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900) 20%,transparent)}}.dark\:bg-slate-500:where(.dark,.dark *){background-color:var(--color-slate-500)}.dark\:bg-slate-600:where(.dark,.dark *){background-color:var(--color-slate-600)}.dark\:bg-slate-700:where(.dark,.dark *){background-color:var(--color-slate-700)}.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-700) 50%,transparent)}}.dark\:bg-slate-800:where(.dark,.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.dark\:bg-slate-900:where(.dark,.dark *){background-color:var(--color-slate-900)}.dark\:bg-slate-900\/50:where(.dark,.dark *){background-color:#0f172b80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 50%,transparent)}}.dark\:bg-slate-900\/80:where(.dark,.dark *){background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-900\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-900) 80%,transparent)}}.dark\:bg-slate-950:where(.dark,.dark *){background-color:var(--color-slate-950)}.dark\:bg-slate-950\/60:where(.dark,.dark *){background-color:#02061899}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-950\/60:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-950) 60%,transparent)}}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-green-300:where(.dark,.dark *){color:var(--color-green-300)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-indigo-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-purple-400:where(.dark,.dark *){color:var(--color-purple-400)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-red-500:where(.dark,.dark *){color:var(--color-red-500)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\:text-slate-500:where(.dark,.dark *){color:var(--color-slate-500)}.dark\:text-slate-600:where(.dark,.dark *){color:var(--color-slate-600)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-300:where(.dark,.dark *){color:var(--color-yellow-300)}.dark\:text-yellow-400:where(.dark,.dark *){color:var(--color-yellow-400)}.dark\:ring-indigo-400:where(.dark,.dark *){--tw-ring-color:var(--color-indigo-400)}@media(hover:hover){.dark\:hover\:bg-red-900\/40:where(.dark,.dark *):hover{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/40:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.dark\:hover\:bg-slate-700:where(.dark,.dark *):hover{background-color:var(--color-slate-700)}.dark\:hover\:bg-slate-800:where(.dark,.dark *):hover{background-color:var(--color-slate-800)}.dark\:hover\:bg-slate-800\/50:where(.dark,.dark *):hover{background-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-800\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}}}body{background-color:var(--color-slate-50);color:var(--color-slate-700);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body:where(.dark,.dark *){background-color:var(--color-slate-950);color:var(--color-slate-200)}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.custom-scrollbar::-webkit-scrollbar{width:8px;height:8px}.custom-scrollbar::-webkit-scrollbar-track{background:0 0}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:var(--color-slate-300);border-radius:.25rem}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--color-slate-400)}.custom-scrollbar{scrollbar-width:thin;scrollbar-color:var(--color-slate-300) transparent}.dark .custom-scrollbar{scrollbar-color:var(--color-slate-600) transparent}.fade-enter-active,.fade-leave-active{transition:opacity .2s}.fade-enter-from,.fade-leave-to{opacity:0}.card-list-enter-active,.card-list-leave-active{transition:opacity .3s,transform .3s}.card-list-enter-from,.card-list-leave-to{opacity:0;transform:scale(.96)}.modal-enter-active,.modal-leave-active{transition:opacity .2s}.modal-enter-active .modal-panel,.modal-leave-active .modal-panel{transition:transform .2s,opacity .2s}.modal-enter-from,.modal-leave-to{opacity:0}.modal-enter-from .modal-panel,.modal-leave-to .modal-panel{opacity:0;transform:scale(.96)}.toast-enter-active,.toast-leave-active{transition:opacity .25s,transform .25s}.toast-enter-from{opacity:0;transform:translateY(-10px)}.toast-leave-to{opacity:0;transform:translate(20px)}.navdrop-enter-active,.navdrop-leave-active{transition:opacity .2s,transform .2s}.navdrop-enter-from,.navdrop-leave-to{opacity:0;transform:translateY(-6px)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/vnt-web/static/assets/vnt-icon-CtSHy0mt.png b/vnt-web/static/assets/vnt-icon-CtSHy0mt.png new file mode 100644 index 0000000..70a03ec Binary files /dev/null and b/vnt-web/static/assets/vnt-icon-CtSHy0mt.png differ diff --git a/vnt-web/static/index.html b/vnt-web/static/index.html index 1b3d110..3bdda73 100644 --- a/vnt-web/static/index.html +++ b/vnt-web/static/index.html @@ -19,8 +19,8 @@ if (dark) document.documentElement.classList.add("dark"); })(); - - + +
diff --git a/vnt-web/ui/package.json b/vnt-web/ui/package.json index 1cf9f41..3a63f7a 100644 --- a/vnt-web/ui/package.json +++ b/vnt-web/ui/package.json @@ -8,14 +8,14 @@ "build": "vite build" }, "dependencies": { - "pinia": "^3.0.3", - "vue": "^3.5.18", - "vue-router": "^4.5.1" + "pinia": "catalog:", + "vue": "catalog:", + "vue-router": "catalog:" }, "devDependencies": { - "@tailwindcss/vite": "^4.1.12", - "@vitejs/plugin-vue": "^6.0.1", - "tailwindcss": "^4.1.12", - "vite": "^7.1.3" + "@tailwindcss/vite": "catalog:", + "@vitejs/plugin-vue": "catalog:", + "tailwindcss": "catalog:", + "vite": "catalog:" } } diff --git a/vnt-web/ui/src/App.vue b/vnt-web/ui/src/App.vue index af6a58d..06146e7 100644 --- a/vnt-web/ui/src/App.vue +++ b/vnt-web/ui/src/App.vue @@ -1,203 +1,116 @@ + + diff --git a/vnt-web/ui/src/views/WebAccessView.vue b/vnt-web/ui/src/views/WebAccessView.vue new file mode 100644 index 0000000..3547667 --- /dev/null +++ b/vnt-web/ui/src/views/WebAccessView.vue @@ -0,0 +1,211 @@ + + + + +