diff --git a/bun.lock b/bun.lock
index ad3dfd39..29d6e93c 100644
--- a/bun.lock
+++ b/bun.lock
@@ -7,18 +7,95 @@
"devDependencies": {
"@types/bun": "latest",
"@types/node": "latest",
+ "@vitejs/plugin-vue": "^6.0.7",
"playwright": "^1.59.1",
"postgres": "^3.4.9",
"typescript": "latest",
+ "vite": "^8.1.0",
+ "vue": "3",
"xlsx": "^0.18.5",
},
},
},
"packages": {
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
+
+ "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
+
+ "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
+
+ "@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="],
+
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="],
+
+ "@oxc-project/types": ["@oxc-project/types@0.137.0", "", {}, "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA=="],
+
+ "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.3", "", { "os": "android", "cpu": "arm64" }, "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g=="],
+
+ "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.1.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw=="],
+
+ "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.1.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw=="],
+
+ "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.1.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw=="],
+
+ "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.1.3", "", { "os": "linux", "cpu": "arm" }, "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg=="],
+
+ "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA=="],
+
+ "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w=="],
+
+ "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.1.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw=="],
+
+ "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.1.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA=="],
+
+ "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg=="],
+
+ "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g=="],
+
+ "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.1.3", "", { "os": "none", "cpu": "arm64" }, "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ=="],
+
+ "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.1.3", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg=="],
+
+ "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.1.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g=="],
+
+ "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.3", "", { "os": "win32", "cpu": "x64" }, "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA=="],
+
+ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
+
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="],
+
"@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
"@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
+ "@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.7", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25" } }, "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg=="],
+
+ "@vue/compiler-core": ["@vue/compiler-core@3.5.39", "", { "dependencies": { "@babel/parser": "^7.29.7", "@vue/shared": "3.5.39", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw=="],
+
+ "@vue/compiler-dom": ["@vue/compiler-dom@3.5.39", "", { "dependencies": { "@vue/compiler-core": "3.5.39", "@vue/shared": "3.5.39" } }, "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg=="],
+
+ "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.39", "", { "dependencies": { "@babel/parser": "^7.29.7", "@vue/compiler-core": "3.5.39", "@vue/compiler-dom": "3.5.39", "@vue/compiler-ssr": "3.5.39", "@vue/shared": "3.5.39", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.15", "source-map-js": "^1.2.1" } }, "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg=="],
+
+ "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.39", "", { "dependencies": { "@vue/compiler-dom": "3.5.39", "@vue/shared": "3.5.39" } }, "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw=="],
+
+ "@vue/reactivity": ["@vue/reactivity@3.5.39", "", { "dependencies": { "@vue/shared": "3.5.39" } }, "sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog=="],
+
+ "@vue/runtime-core": ["@vue/runtime-core@3.5.39", "", { "dependencies": { "@vue/reactivity": "3.5.39", "@vue/shared": "3.5.39" } }, "sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw=="],
+
+ "@vue/runtime-dom": ["@vue/runtime-dom@3.5.39", "", { "dependencies": { "@vue/reactivity": "3.5.39", "@vue/runtime-core": "3.5.39", "@vue/shared": "3.5.39", "csstype": "^3.2.3" } }, "sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww=="],
+
+ "@vue/server-renderer": ["@vue/server-renderer@3.5.39", "", { "dependencies": { "@vue/compiler-ssr": "3.5.39", "@vue/shared": "3.5.39" }, "peerDependencies": { "vue": "3.5.39" } }, "sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw=="],
+
+ "@vue/shared": ["@vue/shared@3.5.39", "", {}, "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA=="],
+
"adler-32": ["adler-32@1.3.1", "", {}, "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="],
"bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
@@ -29,26 +106,84 @@
"crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="],
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+
+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="],
+
+ "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
"frac": ["frac@1.1.2", "", {}, "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="],
"fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
+ "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
+
+ "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
+
+ "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
+
+ "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
+
+ "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
+
+ "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
+
+ "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
+
+ "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
+
+ "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
+
+ "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
+
+ "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
+
+ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "nanoid": ["nanoid@3.3.15", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
+
"playwright": ["playwright@1.59.1", "", { "dependencies": { "playwright-core": "1.59.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw=="],
"playwright-core": ["playwright-core@1.59.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg=="],
+ "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="],
+
"postgres": ["postgres@3.4.9", "", {}, "sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw=="],
+ "rolldown": ["rolldown@1.1.3", "", { "dependencies": { "@oxc-project/types": "=0.137.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.3", "@rolldown/binding-darwin-arm64": "1.1.3", "@rolldown/binding-darwin-x64": "1.1.3", "@rolldown/binding-freebsd-x64": "1.1.3", "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", "@rolldown/binding-linux-arm64-gnu": "1.1.3", "@rolldown/binding-linux-arm64-musl": "1.1.3", "@rolldown/binding-linux-ppc64-gnu": "1.1.3", "@rolldown/binding-linux-s390x-gnu": "1.1.3", "@rolldown/binding-linux-x64-gnu": "1.1.3", "@rolldown/binding-linux-x64-musl": "1.1.3", "@rolldown/binding-openharmony-arm64": "1.1.3", "@rolldown/binding-wasm32-wasi": "1.1.3", "@rolldown/binding-win32-arm64-msvc": "1.1.3", "@rolldown/binding-win32-x64-msvc": "1.1.3" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
"ssf": ["ssf@0.11.2", "", { "dependencies": { "frac": "~1.1.2" } }, "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g=="],
+ "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
"typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
"undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
+ "vite": ["vite@8.1.0", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "~1.1.2", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q=="],
+
+ "vue": ["vue@3.5.39", "", { "dependencies": { "@vue/compiler-dom": "3.5.39", "@vue/compiler-sfc": "3.5.39", "@vue/runtime-dom": "3.5.39", "@vue/server-renderer": "3.5.39", "@vue/shared": "3.5.39" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA=="],
+
"wmf": ["wmf@1.0.2", "", {}, "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="],
"word": ["word@0.3.0", "", {}, "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="],
"xlsx": ["xlsx@0.18.5", "", { "dependencies": { "adler-32": "~1.3.0", "cfb": "~1.2.1", "codepage": "~1.15.0", "crc-32": "~1.2.1", "ssf": "~0.11.2", "wmf": "~1.0.1", "word": "~0.3.0" }, "bin": { "xlsx": "bin/xlsx.njs" } }, "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ=="],
+
+ "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
}
}
diff --git a/config/hwlab-web-probe-sentinel/cicd.auth-session-switch.d601-v03.yaml b/config/hwlab-web-probe-sentinel/cicd.auth-session-switch.d601-v03.yaml
index f8654edd..2bb8d2c0 100644
--- a/config/hwlab-web-probe-sentinel/cicd.auth-session-switch.d601-v03.yaml
+++ b/config/hwlab-web-probe-sentinel/cicd.auth-session-switch.d601-v03.yaml
@@ -43,6 +43,19 @@ sentinel:
maintenance:
startCommand: sentinel maintenance start
stopCommand: sentinel maintenance stop
+ monitorWeb:
+ frontendStack: vue3-vendored-runtime
+ runtimeMode: runner-served-bridge
+ assetRoot: scripts/assets/web-probe-sentinel-monitor-web
+ envReuse:
+ mode: docker-layer-and-ci-node-deps
+ nodeDepsPath: /opt/hwlab-ci-node-deps/node_modules
+ gitMirror:
+ source: source.gitMirrorReadUrl
+ preSync: required
+ postFlush: required
+ ciBudget:
+ maxSeconds: 120
confirmWait:
maxSeconds: 120
targetValidation:
diff --git a/config/hwlab-web-probe-sentinel/cicd.d601-v03.yaml b/config/hwlab-web-probe-sentinel/cicd.d601-v03.yaml
index 63209e42..50d26e75 100644
--- a/config/hwlab-web-probe-sentinel/cicd.d601-v03.yaml
+++ b/config/hwlab-web-probe-sentinel/cicd.d601-v03.yaml
@@ -43,6 +43,19 @@ sentinel:
maintenance:
startCommand: sentinel maintenance start
stopCommand: sentinel maintenance stop
+ monitorWeb:
+ frontendStack: vue3-vendored-runtime
+ runtimeMode: runner-served-bridge
+ assetRoot: scripts/assets/web-probe-sentinel-monitor-web
+ envReuse:
+ mode: docker-layer-and-ci-node-deps
+ nodeDepsPath: /opt/hwlab-ci-node-deps/node_modules
+ gitMirror:
+ source: source.gitMirrorReadUrl
+ preSync: required
+ postFlush: required
+ ciBudget:
+ maxSeconds: 120
confirmWait:
maxSeconds: 120
targetValidation:
diff --git a/config/hwlab-web-probe-sentinel/cicd.mdtodo.d601-v03.yaml b/config/hwlab-web-probe-sentinel/cicd.mdtodo.d601-v03.yaml
index 793d78df..96ef2553 100644
--- a/config/hwlab-web-probe-sentinel/cicd.mdtodo.d601-v03.yaml
+++ b/config/hwlab-web-probe-sentinel/cicd.mdtodo.d601-v03.yaml
@@ -43,6 +43,19 @@ sentinel:
maintenance:
startCommand: sentinel maintenance start
stopCommand: sentinel maintenance stop
+ monitorWeb:
+ frontendStack: vue3-vendored-runtime
+ runtimeMode: runner-served-bridge
+ assetRoot: scripts/assets/web-probe-sentinel-monitor-web
+ envReuse:
+ mode: docker-layer-and-ci-node-deps
+ nodeDepsPath: /opt/hwlab-ci-node-deps/node_modules
+ gitMirror:
+ source: source.gitMirrorReadUrl
+ preSync: required
+ postFlush: required
+ ciBudget:
+ maxSeconds: 120
confirmWait:
maxSeconds: 120
targetValidation:
diff --git a/package.json b/package.json
index 472fb9ff..f4ffa627 100644
--- a/package.json
+++ b/package.json
@@ -6,14 +6,18 @@
"scripts": {
"cli": "bun scripts/cli.ts",
"check": "bun scripts/cli.ts check",
- "e2e": "bun scripts/cli.ts e2e run"
+ "e2e": "bun scripts/cli.ts e2e run",
+ "monitor-web:verify": "bun scripts/verify-web-probe-sentinel-monitor-web.ts"
},
"devDependencies": {
"@types/bun": "latest",
"@types/node": "latest",
+ "@vitejs/plugin-vue": "^6.0.7",
"playwright": "^1.59.1",
"postgres": "^3.4.9",
"typescript": "latest",
+ "vite": "^8.1.0",
+ "vue": "3",
"xlsx": "^0.18.5"
}
}
diff --git a/scripts/assets/web-probe-sentinel-monitor-web/monitor-web.css b/scripts/assets/web-probe-sentinel-monitor-web/monitor-web.css
new file mode 100644
index 00000000..4e3bf213
--- /dev/null
+++ b/scripts/assets/web-probe-sentinel-monitor-web/monitor-web.css
@@ -0,0 +1,782 @@
+:root {
+ color-scheme: light;
+ --bg: #f5f7f8;
+ --panel: #ffffff;
+ --panel-soft: #f9fbfb;
+ --text: #17201f;
+ --muted: #5e6b68;
+ --line: #dce3e1;
+ --line-strong: #b8c4c0;
+ --red: #d43c35;
+ --red-soft: #ffe8e5;
+ --amber: #b7791f;
+ --amber-soft: #fff2d6;
+ --green: #1f8a5b;
+ --green-soft: #e4f6ed;
+ --blue: #2a6fbb;
+ --ink: #203330;
+ --shadow: 0 10px 28px rgba(32, 51, 48, 0.08);
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+html,
+body,
+#monitor-web-root {
+ height: 100%;
+ margin: 0;
+}
+
+body {
+ background: var(--bg);
+ color: var(--text);
+ overflow: hidden;
+}
+
+button,
+select,
+input {
+ font: inherit;
+}
+
+.monitor-shell {
+ display: flex;
+ height: 100dvh;
+ min-height: 0;
+ flex-direction: column;
+ gap: 10px;
+ overflow: hidden;
+ padding: 12px;
+}
+
+.topbar,
+.status-strip,
+.entry-strip,
+.trend-stage,
+.workspace-grid {
+ width: min(100%, 1760px);
+ margin: 0 auto;
+}
+
+.topbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 16px;
+ flex: 0 0 auto;
+ min-height: 58px;
+}
+
+.title-block {
+ display: flex;
+ min-width: 0;
+ align-items: center;
+ gap: 12px;
+}
+
+.mark {
+ width: 34px;
+ height: 34px;
+ border: 2px solid var(--ink);
+ border-radius: 8px;
+ background: linear-gradient(135deg, #ffffff 0%, #e7f1ef 100%);
+ box-shadow: inset 0 -8px 0 rgba(31, 138, 91, 0.16);
+}
+
+h1,
+h2,
+h3,
+p {
+ margin: 0;
+}
+
+h1 {
+ font-size: 20px;
+ line-height: 1.15;
+ letter-spacing: 0;
+}
+
+.subtitle {
+ display: flex;
+ min-width: 0;
+ flex-wrap: wrap;
+ gap: 6px;
+ align-items: center;
+ margin-top: 4px;
+ color: var(--muted);
+ font-size: 12px;
+}
+
+code,
+.mono {
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
+}
+
+.pill,
+.toolbar-button,
+.entry-link,
+.legend-item,
+.metric,
+.timeline-item,
+.run-row,
+.finding-card,
+.check-chip {
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ background: var(--panel);
+}
+
+.toolbar {
+ display: flex;
+ flex: 0 0 auto;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ gap: 8px;
+}
+
+.toolbar-button,
+select {
+ min-height: 34px;
+ border: 1px solid var(--line-strong);
+ border-radius: 8px;
+ background: #ffffff;
+ color: var(--text);
+ cursor: pointer;
+}
+
+.toolbar-button {
+ padding: 0 12px;
+}
+
+select {
+ padding: 0 28px 0 10px;
+}
+
+.pill {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ min-height: 30px;
+ padding: 0 10px;
+ color: var(--muted);
+ font-size: 12px;
+ white-space: nowrap;
+}
+
+.pill::before {
+ content: "";
+ width: 7px;
+ height: 7px;
+ border-radius: 999px;
+ background: var(--muted);
+}
+
+.pill.blocked,
+.pill.degraded {
+ border-color: #efb3ad;
+ background: var(--red-soft);
+ color: #8b1f1a;
+}
+
+.pill.blocked::before,
+.pill.degraded::before {
+ background: var(--red);
+}
+
+.pill.warning {
+ border-color: #e5c06b;
+ background: var(--amber-soft);
+ color: #73500f;
+}
+
+.pill.warning::before {
+ background: var(--amber);
+}
+
+.pill.healthy,
+.pill.idle {
+ border-color: #b9ddc9;
+ background: var(--green-soft);
+ color: #17633f;
+}
+
+.pill.healthy::before,
+.pill.idle::before {
+ background: var(--green);
+}
+
+.entry-strip {
+ display: grid;
+ grid-template-columns: minmax(180px, 240px) minmax(0, 1fr);
+ gap: 10px;
+ flex: 0 0 auto;
+ align-items: stretch;
+}
+
+.entry-copy {
+ display: flex;
+ min-height: 52px;
+ flex-direction: column;
+ justify-content: center;
+ color: var(--muted);
+ font-size: 12px;
+}
+
+.entry-copy strong {
+ color: var(--text);
+ font-size: 15px;
+}
+
+.entry-links {
+ display: flex;
+ min-width: 0;
+ gap: 8px;
+ overflow-x: auto;
+ padding-bottom: 2px;
+}
+
+.entry-link {
+ display: grid;
+ grid-template-columns: minmax(130px, 1fr) auto;
+ min-width: 220px;
+ max-width: 360px;
+ gap: 10px;
+ align-items: center;
+ padding: 9px 10px;
+ color: var(--text);
+ text-decoration: none;
+}
+
+.entry-link.current {
+ border-color: var(--green);
+ box-shadow: inset 3px 0 0 var(--green);
+}
+
+.entry-link.disabled {
+ opacity: 0.55;
+}
+
+.entry-link span {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.entry-link small {
+ color: var(--muted);
+ font-size: 11px;
+}
+
+.trend-stage {
+ display: grid;
+ grid-template-columns: minmax(420px, 1.55fr) minmax(300px, 0.9fr);
+ gap: 10px;
+ flex: 0 0 auto;
+ min-height: 212px;
+}
+
+.trend-panel,
+.timeline-panel,
+.pane,
+.status-strip {
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ background: var(--panel);
+ box-shadow: var(--shadow);
+}
+
+.trend-panel,
+.timeline-panel {
+ min-width: 0;
+ padding: 12px;
+}
+
+.panel-header {
+ display: flex;
+ align-items: start;
+ justify-content: space-between;
+ gap: 12px;
+ margin-bottom: 10px;
+}
+
+.panel-header h2 {
+ font-size: 15px;
+ line-height: 1.25;
+}
+
+.panel-header p,
+.muted {
+ color: var(--muted);
+ font-size: 12px;
+}
+
+.trend-chart-wrap {
+ position: relative;
+ min-height: 142px;
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ background: linear-gradient(180deg, #ffffff 0%, #f7faf9 100%);
+ overflow: hidden;
+}
+
+.trend-chart {
+ display: block;
+ width: 100%;
+ height: 142px;
+}
+
+.trend-empty {
+ position: absolute;
+ inset: 0;
+ display: grid;
+ place-items: center;
+ color: var(--muted);
+ font-size: 13px;
+}
+
+.trend-red {
+ fill: none;
+ stroke: var(--red);
+ stroke-width: 3;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+}
+
+.trend-warning {
+ fill: none;
+ stroke: var(--amber);
+ stroke-width: 3;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+}
+
+.trend-total {
+ fill: none;
+ stroke: var(--blue);
+ stroke-width: 2;
+ stroke-dasharray: 5 6;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+ opacity: 0.75;
+}
+
+.trend-grid-line {
+ stroke: #e5ecea;
+ stroke-width: 1;
+}
+
+.trend-dot-red {
+ fill: var(--red);
+}
+
+.trend-dot-warning {
+ fill: var(--amber);
+}
+
+.trend-legend {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 10px;
+}
+
+.legend-item {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ min-height: 28px;
+ padding: 0 9px;
+ color: var(--muted);
+ font-size: 12px;
+}
+
+.legend-swatch {
+ width: 18px;
+ height: 3px;
+ border-radius: 999px;
+}
+
+.legend-swatch.red {
+ background: var(--red);
+}
+
+.legend-swatch.warning {
+ background: var(--amber);
+}
+
+.legend-swatch.total {
+ background: var(--blue);
+}
+
+.timeline-panel {
+ display: flex;
+ min-height: 0;
+ flex-direction: column;
+}
+
+.timeline-list {
+ display: grid;
+ max-height: 150px;
+ gap: 7px;
+ overflow: auto;
+ padding-right: 2px;
+}
+
+.timeline-item {
+ display: grid;
+ grid-template-columns: 78px minmax(0, 1fr) auto;
+ gap: 8px;
+ align-items: center;
+ padding: 7px 8px;
+ font-size: 12px;
+}
+
+.timeline-item strong,
+.run-row strong,
+.finding-card strong {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.timeline-marker {
+ width: 9px;
+ height: 9px;
+ border-radius: 999px;
+ background: var(--green);
+}
+
+.timeline-item.red .timeline-marker,
+.run-row.red .severity-dot,
+.finding-card.red .severity-dot {
+ background: var(--red);
+}
+
+.timeline-item.warning .timeline-marker,
+.run-row.warning .severity-dot,
+.finding-card.warning .severity-dot {
+ background: var(--amber);
+}
+
+.timeline-item.info .timeline-marker,
+.run-row.info .severity-dot,
+.finding-card.info .severity-dot {
+ background: var(--blue);
+}
+
+.status-strip {
+ display: grid;
+ grid-template-columns: repeat(5, minmax(120px, 1fr));
+ gap: 8px;
+ flex: 0 0 auto;
+ padding: 8px;
+}
+
+.metric {
+ display: flex;
+ min-width: 0;
+ flex-direction: column;
+ gap: 2px;
+ padding: 8px 10px;
+ background: var(--panel-soft);
+}
+
+.metric span {
+ color: var(--muted);
+ font-size: 11px;
+}
+
+.metric strong {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-size: 14px;
+}
+
+.metric.warning {
+ border-color: #e5c06b;
+ background: var(--amber-soft);
+}
+
+.workspace-grid {
+ display: grid;
+ grid-template-columns: minmax(260px, 0.82fr) minmax(420px, 1.34fr) minmax(300px, 1fr);
+ gap: 10px;
+ flex: 1 1 auto;
+ min-height: 0;
+ overflow: hidden;
+}
+
+.pane {
+ display: flex;
+ min-width: 0;
+ min-height: 0;
+ flex-direction: column;
+ overflow: auto;
+ padding: 12px;
+}
+
+.pane-header {
+ position: sticky;
+ top: 0;
+ z-index: 2;
+ display: flex;
+ align-items: start;
+ justify-content: space-between;
+ gap: 10px;
+ margin: -12px -12px 10px;
+ padding: 12px;
+ border-bottom: 1px solid var(--line);
+ background: rgba(255, 255, 255, 0.96);
+}
+
+.pane-header h2 {
+ font-size: 15px;
+}
+
+.filter-row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 10px;
+}
+
+.filter-row input,
+.filter-row select {
+ min-width: 0;
+ min-height: 32px;
+ border: 1px solid var(--line-strong);
+ border-radius: 8px;
+ padding: 0 10px;
+ background: #ffffff;
+}
+
+.run-list,
+.finding-list,
+.detail-stack {
+ display: grid;
+ gap: 8px;
+}
+
+.run-row,
+.finding-card {
+ display: grid;
+ gap: 6px;
+ padding: 10px;
+ text-align: left;
+}
+
+.run-row {
+ cursor: pointer;
+}
+
+.run-row.selected {
+ border-color: var(--blue);
+ box-shadow: inset 3px 0 0 var(--blue);
+}
+
+.row-line {
+ display: flex;
+ min-width: 0;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+}
+
+.severity-line {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ min-width: 0;
+}
+
+.severity-dot {
+ width: 8px;
+ height: 8px;
+ flex: 0 0 auto;
+ border-radius: 999px;
+ background: var(--green);
+}
+
+.tag {
+ display: inline-flex;
+ align-items: center;
+ min-height: 22px;
+ max-width: 100%;
+ border-radius: 999px;
+ background: #eef3f1;
+ color: var(--muted);
+ padding: 0 8px;
+ font-size: 11px;
+}
+
+.tag.red {
+ background: var(--red-soft);
+ color: #8b1f1a;
+}
+
+.tag.warning {
+ background: var(--amber-soft);
+ color: #73500f;
+}
+
+.detail-card {
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ background: var(--panel-soft);
+ padding: 12px;
+}
+
+.detail-card h3 {
+ margin-bottom: 8px;
+ font-size: 14px;
+}
+
+.detail-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 8px;
+}
+
+.detail-grid .metric {
+ background: #ffffff;
+}
+
+pre {
+ max-height: 240px;
+ margin: 0;
+ overflow: auto;
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ background: #10211e;
+ color: #eef8f4;
+ padding: 10px;
+ font-size: 12px;
+ line-height: 1.45;
+ white-space: pre-wrap;
+ word-break: break-word;
+}
+
+.check-grid {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+
+.check-chip {
+ min-height: 26px;
+ padding: 5px 8px;
+ color: var(--muted);
+ font-size: 11px;
+}
+
+.check-chip.ok {
+ border-color: #b9ddc9;
+ background: var(--green-soft);
+ color: #17633f;
+}
+
+.check-chip.bad {
+ border-color: #efb3ad;
+ background: var(--red-soft);
+ color: #8b1f1a;
+}
+
+.banner {
+ width: min(100%, 1760px);
+ margin: 0 auto;
+ flex: 0 0 auto;
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ padding: 10px 12px;
+ font-size: 13px;
+}
+
+.banner.error {
+ border-color: #efb3ad;
+ background: var(--red-soft);
+ color: #8b1f1a;
+}
+
+.empty {
+ display: grid;
+ min-height: 120px;
+ place-items: center;
+ border: 1px dashed var(--line-strong);
+ border-radius: 8px;
+ color: var(--muted);
+ font-size: 13px;
+}
+
+@media (max-width: 1120px) {
+ body {
+ overflow: auto;
+ }
+
+ .monitor-shell {
+ height: auto;
+ min-height: 100dvh;
+ overflow: visible;
+ }
+
+ .trend-stage,
+ .workspace-grid,
+ .entry-strip {
+ grid-template-columns: 1fr;
+ }
+
+ .workspace-grid {
+ overflow: visible;
+ }
+
+ .pane {
+ max-height: 72dvh;
+ }
+
+ .status-strip {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media (max-width: 640px) {
+ .monitor-shell {
+ padding: 8px;
+ }
+
+ .topbar {
+ align-items: stretch;
+ flex-direction: column;
+ }
+
+ .toolbar {
+ justify-content: stretch;
+ }
+
+ .toolbar-button,
+ .toolbar select {
+ flex: 1 1 96px;
+ }
+
+ .entry-link {
+ min-width: 190px;
+ }
+
+ .status-strip,
+ .detail-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .timeline-item {
+ grid-template-columns: 62px minmax(0, 1fr);
+ }
+
+ .timeline-item .tag {
+ grid-column: 2;
+ width: max-content;
+ }
+}
diff --git a/scripts/assets/web-probe-sentinel-monitor-web/monitor-web.js b/scripts/assets/web-probe-sentinel-monitor-web/monitor-web.js
new file mode 100644
index 00000000..775be256
--- /dev/null
+++ b/scripts/assets/web-probe-sentinel-monitor-web/monitor-web.js
@@ -0,0 +1,564 @@
+import { createApp, computed, onMounted, ref } from "./vendor/vue.runtime.esm-browser.prod.js";
+
+const bootstrap = readBootstrap();
+
+createApp({
+ setup() {
+ const loading = ref(true);
+ const error = ref("");
+ const overview = ref(null);
+ const runs = ref([]);
+ const findings = ref([]);
+ const selectedRunId = ref("");
+ const selectedDetail = ref(null);
+ const runFilter = ref("");
+ const severityFilter = ref("");
+ const findingFilter = ref("");
+ const autoRefresh = ref(true);
+ const refreshSeconds = ref(30);
+ const lastLoadedAt = ref("");
+ let lastAutoRefreshAt = 0;
+
+ const sentinels = computed(() => {
+ const rows = Array.isArray(bootstrap.sentinels) ? bootstrap.sentinels : [];
+ return rows.length > 0 ? rows : [{ id: bootstrap.sentinelId, enabled: true }];
+ });
+
+ const currentStatus = computed(() => String(overview.value?.status || "idle"));
+ const latestRun = computed(() => overview.value?.latestRun || null);
+ const severityTotals = computed(() => overview.value?.severityCounts || {});
+ const filteredRuns = computed(() => {
+ const needle = runFilter.value.trim().toLowerCase();
+ return runs.value.filter((run) => {
+ if (severityFilter.value && severityClass(run) !== severityFilter.value) return false;
+ if (!needle) return true;
+ return [run.id, run.scenarioId, run.status, run.observerId].some((item) => String(item || "").toLowerCase().includes(needle));
+ });
+ });
+ const selectedRun = computed(() => runs.value.find((run) => run.id === selectedRunId.value) || latestRun.value);
+ const trendRows = computed(() => runs.value.slice().sort((a, b) => Date.parse(a.updatedAt || a.createdAt || "") - Date.parse(b.updatedAt || b.createdAt || "")).slice(-48));
+ const trendMax = computed(() => Math.max(1, ...trendRows.value.flatMap((run) => [redCount(run), warningCount(run), findingCount(run)])));
+ const trendPolylines = computed(() => ({
+ red: trendPolyline((run) => redCount(run)),
+ warning: trendPolyline((run) => warningCount(run)),
+ total: trendPolyline((run) => findingCount(run)),
+ }));
+ const trendDots = computed(() => trendRows.value.map((run, index) => ({
+ id: run.id || String(index),
+ x: trendX(index, trendRows.value.length),
+ redY: trendY(redCount(run)),
+ warningY: trendY(warningCount(run)),
+ severity: severityClass(run),
+ title: `${shortId(run.id)} ${formatDate(run.updatedAt || run.createdAt)}`,
+ })));
+ const timelineRuns = computed(() => runs.value.slice(0, 16));
+ const rootCauseFindings = computed(() => {
+ const rows = findings.value.filter((item) => item.rootCause || item.nextAction || ["red", "warning"].includes(severityClass(item)));
+ return rows.slice(0, 14);
+ });
+ const cadence = computed(() => {
+ const intervalMs = Number(overview.value?.scheduler?.intervalMs || 0);
+ const latestAge = Number(overview.value?.freshness?.latestRunAgeSeconds ?? -1);
+ const heartbeatAge = Number(overview.value?.freshness?.schedulerHeartbeatAgeSeconds ?? -1);
+ const intervalSeconds = intervalMs > 0 ? Math.round(intervalMs / 1000) : 0;
+ const stale = intervalSeconds > 0 && latestAge > intervalSeconds * 2;
+ return {
+ intervalSeconds,
+ latestAge,
+ heartbeatAge,
+ stale,
+ label: intervalSeconds > 0 ? `${formatDuration(intervalSeconds)} 间隔` : "未配置",
+ alert: stale ? `最近运行 ${formatDuration(latestAge)} 前,超过预设间隔 2 倍;按 SPEC 作为非阻塞报警展示。` : "运行新鲜度在预设窗口内",
+ };
+ });
+ const healthChecks = computed(() => {
+ const checks = overview.value?.health?.checks || {};
+ return Object.entries(checks).map(([key, value]) => ({
+ key,
+ ok: value?.ok !== false,
+ text: `${key} ${value?.ok === false ? "异常" : "ok"}`,
+ }));
+ });
+
+ async function loadAll(options = {}) {
+ if (!options.silent) loading.value = true;
+ error.value = "";
+ setReady(false);
+ try {
+ const [overviewPayload, runsPayload, findingsPayload] = await Promise.all([
+ fetchJson("/api/overview"),
+ fetchJson("/api/runs?limit=80&sort=updated"),
+ fetchJson("/api/findings?limit=80&window=24h"),
+ ]);
+ overview.value = overviewPayload;
+ runs.value = Array.isArray(runsPayload.runs) ? runsPayload.runs : Array.isArray(runsPayload.items) ? runsPayload.items : [];
+ findings.value = Array.isArray(findingsPayload.findings) ? findingsPayload.findings : Array.isArray(findingsPayload.groups) ? findingsPayload.groups : [];
+ lastLoadedAt.value = new Date().toISOString();
+ lastAutoRefreshAt = Date.now();
+ const keepSelected = runs.value.find((run) => run.id === selectedRunId.value);
+ const nextRun = keepSelected || runs.value[0] || latestRun.value;
+ if (nextRun?.id) await selectRun(nextRun, true);
+ } catch (cause) {
+ error.value = String(cause?.message || cause);
+ } finally {
+ loading.value = false;
+ setReady(true);
+ }
+ }
+
+ async function selectRun(run, silent = false) {
+ const runId = typeof run === "string" ? run : run?.id;
+ if (!runId) return;
+ selectedRunId.value = runId;
+ if (!silent) selectedDetail.value = null;
+ try {
+ selectedDetail.value = await fetchJson(`/api/runs/${encodeURIComponent(runId)}`);
+ } catch (cause) {
+ selectedDetail.value = { ok: false, error: String(cause?.message || cause), runId };
+ }
+ }
+
+ function refreshNow() {
+ void loadAll();
+ }
+
+ function currentHref(item) {
+ if (!item || item.id === bootstrap.sentinelId) return bootstrap.basePath || "/";
+ if (item.id === "workbench-dsflash-go-tool-call-10x") return "/";
+ return `/sentinels/${encodeURIComponent(item.id)}/`;
+ }
+
+ function trendPolyline(accessor) {
+ if (trendRows.value.length < 2) return "";
+ return trendRows.value.map((run, index) => `${trendX(index, trendRows.value.length)},${trendY(accessor(run))}`).join(" ");
+ }
+
+ function trendX(index, total) {
+ if (total <= 1) return 24;
+ return Math.round(24 + index * (672 / (total - 1)));
+ }
+
+ function trendY(value) {
+ return Math.round(126 - (Number(value || 0) / trendMax.value) * 102);
+ }
+
+ onMounted(() => {
+ void loadAll();
+ window.setInterval(() => {
+ if (!autoRefresh.value) return;
+ if (Date.now() - lastAutoRefreshAt >= Math.max(5, Number(refreshSeconds.value || 30)) * 1000) void loadAll({ silent: true });
+ }, 1000);
+ });
+
+ return {
+ bootstrap,
+ loading,
+ error,
+ overview,
+ runs,
+ findings,
+ selectedRunId,
+ selectedDetail,
+ runFilter,
+ severityFilter,
+ findingFilter,
+ autoRefresh,
+ refreshSeconds,
+ lastLoadedAt,
+ sentinels,
+ currentStatus,
+ latestRun,
+ severityTotals,
+ filteredRuns,
+ selectedRun,
+ trendRows,
+ trendPolylines,
+ trendDots,
+ timelineRuns,
+ rootCauseFindings,
+ cadence,
+ healthChecks,
+ loadAll,
+ selectRun,
+ refreshNow,
+ currentHref,
+ redCount,
+ warningCount,
+ findingCount,
+ severityClass,
+ formatDate,
+ formatDuration,
+ shortId,
+ rootCauseText,
+ findingTitle,
+ detailSummaryText,
+ commandSummary,
+ statusLabel,
+ };
+ },
+ template: `
+
+
+
+
+
+ 哨兵入口
+ {{ sentinels.length }} 个实例,当前入口固定在第一屏
+
+
+
+
+
+
+
+
+
+
暂无运行数据
+
+
+ 红色 {{ redCount({ severityCounts: severityTotals }) }}
+ 警告 {{ warningCount({ severityCounts: severityTotals }) }}
+ 发现总量 {{ findingCount({ findingCount: overview?.latestRun?.findingCount, severityCounts: severityTotals }) }}
+ {{ cadence.alert }}
+
+
+
+
+
+
+
+
暂无时间线记录
+
+
+
+
+
+
+ 最近运行
+ {{ latestRun ? formatDate(latestRun.updatedAt || latestRun.createdAt) : "-" }}
+
+
+ 调度新鲜度
+ {{ cadence.latestAge >= 0 ? formatDuration(cadence.latestAge) : "-" }}
+
+
+ 红色
+ {{ redCount({ severityCounts: severityTotals }) }}
+
+
+ 警告
+ {{ warningCount({ severityCounts: severityTotals }) }}
+
+
+ 最后刷新
+ {{ lastLoadedAt ? formatDate(lastLoadedAt) : "-" }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 摘要
+
+
状态{{ selectedRun.status || "-" }}
+
发现数{{ findingCount(selectedRun) }}
+
Observer{{ selectedRun.observerId || "-" }}
+
更新时间{{ formatDate(selectedRun.updatedAt || selectedRun.createdAt) }}
+
+
+
+ 健康检查
+
+ {{ check.text }}
+ 无检查数据
+
+
+
+ 报告摘要
+ {{ detailSummaryText(selectedDetail) }}
+
+
+ 复现命令
+ {{ commandSummary(selectedDetail) }}
+
+
+ 选择一条运行记录查看详情
+
+
+
+
+
+ `,
+}).mount("#monitor-web-root");
+
+function readBootstrap() {
+ const root = document.querySelector("#monitor-web-root");
+ const script = document.querySelector("#monitor-web-bootstrap");
+ let parsed = {};
+ try {
+ parsed = script?.textContent ? JSON.parse(script.textContent) : {};
+ } catch {
+ parsed = {};
+ }
+ return {
+ node: root?.getAttribute("data-node") || parsed.node || "",
+ lane: root?.getAttribute("data-lane") || parsed.lane || "",
+ sentinelId: root?.getAttribute("data-sentinel-id") || parsed.sentinelId || "",
+ basePath: root?.getAttribute("data-base-path") || parsed.basePath || "",
+ publicOrigin: root?.getAttribute("data-public-origin") || parsed.publicOrigin || "",
+ contractVersion: root?.getAttribute("data-contract-version") || parsed.contractVersion || "",
+ sentinels: Array.isArray(parsed.sentinels) ? parsed.sentinels : [],
+ };
+}
+
+async function fetchJson(path) {
+ const response = await fetch(apiUrl(path), { cache: "no-store" });
+ if (!response.ok) throw new Error(`${path} HTTP ${response.status}`);
+ return await response.json();
+}
+
+function apiUrl(path) {
+ const prefix = bootstrap.basePath || "";
+ const suffix = path.startsWith("/") ? path : `/${path}`;
+ return `${prefix}${suffix}`;
+}
+
+function setReady(value) {
+ document.querySelector("#monitor-web-root")?.setAttribute("data-monitor-ready", value ? "true" : "false");
+}
+
+function redCount(item) {
+ const counts = item?.severityCounts || item || {};
+ return number(counts.red) + number(counts.critical) + number(counts.error);
+}
+
+function warningCount(item) {
+ const counts = item?.severityCounts || item || {};
+ return number(counts.warning) + number(counts.warn) + number(counts.amber);
+}
+
+function findingCount(item) {
+ if (Number.isFinite(Number(item?.findingCount))) return Number(item.findingCount);
+ if (Number.isFinite(Number(item?.finding_count))) return Number(item.finding_count);
+ if (Number.isFinite(Number(item?.count))) return Number(item.count);
+ const counts = item?.severityCounts || item || {};
+ return Object.values(counts).reduce((sum, value) => sum + number(value), 0);
+}
+
+function severityClass(item) {
+ const explicit = String(item?.maxSeverity || item?.severity || "").toLowerCase();
+ if (["red", "critical", "error", "blocked"].includes(explicit)) return "red";
+ if (["warning", "warn", "amber"].includes(explicit)) return "warning";
+ if (["info", "notice"].includes(explicit)) return "info";
+ if (redCount(item) > 0) return "red";
+ if (warningCount(item) > 0) return "warning";
+ return "healthy";
+}
+
+function formatDate(value) {
+ if (!value) return "-";
+ const date = new Date(value);
+ if (Number.isNaN(date.getTime())) return String(value);
+ const now = Date.now();
+ const seconds = Math.max(0, Math.round((now - date.getTime()) / 1000));
+ if (seconds < 90) return `${seconds}s前`;
+ if (seconds < 7200) return `${Math.round(seconds / 60)}m前`;
+ if (seconds < 172800) return `${Math.round(seconds / 3600)}h前`;
+ return date.toISOString().slice(5, 16).replace("T", " ");
+}
+
+function formatDuration(seconds) {
+ const value = Math.max(0, Number(seconds || 0));
+ if (value < 90) return `${Math.round(value)}s`;
+ if (value < 7200) return `${Math.round(value / 60)}m`;
+ if (value < 172800) return `${Math.round(value / 3600)}h`;
+ return `${Math.round(value / 86400)}d`;
+}
+
+function shortId(value) {
+ const text = String(value || "");
+ return text.length > 18 ? `${text.slice(0, 10)}...${text.slice(-6)}` : text || "-";
+}
+
+function rootCauseText(item) {
+ return item?.rootCause || item?.evidenceSummary || item?.summary || "尚未记录根因,等待下一次 OTel/报告归因。";
+}
+
+function findingTitle(item) {
+ return item?.code || item?.findingId || item?.scenarioId || item?.latestRunId || "finding";
+}
+
+function detailSummaryText(detail) {
+ if (!detail) return "加载详情中";
+ if (detail.ok === false) return detail.error || "详情不可用";
+ const summary = detail.summary && Object.keys(detail.summary).length > 0 ? detail.summary : detail.run;
+ return JSON.stringify(summary || {}, null, 2);
+}
+
+function commandSummary(detail) {
+ const commands = detail?.commands || {};
+ const lines = Object.entries(commands).map(([key, value]) => `${key}: ${value}`);
+ return lines.length > 0 ? lines.join("\n") : "暂无命令";
+}
+
+function statusLabel(status) {
+ const value = String(status || "");
+ if (value === "blocked") return "阻塞";
+ if (value === "degraded") return "降级";
+ if (value === "warning") return "警告";
+ if (value === "healthy") return "健康";
+ return "空闲";
+}
+
+function number(value) {
+ const parsed = Number(value);
+ return Number.isFinite(parsed) ? parsed : 0;
+}
diff --git a/scripts/assets/web-probe-sentinel-monitor-web/vendor/VUE-LICENSE b/scripts/assets/web-probe-sentinel-monitor-web/vendor/VUE-LICENSE
new file mode 100644
index 00000000..15f1f7e7
--- /dev/null
+++ b/scripts/assets/web-probe-sentinel-monitor-web/vendor/VUE-LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018-present, Yuxi (Evan) You
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/scripts/assets/web-probe-sentinel-monitor-web/vendor/vue.runtime.esm-browser.prod.js b/scripts/assets/web-probe-sentinel-monitor-web/vendor/vue.runtime.esm-browser.prod.js
new file mode 100644
index 00000000..5a5c57ce
--- /dev/null
+++ b/scripts/assets/web-probe-sentinel-monitor-web/vendor/vue.runtime.esm-browser.prod.js
@@ -0,0 +1,7 @@
+/**
+* vue v3.5.39
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/var e,t;let n,l,r,i,s,o,a,u,c,f,p,d;function h(e){let t=Object.create(null);for(let n of e.split(","))t[n]=1;return e=>e in t}let g={},_=[],m=()=>{},y=()=>!1,b=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||97>e.charCodeAt(2)),S=e=>e.startsWith("onUpdate:"),C=Object.assign,x=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},w=Object.prototype.hasOwnProperty,k=(e,t)=>w.call(e,t),E=Array.isArray,T=e=>"function"==typeof e,A=e=>"string"==typeof e,R=e=>"symbol"==typeof e,O=e=>null!==e&&"object"==typeof e,N=e=>(O(e)||T(e))&&T(e.then)&&T(e.catch),P=Object.prototype.toString,M=e=>A(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,I=h(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),F=e=>{let t=Object.create(null);return n=>t[n]||(t[n]=e(n))},L=/-\w/g,j=F(e=>e.replace(L,e=>e.slice(1).toUpperCase())),D=/\B([A-Z])/g,V=F(e=>e.replace(D,"-$1").toLowerCase()),U=F(e=>e.charAt(0).toUpperCase()+e.slice(1)),B=F(e=>e?`on${U(e)}`:""),$=(e,t)=>!Object.is(e,t),H=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:l,value:n})},K=e=>{let t=parseFloat(e);return isNaN(t)?e:t},z=e=>{let t=A(e)?Number(e):NaN;return isNaN(t)?e:t},q=()=>n||(n="u">typeof globalThis?globalThis:"u">typeof self?self:"u">typeof window?window:"u">typeof global?global:{}),G=h("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol");function X(e){if(E(e)){let t={};for(let n=0;n{if(e){let n=e.split(Z);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}(l):X(l);if(r)for(let e in r)t[e]=r[e]}return t}if(A(e)||O(e))return e}let J=/;(?![^(]*\))/g,Z=/:([^]+)/,Y=/\/\*[^]*?\*\//g;function Q(e){let t="";if(A(e))t=e;else if(E(e))for(let n=0;nen(e,t))}let er=e=>!!(e&&!0===e.__v_isRef),ei=e=>A(e)?e:null==e?"":E(e)||O(e)&&(e.toString===P||!T(e.toString))?er(e)?ei(e.value):JSON.stringify(e,es,2):String(e),es=(e,t)=>{let n;if(er(t))return es(e,t.value);if("[object Map]"===(n=t,P.call(n)))return{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],l)=>(e[eo(t,l)+" =>"]=n,e),{})};{let e;if("[object Set]"===(e=t,P.call(e)))return{[`Set(${t.size})`]:[...t.values()].map(e=>eo(e))};else{if(R(t))return eo(t);let e;if(O(t)&&!E(t)&&"[object Object]"!==(e=t,P.call(e)))return String(t)}}return t},eo=(e,t="")=>{var n;return R(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};class ea{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&l&&(l.active?(this.parent=l,this.index=(l.scopes||(l.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e0&&0==--this._on){if(l===this)l=this.prevScope;else{let e=l;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){let t,n;for(this._active=!1,t=0,n=this.effects.length;t0)){if(s){let e=s;for(s=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}for(;i;){let t=i;for(i=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}}function e_(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function em(e){let t,n=e.depsTail,l=n;for(;l;){let e=l.prevDep;-1===l.version?(l===n&&(n=e),eS(l),function(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}(l)):t=l,l.dep.activeLink=l.prevActiveLink,l.prevActiveLink=void 0,l=e}e.deps=t,e.depsTail=n}function ey(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(eb(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function eb(e){if(4&e.flags&&!(16&e.flags)||(e.flags&=-17,e.globalVersion===eR)||(e.globalVersion=eR,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!ey(e))))return;e.flags|=2;let t=e.dep,n=r,l=ew;r=e,ew=!0;try{e_(e);let n=e.fn(e._value);(0===t.version||$(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{r=n,ew=l,em(e),e.flags&=-3}}function eS(e,t=!1){let{dep:n,prevSub:l,nextSub:r}=e;if(l&&(l.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=l,e.nextSub=void 0),n.subs===e&&(n.subs=l,!l&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)eS(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}function eC(e,t){e.effect instanceof ed&&(e=e.effect.fn);let n=new ed(e);t&&C(n,t);try{n.run()}catch(e){throw n.stop(),e}let l=n.run.bind(n);return l.effect=n,l}function ex(e){e.effect.stop()}let ew=!0,ek=[];function eE(){ek.push(ew),ew=!1}function eT(){let e=ek.pop();ew=void 0===e||e}function eA(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=r;r=void 0;try{t()}finally{r=e}}}let eR=0;class eO{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class eN{constructor(e){this.computed=e,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(e){if(!r||!ew||r===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==r)t=this.activeLink=new eO(r,this),r.deps?(t.prevDep=r.depsTail,r.depsTail.nextDep=t,r.depsTail=t):r.deps=r.depsTail=t,function e(t){if(t.dep.sc++,4&t.sub.flags){let n=t.dep.computed;if(n&&!t.dep.subs){n.flags|=20;for(let t=n.deps;t;t=t.nextDep)e(t)}let l=t.dep.subs;l!==t&&(t.prevSub=l,l&&(l.nextSub=t)),t.dep.subs=t}}(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=r.depsTail,t.nextDep=void 0,r.depsTail.nextDep=t,r.depsTail=t,r.deps===t&&(r.deps=e)}return t}trigger(e){this.version++,eR++,this.notify(e)}notify(e){eh++;try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{ev()}}}let eP=new WeakMap,eM=Symbol(""),eI=Symbol(""),eF=Symbol("");function eL(e,t,n){if(ew&&r){let t=eP.get(e);t||eP.set(e,t=new Map);let l=t.get(n);l||(t.set(n,l=new eN),l.map=t,l.key=n),l.track()}}function ej(e,t,n,l,r,i){let s=eP.get(e);if(!s)return void eR++;let o=e=>{e&&e.trigger()};if(eh++,"clear"===t)s.forEach(o);else{let r=E(e),i=r&&M(n);if(r&&"length"===n){let e=Number(l);s.forEach((t,n)=>{("length"===n||n===eF||!R(n)&&n>=e)&&o(t)})}else switch((void 0!==n||s.has(void 0))&&o(s.get(n)),i&&o(s.get(eF)),t){case"add":if(r)i&&o(s.get("length"));else{let t;o(s.get(eM));"[object Map]"===(t=e,P.call(t))&&o(s.get(eI))}break;case"delete":if(!r){let t;o(s.get(eM));"[object Map]"===(t=e,P.call(t))&&o(s.get(eI))}break;case"set":let a;"[object Map]"===(a=e,P.call(a))&&o(s.get(eM))}}ev()}function eD(e){let t=th(e);return t===e?t:(eL(t,"iterate",eF),tp(e)?t:t.map(tv))}function eV(e){return eL(e=th(e),"iterate",eF),e}function eU(e,t){return tf(e)?tc(e)?t_(tv(t)):t_(t):tv(t)}let eB={__proto__:null,[Symbol.iterator](){return e$(this,Symbol.iterator,e=>eU(this,e))},concat(...e){return eD(this).concat(...e.map(e=>E(e)?eD(e):e))},entries(){return e$(this,"entries",e=>(e[1]=eU(this,e[1]),e))},every(e,t){return eW(this,"every",e,t,void 0,arguments)},filter(e,t){return eW(this,"filter",e,t,e=>e.map(e=>eU(this,e)),arguments)},find(e,t){return eW(this,"find",e,t,e=>eU(this,e),arguments)},findIndex(e,t){return eW(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return eW(this,"findLast",e,t,e=>eU(this,e),arguments)},findLastIndex(e,t){return eW(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return eW(this,"forEach",e,t,void 0,arguments)},includes(...e){return ez(this,"includes",e)},indexOf(...e){return ez(this,"indexOf",e)},join(e){return eD(this).join(e)},lastIndexOf(...e){return ez(this,"lastIndexOf",e)},map(e,t){return eW(this,"map",e,t,void 0,arguments)},pop(){return eq(this,"pop")},push(...e){return eq(this,"push",e)},reduce(e,...t){return eK(this,"reduce",e,t)},reduceRight(e,...t){return eK(this,"reduceRight",e,t)},shift(){return eq(this,"shift")},some(e,t){return eW(this,"some",e,t,void 0,arguments)},splice(...e){return eq(this,"splice",e)},toReversed(){return eD(this).toReversed()},toSorted(e){return eD(this).toSorted(e)},toSpliced(...e){return eD(this).toSpliced(...e)},unshift(...e){return eq(this,"unshift",e)},values(){return e$(this,"values",e=>eU(this,e))}};function e$(e,t,n){let l=eV(e),r=l[t]();return l===e||tp(e)||(r._next=r.next,r.next=()=>{let e=r._next();return e.done||(e.value=n(e.value)),e}),r}let eH=Array.prototype;function eW(e,t,n,l,r,i){let s=eV(e),o=s!==e&&!tp(e),a=s[t];if(a!==eH[t]){let t=a.apply(e,i);return o?tv(t):t}let u=n;s!==e&&(o?u=function(t,l){return n.call(this,eU(e,t),l,e)}:n.length>2&&(u=function(t,l){return n.call(this,t,l,e)}));let c=a.call(s,u,l);return o&&r?r(c):c}function eK(e,t,n,l){let r=eV(e),i=r!==e&&!tp(e),s=n,o=!1;r!==e&&(i?(o=0===l.length,s=function(t,l,r){return o&&(o=!1,t=eU(e,t)),n.call(this,t,eU(e,l),r,e)}):n.length>3&&(s=function(t,l,r){return n.call(this,t,l,r,e)}));let a=r[t](s,...l);return o?eU(e,a):a}function ez(e,t,n){let l=th(e);eL(l,"iterate",eF);let r=l[t](...n);return(-1===r||!1===r)&&td(n[0])?(n[0]=th(n[0]),l[t](...n)):r}function eq(e,t,n=[]){eE(),eh++;let l=th(e)[t].apply(e,n);return ev(),eT(),l}let eG=h("__proto__,__v_isRef,__isVue"),eX=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(R));function eJ(e){R(e)||(e=String(e));let t=th(this);return eL(t,"has",e),t.hasOwnProperty(e)}class eZ{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e.__v_skip;let l=this._isReadonly,r=this._isShallow;if("__v_isReactive"===t)return!l;if("__v_isReadonly"===t)return l;if("__v_isShallow"===t)return r;if("__v_raw"===t)return n===(l?r?tr:tl:r?tn:tt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let i=E(e);if(!l){let e;if(i&&(e=eB[t]))return e;if("hasOwnProperty"===t)return eJ}let s=Reflect.get(e,t,tm(e)?e:n);if((R(t)?eX.has(t):eG(t))||(l||eL(e,"get",t),r))return s;if(tm(s)){let e=i&&M(t)?s:s.value;return l&&O(e)?to(e):e}return O(s)?l?to(s):ti(s):s}}class eY extends eZ{constructor(e=!1){super(!1,e)}set(e,t,n,l){let r=e[t],i=E(e)&&M(t);if(!this._isShallow){let e=tf(r);if(tp(n)||tf(n)||(r=th(r),n=th(n)),!i&&tm(r)&&!tm(n))if(e)return!0;else return r.value=n,!0}let s=i?Number(t)e;function e4(e){return function(){return"delete"!==e&&("clear"===e?void 0:this)}}function e3(e,t){let n,l=(C(n={get(n){let l=this.__v_raw,r=th(l),i=th(n);e||($(n,i)&&eL(r,"get",n),eL(r,"get",i));let{has:s}=Reflect.getPrototypeOf(r),o=t?e8:e?t_:tv;return s.call(r,n)?o(l.get(n)):s.call(r,i)?o(l.get(i)):void(l!==r&&l.get(n))},get size(){let t=this.__v_raw;return e||eL(th(t),"iterate",eM),t.size},has(t){let n=this.__v_raw,l=th(n),r=th(t);return e||($(t,r)&&eL(l,"has",t),eL(l,"has",r)),t===r?n.has(t):n.has(t)||n.has(r)},forEach(n,l){let r=this,i=r.__v_raw,s=th(i),o=t?e8:e?t_:tv;return e||eL(s,"iterate",eM),i.forEach((e,t)=>n.call(l,o(e),o(t),r))}},e?{add:e4("add"),set:e4("set"),delete:e4("delete"),clear:e4("clear")}:{add(e){let n=th(this),l=Reflect.getPrototypeOf(n),r=th(e),i=t||tp(e)||tf(e)?e:r;return l.has.call(n,i)||$(e,i)&&l.has.call(n,e)||$(r,i)&&l.has.call(n,r)||(n.add(i),ej(n,"add",i,i)),this},set(e,n){t||tp(n)||tf(n)||(n=th(n));let l=th(this),{has:r,get:i}=Reflect.getPrototypeOf(l),s=r.call(l,e);s||(e=th(e),s=r.call(l,e));let o=i.call(l,e);return l.set(e,n),s?$(n,o)&&ej(l,"set",e,n):ej(l,"add",e,n),this},delete(e){let t=th(this),{has:n,get:l}=Reflect.getPrototypeOf(t),r=n.call(t,e);r||(e=th(e),r=n.call(t,e)),l&&l.call(t,e);let i=t.delete(e);return r&&ej(t,"delete",e,void 0),i},clear(){let e=th(this),t=0!==e.size,n=e.clear();return t&&ej(e,"clear",void 0,void 0),n}}),["keys","values","entries",Symbol.iterator].forEach(l=>{n[l]=function(...n){let r,i=this.__v_raw,s=th(i),o="[object Map]"===(r=s,P.call(r)),a="entries"===l||l===Symbol.iterator&&o,u=i[l](...n),c=t?e8:e?t_:tv;return e||eL(s,"iterate","keys"===l&&o?eI:eM),C(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:a?[c(e[0]),c(e[1])]:c(e),done:t}}})}}),n);return(t,n,r)=>"__v_isReactive"===n?!e:"__v_isReadonly"===n?e:"__v_raw"===n?t:Reflect.get(k(l,n)&&n in t?l:t,n,r)}let e5={get:e3(!1,!1)},e9={get:e3(!1,!0)},e7={get:e3(!0,!1)},te={get:e3(!0,!0)},tt=new WeakMap,tn=new WeakMap,tl=new WeakMap,tr=new WeakMap;function ti(e){return tf(e)?e:tu(e,!1,e0,e5,tt)}function ts(e){return tu(e,!1,e2,e9,tn)}function to(e){return tu(e,!0,e1,e7,tl)}function ta(e){return tu(e,!0,e6,te,tr)}function tu(e,t,n,l,r){let i;if(!O(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let s=r.get(e);if(s)return s;let o=function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((i=e,P.call(i)).slice(8,-1));if(0===o)return e;let a=new Proxy(e,2===o?l:n);return r.set(e,a),a}function tc(e){return tf(e)?tc(e.__v_raw):!!(e&&e.__v_isReactive)}function tf(e){return!!(e&&e.__v_isReadonly)}function tp(e){return!!(e&&e.__v_isShallow)}function td(e){return!!e&&!!e.__v_raw}function th(e){let t=e&&e.__v_raw;return t?th(t):e}function tg(e){return!k(e,"__v_skip")&&Object.isExtensible(e)&&W(e,"__v_skip",!0),e}let tv=e=>O(e)?ti(e):e,t_=e=>O(e)?to(e):e;function tm(e){return!!e&&!0===e.__v_isRef}function ty(e){return tS(e,!1)}function tb(e){return tS(e,!0)}function tS(e,t){return tm(e)?e:new tC(e,t)}class tC{constructor(e,t){this.dep=new eN,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:th(e),this._value=t?e:tv(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||tp(e)||tf(e);$(e=n?e:th(e),t)&&(this._rawValue=e,this._value=n?e:tv(e),this.dep.trigger())}}function tx(e){e.dep&&e.dep.trigger()}function tw(e){return tm(e)?e.value:e}function tk(e){return T(e)?e():tw(e)}let tE={get:(e,t,n)=>"__v_raw"===t?e:tw(Reflect.get(e,t,n)),set:(e,t,n,l)=>{let r=e[t];return tm(r)&&!tm(n)?(r.value=n,!0):Reflect.set(e,t,n,l)}};function tT(e){return tc(e)?e:new Proxy(e,tE)}class tA{constructor(e){this.__v_isRef=!0,this._value=void 0;let t=this.dep=new eN,{get:n,set:l}=e(t.track.bind(t),t.trigger.bind(t));this._get=n,this._set=l}get value(){return this._value=this._get()}set value(e){this._set(e)}}function tR(e){return new tA(e)}function tO(e){let t=E(e)?Array(e.length):{};for(let n in e)t[n]=new tN(e,n,void 0);return t}class tN{constructor(e,t,n){this._object=e,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=R(t)?t:String(t),this._raw=th(e);let l=!0,r=e;if(!E(e)||R(this._key)||!M(this._key))do l=!td(r)||tp(r);while(l&&(r=r.__v_raw));this._shallow=l}get value(){let e=this._object[this._key];return this._shallow&&(e=tw(e)),this._value=void 0===e?this._defaultValue:e}set value(e){if(this._shallow&&tm(this._raw[this._key])){let t=this._object[this._key];if(tm(t)){t.value=e;return}}this._object[this._key]=e}get dep(){var e,t;let n;return e=this._raw,t=this._key,(n=eP.get(e))&&n.get(t)}}class tP{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function tM(e,t,n){if(tm(e))return e;if(T(e))return new tP(e);if(!O(e)||!(arguments.length>1))return ty(e);return new tN(e,t,n)}class tI{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new eN(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=eR-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags)&&r!==this)return eg(this,!0),!0}get value(){let e=this.dep.track();return eb(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}let tF={GET:"get",HAS:"has",ITERATE:"iterate"},tL={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},tj={},tD=new WeakMap;function tV(){return p}function tU(e,t=!1,n=p){if(n){let t=tD.get(n);t||tD.set(n,t=[]),t.push(e)}}function tB(e,t=1/0,n){if(t<=0||!O(e)||e.__v_skip||((n=n||new Map).get(e)||0)>=t)return e;if(n.set(e,t),t--,tm(e))tB(e.value,t,n);else if(E(e))for(let l=0;l{tB(e,t,n)});else{let l;if("[object Object]"===(l=e,P.call(l))){for(let l in e)tB(e[l],t,n);for(let l of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,l)&&tB(e[l],t,n)}}}return e}function t$(e,t){}let tH={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"};function tW(e,t,n,l){try{return l?e(...l):e()}catch(e){tz(e,t,n)}}function tK(e,t,n,l){if(T(e)){let r=tW(e,t,n,l);return r&&N(r)&&r.catch(e=>{tz(e,t,n)}),r}if(E(e)){let r=[];for(let i=0;i=t3(n)?tq.push(e):tq.splice(function(e){let t=tG+1,n=tq.length;for(;t>>1,r=tq[l],i=t3(r);it3(e)-t3(t));if(tX.length=0,tJ)return void tJ.push(...e);for(tJ=e,tZ=0;tZnull==e.id?2&e.flags?-1:1/0:e.id,t5=null,t9=null;function t7(e){let t=t5;return t5=e,t9=e&&e.type.__scopeId||null,t}function ne(e){t9=e}function nt(){t9=null}let nn=e=>nl;function nl(e,t=t5,n){if(!t||e._n)return e;let l=(...n)=>{let r;l._d&&r0(-1);let i=t7(t);try{r=e(...n)}finally{t7(i),l._d&&r0(1)}return r};return l._n=!0,l._c=!0,l._d=!0,l}function nr(e,t){if(null===t5)return e;let n=iR(t5),l=e.dirs||(e.dirs=[]);for(let e=0;e1)return n&&T(t)?t.call(l&&l.proxy):t}}function na(){return!!(i_()||rr)}let nu=Symbol.for("v-scx"),nc=()=>no(nu);function nf(e,t){return ng(e,null,t)}function np(e,t){return ng(e,null,{flush:"post"})}function nd(e,t){return ng(e,null,{flush:"sync"})}function nh(e,t,n){return ng(e,t,n)}function ng(e,t,n=g){let l,{immediate:r,flush:i}=n,s=C({},n),o=t&&r||!t&&"post"!==i;if(iS){if("sync"===i){let e=nc();l=e.__watcherHandles||(e.__watcherHandles=[])}else if(!o){let e=()=>{};return e.stop=m,e.resume=m,e.pause=m,e}}let a=iv;s.call=(e,t,n)=>tK(e,a,t,n);let u=!1;"post"===i?s.scheduler=e=>{rA(e,a&&a.suspense)}:"sync"!==i&&(u=!0,s.scheduler=(e,t)=>{t?e():t1(e)}),s.augmentJob=e=>{t&&(e.flags|=4),u&&(e.flags|=2,a&&(e.id=a.uid,e.i=a))};let c=function(e,t,n=g){let l,r,i,s,{immediate:o,deep:a,once:u,scheduler:c,augmentJob:f,call:d}=n,h=e=>a?e:tp(e)||!1===a||0===a?tB(e,1):tB(e),_=!1,y=!1;if(tm(e)?(r=()=>e.value,_=tp(e)):tc(e)?(r=()=>h(e),_=!0):E(e)?(y=!0,_=e.some(e=>tc(e)||tp(e)),r=()=>e.map(e=>tm(e)?e.value:tc(e)?h(e):T(e)?d?d(e,2):e():void 0)):r=T(e)?t?d?()=>d(e,2):e:()=>{if(i){eE();try{i()}finally{eT()}}let t=p;p=l;try{return d?d(e,3,[s]):e(s)}finally{p=t}}:m,t&&a){let e=r,t=!0===a?1/0:a;r=()=>tB(e(),t)}let b=ec(),S=()=>{l.stop(),b&&b.active&&x(b.effects,l)};if(u&&t){let e=t;t=(...t)=>{let n=e(...t);return S(),n}}let C=y?Array(e.length).fill(tj):tj,w=e=>{if(1&l.flags&&(l.dirty||e))if(t){let n=l.run();if(e||a||_||(y?n.some((e,t)=>$(e,C[t])):$(n,C))){i&&i();let e=p;p=l;try{let e=[n,C===tj?void 0:y&&C[0]===tj?[]:C,s];C=n,d?d(t,3,e):t(...e)}finally{p=e}}}else l.run()};return f&&f(w),(l=new ed(r)).scheduler=c?()=>c(w,!1):w,s=e=>tU(e,!1,l),i=l.onStop=()=>{let e=tD.get(l);if(e){if(d)d(e,4);else for(let t of e)t();tD.delete(l)}},t?o?w(!0):C=l.run():c?c(w.bind(null,!0),!0):l.run(),S.pause=l.pause.bind(l),S.resume=l.resume.bind(l),S.stop=S,S}(e,t,s);return iS&&(l?l.push(c):o&&c()),c}function nv(e,t,n){let l,r=this.proxy,i=A(e)?e.includes(".")?n_(r,e):()=>r[e]:e.bind(r,r);T(t)?l=t:(l=t.handler,n=t);let s=im(this),o=ng(i,l.bind(r),n);return s(),o}function n_(e,t){let n=t.split(".");return()=>{let t=e;for(let e=0;ee&&(e.disabled||""===e.disabled),nS=e=>"u">typeof SVGElement&&e instanceof SVGElement,nC=e=>"function"==typeof MathMLElement&&e instanceof MathMLElement,nx=(e,t)=>{let n=e&&e.to;return A(n)?t?t(n):null:n};function nw(e,t,n,{o:{insert:l},m:r},i=2){0===i&&l(e.targetAnchor,t,n);let{el:s,anchor:o,shapeFlag:a,children:u,props:c}=e,f=2===i;if(f&&l(s,t,n),!nm.has(e)&&(!f||nb(c))&&16&a)for(let e=0;e{16&e.shapeFlag&&c(e.children,t,n,r,i,s,o,a)},S=(e=t)=>{let n=nb(e.props),l=e.target=nx(e.props,h),i=nT(l,e,g,d);l&&("svg"!==s&&nS(l)?s="svg":"mathml"!==s&&nC(l)&&(s="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(l),n||(b(e,l,i),nE(e,!1)))},C=e=>{let t=()=>{if(nm.get(e)===t){if(nm.delete(e),nb(e.props)){let t=_(e.el)||n;b(e,t,e.anchor),nE(e,!0)}S(e)}};nm.set(e,t),rA(t,i)};if(null==e){let e,r=t.el=g(""),s=t.anchor=g("");if(d(r,n,l),d(s,n,l),(e=t.props)&&(e.defer||""===e.defer)||i&&i.pendingBranch)return void C(t);m&&(b(t,n,s),nE(t,!0)),S()}else{t.el=e.el;let l=t.anchor=e.anchor,c=nm.get(e);if(c){c.flags|=8,nm.delete(e),C(t);return}t.targetStart=e.targetStart;let d=t.target=e.target,g=t.targetAnchor=e.targetAnchor,_=nb(e.props),b=_?n:d,S=_?l:g;if("svg"===s||nS(d)?s="svg":("mathml"===s||nC(d))&&(s="mathml"),y?(p(e.dynamicChildren,y,b,r,i,s,o),rF(e,t,!0)):a||f(e,t,b,S,r,i,s,o,!1),m)_?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):nw(t,n,l,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){let e=nx(t.props,h);e&&(t.target=e,nw(t,e,null,u,0))}else _&&nw(t,d,g,u,1);nE(t,m)}},remove(e,t,n,{um:l,o:{remove:r}},i){let{shapeFlag:s,children:o,anchor:a,targetStart:u,targetAnchor:c,target:f,props:p}=e,d=nb(p),h=i||!d,g=nm.get(e);if(g&&(g.flags|=8,nm.delete(e)),f&&(r(u),r(c)),i&&r(a),!g&&(d||f)&&16&s)for(let e=0;e{e.isMounted=!0}),lm(()=>{e.isUnmounting=!0}),e}let nN=[Function,Array],nP={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:nN,onEnter:nN,onAfterEnter:nN,onEnterCancelled:nN,onBeforeLeave:nN,onLeave:nN,onAfterLeave:nN,onLeaveCancelled:nN,onBeforeAppear:nN,onAppear:nN,onAfterAppear:nN,onAppearCancelled:nN},nM=e=>{let t=e.subTree;return t.component?nM(t.component):t};function nI(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==rq){t=n;break}}return t}let nF={name:"BaseTransition",props:nP,setup(e,{slots:t}){let n=i_(),l=nO();return()=>{let r=t.default&&nB(t.default(),!0),i=r&&r.length?nI(r):n.subTree?is():void 0;if(!i)return;let s=th(e),{mode:o}=s;if(l.isLeaving)return nD(i);let a=nV(i);if(!a)return nD(i);let u=nj(a,s,l,n,e=>u=e);a.type!==rq&&nU(a,u);let c=n.subTree&&nV(n.subTree);if(c&&c.type!==rq&&!r4(c,a)&&nM(n).type!==rq){let e=nj(c,s,l,n);if(nU(c,e),"out-in"===o&&a.type!==rq)return l.isLeaving=!0,e.afterLeave=()=>{l.isLeaving=!1,8&n.job.flags||n.update(),delete e.afterLeave,c=void 0},nD(i);"in-out"===o&&a.type!==rq?e.delayLeave=(e,t,n)=>{nL(l,c)[String(c.key)]=c,e[nA]=()=>{t(),e[nA]=void 0,delete u.delayedLeave,c=void 0},u.delayedLeave=()=>{n(),delete u.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return i}}};function nL(e,t){let{leavingVNodes:n}=e,l=n.get(t.type);return l||(l=Object.create(null),n.set(t.type,l)),l}function nj(e,t,n,l,r){let{appear:i,mode:s,persisted:o=!1,onBeforeEnter:a,onEnter:u,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:p,onLeave:d,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:_,onAppear:m,onAfterAppear:y,onAppearCancelled:b}=t,S=String(e.key),C=nL(n,e),x=(e,t)=>{e&&tK(e,l,9,t)},w=(e,t)=>{let n=t[1];x(e,t),E(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},k={mode:s,persisted:o,beforeEnter(t){let l=a;if(!n.isMounted)if(!i)return;else l=_||a;t[nA]&&t[nA](!0);let r=C[S];r&&r4(e,r)&&r.el[nA]&&r.el[nA](),x(l,[t])},enter(t){if(C[S]===e)return;let l=u,r=c,s=f;if(!n.isMounted)if(!i)return;else l=m||u,r=y||c,s=b||f;let o=!1;t[nR]=e=>{o||(o=!0,e?x(s,[t]):x(r,[t]),k.delayedLeave&&k.delayedLeave(),t[nR]=void 0)};let a=t[nR].bind(null,!1);l?w(l,[t,a]):a()},leave(t,l){let r=String(e.key);if(t[nR]&&t[nR](!0),n.isUnmounting)return l();x(p,[t]);let i=!1;t[nA]=n=>{i||(i=!0,l(),n?x(g,[t]):x(h,[t]),t[nA]=void 0,C[r]===e&&delete C[r])};let s=t[nA].bind(null,!1);C[r]=e,d?w(d,[t,s]):s()},clone(e){let i=nj(e,t,n,l,r);return r&&r(i),i}};return k}function nD(e){if(lr(e))return(e=il(e)).children=null,e}function nV(e){if(!lr(e))return e.type.__isTeleport&&e.children?nI(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&T(n.default))return n.default()}}function nU(e,t){6&e.shapeFlag&&e.component?(e.transition=t,nU(e.component.subTree,t)):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function nB(e,t=!1,n){let l=[],r=0;for(let i=0;i1)for(let e=0;en.value,set:e=>n.value=e}),n}function nz(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}let nq=new WeakMap;function nG(e,t,n,l,r=!1){if(E(e))return void e.forEach((e,i)=>nG(e,t&&(E(t)?t[i]:t),n,l,r));if(lt(l)&&!r){512&l.shapeFlag&&l.type.__asyncResolved&&l.component.subTree.component&&nG(e,t,n,l.component.subTree);return}let i=4&l.shapeFlag?iR(l.component):l.el,s=r?null:i,{i:o,r:a}=e,u=t&&t.r,c=o.refs===g?o.refs={}:o.refs,f=o.setupState,p=th(f),d=f===g?y:e=>!nz(c,e)&&k(p,e),h=(e,t)=>!(t&&nz(c,t));if(null!=u&&u!==a&&(nX(t),A(u)?(c[u]=null,d(u)&&(f[u]=null)):tm(u)&&(h(u,t.k)&&(u.value=null),t.k&&(c[t.k]=null))),T(a)){eE();try{tW(a,o,12,[s,c])}finally{eT()}}else{let t=A(a),l=tm(a);if(t||l){let o=()=>{if(e.f){let n=t?d(a)?f[a]:c[a]:h()||!e.k?a.value:c[e.k];if(r)E(n)&&x(n,i);else if(E(n))n.includes(i)||n.push(i);else if(t)c[a]=[i],d(a)&&(f[a]=c[a]);else{let t=[i];h(a,e.k)&&(a.value=t),e.k&&(c[e.k]=t)}}else t?(c[a]=s,d(a)&&(f[a]=s)):l&&(h(a,e.k)&&(a.value=s),e.k&&(c[e.k]=s))};if(s){let t=()=>{o(),nq.delete(e)};t.id=-1,nq.set(e,t),rA(t,n)}else nX(e),o()}}}function nX(e){let t=nq.get(e);t&&(t.flags|=8,nq.delete(e))}let nJ=!1,nZ=()=>{nJ||(console.error("Hydration completed but contains mismatches."),nJ=!0)},nY=e=>{if(1===e.nodeType){if(e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)return"svg";if(e.namespaceURI.includes("MathML"))return"mathml"}},nQ=e=>8===e.nodeType;function n0(e){let{mt:t,p:n,o:{patchProp:l,createText:r,nextSibling:i,parentNode:s,remove:o,insert:a,createComment:u}}=e,c=(n,l,o,u,y,b=!1)=>{b=b||!!l.dynamicChildren;let S=nQ(n)&&"["===n.data,C=()=>h(n,l,o,u,y,S),{type:x,ref:w,shapeFlag:k,patchFlag:E}=l,T=n.nodeType;l.el=n,-2===E&&(b=!1,l.dynamicChildren=null);let A=null;switch(x){case rz:3!==T?""===l.children?(a(l.el=r(""),s(n),n),A=n):A=C():(n.data!==l.children&&(nZ(),n.data=l.children),A=i(n));break;case rq:m(n)?(A=i(n),_(l.el=n.content.firstChild,n,o)):A=8!==T||S?C():i(n);break;case rG:if(S&&(T=(n=i(n)).nodeType),1===T||3===T){A=n;let e=!l.children.length;for(let t=0;t{s=s||!!t.dynamicChildren;let{type:a,dynamicProps:u,props:c,patchFlag:f,shapeFlag:d,dirs:h,transition:g}=t,y="input"===a||"option"===a,S=!!u;if(y||S||-1!==f){let a;h&&ni(t,null,n,"created");let C=!1;if(m(e)){C=rI(null,g)&&n&&n.vnode.props&&n.vnode.props.appear;let l=e.content.firstChild;if(C){let e=l.getAttribute("class");e&&(l.$cls=e),g.beforeEnter(l)}_(l,e,n),t.el=e=l}if(16&d&&!(c&&(c.innerHTML||c.textContent))){let l=p(e.firstChild,t,e,n,r,i,s);for(l&&!n6(e,1)&&nZ();l;){let e=l;l=l.nextSibling,o(e)}}else if(8&d){let n=t.children;`
+`===n[0]&&("PRE"===e.tagName||"TEXTAREA"===e.tagName)&&(n=n.slice(1));let{textContent:l}=e;l!==n&&l!==n.replace(/\r\n|\r/g,`
+`)&&(n6(e,0)||nZ(),e.textContent=t.children)}if(c){if(y||S||!s||48&f){let t=e.tagName.includes("-");for(let r in c)(y&&(r.endsWith("value")||"indeterminate"===r)||b(r)&&!I(r)||"."===r[0]||t&&!I(r)||u&&u.includes(r))&&l(e,r,null,c[r],void 0,n)}else if(c.onClick)l(e,"onClick",null,c.onClick,void 0,n);else if(4&f&&tc(c.style))for(let e in c.style)c.style[e]}(a=c&&c.onVnodeBeforeMount)&&ip(a,n,t),h&&ni(t,null,n,"beforeMount"),((a=c&&c.onVnodeMounted)||h||C)&&rH(()=>{a&&ip(a,n,t),C&&g.enter(e),h&&ni(t,null,n,"mounted")},r)}return e.nextSibling},p=(e,t,l,s,o,u,f)=>{f=f||!!t.dynamicChildren;let p=t.children,d=p.length,h=!1;for(let t=0;t{let{slotScopeIds:c}=t;c&&(r=r?r.concat(c):c);let f=s(e),d=p(i(e),t,f,n,l,r,o);return d&&nQ(d)&&"]"===d.data?i(t.anchor=d):(nZ(),a(t.anchor=u("]"),f,d),d)},h=(e,t,l,r,a,u)=>{var c,f,p;if(c=e,f=t,n6(c.parentElement,1)||1===(p=c).nodeType&&n8(p.getAttribute(n1),1)||function({props:e}){let t=e&&e[n1];return"string"==typeof t&&n8(t,1)}(f)||nZ(),t.el=null,u){let t=g(e);for(;;){let n=i(e);if(n&&n!==t)o(n);else break}}let d=i(e),h=s(e);return o(e),n(null,t,h,d,l,r,nY(h),a),l&&(l.vnode.el=t.el,rg(l,t.el)),d},g=(e,t="[",n="]")=>{let l=0;for(;e;)if((e=i(e))&&nQ(e)&&(e.data===t&&l++,e.data===n))if(0===l)return i(e);else l--;return e},_=(e,t,n)=>{let l=t.parentNode;l&&l.replaceChild(e,t);let r=n;for(;r;)r.vnode.el===t&&(r.vnode.el=r.subTree.el=e),r=r.parent},m=e=>1===e.nodeType&&"TEMPLATE"===e.tagName;return[(e,t)=>{if(!t.hasChildNodes()){n(null,e,t),t4(),t._vnode=e;return}c(t.firstChild,e,null,null,null),t4(),t._vnode=e},c]}let n1="data-allow-mismatch",n2={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function n6(e,t){if(0===t||1===t)for(;e&&!e.hasAttribute(n1);)e=e.parentElement;return n8(e&&e.getAttribute(n1),t)}function n8(e,t){if(null==e)return!1;{if(""===e)return!0;let n=e.split(",");return!!(0===t&&n.includes("children"))||n.includes(n2[t])}}let n4=q().requestIdleCallback||(e=>setTimeout(e,1)),n3=q().cancelIdleCallback||(e=>clearTimeout(e)),n5=(e=1e4)=>t=>{let n=n4(t,{timeout:e});return()=>n3(n)},n9=e=>(t,n)=>{let l=new IntersectionObserver(e=>{for(let n of e)if(n.isIntersecting){l.disconnect(),t();break}},e);return n(e=>{if(e instanceof Element){if(function(e){let{top:t,left:n,bottom:l,right:r}=e.getBoundingClientRect(),{innerHeight:i,innerWidth:s}=window;return(t>0&&t0&&l0&&n0&&rl.disconnect()},n7=e=>t=>{if(e){let n=matchMedia(e);if(!n.matches)return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t);t()}},le=(e=[])=>(t,n)=>{A(e)&&(e=[e]);let l=!1,r=e=>{l||(l=!0,i(),t(),e.target.dispatchEvent(new e.constructor(e.type,e)))},i=()=>{n(t=>{for(let n of e)t.removeEventListener(n,r)})};return n(t=>{for(let n of e)t.addEventListener(n,r,{once:!0})}),i},lt=e=>!!e.type.__asyncLoader;function ln(e){let t;T(e)&&(e={loader:e});let{loader:n,loadingComponent:l,errorComponent:r,delay:i=200,hydrate:s,timeout:o,suspensible:a=!0,onError:u}=e,c=null,f=0,p=()=>{let e;return c||(e=c=n().catch(e=>{if(e=e instanceof Error?e:Error(String(e)),u)return new Promise((t,n)=>{u(e,()=>t((f++,c=null,p())),()=>n(e),f+1)});throw e}).then(n=>e!==c&&c?c:(n&&(n.__esModule||"Module"===n[Symbol.toStringTag])&&(n=n.default),t=n,n)))};return n$({name:"AsyncComponentWrapper",__asyncLoader:p,__asyncHydrate(e,n,l){let r=!1;(n.bu||(n.bu=[])).push(()=>r=!0);let i=()=>{r||l()},o=s?()=>{let t=s(i,t=>(function(e,t){if(nQ(e)&&"["===e.data){let n=1,l=e.nextSibling;for(;l;){if(1===l.nodeType){if(!1===t(l))break}else if(nQ(l))if("]"===l.data){if(0==--n)break}else"["===l.data&&n++;l=l.nextSibling}}else t(e)})(e,t));t&&(n.bum||(n.bum=[])).push(t)}:i;t?o():p().then(()=>!n.isUnmounted&&o())},get __asyncResolved(){return t},setup(){let e,n,s=iv;if(nW(s),t)return()=>ll(t,s);let u=e=>{c=null,tz(e,s,13,!r)};if(a&&s.suspense||iS)return p().then(e=>()=>ll(e,s)).catch(e=>(u(e),()=>r?ie(r,{error:e}):null));let f=ty(!1),d=ty(),h=ty(!!i);return ly(()=>{null!=e&&clearTimeout(e),null!=n&&clearTimeout(n)}),i&&(n=setTimeout(()=>{s.isUnmounted||(h.value=!1)},i)),null!=o&&(e=setTimeout(()=>{if(!s.isUnmounted&&!f.value&&!d.value){let e=Error(`Async component timed out after ${o}ms.`);u(e),d.value=e}},o)),p().then(()=>{!s.isUnmounted&&(f.value=!0,s.parent&&lr(s.parent.vnode)&&s.parent.update())}).catch(e=>{if(s.isUnmounted){c=null;return}u(e),d.value=e}),()=>f.value&&t?ll(t,s):d.value&&r?ie(r,{error:d.value}):l&&!h.value?ll(l,s):void 0}})}function ll(e,t){let{ref:n,props:l,children:r,ce:i}=t.vnode,s=ie(e,l,r);return s.ref=n,s.ce=i,delete t.vnode.ce,s}let lr=e=>e.type.__isKeepAlive,li={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){let n=i_(),l=n.ctx;if(!l.renderer)return()=>{let e=t.default&&t.default();return e&&1===e.length?e[0]:e};let r=new Map,i=new Set,s=null,o=n.suspense,{renderer:{p:a,m:u,um:c,o:{createElement:f}}}=l,p=f("div");function d(e){lc(e),c(e,n,o,!0)}function h(e){r.forEach((t,n)=>{let l=iO(lt(t)?t.type.__asyncResolved||{}:t.type);l&&!e(l)&&g(n)})}function g(e){let t=r.get(e);!t||s&&r4(t,s)?s&&lc(s):d(t),r.delete(e),i.delete(e)}l.activate=(e,t,n,l,r)=>{let i=e.component;u(e,t,n,0,o),a(i.vnode,e,t,n,i,o,l,e.slotScopeIds,r),rA(()=>{i.isDeactivated=!1,i.a&&H(i.a);let t=e.props&&e.props.onVnodeMounted;t&&ip(t,i.parent,e)},o)},l.deactivate=e=>{let t=e.component;rL(t.m),rL(t.a),u(e,p,null,1,o),rA(()=>{t.da&&H(t.da);let n=e.props&&e.props.onVnodeUnmounted;n&&ip(n,t.parent,e),t.isDeactivated=!0},o)},nh(()=>[e.include,e.exclude],([e,t])=>{e&&h(t=>ls(e,t)),t&&h(e=>!ls(t,e))},{flush:"post",deep:!0});let _=null,m=()=>{null!=_&&(rj(n.subTree.type)?rA(()=>{r.set(_,lf(n.subTree))},n.subTree.suspense):r.set(_,lf(n.subTree)))};return lg(m),l_(m),lm(()=>{r.forEach(e=>{let{subTree:t,suspense:l}=n,r=lf(t);if(e.type===r.type&&e.key===r.key){lc(r);let e=r.component.da;e&&rA(e,l);return}d(e)})}),()=>{if(_=null,!t.default)return s=null;let n=t.default(),l=n[0];if(n.length>1)return s=null,n;if(!r8(l)||!(4&l.shapeFlag)&&!(128&l.shapeFlag))return s=null,l;let o=lf(l);if(o.type===rq)return s=null,o;let a=o.type,u=iO(lt(o)?o.type.__asyncResolved||{}:a),{include:c,exclude:f,max:p}=e;if(c&&(!u||!ls(c,u))||f&&u&&ls(f,u))return o.shapeFlag&=-257,s=o,l;let d=null==o.key?a:o.key,h=r.get(d);return o.el&&(o=il(o),128&l.shapeFlag&&(l.ssContent=o)),_=d,h?(o.el=h.el,o.component=h.component,o.transition&&nU(o,o.transition),o.shapeFlag|=512,i.delete(d),i.add(d)):(i.add(d),p&&i.size>parseInt(p,10)&&g(i.values().next().value)),o.shapeFlag|=256,s=o,rj(l.type)?l:o}}};function ls(e,t){let n;if(E(e))return e.some(e=>ls(e,t));if(A(e))return e.split(",").includes(t);return"[object RegExp]"===(n=e,P.call(n))&&(e.lastIndex=0,e.test(t))}function lo(e,t){lu(e,"a",t)}function la(e,t){lu(e,"da",t)}function lu(e,t,n=iv){let l=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(lp(t,l,n),n){let e=n.parent;for(;e&&e.parent;)lr(e.parent.vnode)&&function(e,t,n,l){let r=lp(t,e,l,!0);ly(()=>{x(l[t],r)},n)}(l,t,n,e),e=e.parent}}function lc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function lf(e){return 128&e.shapeFlag?e.ssContent:e}function lp(e,t,n=iv,l=!1){if(n){let r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...l)=>{eE();let r=im(n),i=tK(t,n,e,l);return r(),eT(),i});return l?r.unshift(i):r.push(i),i}}let ld=e=>(t,n=iv)=>{iS&&"sp"!==e||lp(e,(...e)=>t(...e),n)},lh=ld("bm"),lg=ld("m"),lv=ld("bu"),l_=ld("u"),lm=ld("bum"),ly=ld("um"),lb=ld("sp"),lS=ld("rtg"),lC=ld("rtc");function lx(e,t=iv){lp("ec",e,t)}let lw="components";function lk(e,t){return lR(lw,e,!0,t)||e}let lE=Symbol.for("v-ndc");function lT(e){return A(e)?lR(lw,e,!1)||e:e||lE}function lA(e){return lR("directives",e)}function lR(e,t,n=!0,l=!1){let r=t5||iv;if(r){let n=r.type;if(e===lw){let e=iO(n,!1);if(e&&(e===t||e===j(t)||e===U(j(t))))return n}let i=lO(r[e]||n[e],t)||lO(r.appContext[e],t);return!i&&l?n:i}}function lO(e,t){return e&&(e[t]||e[j(t)]||e[U(j(t))])}function lN(e,t,n,l){let r,i=n&&n[l],s=E(e);if(s||A(e)){let n=s&&tc(e),l=!1,o=!1;n&&(l=!tp(e),o=tf(e),e=eV(e)),r=Array(e.length);for(let n=0,s=e.length;nt(e,n,void 0,i&&i[n]));else{let n=Object.keys(e);r=Array(n.length);for(let l=0,s=n.length;l{let t=l.fn(...e);return t&&(t.key=l.key),t}:l.fn)}return e}function lM(e,t,n={},l,r){if(t5.ce||t5.parent&<(t5.parent)&&t5.parent.ce){let e=Object.keys(n).length>0;return"default"!==t&&(n.name=t),rZ(),r6(rK,null,[ie("slot",n,l&&l())],e?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),rZ();let s=i&&lI(i(n)),o=n.key||s&&s.key,a=r6(rK,{key:(o&&!R(o)?o:`_${t}`)+(!s&&l?"_fb":"")},s||(l?l():[]),s&&1===e._?64:-2);return!r&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a}function lI(e){return e.some(e=>!r8(e)||e.type!==rq&&(e.type!==rK||!!lI(e.children)))?e:null}function lF(e,t){let n={};for(let l in e)n[t&&/[A-Z]/.test(l)?`on:${l}`:B(l)]=e[l];return n}let lL=e=>e?ib(e)?iR(e):lL(e.parent):null,lj=C(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=>lL(e.parent),$root:e=>lL(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>l8(e),$forceUpdate:e=>e.f||(e.f=()=>{t1(e.update)}),$nextTick:e=>e.n||(e.n=t0.bind(e.proxy)),$watch:e=>nv.bind(e)}),lD=(e,t)=>e!==g&&!e.__isScriptSetup&&k(e,t),lV={get({_:e},t){let n,l;if("__v_skip"===t)return!0;let{ctx:r,setupState:i,data:s,props:o,accessCache:a,type:u,appContext:c}=e;if("$"!==t[0]){let e=a[t];if(void 0!==e)switch(e){case 1:return i[t];case 2:return s[t];case 4:return r[t];case 3:return o[t]}else{if(lD(i,t))return a[t]=1,i[t];if(s!==g&&k(s,t))return a[t]=2,s[t];if(k(o,t))return a[t]=3,o[t];if(r!==g&&k(r,t))return a[t]=4,r[t];l2&&(a[t]=0)}}let f=lj[t];return f?("$attrs"===t&&eL(e.attrs,"get",""),f(e)):(n=u.__cssModules)&&(n=n[t])?n:r!==g&&k(r,t)?(a[t]=4,r[t]):k(l=c.config.globalProperties,t)?l[t]:void 0},set({_:e},t,n){let{data:l,setupState:r,ctx:i}=e;return lD(r,t)?(r[t]=n,!0):l!==g&&k(l,t)?(l[t]=n,!0):!k(e.props,t)&&!("$"===t[0]&&t.slice(1)in e)&&(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:l,appContext:r,props:i,type:s}},o){let a;return!!(n[o]||e!==g&&"$"!==o[0]&&k(e,o)||lD(t,o)||k(i,o)||k(l,o)||k(lj,o)||k(r.config.globalProperties,o)||(a=s.__cssModules)&&a[o])},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:k(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},lU=C({},lV,{get(e,t){if(t!==Symbol.unscopables)return lV.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!G(t)});function lB(){return null}function l$(){return null}function lH(e){}function lW(e){}function lK(){return null}function lz(){}function lq(e,t){return null}function lG(){return lJ().slots}function lX(){return lJ().attrs}function lJ(e){let t=i_();return t.setupContext||(t.setupContext=iA(t))}function lZ(e){return E(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}function lY(e,t){let n=lZ(e);for(let e in t){if(e.startsWith("__skip"))continue;let l=n[e];l?E(l)||T(l)?l=n[e]={type:l,default:t[e]}:l.default=t[e]:null===l&&(l=n[e]={default:t[e]}),l&&t[`__skip_${e}`]&&(l.skipFactory=!0)}return n}function lQ(e,t){return e&&t?E(e)&&E(t)?e.concat(t):C({},lZ(e),lZ(t)):e||t}function l0(e,t){let n={};for(let l in e)t.includes(l)||Object.defineProperty(n,l,{enumerable:!0,get:()=>e[l]});return n}function l1(e){let t=i_(),n=iS,l=e();iy(),n&&a(!1);let r=()=>{im(t),n&&a(!0)},i=()=>{i_()!==t&&t.scope.off(),iy(),n&&a(!1)};return N(l)&&(l=l.catch(e=>{throw r(),Promise.resolve().then(()=>Promise.resolve().then(i)),e})),[l,()=>{r(),Promise.resolve().then(i)}]}let l2=!0;function l6(e,t,n){tK(E(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function l8(e){let t,n=e.type,{mixins:l,extends:r}=n,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(n);return a?t=a:i.length||l||r?(t={},i.length&&i.forEach(e=>l4(t,e,o,!0)),l4(t,n,o)):t=n,O(n)&&s.set(n,t),t}function l4(e,t,n,l=!1){let{mixins:r,extends:i}=t;for(let s in i&&l4(e,i,n,!0),r&&r.forEach(t=>l4(e,t,n,!0)),t)if(l&&"expose"===s);else{let l=l3[s]||n&&n[s];e[s]=l?l(e[s],t[s]):t[s]}return e}let l3={data:l5,props:rt,emits:rt,methods:re,computed:re,beforeCreate:l7,created:l7,beforeMount:l7,mounted:l7,beforeUpdate:l7,updated:l7,beforeDestroy:l7,beforeUnmount:l7,destroyed:l7,unmounted:l7,activated:l7,deactivated:l7,errorCaptured:l7,serverPrefetch:l7,components:re,directives:re,watch:function(e,t){if(!e)return t;if(!t)return e;let n=C(Object.create(null),e);for(let l in t)n[l]=l7(e[l],t[l]);return n},provide:l5,inject:function(e,t){return re(l9(e),l9(t))}};function l5(e,t){return t?e?function(){return C(T(e)?e.call(this,this):e,T(t)?t.call(this,this):t)}:t:e}function l9(e){if(E(e)){let t={};for(let n=0;n{let a,u,c=g;return nd(()=>{let t=e[r];$(a,t)&&(a=t,o())}),{get:()=>(s(),n.get?n.get(a):a),set(e){let s=n.set?n.set(e):e;if(!$(s,a)&&!(c!==g&&$(e,c)))return;let f=l.vnode.props,p=!!(f&&(t in f||r in f||i in f)&&(`onUpdate:${t}`in f||`onUpdate:${r}`in f||`onUpdate:${i}`in f));p||(a=e,o()),l.emit(`update:${t}`,s),$(e,c)&&($(e,s)&&!$(s,u)||p&&c!==g&&!$(s,a))&&o(),c=e,u=s}}});return o[Symbol.iterator]=()=>{let e=0;return{next:()=>e<2?{value:e++?s||g:o,done:!1}:{done:!0}}},o}let rs=(e,t)=>"modelValue"===t||"model-value"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${j(t)}Modifiers`]||e[`${V(t)}Modifiers`];function ro(e,t,...n){let l;if(e.isUnmounted)return;let r=e.vnode.props||g,i=n,s=t.startsWith("update:"),o=s&&rs(r,t.slice(7));o&&(o.trim&&(i=n.map(e=>A(e)?e.trim():e)),o.number&&(i=n.map(K)));let a=r[l=B(t)]||r[l=B(j(t))];!a&&s&&(a=r[l=B(V(t))]),a&&tK(a,e,6,i);let u=r[l+"Once"];if(u){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,tK(u,e,6,i)}}let ra=new WeakMap;function ru(e,t){return!!e&&!!b(t)&&(k(e,(t="Once"===(t=t.slice(2))?t:t.replace(/Once$/,""))[0].toLowerCase()+t.slice(1))||k(e,V(t))||k(e,t))}function rc(e){let t,n,{type:l,vnode:r,proxy:i,withProxy:s,propsOptions:[o],slots:a,attrs:u,emit:c,render:f,renderCache:p,props:d,data:h,setupState:g,ctx:_,inheritAttrs:m}=e,y=t7(e);try{if(4&r.shapeFlag){let e=s||i;t=io(f.call(e,e,p,d,g,h,_)),n=u}else t=io(l.length>1?l(d,{attrs:u,slots:a,emit:c}):l(d,null)),n=l.props?u:rf(u)}catch(n){rX.length=0,tz(n,e,1),t=ie(rq)}let b=t;if(n&&!1!==m){let e=Object.keys(n),{shapeFlag:t}=b;e.length&&7&t&&(o&&e.some(S)&&(n=rp(n,o)),b=il(b,n,!1,!0))}return r.dirs&&((b=il(b,null,!1,!0)).dirs=b.dirs?b.dirs.concat(r.dirs):r.dirs),r.transition&&nU(b,r.transition),t=b,t7(y),t}let rf=e=>{let t;for(let n in e)("class"===n||"style"===n||b(n))&&((t||(t={}))[n]=e[n]);return t},rp=(e,t)=>{let n={};for(let l in e)S(l)&&l.slice(9)in t||(n[l]=e[l]);return n};function rd(e,t,n){let l=Object.keys(t);if(l.length!==Object.keys(e).length)return!0;for(let r=0;rObject.getPrototypeOf(e)===rv;function rm(e,t,n,l){let r,[i,s]=e.propsOptions,o=!1;if(t)for(let a in t){let u;if(I(a))continue;let c=t[a];i&&k(i,u=j(a))?s&&s.includes(u)?(r||(r={}))[u]=c:n[u]=c:ru(e.emitsOptions,a)||a in l&&c===l[a]||(l[a]=c,o=!0)}if(s){let t=th(n),l=r||g;for(let r=0;r"_"===e||"_ctx"===e||"$stable"===e,rx=e=>E(e)?e.map(io):[io(e)],rw=(e,t,n)=>{if(t._n)return t;let l=nl((...e)=>rx(t(...e)),n);return l._c=!1,l},rk=(e,t,n)=>{let l=e._ctx;for(let n in e){if(rC(n))continue;let r=e[n];if(T(r))t[n]=rw(n,r,l);else if(null!=r){let e=rx(r);t[n]=()=>e}}},rE=(e,t)=>{let n=rx(t);e.slots.default=()=>n},rT=(e,t,n)=>{for(let l in t)(n||!rC(l))&&(e[l]=t[l])},rA=rH;function rR(e){return rN(e)}function rO(e){return rN(e,n0)}function rN(e,t){var n;let l,r;q().__VUE__=!0;let{insert:i,remove:s,patchProp:o,createElement:a,createText:u,createComment:c,setText:f,setElementText:p,parentNode:d,nextSibling:h,setScopeId:y=m,insertStaticContent:b}=e,S=(e,t,n,l=null,r=null,i=null,s,o=null,a=!!t.dynamicChildren)=>{if(e===t)return;e&&!r4(e,t)&&(l=en(e),Z(e,r,i,!0),e=null),-2===t.patchFlag&&(a=!1,t.dynamicChildren=null);let{type:u,ref:c,shapeFlag:f}=t;switch(u){case rz:x(e,t,n,l);break;case rq:w(e,t,n,l);break;case rG:null==e&&E(t,n,l,s);break;case rK:D(e,t,n,l,r,i,s,o,a);break;default:1&f?A(e,t,n,l,r,i,s,o,a):6&f?U(e,t,n,l,r,i,s,o,a):64&f?u.process(e,t,n,l,r,i,s,o,a,ei):128&f&&u.process(e,t,n,l,r,i,s,o,a,ei)}null!=c&&r?nG(c,e&&e.ref,i,t||e,!t):null==c&&e&&null!=e.ref&&nG(e.ref,null,i,e,!0)},x=(e,t,n,l)=>{if(null==e)i(t.el=u(t.children),n,l);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},w=(e,t,n,l)=>{null==e?i(t.el=c(t.children||""),n,l):t.el=e.el},E=(e,t,n,l)=>{[e.el,e.anchor]=b(e.children,t,n,l,e.el,e.anchor)},A=(e,t,n,l,r,i,s,o,a)=>{if("svg"===t.type?s="svg":"math"===t.type&&(s="mathml"),null==e)R(t,n,l,r,i,s,o,a);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),M(e,t,r,i,s,o,a)}finally{n&&n._endPatch()}}},R=(e,t,n,l,r,s,u,c)=>{let f,d,{props:h,shapeFlag:g,transition:_,dirs:m}=e;if(f=e.el=a(e.type,s,h&&h.is,h),8&g?p(f,e.children):16&g&&P(e.children,f,null,l,r,rP(e,s),u,c),m&&ni(e,null,l,"created"),N(f,e,e.scopeId,u,l),h){for(let e in h)"value"===e||I(e)||o(f,e,null,h[e],s,l);"value"in h&&o(f,"value",null,h.value,s),(d=h.onVnodeBeforeMount)&&ip(d,l,e)}m&&ni(e,null,l,"beforeMount");let y=rI(r,_);y&&_.beforeEnter(f),i(f,t,n),((d=h&&h.onVnodeMounted)||y||m)&&rA(()=>{d&&ip(d,l,e),y&&_.enter(f),m&&ni(e,null,l,"mounted")},r)},N=(e,t,n,l,r)=>{if(n&&y(e,n),l)for(let t=0;t{for(let u=a;u{let a,u=t.el=e.el,{patchFlag:c,dynamicChildren:f,dirs:d}=t;c|=16&e.patchFlag;let h=e.props||g,_=t.props||g;if(n&&rM(n,!1),(a=_.onVnodeBeforeUpdate)&&ip(a,n,t,e),d&&ni(t,e,n,"beforeUpdate"),n&&rM(n,!0),f&&(!e.dynamicChildren||e.dynamicChildren.length!==f.length)&&(c=0,s=!1,f=null),(h.innerHTML&&null==_.innerHTML||h.textContent&&null==_.textContent)&&p(u,""),f?F(e.dynamicChildren,f,u,n,l,rP(t,r),i):s||z(e,t,u,null,n,l,rP(t,r),i,!1),c>0){if(16&c)L(u,h,_,n,r);else if(2&c&&h.class!==_.class&&o(u,"class",null,_.class,r),4&c&&o(u,"style",h.style,_.style,r),8&c){let e=t.dynamicProps;for(let t=0;t{a&&ip(a,n,t,e),d&&ni(t,e,n,"updated")},l)},F=(e,t,n,l,r,i,s)=>{for(let o=0;o{if(t!==n){if(t!==g)for(let i in t)I(i)||i in n||o(e,i,t[i],null,r,l);for(let i in n){if(I(i))continue;let s=n[i],a=t[i];s!==a&&"value"!==i&&o(e,i,a,s,r,l)}"value"in n&&o(e,"value",t.value,n.value,r)}},D=(e,t,n,l,r,s,o,a,c)=>{let f=t.el=e?e.el:u(""),p=t.anchor=e?e.anchor:u(""),{patchFlag:d,dynamicChildren:h,slotScopeIds:g}=t;g&&(a=a?a.concat(g):g),null==e?(i(f,n,l),i(p,n,l),P(t.children||[],n,p,r,s,o,a,c)):d>0&&64&d&&h&&e.dynamicChildren&&e.dynamicChildren.length===h.length?(F(e.dynamicChildren,h,n,r,s,o,a),(null!=t.key||r&&t===r.subTree)&&rF(e,t,!0)):z(e,t,n,p,r,s,o,a,c)},U=(e,t,n,l,r,i,s,o,a)=>{t.slotScopeIds=o,null==e?512&t.shapeFlag?r.ctx.activate(t,n,l,s,a):B(t,n,l,r,i,s,a):$(e,t,a)},B=(e,t,n,l,r,i,s)=>{let o=e.component=ig(e,l,r);if(lr(e)&&(o.ctx.renderer=ei),iC(o,!1,s),o.asyncDep){if(r&&r.registerDep(o,W,s),!e.el){let l=o.subTree=ie(rq);w(null,l,t,n),e.placeholder=l.el}}else W(o,e,t,n,r,i,s)},$=(e,t,n)=>{let l=t.component=e.component;if(function(e,t,n){let{props:l,children:r,component:i}=e,{props:s,children:o,patchFlag:a}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!n||!(a>=0))return(!!r||!!o)&&(!o||!o.$stable)||l!==s&&(l?!s||rd(l,s,u):!!s);if(1024&a)return!0;if(16&a)return l?rd(l,s,u):!!s;if(8&a){let e=t.dynamicProps;for(let t=0;t{e.scope.on();let a=e.effect=new ed(()=>{if(e.isMounted){let t,{next:n,bu:l,u:r,parent:a,vnode:c}=e;{let t=function e(t){let n=t.subTree.component;if(n)if(n.asyncDep&&!n.asyncResolved)return n;else return e(n)}(e);if(t){n&&(n.el=c.el,K(e,n,o)),t.asyncDep.then(()=>{rA(()=>{e.isUnmounted||u()},i)});return}}let f=n;rM(e,!1),n?(n.el=c.el,K(e,n,o)):n=c,l&&H(l),(t=n.props&&n.props.onVnodeBeforeUpdate)&&ip(t,a,n,c),rM(e,!0);let p=rc(e),h=e.subTree;e.subTree=p,S(h,p,d(h.el),en(h),e,i,s),n.el=p.el,null===f&&rg(e,p.el),r&&rA(r,i),(t=n.props&&n.props.onVnodeUpdated)&&rA(()=>ip(t,a,n,c),i)}else{let o,{el:a,props:u}=t,{bm:c,m:f,parent:p,root:d,type:h}=e,g=lt(t);if(rM(e,!1),c&&H(c),!g&&(o=u&&u.onVnodeBeforeMount)&&ip(o,p,t),rM(e,!0),a&&r){let t=()=>{e.subTree=rc(e),r(a,e.subTree,e,i,null)};g&&h.__asyncHydrate?h.__asyncHydrate(a,e,t):t()}else{d.ce&&d.ce._hasShadowRoot()&&d.ce._injectChildStyle(h,e.parent?e.parent.type:void 0);let r=e.subTree=rc(e);S(null,r,n,l,e,i,s),t.el=r.el}if(f&&rA(f,i),!g&&(o=u&&u.onVnodeMounted)){let e=t;rA(()=>ip(o,p,e),i)}(256&t.shapeFlag||p&<(p.vnode)&&256&p.vnode.shapeFlag)&&e.a&&rA(e.a,i),e.isMounted=!0,t=n=l=null}});e.scope.off();let u=e.update=a.run.bind(a),c=e.job=a.runIfDirty.bind(a);c.i=e,c.id=e.uid,a.scheduler=()=>t1(c),rM(e,!0),u()},K=(e,t,n)=>{t.component=e;let l=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,l){let{props:r,attrs:i,vnode:{patchFlag:s}}=e,o=th(r),[a]=e.propsOptions,u=!1;if((l||s>0)&&!(16&s)){if(8&s){let n=e.vnode.dynamicProps;for(let l=0;l{let{vnode:l,slots:r}=e,i=!0,s=g;if(32&l.shapeFlag){let e=t._;e?n&&1===e?i=!1:rT(r,t,n):(i=!t.$stable,rk(t,r)),s=t}else t&&(rE(e,t),s={default:1});if(i)for(let e in r)rC(e)||null!=s[e]||delete r[e]})(e,t.children,n),eE(),t8(e),eT()},z=(e,t,n,l,r,i,s,o,a=!1)=>{let u=e&&e.children,c=e?e.shapeFlag:0,f=t.children,{patchFlag:d,shapeFlag:h}=t;if(d>0){if(128&d)return void X(u,f,n,l,r,i,s,o,a);else if(256&d)return void G(u,f,n,l,r,i,s,o,a)}8&h?(16&c&&et(u,r,i),f!==u&&p(n,f)):16&c?16&h?X(u,f,n,l,r,i,s,o,a):et(u,r,i,!0):(8&c&&p(n,""),16&h&&P(f,n,l,r,i,s,o,a))},G=(e,t,n,l,r,i,s,o,a)=>{let u;e=e||_,t=t||_;let c=e.length,f=t.length,p=Math.min(c,f);for(u=0;uf?et(e,r,i,!0,!1,p):P(t,n,l,r,i,s,o,a,p)},X=(e,t,n,l,r,i,s,o,a)=>{let u=0,c=t.length,f=e.length-1,p=c-1;for(;u<=f&&u<=p;){let l=e[u],c=t[u]=a?ia(t[u]):io(t[u]);if(r4(l,c))S(l,c,n,null,r,i,s,o,a);else break;u++}for(;u<=f&&u<=p;){let l=e[f],u=t[p]=a?ia(t[p]):io(t[p]);if(r4(l,u))S(l,u,n,null,r,i,s,o,a);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,f=ep)for(;u<=f;)Z(e[u],r,i,!0),u++;else{let d,h=u,g=u,m=new Map;for(u=g;u<=p;u++){let e=t[u]=a?ia(t[u]):io(t[u]);null!=e.key&&m.set(e.key,u)}let y=0,b=p-g+1,C=!1,x=0,w=Array(b);for(u=0;u=b){Z(c,r,i,!0);continue}if(null!=c.key)l=m.get(c.key);else for(d=g;d<=p;d++)if(0===w[d-g]&&r4(c,t[d])){l=d;break}void 0===l?Z(c,r,i,!0):(w[l-g]=u+1,l>=x?x=l:C=!0,S(c,t[l],n,null,r,i,s,o,a),y++)}let k=C?function(e){let t,n,l,r,i,s=e.slice(),o=[0],a=e.length;for(t=0;t>1]]0&&(s[t]=o[l-1]),o[l]=t)}}for(l=o.length,r=o[l-1];l-- >0;)o[l]=r,r=s[r];return o}(w):_;for(d=k.length-1,u=b-1;u>=0;u--){let e=g+u,f=t[e],p=t[e+1],h=e+1{let{el:o,type:a,transition:u,children:c,shapeFlag:f}=e;if(6&f)return void J(e.component.subTree,t,n,l);if(128&f)return void e.suspense.move(t,n,l);if(64&f)return void a.move(e,t,n,ei);if(a===rK){i(o,t,n);for(let e=0;e{let r;for(;e&&e!==t;)r=h(e),i(e,n,l),e=r;i(t,n,l)})(e,t,n);if(2!==l&&1&f&&u)if(0===l)u.persisted&&!o[nA]?i(o,t,n):(u.beforeEnter(o),i(o,t,n),rA(()=>u.enter(o),r));else{let{leave:l,delayLeave:r,afterLeave:a}=u,c=()=>{e.ctx.isUnmounted?s(o):i(o,t,n)},f=()=>{let e=o._isLeaving||!!o[nA];o._isLeaving&&o[nA](!0),u.persisted&&!e?c():l(o,()=>{c(),a&&a()})};r?r(o,c,f):f()}else i(o,t,n)},Z=(e,t,n,l=!1,r=!1)=>{let i,{type:s,props:o,ref:a,children:u,dynamicChildren:c,shapeFlag:f,patchFlag:p,dirs:d,cacheIndex:h,memo:g}=e;if(-2===p&&(r=!1),null!=a&&(eE(),nG(a,null,n,e,!0),eT()),null!=h&&(t.renderCache[h]=void 0),256&f)return void t.ctx.deactivate(e);let _=1&f&&d,m=!lt(e);if(m&&(i=o&&o.onVnodeBeforeUnmount)&&ip(i,t,e),6&f)ee(e.component,n,l);else{if(128&f)return void e.suspense.unmount(n,l);_&&ni(e,null,t,"beforeUnmount"),64&f?e.type.remove(e,t,n,ei,l):c&&!c.hasOnce&&(s!==rK||p>0&&64&p)?et(c,t,n,!1,!0):(s===rK&&384&p||!r&&16&f)&&et(u,t,n),l&&Y(e)}let y=null!=g&&null==h;(m&&(i=o&&o.onVnodeUnmounted)||_||y)&&rA(()=>{i&&ip(i,t,e),_&&ni(e,null,t,"unmounted"),y&&(e.el=null)},n)},Y=e=>{let{type:t,el:n,anchor:l,transition:r}=e;if(t===rK)return void Q(n,l);if(t===rG)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)})(e);let i=()=>{s(n),r&&!r.persisted&&r.afterLeave&&r.afterLeave()};if(1&e.shapeFlag&&r&&!r.persisted){let{leave:t,delayLeave:l}=r,s=()=>t(n,i);l?l(e.el,i,s):s()}else i()},Q=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},ee=(e,t,n)=>{let{bum:l,scope:r,job:i,subTree:s,um:o,m:a,a:u}=e;rL(a),rL(u),l&&H(l),r.stop(),i&&(i.flags|=8,Z(s,e,t,n)),o&&rA(o,t),rA(()=>{e.isUnmounted=!0},t)},et=(e,t,n,l=!1,r=!1,i=0)=>{for(let s=i;s{if(6&e.shapeFlag)return en(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[ny];return n?h(n):t},el=!1,er=(e,t,n)=>{let l;null==e?t._vnode&&(Z(t._vnode,null,null,!0),l=t._vnode.component):S(t._vnode||null,e,t,null,null,null,n),t._vnode=e,el||(el=!0,t8(l),t4(),el=!1)},ei={p:S,um:Z,m:J,r:Y,mt:B,mc:P,pc:z,pbc:F,n:en,o:e};return t&&([l,r]=t(ei)),{render:er,hydrate:l,createApp:(n=l,function(e,t=null){T(e)||(e=C({},e)),null==t||O(t)||(t=null);let l=rn(),r=new WeakSet,i=[],s=!1,o=l.app={_uid:rl++,_component:e,_props:t,_container:null,_context:l,_instance:null,version:iL,get config(){return l.config},set config(v){},use:(e,...t)=>(r.has(e)||(e&&T(e.install)?(r.add(e),e.install(o,...t)):T(e)&&(r.add(e),e(o,...t))),o),mixin:e=>(l.mixins.includes(e)||l.mixins.push(e),o),component:(e,t)=>t?(l.components[e]=t,o):l.components[e],directive:(e,t)=>t?(l.directives[e]=t,o):l.directives[e],mount(r,i,a){if(!s){let u=o._ceVNode||ie(e,t);return u.appContext=l,!0===a?a="svg":!1===a&&(a=void 0),i&&n?n(u,r):er(u,r,a),s=!0,o._container=r,r.__vue_app__=o,iR(u.component)}},onUnmount(e){i.push(e)},unmount(){s&&(tK(i,o._instance,16),er(null,o._container),delete o._container.__vue_app__)},provide:(e,t)=>(l.provides[e]=t,o),runWithContext(e){let t=rr;rr=o;try{return e()}finally{rr=t}}};return o})}}function rP({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function rM({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function rI(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function rF(e,t,n=!1){let l=e.children,r=t.children;if(E(l)&&E(r))for(let e=0;ee.__isSuspense,rD=0,rV={name:"Suspense",__isSuspense:!0,process(e,t,n,l,r,i,s,o,a,u){if(null==e)!function(e,t,n,l,r,i,s,o,a){let{p:u,o:{createElement:c}}=a,f=c("div"),p=e.suspense=rB(e,r,l,t,f,n,i,s,o,a);u(null,p.pendingBranch=e.ssContent,f,null,l,p,i,s),p.deps>0?(rU(e,"onPending"),rU(e,"onFallback"),u(null,e.ssFallback,t,n,l,null,i,s),rW(p,e.ssFallback)):p.resolve(!1,!0)}(t,n,l,r,i,s,o,a,u);else{if(i&&i.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}!function(e,t,n,l,r,i,s,o,{p:a,um:u,o:{createElement:c}}){let f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;let p=t.ssContent,d=t.ssFallback,{activeBranch:h,pendingBranch:g,isInFallback:_,isHydrating:m}=f;if(g)f.pendingBranch=p,r4(g,p)?(a(g,p,f.hiddenContainer,null,r,f,i,s,o),f.deps<=0?f.resolve():_&&!m&&(a(h,d,n,l,r,null,i,s,o),rW(f,d))):(f.pendingId=rD++,m?(f.isHydrating=!1,f.activeBranch=g):u(g,r,f),f.deps=0,f.effects.length=0,f.hiddenContainer=c("div"),_?(a(null,p,f.hiddenContainer,null,r,f,i,s,o),f.deps<=0?f.resolve():(a(h,d,n,l,r,null,i,s,o),rW(f,d))):h&&r4(h,p)?(a(h,p,n,l,r,f,i,s,o),f.resolve(!0)):(a(null,p,f.hiddenContainer,null,r,f,i,s,o),f.deps<=0&&f.resolve()));else if(h&&r4(h,p))a(h,p,n,l,r,f,i,s,o),rW(f,p);else if(rU(t,"onPending"),f.pendingBranch=p,512&p.shapeFlag?f.pendingId=p.component.suspenseId:f.pendingId=rD++,a(null,p,f.hiddenContainer,null,r,f,i,s,o),f.deps<=0)f.resolve();else{let{timeout:e,pendingId:t}=f;e>0?setTimeout(()=>{f.pendingId===t&&f.fallback(d)},e):0===e&&f.fallback(d)}}(e,t,n,l,r,s,o,a,u)}},hydrate:function(e,t,n,l,r,i,s,o,a){let u=t.suspense=rB(t,l,n,e.parentNode,document.createElement("div"),null,r,i,s,o,!0),c=a(e,u.pendingBranch=t.ssContent,n,u,i,s);return 0===u.deps&&u.resolve(!1,!0),c},normalize:function(e){let{shapeFlag:t,children:n}=e,l=32&t;e.ssContent=r$(l?n.default:n),e.ssFallback=l?r$(n.fallback):ie(rq)}};function rU(e,t){let n=e.props&&e.props[t];T(n)&&n()}function rB(e,t,n,l,r,i,s,o,a,u,c=!1){var f;let p,d,{p:h,m:g,um:_,n:m,o:{parentNode:y,remove:b}}=u,S=null!=(p=(f=e).props&&f.props.suspensible)&&!1!==p;S&&t&&t.pendingBranch&&(d=t.pendingId,t.deps++);let C=e.props?z(e.props.timeout):void 0,x=i,w={vnode:e,parent:t,parentComponent:n,namespace:s,container:l,hiddenContainer:r,deps:0,pendingId:rD++,timeout:"number"==typeof C?C:-1,activeBranch:null,isFallbackMountPending:!1,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){let{vnode:l,activeBranch:r,pendingBranch:s,pendingId:o,effects:a,parentComponent:u,container:c,isInFallback:f}=w,p=!1;if(w.isHydrating)w.isHydrating=!1;else if(!e){p=r&&s.transition&&"out-in"===s.transition.mode;let e=!1;p&&(r.transition.afterLeave=()=>{o===w.pendingId&&(g(s,c,i!==x||e?i:m(r),0),t6(a),f&&l.ssFallback&&(l.ssFallback.el=null))}),r&&!w.isFallbackMountPending&&(y(r.el)===c&&(i=m(r),e=!0),_(r,u,w,!0),!p&&f&&l.ssFallback&&rA(()=>l.ssFallback.el=null,w)),p||g(s,c,i,0)}w.isFallbackMountPending=!1,rW(w,s),w.pendingBranch=null,w.isInFallback=!1;let h=w.parent,b=!1;for(;h;){if(h.pendingBranch){h.effects.push(...a),b=!0;break}h=h.parent}b||p||t6(a),w.effects=[],S&&t&&t.pendingBranch&&d===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),rU(l,"onResolve")},fallback(e){if(!w.pendingBranch)return;let{vnode:t,activeBranch:n,parentComponent:l,container:r,namespace:i}=w;rU(t,"onFallback");let s=m(n),u=()=>{w.isFallbackMountPending=!1,w.isInFallback&&(h(null,e,r,s,l,null,i,o,a),rW(w,e))},c=e.transition&&"out-in"===e.transition.mode;c&&(w.isFallbackMountPending=!0,n.transition.afterLeave=u),w.isInFallback=!0,_(n,l,null,!0),c||u()},move(e,t,n){w.activeBranch&&g(w.activeBranch,e,t,n),w.container=e},next:()=>w.activeBranch&&m(w.activeBranch),registerDep(e,t,n){let l=!!w.pendingBranch;l&&w.deps++;let r=e.vnode.el;e.asyncDep.catch(t=>{tz(t,e,0)}).then(i=>{if(e.isUnmounted||w.isUnmounted||w.pendingId!==e.suspenseId)return;iy(),e.asyncResolved=!0;let{vnode:o}=e;ix(e,i,!1),r&&(o.el=r);let a=!r&&e.subTree.el;t(e,o,y(r||e.subTree.el),r?null:m(e.subTree),w,s,n),a&&(o.placeholder=null,b(a)),rg(e,o.el),l&&0==--w.deps&&w.resolve()})},unmount(e,t){w.isUnmounted=!0,w.activeBranch&&_(w.activeBranch,n,e,t),w.pendingBranch&&_(w.pendingBranch,n,e,t)}};return w}function r$(e){let t;if(T(e)){let n=rQ&&e._c;n&&(e._d=!1,rZ()),e=e(),n&&(e._d=!0,t=rJ,rY())}return E(e)&&(e=function(e){let t;for(let n=0;nt!==e)),e}function rH(e,t){t&&t.pendingBranch?E(e)?t.effects.push(...e):t.effects.push(e):t6(e)}function rW(e,t){e.activeBranch=t;let{vnode:n,parentComponent:l}=e,r=t.el;for(;!r&&t.component;)r=(t=t.component.subTree).el;n.el=r,l&&l.subTree===n&&(l.vnode.el=r,rg(l,r))}let rK=Symbol.for("v-fgt"),rz=Symbol.for("v-txt"),rq=Symbol.for("v-cmt"),rG=Symbol.for("v-stc"),rX=[],rJ=null;function rZ(e=!1){rX.push(rJ=e?null:[])}function rY(){rX.pop(),rJ=rX[rX.length-1]||null}let rQ=1;function r0(e,t=!1){rQ+=e,e<0&&rJ&&t&&(rJ.hasOnce=!0)}function r1(e){return e.dynamicChildren=rQ>0?rJ||_:null,rY(),rQ>0&&rJ&&rJ.push(e),e}function r2(e,t,n,l,r,i){return r1(r7(e,t,n,l,r,i,!0))}function r6(e,t,n,l,r){return r1(ie(e,t,n,l,r,!0))}function r8(e){return!!e&&!0===e.__v_isVNode}function r4(e,t){return e.type===t.type&&e.key===t.key}function r3(e){}let r5=({key:e})=>null!=e?e:null,r9=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?A(e)||tm(e)||T(e)?{i:t5,r:e,k:t,f:!!n}:e:null);function r7(e,t=null,n=null,l=0,r=null,i=+(e!==rK),s=!1,o=!1){let a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&r5(t),ref:t&&r9(t),scopeId:t9,slotScopeIds:null,children:n,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:i,patchFlag:l,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:t5};return o?(iu(a,n),128&i&&e.normalize(a)):n&&(a.shapeFlag|=A(n)?8:16),rQ>0&&!s&&rJ&&(a.patchFlag>0||6&i)&&32!==a.patchFlag&&rJ.push(a),a}let ie=function(e,t=null,n=null,l=0,r=null,i=!1){var s;if(e&&e!==lE||(e=rq),r8(e)){let l=il(e,t,!0);return n&&iu(l,n),rQ>0&&!i&&rJ&&(6&l.shapeFlag?rJ[rJ.indexOf(e)]=l:rJ.push(l)),l.patchFlag=-2,l}if(T(s=e)&&"__vccOpts"in s&&(e=e.__vccOpts),t){let{class:e,style:n}=t=it(t);e&&!A(e)&&(t.class=Q(e)),O(n)&&(td(n)&&!E(n)&&(n=C({},n)),t.style=X(n))}let o=A(e)?1:rj(e)?128:e.__isTeleport?64:O(e)?4:2*!!T(e);return r7(e,t,n,l,r,o,i,!0)};function it(e){return e?td(e)||r_(e)?C({},e):e:null}function il(e,t,n=!1,l=!1){let{props:r,ref:i,patchFlag:s,children:o,transition:a}=e,u=t?ic(r||{},t):r,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&r5(u),ref:t&&t.ref?n&&i?E(i)?i.concat(r9(t)):[i,r9(t)]:r9(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==rK?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&il(e.ssContent),ssFallback:e.ssFallback&&il(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&l&&nU(c,a.clone(c)),c}function ir(e=" ",t=0){return ie(rz,null,e,t)}function ii(e,t){let n=ie(rG,null,e);return n.staticCount=t,n}function is(e="",t=!1){return t?(rZ(),r6(rq,null,e)):ie(rq,null,e)}function io(e){return null==e||"boolean"==typeof e?ie(rq):E(e)?ie(rK,null,e.slice()):r8(e)?ia(e):ie(rz,null,String(e))}function ia(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:il(e)}function iu(e,t){let n=0,{shapeFlag:l}=e;if(null==t)t=null;else if(E(t))n=16;else if("object"==typeof t)if(65&l){let n=t.default;n&&(n._c&&(n._d=!1),iu(e,n()),n._c&&(n._d=!0));return}else{n=32;let l=t._;l||r_(t)?3===l&&t5&&(1===t5.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=t5}else if(T(t)){if(65&l)return void iu(e,{default:t});t={default:t,_ctx:t5},n=32}else t=String(t),64&l?(n=16,t=[ir(t)]):n=8;e.children=t,e.shapeFlag|=n}function ic(...e){let t={};for(let n=0;n{u=!0;let[l,r]=e(t,n,!0);C(o,l),r&&a.push(...r)};!l&&n.mixins.length&&n.mixins.forEach(r),t.extends&&r(t.extends),t.mixins&&t.mixins.forEach(r)}if(!s&&!u)return O(t)&&r.set(t,_),_;if(E(s))for(let e=0;e{let l=e(t,n,!0);l&&(a=!0,C(o,l))};!l&&n.mixins.length&&n.mixins.forEach(r),t.extends&&r(t.extends),t.mixins&&t.mixins.forEach(r)}return s||a?(E(s)?s.forEach(e=>o[e]=null):C(o,s),O(t)&&r.set(t,o),o):(O(t)&&r.set(t,null),null)}(l,r),emit:null,emitted:null,propsDefaults:g,inheritAttrs:l.inheritAttrs,ctx:g,data:g,props:g,attrs:g,slots:g,refs:g,setupState:g,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=ro.bind(null,i),e.ce&&e.ce(i),i}let iv=null,i_=()=>iv||t5;{let e=q(),t=(t,n)=>{let l;return(l=e[t])||(l=e[t]=[]),l.push(n),e=>{l.length>1?l.forEach(t=>t(e)):l[0](e)}};o=t("__VUE_INSTANCE_SETTERS__",e=>iv=e),a=t("__VUE_SSR_SETTERS__",e=>iS=e)}let im=e=>{let t=iv;return o(e),e.scope.on(),()=>{e.scope.off(),o(t)}},iy=()=>{iv&&iv.scope.off(),o(null)};function ib(e){return 4&e.vnode.shapeFlag}let iS=!1;function iC(e,t=!1,n=!1){t&&a(t);let{props:l,children:r}=e.vnode,i=ib(e);!function(e,t,n,l=!1){let r={},i=Object.create(rv);for(let n in e.propsDefaults=Object.create(null),rm(e,t,r,i),e.propsOptions[0])n in r||(r[n]=void 0);n?e.props=l?r:ts(r):e.type.props?e.props=r:e.props=i,e.attrs=i}(e,l,i,t);var s=n||t;let o=e.slots=Object.create(rv);if(32&e.vnode.shapeFlag){let e=r._;e?(rT(o,r,s),s&&W(o,"_",e,!0)):rk(r,o)}else r&&rE(e,r);let u=i?function(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,lV);let{setup:l}=n;if(l){eE();let n=e.setupContext=l.length>1?iA(e):null,r=im(e),i=tW(l,e,0,[e.props,n]),s=N(i);if(eT(),r(),(s||e.sp)&&!lt(e)&&nW(e),s){if(i.then(iy,iy),t)return i.then(n=>{ix(e,n,t)}).catch(t=>{tz(t,e,0)});e.asyncDep=i}else ix(e,i,t)}else iE(e,t)}(e,t):void 0;return t&&a(!1),u}function ix(e,t,n){T(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:O(t)&&(e.setupState=tT(t)),iE(e,n)}function iw(e){u=e,c=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,lU))}}let ik=()=>!u;function iE(e,t,n){let l=e.type;if(!e.render){if(!t&&u&&!l.render){let t=l.template||l8(e).template;if(t){let{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:i,compilerOptions:s}=l,o=C(C({isCustomElement:n,delimiters:i},r),s);l.render=u(t,o)}}e.render=l.render||m,c&&c(e)}{let t=im(e);eE();try{!function(e){let t=l8(e),n=e.proxy,l=e.ctx;l2=!1,t.beforeCreate&&l6(t.beforeCreate,e,"bc");let{data:r,computed:i,methods:s,watch:o,provide:a,inject:u,created:c,beforeMount:f,mounted:p,beforeUpdate:d,updated:h,activated:g,deactivated:_,beforeUnmount:y,unmounted:b,render:S,renderTracked:C,renderTriggered:x,errorCaptured:w,serverPrefetch:k,expose:R,inheritAttrs:N,components:P,directives:M}=t;if(u&&function(e,t){for(let n in E(e)&&(e=l9(e)),e){let l,r=e[n];tm(l=O(r)?"default"in r?no(r.from||n,r.default,!0):no(r.from||n):no(r))?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e}):t[n]=l}}(u,l),s)for(let e in s){let t=s[e];T(t)&&(l[e]=t.bind(n))}if(r){let t=r.call(n,n);O(t)&&(e.data=ti(t))}if(l2=!0,i)for(let e in i){let t=i[e],r=T(t)?t.bind(n,n):T(t.get)?t.get.bind(n,n):m,s=iN({get:r,set:!T(t)&&T(t.set)?t.set.bind(n):m});Object.defineProperty(l,e,{enumerable:!0,configurable:!0,get:()=>s.value,set:e=>s.value=e})}if(o)for(let e in o)!function e(t,n,l,r){let i=r.includes(".")?n_(l,r):()=>l[r];if(A(t)){let e=n[t];T(e)&&nh(i,e)}else if(T(t))nh(i,t.bind(l));else if(O(t))if(E(t))t.forEach(t=>e(t,n,l,r));else{let e=T(t.handler)?t.handler.bind(l):n[t.handler];T(e)&&nh(i,e,t)}}(o[e],l,n,e);if(a){let e=T(a)?a.call(n):a;Reflect.ownKeys(e).forEach(t=>{ns(t,e[t])})}function I(e,t){E(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(c&&l6(c,e,"c"),I(lh,f),I(lg,p),I(lv,d),I(l_,h),I(lo,g),I(la,_),I(lx,w),I(lC,C),I(lS,x),I(lm,y),I(ly,b),I(lb,k),E(R))if(R.length){let t=e.exposed||(e.exposed={});R.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});S&&e.render===m&&(e.render=S),null!=N&&(e.inheritAttrs=N),P&&(e.components=P),M&&(e.directives=M),k&&nW(e)}(e)}finally{eT(),t()}}}let iT={get:(e,t)=>(eL(e,"get",""),e[t])};function iA(e){return{attrs:new Proxy(e.attrs,iT),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function iR(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(tT(tg(e.exposed)),{get:(t,n)=>n in t?t[n]:n in lj?lj[n](e):void 0,has:(e,t)=>t in e||t in lj})):e.proxy}function iO(e,t=!0){return T(e)?e.displayName||e.name:e.name||t&&e.__name}let iN=(e,t)=>(function(e,t=!1){let n,l;return T(e)?n=e:(n=e.get,l=e.set),new tI(n,l,t)})(e,iS);function iP(e,t,n){try{r0(-1);let l=arguments.length;if(2!==l)return l>3?n=Array.prototype.slice.call(arguments,2):3===l&&r8(n)&&(n=[n]),ie(e,t,n);if(!O(t)||E(t))return ie(e,null,t);if(r8(t))return ie(e,null,[t]);return ie(e,t)}finally{r0(1)}}function iM(){}function iI(e,t,n,l){let r=n[l];if(r&&iF(r,e))return r;let i=t();return i.memo=e.slice(),i.cacheIndex=l,n[l]=i}function iF(e,t){let n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e0&&rJ&&rJ.push(e),!0}let iL="3.5.39",ij=m,iD=null,iV,iU=m,iB={createComponentInstance:ig,setupComponent:iC,renderComponentRoot:rc,setCurrentRenderingInstance:t7,isVNode:r8,normalizeVNode:io,getComponentPublicInstance:iR,ensureValidVNode:lI,pushWarningContext:function(e){},popWarningContext:function(){}},i$=null,iH=null,iW=null,iK="u">typeof window&&window.trustedTypes;if(iK)try{d=iK.createPolicy("vue",{createHTML:e=>e})}catch(e){}let iz=d?e=>d.createHTML(e):e=>e,iq="u">typeof document?document:null,iG=iq&&iq.createElement("template"),iX={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,l)=>{let r="svg"===t?iq.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?iq.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?iq.createElement(e,{is:n}):iq.createElement(e);return"select"===e&&l&&null!=l.multiple&&r.setAttribute("multiple",l.multiple),r},createText:e=>iq.createTextNode(e),createComment:e=>iq.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>iq.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,l,r,i){let s=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),r!==i&&(r=r.nextSibling););else{iG.innerHTML=iz("svg"===l?``:"mathml"===l?``:e);let r=iG.content;if("svg"===l||"mathml"===l){let e=r.firstChild;for(;e.firstChild;)r.appendChild(e.firstChild);r.removeChild(e)}t.insertBefore(r,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},iJ="transition",iZ="animation",iY=Symbol("_vtc"),iQ={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},i0=C({},nP,iQ),i1=((e=(e,{slots:t})=>iP(nF,i8(e),t)).displayName="Transition",e.props=i0,e),i2=(e,t=[])=>{E(e)?e.forEach(e=>e(...t)):e&&e(...t)},i6=e=>!!e&&(E(e)?e.some(e=>e.length>1):e.length>1);function i8(e){let t={};for(let n in e)n in iQ||(t[n]=e[n]);if(!1===e.css)return t;let{name:n="v",type:l,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:o=`${n}-enter-to`,appearFromClass:a=i,appearActiveClass:u=s,appearToClass:c=o,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:d=`${n}-leave-to`}=e,h=function(e){if(null==e)return null;{if(O(e))return[function(e){return z(e)}(e.enter),function(e){return z(e)}(e.leave)];let t=function(e){return z(e)}(e);return[t,t]}}(r),g=h&&h[0],_=h&&h[1],{onBeforeEnter:m,onEnter:y,onEnterCancelled:b,onLeave:S,onLeaveCancelled:x,onBeforeAppear:w=m,onAppear:k=y,onAppearCancelled:E=b}=t,T=(e,t,n,l)=>{e._enterCancelled=l,i3(e,t?c:o),i3(e,t?u:s),n&&n()},A=(e,t)=>{e._isLeaving=!1,i3(e,f),i3(e,d),i3(e,p),t&&t()},R=e=>(t,n)=>{let r=e?k:y,s=()=>T(t,e,n);i2(r,[t,s]),i5(()=>{i3(t,e?a:i),i4(t,e?c:o),i6(r)||i7(t,l,g,s)})};return C(t,{onBeforeEnter(e){i2(m,[e]),i4(e,i),i4(e,s)},onBeforeAppear(e){i2(w,[e]),i4(e,a),i4(e,u)},onEnter:R(!1),onAppear:R(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>A(e,t);i4(e,f),e._enterCancelled?(i4(e,p),sl(e)):(sl(e),i4(e,p)),i5(()=>{e._isLeaving&&(i3(e,f),i4(e,d),i6(S)||i7(e,l,_,n))}),i2(S,[e,n])},onEnterCancelled(e){T(e,!1,void 0,!0),i2(b,[e])},onAppearCancelled(e){T(e,!0,void 0,!0),i2(E,[e])},onLeaveCancelled(e){A(e),i2(x,[e])}})}function i4(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[iY]||(e[iY]=new Set)).add(t)}function i3(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[iY];n&&(n.delete(t),n.size||(e[iY]=void 0))}function i5(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let i9=0;function i7(e,t,n,l){let r=e._endId=++i9,i=()=>{r===e._endId&&l()};if(null!=n)return setTimeout(i,n);let{type:s,timeout:o,propCount:a}=se(e,t);if(!s)return l();let u=s+"end",c=0,f=()=>{e.removeEventListener(u,p),i()},p=t=>{t.target===e&&++c>=a&&f()};setTimeout(()=>{c(n[e]||"").split(", "),r=l(`${iJ}Delay`),i=l(`${iJ}Duration`),s=st(r,i),o=l(`${iZ}Delay`),a=l(`${iZ}Duration`),u=st(o,a),c=null,f=0,p=0;t===iJ?s>0&&(c=iJ,f=s,p=i.length):t===iZ?u>0&&(c=iZ,f=u,p=a.length):p=(c=(f=Math.max(s,u))>0?s>u?iJ:iZ:null)?c===iJ?i.length:a.length:0;let d=c===iJ&&/\b(?:transform|all)(?:,|$)/.test(l(`${iJ}Property`).toString());return{type:c,timeout:f,propCount:p,hasTransform:d}}function st(e,t){for(;e.lengthsn(t)+sn(e[n])))}function sn(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function sl(e){return(e?e.ownerDocument:document).body.offsetHeight}let sr=Symbol("_vod"),si=Symbol("_vsh"),ss={name:"show",beforeMount(e,{value:t},{transition:n}){e[sr]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):so(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:l}){!t!=!n&&(l?t?(l.beforeEnter(e),so(e,!0),l.enter(e)):l.leave(e,()=>{so(e,!1)}):so(e,t))},beforeUnmount(e,{value:t}){so(e,t)}};function so(e,t){e.style.display=t?e[sr]:"none",e[si]=!t}let sa=Symbol("");function su(e){let t=i_();if(!t)return;let n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(e=>sc(e,n))},l=()=>{let l=e(t.proxy);t.ce?sc(t.ce,l):function e(t,n){if(128&t.shapeFlag){let l=t.suspense;t=l.activeBranch,l.pendingBranch&&!l.isHydrating&&l.effects.push(()=>{e(l.activeBranch,n)})}for(;t.component;)t=t.component.subTree;if(1&t.shapeFlag&&t.el)sc(t.el,n);else if(t.type===rK)t.children.forEach(t=>e(t,n));else if(t.type===rG){let{el:e,anchor:l}=t;for(;e&&(sc(e,n),e!==l);)e=e.nextSibling}}(t.subTree,l),n(l)};lv(()=>{t6(l)}),lg(()=>{nh(l,m,{flush:"post"});let e=new MutationObserver(l);e.observe(t.subTree.el.parentNode,{childList:!0}),ly(()=>e.disconnect())})}function sc(e,t){if(1===e.nodeType){let l=e.style,r="";for(let e in t){var n;let i=null==(n=t[e])?"initial":"string"==typeof n?""===n?" ":n:String(n);l.setProperty(`--${e}`,i),r+=`--${e}: ${i};`}l[sa]=r}}let sf=/(?:^|;)\s*display\s*:/,sp=/\s*!important$/;function sd(e,t,n){if(E(n))n.forEach(n=>sd(e,t,n));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{let l=function(e,t){let n=sg[t];if(n)return n;let l=j(t);if("filter"!==l&&l in e)return sg[t]=l;l=U(l);for(let n=0;n111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&123>e.charCodeAt(2),sE=(e,t,n,l,r,i)=>{let s="svg"===r;if("class"===t){var o;let t;o=l,(t=e[iY])&&(o=(o?[o,...t]:[...t]).join(" ")),null==o?e.removeAttribute("class"):s?e.setAttribute("class",o):e.className=o}else"style"===t?function(e,t,n){let l=e.style,r=A(n),i=!1;if(n&&!r){if(t)if(A(t))for(let e of t.split(";")){let t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&sd(l,t,"")}else for(let e in t)null==n[e]&&sd(l,e,"");for(let r in n){var s,o,a,u;"display"===r&&(i=!0);let c=n[r];null!=c?(s=e,o=r,a=!A(t)&&t?t[r]:void 0,u=c,"TEXTAREA"===s.tagName&&("width"===o||"height"===o)&&A(u)&&a===u||sd(l,r,c)):sd(l,r,"")}}else if(r){if(t!==n){let e=l[sa];e&&(n+=";"+e),l.cssText=n,i=sf.test(n)}}else t&&e.removeAttribute("style");sr in e&&(e[sr]=i?l.display:"",e[si]&&(l.display="none"))}(e,n,l):b(t)?S(t)||function(e,t,n,l=null){let r=e[sb]||(e[sb]={}),i=r[t];if(n&&i)i.value=n;else{let[a,u]=function(e){let t,n;for(;(n=e.match(sS))&&!sC.test(e);)t||(t={}),e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[":"===e[2]?e.slice(3):V(e.slice(2)),t]}(t);if(n){var s,o;let i;sy(e,a,r[t]=(s=n,o=l,(i=e=>{if(e._vts){if(e._vts<=i.attached)return}else e._vts=Date.now();let t=i.value;if(E(t)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let l=t.slice(),r=[e];for(let t=0;tsx=0),sx=Date.now()),i),u)}else i&&(e.removeEventListener(a,i,u),r[t]=void 0)}}(e,t,l,i):("."===t[0]?(t=t.slice(1),0):"^"===t[0]?(t=t.slice(1),1):!function(e,t,n,l){if(l)return!!("innerHTML"===t||"textContent"===t||t in e&&sk(t)&&T(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t||"sandbox"===t&&"IFRAME"===e.tagName||"form"===t||"list"===t&&"INPUT"===e.tagName||"type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){let t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return!(sk(t)&&A(n))&&t in e}(e,t,l,s))?e._isVueCE&&(function(e,t){let n=e._def.props;if(!n)return!1;let l=j(t);return Array.isArray(n)?n.some(e=>j(e)===l):Object.keys(n).some(e=>j(e)===l)}(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!A(l)))?sm(e,j(t),l,i,t):("true-value"===t?e._trueValue=l:"false-value"===t&&(e._falseValue=l),s_(e,t,l,s)):(sm(e,t,l),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||s_(e,t,l,s,i,"value"!==t))},sT={};function sA(e,t,n){let l,r=n$(e,t);"[object Object]"===(l=r,P.call(l))&&(r=C({},r,t));class i extends sN{constructor(e){super(r,e,n)}}return i.def=r,i}let sR=(e,t)=>sA(e,t,oo),sO="u">typeof HTMLElement?HTMLElement:class{};class sN extends sO{constructor(e,t={},n=os){super(),this._def=e,this._props=t,this._createApp=n,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._patching=!1,this._dirty=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._styleAnchors=new WeakMap,this._ob=null,this.shadowRoot&&n!==os?this._root=this.shadowRoot:!1!==e.shadowRoot?(this.attachShadow(C({},e.shadowRootOptions,{mode:"open"})),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._resolved||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.assignedSlot||e.parentNode||e.host);)if(e instanceof sN){this._parent=e;break}this._instance||(this._resolved?this._mount(this._def):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._inheritParentContext(e))}_inheritParentContext(e=this._parent){e&&this._app&&Object.setPrototypeOf(this._app._context.provides,e._instance.provides)}disconnectedCallback(){this._connected=!1,t0(()=>{!this._connected&&(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null,this._teleportTargets&&(this._teleportTargets.clear(),this._teleportTargets=void 0))})}_processMutations(e){for(let t of e)this._setAttr(t.attributeName)}_resolveDef(){if(this._pendingResolve)return;for(let e=0;e{let n;this._resolved=!0,this._pendingResolve=void 0;let{props:l,styles:r}=e;if(l&&!E(l))for(let e in l){let t=l[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=z(this._props[e])),(n||(n=Object.create(null)))[j(e)]=!0)}this._numberProps=n,this._resolveProps(e),this.shadowRoot&&this._applyStyles(r),this._mount(e)},t=this._def.__asyncLoader;t?this._pendingResolve=t().then(t=>{t.configureApp=this._def.configureApp,e(this._def=t,!0)}):e(this._def)}_mount(e){this._app=this._createApp(e),this._inheritParentContext(),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);let t=this._instance&&this._instance.exposed;if(t)for(let e in t)k(this,e)||Object.defineProperty(this,e,{get:()=>tw(t[e])})}_resolveProps(e){let{props:t}=e,n=E(t)?t:Object.keys(t||{});for(let e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e]);for(let e of n.map(j))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t,!0,!this._patching)}})}_setAttr(e){if(e.startsWith("data-v-"))return;let t=this.hasAttribute(e),n=t?this.getAttribute(e):sT,l=j(e);t&&this._numberProps&&this._numberProps[l]&&(n=z(n)),this._setProp(l,n,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,l=!1){if(t!==this._props[e]&&(this._dirty=!0,t===sT?delete this._props[e]:(this._props[e]=t,"key"===e&&this._app&&(this._app._ceVNode.key=t)),l&&this._instance&&this._update(),n)){let n=this._ob;n&&(this._processMutations(n.takeRecords()),n.disconnect()),!0===t?this.setAttribute(V(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(V(e),t+""):t||this.removeAttribute(V(e)),n&&n.observe(this,{attributes:!0})}}_update(){let e=this._createVNode();this._app&&(e.appContext=this._app._context),or(e,this._root)}_createVNode(){let e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));let t=ie(this._def,C(e,this._props));return this._instance||(t.ce=e=>{this._instance=e,e.ce=this,e.isCE=!0;let t=(e,t)=>{let n;this.dispatchEvent(new CustomEvent(e,"[object Object]"===(n=t[0],P.call(n))?C({detail:t},t[0]):{detail:t}))};e.emit=(e,...n)=>{t(e,n),V(e)!==e&&t(V(e),n)},this._setParent()}),t}_applyStyles(e,t,n){if(!e)return;if(t){if(t===this._def||this._styleChildren.has(t))return;this._styleChildren.add(t)}let l=this._nonce,r=this.shadowRoot,i=n?this._getStyleAnchor(n)||this._getStyleAnchor(this._def):this._getRootStyleInsertionAnchor(r),s=null;for(let o=e.length-1;o>=0;o--){let a=document.createElement("style");l&&a.setAttribute("nonce",l),a.textContent=e[o],r.insertBefore(a,s||i),s=a,0===o&&(n||this._styleAnchors.set(this._def,a),t&&this._styleAnchors.set(t,a))}}_getStyleAnchor(e){if(!e)return null;let t=this._styleAnchors.get(e);return t&&t.parentNode===this.shadowRoot?t:(t&&this._styleAnchors.delete(e),null)}_getRootStyleInsertionAnchor(e){for(let t=0;t{if(!n.length)return;let t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){let l=e.cloneNode(),r=e[iY];r&&r.forEach(e=>{e.split(/\s+/).forEach(e=>e&&l.classList.remove(e))}),n.split(/\s+/).forEach(e=>e&&l.classList.add(e)),l.style.display="none";let i=1===t.nodeType?t:t.parentNode;i.appendChild(l);let{hasTransform:s}=se(l);return i.removeChild(l),s}(n[0].el,r.vnode.el,t)){n=[];return}n.forEach(sU),n.forEach(sB);let l=n.filter(s$);sl(r.vnode.el),l.forEach(e=>{let n=e.el,l=n.style;i4(n,t),l.transform=l.webkitTransform=l.transitionDuration="";let r=n[sj]=e=>{(!e||e.target===n)&&(!e||e.propertyName.endsWith("transform"))&&(n.removeEventListener("transitionend",r),n[sj]=null,i3(n,t))};n.addEventListener("transitionend",r)}),n=[]}),()=>{let s=th(e),o=i8(s),a=s.tag||rK;if(n=[],l)for(let e=0;eMath.abs(s-1)&&(s=1),.01>Math.abs(o-1)&&(o=1),n.transform=n.webkitTransform=`translate(${l/s}px,${r/o}px)`,n.transitionDuration="0s",e}}function sH(e){let t=e.getBoundingClientRect();return{left:t.left,top:t.top}}let sW=e=>{let t=e.props["onUpdate:modelValue"]||!1;return E(t)?e=>H(t,e):t};function sK(e){e.target.composing=!0}function sz(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}let sq=Symbol("_assign");function sG(e,t,n){return t&&(e=e.trim()),n&&(e=K(e)),e}let sX={created(e,{modifiers:{lazy:t,trim:n,number:l}},r){e[sq]=sW(r);let i=l||r.props&&"number"===r.props.type;sy(e,t?"change":"input",t=>{t.target.composing||e[sq](sG(e.value,n,i))}),(n||i)&&sy(e,"change",()=>{e.value=sG(e.value,n,i)}),t||(sy(e,"compositionstart",sK),sy(e,"compositionend",sz),sy(e,"change",sz))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:l,trim:r,number:i}},s){if(e[sq]=sW(s),e.composing)return;let o=(i||"number"===e.type)&&!/^0\d/.test(e.value)?K(e.value):e.value,a=null==t?"":t;if(o===a)return;let u=e.getRootNode();(u instanceof Document||u instanceof ShadowRoot)&&u.activeElement===e&&"range"!==e.type&&(l&&t===n||r&&e.value.trim()===a)||(e.value=a)}},sJ={deep:!0,created(e,t,n){e[sq]=sW(n),sy(e,"change",()=>{let t=e._modelValue,n=s1(e),l=e.checked,r=e[sq];if(E(t)){let e=el(t,n),i=-1!==e;if(l&&!i)r(t.concat(n));else if(!l&&i){let n=[...t];n.splice(e,1),r(n)}}else{let i;if("[object Set]"===(i=t,P.call(i))){let e=new Set(t);l?e.add(n):e.delete(n),r(e)}else r(s2(e,l))}})},mounted:sZ,beforeUpdate(e,t,n){e[sq]=sW(n),sZ(e,t,n)}};function sZ(e,{value:t,oldValue:n},l){let r;if(e._modelValue=t,E(t))r=el(t,l.props.value)>-1;else{let i;if("[object Set]"===(i=t,P.call(i)))r=t.has(l.props.value);else{if(t===n)return;r=en(t,s2(e,!0))}}e.checked!==r&&(e.checked=r)}let sY={created(e,{value:t},n){e.checked=en(t,n.props.value),e[sq]=sW(n),sy(e,"change",()=>{e[sq](s1(e))})},beforeUpdate(e,{value:t,oldValue:n},l){e[sq]=sW(l),t!==n&&(e.checked=en(t,l.props.value))}},sQ={deep:!0,created(e,{value:t,modifiers:{number:n}},l){let r,i="[object Set]"===(r=t,P.call(r));sy(e,"change",()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?K(s1(e)):s1(e));e[sq](e.multiple?i?new Set(t):t:t[0]),e._assigning=!0,t0(()=>{e._assigning=!1})}),e[sq]=sW(l)},mounted(e,{value:t}){s0(e,t)},beforeUpdate(e,t,n){e[sq]=sW(n)},updated(e,{value:t}){e._assigning||s0(e,t)}};function s0(e,t){let n,l=e.multiple,r=E(t);if(!l||r||"[object Set]"===(n=t,P.call(n))){for(let n=0,i=e.options.length;nString(e)===String(s)):i.selected=el(t,s)>-1}else i.selected=t.has(s);else if(en(s1(i),t)){e.selectedIndex!==n&&(e.selectedIndex=n);return}}l||-1===e.selectedIndex||(e.selectedIndex=-1)}}function s1(e){return"_value"in e?e._value:e.value}function s2(e,t){let n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}let s6={created(e,t,n){s4(e,t,n,null,"created")},mounted(e,t,n){s4(e,t,n,null,"mounted")},beforeUpdate(e,t,n,l){s4(e,t,n,l,"beforeUpdate")},updated(e,t,n,l){s4(e,t,n,l,"updated")}};function s8(e,t){switch(e){case"SELECT":return sQ;case"TEXTAREA":return sX;default:switch(t){case"checkbox":return sJ;case"radio":return sY;default:return sX}}}function s4(e,t,n,l,r){let i=s8(e.tagName,n.props&&n.props.type)[r];i&&i(e,t,n,l)}let s3=["ctrl","shift","alt","meta"],s5={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&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>s3.some(n=>e[`${n}Key`]&&!t.includes(n))},s9=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),l=t.join(".");return n[l]||(n[l]=(n,...l)=>{for(let e=0;e{let n=e._withKeys||(e._withKeys={}),l=t.join(".");return n[l]||(n[l]=n=>{if(!("key"in n))return;let l=V(n.key);if(t.some(e=>e===l||s7[e]===l))return e(n)})},ot=C({patchProp:sE},iX),on=!1;function ol(){return f=on?f:rO(ot),on=!0,f}let or=(...e)=>{(f||(f=rR(ot))).render(...e)},oi=(...e)=>{ol().hydrate(...e)},os=(...e)=>{let t=(f||(f=rR(ot))).createApp(...e),{mount:n}=t;return t.mount=e=>{let l=ou(e);if(!l)return;let r=t._component;T(r)||r.render||r.template||(r.template=l.innerHTML),1===l.nodeType&&(l.textContent="");let i=n(l,!1,oa(l));return l instanceof Element&&(l.removeAttribute("v-cloak"),l.setAttribute("data-v-app","")),i},t},oo=(...e)=>{let t=ol().createApp(...e),{mount:n}=t;return t.mount=e=>{let t=ou(e);if(t)return n(t,!0,oa(t))},t};function oa(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}function ou(e){return A(e)?document.querySelector(e):e}let oc=!1,of=()=>{oc||(oc=!0,sX.getSSRProps=({value:e})=>({value:e}),sY.getSSRProps=({value:e},t)=>{if(t.props&&en(t.props.value,e))return{checked:!0}},sJ.getSSRProps=({value:e},t)=>{if(E(e)){if(t.props&&el(e,t.props.value)>-1)return{checked:!0}}else{let n;if("[object Set]"===(n=e,P.call(n))){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}}},s6.getSSRProps=(e,t)=>{if("string"!=typeof t.type)return;let n=s8(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)},ss.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})},op=()=>{};export{nF as BaseTransition,nP as BaseTransitionPropsValidators,rq as Comment,iW as DeprecationTypes,ea as EffectScope,tH as ErrorCodes,iD as ErrorTypeStrings,rK as Fragment,li as KeepAlive,ed as ReactiveEffect,rG as Static,rV as Suspense,nk as Teleport,rz as Text,tF as TrackOpTypes,i1 as Transition,sV as TransitionGroup,tL as TriggerOpTypes,sN as VueElement,t$ as assertNumber,tK as callWithAsyncErrorHandling,tW as callWithErrorHandling,j as camelize,U as capitalize,il as cloneVNode,iH as compatUtils,op as compile,iN as computed,os as createApp,r6 as createBlock,is as createCommentVNode,r2 as createElementBlock,r7 as createElementVNode,rO as createHydrationRenderer,l0 as createPropsRestProxy,rR as createRenderer,oo as createSSRApp,lP as createSlots,ii as createStaticVNode,ir as createTextVNode,ie as createVNode,tR as customRef,ln as defineAsyncComponent,n$ as defineComponent,sA as defineCustomElement,l$ as defineEmits,lH as defineExpose,lz as defineModel,lW as defineOptions,lB as defineProps,sR as defineSSRCustomElement,lK as defineSlots,iV as devtools,eC as effect,eu as effectScope,i_ as getCurrentInstance,ec as getCurrentScope,tV as getCurrentWatcher,nB as getTransitionRawChildren,it as guardReactiveProps,iP as h,tz as handleError,na as hasInjectionContext,oi as hydrate,n5 as hydrateOnIdle,le as hydrateOnInteraction,n7 as hydrateOnMediaQuery,n9 as hydrateOnVisible,iM as initCustomFormatter,of as initDirectivesForSSR,no as inject,iF as isMemoSame,td as isProxy,tc as isReactive,tf as isReadonly,tm as isRef,ik as isRuntimeOnly,tp as isShallow,r8 as isVNode,tg as markRaw,lY as mergeDefaults,lQ as mergeModels,ic as mergeProps,t0 as nextTick,iX as nodeOps,Q as normalizeClass,ee as normalizeProps,X as normalizeStyle,lo as onActivated,lh as onBeforeMount,lm as onBeforeUnmount,lv as onBeforeUpdate,la as onDeactivated,lx as onErrorCaptured,lg as onMounted,lC as onRenderTracked,lS as onRenderTriggered,ef as onScopeDispose,lb as onServerPrefetch,ly as onUnmounted,l_ as onUpdated,tU as onWatcherCleanup,rZ as openBlock,sE as patchProp,nt as popScopeId,ns as provide,tT as proxyRefs,ne as pushScopeId,t6 as queuePostFlushCb,ti as reactive,to as readonly,ty as ref,iw as registerRuntimeCompiler,or as render,lN as renderList,lM as renderSlot,lk as resolveComponent,lA as resolveDirective,lT as resolveDynamicComponent,i$ as resolveFilter,nj as resolveTransitionHooks,r0 as setBlockTracking,iU as setDevtoolsHook,nU as setTransitionHooks,ts as shallowReactive,ta as shallowReadonly,tb as shallowRef,nu as ssrContextKey,iB as ssrUtils,ex as stop,ei as toDisplayString,B as toHandlerKey,lF as toHandlers,th as toRaw,tM as toRef,tO as toRefs,tk as toValue,r3 as transformVNodeArgs,tx as triggerRef,tw as unref,lX as useAttrs,sI as useCssModule,su as useCssVars,sP as useHost,nH as useId,ri as useModel,nc as useSSRContext,sM as useShadowRoot,lG as useSlots,nK as useTemplateRef,nO as useTransitionState,sJ as vModelCheckbox,s6 as vModelDynamic,sY as vModelRadio,sQ as vModelSelect,sX as vModelText,ss as vShow,iL as version,ij as warn,nh as watch,nf as watchEffect,np as watchPostEffect,nd as watchSyncEffect,l1 as withAsyncContext,nl as withCtx,lq as withDefaults,nr as withDirectives,oe as withKeys,iI as withMemo,s9 as withModifiers,nn as withScopeId};
diff --git a/scripts/src/hwlab-node-web-sentinel-cicd.ts b/scripts/src/hwlab-node-web-sentinel-cicd.ts
index 5b1a3a39..580b6be1 100644
--- a/scripts/src/hwlab-node-web-sentinel-cicd.ts
+++ b/scripts/src/hwlab-node-web-sentinel-cicd.ts
@@ -2,6 +2,7 @@
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p8-web-probe-sentinel-recovery.
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p9-multi-web-probe-sentinel.
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p10-monitor-web-aggregation.
+// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-27-p11-monitor-web-observability-dashboard.
// Responsibility: YAML-first CI/CD, image, GitOps and Argo command plan for the web-probe sentinel.
import { createHash, randomUUID } from "node:crypto";
import { existsSync, readFileSync } from "node:fs";
@@ -147,6 +148,7 @@ interface SentinelImagePlan {
readonly entrypoint: string;
readonly dockerfileSha256: string;
readonly dockerfilePreview: string;
+ readonly monitorWeb: Record;
}
interface SentinelObservedStatus {
@@ -190,7 +192,7 @@ interface ChildCliResult {
readonly result: CompactCommandResult & { stdoutTail: string; stderrTail: string };
}
-const SPEC_REF = "PJ2026-01060508 Web哨兵 draft-2026-06-25-p0-web-probe-sentinel";
+const SPEC_REF = "PJ2026-01060508 Web哨兵 draft-2026-06-27-p11-monitor-web-observability-dashboard";
export function runWebProbeSentinelCommand(spec: HwlabRuntimeLaneSpec, options: WebProbeSentinelOptions): RenderedCliResult {
if (options.kind === "config") return withWebProbeSentinelConfigRendered(webProbeSentinelConfigPlan(spec, options.action, options.sentinelId));
@@ -367,6 +369,7 @@ function sentinelImagePlan(cicd: Record, sourceHead: SourceHead
entrypoint,
dockerfileSha256: sha256(dockerfile),
dockerfilePreview: dockerfile,
+ monitorWeb: monitorWebCicdPlan(cicd),
};
}
@@ -376,12 +379,28 @@ function sentinelDockerfile(baseImage: string, entrypoint: string): string {
"WORKDIR /app",
"COPY . /app",
"RUN if [ -d /opt/hwlab-ci-node-deps/node_modules ]; then mkdir -p /app/node_modules; for dep in /opt/hwlab-ci-node-deps/node_modules/*; do ln -sf \"$dep\" \"/app/node_modules/$(basename \"$dep\")\"; done; fi",
+ "RUN bun scripts/verify-web-probe-sentinel-monitor-web.ts",
"ENV NODE_ENV=production",
`ENTRYPOINT ["bun", "${entrypoint}"]`,
"",
].join("\n");
}
+function monitorWebCicdPlan(cicd: Record): Record {
+ return {
+ stack: stringAtNullable(cicd, "monitorWeb.frontendStack") ?? "vue3-vendored-runtime",
+ runtimeMode: stringAtNullable(cicd, "monitorWeb.runtimeMode") ?? "runner-served-bridge",
+ assetRoot: stringAtNullable(cicd, "monitorWeb.assetRoot") ?? "scripts/assets/web-probe-sentinel-monitor-web",
+ verifyCommand: "bun scripts/verify-web-probe-sentinel-monitor-web.ts",
+ gitMirrorReadUrl: stringAt(cicd, "source.gitMirrorReadUrl"),
+ sourceMode: stringAt(cicd, "builder.sourceMode"),
+ envReuseMode: stringAtNullable(cicd, "monitorWeb.envReuse.mode") ?? "docker-layer-and-ci-node-deps",
+ envReuseNodeDepsPath: stringAtNullable(cicd, "monitorWeb.envReuse.nodeDepsPath") ?? "/opt/hwlab-ci-node-deps/node_modules",
+ ciBudgetSeconds: numberAtNullable(cicd, "monitorWeb.ciBudget.maxSeconds") ?? numberAt(cicd, "confirmWait.maxSeconds"),
+ valuesRedacted: true,
+ };
+}
+
function renderSentinelManifests(
spec: HwlabRuntimeLaneSpec,
sentinelId: string,
@@ -1964,15 +1983,16 @@ for (let attempt = 1; attempt <= maxNavigationAttempts; attempt += 1) {
httpStatus = response?.status() ?? null;
await page.waitForLoadState("networkidle", { timeout: Math.min(5000, perAttemptTimeout) }).catch(() => {});
await page.waitForFunction(() => {
- const root = document.querySelector("#sentinel-dashboard");
+ const root = document.querySelector("#monitor-web-root");
if (!root) return false;
- const error = document.querySelector("#error-banner");
- const runs = document.querySelectorAll("#runs-body tr").length;
- const statusText = document.querySelector("#status-pill")?.textContent || "";
- return (error && !error.hidden) || runs > 0 || (statusText.trim() && statusText.trim() !== "空闲");
+ const ready = root.getAttribute("data-monitor-ready") === "true";
+ const error = document.querySelector("#monitor-web-error");
+ const runs = document.querySelectorAll(".run-list .run-row").length;
+ const trend = document.querySelector("[data-monitor-trend-curve]");
+ return ready && (error || runs > 0 || trend);
}, null, { timeout: Math.min(5000, perAttemptTimeout) }).catch(() => {});
await page.waitForTimeout(500);
- const shellReady = await page.evaluate(() => Boolean(document.querySelector("#sentinel-dashboard"))).catch(() => false);
+ const shellReady = await page.evaluate(() => Boolean(document.querySelector("#monitor-web-root"))).catch(() => false);
if (shellReady || attempt === maxNavigationAttempts) break;
} catch (error) {
navigationError = String(error?.message || error).slice(0, 500);
@@ -1990,9 +2010,13 @@ if (captureScreenshot && screenshotPath) {
const dom = await page.evaluate(() => {
const visible = (element) => Boolean(element && !element.hidden);
const text = (selector) => String(document.querySelector(selector)?.textContent || "").replace(/\s+/g, " ").trim();
- const root = document.querySelector("#sentinel-dashboard");
- const error = document.querySelector("#error-banner");
- const loading = document.querySelector("#loading-banner");
+ const root = document.querySelector("#monitor-web-root");
+ const shell = document.querySelector("[data-monitor-shell='true']");
+ const error = document.querySelector("#monitor-web-error");
+ const trend = document.querySelector("[data-monitor-trend-curve]");
+ const timeline = document.querySelector("[data-monitor-timeline='true']");
+ const workspace = document.querySelector("[data-monitor-independent-scroll='true']");
+ const panes = Array.from(document.querySelectorAll(".workspace-grid .pane"));
const doc = document.documentElement;
const body = document.body;
const viewport = { width: window.innerWidth, height: window.innerHeight };
@@ -2024,7 +2048,8 @@ const dom = await page.evaluate(() => {
}
}
return {
- shell: Boolean(root),
+ shell: Boolean(root && shell),
+ ready: root?.getAttribute("data-monitor-ready") === "true",
dataset: root ? {
node: root.getAttribute("data-node"),
lane: root.getAttribute("data-lane"),
@@ -2034,16 +2059,39 @@ const dom = await page.evaluate(() => {
} : {},
title: document.title,
finalUrl: window.location.href,
- statusText: text("#status-pill"),
- subtitle: text("#sentinel-subtitle"),
- summaryText: text("#status-summary"),
- runRows: document.querySelectorAll("#runs-body tr").length,
- findingItems: document.querySelectorAll("#findings-list > *").length,
- detailTabs: document.querySelectorAll("#detail-tabs [data-detail-tab]").length,
- timelineItems: document.querySelectorAll("#run-timeline > *").length,
- loadingVisible: visible(loading),
+ statusText: text(".topbar .pill"),
+ subtitle: text(".subtitle"),
+ summaryText: text(".status-strip"),
+ runRows: document.querySelectorAll(".run-list .run-row").length,
+ findingItems: document.querySelectorAll(".finding-list .finding-card").length,
+ trendCurve: Boolean(trend),
+ trendPanelText: text("#trend-heading"),
+ timelineItems: document.querySelectorAll(".timeline-list .timeline-item").length,
+ timelineVisible: Boolean(timeline),
errorVisible: visible(error),
- errorText: visible(error) ? text("#error-banner").slice(0, 500) : "",
+ errorText: visible(error) ? text("#monitor-web-error").slice(0, 500) : "",
+ scrollModel: {
+ workspace: Boolean(workspace),
+ paneCount: panes.length,
+ panes: panes.map((pane) => {
+ const style = window.getComputedStyle(pane);
+ const rect = pane.getBoundingClientRect();
+ return {
+ className: String(pane.className || ""),
+ overflowY: style.overflowY,
+ scrollHeight: pane.scrollHeight,
+ clientHeight: pane.clientHeight,
+ x: Math.round(rect.x),
+ y: Math.round(rect.y),
+ width: Math.round(rect.width),
+ height: Math.round(rect.height),
+ };
+ }),
+ independentScroll: panes.length >= 3 && panes.every((pane) => {
+ const style = window.getComputedStyle(pane);
+ return style.overflowY === "auto" || style.overflowY === "scroll";
+ }),
+ },
layout: {
viewport,
documentSize,
@@ -2060,8 +2108,12 @@ const ok = !navigationError
&& httpStatus >= 200
&& httpStatus < 300
&& dom.shell === true
+ && dom.ready === true
&& dom.errorVisible !== true
- && dom.runRows > 0
+ && dom.trendCurve === true
+ && dom.timelineVisible === true
+ && dom.scrollModel?.independentScroll === true
+ && dom.layout?.horizontalOverflow !== true
&& pageErrors.length === 0;
console.log("__WEB_PROBE_SENTINEL_DASHBOARD_JSON__" + JSON.stringify({
@@ -2905,28 +2957,33 @@ function probeSentinelPublicExposure(state: SentinelCicdState, timeoutSeconds: n
function probeSentinelPublicDashboard(state: SentinelCicdState, timeoutSeconds: number): Record {
const publicBaseUrl = stringAt(state.publicExposure, "publicBaseUrl").replace(/\/$/u, "");
const rootUrl = `${publicBaseUrl}/`;
- const cssUrl = `${publicBaseUrl}/dashboard/assets/dashboard.css`;
- const jsUrl = `${publicBaseUrl}/dashboard/assets/dashboard.js`;
+ const cssUrl = `${publicBaseUrl}/monitor-web/assets/monitor-web.css`;
+ const jsUrl = `${publicBaseUrl}/monitor-web/assets/monitor-web.js`;
+ const vueUrl = `${publicBaseUrl}/monitor-web/assets/vendor/vue.runtime.esm-browser.prod.js`;
const script = [
"set +e",
`root_url=${shellQuote(rootUrl)}`,
`css_url=${shellQuote(cssUrl)}`,
`js_url=${shellQuote(jsUrl)}`,
+ `vue_url=${shellQuote(vueUrl)}`,
"root_body=$(mktemp)",
"css_body=$(mktemp)",
"js_body=$(mktemp)",
+ "vue_body=$(mktemp)",
"root_code=$(curl -sS -L --connect-timeout 8 --max-time 20 -o \"$root_body\" --write-out '%{http_code}' \"$root_url\" 2>/tmp/web-probe-sentinel-dashboard-root.err); root_rc=$?",
"css_code=$(curl -sS -L --connect-timeout 8 --max-time 20 -o \"$css_body\" --write-out '%{http_code}' \"$css_url\" 2>/tmp/web-probe-sentinel-dashboard-css.err); css_rc=$?",
"js_code=$(curl -sS -L --connect-timeout 8 --max-time 20 -o \"$js_body\" --write-out '%{http_code}' \"$js_url\" 2>/tmp/web-probe-sentinel-dashboard-js.err); js_rc=$?",
- "node - \"$root_url\" \"$css_url\" \"$js_url\" \"$root_code\" \"$root_rc\" \"$css_code\" \"$css_rc\" \"$js_code\" \"$js_rc\" \"$root_body\" \"$css_body\" \"$js_body\" <<'NODE'",
+ "vue_code=$(curl -sS -L --connect-timeout 8 --max-time 20 -o \"$vue_body\" --write-out '%{http_code}' \"$vue_url\" 2>/tmp/web-probe-sentinel-dashboard-vue.err); vue_rc=$?",
+ "node - \"$root_url\" \"$css_url\" \"$js_url\" \"$vue_url\" \"$root_code\" \"$root_rc\" \"$css_code\" \"$css_rc\" \"$js_code\" \"$js_rc\" \"$vue_code\" \"$vue_rc\" \"$root_body\" \"$css_body\" \"$js_body\" \"$vue_body\" <<'NODE'",
"const fs=require('node:fs');",
- "const [rootUrl,cssUrl,jsUrl,rootCode,rootRc,cssCode,cssRc,jsCode,jsRc,rootPath,cssPath,jsPath]=process.argv.slice(2);",
+ "const [rootUrl,cssUrl,jsUrl,vueUrl,rootCode,rootRc,cssCode,cssRc,jsCode,jsRc,vueCode,vueRc,rootPath,cssPath,jsPath,vuePath]=process.argv.slice(2);",
"function read(path){try{return fs.readFileSync(path,'utf8')}catch{return ''}}",
- "const root=read(rootPath); const css=read(cssPath); const js=read(jsPath);",
- "const rootOk=Number(rootRc)===0&&Number(rootCode)>=200&&Number(rootCode)<300&&root.includes('id=\"sentinel-dashboard\"')&&root.includes('/dashboard/assets/dashboard.js');",
- "const cssOk=Number(cssRc)===0&&Number(cssCode)>=200&&Number(cssCode)<300&&css.includes('sentinel-shell')&&css.length>1000;",
- "const jsOk=Number(jsRc)===0&&Number(jsCode)>=200&&Number(jsCode)<300&&js.includes('createAutoRefresh')&&js.includes('/api/overview')&&js.length>1000;",
- "console.log(JSON.stringify({ok:rootOk&&cssOk&&jsOk,root:{url:rootUrl,httpStatus:Number(rootCode),bytes:Buffer.byteLength(root),shell:root.includes('id=\"sentinel-dashboard\"')},css:{url:cssUrl,httpStatus:Number(cssCode),bytes:Buffer.byteLength(css),shell:css.includes('sentinel-shell')},js:{url:jsUrl,httpStatus:Number(jsCode),bytes:Buffer.byteLength(js),apiClient:js.includes('/api/overview'),autoRefresh:js.includes('createAutoRefresh')},valuesRedacted:true}));",
+ "const root=read(rootPath); const css=read(cssPath); const js=read(jsPath); const vue=read(vuePath);",
+ "const rootOk=Number(rootRc)===0&&Number(rootCode)>=200&&Number(rootCode)<300&&root.includes('id=\"monitor-web-root\"')&&root.includes('/monitor-web/assets/monitor-web.js')&&root.includes('monitor-web-bootstrap');",
+ "const cssOk=Number(cssRc)===0&&Number(cssCode)>=200&&Number(cssCode)<300&&css.includes('monitor-shell')&&css.includes('workspace-grid')&&css.includes('trend-stage')&&css.length>1000;",
+ "const jsOk=Number(jsRc)===0&&Number(jsCode)>=200&&Number(jsCode)<300&&js.includes('createApp')&&js.includes('/api/overview')&&js.includes('data-monitor-trend-curve')&&js.length>1000;",
+ "const vueOk=Number(vueRc)===0&&Number(vueCode)>=200&&Number(vueCode)<300&&vue.includes('createApp')&&vue.length>80000;",
+ "console.log(JSON.stringify({ok:rootOk&&cssOk&&jsOk&&vueOk,root:{url:rootUrl,httpStatus:Number(rootCode),bytes:Buffer.byteLength(root),shell:root.includes('id=\"monitor-web-root\"'),contract:root.includes('draft-2026-06-27-p11-monitor-web-observability-dashboard')},css:{url:cssUrl,httpStatus:Number(cssCode),bytes:Buffer.byteLength(css),workspaceGrid:css.includes('workspace-grid'),trendStage:css.includes('trend-stage')},js:{url:jsUrl,httpStatus:Number(jsCode),bytes:Buffer.byteLength(js),vueApp:js.includes('createApp'),apiClient:js.includes('/api/overview'),trend:js.includes('data-monitor-trend-curve')},vue:{url:vueUrl,httpStatus:Number(vueCode),bytes:Buffer.byteLength(vue),runtime:vue.includes('createApp')},valuesRedacted:true}));",
"NODE",
].join("\n");
const result = runCommand(["bash", "-lc", script], repoRoot, { timeoutMs: Math.min(timeoutSeconds, 30) * 1000 });
@@ -4151,6 +4208,7 @@ function renderImageResult(result: Record): string {
const sourceMirror = record(result.sourceMirror);
const sourceMirrorSync = record(result.sourceMirrorSync);
const image = record(result.image);
+ const monitorWeb = record(image.monitorWeb);
const registry = record(result.registry);
const publish = record(result.publish);
const blocker = record(result.blocker);
@@ -4167,6 +4225,8 @@ function renderImageResult(result: Record): string {
"",
table(["IMAGE", "BASE", "ENTRYPOINT", "DOCKERFILE"], [[image.ref, image.baseImage, image.entrypoint, short(image.dockerfileSha256)]]),
"",
+ Object.keys(monitorWeb).length === 0 ? "MONITOR_WEB\n-" : table(["STACK", "MODE", "ASSETS", "VERIFY", "ENV_REUSE"], [[monitorWeb.stack, monitorWeb.runtimeMode, monitorWeb.assetRoot, monitorWeb.verifyCommand, `${monitorWeb.envReuseMode}:${monitorWeb.envReuseNodeDepsPath}`]]),
+ "",
Object.keys(registry).length === 0 ? "REGISTRY\n-" : table(["PROBED", "PRESENT", "DIGEST"], [[record(registry.probe).url ?? "-", record(registry.probe).present ?? "-", short(record(registry.probe).digest)]]),
"",
Object.keys(sourceMirrorSync).length === 0 ? "SOURCE_MIRROR_SYNC\n-" : table(["OK", "PHASE", "JOB", "COMMIT", "ELAPSED"], [[sourceMirrorSync.ok, sourceMirrorSync.phase, sourceMirrorSync.jobName, short(record(sourceMirrorSync.payload).mirrorCommit), sourceMirrorSync.elapsedMs ?? "-"]]),
diff --git a/scripts/src/hwlab-node-web-sentinel-dashboard-assets.ts b/scripts/src/hwlab-node-web-sentinel-dashboard-assets.ts
index 8f48f312..5cd5ab39 100644
--- a/scripts/src/hwlab-node-web-sentinel-dashboard-assets.ts
+++ b/scripts/src/hwlab-node-web-sentinel-dashboard-assets.ts
@@ -1,6 +1,7 @@
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p9-desktop-view-density.
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p9-multi-web-probe-sentinel.
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p10-monitor-web-aggregation.
+// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-27-p11-monitor-web-observability-dashboard.
// Responsibility: Static dashboard shell and asset serving for the web-probe sentinel frontend.
import { readFileSync } from "node:fs";
import { rootPath } from "./config";
@@ -14,24 +15,35 @@ interface DashboardShellConfig {
}
const DASHBOARD_ASSET_ROOT = "scripts/assets/web-probe-sentinel-dashboard";
-const DASHBOARD_CONTRACT_VERSION = "draft-2026-06-26-p10-monitor-web-aggregation";
+const MONITOR_WEB_ASSET_ROOT = "scripts/assets/web-probe-sentinel-monitor-web";
+const DASHBOARD_CONTRACT_VERSION = "draft-2026-06-27-p11-monitor-web-observability-dashboard";
export function renderWebProbeSentinelDashboardHtml(config: DashboardShellConfig): string {
const publicOrigin = stringOrNull(config.publicExposure.publicBaseUrl) ?? "";
const basePath = publicBasePath(publicOrigin);
- const registryHtml = renderSentinelRegistryStrip(config, basePath);
+ const sentinels = sentinelRegistryRows(config);
+ const bootstrap = {
+ node: config.node,
+ lane: config.lane,
+ sentinelId: config.sentinelId,
+ publicOrigin,
+ basePath,
+ configReady: config.plan.ok,
+ contractVersion: DASHBOARD_CONTRACT_VERSION,
+ sentinels,
+ valuesRedacted: true,
+ };
return `
- HWLAB Web哨兵
-
+ HWLAB Web哨兵 monitor-web
+
-
-
-
-
-
HWLAB Web哨兵
-
- ${escapeHtml(config.node)} / ${escapeHtml(config.lane)}
- ·
- ${escapeHtml(config.sentinelId)}
-
-
-
-
-
- 空闲
-
-
-
-
-
-
-
-
-
- 状态-
- 最近运行-
- 发现0
- 调度器-
-
-
-
- ${registryHtml}
-
-
-
-
-
-
-
- config -
- pvc -
- analyzer -
- public -
- maintenance -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | 运行 |
- 状态 |
- 场景 |
- 发现 |
- 更新 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 已复制
+ 加载 monitor-web...
-
+
+
`;
}
-function renderSentinelRegistryStrip(config: DashboardShellConfig, basePath: string): string {
- const rows = Array.isArray(config.plan.sentinels) ? config.plan.sentinels.map((item) => ({
+function sentinelRegistryRows(config: DashboardShellConfig): Array<{ readonly id: string; readonly enabled: boolean }> {
+ return Array.isArray(config.plan.sentinels) ? config.plan.sentinels.map((item) => ({
id: stringOrNull(item.id) ?? "",
enabled: item.enabled !== false,
})).filter((item) => item.id.length > 0) : [];
- if (rows.length <= 1) return "";
- return `
-
- 哨兵入口
- 当前 workspace 共 ${rows.length} 条
-
-
- ${rows.map((item) => renderSentinelRegistryLink(item.id, item.enabled, item.id === config.sentinelId, basePath)).join("")}
-
- `;
-}
-
-function renderSentinelRegistryLink(id: string, enabled: boolean, current: boolean, basePath: string): string {
- const href = current
- ? `${basePath || "/"}`
- : id === "workbench-dsflash-go-tool-call-10x"
- ? "/"
- : `/sentinels/${encodeURIComponent(id)}/`;
- return `
- ${escapeHtml(id)}
- ${current ? "当前" : enabled ? "查看" : "停用"}
- `;
}
function publicBasePath(publicBaseUrl: string): string {
@@ -273,6 +80,10 @@ function publicBasePath(publicBaseUrl: string): string {
export function webProbeSentinelDashboardAssetResponse(pathname: string): Response | null {
if (pathname === "/dashboard/assets/dashboard.css") return textAsset(`${DASHBOARD_ASSET_ROOT}/dashboard.css`, "text/css; charset=utf-8");
if (pathname === "/dashboard/assets/dashboard.js") return textAsset(`${DASHBOARD_ASSET_ROOT}/dashboard.js`, "application/javascript; charset=utf-8");
+ if (pathname === "/monitor-web/assets/monitor-web.css") return textAsset(`${MONITOR_WEB_ASSET_ROOT}/monitor-web.css`, "text/css; charset=utf-8");
+ if (pathname === "/monitor-web/assets/monitor-web.js") return textAsset(`${MONITOR_WEB_ASSET_ROOT}/monitor-web.js`, "application/javascript; charset=utf-8");
+ if (pathname === "/monitor-web/assets/vendor/vue.runtime.esm-browser.prod.js") return textAsset(`${MONITOR_WEB_ASSET_ROOT}/vendor/vue.runtime.esm-browser.prod.js`, "application/javascript; charset=utf-8");
+ if (pathname === "/monitor-web/assets/vendor/VUE-LICENSE") return textAsset(`${MONITOR_WEB_ASSET_ROOT}/vendor/VUE-LICENSE`, "text/plain; charset=utf-8");
return null;
}
@@ -296,3 +107,7 @@ function escapeHtml(value: string): string {
function escapeAttr(value: string): string {
return escapeHtml(value).replace(/'/gu, "'");
}
+
+function jsonForScript(value: unknown): string {
+ return JSON.stringify(value).replace(/ {
const url = new URL(request.url);
- if (request.method === "GET" && url.pathname === "/api/health") return jsonResponse(service.health(), service.health().ok === true ? 200 : 503);
- if (request.method === "GET" && url.pathname === "/api/status") return jsonResponse(service.status());
- if (request.method === "GET" && url.pathname === "/api/overview") return jsonResponse(service.overview());
- if (request.method === "GET" && url.pathname === "/api/runs") return jsonResponse(service.dashboardRuns(url));
- if (request.method === "GET" && url.pathname === "/api/findings") return jsonResponse(service.findings(url));
- const runViewsMatch = /^\/api\/runs\/([^/]+)\/views$/u.exec(url.pathname);
+ const pathname = normalizedSentinelRequestPath(service, url.pathname);
+ if (request.method === "GET" && pathname === "/api/health") return jsonResponse(service.health(), service.health().ok === true ? 200 : 503);
+ if (request.method === "GET" && pathname === "/api/status") return jsonResponse(service.status());
+ if (request.method === "GET" && pathname === "/api/overview") return jsonResponse(service.overview());
+ if (request.method === "GET" && pathname === "/api/runs") return jsonResponse(service.dashboardRuns(url));
+ if (request.method === "GET" && pathname === "/api/findings") return jsonResponse(service.findings(url));
+ const runViewsMatch = /^\/api\/runs\/([^/]+)\/views$/u.exec(pathname);
if (request.method === "GET" && runViewsMatch !== null) {
const view = url.searchParams.get("view");
const result = service.runViews(decodeURIComponent(runViewsMatch[1]), view, url);
return jsonResponse(result, result.ok === false ? 404 : 200);
}
- const runDetailMatch = /^\/api\/runs\/([^/]+)$/u.exec(url.pathname);
+ const runDetailMatch = /^\/api\/runs\/([^/]+)$/u.exec(pathname);
if (request.method === "GET" && runDetailMatch !== null) {
const result = service.runDetail(decodeURIComponent(runDetailMatch[1]));
return jsonResponse(result, result.ok === false ? 404 : 200);
}
- if (request.method === "GET" && url.pathname === "/api/maintenance") return jsonResponse({ ok: true, maintenance: service.maintenance(), valuesRedacted: true });
- if (request.method === "POST" && (url.pathname === "/api/maintenance/start" || url.pathname === "/api/maintenance/stop")) {
+ if (request.method === "GET" && pathname === "/api/maintenance") return jsonResponse({ ok: true, maintenance: service.maintenance(), valuesRedacted: true });
+ if (request.method === "POST" && (pathname === "/api/maintenance/start" || pathname === "/api/maintenance/stop")) {
const body = await readJsonBody(request);
- const active = url.pathname.endsWith("/start");
+ const active = pathname.endsWith("/start");
return jsonResponse({ ok: true, maintenance: service.setMaintenance(active, body), valuesRedacted: true });
}
- if (request.method === "POST" && url.pathname === "/api/runs/plan") {
+ if (request.method === "POST" && pathname === "/api/runs/plan") {
const body = await readJsonBody(request);
return jsonResponse(service.planScenarioRun(stringField(body, "scenarioId"), stringOrNull(body.reason) ?? "manual"));
}
- if (request.method === "POST" && url.pathname === "/api/runs/record") {
+ if (request.method === "POST" && pathname === "/api/runs/record") {
const body = await readJsonBody(request);
return jsonResponse(service.recordRun(body));
}
- if (request.method === "GET" && url.pathname === "/api/report") {
+ if (request.method === "GET" && pathname === "/api/report") {
const view = url.searchParams.get("view") ?? stringOrNull(service.config.reportViews.defaultView) ?? "summary";
const runId = url.searchParams.get("run") ?? url.searchParams.get("runId");
const report = service.report(view, runId);
return jsonResponse(report, report.ok === false ? 404 : 200);
}
- if (request.method === "GET" && url.pathname === "/metrics") {
+ if (request.method === "GET" && pathname === "/metrics") {
return new Response(service.metrics(), { headers: { "content-type": "text/plain; version=0.0.4; charset=utf-8" } });
}
- if (request.method === "GET" && url.pathname.startsWith("/dashboard/assets/")) {
- const asset = webProbeSentinelDashboardAssetResponse(url.pathname);
+ if (request.method === "GET" && (pathname.includes("/dashboard/assets/") || pathname.includes("/monitor-web/assets/"))) {
+ const asset = webProbeSentinelDashboardAssetResponse(normalizedDashboardAssetPath(pathname));
if (asset !== null) return asset;
}
- if (request.method === "GET" && (url.pathname === "/" || url.pathname === "/dashboard")) {
+ if (request.method === "GET" && (pathname === "/" || pathname === "/dashboard" || pathname === "/monitor-web")) {
return new Response(service.dashboardHtml(), { headers: { "content-type": "text/html; charset=utf-8" } });
}
return jsonResponse({ ok: false, error: "not-found", path: url.pathname, valuesRedacted: true }, 404);
}
+function normalizedSentinelRequestPath(service: WebProbeSentinelService, pathname: string): string {
+ const publicPath = publicExposurePath(service.config.publicExposure);
+ if (publicPath.length > 0 && (pathname === publicPath || pathname === `${publicPath}/`)) return "/";
+ if (publicPath.length > 0 && pathname.startsWith(`${publicPath}/`)) return pathname.slice(publicPath.length) || "/";
+ if (/^\/sentinels\/[^/]+\/?$/u.test(pathname)) return "/";
+ for (const marker of ["/api/", "/monitor-web/assets/", "/dashboard/assets/"]) {
+ const index = pathname.indexOf(marker);
+ if (index > 0) return pathname.slice(index);
+ }
+ for (const marker of ["/monitor-web", "/dashboard", "/metrics"]) {
+ if (pathname.endsWith(marker)) return marker;
+ }
+ return pathname;
+}
+
+function publicExposurePath(publicExposure: Record): string {
+ const publicBaseUrl = stringOrNull(publicExposure.publicBaseUrl);
+ if (publicBaseUrl === null) return "";
+ try {
+ const pathname = new URL(publicBaseUrl).pathname.replace(/\/+$/u, "");
+ return pathname === "/" ? "" : pathname;
+ } catch {
+ return "";
+ }
+}
+
+function normalizedDashboardAssetPath(pathname: string): string {
+ for (const marker of ["/monitor-web/assets/", "/dashboard/assets/"]) {
+ const index = pathname.indexOf(marker);
+ if (index >= 0) return pathname.slice(index);
+ }
+ return pathname;
+}
+
function initializeIndex(db: Database): void {
db.exec(`
PRAGMA journal_mode = WAL;
diff --git a/scripts/verify-web-probe-sentinel-monitor-web.ts b/scripts/verify-web-probe-sentinel-monitor-web.ts
new file mode 100644
index 00000000..e8a5099a
--- /dev/null
+++ b/scripts/verify-web-probe-sentinel-monitor-web.ts
@@ -0,0 +1,68 @@
+import { readFileSync, statSync } from "node:fs";
+import { rootPath } from "./src/config";
+
+const checks: Array<{ readonly path: string; readonly contains: readonly string[]; readonly minBytes: number }> = [
+ {
+ path: "scripts/assets/web-probe-sentinel-monitor-web/monitor-web.js",
+ minBytes: 8_000,
+ contains: [
+ "createApp",
+ "/api/overview",
+ "data-monitor-trend-curve",
+ "data-monitor-independent-scroll",
+ "rootCause",
+ ],
+ },
+ {
+ path: "scripts/assets/web-probe-sentinel-monitor-web/monitor-web.css",
+ minBytes: 8_000,
+ contains: [
+ ".trend-stage",
+ ".workspace-grid",
+ "overflow: hidden",
+ "overflow: auto",
+ ".trend-red",
+ ".trend-warning",
+ ],
+ },
+ {
+ path: "scripts/assets/web-probe-sentinel-monitor-web/vendor/vue.runtime.esm-browser.prod.js",
+ minBytes: 80_000,
+ contains: ["createApp"],
+ },
+ {
+ path: "scripts/assets/web-probe-sentinel-monitor-web/vendor/VUE-LICENSE",
+ minBytes: 500,
+ contains: ["MIT License"],
+ },
+];
+
+const failures: string[] = [];
+for (const check of checks) {
+ const absolutePath = rootPath(check.path);
+ let text = "";
+ try {
+ const stat = statSync(absolutePath);
+ if (stat.size < check.minBytes) failures.push(`${check.path} is too small: ${stat.size} < ${check.minBytes}`);
+ text = readFileSync(absolutePath, "utf8");
+ } catch (error) {
+ failures.push(`${check.path} is missing: ${String(error)}`);
+ continue;
+ }
+ for (const needle of check.contains) {
+ if (!text.includes(needle)) failures.push(`${check.path} does not contain ${needle}`);
+ }
+}
+
+if (failures.length > 0) {
+ console.error(JSON.stringify({ ok: false, component: "web-probe-sentinel-monitor-web", failures, valuesRedacted: true }, null, 2));
+ process.exit(1);
+}
+
+console.log(JSON.stringify({
+ ok: true,
+ component: "web-probe-sentinel-monitor-web",
+ stack: "vue3-vendored-runtime",
+ assets: checks.map((check) => check.path),
+ valuesRedacted: true,
+}));