Commit 19e23dff8b85a19563c296528d33654730be6f4a
1 parent
16dffe0a
h3-console: 合入服务器上的 React 新前端 + 挂出 API 文档/skill.md 链接
- 把服务器上的 frontend/(Vite+React 源码)和构建产物 static/index.html、server.py 的 /v1/videos/validate 拉回仓库,与本地合并;旧手写 index.html 被构建产物取代 - 新增 /docs/api.md、/skill.md 路由 + skill.md(面向外部调用方),侧栏加两个链接 - 把旧页面未提交的 localAsset 修复(上传 URL 写死内网 IP,跨网络打不开)移植进 React 源码 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Showing
22 changed files
with
4171 additions
and
1272 deletions
.gitignore
h3-console/frontend/index.html
0 → 100644
| 1 | +<!doctype html> | |
| 2 | +<html lang="zh"> | |
| 3 | + <head> | |
| 4 | + <meta charset="UTF-8" /> | |
| 5 | + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| 6 | + <title>H3 Console - AI Video Studio</title> | |
| 7 | + <script> | |
| 8 | + window.__H3_BASE__ = "__H3_BASE_PATH__"; | |
| 9 | + </script> | |
| 10 | + </head> | |
| 11 | + <body class="bg-slate-50 text-slate-800 antialiased overflow-hidden"> | |
| 12 | + <div id="root"></div> | |
| 13 | + <script type="module" src="/src/main.jsx"></script> | |
| 14 | + </body> | |
| 15 | +</html> | ... | ... |
h3-console/frontend/package.json
0 → 100644
| 1 | +{ | |
| 2 | + "name": "h3-console-ui", | |
| 3 | + "version": "1.0.0", | |
| 4 | + "private": true, | |
| 5 | + "type": "module", | |
| 6 | + "scripts": { | |
| 7 | + "build": "vite build" | |
| 8 | + }, | |
| 9 | + "dependencies": { | |
| 10 | + "clsx": "^2.1.1", | |
| 11 | + "lucide-react": "^1.16.0", | |
| 12 | + "react": "^19.0.0", | |
| 13 | + "react-dom": "^19.0.0", | |
| 14 | + "tailwind-merge": "^3.0.2" | |
| 15 | + }, | |
| 16 | + "devDependencies": { | |
| 17 | + "@tailwindcss/vite": "^4.0.9", | |
| 18 | + "@vitejs/plugin-react": "^4.3.4", | |
| 19 | + "tailwindcss": "^4.0.9", | |
| 20 | + "vite": "^6.2.0", | |
| 21 | + "vite-plugin-singlefile": "^2.1.0" | |
| 22 | + } | |
| 23 | +} | ... | ... |
h3-console/frontend/pnpm-lock.yaml
0 → 100644
| 1 | +lockfileVersion: '9.0' | |
| 2 | + | |
| 3 | +settings: | |
| 4 | + autoInstallPeers: true | |
| 5 | + excludeLinksFromLockfile: false | |
| 6 | + | |
| 7 | +importers: | |
| 8 | + | |
| 9 | + .: | |
| 10 | + dependencies: | |
| 11 | + clsx: | |
| 12 | + specifier: ^2.1.1 | |
| 13 | + version: 2.1.1 | |
| 14 | + lucide-react: | |
| 15 | + specifier: ^1.16.0 | |
| 16 | + version: 1.64.0(react@19.3.1) | |
| 17 | + react: | |
| 18 | + specifier: ^19.0.0 | |
| 19 | + version: 19.3.1 | |
| 20 | + react-dom: | |
| 21 | + specifier: ^19.0.0 | |
| 22 | + version: 19.3.1(react@19.3.1) | |
| 23 | + tailwind-merge: | |
| 24 | + specifier: ^3.0.2 | |
| 25 | + version: 3.7.0 | |
| 26 | + devDependencies: | |
| 27 | + '@tailwindcss/vite': | |
| 28 | + specifier: ^4.0.9 | |
| 29 | + version: 4.3.3(vite@6.4.5(jiti@2.7.0)(lightningcss@1.32.0)) | |
| 30 | + '@vitejs/plugin-react': | |
| 31 | + specifier: ^4.3.4 | |
| 32 | + version: 4.7.0(vite@6.4.5(jiti@2.7.0)(lightningcss@1.32.0)) | |
| 33 | + tailwindcss: | |
| 34 | + specifier: ^4.0.9 | |
| 35 | + version: 4.3.3 | |
| 36 | + vite: | |
| 37 | + specifier: ^6.2.0 | |
| 38 | + version: 6.4.5(jiti@2.7.0)(lightningcss@1.32.0) | |
| 39 | + vite-plugin-singlefile: | |
| 40 | + specifier: ^2.1.0 | |
| 41 | + version: 2.3.4(rollup@4.66.0)(vite@6.4.5(jiti@2.7.0)(lightningcss@1.32.0)) | |
| 42 | + | |
| 43 | +packages: | |
| 44 | + | |
| 45 | + '@babel/code-frame@7.29.7': | |
| 46 | + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} | |
| 47 | + engines: {node: '>=6.9.0'} | |
| 48 | + | |
| 49 | + '@babel/compat-data@7.29.7': | |
| 50 | + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} | |
| 51 | + engines: {node: '>=6.9.0'} | |
| 52 | + | |
| 53 | + '@babel/core@7.29.7': | |
| 54 | + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} | |
| 55 | + engines: {node: '>=6.9.0'} | |
| 56 | + | |
| 57 | + '@babel/generator@7.29.8': | |
| 58 | + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} | |
| 59 | + engines: {node: '>=6.9.0'} | |
| 60 | + | |
| 61 | + '@babel/helper-compilation-targets@7.29.7': | |
| 62 | + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} | |
| 63 | + engines: {node: '>=6.9.0'} | |
| 64 | + | |
| 65 | + '@babel/helper-globals@7.29.7': | |
| 66 | + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} | |
| 67 | + engines: {node: '>=6.9.0'} | |
| 68 | + | |
| 69 | + '@babel/helper-module-imports@7.29.7': | |
| 70 | + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} | |
| 71 | + engines: {node: '>=6.9.0'} | |
| 72 | + | |
| 73 | + '@babel/helper-module-transforms@7.29.7': | |
| 74 | + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} | |
| 75 | + engines: {node: '>=6.9.0'} | |
| 76 | + peerDependencies: | |
| 77 | + '@babel/core': ^7.0.0 | |
| 78 | + | |
| 79 | + '@babel/helper-plugin-utils@7.29.7': | |
| 80 | + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} | |
| 81 | + engines: {node: '>=6.9.0'} | |
| 82 | + | |
| 83 | + '@babel/helper-string-parser@7.29.11': | |
| 84 | + resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==} | |
| 85 | + engines: {node: '>=6.9.0'} | |
| 86 | + | |
| 87 | + '@babel/helper-validator-identifier@7.29.7': | |
| 88 | + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} | |
| 89 | + engines: {node: '>=6.9.0'} | |
| 90 | + | |
| 91 | + '@babel/helper-validator-option@7.29.7': | |
| 92 | + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} | |
| 93 | + engines: {node: '>=6.9.0'} | |
| 94 | + | |
| 95 | + '@babel/helpers@7.29.10': | |
| 96 | + resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==} | |
| 97 | + engines: {node: '>=6.9.0'} | |
| 98 | + | |
| 99 | + '@babel/parser@7.29.11': | |
| 100 | + resolution: {integrity: sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==} | |
| 101 | + engines: {node: '>=6.0.0'} | |
| 102 | + hasBin: true | |
| 103 | + | |
| 104 | + '@babel/plugin-transform-react-jsx-self@7.29.7': | |
| 105 | + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} | |
| 106 | + engines: {node: '>=6.9.0'} | |
| 107 | + peerDependencies: | |
| 108 | + '@babel/core': ^7.0.0-0 | |
| 109 | + | |
| 110 | + '@babel/plugin-transform-react-jsx-source@7.29.7': | |
| 111 | + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} | |
| 112 | + engines: {node: '>=6.9.0'} | |
| 113 | + peerDependencies: | |
| 114 | + '@babel/core': ^7.0.0-0 | |
| 115 | + | |
| 116 | + '@babel/template@7.29.7': | |
| 117 | + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} | |
| 118 | + engines: {node: '>=6.9.0'} | |
| 119 | + | |
| 120 | + '@babel/traverse@7.29.10': | |
| 121 | + resolution: {integrity: sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==} | |
| 122 | + engines: {node: '>=6.9.0'} | |
| 123 | + | |
| 124 | + '@babel/types@7.29.11': | |
| 125 | + resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} | |
| 126 | + engines: {node: '>=6.9.0'} | |
| 127 | + | |
| 128 | + '@esbuild/aix-ppc64@0.25.12': | |
| 129 | + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} | |
| 130 | + engines: {node: '>=18'} | |
| 131 | + cpu: [ppc64] | |
| 132 | + os: [aix] | |
| 133 | + | |
| 134 | + '@esbuild/android-arm64@0.25.12': | |
| 135 | + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} | |
| 136 | + engines: {node: '>=18'} | |
| 137 | + cpu: [arm64] | |
| 138 | + os: [android] | |
| 139 | + | |
| 140 | + '@esbuild/android-arm@0.25.12': | |
| 141 | + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} | |
| 142 | + engines: {node: '>=18'} | |
| 143 | + cpu: [arm] | |
| 144 | + os: [android] | |
| 145 | + | |
| 146 | + '@esbuild/android-x64@0.25.12': | |
| 147 | + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} | |
| 148 | + engines: {node: '>=18'} | |
| 149 | + cpu: [x64] | |
| 150 | + os: [android] | |
| 151 | + | |
| 152 | + '@esbuild/darwin-arm64@0.25.12': | |
| 153 | + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} | |
| 154 | + engines: {node: '>=18'} | |
| 155 | + cpu: [arm64] | |
| 156 | + os: [darwin] | |
| 157 | + | |
| 158 | + '@esbuild/darwin-x64@0.25.12': | |
| 159 | + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} | |
| 160 | + engines: {node: '>=18'} | |
| 161 | + cpu: [x64] | |
| 162 | + os: [darwin] | |
| 163 | + | |
| 164 | + '@esbuild/freebsd-arm64@0.25.12': | |
| 165 | + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} | |
| 166 | + engines: {node: '>=18'} | |
| 167 | + cpu: [arm64] | |
| 168 | + os: [freebsd] | |
| 169 | + | |
| 170 | + '@esbuild/freebsd-x64@0.25.12': | |
| 171 | + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} | |
| 172 | + engines: {node: '>=18'} | |
| 173 | + cpu: [x64] | |
| 174 | + os: [freebsd] | |
| 175 | + | |
| 176 | + '@esbuild/linux-arm64@0.25.12': | |
| 177 | + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} | |
| 178 | + engines: {node: '>=18'} | |
| 179 | + cpu: [arm64] | |
| 180 | + os: [linux] | |
| 181 | + | |
| 182 | + '@esbuild/linux-arm@0.25.12': | |
| 183 | + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} | |
| 184 | + engines: {node: '>=18'} | |
| 185 | + cpu: [arm] | |
| 186 | + os: [linux] | |
| 187 | + | |
| 188 | + '@esbuild/linux-ia32@0.25.12': | |
| 189 | + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} | |
| 190 | + engines: {node: '>=18'} | |
| 191 | + cpu: [ia32] | |
| 192 | + os: [linux] | |
| 193 | + | |
| 194 | + '@esbuild/linux-loong64@0.25.12': | |
| 195 | + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} | |
| 196 | + engines: {node: '>=18'} | |
| 197 | + cpu: [loong64] | |
| 198 | + os: [linux] | |
| 199 | + | |
| 200 | + '@esbuild/linux-mips64el@0.25.12': | |
| 201 | + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} | |
| 202 | + engines: {node: '>=18'} | |
| 203 | + cpu: [mips64el] | |
| 204 | + os: [linux] | |
| 205 | + | |
| 206 | + '@esbuild/linux-ppc64@0.25.12': | |
| 207 | + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} | |
| 208 | + engines: {node: '>=18'} | |
| 209 | + cpu: [ppc64] | |
| 210 | + os: [linux] | |
| 211 | + | |
| 212 | + '@esbuild/linux-riscv64@0.25.12': | |
| 213 | + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} | |
| 214 | + engines: {node: '>=18'} | |
| 215 | + cpu: [riscv64] | |
| 216 | + os: [linux] | |
| 217 | + | |
| 218 | + '@esbuild/linux-s390x@0.25.12': | |
| 219 | + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} | |
| 220 | + engines: {node: '>=18'} | |
| 221 | + cpu: [s390x] | |
| 222 | + os: [linux] | |
| 223 | + | |
| 224 | + '@esbuild/linux-x64@0.25.12': | |
| 225 | + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} | |
| 226 | + engines: {node: '>=18'} | |
| 227 | + cpu: [x64] | |
| 228 | + os: [linux] | |
| 229 | + | |
| 230 | + '@esbuild/netbsd-arm64@0.25.12': | |
| 231 | + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} | |
| 232 | + engines: {node: '>=18'} | |
| 233 | + cpu: [arm64] | |
| 234 | + os: [netbsd] | |
| 235 | + | |
| 236 | + '@esbuild/netbsd-x64@0.25.12': | |
| 237 | + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} | |
| 238 | + engines: {node: '>=18'} | |
| 239 | + cpu: [x64] | |
| 240 | + os: [netbsd] | |
| 241 | + | |
| 242 | + '@esbuild/openbsd-arm64@0.25.12': | |
| 243 | + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} | |
| 244 | + engines: {node: '>=18'} | |
| 245 | + cpu: [arm64] | |
| 246 | + os: [openbsd] | |
| 247 | + | |
| 248 | + '@esbuild/openbsd-x64@0.25.12': | |
| 249 | + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} | |
| 250 | + engines: {node: '>=18'} | |
| 251 | + cpu: [x64] | |
| 252 | + os: [openbsd] | |
| 253 | + | |
| 254 | + '@esbuild/openharmony-arm64@0.25.12': | |
| 255 | + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} | |
| 256 | + engines: {node: '>=18'} | |
| 257 | + cpu: [arm64] | |
| 258 | + os: [openharmony] | |
| 259 | + | |
| 260 | + '@esbuild/sunos-x64@0.25.12': | |
| 261 | + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} | |
| 262 | + engines: {node: '>=18'} | |
| 263 | + cpu: [x64] | |
| 264 | + os: [sunos] | |
| 265 | + | |
| 266 | + '@esbuild/win32-arm64@0.25.12': | |
| 267 | + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} | |
| 268 | + engines: {node: '>=18'} | |
| 269 | + cpu: [arm64] | |
| 270 | + os: [win32] | |
| 271 | + | |
| 272 | + '@esbuild/win32-ia32@0.25.12': | |
| 273 | + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} | |
| 274 | + engines: {node: '>=18'} | |
| 275 | + cpu: [ia32] | |
| 276 | + os: [win32] | |
| 277 | + | |
| 278 | + '@esbuild/win32-x64@0.25.12': | |
| 279 | + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} | |
| 280 | + engines: {node: '>=18'} | |
| 281 | + cpu: [x64] | |
| 282 | + os: [win32] | |
| 283 | + | |
| 284 | + '@jridgewell/gen-mapping@0.3.13': | |
| 285 | + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} | |
| 286 | + | |
| 287 | + '@jridgewell/remapping@2.3.5': | |
| 288 | + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} | |
| 289 | + | |
| 290 | + '@jridgewell/resolve-uri@3.1.2': | |
| 291 | + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} | |
| 292 | + engines: {node: '>=6.0.0'} | |
| 293 | + | |
| 294 | + '@jridgewell/sourcemap-codec@1.6.0': | |
| 295 | + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} | |
| 296 | + | |
| 297 | + '@jridgewell/trace-mapping@0.3.31': | |
| 298 | + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} | |
| 299 | + | |
| 300 | + '@napi-rs/lzma-linux-x64-gnu@1.5.1': | |
| 301 | + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} | |
| 302 | + engines: {node: ^22.20 || ^24.12 || >=25} | |
| 303 | + cpu: [x64] | |
| 304 | + os: [linux] | |
| 305 | + libc: [glibc] | |
| 306 | + | |
| 307 | + '@rolldown/pluginutils@1.0.0-beta.27': | |
| 308 | + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} | |
| 309 | + | |
| 310 | + '@rollup/rollup-android-arm-eabi@4.66.0': | |
| 311 | + resolution: {integrity: sha512-7y4XeoUHPecjfUDRmap8U0q6bjfLAPn7uOGT8BKyqy8uNDOjsGS8rlBhOx6sZLVwwjN6hapvGl2mW9/IS6UNww==} | |
| 312 | + cpu: [arm] | |
| 313 | + os: [android] | |
| 314 | + | |
| 315 | + '@rollup/rollup-android-arm64@4.66.0': | |
| 316 | + resolution: {integrity: sha512-e8WugYZXpgqrlMXLCudYVRAxAcK7AIY36JxRDwFRD38L9q62G1VsEUW6ijXxzjxYjNB8i1zo3B/ycIQ/qjLC/Q==} | |
| 317 | + cpu: [arm64] | |
| 318 | + os: [android] | |
| 319 | + | |
| 320 | + '@rollup/rollup-darwin-arm64@4.66.0': | |
| 321 | + resolution: {integrity: sha512-6vkDCfyDjNLokh+Rt1D2KtNgFFMEPdkWha/mbtP4cSjh9xiN8T/JBS/A7nDYKjmMAXHrvR9J3AzUk2LtFbIBLg==} | |
| 322 | + cpu: [arm64] | |
| 323 | + os: [darwin] | |
| 324 | + | |
| 325 | + '@rollup/rollup-darwin-x64@4.66.0': | |
| 326 | + resolution: {integrity: sha512-/mzZAX0+Q6eXxvkR0HB0RZCCrsbmFD8DpsvCQoMYABDfq/DjqkbfytuJ7GvZ4AhR/Mgis2fXbZrGqfbcK2Z5fA==} | |
| 327 | + cpu: [x64] | |
| 328 | + os: [darwin] | |
| 329 | + | |
| 330 | + '@rollup/rollup-freebsd-arm64@4.66.0': | |
| 331 | + resolution: {integrity: sha512-JQJx9E8tUjGqed1RevDmoHaS3V30ODdV8uyvGxlwd4K5se6bkPrMeltSybqAtpJ+ltDRfo7FORQaJG2Hd5nGog==} | |
| 332 | + cpu: [arm64] | |
| 333 | + os: [freebsd] | |
| 334 | + | |
| 335 | + '@rollup/rollup-freebsd-x64@4.66.0': | |
| 336 | + resolution: {integrity: sha512-GEaUQQjMaG7X1304qMgqLjzCKv6CdDirzJSS+UqUs3xhJ9X2Kjzu0JDbLoUU42FWxwmZqz+SsgU1SlQv9GNRVA==} | |
| 337 | + cpu: [x64] | |
| 338 | + os: [freebsd] | |
| 339 | + | |
| 340 | + '@rollup/rollup-linux-arm-gnueabihf@4.66.0': | |
| 341 | + resolution: {integrity: sha512-DgmAU9N0NhDQDzHgFUocDio7zRO8jR/nY/obDGvCR8zbJ6J77Fg6X49yPuExJUpYPbC82EOaRhG969pWzUSnHQ==} | |
| 342 | + cpu: [arm] | |
| 343 | + os: [linux] | |
| 344 | + libc: [glibc] | |
| 345 | + | |
| 346 | + '@rollup/rollup-linux-arm-musleabihf@4.66.0': | |
| 347 | + resolution: {integrity: sha512-zG09YZ+sk/HoHq+P9gYB0EseQ3M20RbDuKGWey6fbiMDV1LxfXvhgSW9jDaCcvFPMgfLXpimzXY+UYvA8R2mLQ==} | |
| 348 | + cpu: [arm] | |
| 349 | + os: [linux] | |
| 350 | + libc: [musl] | |
| 351 | + | |
| 352 | + '@rollup/rollup-linux-arm64-gnu@4.66.0': | |
| 353 | + resolution: {integrity: sha512-vlArhgyXbcVc1D4WZPoiYuqJIaMiSHBj6etRXua0KlfjlZeuiQyVAPYi0/N49O4mSp3u1iGUBLEjNa8ec81XZg==} | |
| 354 | + cpu: [arm64] | |
| 355 | + os: [linux] | |
| 356 | + libc: [glibc] | |
| 357 | + | |
| 358 | + '@rollup/rollup-linux-arm64-musl@4.66.0': | |
| 359 | + resolution: {integrity: sha512-RxJZtk0G87YPotDaRDvRqStV8cbqLSC5TroHvQHHKsqBg0ok64RxKgtXeFsa7FBcy7mb4crBrG3xK8USWIqWNA==} | |
| 360 | + cpu: [arm64] | |
| 361 | + os: [linux] | |
| 362 | + libc: [musl] | |
| 363 | + | |
| 364 | + '@rollup/rollup-linux-loong64-gnu@4.66.0': | |
| 365 | + resolution: {integrity: sha512-qlGcw959PrLLkZhiBxF3OZ6SQvj+OKY85mCqGNgSRs4LZlDJ6ICqmz6UdxtINdhcXYwNIbZoapQVBAmZlD2hUQ==} | |
| 366 | + cpu: [loong64] | |
| 367 | + os: [linux] | |
| 368 | + libc: [glibc] | |
| 369 | + | |
| 370 | + '@rollup/rollup-linux-loong64-musl@4.66.0': | |
| 371 | + resolution: {integrity: sha512-TvTI/7Cy0WvRA1SXgwzu6bwXBnMpmeT/ln5q7WvSpqmXy1VbmEnY8HVIDQNBiaHJvoWqRr0M4FNo7qiqtyMaFw==} | |
| 372 | + cpu: [loong64] | |
| 373 | + os: [linux] | |
| 374 | + libc: [musl] | |
| 375 | + | |
| 376 | + '@rollup/rollup-linux-ppc64-gnu@4.66.0': | |
| 377 | + resolution: {integrity: sha512-UZEDkSoDRZ50NyLj70nO6mpIK3dvs2cPTTvQb1bA/PBDmr9fvn5KiESuGfh6srd7Zi6Lt9Sv2sVrFr1QoHLvPQ==} | |
| 378 | + cpu: [ppc64] | |
| 379 | + os: [linux] | |
| 380 | + libc: [glibc] | |
| 381 | + | |
| 382 | + '@rollup/rollup-linux-ppc64-musl@4.66.0': | |
| 383 | + resolution: {integrity: sha512-VRbxTvagLh3HRcysx1CNq+HHcvJbSebNI6fCbk7jwmmWHkXjrSIV3igXBpRHUTFdg0pagWGu50xoSZXnrZHjVQ==} | |
| 384 | + cpu: [ppc64] | |
| 385 | + os: [linux] | |
| 386 | + libc: [musl] | |
| 387 | + | |
| 388 | + '@rollup/rollup-linux-riscv64-gnu@4.66.0': | |
| 389 | + resolution: {integrity: sha512-uWdJpvYqh0LE/i+YBL3sMX0a2kUkICENjmrPmyBmMOFc3jMrs6MSQH/pMD+VIpGEoUcr3XkHGLLfymzIqPSRRg==} | |
| 390 | + cpu: [riscv64] | |
| 391 | + os: [linux] | |
| 392 | + libc: [glibc] | |
| 393 | + | |
| 394 | + '@rollup/rollup-linux-riscv64-musl@4.66.0': | |
| 395 | + resolution: {integrity: sha512-3FUd88pxgWAjK60OgCrika1AcNG+u8zaCdWjg4TlcZTDkt5TGyci8ZU64l3OJ9ax0MEjw3P80B/3PoSQDCLwJQ==} | |
| 396 | + cpu: [riscv64] | |
| 397 | + os: [linux] | |
| 398 | + libc: [musl] | |
| 399 | + | |
| 400 | + '@rollup/rollup-linux-s390x-gnu@4.66.0': | |
| 401 | + resolution: {integrity: sha512-qT2rMmgyej62g5AdwktK+Bt2lBu497pzWZe12TTQ5JmZjOYPnEwcPEAOSLTBxBV+6gIES75rXm219v/QkT397A==} | |
| 402 | + cpu: [s390x] | |
| 403 | + os: [linux] | |
| 404 | + libc: [glibc] | |
| 405 | + | |
| 406 | + '@rollup/rollup-linux-x64-gnu@4.66.0': | |
| 407 | + resolution: {integrity: sha512-E46rnZgp7J84Qwe8RMlF+rgimnDo/9fuiGbUArGB0ZkMWf97O7yeSCfKls5x/YJOF0RcuSe9RctuKe1hlxICiA==} | |
| 408 | + cpu: [x64] | |
| 409 | + os: [linux] | |
| 410 | + libc: [glibc] | |
| 411 | + | |
| 412 | + '@rollup/rollup-linux-x64-musl@4.66.0': | |
| 413 | + resolution: {integrity: sha512-Uz1HiZe+qBzqgdPsON+z0wRx3WdATuyzwvGT6cr2VZVrqqko0ZJVfkrQJtwDMuDcAfXYdo7XucaxJ7lTLjEcgg==} | |
| 414 | + cpu: [x64] | |
| 415 | + os: [linux] | |
| 416 | + libc: [musl] | |
| 417 | + | |
| 418 | + '@rollup/rollup-openbsd-x64@4.66.0': | |
| 419 | + resolution: {integrity: sha512-Ph7TX3Ex5qdfcb7Tc6eEPugVkRfJ501eTovO4T5029YObfpZ7dzn3RiwpFvGp50nk2QUhvBMZ0PFGlEj6pOYTg==} | |
| 420 | + cpu: [x64] | |
| 421 | + os: [openbsd] | |
| 422 | + | |
| 423 | + '@rollup/rollup-openharmony-arm64@4.66.0': | |
| 424 | + resolution: {integrity: sha512-nZYPEya7ZkeNxUEiF7qmNZbyLTyRN3MK5cO22KqsaoneUzXJuzBIQRw+7BEQy9LGj2O5vrCE9V3EpK06FYo1tQ==} | |
| 425 | + cpu: [arm64] | |
| 426 | + os: [openharmony] | |
| 427 | + | |
| 428 | + '@rollup/rollup-win32-arm64-msvc@4.66.0': | |
| 429 | + resolution: {integrity: sha512-u7aTfS3R6C4hRsqXSzaO6qLZYLVuMkHMvcWlux4IM8IJif1VCl2cgPBSo5gSNoFoStQypQP+qwq8W1IyFBf1QQ==} | |
| 430 | + cpu: [arm64] | |
| 431 | + os: [win32] | |
| 432 | + | |
| 433 | + '@rollup/rollup-win32-ia32-msvc@4.66.0': | |
| 434 | + resolution: {integrity: sha512-e+i9ueHrH1Bafb0cf0woAIVJbYcoC8vRaD+vz+Xi8w6jz9cYJSV3vyKO6ELGSZ6g4W4MJOm2WPLN4/nQf77h7w==} | |
| 435 | + cpu: [ia32] | |
| 436 | + os: [win32] | |
| 437 | + | |
| 438 | + '@rollup/rollup-win32-x64-gnu@4.66.0': | |
| 439 | + resolution: {integrity: sha512-KfTCbrtr2zXTqH2E1F+uYlFTrYibxHKqPAHobpd8Kfg49cEHmuHebOidCTDRgqG1suaPFX7oejFQeGE71zWKfA==} | |
| 440 | + cpu: [x64] | |
| 441 | + os: [win32] | |
| 442 | + | |
| 443 | + '@rollup/rollup-win32-x64-msvc@4.66.0': | |
| 444 | + resolution: {integrity: sha512-xA+neBh1bqkqaS3b48T2UHZnDsTIpb9B0h+TdBzynjF/ymCpYndhfY10RqW0qSKB1HqqQA83mINVhAdwA+mETg==} | |
| 445 | + cpu: [x64] | |
| 446 | + os: [win32] | |
| 447 | + | |
| 448 | + '@tailwindcss/node@4.3.3': | |
| 449 | + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} | |
| 450 | + | |
| 451 | + '@tailwindcss/oxide-android-arm64@4.3.3': | |
| 452 | + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} | |
| 453 | + engines: {node: '>= 20'} | |
| 454 | + cpu: [arm64] | |
| 455 | + os: [android] | |
| 456 | + | |
| 457 | + '@tailwindcss/oxide-darwin-arm64@4.3.3': | |
| 458 | + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} | |
| 459 | + engines: {node: '>= 20'} | |
| 460 | + cpu: [arm64] | |
| 461 | + os: [darwin] | |
| 462 | + | |
| 463 | + '@tailwindcss/oxide-darwin-x64@4.3.3': | |
| 464 | + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} | |
| 465 | + engines: {node: '>= 20'} | |
| 466 | + cpu: [x64] | |
| 467 | + os: [darwin] | |
| 468 | + | |
| 469 | + '@tailwindcss/oxide-freebsd-x64@4.3.3': | |
| 470 | + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} | |
| 471 | + engines: {node: '>= 20'} | |
| 472 | + cpu: [x64] | |
| 473 | + os: [freebsd] | |
| 474 | + | |
| 475 | + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': | |
| 476 | + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} | |
| 477 | + engines: {node: '>= 20'} | |
| 478 | + cpu: [arm] | |
| 479 | + os: [linux] | |
| 480 | + | |
| 481 | + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': | |
| 482 | + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} | |
| 483 | + engines: {node: '>= 20'} | |
| 484 | + cpu: [arm64] | |
| 485 | + os: [linux] | |
| 486 | + libc: [glibc] | |
| 487 | + | |
| 488 | + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': | |
| 489 | + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} | |
| 490 | + engines: {node: '>= 20'} | |
| 491 | + cpu: [arm64] | |
| 492 | + os: [linux] | |
| 493 | + libc: [musl] | |
| 494 | + | |
| 495 | + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': | |
| 496 | + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} | |
| 497 | + engines: {node: '>= 20'} | |
| 498 | + cpu: [x64] | |
| 499 | + os: [linux] | |
| 500 | + libc: [glibc] | |
| 501 | + | |
| 502 | + '@tailwindcss/oxide-linux-x64-musl@4.3.3': | |
| 503 | + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} | |
| 504 | + engines: {node: '>= 20'} | |
| 505 | + cpu: [x64] | |
| 506 | + os: [linux] | |
| 507 | + libc: [musl] | |
| 508 | + | |
| 509 | + '@tailwindcss/oxide-wasm32-wasi@4.3.3': | |
| 510 | + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} | |
| 511 | + engines: {node: '>=14.0.0'} | |
| 512 | + cpu: [wasm32] | |
| 513 | + bundledDependencies: | |
| 514 | + - '@napi-rs/wasm-runtime' | |
| 515 | + - '@emnapi/core' | |
| 516 | + - '@emnapi/runtime' | |
| 517 | + - '@tybys/wasm-util' | |
| 518 | + - '@emnapi/wasi-threads' | |
| 519 | + - tslib | |
| 520 | + | |
| 521 | + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': | |
| 522 | + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} | |
| 523 | + engines: {node: '>= 20'} | |
| 524 | + cpu: [arm64] | |
| 525 | + os: [win32] | |
| 526 | + | |
| 527 | + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': | |
| 528 | + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} | |
| 529 | + engines: {node: '>= 20'} | |
| 530 | + cpu: [x64] | |
| 531 | + os: [win32] | |
| 532 | + | |
| 533 | + '@tailwindcss/oxide@4.3.3': | |
| 534 | + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} | |
| 535 | + engines: {node: '>= 20'} | |
| 536 | + | |
| 537 | + '@tailwindcss/vite@4.3.3': | |
| 538 | + resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} | |
| 539 | + peerDependencies: | |
| 540 | + vite: ^5.2.0 || ^6 || ^7 || ^8 | |
| 541 | + | |
| 542 | + '@types/babel__core@7.20.5': | |
| 543 | + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} | |
| 544 | + | |
| 545 | + '@types/babel__generator@7.27.0': | |
| 546 | + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} | |
| 547 | + | |
| 548 | + '@types/babel__template@7.4.4': | |
| 549 | + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} | |
| 550 | + | |
| 551 | + '@types/babel__traverse@7.28.0': | |
| 552 | + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} | |
| 553 | + | |
| 554 | + '@types/estree@1.0.9': | |
| 555 | + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} | |
| 556 | + | |
| 557 | + '@vitejs/plugin-react@4.7.0': | |
| 558 | + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} | |
| 559 | + engines: {node: ^14.18.0 || >=16.0.0} | |
| 560 | + peerDependencies: | |
| 561 | + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 | |
| 562 | + | |
| 563 | + baseline-browser-mapping@2.11.34: | |
| 564 | + resolution: {integrity: sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==} | |
| 565 | + engines: {node: '>=6.0.0'} | |
| 566 | + hasBin: true | |
| 567 | + | |
| 568 | + browserslist@4.29.5: | |
| 569 | + resolution: {integrity: sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==} | |
| 570 | + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} | |
| 571 | + hasBin: true | |
| 572 | + | |
| 573 | + caniuse-lite@1.0.30001820: | |
| 574 | + resolution: {integrity: sha512-gfWD6MxqVCqAOwmODfZf7DchWvlrA+SRdNX7ceLfg3xRqe5ssjjpF7EgslC/0tiLiNTajdaNN/q8c/5u/7Gz8w==} | |
| 575 | + | |
| 576 | + clsx@2.1.1: | |
| 577 | + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} | |
| 578 | + engines: {node: '>=6'} | |
| 579 | + | |
| 580 | + convert-source-map@2.0.0: | |
| 581 | + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} | |
| 582 | + | |
| 583 | + debug@4.4.3: | |
| 584 | + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} | |
| 585 | + engines: {node: '>=6.0'} | |
| 586 | + peerDependencies: | |
| 587 | + supports-color: '*' | |
| 588 | + peerDependenciesMeta: | |
| 589 | + supports-color: | |
| 590 | + optional: true | |
| 591 | + | |
| 592 | + detect-libc@2.1.2: | |
| 593 | + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} | |
| 594 | + engines: {node: '>=8'} | |
| 595 | + | |
| 596 | + electron-to-chromium@1.5.467: | |
| 597 | + resolution: {integrity: sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==} | |
| 598 | + | |
| 599 | + enhanced-resolve@5.26.0: | |
| 600 | + resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} | |
| 601 | + engines: {node: '>=10.13.0'} | |
| 602 | + | |
| 603 | + esbuild@0.25.12: | |
| 604 | + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} | |
| 605 | + engines: {node: '>=18'} | |
| 606 | + hasBin: true | |
| 607 | + | |
| 608 | + escalade@3.2.0: | |
| 609 | + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} | |
| 610 | + engines: {node: '>=6'} | |
| 611 | + | |
| 612 | + fdir@6.5.0: | |
| 613 | + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} | |
| 614 | + engines: {node: '>=12.0.0'} | |
| 615 | + peerDependencies: | |
| 616 | + picomatch: ^3 || ^4 | |
| 617 | + peerDependenciesMeta: | |
| 618 | + picomatch: | |
| 619 | + optional: true | |
| 620 | + | |
| 621 | + fsevents@2.3.3: | |
| 622 | + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} | |
| 623 | + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} | |
| 624 | + os: [darwin] | |
| 625 | + | |
| 626 | + gensync@1.0.0-beta.2: | |
| 627 | + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} | |
| 628 | + engines: {node: '>=6.9.0'} | |
| 629 | + | |
| 630 | + graceful-fs@4.2.11: | |
| 631 | + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} | |
| 632 | + | |
| 633 | + jiti@2.7.0: | |
| 634 | + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} | |
| 635 | + hasBin: true | |
| 636 | + | |
| 637 | + js-tokens@4.0.0: | |
| 638 | + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} | |
| 639 | + | |
| 640 | + jsesc@3.1.0: | |
| 641 | + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} | |
| 642 | + engines: {node: '>=6'} | |
| 643 | + hasBin: true | |
| 644 | + | |
| 645 | + json5@2.2.3: | |
| 646 | + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} | |
| 647 | + engines: {node: '>=6'} | |
| 648 | + hasBin: true | |
| 649 | + | |
| 650 | + lightningcss-android-arm64@1.32.0: | |
| 651 | + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} | |
| 652 | + engines: {node: '>= 12.0.0'} | |
| 653 | + cpu: [arm64] | |
| 654 | + os: [android] | |
| 655 | + | |
| 656 | + lightningcss-darwin-arm64@1.32.0: | |
| 657 | + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} | |
| 658 | + engines: {node: '>= 12.0.0'} | |
| 659 | + cpu: [arm64] | |
| 660 | + os: [darwin] | |
| 661 | + | |
| 662 | + lightningcss-darwin-x64@1.32.0: | |
| 663 | + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} | |
| 664 | + engines: {node: '>= 12.0.0'} | |
| 665 | + cpu: [x64] | |
| 666 | + os: [darwin] | |
| 667 | + | |
| 668 | + lightningcss-freebsd-x64@1.32.0: | |
| 669 | + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} | |
| 670 | + engines: {node: '>= 12.0.0'} | |
| 671 | + cpu: [x64] | |
| 672 | + os: [freebsd] | |
| 673 | + | |
| 674 | + lightningcss-linux-arm-gnueabihf@1.32.0: | |
| 675 | + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} | |
| 676 | + engines: {node: '>= 12.0.0'} | |
| 677 | + cpu: [arm] | |
| 678 | + os: [linux] | |
| 679 | + | |
| 680 | + lightningcss-linux-arm64-gnu@1.32.0: | |
| 681 | + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} | |
| 682 | + engines: {node: '>= 12.0.0'} | |
| 683 | + cpu: [arm64] | |
| 684 | + os: [linux] | |
| 685 | + libc: [glibc] | |
| 686 | + | |
| 687 | + lightningcss-linux-arm64-musl@1.32.0: | |
| 688 | + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} | |
| 689 | + engines: {node: '>= 12.0.0'} | |
| 690 | + cpu: [arm64] | |
| 691 | + os: [linux] | |
| 692 | + libc: [musl] | |
| 693 | + | |
| 694 | + lightningcss-linux-x64-gnu@1.32.0: | |
| 695 | + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} | |
| 696 | + engines: {node: '>= 12.0.0'} | |
| 697 | + cpu: [x64] | |
| 698 | + os: [linux] | |
| 699 | + libc: [glibc] | |
| 700 | + | |
| 701 | + lightningcss-linux-x64-musl@1.32.0: | |
| 702 | + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} | |
| 703 | + engines: {node: '>= 12.0.0'} | |
| 704 | + cpu: [x64] | |
| 705 | + os: [linux] | |
| 706 | + libc: [musl] | |
| 707 | + | |
| 708 | + lightningcss-win32-arm64-msvc@1.32.0: | |
| 709 | + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} | |
| 710 | + engines: {node: '>= 12.0.0'} | |
| 711 | + cpu: [arm64] | |
| 712 | + os: [win32] | |
| 713 | + | |
| 714 | + lightningcss-win32-x64-msvc@1.32.0: | |
| 715 | + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} | |
| 716 | + engines: {node: '>= 12.0.0'} | |
| 717 | + cpu: [x64] | |
| 718 | + os: [win32] | |
| 719 | + | |
| 720 | + lightningcss@1.32.0: | |
| 721 | + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} | |
| 722 | + engines: {node: '>= 12.0.0'} | |
| 723 | + | |
| 724 | + lru-cache@5.1.1: | |
| 725 | + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} | |
| 726 | + | |
| 727 | + lucide-react@1.64.0: | |
| 728 | + resolution: {integrity: sha512-v626F/bcLNvFom6vzztHILtG9tUgXXbgA5AGkd82YkV401+Ko/NHyrWafbPwGofa+6p/EgDJcvEkIwsMH9098w==} | |
| 729 | + peerDependencies: | |
| 730 | + '@types/react': '*' | |
| 731 | + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 | |
| 732 | + peerDependenciesMeta: | |
| 733 | + '@types/react': | |
| 734 | + optional: true | |
| 735 | + | |
| 736 | + magic-string@0.30.21: | |
| 737 | + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} | |
| 738 | + | |
| 739 | + ms@2.1.3: | |
| 740 | + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} | |
| 741 | + | |
| 742 | + nanoid@3.3.20: | |
| 743 | + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} | |
| 744 | + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} | |
| 745 | + hasBin: true | |
| 746 | + | |
| 747 | + node-releases@2.0.60: | |
| 748 | + resolution: {integrity: sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==} | |
| 749 | + engines: {node: '>=18'} | |
| 750 | + | |
| 751 | + picocolors@1.1.1: | |
| 752 | + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} | |
| 753 | + | |
| 754 | + picomatch@4.0.7: | |
| 755 | + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} | |
| 756 | + engines: {node: '>=12'} | |
| 757 | + | |
| 758 | + postcss@8.5.32: | |
| 759 | + resolution: {integrity: sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==} | |
| 760 | + engines: {node: ^10 || ^12 || >=14} | |
| 761 | + | |
| 762 | + react-dom@19.3.1: | |
| 763 | + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} | |
| 764 | + peerDependencies: | |
| 765 | + react: ^19.3.1 | |
| 766 | + | |
| 767 | + react-refresh@0.17.0: | |
| 768 | + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} | |
| 769 | + engines: {node: '>=0.10.0'} | |
| 770 | + | |
| 771 | + react@19.3.1: | |
| 772 | + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} | |
| 773 | + engines: {node: '>=0.10.0'} | |
| 774 | + | |
| 775 | + rollup@4.66.0: | |
| 776 | + resolution: {integrity: sha512-Onq6/qO4ARhxIs+jYiHE0pYehadLyMECAiGEqQ+0/aWND3+2PmifJIIqBLYtuBODqHTlOUEQFtIVPyCy0Lck7A==} | |
| 777 | + engines: {node: '>=18.0.0', npm: '>=8.0.0'} | |
| 778 | + hasBin: true | |
| 779 | + | |
| 780 | + scheduler@0.28.0: | |
| 781 | + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} | |
| 782 | + | |
| 783 | + semver@6.3.1: | |
| 784 | + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} | |
| 785 | + hasBin: true | |
| 786 | + | |
| 787 | + source-map-js@1.2.2: | |
| 788 | + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} | |
| 789 | + engines: {node: '>=0.10.0'} | |
| 790 | + | |
| 791 | + tailwind-merge@3.7.0: | |
| 792 | + resolution: {integrity: sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==} | |
| 793 | + | |
| 794 | + tailwindcss@4.3.3: | |
| 795 | + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} | |
| 796 | + | |
| 797 | + tapable@2.3.3: | |
| 798 | + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} | |
| 799 | + engines: {node: '>=6'} | |
| 800 | + | |
| 801 | + tinyglobby@0.2.17: | |
| 802 | + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} | |
| 803 | + engines: {node: '>=12.0.0'} | |
| 804 | + | |
| 805 | + update-browserslist-db@1.3.4: | |
| 806 | + resolution: {integrity: sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==} | |
| 807 | + hasBin: true | |
| 808 | + peerDependencies: | |
| 809 | + browserslist: '>= 4.21.0' | |
| 810 | + | |
| 811 | + vite-plugin-singlefile@2.3.4: | |
| 812 | + resolution: {integrity: sha512-1FAhlTCL6KJDpSUudrVU+gspapvS+tmKCg70vwNaAU6tyXn3E/C6+NnwQIze06byhBRv7VggZ78K0h+J/Rsdrg==} | |
| 813 | + engines: {node: '>18.0.0'} | |
| 814 | + peerDependencies: | |
| 815 | + rollup: ^4.59.0 | |
| 816 | + vite: ^5.4.21 || ^6.0.0 || ^7.0.0 || ^8.0.0 | |
| 817 | + peerDependenciesMeta: | |
| 818 | + rollup: | |
| 819 | + optional: true | |
| 820 | + | |
| 821 | + vite@6.4.5: | |
| 822 | + resolution: {integrity: sha512-4enwjFfi4IwtEh0w+jPzpLVOFQiPHmmzPxcHXQOyEur47o6u0jE573DmGpjA+7irXoMLYRZD5ZaFUEneS3abPg==} | |
| 823 | + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} | |
| 824 | + hasBin: true | |
| 825 | + peerDependencies: | |
| 826 | + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 | |
| 827 | + jiti: '>=1.21.0' | |
| 828 | + less: '*' | |
| 829 | + lightningcss: ^1.21.0 | |
| 830 | + sass: '*' | |
| 831 | + sass-embedded: '*' | |
| 832 | + stylus: '*' | |
| 833 | + sugarss: '*' | |
| 834 | + terser: ^5.16.0 | |
| 835 | + tsx: ^4.8.1 | |
| 836 | + yaml: ^2.4.2 | |
| 837 | + peerDependenciesMeta: | |
| 838 | + '@types/node': | |
| 839 | + optional: true | |
| 840 | + jiti: | |
| 841 | + optional: true | |
| 842 | + less: | |
| 843 | + optional: true | |
| 844 | + lightningcss: | |
| 845 | + optional: true | |
| 846 | + sass: | |
| 847 | + optional: true | |
| 848 | + sass-embedded: | |
| 849 | + optional: true | |
| 850 | + stylus: | |
| 851 | + optional: true | |
| 852 | + sugarss: | |
| 853 | + optional: true | |
| 854 | + terser: | |
| 855 | + optional: true | |
| 856 | + tsx: | |
| 857 | + optional: true | |
| 858 | + yaml: | |
| 859 | + optional: true | |
| 860 | + | |
| 861 | + yallist@3.1.1: | |
| 862 | + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} | |
| 863 | + | |
| 864 | +snapshots: | |
| 865 | + | |
| 866 | + '@babel/code-frame@7.29.7': | |
| 867 | + dependencies: | |
| 868 | + '@babel/helper-validator-identifier': 7.29.7 | |
| 869 | + js-tokens: 4.0.0 | |
| 870 | + picocolors: 1.1.1 | |
| 871 | + | |
| 872 | + '@babel/compat-data@7.29.7': {} | |
| 873 | + | |
| 874 | + '@babel/core@7.29.7': | |
| 875 | + dependencies: | |
| 876 | + '@babel/code-frame': 7.29.7 | |
| 877 | + '@babel/generator': 7.29.8 | |
| 878 | + '@babel/helper-compilation-targets': 7.29.7 | |
| 879 | + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) | |
| 880 | + '@babel/helpers': 7.29.10 | |
| 881 | + '@babel/parser': 7.29.11 | |
| 882 | + '@babel/template': 7.29.7 | |
| 883 | + '@babel/traverse': 7.29.10 | |
| 884 | + '@babel/types': 7.29.11 | |
| 885 | + '@jridgewell/remapping': 2.3.5 | |
| 886 | + convert-source-map: 2.0.0 | |
| 887 | + debug: 4.4.3 | |
| 888 | + gensync: 1.0.0-beta.2 | |
| 889 | + json5: 2.2.3 | |
| 890 | + semver: 6.3.1 | |
| 891 | + transitivePeerDependencies: | |
| 892 | + - supports-color | |
| 893 | + | |
| 894 | + '@babel/generator@7.29.8': | |
| 895 | + dependencies: | |
| 896 | + '@babel/parser': 7.29.11 | |
| 897 | + '@babel/types': 7.29.11 | |
| 898 | + '@jridgewell/gen-mapping': 0.3.13 | |
| 899 | + '@jridgewell/trace-mapping': 0.3.31 | |
| 900 | + jsesc: 3.1.0 | |
| 901 | + | |
| 902 | + '@babel/helper-compilation-targets@7.29.7': | |
| 903 | + dependencies: | |
| 904 | + '@babel/compat-data': 7.29.7 | |
| 905 | + '@babel/helper-validator-option': 7.29.7 | |
| 906 | + browserslist: 4.29.5 | |
| 907 | + lru-cache: 5.1.1 | |
| 908 | + semver: 6.3.1 | |
| 909 | + | |
| 910 | + '@babel/helper-globals@7.29.7': {} | |
| 911 | + | |
| 912 | + '@babel/helper-module-imports@7.29.7': | |
| 913 | + dependencies: | |
| 914 | + '@babel/traverse': 7.29.10 | |
| 915 | + '@babel/types': 7.29.11 | |
| 916 | + transitivePeerDependencies: | |
| 917 | + - supports-color | |
| 918 | + | |
| 919 | + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': | |
| 920 | + dependencies: | |
| 921 | + '@babel/core': 7.29.7 | |
| 922 | + '@babel/helper-module-imports': 7.29.7 | |
| 923 | + '@babel/helper-validator-identifier': 7.29.7 | |
| 924 | + '@babel/traverse': 7.29.10 | |
| 925 | + transitivePeerDependencies: | |
| 926 | + - supports-color | |
| 927 | + | |
| 928 | + '@babel/helper-plugin-utils@7.29.7': {} | |
| 929 | + | |
| 930 | + '@babel/helper-string-parser@7.29.11': {} | |
| 931 | + | |
| 932 | + '@babel/helper-validator-identifier@7.29.7': {} | |
| 933 | + | |
| 934 | + '@babel/helper-validator-option@7.29.7': {} | |
| 935 | + | |
| 936 | + '@babel/helpers@7.29.10': | |
| 937 | + dependencies: | |
| 938 | + '@babel/template': 7.29.7 | |
| 939 | + '@babel/types': 7.29.11 | |
| 940 | + | |
| 941 | + '@babel/parser@7.29.11': | |
| 942 | + dependencies: | |
| 943 | + '@babel/types': 7.29.11 | |
| 944 | + | |
| 945 | + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': | |
| 946 | + dependencies: | |
| 947 | + '@babel/core': 7.29.7 | |
| 948 | + '@babel/helper-plugin-utils': 7.29.7 | |
| 949 | + | |
| 950 | + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': | |
| 951 | + dependencies: | |
| 952 | + '@babel/core': 7.29.7 | |
| 953 | + '@babel/helper-plugin-utils': 7.29.7 | |
| 954 | + | |
| 955 | + '@babel/template@7.29.7': | |
| 956 | + dependencies: | |
| 957 | + '@babel/code-frame': 7.29.7 | |
| 958 | + '@babel/parser': 7.29.11 | |
| 959 | + '@babel/types': 7.29.11 | |
| 960 | + | |
| 961 | + '@babel/traverse@7.29.10': | |
| 962 | + dependencies: | |
| 963 | + '@babel/code-frame': 7.29.7 | |
| 964 | + '@babel/generator': 7.29.8 | |
| 965 | + '@babel/helper-globals': 7.29.7 | |
| 966 | + '@babel/parser': 7.29.11 | |
| 967 | + '@babel/template': 7.29.7 | |
| 968 | + '@babel/types': 7.29.11 | |
| 969 | + debug: 4.4.3 | |
| 970 | + transitivePeerDependencies: | |
| 971 | + - supports-color | |
| 972 | + | |
| 973 | + '@babel/types@7.29.11': | |
| 974 | + dependencies: | |
| 975 | + '@babel/helper-string-parser': 7.29.11 | |
| 976 | + '@babel/helper-validator-identifier': 7.29.7 | |
| 977 | + | |
| 978 | + '@esbuild/aix-ppc64@0.25.12': | |
| 979 | + optional: true | |
| 980 | + | |
| 981 | + '@esbuild/android-arm64@0.25.12': | |
| 982 | + optional: true | |
| 983 | + | |
| 984 | + '@esbuild/android-arm@0.25.12': | |
| 985 | + optional: true | |
| 986 | + | |
| 987 | + '@esbuild/android-x64@0.25.12': | |
| 988 | + optional: true | |
| 989 | + | |
| 990 | + '@esbuild/darwin-arm64@0.25.12': | |
| 991 | + optional: true | |
| 992 | + | |
| 993 | + '@esbuild/darwin-x64@0.25.12': | |
| 994 | + optional: true | |
| 995 | + | |
| 996 | + '@esbuild/freebsd-arm64@0.25.12': | |
| 997 | + optional: true | |
| 998 | + | |
| 999 | + '@esbuild/freebsd-x64@0.25.12': | |
| 1000 | + optional: true | |
| 1001 | + | |
| 1002 | + '@esbuild/linux-arm64@0.25.12': | |
| 1003 | + optional: true | |
| 1004 | + | |
| 1005 | + '@esbuild/linux-arm@0.25.12': | |
| 1006 | + optional: true | |
| 1007 | + | |
| 1008 | + '@esbuild/linux-ia32@0.25.12': | |
| 1009 | + optional: true | |
| 1010 | + | |
| 1011 | + '@esbuild/linux-loong64@0.25.12': | |
| 1012 | + optional: true | |
| 1013 | + | |
| 1014 | + '@esbuild/linux-mips64el@0.25.12': | |
| 1015 | + optional: true | |
| 1016 | + | |
| 1017 | + '@esbuild/linux-ppc64@0.25.12': | |
| 1018 | + optional: true | |
| 1019 | + | |
| 1020 | + '@esbuild/linux-riscv64@0.25.12': | |
| 1021 | + optional: true | |
| 1022 | + | |
| 1023 | + '@esbuild/linux-s390x@0.25.12': | |
| 1024 | + optional: true | |
| 1025 | + | |
| 1026 | + '@esbuild/linux-x64@0.25.12': | |
| 1027 | + optional: true | |
| 1028 | + | |
| 1029 | + '@esbuild/netbsd-arm64@0.25.12': | |
| 1030 | + optional: true | |
| 1031 | + | |
| 1032 | + '@esbuild/netbsd-x64@0.25.12': | |
| 1033 | + optional: true | |
| 1034 | + | |
| 1035 | + '@esbuild/openbsd-arm64@0.25.12': | |
| 1036 | + optional: true | |
| 1037 | + | |
| 1038 | + '@esbuild/openbsd-x64@0.25.12': | |
| 1039 | + optional: true | |
| 1040 | + | |
| 1041 | + '@esbuild/openharmony-arm64@0.25.12': | |
| 1042 | + optional: true | |
| 1043 | + | |
| 1044 | + '@esbuild/sunos-x64@0.25.12': | |
| 1045 | + optional: true | |
| 1046 | + | |
| 1047 | + '@esbuild/win32-arm64@0.25.12': | |
| 1048 | + optional: true | |
| 1049 | + | |
| 1050 | + '@esbuild/win32-ia32@0.25.12': | |
| 1051 | + optional: true | |
| 1052 | + | |
| 1053 | + '@esbuild/win32-x64@0.25.12': | |
| 1054 | + optional: true | |
| 1055 | + | |
| 1056 | + '@jridgewell/gen-mapping@0.3.13': | |
| 1057 | + dependencies: | |
| 1058 | + '@jridgewell/sourcemap-codec': 1.6.0 | |
| 1059 | + '@jridgewell/trace-mapping': 0.3.31 | |
| 1060 | + | |
| 1061 | + '@jridgewell/remapping@2.3.5': | |
| 1062 | + dependencies: | |
| 1063 | + '@jridgewell/gen-mapping': 0.3.13 | |
| 1064 | + '@jridgewell/trace-mapping': 0.3.31 | |
| 1065 | + | |
| 1066 | + '@jridgewell/resolve-uri@3.1.2': {} | |
| 1067 | + | |
| 1068 | + '@jridgewell/sourcemap-codec@1.6.0': {} | |
| 1069 | + | |
| 1070 | + '@jridgewell/trace-mapping@0.3.31': | |
| 1071 | + dependencies: | |
| 1072 | + '@jridgewell/resolve-uri': 3.1.2 | |
| 1073 | + '@jridgewell/sourcemap-codec': 1.6.0 | |
| 1074 | + | |
| 1075 | + '@napi-rs/lzma-linux-x64-gnu@1.5.1': | |
| 1076 | + optional: true | |
| 1077 | + | |
| 1078 | + '@rolldown/pluginutils@1.0.0-beta.27': {} | |
| 1079 | + | |
| 1080 | + '@rollup/rollup-android-arm-eabi@4.66.0': | |
| 1081 | + optional: true | |
| 1082 | + | |
| 1083 | + '@rollup/rollup-android-arm64@4.66.0': | |
| 1084 | + optional: true | |
| 1085 | + | |
| 1086 | + '@rollup/rollup-darwin-arm64@4.66.0': | |
| 1087 | + optional: true | |
| 1088 | + | |
| 1089 | + '@rollup/rollup-darwin-x64@4.66.0': | |
| 1090 | + optional: true | |
| 1091 | + | |
| 1092 | + '@rollup/rollup-freebsd-arm64@4.66.0': | |
| 1093 | + optional: true | |
| 1094 | + | |
| 1095 | + '@rollup/rollup-freebsd-x64@4.66.0': | |
| 1096 | + optional: true | |
| 1097 | + | |
| 1098 | + '@rollup/rollup-linux-arm-gnueabihf@4.66.0': | |
| 1099 | + optional: true | |
| 1100 | + | |
| 1101 | + '@rollup/rollup-linux-arm-musleabihf@4.66.0': | |
| 1102 | + optional: true | |
| 1103 | + | |
| 1104 | + '@rollup/rollup-linux-arm64-gnu@4.66.0': | |
| 1105 | + optional: true | |
| 1106 | + | |
| 1107 | + '@rollup/rollup-linux-arm64-musl@4.66.0': | |
| 1108 | + optional: true | |
| 1109 | + | |
| 1110 | + '@rollup/rollup-linux-loong64-gnu@4.66.0': | |
| 1111 | + optional: true | |
| 1112 | + | |
| 1113 | + '@rollup/rollup-linux-loong64-musl@4.66.0': | |
| 1114 | + optional: true | |
| 1115 | + | |
| 1116 | + '@rollup/rollup-linux-ppc64-gnu@4.66.0': | |
| 1117 | + optional: true | |
| 1118 | + | |
| 1119 | + '@rollup/rollup-linux-ppc64-musl@4.66.0': | |
| 1120 | + optional: true | |
| 1121 | + | |
| 1122 | + '@rollup/rollup-linux-riscv64-gnu@4.66.0': | |
| 1123 | + optional: true | |
| 1124 | + | |
| 1125 | + '@rollup/rollup-linux-riscv64-musl@4.66.0': | |
| 1126 | + optional: true | |
| 1127 | + | |
| 1128 | + '@rollup/rollup-linux-s390x-gnu@4.66.0': | |
| 1129 | + optional: true | |
| 1130 | + | |
| 1131 | + '@rollup/rollup-linux-x64-gnu@4.66.0': | |
| 1132 | + optional: true | |
| 1133 | + | |
| 1134 | + '@rollup/rollup-linux-x64-musl@4.66.0': | |
| 1135 | + optional: true | |
| 1136 | + | |
| 1137 | + '@rollup/rollup-openbsd-x64@4.66.0': | |
| 1138 | + optional: true | |
| 1139 | + | |
| 1140 | + '@rollup/rollup-openharmony-arm64@4.66.0': | |
| 1141 | + optional: true | |
| 1142 | + | |
| 1143 | + '@rollup/rollup-win32-arm64-msvc@4.66.0': | |
| 1144 | + optional: true | |
| 1145 | + | |
| 1146 | + '@rollup/rollup-win32-ia32-msvc@4.66.0': | |
| 1147 | + optional: true | |
| 1148 | + | |
| 1149 | + '@rollup/rollup-win32-x64-gnu@4.66.0': | |
| 1150 | + optional: true | |
| 1151 | + | |
| 1152 | + '@rollup/rollup-win32-x64-msvc@4.66.0': | |
| 1153 | + optional: true | |
| 1154 | + | |
| 1155 | + '@tailwindcss/node@4.3.3': | |
| 1156 | + dependencies: | |
| 1157 | + '@jridgewell/remapping': 2.3.5 | |
| 1158 | + enhanced-resolve: 5.26.0 | |
| 1159 | + jiti: 2.7.0 | |
| 1160 | + lightningcss: 1.32.0 | |
| 1161 | + magic-string: 0.30.21 | |
| 1162 | + source-map-js: 1.2.2 | |
| 1163 | + tailwindcss: 4.3.3 | |
| 1164 | + | |
| 1165 | + '@tailwindcss/oxide-android-arm64@4.3.3': | |
| 1166 | + optional: true | |
| 1167 | + | |
| 1168 | + '@tailwindcss/oxide-darwin-arm64@4.3.3': | |
| 1169 | + optional: true | |
| 1170 | + | |
| 1171 | + '@tailwindcss/oxide-darwin-x64@4.3.3': | |
| 1172 | + optional: true | |
| 1173 | + | |
| 1174 | + '@tailwindcss/oxide-freebsd-x64@4.3.3': | |
| 1175 | + optional: true | |
| 1176 | + | |
| 1177 | + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': | |
| 1178 | + optional: true | |
| 1179 | + | |
| 1180 | + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': | |
| 1181 | + optional: true | |
| 1182 | + | |
| 1183 | + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': | |
| 1184 | + optional: true | |
| 1185 | + | |
| 1186 | + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': | |
| 1187 | + optional: true | |
| 1188 | + | |
| 1189 | + '@tailwindcss/oxide-linux-x64-musl@4.3.3': | |
| 1190 | + optional: true | |
| 1191 | + | |
| 1192 | + '@tailwindcss/oxide-wasm32-wasi@4.3.3': | |
| 1193 | + optional: true | |
| 1194 | + | |
| 1195 | + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': | |
| 1196 | + optional: true | |
| 1197 | + | |
| 1198 | + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': | |
| 1199 | + optional: true | |
| 1200 | + | |
| 1201 | + '@tailwindcss/oxide@4.3.3': | |
| 1202 | + optionalDependencies: | |
| 1203 | + '@tailwindcss/oxide-android-arm64': 4.3.3 | |
| 1204 | + '@tailwindcss/oxide-darwin-arm64': 4.3.3 | |
| 1205 | + '@tailwindcss/oxide-darwin-x64': 4.3.3 | |
| 1206 | + '@tailwindcss/oxide-freebsd-x64': 4.3.3 | |
| 1207 | + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 | |
| 1208 | + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 | |
| 1209 | + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 | |
| 1210 | + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 | |
| 1211 | + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 | |
| 1212 | + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 | |
| 1213 | + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 | |
| 1214 | + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 | |
| 1215 | + | |
| 1216 | + '@tailwindcss/vite@4.3.3(vite@6.4.5(jiti@2.7.0)(lightningcss@1.32.0))': | |
| 1217 | + dependencies: | |
| 1218 | + '@tailwindcss/node': 4.3.3 | |
| 1219 | + '@tailwindcss/oxide': 4.3.3 | |
| 1220 | + tailwindcss: 4.3.3 | |
| 1221 | + vite: 6.4.5(jiti@2.7.0)(lightningcss@1.32.0) | |
| 1222 | + | |
| 1223 | + '@types/babel__core@7.20.5': | |
| 1224 | + dependencies: | |
| 1225 | + '@babel/parser': 7.29.11 | |
| 1226 | + '@babel/types': 7.29.11 | |
| 1227 | + '@types/babel__generator': 7.27.0 | |
| 1228 | + '@types/babel__template': 7.4.4 | |
| 1229 | + '@types/babel__traverse': 7.28.0 | |
| 1230 | + | |
| 1231 | + '@types/babel__generator@7.27.0': | |
| 1232 | + dependencies: | |
| 1233 | + '@babel/types': 7.29.11 | |
| 1234 | + | |
| 1235 | + '@types/babel__template@7.4.4': | |
| 1236 | + dependencies: | |
| 1237 | + '@babel/parser': 7.29.11 | |
| 1238 | + '@babel/types': 7.29.11 | |
| 1239 | + | |
| 1240 | + '@types/babel__traverse@7.28.0': | |
| 1241 | + dependencies: | |
| 1242 | + '@babel/types': 7.29.11 | |
| 1243 | + | |
| 1244 | + '@types/estree@1.0.9': {} | |
| 1245 | + | |
| 1246 | + '@vitejs/plugin-react@4.7.0(vite@6.4.5(jiti@2.7.0)(lightningcss@1.32.0))': | |
| 1247 | + dependencies: | |
| 1248 | + '@babel/core': 7.29.7 | |
| 1249 | + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) | |
| 1250 | + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) | |
| 1251 | + '@rolldown/pluginutils': 1.0.0-beta.27 | |
| 1252 | + '@types/babel__core': 7.20.5 | |
| 1253 | + react-refresh: 0.17.0 | |
| 1254 | + vite: 6.4.5(jiti@2.7.0)(lightningcss@1.32.0) | |
| 1255 | + transitivePeerDependencies: | |
| 1256 | + - supports-color | |
| 1257 | + | |
| 1258 | + baseline-browser-mapping@2.11.34: {} | |
| 1259 | + | |
| 1260 | + browserslist@4.29.5: | |
| 1261 | + dependencies: | |
| 1262 | + baseline-browser-mapping: 2.11.34 | |
| 1263 | + caniuse-lite: 1.0.30001820 | |
| 1264 | + electron-to-chromium: 1.5.467 | |
| 1265 | + node-releases: 2.0.60 | |
| 1266 | + update-browserslist-db: 1.3.4(browserslist@4.29.5) | |
| 1267 | + | |
| 1268 | + caniuse-lite@1.0.30001820: {} | |
| 1269 | + | |
| 1270 | + clsx@2.1.1: {} | |
| 1271 | + | |
| 1272 | + convert-source-map@2.0.0: {} | |
| 1273 | + | |
| 1274 | + debug@4.4.3: | |
| 1275 | + dependencies: | |
| 1276 | + ms: 2.1.3 | |
| 1277 | + | |
| 1278 | + detect-libc@2.1.2: {} | |
| 1279 | + | |
| 1280 | + electron-to-chromium@1.5.467: {} | |
| 1281 | + | |
| 1282 | + enhanced-resolve@5.26.0: | |
| 1283 | + dependencies: | |
| 1284 | + graceful-fs: 4.2.11 | |
| 1285 | + tapable: 2.3.3 | |
| 1286 | + | |
| 1287 | + esbuild@0.25.12: | |
| 1288 | + optionalDependencies: | |
| 1289 | + '@esbuild/aix-ppc64': 0.25.12 | |
| 1290 | + '@esbuild/android-arm': 0.25.12 | |
| 1291 | + '@esbuild/android-arm64': 0.25.12 | |
| 1292 | + '@esbuild/android-x64': 0.25.12 | |
| 1293 | + '@esbuild/darwin-arm64': 0.25.12 | |
| 1294 | + '@esbuild/darwin-x64': 0.25.12 | |
| 1295 | + '@esbuild/freebsd-arm64': 0.25.12 | |
| 1296 | + '@esbuild/freebsd-x64': 0.25.12 | |
| 1297 | + '@esbuild/linux-arm': 0.25.12 | |
| 1298 | + '@esbuild/linux-arm64': 0.25.12 | |
| 1299 | + '@esbuild/linux-ia32': 0.25.12 | |
| 1300 | + '@esbuild/linux-loong64': 0.25.12 | |
| 1301 | + '@esbuild/linux-mips64el': 0.25.12 | |
| 1302 | + '@esbuild/linux-ppc64': 0.25.12 | |
| 1303 | + '@esbuild/linux-riscv64': 0.25.12 | |
| 1304 | + '@esbuild/linux-s390x': 0.25.12 | |
| 1305 | + '@esbuild/linux-x64': 0.25.12 | |
| 1306 | + '@esbuild/netbsd-arm64': 0.25.12 | |
| 1307 | + '@esbuild/netbsd-x64': 0.25.12 | |
| 1308 | + '@esbuild/openbsd-arm64': 0.25.12 | |
| 1309 | + '@esbuild/openbsd-x64': 0.25.12 | |
| 1310 | + '@esbuild/openharmony-arm64': 0.25.12 | |
| 1311 | + '@esbuild/sunos-x64': 0.25.12 | |
| 1312 | + '@esbuild/win32-arm64': 0.25.12 | |
| 1313 | + '@esbuild/win32-ia32': 0.25.12 | |
| 1314 | + '@esbuild/win32-x64': 0.25.12 | |
| 1315 | + | |
| 1316 | + escalade@3.2.0: {} | |
| 1317 | + | |
| 1318 | + fdir@6.5.0(picomatch@4.0.7): | |
| 1319 | + optionalDependencies: | |
| 1320 | + picomatch: 4.0.7 | |
| 1321 | + | |
| 1322 | + fsevents@2.3.3: | |
| 1323 | + optional: true | |
| 1324 | + | |
| 1325 | + gensync@1.0.0-beta.2: {} | |
| 1326 | + | |
| 1327 | + graceful-fs@4.2.11: {} | |
| 1328 | + | |
| 1329 | + jiti@2.7.0: {} | |
| 1330 | + | |
| 1331 | + js-tokens@4.0.0: {} | |
| 1332 | + | |
| 1333 | + jsesc@3.1.0: {} | |
| 1334 | + | |
| 1335 | + json5@2.2.3: {} | |
| 1336 | + | |
| 1337 | + lightningcss-android-arm64@1.32.0: | |
| 1338 | + optional: true | |
| 1339 | + | |
| 1340 | + lightningcss-darwin-arm64@1.32.0: | |
| 1341 | + optional: true | |
| 1342 | + | |
| 1343 | + lightningcss-darwin-x64@1.32.0: | |
| 1344 | + optional: true | |
| 1345 | + | |
| 1346 | + lightningcss-freebsd-x64@1.32.0: | |
| 1347 | + optional: true | |
| 1348 | + | |
| 1349 | + lightningcss-linux-arm-gnueabihf@1.32.0: | |
| 1350 | + optional: true | |
| 1351 | + | |
| 1352 | + lightningcss-linux-arm64-gnu@1.32.0: | |
| 1353 | + optional: true | |
| 1354 | + | |
| 1355 | + lightningcss-linux-arm64-musl@1.32.0: | |
| 1356 | + optional: true | |
| 1357 | + | |
| 1358 | + lightningcss-linux-x64-gnu@1.32.0: | |
| 1359 | + optional: true | |
| 1360 | + | |
| 1361 | + lightningcss-linux-x64-musl@1.32.0: | |
| 1362 | + optional: true | |
| 1363 | + | |
| 1364 | + lightningcss-win32-arm64-msvc@1.32.0: | |
| 1365 | + optional: true | |
| 1366 | + | |
| 1367 | + lightningcss-win32-x64-msvc@1.32.0: | |
| 1368 | + optional: true | |
| 1369 | + | |
| 1370 | + lightningcss@1.32.0: | |
| 1371 | + dependencies: | |
| 1372 | + detect-libc: 2.1.2 | |
| 1373 | + optionalDependencies: | |
| 1374 | + lightningcss-android-arm64: 1.32.0 | |
| 1375 | + lightningcss-darwin-arm64: 1.32.0 | |
| 1376 | + lightningcss-darwin-x64: 1.32.0 | |
| 1377 | + lightningcss-freebsd-x64: 1.32.0 | |
| 1378 | + lightningcss-linux-arm-gnueabihf: 1.32.0 | |
| 1379 | + lightningcss-linux-arm64-gnu: 1.32.0 | |
| 1380 | + lightningcss-linux-arm64-musl: 1.32.0 | |
| 1381 | + lightningcss-linux-x64-gnu: 1.32.0 | |
| 1382 | + lightningcss-linux-x64-musl: 1.32.0 | |
| 1383 | + lightningcss-win32-arm64-msvc: 1.32.0 | |
| 1384 | + lightningcss-win32-x64-msvc: 1.32.0 | |
| 1385 | + | |
| 1386 | + lru-cache@5.1.1: | |
| 1387 | + dependencies: | |
| 1388 | + yallist: 3.1.1 | |
| 1389 | + | |
| 1390 | + lucide-react@1.64.0(react@19.3.1): | |
| 1391 | + dependencies: | |
| 1392 | + react: 19.3.1 | |
| 1393 | + | |
| 1394 | + magic-string@0.30.21: | |
| 1395 | + dependencies: | |
| 1396 | + '@jridgewell/sourcemap-codec': 1.6.0 | |
| 1397 | + | |
| 1398 | + ms@2.1.3: {} | |
| 1399 | + | |
| 1400 | + nanoid@3.3.20: {} | |
| 1401 | + | |
| 1402 | + node-releases@2.0.60: {} | |
| 1403 | + | |
| 1404 | + picocolors@1.1.1: {} | |
| 1405 | + | |
| 1406 | + picomatch@4.0.7: {} | |
| 1407 | + | |
| 1408 | + postcss@8.5.32: | |
| 1409 | + dependencies: | |
| 1410 | + nanoid: 3.3.20 | |
| 1411 | + picocolors: 1.1.1 | |
| 1412 | + source-map-js: 1.2.2 | |
| 1413 | + | |
| 1414 | + react-dom@19.3.1(react@19.3.1): | |
| 1415 | + dependencies: | |
| 1416 | + react: 19.3.1 | |
| 1417 | + scheduler: 0.28.0 | |
| 1418 | + | |
| 1419 | + react-refresh@0.17.0: {} | |
| 1420 | + | |
| 1421 | + react@19.3.1: {} | |
| 1422 | + | |
| 1423 | + rollup@4.66.0: | |
| 1424 | + dependencies: | |
| 1425 | + '@types/estree': 1.0.9 | |
| 1426 | + optionalDependencies: | |
| 1427 | + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 | |
| 1428 | + '@rollup/rollup-android-arm-eabi': 4.66.0 | |
| 1429 | + '@rollup/rollup-android-arm64': 4.66.0 | |
| 1430 | + '@rollup/rollup-darwin-arm64': 4.66.0 | |
| 1431 | + '@rollup/rollup-darwin-x64': 4.66.0 | |
| 1432 | + '@rollup/rollup-freebsd-arm64': 4.66.0 | |
| 1433 | + '@rollup/rollup-freebsd-x64': 4.66.0 | |
| 1434 | + '@rollup/rollup-linux-arm-gnueabihf': 4.66.0 | |
| 1435 | + '@rollup/rollup-linux-arm-musleabihf': 4.66.0 | |
| 1436 | + '@rollup/rollup-linux-arm64-gnu': 4.66.0 | |
| 1437 | + '@rollup/rollup-linux-arm64-musl': 4.66.0 | |
| 1438 | + '@rollup/rollup-linux-loong64-gnu': 4.66.0 | |
| 1439 | + '@rollup/rollup-linux-loong64-musl': 4.66.0 | |
| 1440 | + '@rollup/rollup-linux-ppc64-gnu': 4.66.0 | |
| 1441 | + '@rollup/rollup-linux-ppc64-musl': 4.66.0 | |
| 1442 | + '@rollup/rollup-linux-riscv64-gnu': 4.66.0 | |
| 1443 | + '@rollup/rollup-linux-riscv64-musl': 4.66.0 | |
| 1444 | + '@rollup/rollup-linux-s390x-gnu': 4.66.0 | |
| 1445 | + '@rollup/rollup-linux-x64-gnu': 4.66.0 | |
| 1446 | + '@rollup/rollup-linux-x64-musl': 4.66.0 | |
| 1447 | + '@rollup/rollup-openbsd-x64': 4.66.0 | |
| 1448 | + '@rollup/rollup-openharmony-arm64': 4.66.0 | |
| 1449 | + '@rollup/rollup-win32-arm64-msvc': 4.66.0 | |
| 1450 | + '@rollup/rollup-win32-ia32-msvc': 4.66.0 | |
| 1451 | + '@rollup/rollup-win32-x64-gnu': 4.66.0 | |
| 1452 | + '@rollup/rollup-win32-x64-msvc': 4.66.0 | |
| 1453 | + fsevents: 2.3.3 | |
| 1454 | + | |
| 1455 | + scheduler@0.28.0: {} | |
| 1456 | + | |
| 1457 | + semver@6.3.1: {} | |
| 1458 | + | |
| 1459 | + source-map-js@1.2.2: {} | |
| 1460 | + | |
| 1461 | + tailwind-merge@3.7.0: {} | |
| 1462 | + | |
| 1463 | + tailwindcss@4.3.3: {} | |
| 1464 | + | |
| 1465 | + tapable@2.3.3: {} | |
| 1466 | + | |
| 1467 | + tinyglobby@0.2.17: | |
| 1468 | + dependencies: | |
| 1469 | + fdir: 6.5.0(picomatch@4.0.7) | |
| 1470 | + picomatch: 4.0.7 | |
| 1471 | + | |
| 1472 | + update-browserslist-db@1.3.4(browserslist@4.29.5): | |
| 1473 | + dependencies: | |
| 1474 | + browserslist: 4.29.5 | |
| 1475 | + escalade: 3.2.0 | |
| 1476 | + picocolors: 1.1.1 | |
| 1477 | + | |
| 1478 | + vite-plugin-singlefile@2.3.4(rollup@4.66.0)(vite@6.4.5(jiti@2.7.0)(lightningcss@1.32.0)): | |
| 1479 | + dependencies: | |
| 1480 | + picomatch: 4.0.7 | |
| 1481 | + vite: 6.4.5(jiti@2.7.0)(lightningcss@1.32.0) | |
| 1482 | + optionalDependencies: | |
| 1483 | + rollup: 4.66.0 | |
| 1484 | + | |
| 1485 | + vite@6.4.5(jiti@2.7.0)(lightningcss@1.32.0): | |
| 1486 | + dependencies: | |
| 1487 | + esbuild: 0.25.12 | |
| 1488 | + fdir: 6.5.0(picomatch@4.0.7) | |
| 1489 | + picomatch: 4.0.7 | |
| 1490 | + postcss: 8.5.32 | |
| 1491 | + rollup: 4.66.0 | |
| 1492 | + tinyglobby: 0.2.17 | |
| 1493 | + optionalDependencies: | |
| 1494 | + fsevents: 2.3.3 | |
| 1495 | + jiti: 2.7.0 | |
| 1496 | + lightningcss: 1.32.0 | |
| 1497 | + | |
| 1498 | + yallist@3.1.1: {} | ... | ... |
h3-console/frontend/pnpm-workspace.yaml
0 → 100644
h3-console/frontend/src/App.jsx
0 → 100644
| 1 | +import React, { useState, useEffect } from 'react'; | |
| 2 | +import Sidebar from './components/Sidebar'; | |
| 3 | +import CreateForm from './components/CreateForm'; | |
| 4 | +import TaskDetail from './components/TaskDetail'; | |
| 5 | +import { ToastProvider, useToast } from './components/Toast'; | |
| 6 | +import { fetchBackends } from './api'; | |
| 7 | +import { getH3Base, getToken, setToken } from './utils'; | |
| 8 | + | |
| 9 | +function tidFromPath() { | |
| 10 | + if (typeof window === 'undefined') return null; | |
| 11 | + let p = window.location.pathname; | |
| 12 | + const base = getH3Base(); | |
| 13 | + if (base && p.startsWith(base)) p = p.slice(base.length); | |
| 14 | + const m = p.match(/^\/task\.html\/(.+)$/); | |
| 15 | + return m ? decodeURIComponent(m[1]) : null; | |
| 16 | +} | |
| 17 | + | |
| 18 | +function MainApp() { | |
| 19 | + const { addToast } = useToast(); | |
| 20 | + const [selectedId, setSelectedId] = useState(() => tidFromPath()); | |
| 21 | + const [initialFormValues, setInitialFormValues] = useState(null); | |
| 22 | + const [backendInfo, setBackendInfo] = useState(null); | |
| 23 | + | |
| 24 | + // 路由同步 | |
| 25 | + useEffect(() => { | |
| 26 | + const handlePopState = () => { | |
| 27 | + const tid = tidFromPath(); | |
| 28 | + setSelectedId(tid); | |
| 29 | + }; | |
| 30 | + window.addEventListener('popstate', handlePopState); | |
| 31 | + return () => window.removeEventListener('popstate', handlePopState); | |
| 32 | + }, []); | |
| 33 | + | |
| 34 | + // 定时刷新后端状态 | |
| 35 | + const loadBackends = async () => { | |
| 36 | + const info = await fetchBackends(); | |
| 37 | + if (info) setBackendInfo(info); | |
| 38 | + }; | |
| 39 | + | |
| 40 | + useEffect(() => { | |
| 41 | + loadBackends(); | |
| 42 | + const timer = setInterval(loadBackends, 6000); | |
| 43 | + return () => clearInterval(timer); | |
| 44 | + }, []); | |
| 45 | + | |
| 46 | + const handleSelectTask = (id) => { | |
| 47 | + setSelectedId(id); | |
| 48 | + const base = getH3Base(); | |
| 49 | + window.history.pushState(null, '', `${base}/task.html/${encodeURIComponent(id)}`); | |
| 50 | + }; | |
| 51 | + | |
| 52 | + const handleCreateTask = () => { | |
| 53 | + setSelectedId(null); | |
| 54 | + setInitialFormValues(null); | |
| 55 | + const base = getH3Base(); | |
| 56 | + window.history.pushState(null, '', `${base}/newtask.html`); | |
| 57 | + }; | |
| 58 | + | |
| 59 | + const handleRerunTask = (job) => { | |
| 60 | + setSelectedId(null); | |
| 61 | + setInitialFormValues(job.req || {}); | |
| 62 | + const base = getH3Base(); | |
| 63 | + window.history.pushState(null, '', `${base}/newtask.html`); | |
| 64 | + addToast('已将历史任务参数灌入表单,可直接微调或提交', 'info'); | |
| 65 | + }; | |
| 66 | + | |
| 67 | + const handleManageToken = () => { | |
| 68 | + const cur = getToken(); | |
| 69 | + const next = window.prompt('设置 H3 访问令牌 (Access Token),留空清除:', cur); | |
| 70 | + if (next !== null) { | |
| 71 | + setToken(next); | |
| 72 | + addToast(next ? '令牌已保存' : '令牌已清除', 'info'); | |
| 73 | + } | |
| 74 | + }; | |
| 75 | + | |
| 76 | + return ( | |
| 77 | + <div className="flex h-screen w-screen overflow-hidden bg-slate-50 text-slate-800 font-sans"> | |
| 78 | + {/* 左侧任务栏 (包含系统配置入口) */} | |
| 79 | + <Sidebar | |
| 80 | + selectedId={selectedId} | |
| 81 | + onSelectTask={handleSelectTask} | |
| 82 | + onCreateTask={handleCreateTask} | |
| 83 | + onRerunTask={handleRerunTask} | |
| 84 | + backendInfo={backendInfo} | |
| 85 | + onRefreshBackends={loadBackends} | |
| 86 | + onManageToken={handleManageToken} | |
| 87 | + /> | |
| 88 | + | |
| 89 | + {/* 右侧主工作区 (纯净流式布局,绝不在右上角悬浮危险遮挡元素) */} | |
| 90 | + <main className="flex-1 h-full overflow-y-auto relative flex flex-col bg-white"> | |
| 91 | + <div className="flex-1 w-full"> | |
| 92 | + {selectedId ? ( | |
| 93 | + <TaskDetail | |
| 94 | + taskId={selectedId} | |
| 95 | + onBack={handleCreateTask} | |
| 96 | + onRerun={handleRerunTask} | |
| 97 | + /> | |
| 98 | + ) : ( | |
| 99 | + <CreateForm | |
| 100 | + initialValues={initialFormValues} | |
| 101 | + onCreated={handleSelectTask} | |
| 102 | + /> | |
| 103 | + )} | |
| 104 | + </div> | |
| 105 | + </main> | |
| 106 | + </div> | |
| 107 | + ); | |
| 108 | +} | |
| 109 | + | |
| 110 | +export default function App() { | |
| 111 | + return ( | |
| 112 | + <ToastProvider> | |
| 113 | + <MainApp /> | |
| 114 | + </ToastProvider> | |
| 115 | + ); | |
| 116 | +} | ... | ... |
h3-console/frontend/src/api.js
0 → 100644
| 1 | +import { getH3Base, getToken, setToken } from './utils'; | |
| 2 | + | |
| 3 | +export async function apiFetch(path, options = {}) { | |
| 4 | + const base = getH3Base(); | |
| 5 | + const url = path.startsWith('http') ? path : `${base}${path}`; | |
| 6 | + const token = getToken(); | |
| 7 | + | |
| 8 | + const headers = { ...(options.headers || {}) }; | |
| 9 | + if (token) { | |
| 10 | + headers['Authorization'] = `Bearer ${token}`; | |
| 11 | + } | |
| 12 | + | |
| 13 | + const res = await fetch(url, { ...options, headers }); | |
| 14 | + if (res.status === 401) { | |
| 15 | + setToken(''); | |
| 16 | + const newToken = window.prompt('H3 访问令牌 (Token) 已过期或无效,请输入新令牌:'); | |
| 17 | + if (newToken) { | |
| 18 | + setToken(newToken); | |
| 19 | + headers['Authorization'] = `Bearer ${newToken}`; | |
| 20 | + return fetch(url, { ...options, headers }); | |
| 21 | + } | |
| 22 | + } | |
| 23 | + return res; | |
| 24 | +} | |
| 25 | + | |
| 26 | +export async function fetchJobs({ page = 1, limit = 20, q = '', status = '', kind = '', sort = 'desc', trash = false } = {}) { | |
| 27 | + const params = new URLSearchParams(); | |
| 28 | + if (trash) { | |
| 29 | + params.set('trash', 'true'); | |
| 30 | + params.set('limit', '50'); | |
| 31 | + } else { | |
| 32 | + params.set('page', String(page)); | |
| 33 | + params.set('limit', String(limit)); | |
| 34 | + if (q) params.set('q', q); | |
| 35 | + if (status) params.set('status', status); | |
| 36 | + if (kind) params.set('kind', kind); | |
| 37 | + if (sort) params.set('sort', sort); | |
| 38 | + } | |
| 39 | + | |
| 40 | + const res = await apiFetch(`/v1/videos?${params.toString()}`); | |
| 41 | + if (!res.ok) throw new Error(await res.text()); | |
| 42 | + return res.json(); | |
| 43 | +} | |
| 44 | + | |
| 45 | +export async function fetchJobDetail(id) { | |
| 46 | + const res = await apiFetch(`/v1/videos/${id}`); | |
| 47 | + if (!res.ok) throw new Error(await res.text()); | |
| 48 | + return res.json(); | |
| 49 | +} | |
| 50 | + | |
| 51 | +export async function createJob(body) { | |
| 52 | + const res = await apiFetch('/v1/videos', { | |
| 53 | + method: 'POST', | |
| 54 | + headers: { 'Content-Type': 'application/json' }, | |
| 55 | + body: JSON.stringify(body), | |
| 56 | + }); | |
| 57 | + if (!res.ok) throw new Error(await res.text()); | |
| 58 | + return res.json(); | |
| 59 | +} | |
| 60 | + | |
| 61 | +export async function uploadAsset(file) { | |
| 62 | + const fd = new FormData(); | |
| 63 | + fd.append('file', file); | |
| 64 | + const res = await apiFetch('/v1/assets', { | |
| 65 | + method: 'POST', | |
| 66 | + body: fd, | |
| 67 | + }); | |
| 68 | + if (!res.ok) throw new Error(await res.text()); | |
| 69 | + return res.json(); | |
| 70 | +} | |
| 71 | + | |
| 72 | +export async function prioritizeJob(id) { | |
| 73 | + const res = await apiFetch(`/v1/videos/${id}/prioritize`, { method: 'POST' }); | |
| 74 | + if (!res.ok) throw new Error(await res.text()); | |
| 75 | + return res.json(); | |
| 76 | +} | |
| 77 | + | |
| 78 | +export async function deleteJob(id) { | |
| 79 | + const res = await apiFetch(`/v1/videos/${id}`, { method: 'DELETE' }); | |
| 80 | + if (!res.ok) throw new Error(await res.text()); | |
| 81 | + return res.json(); | |
| 82 | +} | |
| 83 | + | |
| 84 | +export async function restoreJob(id) { | |
| 85 | + const res = await apiFetch(`/v1/videos/${id}/restore`, { method: 'POST' }); | |
| 86 | + if (!res.ok) throw new Error(await res.text()); | |
| 87 | + return res.json(); | |
| 88 | +} | |
| 89 | + | |
| 90 | +export async function cancelJob(id) { | |
| 91 | + const res = await apiFetch(`/v1/videos/${id}/cancel`, { method: 'POST' }); | |
| 92 | + if (!res.ok) throw new Error(await res.text()); | |
| 93 | + return res.json(); | |
| 94 | +} | |
| 95 | + | |
| 96 | +export async function resetGpu() { | |
| 97 | + const res = await apiFetch('/v1/admin/reset-gpu', { method: 'POST' }); | |
| 98 | + if (!res.ok) throw new Error(await res.text()); | |
| 99 | + return res.json(); | |
| 100 | +} | |
| 101 | + | |
| 102 | +export async function fetchBackends() { | |
| 103 | + const res = await apiFetch('/v1/backends'); | |
| 104 | + if (!res.ok) return null; | |
| 105 | + return res.json(); | |
| 106 | +} | |
| 107 | + | |
| 108 | +export async function fetchComfyHistory(id) { | |
| 109 | + const res = await apiFetch(`/v1/videos/${id}/comfy-history`); | |
| 110 | + if (!res.ok) throw new Error(await res.text()); | |
| 111 | + return res.json(); | |
| 112 | +} | |
| 113 | + | ... | ... |
h3-console/frontend/src/components/CreateForm.jsx
0 → 100644
| 1 | +import React, { useState, useEffect } from 'react'; | |
| 2 | +import { Sparkles, Sliders, RefreshCw, Send, AlertCircle, ChevronDown, ChevronUp } from 'lucide-react'; | |
| 3 | +import MediaUploader from './MediaUploader'; | |
| 4 | +import { RESOLUTIONS, DURATIONS, STEPS_BY_TURBO, SEED_OPTIONS, DEFAULT_RES, DEFAULT_DUR } from '../constants'; | |
| 5 | +import { createJob } from '../api'; | |
| 6 | +import { useToast } from './Toast'; | |
| 7 | + | |
| 8 | +export default function CreateForm({ initialValues, onCreated }) { | |
| 9 | + const { addToast } = useToast(); | |
| 10 | + const [tab, setTab] = useState('text'); // 'text' | 'fl2va' | 'ref2va' | |
| 11 | + const [prompt, setPrompt] = useState(''); | |
| 12 | + const [resValue, setResValue] = useState(DEFAULT_RES); | |
| 13 | + const [durValue, setDurValue] = useState(DEFAULT_DUR); | |
| 14 | + const [turbo, setTurbo] = useState(false); | |
| 15 | + const [steps, setSteps] = useState('20'); | |
| 16 | + const [seed, setSeed] = useState('0'); | |
| 17 | + const [cfgScale, setCfgScale] = useState(''); | |
| 18 | + const [negativePrompt, setNegativePrompt] = useState(''); | |
| 19 | + const [showAdvanced, setShowAdvanced] = useState(false); | |
| 20 | + const [submitting, setSubmitting] = useState(false); | |
| 21 | + const [err, setErr] = useState(''); | |
| 22 | + | |
| 23 | + // 媒体状态 | |
| 24 | + const [firstFrame, setFirstFrame] = useState(null); | |
| 25 | + const [lastFrame, setLastFrame] = useState(null); | |
| 26 | + const [refImages, setRefImages] = useState([]); | |
| 27 | + const [refVideos, setRefVideos] = useState([]); | |
| 28 | + const [refAudios, setRefAudios] = useState([]); | |
| 29 | + | |
| 30 | + // 如果从详情页点了“重跑”,注入初始参数 | |
| 31 | + useEffect(() => { | |
| 32 | + if (!initialValues) return; | |
| 33 | + const req = initialValues; | |
| 34 | + if (req.first_frame_url || req.last_frame_url) { | |
| 35 | + setTab('fl2va'); | |
| 36 | + setFirstFrame(req.first_frame_url || null); | |
| 37 | + setLastFrame(req.last_frame_url || null); | |
| 38 | + } else if ((req.reference_image_urls || []).length || (req.reference_video_urls || []).length || (req.reference_audio_urls || []).length) { | |
| 39 | + setTab('ref2va'); | |
| 40 | + setRefImages(req.reference_image_urls || []); | |
| 41 | + setRefVideos(req.reference_video_urls || []); | |
| 42 | + setRefAudios(req.reference_audio_urls || []); | |
| 43 | + } else { | |
| 44 | + setTab('text'); | |
| 45 | + } | |
| 46 | + | |
| 47 | + setPrompt(req.prompt || ''); | |
| 48 | + const matchedRes = RESOLUTIONS.find((r) => r.width === req.width && r.height === req.height); | |
| 49 | + if (matchedRes) setResValue(matchedRes.value); | |
| 50 | + | |
| 51 | + const matchedDur = DURATIONS.find((d) => d.frames === req.frames); | |
| 52 | + if (matchedDur) setDurValue(matchedDur.value); | |
| 53 | + | |
| 54 | + const isTurbo = req.turbo === false ? false : true; | |
| 55 | + setTurbo(isTurbo); | |
| 56 | + if (req.steps != null) setSteps(String(req.steps)); | |
| 57 | + if (req.seed != null) setSeed(String(req.seed)); | |
| 58 | + if (req.cfg_scale != null) setCfgScale(String(req.cfg_scale)); | |
| 59 | + if (req.negative_prompt) setNegativePrompt(req.negative_prompt); | |
| 60 | + }, [initialValues]); | |
| 61 | + | |
| 62 | + // 分辨率对应的时长合法性校验 | |
| 63 | + const currentRes = RESOLUTIONS.find((r) => r.value === resValue) || RESOLUTIONS[0]; | |
| 64 | + const allowedDurations = DURATIONS.filter((d) => d.frames <= currentRes.maxFrames); | |
| 65 | + const droppedDurations = DURATIONS.filter((d) => d.frames > currentRes.maxFrames); | |
| 66 | + | |
| 67 | + useEffect(() => { | |
| 68 | + if (!allowedDurations.some((d) => d.value === durValue)) { | |
| 69 | + setDurValue(allowedDurations[0]?.value || DEFAULT_DUR); | |
| 70 | + } | |
| 71 | + }, [resValue]); | |
| 72 | + | |
| 73 | + // Turbo 切换自动联动步数 | |
| 74 | + const stepOptions = STEPS_BY_TURBO[turbo]; | |
| 75 | + useEffect(() => { | |
| 76 | + if (!stepOptions.some((s) => s.value === steps)) { | |
| 77 | + setSteps(stepOptions[0].value); | |
| 78 | + } | |
| 79 | + }, [turbo]); | |
| 80 | + | |
| 81 | + const handleClear = () => { | |
| 82 | + if (!confirm('确定清空当前表单所有内容?')) return; | |
| 83 | + setPrompt(''); | |
| 84 | + setResValue(DEFAULT_RES); | |
| 85 | + setDurValue(DEFAULT_DUR); | |
| 86 | + setTurbo(false); | |
| 87 | + setSteps('20'); | |
| 88 | + setSeed('0'); | |
| 89 | + setCfgScale(''); | |
| 90 | + setNegativePrompt(''); | |
| 91 | + setFirstFrame(null); | |
| 92 | + setLastFrame(null); | |
| 93 | + setRefImages([]); | |
| 94 | + setRefVideos([]); | |
| 95 | + setRefAudios([]); | |
| 96 | + setErr(''); | |
| 97 | + addToast('已恢复默认配置', 'info'); | |
| 98 | + }; | |
| 99 | + | |
| 100 | + const handleSubmit = async (e) => { | |
| 101 | + e.preventDefault(); | |
| 102 | + setErr(''); | |
| 103 | + | |
| 104 | + if (!prompt.trim()) { | |
| 105 | + setErr('请填写 Prompt 提示词'); | |
| 106 | + return; | |
| 107 | + } | |
| 108 | + | |
| 109 | + const durObj = DURATIONS.find((d) => d.value === durValue); | |
| 110 | + const body = { | |
| 111 | + prompt: prompt.trim(), | |
| 112 | + width: currentRes.width, | |
| 113 | + height: currentRes.height, | |
| 114 | + frames: durObj ? durObj.frames : 243, | |
| 115 | + turbo, | |
| 116 | + steps: parseInt(steps, 10), | |
| 117 | + seed: seed === 'random' ? Math.floor(Math.random() * 2 ** 31) : parseInt(seed, 10), | |
| 118 | + }; | |
| 119 | + | |
| 120 | + if (cfgScale.trim() !== '') body.cfg_scale = parseFloat(cfgScale); | |
| 121 | + if (negativePrompt.trim() !== '') body.negative_prompt = negativePrompt.trim(); | |
| 122 | + | |
| 123 | + if (tab === 'fl2va') { | |
| 124 | + if (!firstFrame) { | |
| 125 | + setErr('首尾帧模式下必须上传【首帧图】'); | |
| 126 | + return; | |
| 127 | + } | |
| 128 | + body.first_frame_url = firstFrame; | |
| 129 | + if (lastFrame) body.last_frame_url = lastFrame; | |
| 130 | + } else if (tab === 'ref2va') { | |
| 131 | + if (refImages.length === 0 && refVideos.length === 0 && refAudios.length === 0) { | |
| 132 | + setErr('参考模式下至少需要上传 1 张参考图、1 段参考视频或 1 个音频'); | |
| 133 | + return; | |
| 134 | + } | |
| 135 | + body.reference_image_urls = refImages; | |
| 136 | + body.reference_video_urls = refVideos; | |
| 137 | + body.reference_audio_urls = refAudios; | |
| 138 | + } | |
| 139 | + | |
| 140 | + setSubmitting(true); | |
| 141 | + try { | |
| 142 | + const job = await createJob(body); | |
| 143 | + addToast(`任务提交成功 (#${job.id.substring(0, 8)})`, 'success'); | |
| 144 | + onCreated(job.id); | |
| 145 | + } catch (e) { | |
| 146 | + setErr('提交失败: ' + e.message); | |
| 147 | + addToast('提交失败: ' + e.message, 'error'); | |
| 148 | + } finally { | |
| 149 | + setSubmitting(false); | |
| 150 | + } | |
| 151 | + }; | |
| 152 | + | |
| 153 | + return ( | |
| 154 | + <div className="max-w-4xl mx-auto py-6 px-4 sm:px-8"> | |
| 155 | + {/* 顶部标签切换 */} | |
| 156 | + <div className="flex items-center gap-1.5 p-1.5 bg-slate-100 dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl w-fit shadow-xs mb-6"> | |
| 157 | + {[ | |
| 158 | + { key: 'text', label: '文生视频', desc: 'Text to Video' }, | |
| 159 | + { key: 'fl2va', label: '首尾帧生视频', desc: 'FL2VA' }, | |
| 160 | + { key: 'ref2va', label: '多参考图生视频', desc: 'Ref2VA' }, | |
| 161 | + ].map((t) => ( | |
| 162 | + <button | |
| 163 | + key={t.key} | |
| 164 | + onClick={() => setTab(t.key)} | |
| 165 | + className={`flex flex-col items-start px-4 py-2 rounded-xl text-xs transition-all cursor-pointer ${ | |
| 166 | + tab === t.key | |
| 167 | + ? 'bg-emerald-600 text-white font-semibold shadow-sm' | |
| 168 | + : 'text-slate-600 hover:text-slate-900 hover:bg-white/80 dark:text-zinc-400 dark:hover:text-zinc-200 dark:hover:bg-zinc-800/60' | |
| 169 | + }`} | |
| 170 | + > | |
| 171 | + <span>{t.label}</span> | |
| 172 | + <span className={`text-[10px] ${tab === t.key ? 'text-emerald-100' : 'text-slate-400 dark:text-zinc-500'}`}>{t.desc}</span> | |
| 173 | + </button> | |
| 174 | + ))} | |
| 175 | + </div> | |
| 176 | + | |
| 177 | + <form onSubmit={handleSubmit} className="flex flex-col gap-6"> | |
| 178 | + {/* Prompt 输入 */} | |
| 179 | + <div className="bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl p-5 shadow-xs"> | |
| 180 | + <div className="flex items-center justify-between mb-2.5"> | |
| 181 | + <label className="text-xs font-bold uppercase tracking-wider text-slate-700 dark:text-zinc-300 flex items-center gap-2"> | |
| 182 | + <Sparkles className="w-3.5 h-3.5 text-emerald-600 dark:text-emerald-400" /> | |
| 183 | + <span>Prompt 提示词</span> | |
| 184 | + </label> | |
| 185 | + <span className="text-xs text-slate-400 dark:text-zinc-500">{prompt.length} 字</span> | |
| 186 | + </div> | |
| 187 | + <textarea | |
| 188 | + rows={5} | |
| 189 | + value={prompt} | |
| 190 | + onChange={(e) => setPrompt(e.target.value)} | |
| 191 | + placeholder={ | |
| 192 | + tab === 'fl2va' | |
| 193 | + ? '描述首帧到尾帧之间的动态演变过程,例如:女子缓缓端起茶杯,轻轻抿了一口,微风拂动发丝...' | |
| 194 | + : '描述您想要生成的电影级视频画面、光影运镜与角色动作...' | |
| 195 | + } | |
| 196 | + className="w-full bg-slate-50 dark:bg-zinc-950/70 border border-slate-200 dark:border-zinc-800 focus:bg-white focus:border-emerald-500 focus:ring-1 focus:ring-emerald-500/20 rounded-xl p-3.5 text-sm text-slate-900 dark:text-zinc-100 placeholder-slate-400 dark:placeholder-zinc-500 outline-none transition-all resize-y min-h-[120px] leading-relaxed" | |
| 197 | + /> | |
| 198 | + </div> | |
| 199 | + | |
| 200 | + {/* 媒体上传区 (非纯文本模式) */} | |
| 201 | + {tab === 'fl2va' && ( | |
| 202 | + <div className="bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl p-5 shadow-xs flex flex-col gap-5"> | |
| 203 | + <MediaUploader | |
| 204 | + label="首帧图片 (必填)" | |
| 205 | + accept="image/*" | |
| 206 | + type="image" | |
| 207 | + value={firstFrame} | |
| 208 | + onChange={setFirstFrame} | |
| 209 | + hint="视频起始画面" | |
| 210 | + /> | |
| 211 | + <div className="border-t border-slate-100 dark:border-zinc-800/80 pt-4"> | |
| 212 | + <MediaUploader | |
| 213 | + label="尾帧图片 (可选)" | |
| 214 | + accept="image/*" | |
| 215 | + type="image" | |
| 216 | + value={lastFrame} | |
| 217 | + onChange={setLastFrame} | |
| 218 | + hint="视频结束画面,不填则自由发散" | |
| 219 | + /> | |
| 220 | + </div> | |
| 221 | + </div> | |
| 222 | + )} | |
| 223 | + | |
| 224 | + {tab === 'ref2va' && ( | |
| 225 | + <div className="bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl p-5 shadow-xs flex flex-col gap-5"> | |
| 226 | + <MediaUploader | |
| 227 | + label="参考图片 (可多选)" | |
| 228 | + accept="image/*" | |
| 229 | + type="image" | |
| 230 | + multiple={true} | |
| 231 | + value={refImages} | |
| 232 | + onChange={setRefImages} | |
| 233 | + hint="角色/场景设定图,无数量限制" | |
| 234 | + /> | |
| 235 | + <div className="border-t border-slate-100 dark:border-zinc-800/80 pt-4"> | |
| 236 | + <MediaUploader | |
| 237 | + label="参考视频 (可选 · 最多3段)" | |
| 238 | + accept="video/*" | |
| 239 | + type="video" | |
| 240 | + multiple={true} | |
| 241 | + maxCount={3} | |
| 242 | + value={refVideos} | |
| 243 | + onChange={setRefVideos} | |
| 244 | + hint="2-15秒动态参考,自动保留音轨" | |
| 245 | + /> | |
| 246 | + </div> | |
| 247 | + <div className="border-t border-slate-100 dark:border-zinc-800/80 pt-4"> | |
| 248 | + <MediaUploader | |
| 249 | + label="独立音频参考 (可选 · 最多3首)" | |
| 250 | + accept="audio/*" | |
| 251 | + type="audio" | |
| 252 | + multiple={true} | |
| 253 | + maxCount={3} | |
| 254 | + value={refAudios} | |
| 255 | + onChange={setRefAudios} | |
| 256 | + hint="背景音乐或台词声音参考" | |
| 257 | + /> | |
| 258 | + </div> | |
| 259 | + </div> | |
| 260 | + )} | |
| 261 | + | |
| 262 | + {/* 核心生成参数配置 */} | |
| 263 | + <div className="bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl p-5 shadow-xs flex flex-col gap-5"> | |
| 264 | + <div className="flex items-center gap-2 text-xs font-bold uppercase tracking-wider text-slate-700 dark:text-zinc-300"> | |
| 265 | + <Sliders className="w-3.5 h-3.5 text-emerald-600 dark:text-emerald-400" /> | |
| 266 | + <span>生成参数与画质规格</span> | |
| 267 | + </div> | |
| 268 | + | |
| 269 | + <div className="grid grid-cols-1 md:grid-cols-2 gap-4"> | |
| 270 | + {/* 分辨率 */} | |
| 271 | + <div className="flex flex-col gap-1.5"> | |
| 272 | + <label className="text-xs text-slate-600 dark:text-zinc-400 font-medium">分辨率与画幅</label> | |
| 273 | + <select | |
| 274 | + value={resValue} | |
| 275 | + onChange={(e) => setResValue(e.target.value)} | |
| 276 | + className="bg-slate-50 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2.5 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 cursor-pointer" | |
| 277 | + > | |
| 278 | + {RESOLUTIONS.map((r) => ( | |
| 279 | + <option key={r.value} value={r.value}> | |
| 280 | + {r.label} | |
| 281 | + </option> | |
| 282 | + ))} | |
| 283 | + </select> | |
| 284 | + </div> | |
| 285 | + | |
| 286 | + {/* 时长 */} | |
| 287 | + <div className="flex flex-col gap-1.5"> | |
| 288 | + <label className="text-xs text-slate-600 dark:text-zinc-400 font-medium">生成时长 (帧数)</label> | |
| 289 | + <select | |
| 290 | + value={durValue} | |
| 291 | + onChange={(e) => setDurValue(e.target.value)} | |
| 292 | + className="bg-slate-50 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2.5 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 cursor-pointer" | |
| 293 | + > | |
| 294 | + {allowedDurations.map((d) => ( | |
| 295 | + <option key={d.value} value={d.value}> | |
| 296 | + {d.label} | |
| 297 | + </option> | |
| 298 | + ))} | |
| 299 | + </select> | |
| 300 | + </div> | |
| 301 | + </div> | |
| 302 | + | |
| 303 | + {/* 显存与时长安全提示 */} | |
| 304 | + {droppedDurations.length > 0 && ( | |
| 305 | + <div className="flex items-center gap-2 p-2.5 bg-amber-50 border border-amber-200 dark:bg-amber-950/30 dark:border-amber-600/30 rounded-xl text-xs text-amber-800 dark:text-amber-300"> | |
| 306 | + <AlertCircle className="w-4 h-4 shrink-0 text-amber-600 dark:text-amber-400" /> | |
| 307 | + <span> | |
| 308 | + {currentRes.label} 实测上限 {currentRes.maxFrames} 帧,已自动过滤超出显存承受的超长档位。 | |
| 309 | + </span> | |
| 310 | + </div> | |
| 311 | + )} | |
| 312 | + | |
| 313 | + {/* Turbo 模式与步数联动 */} | |
| 314 | + <div className="grid grid-cols-1 sm:grid-cols-3 gap-4 pt-3 border-t border-slate-100 dark:border-zinc-800/80 items-center"> | |
| 315 | + {/* Turbo Toggle */} | |
| 316 | + <div className="flex flex-col gap-1.5"> | |
| 317 | + <label className="text-xs text-slate-600 dark:text-zinc-400 font-medium">Turbo 加速 LoRA</label> | |
| 318 | + <div className="flex p-1 bg-slate-100 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl"> | |
| 319 | + <button | |
| 320 | + type="button" | |
| 321 | + onClick={() => setTurbo(false)} | |
| 322 | + className={`flex-1 py-1.5 text-xs font-medium rounded-lg transition-colors cursor-pointer ${ | |
| 323 | + !turbo ? 'bg-white dark:bg-zinc-800 text-slate-800 dark:text-white shadow-xs' : 'text-slate-500 dark:text-zinc-400 hover:text-slate-800' | |
| 324 | + }`} | |
| 325 | + > | |
| 326 | + 关 (稳健多步) | |
| 327 | + </button> | |
| 328 | + <button | |
| 329 | + type="button" | |
| 330 | + onClick={() => setTurbo(true)} | |
| 331 | + className={`flex-1 py-1.5 text-xs font-medium rounded-lg transition-colors cursor-pointer ${ | |
| 332 | + turbo ? 'bg-emerald-600 text-white shadow-xs' : 'text-slate-500 dark:text-zinc-400 hover:text-slate-800' | |
| 333 | + }`} | |
| 334 | + > | |
| 335 | + 开 (4步极速) | |
| 336 | + </button> | |
| 337 | + </div> | |
| 338 | + </div> | |
| 339 | + | |
| 340 | + {/* 采样步数 */} | |
| 341 | + <div className="flex flex-col gap-1.5"> | |
| 342 | + <label className="text-xs text-slate-600 dark:text-zinc-400 font-medium">采样步数 (Steps)</label> | |
| 343 | + <select | |
| 344 | + value={steps} | |
| 345 | + onChange={(e) => setSteps(e.target.value)} | |
| 346 | + className="bg-slate-50 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 cursor-pointer" | |
| 347 | + > | |
| 348 | + {stepOptions.map((s) => ( | |
| 349 | + <option key={s.value} value={s.value}> | |
| 350 | + {s.label} | |
| 351 | + </option> | |
| 352 | + ))} | |
| 353 | + </select> | |
| 354 | + </div> | |
| 355 | + | |
| 356 | + {/* 随机种子 */} | |
| 357 | + <div className="flex flex-col gap-1.5"> | |
| 358 | + <label className="text-xs text-slate-600 dark:text-zinc-400 font-medium">随机种子 (Seed)</label> | |
| 359 | + <select | |
| 360 | + value={seed} | |
| 361 | + onChange={(e) => setSeed(e.target.value)} | |
| 362 | + className="bg-slate-50 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 cursor-pointer" | |
| 363 | + > | |
| 364 | + {SEED_OPTIONS.map((s) => ( | |
| 365 | + <option key={s.value} value={s.value}> | |
| 366 | + {s.label} | |
| 367 | + </option> | |
| 368 | + ))} | |
| 369 | + </select> | |
| 370 | + </div> | |
| 371 | + </div> | |
| 372 | + | |
| 373 | + {/* 高级参数折叠面板 */} | |
| 374 | + <div className="pt-2"> | |
| 375 | + <button | |
| 376 | + type="button" | |
| 377 | + onClick={() => setShowAdvanced(!showAdvanced)} | |
| 378 | + className="flex items-center gap-1.5 text-xs font-medium text-slate-600 dark:text-zinc-400 hover:text-slate-900 dark:hover:text-zinc-200 transition-colors cursor-pointer" | |
| 379 | + > | |
| 380 | + <span>高级调参 (CFG / 负面提示词)</span> | |
| 381 | + {showAdvanced ? <ChevronUp className="w-3.5 h-3.5" /> : <ChevronDown className="w-3.5 h-3.5" />} | |
| 382 | + </button> | |
| 383 | + | |
| 384 | + {showAdvanced && ( | |
| 385 | + <div className="mt-3 p-4 bg-slate-50 dark:bg-zinc-950/50 border border-slate-200 dark:border-zinc-800/80 rounded-xl flex flex-col gap-4"> | |
| 386 | + <div className="flex flex-col gap-1.5"> | |
| 387 | + <label className="text-xs text-slate-600 dark:text-zinc-400">CFG Scale (留空默认 1.0)</label> | |
| 388 | + <input | |
| 389 | + type="number" | |
| 390 | + step="0.1" | |
| 391 | + min="0" | |
| 392 | + placeholder="留空 = 1.0 (蒸馏 LoRA 调太高易出伪影)" | |
| 393 | + value={cfgScale} | |
| 394 | + onChange={(e) => setCfgScale(e.target.value)} | |
| 395 | + className="bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500" | |
| 396 | + /> | |
| 397 | + </div> | |
| 398 | + <div className="flex flex-col gap-1.5"> | |
| 399 | + <label className="text-xs text-slate-600 dark:text-zinc-400">负面提示词 Negative Prompt</label> | |
| 400 | + <textarea | |
| 401 | + rows={2} | |
| 402 | + placeholder="例如:模糊,低画质,肢体变形,拖影,五官扭曲" | |
| 403 | + value={negativePrompt} | |
| 404 | + onChange={(e) => setNegativePrompt(e.target.value)} | |
| 405 | + className="bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-xl p-2.5 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 resize-none" | |
| 406 | + /> | |
| 407 | + </div> | |
| 408 | + </div> | |
| 409 | + )} | |
| 410 | + </div> | |
| 411 | + </div> | |
| 412 | + | |
| 413 | + {/* 错误提示 */} | |
| 414 | + {err && ( | |
| 415 | + <div className="p-3 bg-rose-50 border border-rose-200 dark:bg-rose-950/60 dark:border-rose-500/40 rounded-xl text-xs text-rose-700 dark:text-rose-300 flex items-center gap-2"> | |
| 416 | + <AlertCircle className="w-4 h-4 shrink-0 text-rose-500" /> | |
| 417 | + <span>{err}</span> | |
| 418 | + </div> | |
| 419 | + )} | |
| 420 | + | |
| 421 | + {/* 操作按钮栏 */} | |
| 422 | + <div className="flex items-center justify-end gap-3 pb-8"> | |
| 423 | + <button | |
| 424 | + type="button" | |
| 425 | + onClick={handleClear} | |
| 426 | + className="px-5 py-2.5 bg-slate-100 hover:bg-slate-200 dark:bg-zinc-800 dark:hover:bg-zinc-700 text-slate-700 dark:text-zinc-300 text-xs font-medium rounded-xl transition-colors cursor-pointer border border-slate-200 dark:border-zinc-700" | |
| 427 | + > | |
| 428 | + 清空表单 | |
| 429 | + </button> | |
| 430 | + <button | |
| 431 | + type="submit" | |
| 432 | + disabled={submitting} | |
| 433 | + className="px-7 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white text-xs font-semibold rounded-xl transition-all shadow-md shadow-emerald-600/30 flex items-center gap-2 cursor-pointer disabled:opacity-50" | |
| 434 | + > | |
| 435 | + {submitting ? <RefreshCw className="w-4 h-4 animate-spin" /> : <Send className="w-4 h-4" />} | |
| 436 | + <span>{submitting ? '正在提交…' : '立即生成视频'}</span> | |
| 437 | + </button> | |
| 438 | + </div> | |
| 439 | + </form> | |
| 440 | + </div> | |
| 441 | + ); | |
| 442 | +} | ... | ... |
h3-console/frontend/src/components/JobCard.jsx
0 → 100644
| 1 | +import React, { useState, useRef } from 'react'; | |
| 2 | +import { Play, RotateCcw, ArrowUpToLine, Trash2, MoreVertical, Clock } from 'lucide-react'; | |
| 3 | +import { formatTimeAgo, thumbUrl, h3FileUrl, getH3Base, getJobKind } from '../utils'; | |
| 4 | + | |
| 5 | +export default function JobCard({ job, isSelected, onSelect, onRerun, onPrioritize, onDelete }) { | |
| 6 | + const [isHovered, setIsHovered] = useState(false); | |
| 7 | + const [showMenu, setShowMenu] = useState(false); | |
| 8 | + const videoRef = useRef(null); | |
| 9 | + | |
| 10 | + const req = job.req || {}; | |
| 11 | + const kind = getJobKind(req); | |
| 12 | + const isDone = job.status === 'done'; | |
| 13 | + const isRunning = job.status === 'running'; | |
| 14 | + const isQueued = job.status === 'queued'; | |
| 15 | + const isFailed = job.status === 'failed'; | |
| 16 | + const isCancelled = job.status === 'cancelled'; | |
| 17 | + | |
| 18 | + // 进度计算 | |
| 19 | + const curStep = job.step || 0; | |
| 20 | + const totalSteps = job.total_steps || req.steps || 20; | |
| 21 | + const progressPct = totalSteps > 0 ? Math.min(100, Math.max(curStep > 0 ? 5 : 2, Math.round((curStep / totalSteps) * 100))) : 0; | |
| 22 | + | |
| 23 | + // 悬停时自动微播放 | |
| 24 | + const handleMouseEnter = () => { | |
| 25 | + setIsHovered(true); | |
| 26 | + if (isDone && videoRef.current) { | |
| 27 | + videoRef.current.currentTime = 0; | |
| 28 | + videoRef.current.play().catch(() => {}); | |
| 29 | + } | |
| 30 | + }; | |
| 31 | + | |
| 32 | + const handleMouseLeave = () => { | |
| 33 | + setIsHovered(false); | |
| 34 | + setShowMenu(false); | |
| 35 | + if (isDone && videoRef.current) { | |
| 36 | + videoRef.current.pause(); | |
| 37 | + } | |
| 38 | + }; | |
| 39 | + | |
| 40 | + // 缩略图地址 | |
| 41 | + const videoFileUrl = isDone ? h3FileUrl(`${getH3Base()}/v1/videos/${job.id}/file`) : null; | |
| 42 | + const coverImg = req.first_frame_url || (req.reference_image_urls || [])[0]; | |
| 43 | + | |
| 44 | + return ( | |
| 45 | + <div | |
| 46 | + onClick={() => onSelect(job.id)} | |
| 47 | + onMouseEnter={handleMouseEnter} | |
| 48 | + onMouseLeave={handleMouseLeave} | |
| 49 | + className={`group relative p-3 rounded-2xl border transition-all duration-200 cursor-pointer flex flex-col gap-2 ${ | |
| 50 | + isSelected | |
| 51 | + ? 'bg-emerald-50/80 border-emerald-500 ring-1 ring-emerald-500/40 shadow-xs' | |
| 52 | + : 'bg-white border-slate-200/90 hover:bg-slate-50/80 hover:border-slate-300 shadow-xs' | |
| 53 | + }`} | |
| 54 | + > | |
| 55 | + <div className="flex gap-3.5"> | |
| 56 | + {/* 缩略图容器 (自适应比例) */} | |
| 57 | + <div className="relative w-24 h-32 shrink-0 rounded-xl overflow-hidden bg-slate-100 border border-slate-200 flex items-center justify-center"> | |
| 58 | + {isDone && videoFileUrl ? ( | |
| 59 | + <video | |
| 60 | + ref={videoRef} | |
| 61 | + src={videoFileUrl} | |
| 62 | + muted | |
| 63 | + loop | |
| 64 | + playsInline | |
| 65 | + preload="metadata" | |
| 66 | + className="w-full h-full object-cover" | |
| 67 | + /> | |
| 68 | + ) : coverImg ? ( | |
| 69 | + <img | |
| 70 | + src={thumbUrl(coverImg)} | |
| 71 | + alt="" | |
| 72 | + loading="lazy" | |
| 73 | + className="w-full h-full object-cover" | |
| 74 | + /> | |
| 75 | + ) : ( | |
| 76 | + <div className="flex flex-col items-center justify-center text-slate-400 text-[11px] gap-1 p-2 text-center"> | |
| 77 | + <span className="font-semibold text-slate-600">{kind.label}</span> | |
| 78 | + <span className="text-[10px] opacity-70">{job.partition || 'H3'}</span> | |
| 79 | + </div> | |
| 80 | + )} | |
| 81 | + | |
| 82 | + {/* 状态悬浮微标 */} | |
| 83 | + {isDone && ( | |
| 84 | + <div className="absolute top-1.5 left-1.5 p-1 bg-emerald-600/90 rounded-md backdrop-blur-md text-white shadow-xs"> | |
| 85 | + <Play className="w-2.5 h-2.5 fill-current" /> | |
| 86 | + </div> | |
| 87 | + )} | |
| 88 | + {isRunning && ( | |
| 89 | + <div className="absolute inset-0 bg-emerald-950/20 backdrop-blur-[1px] flex flex-col items-center justify-center gap-1"> | |
| 90 | + <span className="text-xs font-bold text-emerald-700 bg-white/90 px-1.5 py-0.5 rounded shadow-xs font-mono"> | |
| 91 | + {progressPct}% | |
| 92 | + </span> | |
| 93 | + </div> | |
| 94 | + )} | |
| 95 | + {isQueued && ( | |
| 96 | + <div className="absolute bottom-1.5 left-1.5 px-1.5 py-0.5 bg-blue-600/90 text-white text-[10px] rounded font-mono shadow-xs"> | |
| 97 | + {job.queue_position ? `#${job.queue_position}` : '排队中'} | |
| 98 | + </div> | |
| 99 | + )} | |
| 100 | + </div> | |
| 101 | + | |
| 102 | + {/* 右侧核心信息 */} | |
| 103 | + <div className="flex-1 min-w-0 flex flex-col justify-between py-0.5"> | |
| 104 | + <div> | |
| 105 | + {/* 顶栏:短 ID 与状态胶囊 */} | |
| 106 | + <div className="flex items-center justify-between gap-2"> | |
| 107 | + <span className="text-xs font-mono font-bold text-slate-600 group-hover:text-slate-900 transition-colors"> | |
| 108 | + #{job.id.substring(0, 8)} | |
| 109 | + </span> | |
| 110 | + | |
| 111 | + {/* 状态 Pill */} | |
| 112 | + <div className="flex items-center gap-1.5"> | |
| 113 | + {isDone && ( | |
| 114 | + <span className="px-2 py-0.5 text-[10px] font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200 rounded-full"> | |
| 115 | + 已完成 | |
| 116 | + </span> | |
| 117 | + )} | |
| 118 | + {isRunning && ( | |
| 119 | + <span className="px-2 py-0.5 text-[10px] font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200 rounded-full flex items-center gap-1"> | |
| 120 | + <span className="w-1.5 h-1.5 rounded-full bg-emerald-500 animate-ping"></span> | |
| 121 | + 采样 {curStep}/{totalSteps}步 | |
| 122 | + </span> | |
| 123 | + )} | |
| 124 | + {isQueued && ( | |
| 125 | + <span className="px-2 py-0.5 text-[10px] font-semibold bg-slate-100 text-slate-700 border border-slate-200 rounded-full"> | |
| 126 | + 排队中 | |
| 127 | + </span> | |
| 128 | + )} | |
| 129 | + {isFailed && ( | |
| 130 | + <span className="px-2 py-0.5 text-[10px] font-semibold bg-rose-50 text-rose-700 border border-rose-200 rounded-full"> | |
| 131 | + 失败 | |
| 132 | + </span> | |
| 133 | + )} | |
| 134 | + {isCancelled && ( | |
| 135 | + <span className="px-2 py-0.5 text-[10px] font-semibold bg-slate-100 text-slate-500 border border-slate-200 rounded-full"> | |
| 136 | + 已取消 | |
| 137 | + </span> | |
| 138 | + )} | |
| 139 | + </div> | |
| 140 | + </div> | |
| 141 | + | |
| 142 | + {/* Prompt 摘要 */} | |
| 143 | + <p className="mt-1.5 text-xs text-slate-700 line-clamp-3 leading-relaxed break-words font-normal"> | |
| 144 | + {req.prompt || '(无 prompt 描述)'} | |
| 145 | + </p> | |
| 146 | + </div> | |
| 147 | + | |
| 148 | + {/* 底栏:规格、时间与快捷菜单 */} | |
| 149 | + <div className="mt-2 pt-2 border-t border-slate-100 flex items-center justify-between text-[11px] text-slate-500"> | |
| 150 | + <div className="flex items-center gap-2"> | |
| 151 | + <span className="px-1.5 py-0.5 bg-slate-100 rounded text-slate-600 font-mono text-[10px]"> | |
| 152 | + {kind.label} · {req.width ? `${req.width}p` : ''} | |
| 153 | + </span> | |
| 154 | + <span className="flex items-center gap-1 text-slate-400"> | |
| 155 | + <Clock className="w-3 h-3" /> | |
| 156 | + <span>{formatTimeAgo(job.created_at)}</span> | |
| 157 | + </span> | |
| 158 | + </div> | |
| 159 | + | |
| 160 | + {/* 三点操作菜单 */} | |
| 161 | + <div className="relative" onClick={(e) => e.stopPropagation()}> | |
| 162 | + <button | |
| 163 | + onClick={() => setShowMenu(!showMenu)} | |
| 164 | + className="p-1 hover:bg-slate-100 rounded-md text-slate-400 hover:text-slate-700 transition-colors cursor-pointer" | |
| 165 | + > | |
| 166 | + <MoreVertical className="w-3.5 h-3.5" /> | |
| 167 | + </button> | |
| 168 | + | |
| 169 | + {showMenu && ( | |
| 170 | + <div className="absolute right-0 bottom-full mb-1.5 w-32 py-1 bg-white border border-slate-200 rounded-xl shadow-xl z-30 text-xs flex flex-col"> | |
| 171 | + <button | |
| 172 | + onClick={() => { setShowMenu(false); onRerun(job); }} | |
| 173 | + className="px-3 py-1.5 flex items-center gap-2 text-slate-700 hover:bg-slate-50 transition-colors cursor-pointer" | |
| 174 | + > | |
| 175 | + <RotateCcw className="w-3.5 h-3.5 text-emerald-600" /> | |
| 176 | + <span>复用重跑</span> | |
| 177 | + </button> | |
| 178 | + {isQueued && ( | |
| 179 | + <button | |
| 180 | + onClick={() => { setShowMenu(false); onPrioritize(job.id); }} | |
| 181 | + className="px-3 py-1.5 flex items-center gap-2 text-slate-700 hover:bg-slate-50 transition-colors cursor-pointer" | |
| 182 | + > | |
| 183 | + <ArrowUpToLine className="w-3.5 h-3.5 text-indigo-600" /> | |
| 184 | + <span>优先插队</span> | |
| 185 | + </button> | |
| 186 | + )} | |
| 187 | + <div className="my-1 border-t border-slate-100"></div> | |
| 188 | + <button | |
| 189 | + onClick={() => { setShowMenu(false); onDelete(job.id); }} | |
| 190 | + className="px-3 py-1.5 flex items-center gap-2 text-rose-600 hover:bg-rose-50 transition-colors cursor-pointer" | |
| 191 | + > | |
| 192 | + <Trash2 className="w-3.5 h-3.5" /> | |
| 193 | + <span>移入回收站</span> | |
| 194 | + </button> | |
| 195 | + </div> | |
| 196 | + )} | |
| 197 | + </div> | |
| 198 | + </div> | |
| 199 | + </div> | |
| 200 | + </div> | |
| 201 | + | |
| 202 | + {/* 处于运行中时,卡片底部直接展现清晰的横向进度条 */} | |
| 203 | + {isRunning && ( | |
| 204 | + <div className="w-full bg-slate-100 rounded-full h-1.5 overflow-hidden mt-1 border border-slate-200/60"> | |
| 205 | + <div | |
| 206 | + className="bg-emerald-500 h-full transition-all duration-300 rounded-full" | |
| 207 | + style={{ width: `${progressPct}%` }} | |
| 208 | + /> | |
| 209 | + </div> | |
| 210 | + )} | |
| 211 | + </div> | |
| 212 | + ); | |
| 213 | +} | ... | ... |
h3-console/frontend/src/components/MediaUploader.jsx
0 → 100644
| 1 | +import React, { useState, useRef } from 'react'; | |
| 2 | +import { Upload, Link as LinkIcon, X, Film, Music, Image as ImageIcon, ExternalLink } from 'lucide-react'; | |
| 3 | +import { uploadAsset } from '../api'; | |
| 4 | +import { filenameFromUrl, thumbUrl, localAsset } from '../utils'; | |
| 5 | + | |
| 6 | +export default function MediaUploader({ | |
| 7 | + label, | |
| 8 | + accept = 'image/*', | |
| 9 | + type = 'image', // 'image' | 'video' | 'audio' | |
| 10 | + multiple = false, | |
| 11 | + maxCount = 99, | |
| 12 | + value, // string | string[] | |
| 13 | + onChange, | |
| 14 | + hint, | |
| 15 | +}) { | |
| 16 | + const [urlInput, setUrlInput] = useState(''); | |
| 17 | + const [isUploading, setIsUploading] = useState(false); | |
| 18 | + const [isDragOver, setIsDragOver] = useState(false); | |
| 19 | + const fileInputRef = useRef(null); | |
| 20 | + | |
| 21 | + const items = multiple ? (Array.isArray(value) ? value : []) : (value ? [value] : []); | |
| 22 | + | |
| 23 | + const handleFiles = async (files) => { | |
| 24 | + if (!files || files.length === 0) return; | |
| 25 | + setIsUploading(true); | |
| 26 | + try { | |
| 27 | + const newUrls = []; | |
| 28 | + for (const file of Array.from(files)) { | |
| 29 | + if (items.length + newUrls.length >= maxCount) break; | |
| 30 | + const res = await uploadAsset(file); | |
| 31 | + if (res.url) newUrls.push(res.url); | |
| 32 | + } | |
| 33 | + if (multiple) { | |
| 34 | + onChange([...items, ...newUrls].slice(0, maxCount)); | |
| 35 | + } else if (newUrls.length > 0) { | |
| 36 | + onChange(newUrls[0]); | |
| 37 | + } | |
| 38 | + } catch (e) { | |
| 39 | + alert('上传失败: ' + e.message); | |
| 40 | + } finally { | |
| 41 | + setIsUploading(false); | |
| 42 | + if (fileInputRef.current) fileInputRef.current.value = ''; | |
| 43 | + } | |
| 44 | + }; | |
| 45 | + | |
| 46 | + const handleAddUrl = (e) => { | |
| 47 | + if (e.key === 'Enter') { | |
| 48 | + e.preventDefault(); | |
| 49 | + const u = urlInput.trim(); | |
| 50 | + if (!u) return; | |
| 51 | + if (multiple) { | |
| 52 | + if (items.length >= maxCount) { | |
| 53 | + alert(`最多只允许添加 ${maxCount} 个`); | |
| 54 | + return; | |
| 55 | + } | |
| 56 | + onChange([...items, u]); | |
| 57 | + } else { | |
| 58 | + onChange(u); | |
| 59 | + } | |
| 60 | + setUrlInput(''); | |
| 61 | + } | |
| 62 | + }; | |
| 63 | + | |
| 64 | + const handleRemove = (index) => { | |
| 65 | + if (multiple) { | |
| 66 | + const next = items.filter((_, i) => i !== index); | |
| 67 | + onChange(next); | |
| 68 | + } else { | |
| 69 | + onChange(null); | |
| 70 | + } | |
| 71 | + }; | |
| 72 | + | |
| 73 | + // 支持键盘粘贴截图 | |
| 74 | + const handlePaste = (e) => { | |
| 75 | + const clipboardFiles = e.clipboardData?.files; | |
| 76 | + if (clipboardFiles && clipboardFiles.length > 0) { | |
| 77 | + e.preventDefault(); | |
| 78 | + handleFiles(clipboardFiles); | |
| 79 | + } | |
| 80 | + }; | |
| 81 | + | |
| 82 | + return ( | |
| 83 | + <div className="flex flex-col gap-2.5" onPaste={handlePaste}> | |
| 84 | + <div className="flex items-center justify-between"> | |
| 85 | + <label className="text-xs font-semibold uppercase tracking-wider text-zinc-300"> | |
| 86 | + {label} {maxCount < 99 && <span className="text-zinc-500 font-normal">({items.length}/{maxCount})</span>} | |
| 87 | + </label> | |
| 88 | + {hint && <span className="text-xs text-zinc-500">{hint}</span>} | |
| 89 | + </div> | |
| 90 | + | |
| 91 | + {/* 拖拽上传与输入区 */} | |
| 92 | + {(items.length < maxCount || !multiple) && ( | |
| 93 | + <div | |
| 94 | + onDragOver={(e) => { e.preventDefault(); setIsDragOver(true); }} | |
| 95 | + onDragLeave={() => setIsDragOver(false)} | |
| 96 | + onDrop={(e) => { e.preventDefault(); setIsDragOver(false); handleFiles(e.dataTransfer.files); }} | |
| 97 | + className={`relative border-2 border-dashed rounded-xl p-3.5 transition-all flex flex-col sm:flex-row items-center gap-3 bg-zinc-900/60 ${ | |
| 98 | + isDragOver ? 'border-emerald-500 bg-emerald-950/20 shadow-inner' : 'border-zinc-800 hover:border-zinc-700' | |
| 99 | + }`} | |
| 100 | + > | |
| 101 | + <input | |
| 102 | + type="file" | |
| 103 | + ref={fileInputRef} | |
| 104 | + accept={accept} | |
| 105 | + multiple={multiple} | |
| 106 | + className="hidden" | |
| 107 | + onChange={(e) => handleFiles(e.target.files)} | |
| 108 | + /> | |
| 109 | + | |
| 110 | + <button | |
| 111 | + type="button" | |
| 112 | + disabled={isUploading} | |
| 113 | + onClick={() => fileInputRef.current?.click()} | |
| 114 | + className="w-full sm:w-auto px-4 py-2 bg-zinc-800 hover:bg-zinc-700/80 text-zinc-200 text-xs font-medium rounded-lg flex items-center justify-center gap-2 border border-zinc-700/60 transition-colors shrink-0 cursor-pointer shadow-sm disabled:opacity-50" | |
| 115 | + > | |
| 116 | + <Upload className="w-4 h-4 text-emerald-400" /> | |
| 117 | + <span>{isUploading ? '正在上传…' : '选择或拖拽文件'}</span> | |
| 118 | + </button> | |
| 119 | + | |
| 120 | + <div className="relative flex-1 w-full"> | |
| 121 | + <LinkIcon className="absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-zinc-500" /> | |
| 122 | + <input | |
| 123 | + type="url" | |
| 124 | + placeholder="或粘贴 URL,回车添加(支持 Ctrl+V 粘贴截图)" | |
| 125 | + value={urlInput} | |
| 126 | + onChange={(e) => setUrlInput(e.target.value)} | |
| 127 | + onKeyDown={handleAddUrl} | |
| 128 | + className="w-full pl-9 pr-3 py-1.5 bg-zinc-950/60 border border-zinc-800 focus:border-emerald-500/60 focus:ring-1 focus:ring-emerald-500/40 rounded-lg text-xs text-zinc-200 placeholder-zinc-500 outline-none transition-all" | |
| 129 | + /> | |
| 130 | + </div> | |
| 131 | + </div> | |
| 132 | + )} | |
| 133 | + | |
| 134 | + {/* 媒体缩略预览网格 */} | |
| 135 | + {items.length > 0 && ( | |
| 136 | + <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3 mt-1"> | |
| 137 | + {items.map((u, idx) => { | |
| 138 | + const rawName = filenameFromUrl(u); | |
| 139 | + return ( | |
| 140 | + <div | |
| 141 | + key={idx} | |
| 142 | + className="group relative bg-zinc-900 border border-zinc-800 rounded-xl overflow-hidden flex flex-col shadow-md hover:border-zinc-700 transition-all" | |
| 143 | + > | |
| 144 | + {/* 媒体呈现 */} | |
| 145 | + <div className="relative aspect-video bg-black flex items-center justify-center overflow-hidden"> | |
| 146 | + {type === 'image' && ( | |
| 147 | + <img | |
| 148 | + src={thumbUrl(u)} | |
| 149 | + alt={rawName} | |
| 150 | + className="w-full h-full object-cover transition-transform group-hover:scale-105 duration-300" | |
| 151 | + /> | |
| 152 | + )} | |
| 153 | + {type === 'video' && ( | |
| 154 | + <video | |
| 155 | + src={localAsset(u)} | |
| 156 | + controls | |
| 157 | + className="w-full h-full object-contain bg-black" | |
| 158 | + /> | |
| 159 | + )} | |
| 160 | + {type === 'audio' && ( | |
| 161 | + <div className="p-2 w-full flex flex-col items-center justify-center gap-1 text-zinc-400"> | |
| 162 | + <Music className="w-6 h-6 text-emerald-400 mb-1" /> | |
| 163 | + <audio src={localAsset(u)} controls className="w-full h-8" /> | |
| 164 | + </div> | |
| 165 | + )} | |
| 166 | + | |
| 167 | + {/* 悬停快速操作 */} | |
| 168 | + <div className="absolute top-1.5 right-1.5 flex gap-1 z-10"> | |
| 169 | + <a | |
| 170 | + href={u} | |
| 171 | + target="_blank" | |
| 172 | + rel="noreferrer" | |
| 173 | + className="p-1 bg-black/60 hover:bg-black/90 text-zinc-300 hover:text-white rounded-md backdrop-blur-md transition-colors" | |
| 174 | + title="打开原图" | |
| 175 | + > | |
| 176 | + <ExternalLink className="w-3.5 h-3.5" /> | |
| 177 | + </a> | |
| 178 | + <button | |
| 179 | + type="button" | |
| 180 | + onClick={() => handleRemove(idx)} | |
| 181 | + className="p-1 bg-rose-950/80 hover:bg-rose-600 text-rose-300 hover:text-white rounded-md backdrop-blur-md transition-colors cursor-pointer" | |
| 182 | + title="删除" | |
| 183 | + > | |
| 184 | + <X className="w-3.5 h-3.5" /> | |
| 185 | + </button> | |
| 186 | + </div> | |
| 187 | + </div> | |
| 188 | + | |
| 189 | + {/* 底部文件名 */} | |
| 190 | + <div className="px-2.5 py-1.5 bg-zinc-900/90 text-[11px] text-zinc-400 truncate border-t border-zinc-800/80 font-mono" title={rawName}> | |
| 191 | + {rawName || '媒体文件'} | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + ); | |
| 195 | + })} | |
| 196 | + </div> | |
| 197 | + )} | |
| 198 | + </div> | |
| 199 | + ); | |
| 200 | +} | |
| 201 | + | ... | ... |
h3-console/frontend/src/components/Modal.jsx
0 → 100644
| 1 | +import React from 'react'; | |
| 2 | +import { AlertTriangle, X } from 'lucide-react'; | |
| 3 | + | |
| 4 | +export default function Modal({ isOpen, title, content, confirmText = '确定', cancelText = '取消', isDanger = false, onConfirm, onCancel }) { | |
| 5 | + if (!isOpen) return null; | |
| 6 | + | |
| 7 | + return ( | |
| 8 | + <div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/70 backdrop-blur-sm animate-in fade-in duration-200"> | |
| 9 | + <div className="relative w-full max-w-md p-6 bg-zinc-900 border border-zinc-800 rounded-2xl shadow-2xl text-zinc-100 animate-in zoom-in-95 duration-200"> | |
| 10 | + <div className="flex items-start gap-4"> | |
| 11 | + <div className={`p-3 rounded-xl shrink-0 ${isDanger ? 'bg-rose-500/10 text-rose-400' : 'bg-indigo-500/10 text-indigo-400'}`}> | |
| 12 | + <AlertTriangle className="w-6 h-6" /> | |
| 13 | + </div> | |
| 14 | + <div className="flex-1"> | |
| 15 | + <h3 className="text-base font-semibold text-zinc-100">{title}</h3> | |
| 16 | + <div className="mt-2 text-sm text-zinc-400 leading-relaxed whitespace-pre-wrap">{content}</div> | |
| 17 | + </div> | |
| 18 | + <button | |
| 19 | + onClick={onCancel} | |
| 20 | + className="text-zinc-500 hover:text-zinc-300 p-1 rounded-lg hover:bg-zinc-800 transition-colors" | |
| 21 | + > | |
| 22 | + <X className="w-5 h-5" /> | |
| 23 | + </button> | |
| 24 | + </div> | |
| 25 | + | |
| 26 | + <div className="flex justify-end gap-3 mt-6"> | |
| 27 | + <button | |
| 28 | + onClick={onCancel} | |
| 29 | + className="px-4 py-2 text-sm font-medium text-zinc-300 bg-zinc-800 hover:bg-zinc-700/80 rounded-xl transition-colors cursor-pointer" | |
| 30 | + > | |
| 31 | + {cancelText} | |
| 32 | + </button> | |
| 33 | + <button | |
| 34 | + onClick={onConfirm} | |
| 35 | + className={`px-4 py-2 text-sm font-medium text-white rounded-xl transition-all cursor-pointer shadow-lg ${ | |
| 36 | + isDanger | |
| 37 | + ? 'bg-rose-600 hover:bg-rose-500 shadow-rose-950/50' | |
| 38 | + : 'bg-emerald-600 hover:bg-emerald-500 shadow-emerald-950/50' | |
| 39 | + }`} | |
| 40 | + > | |
| 41 | + {confirmText} | |
| 42 | + </button> | |
| 43 | + </div> | |
| 44 | + </div> | |
| 45 | + </div> | |
| 46 | + ); | |
| 47 | +} | |
| 48 | + | ... | ... |
h3-console/frontend/src/components/Sidebar.jsx
0 → 100644
| 1 | +import React, { useState, useEffect } from 'react'; | |
| 2 | +import { | |
| 3 | + Plus, Search, ArrowUpDown, Trash2, KeyRound, | |
| 4 | + ChevronLeft, ChevronRight, Server, RefreshCw | |
| 5 | +} from 'lucide-react'; | |
| 6 | +import JobCard from './JobCard'; | |
| 7 | +import { fetchJobs, prioritizeJob, deleteJob, restoreJob, resetGpu } from '../api'; | |
| 8 | +import { getToken, getH3Base } from '../utils'; | |
| 9 | +import { useToast } from './Toast'; | |
| 10 | +import Modal from './Modal'; | |
| 11 | + | |
| 12 | +export default function Sidebar({ | |
| 13 | + selectedId, | |
| 14 | + onSelectTask, | |
| 15 | + onCreateTask, | |
| 16 | + onRerunTask, | |
| 17 | + backendInfo, | |
| 18 | + onRefreshBackends, | |
| 19 | + onManageToken, | |
| 20 | +}) { | |
| 21 | + const { addToast } = useToast(); | |
| 22 | + const [jobs, setJobs] = useState([]); | |
| 23 | + const [totalJobs, setTotalJobs] = useState(0); | |
| 24 | + const [page, setPage] = useState(1); | |
| 25 | + const [searchQ, setSearchQ] = useState(''); | |
| 26 | + const [statusFilter, setStatusFilter] = useState(''); | |
| 27 | + const [kindFilter, setKindFilter] = useState(''); | |
| 28 | + const [sortOrder, setSortOrder] = useState('desc'); | |
| 29 | + const [viewingTrash, setViewingTrash] = useState(false); | |
| 30 | + const [trashJobs, setTrashJobs] = useState([]); | |
| 31 | + const [loading, setLoading] = useState(false); | |
| 32 | + | |
| 33 | + // 模态弹窗状态 | |
| 34 | + const [confirmModal, setConfirmModal] = useState({ isOpen: false, title: '', content: '', isDanger: false, onConfirm: null }); | |
| 35 | + | |
| 36 | + // 刷新任务列表 | |
| 37 | + const loadJobs = async (targetPage = page) => { | |
| 38 | + setLoading(true); | |
| 39 | + try { | |
| 40 | + if (viewingTrash) { | |
| 41 | + const data = await fetchJobs({ trash: true }); | |
| 42 | + setTrashJobs(data.jobs || []); | |
| 43 | + } else { | |
| 44 | + const data = await fetchJobs({ | |
| 45 | + page: targetPage, | |
| 46 | + limit: 20, | |
| 47 | + q: searchQ.trim(), | |
| 48 | + status: statusFilter, | |
| 49 | + kind: kindFilter, | |
| 50 | + sort: sortOrder, | |
| 51 | + }); | |
| 52 | + setJobs(data.jobs || []); | |
| 53 | + setTotalJobs(data.total || 0); | |
| 54 | + } | |
| 55 | + } catch (e) { | |
| 56 | + console.error(e); | |
| 57 | + } finally { | |
| 58 | + setLoading(false); | |
| 59 | + } | |
| 60 | + }; | |
| 61 | + | |
| 62 | + useEffect(() => { | |
| 63 | + loadJobs(1); | |
| 64 | + setPage(1); | |
| 65 | + }, [searchQ, statusFilter, kindFilter, sortOrder, viewingTrash]); | |
| 66 | + | |
| 67 | + // 定时每 5 秒轮询主列表 | |
| 68 | + useEffect(() => { | |
| 69 | + const timer = setInterval(() => { | |
| 70 | + if (!viewingTrash) loadJobs(page); | |
| 71 | + }, 5000); | |
| 72 | + return () => clearInterval(timer); | |
| 73 | + }, [page, searchQ, statusFilter, kindFilter, sortOrder, viewingTrash]); | |
| 74 | + | |
| 75 | + const handlePrioritize = async (id) => { | |
| 76 | + try { | |
| 77 | + const res = await prioritizeJob(id); | |
| 78 | + addToast(`任务 #${id.substring(0, 8)} 已插队到第 ${res.queue_position} 位`, 'success'); | |
| 79 | + loadJobs(page); | |
| 80 | + } catch (e) { | |
| 81 | + addToast('插队失败: ' + e.message, 'error'); | |
| 82 | + } | |
| 83 | + }; | |
| 84 | + | |
| 85 | + const handleDelete = async (id) => { | |
| 86 | + try { | |
| 87 | + await deleteJob(id); | |
| 88 | + addToast('已将任务移入回收站', 'info'); | |
| 89 | + if (selectedId === id) onCreateTask(); | |
| 90 | + loadJobs(page); | |
| 91 | + } catch (e) { | |
| 92 | + addToast('删除失败: ' + e.message, 'error'); | |
| 93 | + } | |
| 94 | + }; | |
| 95 | + | |
| 96 | + const handleRestore = async (id) => { | |
| 97 | + try { | |
| 98 | + await restoreJob(id); | |
| 99 | + addToast('任务已从回收站恢复', 'success'); | |
| 100 | + loadJobs(); | |
| 101 | + } catch (e) { | |
| 102 | + addToast('恢复失败: ' + e.message, 'error'); | |
| 103 | + } | |
| 104 | + }; | |
| 105 | + | |
| 106 | + const handleResetGpu = () => { | |
| 107 | + setConfirmModal({ | |
| 108 | + isOpen: true, | |
| 109 | + title: '重置整个服务的 GPU 显存', | |
| 110 | + content: '确定要触发硬重启?\n这会打断当前正在执行的任务(如果有),并重启后端的 Ray 与推理进程以回收显存泄露。\n大约需要耗时 15-20 秒,重置完成前无法提交新任务。', | |
| 111 | + isDanger: true, | |
| 112 | + onConfirm: async () => { | |
| 113 | + setConfirmModal((prev) => ({ ...prev, isOpen: false })); | |
| 114 | + try { | |
| 115 | + await resetGpu(); | |
| 116 | + addToast('已触发 GPU 重启,正在回收显存…', 'info'); | |
| 117 | + if (onRefreshBackends) onRefreshBackends(); | |
| 118 | + } catch (e) { | |
| 119 | + addToast('重置失败: ' + e.message, 'error'); | |
| 120 | + } | |
| 121 | + }, | |
| 122 | + }); | |
| 123 | + }; | |
| 124 | + | |
| 125 | + const totalPages = Math.max(1, Math.ceil(totalJobs / 20)); | |
| 126 | + | |
| 127 | + return ( | |
| 128 | + <aside className="w-full md:w-[390px] lg:w-[420px] shrink-0 border-r border-slate-200 bg-white flex flex-col h-full select-none shadow-xs"> | |
| 129 | + {/* 顶部标题与新建按钮 */} | |
| 130 | + <div className="p-4 border-b border-slate-200 flex flex-col gap-3"> | |
| 131 | + <div className="flex items-center justify-between"> | |
| 132 | + <div className="flex items-center gap-2"> | |
| 133 | + <div className="w-2.5 h-2.5 rounded-full bg-emerald-500 shadow-xs shadow-emerald-500/50" /> | |
| 134 | + <h1 className="text-sm font-bold tracking-wide text-slate-800">H3 Console</h1> | |
| 135 | + </div> | |
| 136 | + <span className="text-[11px] font-mono text-slate-400">AI Video Studio</span> | |
| 137 | + </div> | |
| 138 | + | |
| 139 | + <button | |
| 140 | + onClick={onCreateTask} | |
| 141 | + className={`w-full py-2.5 px-4 rounded-xl text-xs font-semibold flex items-center justify-center gap-2 transition-all cursor-pointer shadow-xs ${ | |
| 142 | + !viewingTrash && !selectedId | |
| 143 | + ? 'bg-emerald-600 hover:bg-emerald-700 text-white shadow-emerald-600/30' | |
| 144 | + : 'bg-slate-50 hover:bg-slate-100 text-slate-700 border border-slate-200' | |
| 145 | + }`} | |
| 146 | + > | |
| 147 | + <Plus className="w-4 h-4 text-emerald-500" /> | |
| 148 | + <span>新建生成任务</span> | |
| 149 | + </button> | |
| 150 | + </div> | |
| 151 | + | |
| 152 | + {/* 搜索与多维过滤条 */} | |
| 153 | + {!viewingTrash ? ( | |
| 154 | + <div className="p-3 border-b border-slate-200 flex flex-col gap-2 bg-slate-50/60"> | |
| 155 | + <div className="relative"> | |
| 156 | + <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-slate-400" /> | |
| 157 | + <input | |
| 158 | + type="text" | |
| 159 | + placeholder="搜索 Prompt 或任务 ID…" | |
| 160 | + value={searchQ} | |
| 161 | + onChange={(e) => setSearchQ(e.target.value)} | |
| 162 | + className="w-full pl-8 pr-3 py-1.5 bg-white border border-slate-200 rounded-xl text-xs text-slate-800 placeholder-slate-400 outline-none focus:border-emerald-500 focus:ring-1 focus:ring-emerald-500/20 transition-all" | |
| 163 | + /> | |
| 164 | + </div> | |
| 165 | + | |
| 166 | + <div className="flex items-center gap-1.5"> | |
| 167 | + <select | |
| 168 | + value={statusFilter} | |
| 169 | + onChange={(e) => setStatusFilter(e.target.value)} | |
| 170 | + className="flex-1 bg-white border border-slate-200 rounded-xl px-2 py-1.5 text-xs text-slate-700 outline-none focus:border-emerald-500 cursor-pointer" | |
| 171 | + > | |
| 172 | + <option value="">全部状态</option> | |
| 173 | + <option value="queued">排队中</option> | |
| 174 | + <option value="running">运行中</option> | |
| 175 | + <option value="done">已完成</option> | |
| 176 | + <option value="failed">失败</option> | |
| 177 | + <option value="cancelled">已取消</option> | |
| 178 | + </select> | |
| 179 | + | |
| 180 | + <select | |
| 181 | + value={kindFilter} | |
| 182 | + onChange={(e) => setKindFilter(e.target.value)} | |
| 183 | + className="flex-1 bg-white border border-slate-200 rounded-xl px-2 py-1.5 text-xs text-slate-700 outline-none focus:border-emerald-500 cursor-pointer" | |
| 184 | + > | |
| 185 | + <option value="">全部类型</option> | |
| 186 | + <option value="text">文生视频</option> | |
| 187 | + <option value="fl2va">首尾帧</option> | |
| 188 | + <option value="ref2va">多参考图</option> | |
| 189 | + </select> | |
| 190 | + | |
| 191 | + <button | |
| 192 | + onClick={() => setSortOrder(sortOrder === 'desc' ? 'asc' : 'desc')} | |
| 193 | + className="p-1.5 bg-white hover:bg-slate-100 border border-slate-200 rounded-xl text-slate-600 transition-colors cursor-pointer shrink-0" | |
| 194 | + title="切换排序" | |
| 195 | + > | |
| 196 | + <ArrowUpDown className="w-3.5 h-3.5" /> | |
| 197 | + </button> | |
| 198 | + </div> | |
| 199 | + </div> | |
| 200 | + ) : ( | |
| 201 | + <div className="p-3 border-b border-slate-200 flex items-center justify-between bg-slate-100/70"> | |
| 202 | + <span className="text-xs font-semibold text-slate-700 flex items-center gap-1.5"> | |
| 203 | + <Trash2 className="w-4 h-4 text-rose-500" /> | |
| 204 | + <span>回收站视图</span> | |
| 205 | + </span> | |
| 206 | + <button | |
| 207 | + onClick={() => setViewingTrash(false)} | |
| 208 | + className="text-xs text-emerald-600 hover:underline cursor-pointer font-medium" | |
| 209 | + > | |
| 210 | + ← 返回列表 | |
| 211 | + </button> | |
| 212 | + </div> | |
| 213 | + )} | |
| 214 | + | |
| 215 | + {/* 任务卡片列表 */} | |
| 216 | + <div className="flex-1 overflow-y-auto p-3 flex flex-col gap-2.5 bg-slate-50/40"> | |
| 217 | + {!viewingTrash ? ( | |
| 218 | + jobs.length > 0 ? ( | |
| 219 | + jobs.map((job) => ( | |
| 220 | + <JobCard | |
| 221 | + key={job.id} | |
| 222 | + job={job} | |
| 223 | + isSelected={selectedId === job.id} | |
| 224 | + onSelect={onSelectTask} | |
| 225 | + onRerun={onRerunTask} | |
| 226 | + onPrioritize={handlePrioritize} | |
| 227 | + onDelete={handleDelete} | |
| 228 | + /> | |
| 229 | + )) | |
| 230 | + ) : ( | |
| 231 | + <div className="py-12 text-center text-xs text-slate-400"> | |
| 232 | + {loading ? '正在加载任务…' : '暂无符合筛选条件的任务'} | |
| 233 | + </div> | |
| 234 | + ) | |
| 235 | + ) : trashJobs.length > 0 ? ( | |
| 236 | + trashJobs.map((job) => ( | |
| 237 | + <div | |
| 238 | + key={job.id} | |
| 239 | + className="p-3 bg-white border border-slate-200 rounded-xl flex items-center justify-between text-xs shadow-xs" | |
| 240 | + > | |
| 241 | + <div className="min-w-0 flex-1 pr-2"> | |
| 242 | + <span className="font-mono text-slate-500 font-semibold">#{job.id.substring(0, 8)}</span> | |
| 243 | + <p className="text-slate-700 truncate mt-0.5">{job.req?.prompt || '(无 prompt)'}</p> | |
| 244 | + </div> | |
| 245 | + <button | |
| 246 | + onClick={() => handleRestore(job.id)} | |
| 247 | + className="px-3 py-1 bg-emerald-50 hover:bg-emerald-100 text-emerald-700 border border-emerald-200 rounded-lg shrink-0 cursor-pointer transition-colors font-medium" | |
| 248 | + > | |
| 249 | + 恢复 | |
| 250 | + </button> | |
| 251 | + </div> | |
| 252 | + )) | |
| 253 | + ) : ( | |
| 254 | + <div className="py-12 text-center text-xs text-slate-400">回收站是空的</div> | |
| 255 | + )} | |
| 256 | + </div> | |
| 257 | + | |
| 258 | + {/* 分页控制栏 (非回收站) */} | |
| 259 | + {!viewingTrash && totalJobs > 0 && ( | |
| 260 | + <div className="p-3 border-t border-slate-200 bg-white flex items-center justify-between text-xs text-slate-600"> | |
| 261 | + <div className="flex items-center gap-1"> | |
| 262 | + <button | |
| 263 | + disabled={page <= 1} | |
| 264 | + onClick={() => { const p = page - 1; setPage(p); loadJobs(p); }} | |
| 265 | + className="p-1 hover:bg-slate-100 disabled:opacity-30 rounded-lg cursor-pointer transition-colors" | |
| 266 | + > | |
| 267 | + <ChevronLeft className="w-4 h-4" /> | |
| 268 | + </button> | |
| 269 | + <span className="font-medium">{page} / {totalPages}</span> | |
| 270 | + <button | |
| 271 | + disabled={page >= totalPages} | |
| 272 | + onClick={() => { const p = page + 1; setPage(p); loadJobs(p); }} | |
| 273 | + className="p-1 hover:bg-slate-100 disabled:opacity-30 rounded-lg cursor-pointer transition-colors" | |
| 274 | + > | |
| 275 | + <ChevronRight className="w-4 h-4" /> | |
| 276 | + </button> | |
| 277 | + </div> | |
| 278 | + <span className="text-[11px] text-slate-400">共 {totalJobs} 条记录</span> | |
| 279 | + </div> | |
| 280 | + )} | |
| 281 | + | |
| 282 | + {/* 底部:后端实例卡片与工具 */} | |
| 283 | + <div className="p-3 border-t border-slate-200 bg-slate-50/80 flex flex-col gap-2"> | |
| 284 | + {/* 后端状态摘要 */} | |
| 285 | + {backendInfo && ( | |
| 286 | + <div className="flex items-center justify-between text-[11px] text-slate-600 bg-white px-2.5 py-1.5 rounded-lg border border-slate-200 font-mono shadow-xs"> | |
| 287 | + <div className="flex items-center gap-1.5"> | |
| 288 | + <Server className="w-3.5 h-3.5 text-emerald-600" /> | |
| 289 | + <span className="font-semibold">GPU: {backendInfo.ready}/{backendInfo.total} 就绪</span> | |
| 290 | + </div> | |
| 291 | + <span className="text-slate-400"> | |
| 292 | + fl2va: {backendInfo.partitions?.fl2va || 0} | ref2va: {backendInfo.partitions?.ref2va || 0} | |
| 293 | + </span> | |
| 294 | + </div> | |
| 295 | + )} | |
| 296 | + | |
| 297 | + {/* 接入文档:同域名下由 server.py 直接吐 API.md / skill.md */} | |
| 298 | + <div className="flex items-center gap-3 text-[11px] text-slate-500"> | |
| 299 | + <a href={`${getH3Base()}/docs/api.md`} target="_blank" rel="noreferrer" className="hover:text-slate-800 underline-offset-2 hover:underline">API 文档</a> | |
| 300 | + <a href={`${getH3Base()}/skill.md`} target="_blank" rel="noreferrer" className="hover:text-slate-800 underline-offset-2 hover:underline">skill.md</a> | |
| 301 | + </div> | |
| 302 | + | |
| 303 | + {/* 底部功能栏:回收站 / 令牌设置 / 显存重置 */} | |
| 304 | + <div className="flex items-center justify-between pt-1 text-[11px]"> | |
| 305 | + <button | |
| 306 | + onClick={() => setViewingTrash(!viewingTrash)} | |
| 307 | + className="flex items-center gap-1 text-slate-500 hover:text-slate-800 transition-colors cursor-pointer" | |
| 308 | + > | |
| 309 | + <Trash2 className="w-3.5 h-3.5" /> | |
| 310 | + <span>回收站</span> | |
| 311 | + </button> | |
| 312 | + | |
| 313 | + <button | |
| 314 | + onClick={onManageToken} | |
| 315 | + className="flex items-center gap-1 text-slate-500 hover:text-slate-800 transition-colors cursor-pointer font-mono" | |
| 316 | + title="点击配置访问令牌" | |
| 317 | + > | |
| 318 | + <KeyRound className="w-3.5 h-3.5 text-emerald-600" /> | |
| 319 | + <span>{getToken() ? 'Token:已配' : 'Token:未设'}</span> | |
| 320 | + </button> | |
| 321 | + | |
| 322 | + <button | |
| 323 | + onClick={handleResetGpu} | |
| 324 | + className="flex items-center gap-1 text-amber-600 hover:text-amber-700 transition-colors cursor-pointer font-medium" | |
| 325 | + title="硬重启服务打断任务并回收显存" | |
| 326 | + > | |
| 327 | + <RefreshCw className="w-3.5 h-3.5" /> | |
| 328 | + <span>重置显存</span> | |
| 329 | + </button> | |
| 330 | + </div> | |
| 331 | + </div> | |
| 332 | + | |
| 333 | + {/* 确认模态框 */} | |
| 334 | + <Modal | |
| 335 | + isOpen={confirmModal.isOpen} | |
| 336 | + title={confirmModal.title} | |
| 337 | + content={confirmModal.content} | |
| 338 | + isDanger={confirmModal.isDanger} | |
| 339 | + onConfirm={confirmModal.onConfirm} | |
| 340 | + onCancel={() => setConfirmModal((prev) => ({ ...prev, isOpen: false }))} | |
| 341 | + /> | |
| 342 | + </aside> | |
| 343 | + ); | |
| 344 | +} | ... | ... |
h3-console/frontend/src/components/TaskDetail.jsx
0 → 100644
| 1 | +import React, { useState, useEffect } from 'react'; | |
| 2 | +import { | |
| 3 | + ArrowLeft, Download, RotateCcw, ArrowUpToLine, StopCircle, XCircle, | |
| 4 | + Copy, Check, Code, Cpu, Clock, Layers, ShieldAlert, Sparkles, Activity | |
| 5 | +} from 'lucide-react'; | |
| 6 | +import { fetchJobDetail, prioritizeJob, cancelJob, fetchComfyHistory } from '../api'; | |
| 7 | +import { formatDateTime, formatBytes, thumbUrl, localAsset, h3FileUrl, getH3Base, getJobKind } from '../utils'; | |
| 8 | +import { useToast } from './Toast'; | |
| 9 | +import Modal from './Modal'; | |
| 10 | + | |
| 11 | +export default function TaskDetail({ taskId, onBack, onRerun }) { | |
| 12 | + const { addToast } = useToast(); | |
| 13 | + const [job, setJob] = useState(null); | |
| 14 | + const [loading, setLoading] = useState(true); | |
| 15 | + const [copiedPrompt, setCopiedPrompt] = useState(false); | |
| 16 | + const [comfyHistory, setComfyHistory] = useState(null); | |
| 17 | + const [loadingHistory, setLoadingHistory] = useState(false); | |
| 18 | + const [showHistory, setShowHistory] = useState(false); | |
| 19 | + const [showRawReq, setShowRawReq] = useState(false); | |
| 20 | + | |
| 21 | + // 模态弹窗状态 | |
| 22 | + const [confirmModal, setConfirmModal] = useState({ isOpen: false, title: '', content: '', isDanger: false, onConfirm: null }); | |
| 23 | + | |
| 24 | + const loadDetail = async () => { | |
| 25 | + try { | |
| 26 | + const data = await fetchJobDetail(taskId); | |
| 27 | + setJob(data); | |
| 28 | + } catch (e) { | |
| 29 | + console.error(e); | |
| 30 | + } finally { | |
| 31 | + setLoading(false); | |
| 32 | + } | |
| 33 | + }; | |
| 34 | + | |
| 35 | + useEffect(() => { | |
| 36 | + loadDetail(); | |
| 37 | + // 轮询:排队或运行中每 2.5 秒刷新一次 | |
| 38 | + const timer = setInterval(() => { | |
| 39 | + if (job && (job.status === 'queued' || job.status === 'running')) { | |
| 40 | + loadDetail(); | |
| 41 | + } | |
| 42 | + }, 2500); | |
| 43 | + return () => clearInterval(timer); | |
| 44 | + }, [taskId, job?.status]); | |
| 45 | + | |
| 46 | + if (loading && !job) { | |
| 47 | + return ( | |
| 48 | + <div className="flex-1 flex items-center justify-center text-slate-500 text-sm"> | |
| 49 | + <div className="flex items-center gap-2"> | |
| 50 | + <div className="w-5 h-5 border-2 border-emerald-500 border-t-transparent rounded-full animate-spin" /> | |
| 51 | + <span>正在加载任务详情…</span> | |
| 52 | + </div> | |
| 53 | + </div> | |
| 54 | + ); | |
| 55 | + } | |
| 56 | + | |
| 57 | + if (!job) { | |
| 58 | + return ( | |
| 59 | + <div className="p-8 text-center flex flex-col items-center gap-4 text-slate-500"> | |
| 60 | + <p>未找到该任务或已被彻底删除</p> | |
| 61 | + <button | |
| 62 | + onClick={onBack} | |
| 63 | + className="px-4 py-2 bg-slate-100 hover:bg-slate-200 text-xs rounded-xl text-slate-700 cursor-pointer font-medium" | |
| 64 | + > | |
| 65 | + 返回创建视图 | |
| 66 | + </button> | |
| 67 | + </div> | |
| 68 | + ); | |
| 69 | + } | |
| 70 | + | |
| 71 | + const req = job.req || {}; | |
| 72 | + const isDone = job.status === 'done'; | |
| 73 | + const isRunning = job.status === 'running'; | |
| 74 | + const isQueued = job.status === 'queued'; | |
| 75 | + const isFailed = job.status === 'failed'; | |
| 76 | + const isCancelled = job.status === 'cancelled'; | |
| 77 | + | |
| 78 | + // 进度精细计算 | |
| 79 | + const curStep = job.step || 0; | |
| 80 | + const totalSteps = job.total_steps || req.steps || 20; | |
| 81 | + const progressPercent = totalSteps > 0 | |
| 82 | + ? Math.min(100, Math.max(curStep > 0 ? 5 : 2, Math.round((curStep / totalSteps) * 100))) | |
| 83 | + : 0; | |
| 84 | + | |
| 85 | + // 预估剩余时间 (秒) | |
| 86 | + const elapsed = job.elapsed_seconds || 0; | |
| 87 | + let estimatedRemaining = null; | |
| 88 | + if (curStep > 0 && totalSteps > curStep) { | |
| 89 | + const secPerStep = elapsed / curStep; | |
| 90 | + const remainSec = Math.round(secPerStep * (totalSteps - curStep)); | |
| 91 | + estimatedRemaining = remainSec > 60 ? `约 ${Math.round(remainSec / 60)} 分钟` : `约 ${remainSec} 秒`; | |
| 92 | + } | |
| 93 | + | |
| 94 | + const videoSrc = isDone ? h3FileUrl(`${getH3Base()}/v1/videos/${job.id}/file`) : null; | |
| 95 | + | |
| 96 | + const handleCopyPrompt = () => { | |
| 97 | + if (!req.prompt) return; | |
| 98 | + navigator.clipboard.writeText(req.prompt); | |
| 99 | + setCopiedPrompt(true); | |
| 100 | + addToast('已复制 Prompt 提示词到剪贴板', 'success'); | |
| 101 | + setTimeout(() => setCopiedPrompt(false), 2000); | |
| 102 | + }; | |
| 103 | + | |
| 104 | + const handlePrioritize = async () => { | |
| 105 | + try { | |
| 106 | + const res = await prioritizeJob(job.id); | |
| 107 | + addToast(`已成功插队至第 ${res.queue_position} 位`, 'success'); | |
| 108 | + loadDetail(); | |
| 109 | + } catch (e) { | |
| 110 | + addToast('插队失败: ' + e.message, 'error'); | |
| 111 | + } | |
| 112 | + }; | |
| 113 | + | |
| 114 | + const handleCancel = (running) => { | |
| 115 | + setConfirmModal({ | |
| 116 | + isOpen: true, | |
| 117 | + title: running ? '停止正在运行的任务' : '取消排队任务', | |
| 118 | + content: running | |
| 119 | + ? '确定停止当前正在运行的任务?\n这会硬重启后台 Raylight 服务以释放 GPU 显存(约耗时 15-20 秒),重启完成前将暂时无法提交新任务。' | |
| 120 | + : '确定取消这条排队中的任务?', | |
| 121 | + isDanger: running, | |
| 122 | + onConfirm: async () => { | |
| 123 | + setConfirmModal((prev) => ({ ...prev, isOpen: false })); | |
| 124 | + try { | |
| 125 | + await cancelJob(job.id); | |
| 126 | + addToast(running ? '已发出停止与 GPU 重置指令' : '已取消任务', 'info'); | |
| 127 | + loadDetail(); | |
| 128 | + } catch (e) { | |
| 129 | + addToast('操作失败: ' + e.message, 'error'); | |
| 130 | + } | |
| 131 | + }, | |
| 132 | + }); | |
| 133 | + }; | |
| 134 | + | |
| 135 | + const handleToggleHistory = async () => { | |
| 136 | + if (!showHistory && !comfyHistory) { | |
| 137 | + setLoadingHistory(true); | |
| 138 | + try { | |
| 139 | + const hist = await fetchComfyHistory(job.id); | |
| 140 | + setComfyHistory(hist); | |
| 141 | + } catch (e) { | |
| 142 | + addToast('获取 ComfyUI History 失败: ' + e.message, 'error'); | |
| 143 | + } finally { | |
| 144 | + setLoadingHistory(false); | |
| 145 | + } | |
| 146 | + } | |
| 147 | + setShowHistory(!showHistory); | |
| 148 | + }; | |
| 149 | + | |
| 150 | + return ( | |
| 151 | + <div className="max-w-5xl mx-auto py-6 px-4 sm:px-8 flex flex-col gap-6"> | |
| 152 | + {/* 顶栏导航与快捷动作 */} | |
| 153 | + <div className="flex flex-wrap items-center justify-between gap-4 pb-4 border-b border-slate-200"> | |
| 154 | + <div className="flex items-center gap-3"> | |
| 155 | + <button | |
| 156 | + onClick={onBack} | |
| 157 | + className="p-2 hover:bg-slate-100 rounded-xl text-slate-500 hover:text-slate-800 transition-colors cursor-pointer" | |
| 158 | + title="返回新建" | |
| 159 | + > | |
| 160 | + <ArrowLeft className="w-5 h-5" /> | |
| 161 | + </button> | |
| 162 | + <div> | |
| 163 | + <div className="flex items-center gap-2.5"> | |
| 164 | + <h2 className="text-base font-mono font-bold text-slate-800">#{job.id}</h2> | |
| 165 | + {/* 状态标识 */} | |
| 166 | + {isDone && <span className="px-2.5 py-0.5 text-xs font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200 rounded-full">已完成</span>} | |
| 167 | + {isRunning && ( | |
| 168 | + <span className="px-2.5 py-0.5 text-xs font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200 rounded-full flex items-center gap-1.5 animate-pulse"> | |
| 169 | + <span className="w-1.5 h-1.5 rounded-full bg-emerald-500"></span> | |
| 170 | + 正在采样 · {progressPercent}% | |
| 171 | + </span> | |
| 172 | + )} | |
| 173 | + {isQueued && ( | |
| 174 | + <span className="px-2.5 py-0.5 text-xs font-semibold bg-slate-100 text-slate-700 border border-slate-200 rounded-full"> | |
| 175 | + 排队中 {job.queue_position ? `(第 ${job.queue_position} 位)` : ''} | |
| 176 | + </span> | |
| 177 | + )} | |
| 178 | + {isFailed && <span className="px-2.5 py-0.5 text-xs font-semibold bg-rose-50 text-rose-700 border border-rose-200 rounded-full">执行失败</span>} | |
| 179 | + {isCancelled && <span className="px-2.5 py-0.5 text-xs font-semibold bg-slate-100 text-slate-500 border border-slate-200 rounded-full">已取消</span>} | |
| 180 | + </div> | |
| 181 | + <div className="text-xs text-slate-400 mt-0.5">创建于 {formatDateTime(job.created_at)}</div> | |
| 182 | + </div> | |
| 183 | + </div> | |
| 184 | + | |
| 185 | + {/* 顶部操作条 */} | |
| 186 | + <div className="flex items-center gap-2"> | |
| 187 | + <button | |
| 188 | + onClick={() => onRerun(job)} | |
| 189 | + className="px-3.5 py-2 bg-slate-50 hover:bg-slate-100 text-slate-700 text-xs font-medium rounded-xl flex items-center gap-1.5 transition-colors cursor-pointer border border-slate-200 shadow-xs" | |
| 190 | + > | |
| 191 | + <RotateCcw className="w-3.5 h-3.5 text-emerald-600" /> | |
| 192 | + <span>复用此任务重跑</span> | |
| 193 | + </button> | |
| 194 | + | |
| 195 | + {isQueued && ( | |
| 196 | + <> | |
| 197 | + <button | |
| 198 | + onClick={handlePrioritize} | |
| 199 | + className="px-3.5 py-2 bg-indigo-50 hover:bg-indigo-100 text-indigo-700 border border-indigo-200 text-xs font-medium rounded-xl flex items-center gap-1.5 transition-colors cursor-pointer" | |
| 200 | + > | |
| 201 | + <ArrowUpToLine className="w-3.5 h-3.5" /> | |
| 202 | + <span>优先插队</span> | |
| 203 | + </button> | |
| 204 | + <button | |
| 205 | + onClick={() => handleCancel(false)} | |
| 206 | + className="px-3.5 py-2 bg-slate-50 hover:bg-slate-100 text-slate-600 text-xs font-medium rounded-xl flex items-center gap-1.5 transition-colors cursor-pointer border border-slate-200" | |
| 207 | + > | |
| 208 | + <XCircle className="w-3.5 h-3.5" /> | |
| 209 | + <span>取消</span> | |
| 210 | + </button> | |
| 211 | + </> | |
| 212 | + )} | |
| 213 | + | |
| 214 | + {isRunning && ( | |
| 215 | + <button | |
| 216 | + onClick={() => handleCancel(true)} | |
| 217 | + className="px-3.5 py-2 bg-rose-50 hover:bg-rose-100 text-rose-700 border border-rose-200 text-xs font-medium rounded-xl flex items-center gap-1.5 transition-colors cursor-pointer shadow-xs" | |
| 218 | + > | |
| 219 | + <StopCircle className="w-3.5 h-3.5" /> | |
| 220 | + <span>强行终止任务</span> | |
| 221 | + </button> | |
| 222 | + )} | |
| 223 | + </div> | |
| 224 | + </div> | |
| 225 | + | |
| 226 | + {/* 核心成果展示区 / 实时可视化进度看板 */} | |
| 227 | + <div className="relative bg-slate-900 border border-slate-200 rounded-2xl overflow-hidden shadow-xs flex flex-col items-center justify-center min-h-[360px]"> | |
| 228 | + {isDone && videoSrc ? ( | |
| 229 | + <div className="w-full flex flex-col items-center p-4"> | |
| 230 | + <video | |
| 231 | + src={videoSrc} | |
| 232 | + controls | |
| 233 | + autoPlay | |
| 234 | + loop | |
| 235 | + playsInline | |
| 236 | + className="max-h-[560px] w-auto max-w-full rounded-xl shadow-xl bg-black" | |
| 237 | + /> | |
| 238 | + <div className="w-full flex items-center justify-between mt-3 px-2"> | |
| 239 | + <span className="text-xs text-slate-400 font-mono"> | |
| 240 | + 规格:{req.width}×{req.height} · {req.frames} 帧 (约 {(req.frames / 24).toFixed(1)}s) | |
| 241 | + </span> | |
| 242 | + <a | |
| 243 | + href={videoSrc} | |
| 244 | + download={`h3_${job.id.substring(0, 8)}.mp4`} | |
| 245 | + className="px-4 py-2 bg-emerald-600 hover:bg-emerald-700 text-white text-xs font-medium rounded-xl flex items-center gap-2 transition-all shadow-sm" | |
| 246 | + > | |
| 247 | + <Download className="w-4 h-4" /> | |
| 248 | + <span>下载 MP4 视频 {job.size_bytes ? `(${formatBytes(job.size_bytes)})` : ''}</span> | |
| 249 | + </a> | |
| 250 | + </div> | |
| 251 | + </div> | |
| 252 | + ) : isRunning ? ( | |
| 253 | + /* 🔥 极度直观的全新多维进度看板 */ | |
| 254 | + <div className="w-full max-w-2xl p-8 flex flex-col items-center gap-6"> | |
| 255 | + <div className="flex items-center gap-2 text-emerald-400 text-xs font-bold uppercase tracking-wider bg-emerald-950/60 px-3 py-1 rounded-full border border-emerald-500/30"> | |
| 256 | + <Activity className="w-3.5 h-3.5 animate-spin" /> | |
| 257 | + <span>GPU 扩散采样中 · 实时推演</span> | |
| 258 | + </div> | |
| 259 | + | |
| 260 | + {/* 大数字百分比 */} | |
| 261 | + <div className="flex flex-col items-center"> | |
| 262 | + <div className="text-5xl font-extrabold font-mono text-white tracking-tight flex items-baseline gap-1"> | |
| 263 | + <span>{progressPercent}</span> | |
| 264 | + <span className="text-2xl text-emerald-400 font-semibold">%</span> | |
| 265 | + </div> | |
| 266 | + <p className="text-xs text-slate-400 mt-1"> | |
| 267 | + 正在执行第 <span className="text-white font-mono font-bold">{curStep}</span> 步 / 共 <span className="text-slate-300 font-mono">{totalSteps}</span> 步 | |
| 268 | + </p> | |
| 269 | + </div> | |
| 270 | + | |
| 271 | + {/* 真实横向流光进度条 */} | |
| 272 | + <div className="w-full flex flex-col gap-2"> | |
| 273 | + <div className="w-full bg-slate-800/90 h-3.5 rounded-full overflow-hidden p-0.5 border border-slate-700 shadow-inner"> | |
| 274 | + <div | |
| 275 | + className="bg-gradient-to-r from-emerald-500 to-teal-400 h-full rounded-full transition-all duration-300 relative overflow-hidden" | |
| 276 | + style={{ width: `${progressPercent}%` }} | |
| 277 | + > | |
| 278 | + {/* 流光扫光动画 */} | |
| 279 | + <div className="absolute inset-0 bg-white/25 animate-pulse" /> | |
| 280 | + </div> | |
| 281 | + </div> | |
| 282 | + | |
| 283 | + {/* 进度条两端时间指示 */} | |
| 284 | + <div className="flex items-center justify-between text-xs text-slate-400 px-1 font-mono"> | |
| 285 | + <span className="flex items-center gap-1 text-slate-300"> | |
| 286 | + <Clock className="w-3.5 h-3.5 text-emerald-400" /> | |
| 287 | + <span>已耗时: {elapsed} 秒</span> | |
| 288 | + </span> | |
| 289 | + {estimatedRemaining && ( | |
| 290 | + <span className="text-emerald-400 font-medium"> | |
| 291 | + 预计还需: {estimatedRemaining} | |
| 292 | + </span> | |
| 293 | + )} | |
| 294 | + </div> | |
| 295 | + </div> | |
| 296 | + | |
| 297 | + {/* 4 阶段步骤状态指示链 */} | |
| 298 | + <div className="grid grid-cols-4 w-full gap-2 pt-4 border-t border-slate-800 text-center"> | |
| 299 | + <div className="flex flex-col items-center gap-1"> | |
| 300 | + <div className="w-6 h-6 rounded-full bg-emerald-500/20 text-emerald-400 text-xs font-bold flex items-center justify-center border border-emerald-500/40">✓</div> | |
| 301 | + <span className="text-[11px] text-slate-400">1. 排队调度</span> | |
| 302 | + </div> | |
| 303 | + <div className="flex flex-col items-center gap-1"> | |
| 304 | + <div className="w-6 h-6 rounded-full bg-emerald-500/20 text-emerald-400 text-xs font-bold flex items-center justify-center border border-emerald-500/40">✓</div> | |
| 305 | + <span className="text-[11px] text-slate-400">2. 模型装载</span> | |
| 306 | + </div> | |
| 307 | + <div className="flex flex-col items-center gap-1"> | |
| 308 | + <div className="w-6 h-6 rounded-full bg-emerald-500 text-white text-xs font-bold flex items-center justify-center shadow-md animate-pulse">3</div> | |
| 309 | + <span className="text-[11px] text-white font-semibold">3. 扩散计算</span> | |
| 310 | + </div> | |
| 311 | + <div className="flex flex-col items-center gap-1 opacity-40"> | |
| 312 | + <div className="w-6 h-6 rounded-full bg-slate-800 text-slate-400 text-xs font-bold flex items-center justify-center border border-slate-700">4</div> | |
| 313 | + <span className="text-[11px] text-slate-400">4. 压制出片</span> | |
| 314 | + </div> | |
| 315 | + </div> | |
| 316 | + </div> | |
| 317 | + ) : isQueued ? ( | |
| 318 | + <div className="p-12 flex flex-col items-center gap-3 text-center"> | |
| 319 | + <Clock className="w-10 h-10 text-blue-400 animate-pulse" /> | |
| 320 | + <div> | |
| 321 | + <h3 className="text-base font-semibold text-blue-300">正在等待空闲的 {job.partition || 'GPU'} 后端…</h3> | |
| 322 | + <p className="text-xs text-slate-400 mt-1">当前排队第 {job.queue_position || 1} 位,空闲节点就绪后将自动调度启动</p> | |
| 323 | + </div> | |
| 324 | + </div> | |
| 325 | + ) : ( | |
| 326 | + <div className="p-12 flex flex-col items-center gap-3 text-center max-w-lg"> | |
| 327 | + <ShieldAlert className="w-10 h-10 text-rose-400" /> | |
| 328 | + <h3 className="text-base font-semibold text-rose-300">{isFailed ? '生成失败' : '任务已取消'}</h3> | |
| 329 | + <div className="p-3 bg-rose-950/40 border border-rose-500/30 rounded-xl text-xs text-rose-200/90 font-mono text-left w-full max-h-48 overflow-y-auto whitespace-pre-wrap"> | |
| 330 | + {job.error || '无详细错误日志'} | |
| 331 | + </div> | |
| 332 | + </div> | |
| 333 | + )} | |
| 334 | + </div> | |
| 335 | + | |
| 336 | + {/* 仪表盘指标卡片网格 */} | |
| 337 | + <div className="grid grid-cols-2 sm:grid-cols-4 gap-3.5"> | |
| 338 | + <div className="p-4 bg-white border border-slate-200 rounded-xl flex flex-col gap-1 shadow-xs"> | |
| 339 | + <span className="text-[11px] uppercase tracking-wider text-slate-500 font-semibold flex items-center gap-1.5"> | |
| 340 | + <Clock className="w-3.5 h-3.5 text-emerald-600" /> | |
| 341 | + <span>生成耗时</span> | |
| 342 | + </span> | |
| 343 | + <span className="text-sm font-bold font-mono text-slate-800"> | |
| 344 | + {job.started_at && job.finished_at ? `${(job.finished_at - job.started_at).toFixed(1)} 秒` : isRunning ? `${job.elapsed_seconds || 0} 秒 (进行中)` : '—'} | |
| 345 | + </span> | |
| 346 | + </div> | |
| 347 | + | |
| 348 | + <div className="p-4 bg-white border border-slate-200 rounded-xl flex flex-col gap-1 shadow-xs"> | |
| 349 | + <span className="text-[11px] uppercase tracking-wider text-slate-500 font-semibold flex items-center gap-1.5"> | |
| 350 | + <Cpu className="w-3.5 h-3.5 text-indigo-600" /> | |
| 351 | + <span>峰值显存</span> | |
| 352 | + </span> | |
| 353 | + <span className="text-sm font-bold font-mono text-slate-800"> | |
| 354 | + {job.peak_vram_gb ? `${job.peak_vram_gb} GB` : '—'} | |
| 355 | + </span> | |
| 356 | + </div> | |
| 357 | + | |
| 358 | + <div className="p-4 bg-white border border-slate-200 rounded-xl flex flex-col gap-1 shadow-xs"> | |
| 359 | + <span className="text-[11px] uppercase tracking-wider text-slate-500 font-semibold flex items-center gap-1.5"> | |
| 360 | + <Layers className="w-3.5 h-3.5 text-amber-600" /> | |
| 361 | + <span>分配后端卡</span> | |
| 362 | + </span> | |
| 363 | + <span className="text-sm font-bold font-mono text-slate-800 truncate"> | |
| 364 | + {job.backend || '自动弹性调度'} | |
| 365 | + </span> | |
| 366 | + </div> | |
| 367 | + | |
| 368 | + <div className="p-4 bg-white border border-slate-200 rounded-xl flex flex-col gap-1 shadow-xs"> | |
| 369 | + <span className="text-[11px] uppercase tracking-wider text-slate-500 font-semibold flex items-center gap-1.5"> | |
| 370 | + <Code className="w-3.5 h-3.5 text-teal-600" /> | |
| 371 | + <span>采样规格</span> | |
| 372 | + </span> | |
| 373 | + <span className="text-sm font-bold font-mono text-slate-800"> | |
| 374 | + {req.turbo === false ? '常规' : 'Turbo'} · {req.steps ?? '?'}步 · seed={req.seed ?? 0} | |
| 375 | + </span> | |
| 376 | + </div> | |
| 377 | + </div> | |
| 378 | + | |
| 379 | + {/* Prompt 提示词卡片 */} | |
| 380 | + <div className="p-5 bg-white border border-slate-200 rounded-2xl flex flex-col gap-3 shadow-xs"> | |
| 381 | + <div className="flex items-center justify-between"> | |
| 382 | + <span className="text-xs font-bold uppercase tracking-wider text-slate-600">Prompt 提示词</span> | |
| 383 | + <button | |
| 384 | + onClick={handleCopyPrompt} | |
| 385 | + className="flex items-center gap-1.5 text-xs text-slate-500 hover:text-emerald-600 transition-colors cursor-pointer" | |
| 386 | + > | |
| 387 | + {copiedPrompt ? <Check className="w-3.5 h-3.5 text-emerald-600" /> : <Copy className="w-3.5 h-3.5" />} | |
| 388 | + <span>{copiedPrompt ? '已复制' : '复制文本'}</span> | |
| 389 | + </button> | |
| 390 | + </div> | |
| 391 | + <p className="text-sm text-slate-800 leading-relaxed font-normal bg-slate-50 p-3.5 rounded-xl border border-slate-200 whitespace-pre-wrap"> | |
| 392 | + {req.prompt || '(无提示词)'} | |
| 393 | + </p> | |
| 394 | + {req.negative_prompt && ( | |
| 395 | + <div className="text-xs text-slate-600 flex flex-col gap-1 pt-1"> | |
| 396 | + <span className="font-semibold text-slate-500">负面提示词:</span> | |
| 397 | + <span className="bg-slate-50 p-2.5 rounded-xl border border-slate-200 text-slate-600">{req.negative_prompt}</span> | |
| 398 | + </div> | |
| 399 | + )} | |
| 400 | + </div> | |
| 401 | + | |
| 402 | + {/* 输入素材回显 (首尾帧 / 参考媒体) */} | |
| 403 | + {(req.first_frame_url || req.last_frame_url || (req.reference_image_urls || []).length > 0 || (req.reference_video_urls || []).length > 0 || (req.reference_audio_urls || []).length > 0) && ( | |
| 404 | + <div className="p-5 bg-white border border-slate-200 rounded-2xl flex flex-col gap-3.5 shadow-xs"> | |
| 405 | + <span className="text-xs font-bold uppercase tracking-wider text-slate-600">输入素材与参考源</span> | |
| 406 | + <div className="grid grid-cols-2 sm:grid-cols-4 md:grid-cols-6 gap-3"> | |
| 407 | + {req.first_frame_url && ( | |
| 408 | + <div className="relative group bg-slate-100 rounded-xl overflow-hidden border border-slate-200 shadow-xs"> | |
| 409 | + <img src={thumbUrl(req.first_frame_url)} alt="首帧" className="w-full aspect-square object-cover" /> | |
| 410 | + <div className="absolute bottom-0 inset-x-0 bg-slate-900/80 px-2 py-1 text-[10px] text-white font-medium text-center">首帧</div> | |
| 411 | + </div> | |
| 412 | + )} | |
| 413 | + {req.last_frame_url && ( | |
| 414 | + <div className="relative group bg-slate-100 rounded-xl overflow-hidden border border-slate-200 shadow-xs"> | |
| 415 | + <img src={thumbUrl(req.last_frame_url)} alt="尾帧" className="w-full aspect-square object-cover" /> | |
| 416 | + <div className="absolute bottom-0 inset-x-0 bg-slate-900/80 px-2 py-1 text-[10px] text-white font-medium text-center">尾帧</div> | |
| 417 | + </div> | |
| 418 | + )} | |
| 419 | + {(req.reference_image_urls || []).map((u, i) => ( | |
| 420 | + <div key={i} className="relative group bg-slate-100 rounded-xl overflow-hidden border border-slate-200 shadow-xs"> | |
| 421 | + <img src={thumbUrl(u)} alt={`参考图${i+1}`} className="w-full aspect-square object-cover" /> | |
| 422 | + <div className="absolute bottom-0 inset-x-0 bg-slate-900/80 px-2 py-1 text-[10px] text-white font-medium text-center truncate">参考图 {i+1}</div> | |
| 423 | + </div> | |
| 424 | + ))} | |
| 425 | + {(req.reference_video_urls || []).map((u, i) => ( | |
| 426 | + <div key={i} className="relative group bg-slate-100 rounded-xl overflow-hidden border border-slate-200 shadow-xs"> | |
| 427 | + <video src={localAsset(u)} controls className="w-full aspect-square object-cover" /> | |
| 428 | + <div className="absolute bottom-0 inset-x-0 bg-slate-900/80 px-2 py-1 text-[10px] text-white font-medium text-center truncate">参考视频 {i+1}</div> | |
| 429 | + </div> | |
| 430 | + ))} | |
| 431 | + </div> | |
| 432 | + </div> | |
| 433 | + )} | |
| 434 | + | |
| 435 | + {/* 底部调试折叠抽屉 */} | |
| 436 | + <div className="flex flex-col gap-3 pt-2 pb-12"> | |
| 437 | + {/* 原始请求 JSON */} | |
| 438 | + <div className="border border-slate-200 rounded-xl overflow-hidden bg-slate-50/60"> | |
| 439 | + <button | |
| 440 | + onClick={() => setShowRawReq(!showRawReq)} | |
| 441 | + className="w-full px-4 py-3 text-left text-xs font-mono text-slate-600 hover:text-slate-900 hover:bg-slate-100 flex items-center justify-between cursor-pointer" | |
| 442 | + > | |
| 443 | + <span>用户提交的原始请求参数 (JSON)</span> | |
| 444 | + <span className="text-[11px] text-slate-400">{showRawReq ? '收起' : '展开'}</span> | |
| 445 | + </button> | |
| 446 | + {showRawReq && ( | |
| 447 | + <pre className="p-4 text-[11px] font-mono text-slate-700 overflow-x-auto border-t border-slate-200 bg-white leading-relaxed"> | |
| 448 | + {JSON.stringify(req, null, 2)} | |
| 449 | + </pre> | |
| 450 | + )} | |
| 451 | + </div> | |
| 452 | + | |
| 453 | + {/* ComfyUI History */} | |
| 454 | + {job.comfy_prompt_id && ( | |
| 455 | + <div className="border border-slate-200 rounded-xl overflow-hidden bg-slate-50/60"> | |
| 456 | + <button | |
| 457 | + onClick={handleToggleHistory} | |
| 458 | + className="w-full px-4 py-3 text-left text-xs font-mono text-slate-600 hover:text-slate-900 hover:bg-slate-100 flex items-center justify-between cursor-pointer" | |
| 459 | + > | |
| 460 | + <span>ComfyUI 执行图谱与日志 (History)</span> | |
| 461 | + <span className="text-[11px] text-slate-400">{showHistory ? '收起' : '展开'}</span> | |
| 462 | + </button> | |
| 463 | + {showHistory && ( | |
| 464 | + <pre className="p-4 text-[11px] font-mono text-slate-700 overflow-x-auto border-t border-slate-200 bg-white leading-relaxed max-h-96"> | |
| 465 | + {loadingHistory ? '正在拉取 ComfyUI History…' : comfyHistory ? JSON.stringify(comfyHistory, null, 2) : '无可用数据'} | |
| 466 | + </pre> | |
| 467 | + )} | |
| 468 | + </div> | |
| 469 | + )} | |
| 470 | + </div> | |
| 471 | + | |
| 472 | + {/* 模态弹窗 */} | |
| 473 | + <Modal | |
| 474 | + isOpen={confirmModal.isOpen} | |
| 475 | + title={confirmModal.title} | |
| 476 | + content={confirmModal.content} | |
| 477 | + isDanger={confirmModal.isDanger} | |
| 478 | + onConfirm={confirmModal.onConfirm} | |
| 479 | + onCancel={() => setConfirmModal((prev) => ({ ...prev, isOpen: false }))} | |
| 480 | + /> | |
| 481 | + </div> | |
| 482 | + ); | |
| 483 | +} | ... | ... |
h3-console/frontend/src/components/Toast.jsx
0 → 100644
| 1 | +import React, { createContext, useContext, useState, useCallback } from 'react'; | |
| 2 | +import { CheckCircle2, AlertCircle, Info, X } from 'lucide-react'; | |
| 3 | + | |
| 4 | +const ToastContext = createContext(null); | |
| 5 | + | |
| 6 | +export function ToastProvider({ children }) { | |
| 7 | + const [toasts, setToasts] = useState([]); | |
| 8 | + | |
| 9 | + const addToast = useCallback((msg, type = 'info', duration = 3000) => { | |
| 10 | + const id = Date.now() + Math.random().toString(36).substring(2, 6); | |
| 11 | + setToasts((prev) => [...prev, { id, msg, type }]); | |
| 12 | + if (duration > 0) { | |
| 13 | + setTimeout(() => { | |
| 14 | + setToasts((prev) => prev.filter((t) => t.id !== id)); | |
| 15 | + }, duration); | |
| 16 | + } | |
| 17 | + }, []); | |
| 18 | + | |
| 19 | + const removeToast = useCallback((id) => { | |
| 20 | + setToasts((prev) => prev.filter((t) => t.id !== id)); | |
| 21 | + }, []); | |
| 22 | + | |
| 23 | + return ( | |
| 24 | + <ToastContext.Provider value={{ addToast }}> | |
| 25 | + {children} | |
| 26 | + <div className="fixed top-4 right-4 z-50 flex flex-col gap-2 pointer-events-none"> | |
| 27 | + {toasts.map((t) => ( | |
| 28 | + <div | |
| 29 | + key={t.id} | |
| 30 | + className={`pointer-events-auto flex items-center gap-3 px-4 py-3 rounded-xl shadow-2xl border backdrop-blur-md transition-all duration-300 animate-in slide-in-from-top-2 ${ | |
| 31 | + t.type === 'success' | |
| 32 | + ? 'bg-emerald-950/90 border-emerald-500/40 text-emerald-200 shadow-emerald-950/50' | |
| 33 | + : t.type === 'error' | |
| 34 | + ? 'bg-rose-950/90 border-rose-500/40 text-rose-200 shadow-rose-950/50' | |
| 35 | + : 'bg-zinc-900/95 border-zinc-700/60 text-zinc-200 shadow-black/60' | |
| 36 | + }`} | |
| 37 | + > | |
| 38 | + {t.type === 'success' && <CheckCircle2 className="w-5 h-5 text-emerald-400 shrink-0" />} | |
| 39 | + {t.type === 'error' && <AlertCircle className="w-5 h-5 text-rose-400 shrink-0" />} | |
| 40 | + {t.type === 'info' && <Info className="w-5 h-5 text-indigo-400 shrink-0" />} | |
| 41 | + <span className="text-sm font-medium">{t.msg}</span> | |
| 42 | + <button | |
| 43 | + onClick={() => removeToast(t.id)} | |
| 44 | + className="ml-2 text-zinc-400 hover:text-white p-0.5 rounded-lg hover:bg-white/10 transition-colors" | |
| 45 | + > | |
| 46 | + <X className="w-4 h-4" /> | |
| 47 | + </button> | |
| 48 | + </div> | |
| 49 | + ))} | |
| 50 | + </div> | |
| 51 | + </ToastContext.Provider> | |
| 52 | + ); | |
| 53 | +} | |
| 54 | + | |
| 55 | +export function useToast() { | |
| 56 | + const ctx = useContext(ToastContext); | |
| 57 | + if (!ctx) throw new Error('useToast must be used within ToastProvider'); | |
| 58 | + return ctx; | |
| 59 | +} | |
| 60 | + | ... | ... |
h3-console/frontend/src/constants.js
0 → 100644
| 1 | +export const RESOLUTIONS = [ | |
| 2 | + { value: '1344x768', width: 1344, height: 768, label: '1344×768 (横屏 · 官方默认)', maxFrames: 412, isLandscape: true, aspect: '16:9' }, | |
| 3 | + { value: '768x1344', width: 768, height: 1344, label: '768×1344 (竖屏 · 官方默认)', maxFrames: 412, isLandscape: false, aspect: '9:16' }, | |
| 4 | + { value: '832x480', width: 832, height: 480, label: '832×480 (横屏 · 标准)', maxFrames: 1125, isLandscape: true, aspect: '16:9' }, | |
| 5 | + { value: '480x832', width: 480, height: 832, label: '480×832 (竖屏 · 推荐短剧)', maxFrames: 1125, isLandscape: false, aspect: '9:16' }, | |
| 6 | + { value: '1024x576', width: 1024, height: 576, label: '1024×576 (横屏 · 高清)', maxFrames: 743, isLandscape: true, aspect: '16:9' }, | |
| 7 | + { value: '576x1024', width: 576, height: 1024, label: '576×1024 (竖屏 · 高清)', maxFrames: 743, isLandscape: false, aspect: '9:16' }, | |
| 8 | + { value: '448x256', width: 448, height: 256, label: '448×256 (横屏 · 超长)', maxFrames: 1200, isLandscape: true, aspect: '16:9' }, | |
| 9 | + { value: '256x448', width: 256, height: 448, label: '256×448 (竖屏 · 超长)', maxFrames: 1200, isLandscape: false, aspect: '9:16' }, | |
| 10 | +]; | |
| 11 | + | |
| 12 | +export const DEFAULT_RES = '480x832'; | |
| 13 | +export const DEFAULT_DUR = '243'; // 10s @ 24fps | |
| 14 | + | |
| 15 | +export const DURATIONS = [ | |
| 16 | + { value: '124', frames: 124, label: '5秒 (124帧)' }, | |
| 17 | + { value: '243', frames: 243, label: '10秒 (243帧 · 默认)' }, | |
| 18 | + { value: '362', frames: 362, label: '15秒 (362帧)' }, | |
| 19 | + { value: '412', frames: 412, label: '17秒 (412帧 · 1344上限)' }, | |
| 20 | + { value: '600', frames: 600, label: '25秒 (600帧)' }, | |
| 21 | + { value: '743', frames: 743, label: '31秒 (743帧 · 1024上限)' }, | |
| 22 | + { value: '900', frames: 900, label: '37.5秒 (900帧)' }, | |
| 23 | + { value: '1125', frames: 1125, label: '47秒 (1125帧 · 832上限)' }, | |
| 24 | + { value: '1200', frames: 1200, label: '50秒 (1200帧 · 256画质上限)' }, | |
| 25 | +]; | |
| 26 | + | |
| 27 | +export const STEPS_BY_TURBO = { | |
| 28 | + true: [ | |
| 29 | + { value: '4', label: '4 步 (极速推荐 · LoRA 蒸馏)' }, | |
| 30 | + { value: '8', label: '8 步 (上限)' }, | |
| 31 | + ], | |
| 32 | + false: [ | |
| 33 | + { value: '20', label: '20 步 (平衡标准)' }, | |
| 34 | + { value: '50', label: '50 步 (全质量 · 约9.6倍耗时)' }, | |
| 35 | + ], | |
| 36 | +}; | |
| 37 | + | |
| 38 | +export const SEED_OPTIONS = [ | |
| 39 | + { value: '0', label: '0 (默认固定)' }, | |
| 40 | + { value: '42', label: '42' }, | |
| 41 | + { value: '123', label: '123' }, | |
| 42 | + { value: '2024', label: '2024' }, | |
| 43 | + { value: 'random', label: '🎲 随机 Seed' }, | |
| 44 | +]; | |
| 45 | + | ... | ... |
h3-console/frontend/src/index.css
0 → 100644
| 1 | +@import "tailwindcss"; | |
| 2 | + | |
| 3 | +:root { | |
| 4 | + /* 全局浅色主题变量 - 干净清爽 */ | |
| 5 | + --bg-app: #f8fafc; /* 页面底色 */ | |
| 6 | + --bg-surface: #ffffff; /* 卡片/侧边栏底色 */ | |
| 7 | + --bg-subtle: #f1f5f9; /* 输入框/微浅底色 */ | |
| 8 | + --border-color: #e2e8f0; /* 边框色 */ | |
| 9 | + --text-main: #0f172a; /* 主标题/正文字色 */ | |
| 10 | + --text-muted: #64748b; /* 辅助文字色 */ | |
| 11 | + --primary: #059669; /* 品牌翡翠绿 */ | |
| 12 | +} | |
| 13 | + | |
| 14 | +.dark { | |
| 15 | + /* 备用暗色主题变量 */ | |
| 16 | + --bg-app: #090a0f; | |
| 17 | + --bg-surface: #13151c; | |
| 18 | + --bg-subtle: #1c1f2b; | |
| 19 | + --border-color: #272c3d; | |
| 20 | + --text-main: #f8fafc; | |
| 21 | + --text-muted: #94a3b8; | |
| 22 | + --primary: #10b981; | |
| 23 | +} | |
| 24 | + | |
| 25 | +body { | |
| 26 | + background-color: var(--bg-app); | |
| 27 | + color: var(--text-main); | |
| 28 | + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", sans-serif; | |
| 29 | + margin: 0; | |
| 30 | + padding: 0; | |
| 31 | + overflow: hidden; | |
| 32 | + height: 100vh; | |
| 33 | +} | |
| 34 | + | |
| 35 | +/* 统一控制所有卡片、边框、输入框 */ | |
| 36 | +.theme-surface { | |
| 37 | + background-color: var(--bg-surface); | |
| 38 | + border-color: var(--border-color); | |
| 39 | + color: var(--text-main); | |
| 40 | +} | |
| 41 | +.theme-subtle { | |
| 42 | + background-color: var(--bg-subtle); | |
| 43 | + border-color: var(--border-color); | |
| 44 | + color: var(--text-main); | |
| 45 | +} | |
| 46 | +.theme-border { | |
| 47 | + border-color: var(--border-color); | |
| 48 | +} | |
| 49 | +.theme-text-muted { | |
| 50 | + color: var(--text-muted); | |
| 51 | +} | ... | ... |
h3-console/frontend/src/main.jsx
0 → 100644
h3-console/frontend/src/utils.js
0 → 100644
| 1 | +export function getH3Base() { | |
| 2 | + if (typeof window !== 'undefined' && window.__H3_BASE__ !== undefined) { | |
| 3 | + return window.__H3_BASE__; | |
| 4 | + } | |
| 5 | + return ''; | |
| 6 | +} | |
| 7 | + | |
| 8 | +export function getToken() { | |
| 9 | + if (typeof window === 'undefined') return ''; | |
| 10 | + return localStorage.getItem('h3_console_token') || ''; | |
| 11 | +} | |
| 12 | + | |
| 13 | +export function setToken(token) { | |
| 14 | + if (typeof window === 'undefined') return; | |
| 15 | + if (!token) { | |
| 16 | + localStorage.removeItem('h3_console_token'); | |
| 17 | + } else { | |
| 18 | + localStorage.setItem('h3_console_token', token.trim()); | |
| 19 | + } | |
| 20 | +} | |
| 21 | + | |
| 22 | +export function formatTimeAgo(ts) { | |
| 23 | + if (!ts) return '—'; | |
| 24 | + const now = Date.now() / 1000; | |
| 25 | + const diff = Math.max(0, Math.round(now - ts)); | |
| 26 | + if (diff < 60) return `${diff}秒前`; | |
| 27 | + if (diff < 3600) return `${Math.round(diff / 60)}分钟前`; | |
| 28 | + if (diff < 86400) return `${Math.round(diff / 3600)}小时前`; | |
| 29 | + return `${Math.round(diff / 86400)}天前`; | |
| 30 | +} | |
| 31 | + | |
| 32 | +export function formatDateTime(ts) { | |
| 33 | + if (!ts) return '—'; | |
| 34 | + return new Date(ts * 1000).toLocaleString('zh-CN', { | |
| 35 | + hour12: false, | |
| 36 | + year: 'numeric', | |
| 37 | + month: '2-digit', | |
| 38 | + day: '2-digit', | |
| 39 | + hour: '2-digit', | |
| 40 | + minute: '2-digit', | |
| 41 | + second: '2-digit', | |
| 42 | + }); | |
| 43 | +} | |
| 44 | + | |
| 45 | +export function formatBytes(bytes) { | |
| 46 | + if (!bytes || bytes <= 0) return '0 B'; | |
| 47 | + const units = ['B', 'KB', 'MB', 'GB']; | |
| 48 | + const i = Math.floor(Math.log(bytes) / Math.log(1024)); | |
| 49 | + return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${units[i]}`; | |
| 50 | +} | |
| 51 | + | |
| 52 | +export function filenameFromUrl(u) { | |
| 53 | + if (!u) return ''; | |
| 54 | + try { | |
| 55 | + const base = decodeURIComponent(u.split('/').pop().split('?')[0]); | |
| 56 | + const m = base.match(/^[0-9a-f]{16}__(.+)$/); | |
| 57 | + return m ? m[1] : base; | |
| 58 | + } catch (e) { | |
| 59 | + return u; | |
| 60 | + } | |
| 61 | +} | |
| 62 | + | |
| 63 | +// 上传返回的 URL 是写死内网 IP 的绝对地址(H3_CONSOLE_PUBLIC_BASE,raylight 要拉取,存库的值不能改), | |
| 64 | +// 别的网络打开页面时浏览器连不上。展示时把本机上传的文件({16位hex}__ 前缀)改成当前页面同源路径; | |
| 65 | +// 外部图床 URL 原样返回。绝不改 req 里存的 URL。 | |
| 66 | +export function localAsset(u) { | |
| 67 | + const m = u && u.match(/\/assets\/([0-9a-f]{16}__[^/?#]*)$/); | |
| 68 | + return m ? getH3Base() + '/assets/' + m[1] : u; | |
| 69 | +} | |
| 70 | + | |
| 71 | +export function thumbUrl(u) { | |
| 72 | + if (!u) return u; | |
| 73 | + u = localAsset(u); | |
| 74 | + const i = u.indexOf('/assets/'); | |
| 75 | + if (i === -1) return u; | |
| 76 | + return u.slice(0, i) + '/thumbs/' + u.slice(i + '/assets/'.length); | |
| 77 | +} | |
| 78 | + | |
| 79 | +export function h3FileUrl(path) { | |
| 80 | + if (!path) return ''; | |
| 81 | + const token = getToken(); | |
| 82 | + return token ? `${path}${path.includes('?') ? '&' : '?'}token=${encodeURIComponent(token)}` : path; | |
| 83 | +} | |
| 84 | + | |
| 85 | +export function getJobKind(req = {}) { | |
| 86 | + if (req.first_frame_url || req.last_frame_url) return { key: 'fl2va', label: '首尾帧' }; | |
| 87 | + if ((req.reference_image_urls || []).length || (req.reference_video_urls || []).length || (req.reference_audio_urls || []).length) { | |
| 88 | + return { key: 'ref2va', label: '参考图' }; | |
| 89 | + } | |
| 90 | + return { key: 'text', label: '文生' }; | |
| 91 | +} | ... | ... |
h3-console/frontend/vite.config.js
0 → 100644
| 1 | +import { defineConfig } from 'vite' | |
| 2 | +import react from '@vitejs/plugin-react' | |
| 3 | +import tailwindcss from '@tailwindcss/vite' | |
| 4 | +import { viteSingleFile } from 'vite-plugin-singlefile' | |
| 5 | + | |
| 6 | +export default defineConfig({ | |
| 7 | + plugins: [ | |
| 8 | + react(), | |
| 9 | + tailwindcss(), | |
| 10 | + viteSingleFile(), | |
| 11 | + ], | |
| 12 | + build: { | |
| 13 | + target: 'esnext', | |
| 14 | + assetsInlineLimit: 100000000, | |
| 15 | + chunkSizeWarningLimit: 100000000, | |
| 16 | + cssCodeSplit: false, | |
| 17 | + }, | |
| 18 | +}) | |
| 19 | + | ... | ... |
h3-console/server.py
| ... | ... | @@ -17,7 +17,7 @@ from typing import Optional |
| 17 | 17 | import hmac |
| 18 | 18 | import httpx |
| 19 | 19 | from fastapi import APIRouter, Depends, FastAPI, HTTPException, UploadFile, File, Request |
| 20 | -from fastapi.responses import StreamingResponse, FileResponse, HTMLResponse | |
| 20 | +from fastapi.responses import StreamingResponse, FileResponse, HTMLResponse, Response | |
| 21 | 21 | from fastapi.staticfiles import StaticFiles |
| 22 | 22 | from PIL import Image |
| 23 | 23 | |
| ... | ... | @@ -390,6 +390,17 @@ async def _discover_from_gateway(): |
| 390 | 390 | ) |
| 391 | 391 | |
| 392 | 392 | |
| 393 | +@api.post("/v1/videos/validate") | |
| 394 | +async def validate_video_request(payload: dict): | |
| 395 | + try: | |
| 396 | + response = await client.post(f"{GATEWAY_URL}/v1/videos/validate", json=payload, timeout=180.0) | |
| 397 | + except httpx.HTTPError: | |
| 398 | + raise HTTPException(503, "generation validator unavailable") | |
| 399 | + if response.status_code != 200: | |
| 400 | + raise HTTPException(response.status_code, response.json().get("detail", "request validation failed")) | |
| 401 | + return response.json() | |
| 402 | + | |
| 403 | + | |
| 393 | 404 | @api.post("/v1/videos", status_code=202) |
| 394 | 405 | async def create_video(req: dict): |
| 395 | 406 | _check_not_resetting() |
| ... | ... | @@ -752,8 +763,10 @@ async def models(): |
| 752 | 763 | # 不用两边手动同步一份数字。 |
| 753 | 764 | try: |
| 754 | 765 | resp = await client.get(f"{GATEWAY_URL}/v1/resolutions") |
| 755 | - resolutions = resp.json()["resolutions"] if resp.status_code == 200 else [] | |
| 766 | + capabilities = resp.json() if resp.status_code == 200 else {} | |
| 767 | + resolutions = capabilities.get("resolutions", []) | |
| 756 | 768 | except httpx.HTTPError: |
| 769 | + capabilities = {} | |
| 757 | 770 | resolutions = [] |
| 758 | 771 | presets = [ |
| 759 | 772 | {"label": f"{r['width']}×{r['height']},最多 {r['max_frames']} 帧(≈{r['max_frames']/24:.1f}s@24fps)", |
| ... | ... | @@ -768,6 +781,8 @@ async def models(): |
| 768 | 781 | "desc": "文生视频 / 多参考图生成"}, |
| 769 | 782 | }, |
| 770 | 783 | "presets": presets, |
| 784 | + "request_schema": capabilities.get("request_schema"), | |
| 785 | + "request_validation": capabilities.get("request_validation"), | |
| 771 | 786 | } |
| 772 | 787 | |
| 773 | 788 | |
| ... | ... | @@ -916,6 +931,22 @@ async def index_page(): |
| 916 | 931 | return render_index() |
| 917 | 932 | |
| 918 | 933 | |
| 934 | +# 给接入方看的文档:API.md 是完整接口说明,skill.md 是可直接喂给 agent 的精简技能。 | |
| 935 | +# 不校验 token(跟页面一样),内容里不含 token;每次请求现读文件,改文档不用重启。 | |
| 936 | +def _md(name: str) -> Response: | |
| 937 | + return Response((BASE / name).read_text(encoding="utf-8"), media_type="text/markdown; charset=utf-8") | |
| 938 | + | |
| 939 | + | |
| 940 | +@router.get("/docs/api.md") | |
| 941 | +async def doc_api(): | |
| 942 | + return _md("API.md") | |
| 943 | + | |
| 944 | + | |
| 945 | +@router.get("/skill.md") | |
| 946 | +async def doc_skill(): | |
| 947 | + return _md("skill.md") | |
| 948 | + | |
| 949 | + | |
| 919 | 950 | @router.get("/task.html/{tid}") |
| 920 | 951 | async def task_page(tid: str): |
| 921 | 952 | return render_index() | ... | ... |
h3-console/skill.md
0 → 100644
| 1 | +--- | |
| 2 | +name: h3-video | |
| 3 | +description: 用 MiniMax H3 生成视频(文生 / 首尾帧 / 参考图),通过 H3 Console 的 HTTP API 提交任务并取回结果。Use when:用户要生成视频、把想法/参考图写成 H3 提示词并提交。 | |
| 4 | +--- | |
| 5 | + | |
| 6 | +# H3 视频生成 | |
| 7 | + | |
| 8 | +完整接口文档:同域名下的 `/docs/api.md`(公网:`http://qwen.wudaima.com/console/docs/api.md`)。 | |
| 9 | +**只打 console 的 `/v1/*`,不要直连底层 raylight 端口。** | |
| 10 | + | |
| 11 | +- 公网 Base URL:`http://qwen.wudaima.com/console`(所有路径带 `/console` 前缀) | |
| 12 | +- 局域网 Base URL:`http://192.168.110.67:8080` | |
| 13 | +- 鉴权:`Authorization: Bearer <token>`,token 向服务器管理员索取,**不要写进提示词或日志**。 | |
| 14 | + | |
| 15 | +## 流程 | |
| 16 | + | |
| 17 | +1. **定模式**(按传的字段自动判断):只有文字 → 文生;有首/尾帧图 → fl2va(`first_frame_url`/`last_frame_url`);有人物/场景/风格参考图、参考视频、参考音频 → ref2va(`reference_*_urls`)。 | |
| 18 | +2. **写提示词**,见下节。 | |
| 19 | +3. **给用户看草稿并等确认**。一条 1344×768、10–15s 的视频要跑 30–55 分钟,别未经确认就提交。 | |
| 20 | +4. 有本地素材先上传:`curl -H "Authorization: Bearer $T" -F file=@a.jpg $BASE/v1/assets` → 返回 `url`。 | |
| 21 | +5. 提交: | |
| 22 | + ```bash | |
| 23 | + curl -X POST $BASE/v1/videos -H "Authorization: Bearer $T" -H "Content-Type: application/json" \ | |
| 24 | + -d '{"prompt":"…","width":1344,"height":768,"frames":300,"reference_image_urls":["<url>"]}' | |
| 25 | + ``` | |
| 26 | + **永远返回 HTTP 202,必须检查响应体 `status`**:`"failed"` 表示校验没过,原因在 `error`。 | |
| 27 | +6. 轮询 `GET $BASE/v1/videos/{id}`,状态 `queued → running → done/failed/cancelled`;完成后 `GET $BASE/v1/videos/{id}/file` 取 mp4。 | |
| 28 | + 给用户的详情页链接:`$BASE/task.html/{id}`。 | |
| 29 | + | |
| 30 | +## 参数要点 | |
| 31 | + | |
| 32 | +- `frames` 为 24fps 帧数,秒数 = frames / 24。默认建议 1344×768、300 帧(≈12.5s)。 | |
| 33 | +- 各分辨率帧数上限以 `GET /v1/models` 为准(1344×768 目前 412 帧)。超限直接判失败。 | |
| 34 | +- 4 张卡是一个集群,**同一时刻只跑 1 条任务**,其余排队;多提交不会更快。 | |
| 35 | +- `turbo` / `cfg_scale` / `negative_prompt` 当前不生效。 | |
| 36 | + | |
| 37 | +## 提示词写法 | |
| 38 | + | |
| 39 | +``` | |
| 40 | +完整提示词 = 参考素材说明 + 核心创意 + 画面过程说明 | |
| 41 | +``` | |
| 42 | + | |
| 43 | +- **参考素材说明**(没素材就跳过):用 `@图片1` / `@视频1` / `@音频1` 编号并写清用途(人物参考、场景参考、风格参考、首帧……),编号顺序与实际传入顺序一致。 | |
| 44 | +- **核心创意**:一句话写清主体 + 地点 + 事件 + 风格 + 运镜。运镜写具体(如 `truck left + pan right`),不要自相矛盾(有推近就别写"固定机位")。 | |
| 45 | +- **画面过程**:按时间轴/shot 分段,每段写景别、内容、运镜、动作、台词、声音。 | |
| 46 | +- **时长一致**:提示词里的总时长和分镜时间戳必须与提交的 `frames / 24` 一致。 | |
| 47 | +- **每个 shot 都带声音**:画内环境声/拟音 + 配乐,不要把声音全堆在结尾一句。 | |
| 48 | +- **材质与微动作**:画面里可见的主要元素都给材质词;静态 shot 也要有光影/蒸汽/织物等细微动态。 | |
| 49 | +- **画面里要出现的文字/Logo** 必须逐字写出。 | |
| 50 | +- 不需要人物说话时,加"人物保持安静、嘴巴自然闭合",避免模型自动念白。 | |
| 51 | +- 比喻改成具体可视描述;不要写"不要字幕"(负向词对字幕无效甚至反效果);避免"亮度分区"一类词,只描述具体光源照到哪里。 | |
| 52 | +- 想要角色一致,务必传人物参考图。 | ... | ... |
h3-console/static/index.html
| 1 | 1 | <!doctype html> |
| 2 | 2 | <html lang="zh"> |
| 3 | -<head> | |
| 4 | -<meta charset="utf-8"> | |
| 5 | -<title>H3 Console</title> | |
| 6 | -<style> | |
| 7 | - :root { color-scheme: light dark; } | |
| 8 | - * { box-sizing: border-box; } | |
| 9 | - body { font-family: -apple-system, "PingFang SC", sans-serif; margin: 0; padding: 0; display: flex; height: 100vh; overflow: hidden; } | |
| 10 | - | |
| 11 | - /* ---- 左侧任务记录 ---- */ | |
| 12 | - /* 2026-09-04:原来 300px 定宽太窄,列表里看不出每条任务在生成什么,只能点进详情才知道—— | |
| 13 | - 改成视口 50%,腾出空间放缩略图(见下面 .jr-thumb)。 */ | |
| 14 | - #sidebar { width: 50%; flex-shrink: 0; border-right: 1px solid #ddd; display: flex; flex-direction: column; height: 100vh; } | |
| 15 | - #sidebar-header { padding: 16px; border-bottom: 1px solid #ddd; } | |
| 16 | - #sidebar-header h1 { font-size: 16px; margin: 0; } | |
| 17 | - #sidebar-filters { padding: 8px 16px; border-bottom: 1px solid #ddd; display: flex; flex-direction: column; gap: 6px; } | |
| 18 | - #sidebar-filters input, #sidebar-filters select { font-size: 12px; padding: 4px 6px; width: auto; } | |
| 19 | - #sidebar-filters .sf-row { display: flex; gap: 6px; } | |
| 20 | - #sidebar-filters .sf-row select { flex: 1; min-width: 0; } | |
| 21 | - #job-sort-btn { font-size: 12px; padding: 4px 8px; border: 1px solid #888; background: transparent; | |
| 22 | - border-radius: 4px; cursor: pointer; white-space: nowrap; } | |
| 23 | - #job-sort-btn:hover { background: rgba(128,128,128,.15); } | |
| 24 | - #job-list { flex: 1; overflow-y: auto; } | |
| 25 | - #job-list-footer { padding: 10px 16px; text-align: center; font-size: 11px; opacity: .55; } | |
| 26 | - .page-btn { font-size: 12px; padding: 3px 10px; border: 1px solid #888; background: transparent; | |
| 27 | - border-radius: 4px; cursor: pointer; } | |
| 28 | - .page-btn:disabled { opacity: .4; cursor: default; } | |
| 29 | - .job-row { position: relative; padding: 10px 16px; border-bottom: 1px solid #eee; cursor: pointer; } | |
| 30 | - .job-row:hover { background: rgba(128,128,128,.08); } | |
| 31 | - .job-row.selected { background: rgba(74,170,119,.15); border-left: 3px solid #4a7; } | |
| 32 | - .job-row.new-row { display: flex; align-items: center; gap: 6px; font-weight: 600; color: #4a7; } | |
| 33 | - .job-row .jr-top { display: flex; justify-content: space-between; align-items: center; font-size: 12px; } | |
| 34 | - .job-row .jr-actions { display: flex; align-items: center; gap: 6px; } | |
| 35 | - .job-row .jr-prompt { font-size: 13px; margin-top: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } | |
| 36 | - .job-row .jr-time { font-size: 11px; opacity: .55; margin-top: 2px; } | |
| 37 | - /* 2026-09-04:任务列表加缩略图——已完成的显示结果视频(取第一帧当封面),还没完成的 | |
| 38 | - 显示输入的首帧图/参考图,两者都没有就显示任务类型文字兜底。 */ | |
| 39 | - .jr-body { display: flex; gap: 10px; align-items: flex-start; } | |
| 40 | - .jr-thumb { width: 88px; height: 118px; flex-shrink: 0; border-radius: 6px; overflow: hidden; | |
| 41 | - background: rgba(128,128,128,.15); display: flex; align-items: center; justify-content: center; } | |
| 42 | - .jr-thumb img, .jr-thumb video { width: 100%; height: 100%; object-fit: cover; display: block; } | |
| 43 | - .jr-thumb-empty { font-size: 12px; opacity: .5; text-align: center; padding: 0 4px; } | |
| 44 | - .jr-info { flex: 1; min-width: 0; } | |
| 45 | - .jr-info .jr-prompt { white-space: normal; display: -webkit-box; -webkit-box-orient: vertical; | |
| 46 | - -webkit-line-clamp: 4; } | |
| 47 | - .jr-menu-btn { cursor: pointer; padding: 0 4px; opacity: .55; font-size: 14px; line-height: 1; } | |
| 48 | - .jr-menu-btn:hover { opacity: 1; } | |
| 49 | - .jr-menu { position: absolute; top: 22px; right: 12px; background: Canvas; color: CanvasText; | |
| 50 | - border: 1px solid #888; border-radius: 6px; box-shadow: 0 2px 10px rgba(0,0,0,.25); z-index: 10; min-width: 76px; } | |
| 51 | - .jr-menu-item { padding: 8px 12px; font-size: 13px; cursor: pointer; } | |
| 52 | - .jr-menu-item:hover { background: rgba(128,128,128,.15); } | |
| 53 | - .jr-restore { padding: 3px 10px; font-size: 12px; border: 1px solid #4a7; color: #4a7; background: transparent; border-radius: 4px; cursor: pointer; } | |
| 54 | - .jr-restore:hover { background: rgba(74,170,119,.15); } | |
| 55 | - #backends { font-size: 11px; opacity: .75; padding: 10px 16px; border-top: 1px solid #ddd; white-space: pre-wrap; } | |
| 56 | - #sidebar-footer { padding: 8px 16px; border-top: 1px solid #ddd; } | |
| 57 | - #trash-btn { font-size: 17px; background: transparent; border: none; cursor: pointer; opacity: .6; padding: 4px; } | |
| 58 | - #trash-btn:hover { opacity: 1; } | |
| 59 | - | |
| 60 | - /* ---- 右侧主区 ---- */ | |
| 61 | - #main { flex: 1; overflow-y: auto; padding: 24px 32px; } | |
| 62 | - .tabs { display: flex; gap: 8px; margin: 0 0 16px; } | |
| 63 | - .tabs button { padding: 8px 16px; border: 1px solid #888; background: transparent; border-radius: 6px; cursor: pointer; } | |
| 64 | - .tabs button.active { background: #4a7; color: white; border-color: #4a7; } | |
| 65 | - fieldset { border: 1px solid #ccc; border-radius: 8px; margin-bottom: 16px; max-width: 640px; } | |
| 66 | - label { display: block; margin: 8px 0 4px; font-size: 13px; opacity: .8; } | |
| 67 | - input, select, textarea { padding: 6px; width: 100%; box-sizing: border-box; font-family: inherit; font-size: 14px; } | |
| 68 | - textarea { resize: vertical; min-height: 200px; } | |
| 69 | - .row { display: flex; gap: 12px; } | |
| 70 | - .row > div { flex: 1; } | |
| 71 | - button.submit { margin-top: 12px; padding: 10px 20px; background: #4a7; color: white; border: none; border-radius: 6px; cursor: pointer; } | |
| 72 | - button.submit:disabled { opacity: .5; cursor: default; } | |
| 73 | - .hint { font-size: 12px; opacity: .65; margin: 6px 0 4px; line-height: 1.5; } | |
| 74 | - .thumbrow { display: flex; gap: 20px; flex-wrap: wrap; margin-top: 12px; align-items: flex-start; } | |
| 75 | - .thumbrow img { height: 160px; width: 160px; object-fit: cover; border-radius: 8px; | |
| 76 | - border: 1px solid rgba(128,128,128,.3); display: block; } | |
| 77 | - /* 2026-09-03: 之前固定 340×200 + object-fit:cover,横屏参考视频还行,竖屏的(比如 | |
| 78 | - 480×832)会被裁得只剩中间一条窄带,看不全——参考视频本来就是要让人看完整内容核对是不是 | |
| 79 | - 传错了,裁切是硬伤,改成按视频真实宽高比等比缩放(不超过340宽/400高),横竖屏都不裁。 */ | |
| 80 | - .thumbrow video { max-width: 340px; max-height: 400px; width: auto; height: auto; | |
| 81 | - border-radius: 8px; border: 1px solid rgba(128,128,128,.3); display: block; background: #000; } | |
| 82 | - .thumbrow audio { height: 40px; width: 340px; max-width: 100%; display: block; } | |
| 83 | - .thumb-wrap { display: inline-flex; flex-direction: column; gap: 6px; max-width: 340px; } | |
| 84 | - .thumb-media { position: relative; display: inline-block; line-height: 0; } | |
| 85 | - .thumb-name { font-size: 12px; opacity: .7; max-width: 100%; overflow: hidden; | |
| 86 | - text-overflow: ellipsis; white-space: nowrap; } | |
| 87 | - .thumb-del { position: absolute; top: -8px; right: -8px; width: 24px; height: 24px; padding: 0; | |
| 88 | - border-radius: 50%; border: none; background: #c33; color: #fff; font-size: 15px; line-height: 1; | |
| 89 | - cursor: pointer; box-shadow: 0 1px 4px rgba(0,0,0,.35); } | |
| 90 | - .thumb-del:hover { background: #a22; } | |
| 91 | - .status-done { color: #2a7; } .status-failed { color: #c33; } .status-running { color: #a70; } .status-queued { color: #777; } .status-cancelled { color: #999; } | |
| 92 | - .err { color: #c33; font-size: 13px; margin-top: 8px; white-space: pre-wrap; font-family: ui-monospace, Menlo, Consolas, monospace; | |
| 93 | - max-height: 400px; overflow-y: auto; background: #fff5f5; border: 1px solid #f3c2c2; border-radius: 6px; padding: 10px; } | |
| 94 | - | |
| 95 | - /* ---- 任务详情 ---- */ | |
| 96 | - #detail { max-width: 640px; } | |
| 97 | - #detail .back { font-size: 13px; cursor: pointer; opacity: .7; margin-bottom: 12px; display: inline-block; } | |
| 98 | - #detail .back:hover { opacity: 1; } | |
| 99 | - #detail h2 { font-size: 16px; margin: 0 0 4px; } | |
| 100 | - #detail .dl { display: grid; grid-template-columns: 110px 1fr; gap: 6px 12px; font-size: 13px; margin: 16px 0; } | |
| 101 | - #detail .dl dt { opacity: .6; } | |
| 102 | - #detail .dl dd { margin: 0; word-break: break-all; } | |
| 103 | - #detail video { max-width: 100%; margin-top: 12px; border-radius: 6px; } | |
| 104 | - #detail .download { display: inline-block; margin-top: 10px; font-size: 13px; } | |
| 105 | - #detail .raw-block { margin-top: 14px; font-size: 13px; } | |
| 106 | - #detail .raw-block summary { cursor: pointer; opacity: .7; } | |
| 107 | - #detail .raw-block summary:hover { opacity: 1; } | |
| 108 | - #detail .raw-block pre { max-height: 400px; overflow: auto; background: rgba(128,128,128,.1); | |
| 109 | - padding: 10px; border-radius: 6px; font-size: 12px; white-space: pre-wrap; word-break: break-all; } | |
| 110 | -</style> | |
| 111 | -</head> | |
| 112 | -<body> | |
| 113 | - | |
| 114 | -<div id="sidebar"> | |
| 115 | - <div id="sidebar-header"> | |
| 116 | - <h1>H3 Console</h1> | |
| 117 | - </div> | |
| 118 | - <div id="new-task-row" class="job-row new-row" onclick="showCreate()"> | |
| 119 | - <span>+</span><span>新建任务</span> | |
| 120 | - </div> | |
| 121 | - <div id="sidebar-filters"> | |
| 122 | - <input id="job-search" type="text" placeholder="搜索 prompt / id…"> | |
| 123 | - <div class="sf-row"> | |
| 124 | - <select id="job-status-filter"> | |
| 125 | - <option value="">全部状态</option> | |
| 126 | - <option value="queued">排队中</option> | |
| 127 | - <option value="running">运行中</option> | |
| 128 | - <option value="done">已完成</option> | |
| 129 | - <option value="failed">失败</option> | |
| 130 | - <option value="cancelled">已取消</option> | |
| 131 | - </select> | |
| 132 | - <select id="job-kind-filter"> | |
| 133 | - <option value="">全部类型</option> | |
| 134 | - <option value="text">文生</option> | |
| 135 | - <option value="fl2va">首尾帧</option> | |
| 136 | - <option value="ref2va">参考图</option> | |
| 137 | - </select> | |
| 138 | - <button id="job-sort-btn" title="切换排序">↓最新</button> | |
| 139 | - </div> | |
| 140 | - </div> | |
| 141 | - <div id="job-list"></div> | |
| 142 | - <div id="backends"></div> | |
| 143 | - <div id="sidebar-footer"> | |
| 144 | - <button id="trash-btn" title="回收站" onclick="toggleTrash()">🗑 回收站</button> | |
| 145 | - <button id="reset-gpu-btn" title="硬重启服务,回收显存" onclick="resetGpu()" style="font-size:11px;padding:3px 8px;margin-left:8px">重置显存</button> | |
| 146 | - </div> | |
| 147 | -</div> | |
| 148 | - | |
| 149 | -<div id="main"> | |
| 150 | - | |
| 151 | -<div id="create-view"> | |
| 152 | - <div class="tabs"> | |
| 153 | - <button class="active" data-tab="text">文生视频</button> | |
| 154 | - <button data-tab="fl2va">首尾帧生视频</button> | |
| 155 | - <button data-tab="ref2va">多参考图生视频</button> | |
| 156 | - </div> | |
| 157 | - | |
| 158 | - <!-- 文生视频 --> | |
| 159 | - <fieldset id="tab-text"> | |
| 160 | - <legend>文生视频</legend> | |
| 161 | - <label>Prompt</label> | |
| 162 | - <textarea id="text-prompt" rows="10" placeholder="清晨的中式庭院,一位女子坐在长廊上喝茶..."></textarea> | |
| 163 | - <div class="row"> | |
| 164 | - <div><label>分辨率</label><select id="text-res" class="res-select"></select></div> | |
| 165 | - <div><label>时长</label><select id="text-dur" class="dur-select"></select></div> | |
| 166 | - </div> | |
| 167 | - <div class="hint" id="text-hint"></div> | |
| 168 | - <div class="row"> | |
| 169 | - <div><label>Turbo</label><select id="text-turbo" class="turbo-select" data-steps="text-steps"><option value="true">开(4步,快)</option><option value="false" selected>关(多步,慢但更稳)</option></select></div> | |
| 170 | - <div><label>步数</label><select id="text-steps"></select></div> | |
| 171 | - <div><label>Seed</label><select id="text-seed"> | |
| 172 | - <option value="0" selected>0</option> | |
| 173 | - <option value="42">42</option> | |
| 174 | - <option value="123">123</option> | |
| 175 | - <option value="2024">2024</option> | |
| 176 | - <option value="random">随机</option> | |
| 177 | - </select></div> | |
| 178 | - </div> | |
| 179 | - <details> | |
| 180 | - <summary style="cursor:pointer;font-size:13px;opacity:.8">高级参数(留空 = 用模型默认值)</summary> | |
| 181 | - <label>CFG Scale(默认 1.0≈不引导;蒸馏 LoRA 调太高容易出伪影)</label> | |
| 182 | - <input id="text-cfg" type="number" step="0.1" min="0" placeholder="留空 = 1.0"> | |
| 183 | - <label>负面提示词(默认空)</label> | |
| 184 | - <textarea id="text-negprompt" rows="2" placeholder="例如:模糊,抖动,拖影,五官变形"></textarea> | |
| 185 | - </details> | |
| 186 | - <button class="submit" onclick="submitJob('text')">提交</button> | |
| 187 | - <button type="button" style="margin-top:12px;margin-left:8px;padding:10px 20px" onclick="clearForm('text')">清空</button> | |
| 188 | - <div class="err" id="text-err"></div> | |
| 189 | - </fieldset> | |
| 190 | - | |
| 191 | - <!-- 首尾帧 --> | |
| 192 | - <fieldset id="tab-fl2va" style="display:none"> | |
| 193 | - <legend>首尾帧生视频(FL2VA)</legend> | |
| 194 | - <label>Prompt</label> | |
| 195 | - <textarea id="fl2va-prompt" rows="10" placeholder="..."></textarea> | |
| 196 | - <label>首帧图</label> | |
| 197 | - <input id="fl2va-first" type="file" accept="image/*" onchange="uploadTo('fl2va-first')"> | |
| 198 | - <input id="fl2va-first-url" type="url" placeholder="或粘贴图片 URL,回车添加" onkeydown="if(event.key==='Enter'){event.preventDefault();addSingleUrl('fl2va-first','fl2va-first-url',renderFl2vaThumbs,'fl2va-err')}"> | |
| 199 | - <label>尾帧图(可选)</label> | |
| 200 | - <input id="fl2va-last" type="file" accept="image/*" onchange="uploadTo('fl2va-last')"> | |
| 201 | - <input id="fl2va-last-url" type="url" placeholder="或粘贴图片 URL,回车添加" onkeydown="if(event.key==='Enter'){event.preventDefault();addSingleUrl('fl2va-last','fl2va-last-url',renderFl2vaThumbs,'fl2va-err')}"> | |
| 202 | - <div class="thumbrow" id="fl2va-thumbs"></div> | |
| 203 | - <div class="row"> | |
| 204 | - <div><label>分辨率</label><select id="fl2va-res" class="res-select"></select></div> | |
| 205 | - <div><label>时长</label><select id="fl2va-dur" class="dur-select"></select></div> | |
| 206 | - </div> | |
| 207 | - <div class="hint" id="fl2va-hint"></div> | |
| 208 | - <div class="row"> | |
| 209 | - <div><label>Turbo</label><select id="fl2va-turbo" class="turbo-select" data-steps="fl2va-steps"><option value="true">开(4步,快)</option><option value="false" selected>关(多步,慢但更稳)</option></select></div> | |
| 210 | - <div><label>步数</label><select id="fl2va-steps"></select></div> | |
| 211 | - <div><label>Seed</label><select id="fl2va-seed"> | |
| 212 | - <option value="0" selected>0</option> | |
| 213 | - <option value="42">42</option> | |
| 214 | - <option value="123">123</option> | |
| 215 | - <option value="2024">2024</option> | |
| 216 | - <option value="random">随机</option> | |
| 217 | - </select></div> | |
| 218 | - </div> | |
| 219 | - <details> | |
| 220 | - <summary style="cursor:pointer;font-size:13px;opacity:.8">高级参数(留空 = 用模型默认值)</summary> | |
| 221 | - <label>CFG Scale(默认 1.0≈不引导;蒸馏 LoRA 调太高容易出伪影)</label> | |
| 222 | - <input id="fl2va-cfg" type="number" step="0.1" min="0" placeholder="留空 = 1.0"> | |
| 223 | - <label>负面提示词(默认空)</label> | |
| 224 | - <textarea id="fl2va-negprompt" rows="2" placeholder="例如:模糊,抖动,拖影,五官变形"></textarea> | |
| 225 | - </details> | |
| 226 | - <button class="submit" onclick="submitJob('fl2va')">提交</button> | |
| 227 | - <button type="button" style="margin-top:12px;margin-left:8px;padding:10px 20px" onclick="clearForm('fl2va')">清空</button> | |
| 228 | - <div class="err" id="fl2va-err"></div> | |
| 229 | - </fieldset> | |
| 230 | - | |
| 231 | - <!-- 参考图 --> | |
| 232 | - <fieldset id="tab-ref2va" style="display:none"> | |
| 233 | - <legend>多参考图生视频(Ref2VA)</legend> | |
| 234 | - <label>Prompt</label> | |
| 235 | - <textarea id="ref2va-prompt" rows="10" placeholder="..."></textarea> | |
| 236 | - <label>参考图(可多选,没有张数上限,越多序列越长越慢)</label> | |
| 237 | - <input id="ref2va-refs" type="file" accept="image/*" multiple onchange="uploadMulti()"> | |
| 238 | - <input id="ref2va-refs-url" type="url" placeholder="或粘贴图片 URL,回车添加(可加多个)" onkeydown="if(event.key==='Enter'){event.preventDefault();addArrayUrl('ref2va-refs','ref2va-refs-url',renderRefThumbs,'ref2va-err')}"> | |
| 239 | - <div class="thumbrow" id="ref2va-thumbs"></div> | |
| 240 | - <label>参考视频(可选,最多3段,2-15秒,音轨会自动带上)</label> | |
| 241 | - <input id="ref2va-videos-input" type="file" accept="video/*" multiple onchange="uploadMultiTagged('ref2va-videos-input','ref2va-videos','ref2va-video-tags')"> | |
| 242 | - <input id="ref2va-videos-url" type="url" placeholder="或粘贴视频 URL,回车添加(最多3个)" onkeydown="if(event.key==='Enter'){event.preventDefault();addArrayUrl('ref2va-videos','ref2va-videos-url',()=>renderTags('ref2va-video-tags','ref2va-videos'),'ref2va-err',3)}"> | |
| 243 | - <div class="thumbrow" id="ref2va-video-tags"></div> | |
| 244 | - <label>独立音频参考(可选,最多3个,不跟参考视频绑定)</label> | |
| 245 | - <input id="ref2va-audios-input" type="file" accept="audio/*" multiple onchange="uploadMultiTagged('ref2va-audios-input','ref2va-audios','ref2va-audio-tags')"> | |
| 246 | - <input id="ref2va-audios-url" type="url" placeholder="或粘贴音频 URL,回车添加(最多3个)" onkeydown="if(event.key==='Enter'){event.preventDefault();addArrayUrl('ref2va-audios','ref2va-audios-url',()=>renderTags('ref2va-audio-tags','ref2va-audios'),'ref2va-err',3)}"> | |
| 247 | - <div class="thumbrow" id="ref2va-audio-tags"></div> | |
| 248 | - <div class="row"> | |
| 249 | - <div><label>分辨率</label><select id="ref2va-res" class="res-select"></select></div> | |
| 250 | - <div><label>时长</label><select id="ref2va-dur" class="dur-select"></select></div> | |
| 251 | - </div> | |
| 252 | - <div class="hint" id="ref2va-hint"></div> | |
| 253 | - <div class="row"> | |
| 254 | - <div><label>Turbo</label><select id="ref2va-turbo" class="turbo-select" data-steps="ref2va-steps"><option value="true">开(4步,快)</option><option value="false" selected>关(多步,慢但更稳)</option></select></div> | |
| 255 | - <div><label>步数</label><select id="ref2va-steps"></select></div> | |
| 256 | - <div><label>Seed</label><select id="ref2va-seed"> | |
| 257 | - <option value="0" selected>0</option> | |
| 258 | - <option value="42">42</option> | |
| 259 | - <option value="123">123</option> | |
| 260 | - <option value="2024">2024</option> | |
| 261 | - <option value="random">随机</option> | |
| 262 | - </select></div> | |
| 263 | - </div> | |
| 264 | - <details> | |
| 265 | - <summary style="cursor:pointer;font-size:13px;opacity:.8">高级参数(留空 = 用模型默认值)</summary> | |
| 266 | - <label>CFG Scale(默认 1.0≈不引导;蒸馏 LoRA 调太高容易出伪影)</label> | |
| 267 | - <input id="ref2va-cfg" type="number" step="0.1" min="0" placeholder="留空 = 1.0"> | |
| 268 | - <label>负面提示词(默认空)</label> | |
| 269 | - <textarea id="ref2va-negprompt" rows="2" placeholder="例如:模糊,抖动,拖影,五官变形"></textarea> | |
| 270 | - </details> | |
| 271 | - <button class="submit" onclick="submitJob('ref2va')">提交</button> | |
| 272 | - <button type="button" style="margin-top:12px;margin-left:8px;padding:10px 20px" onclick="clearForm('ref2va')">清空</button> | |
| 273 | - <div class="err" id="ref2va-err"></div> | |
| 274 | - </fieldset> | |
| 275 | -</div> | |
| 276 | - | |
| 277 | -<div id="detail" style="display:none"></div> | |
| 278 | - | |
| 279 | -</div> | |
| 280 | - | |
| 281 | -<script> | |
| 282 | -// server.py 渲染这个页面时会把这个占位符换成 BASE_PATH 环境变量(比如部署在共享域名的 | |
| 283 | -// 子路径 /console 下时)。留空就是原来的行为,直接挂在域名根路径,局域网直连不受影响。 | |
| 284 | -// 所有原本硬编码 "/xxx" 的绝对路径(fetch、pushState、下载/播放链接)都要在前面拼上它, | |
| 285 | -// 否则子路径部署时请求会打到域名根路径,而不是我们这个子路径。 | |
| 286 | -const H3_BASE = "__H3_BASE_PATH__"; | |
| 287 | - | |
| 288 | -// 服务器加了 H3_CONSOLE_AUTH_TOKEN 时,/v1/* 接口要求 Authorization: Bearer <token>。 | |
| 289 | -// 没设这个环境变量时 server.py 直接放行,这段代码在本地/局域网(没配token)环境下是空转, | |
| 290 | -// h3Token() 第一次调用才会真正弹 prompt。 | |
| 291 | -function h3Token() { | |
| 292 | - let t = localStorage.getItem('h3_console_token'); | |
| 293 | - if (t === null) { | |
| 294 | - t = window.prompt('请输入 H3 访问令牌 (Access Token)') || ''; | |
| 295 | - localStorage.setItem('h3_console_token', t); | |
| 296 | - } | |
| 297 | - return t; | |
| 298 | -} | |
| 299 | -// 2026-09-09:只重写本机 /assets/ 的上传文件到服务端缩略图路径(/thumbs/{filename},见 | |
| 300 | -// server.py),外部图床 URL("外部 URL 不经过 /v1/assets 转存"那条路径)原样返回—— | |
| 301 | -// 后端没有那些文件,生不出缩略图。绝不改 req 里存的原始 URL 本身,只用于展示。 | |
| 302 | -function thumbUrl(u) { | |
| 303 | - if (!u) return u; | |
| 304 | - const i = u.indexOf('/assets/'); | |
| 305 | - if (i === -1) return u; | |
| 306 | - return u.slice(0, i) + '/thumbs/' + u.slice(i + '/assets/'.length); | |
| 307 | -} | |
| 308 | -function h3FileUrl(path) { | |
| 309 | - // <video src>/<a href download> 是浏览器原生请求,加不上 Authorization 头, | |
| 310 | - // 只能把 token 拼进查询串——server.py 的 _require_token 两种都认。 | |
| 311 | - const t = h3Token(); | |
| 312 | - return t ? `${path}${path.includes('?') ? '&' : '?'}token=${encodeURIComponent(t)}` : path; | |
| 313 | -} | |
| 314 | -(function () { | |
| 315 | - const origFetch = window.fetch.bind(window); | |
| 316 | - window.fetch = async (input, opts = {}) => { | |
| 317 | - const url = typeof input === 'string' ? input : input.url; | |
| 318 | - if (url.startsWith(H3_BASE + '/v1/')) { | |
| 319 | - const t = h3Token(); | |
| 320 | - if (t) opts = { ...opts, headers: { ...(opts.headers || {}), 'Authorization': 'Bearer ' + t } }; | |
| 321 | - } | |
| 322 | - const r = await origFetch(input, opts); | |
| 323 | - if (r.status === 401) { | |
| 324 | - localStorage.removeItem('h3_console_token'); | |
| 325 | - alert('访问令牌无效,请刷新页面重新输入'); | |
| 326 | - } | |
| 327 | - return r; | |
| 328 | - }; | |
| 329 | -})(); | |
| 330 | - | |
| 331 | -const uploaded = { 'fl2va-first': null, 'fl2va-last': null, 'ref2va-refs': [], 'ref2va-videos': [], 'ref2va-audios': [] }; | |
| 332 | -let jobsCache = []; | |
| 333 | -let trashCache = []; | |
| 334 | -let viewingTrash = false; | |
| 335 | -let openMenuFor = null; | |
| 336 | - | |
| 337 | -// 2026-09-04:原来是"滚到底部自动多拉50条"的无限滚动,列表越滚越长,每条任务的缩略图 | |
| 338 | -// (视频/图片)也跟着越攒越多,同时几十个 <video preload=metadata> 一起抢带宽,这才是 | |
| 339 | -// "任务列表加载变慢"的真正原因(不是接口慢,是 DOM 和媒体请求堆积)。改成真分页——每页 | |
| 340 | -// 固定 20 条,翻页时旧页的行/缩略图节点整个丢弃,同一时间最多只有一页的媒体请求在飞。 | |
| 341 | -const PAGE_SIZE = 20; | |
| 342 | -let currentPage = 1; | |
| 343 | -let totalJobs = 0; | |
| 344 | -let filterQ = ''; | |
| 345 | -let filterStatus = ''; | |
| 346 | -let filterKind = ''; | |
| 347 | -let sortOrder = 'desc'; | |
| 348 | - | |
| 349 | -function resetPaging() { currentPage = 1; refreshJobs(); } | |
| 350 | - | |
| 351 | -function gotoPage(p) { | |
| 352 | - const totalPages = Math.max(1, Math.ceil(totalJobs / PAGE_SIZE)); | |
| 353 | - currentPage = Math.min(Math.max(1, p), totalPages); | |
| 354 | - refreshJobs(); | |
| 355 | - document.getElementById('job-list').scrollTop = 0; | |
| 356 | -} | |
| 357 | - | |
| 358 | -// URL 是 /task.html/<id> 或 /newtask.html(或裸 /,等同 newtask)——不是两个页面文件, | |
| 359 | -// server.py 里 /task.html/{tid} 和 /newtask.html 两条路由都返回这同一份 index.html, | |
| 360 | -// 这里只是从地址栏读出当前该显示哪个视图,方便复制链接分享、刷新页面不丢状态。 | |
| 361 | -function tidFromPath() { | |
| 362 | - let p = location.pathname; | |
| 363 | - if (H3_BASE && p.startsWith(H3_BASE)) p = p.slice(H3_BASE.length); | |
| 364 | - const m = p.match(/^\/task\.html\/(.+)$/); | |
| 365 | - return m ? decodeURIComponent(m[1]) : null; | |
| 366 | -} | |
| 367 | -let selectedId = tidFromPath(); | |
| 368 | - | |
| 369 | -document.querySelectorAll('.tabs button').forEach(btn => btn.onclick = () => { | |
| 370 | - document.querySelectorAll('.tabs button').forEach(b => b.classList.remove('active')); | |
| 371 | - btn.classList.add('active'); | |
| 372 | - ['text','fl2va','ref2va'].forEach(t => document.getElementById('tab-'+t).style.display = (t===btn.dataset.tab ? 'block' : 'none')); | |
| 373 | -}); | |
| 374 | - | |
| 375 | -let searchDebounce = null; | |
| 376 | -document.getElementById('job-search').addEventListener('input', e => { | |
| 377 | - filterQ = e.target.value.trim(); | |
| 378 | - clearTimeout(searchDebounce); | |
| 379 | - searchDebounce = setTimeout(resetPaging, 300); // 防抖,不用每敲一个字就打一次请求 | |
| 380 | -}); | |
| 381 | -document.getElementById('job-status-filter').addEventListener('change', e => { filterStatus = e.target.value; resetPaging(); }); | |
| 382 | -document.getElementById('job-kind-filter').addEventListener('change', e => { filterKind = e.target.value; resetPaging(); }); | |
| 383 | -document.getElementById('job-sort-btn').addEventListener('click', e => { | |
| 384 | - sortOrder = sortOrder === 'desc' ? 'asc' : 'desc'; | |
| 385 | - e.target.textContent = sortOrder === 'desc' ? '↓最新' : '↑最早'; | |
| 386 | - resetPaging(); | |
| 387 | -}); | |
| 388 | - | |
| 389 | -function showCreate(pushUrl = true) { | |
| 390 | - selectedId = null; | |
| 391 | - if (pushUrl) history.pushState(null, '', H3_BASE + '/newtask.html'); | |
| 392 | - document.getElementById('create-view').style.display = 'block'; | |
| 393 | - document.getElementById('detail').style.display = 'none'; | |
| 394 | - renderSidebar(); | |
| 395 | -} | |
| 396 | - | |
| 397 | -// 2026-08-23:Raylight切到SAGE_FP16之后,4个分辨率各自排列组合实测过真实上限(见 | |
| 398 | -// raylight/notes.md)。maxFrames 是每个分辨率最后一个确认能跑的帧数,跟 raylight/server.py | |
| 399 | -// 的 RESOLUTION_CEILINGS 保持一致——两边算法对不上就会出现"前端放行、后端拒绝"或反过来, | |
| 400 | -// 数字改动两边一起改。832×480/1024×576/1344×768 三个是真实CUDA OOM边界;448×256 技术上测到 | |
| 401 | -// 3000帧都没OOM,1200帧(50秒)是画质边界(用户看过实际输出判定50秒往后不能看),不是显存边界。 | |
| 402 | -// 2026-09-01:新建任务的默认档位改成竖屏 480×832 / 10s(243帧)/ Turbo关 / 20步——用户要求。 | |
| 403 | -// 默认值统一走下面的 DEFAULT_RES / DEFAULT_DUR,列表顺序不再决定默认选项(初始化和"清空表单" | |
| 404 | -// 两处都读这两个常量,改一处就够)。Turbo 默认关在三个表单的 <select> 里写死(option selected), | |
| 405 | -// 20 步是 STEPS_BY_TURBO.false 的第一项,跟着 Turbo 联动自动选中。 | |
| 406 | -// 2026-09-01:竖屏是宽高互换实现的,不是独立的横竖屏参数(生产已有 720×1280 提交案例,见 | |
| 407 | -// docs/todo/h3-showcase-cases.md)。maxFrames 沿用对应横屏档位的实测值——宽高互换总像素数不变, | |
| 408 | -// 显存/耗时特征预期一致,但没有单独针对竖屏重新跑过 OOM 边界测试,如果发现竖屏更早 OOM 要单独下调。 | |
| 409 | -const RESOLUTIONS = [ | |
| 410 | - { value: '1344x768', width: 1344, height: 768, label: '1344×768(官方默认分辨率,横屏)', maxFrames: 412 }, | |
| 411 | - { value: '768x1344', width: 768, height: 1344, label: '768×1344(官方默认分辨率,竖屏)', maxFrames: 412 }, | |
| 412 | - { value: '832x480', width: 832, height: 480, label: '832×480(标准档,横屏)', maxFrames: 1125 }, | |
| 413 | - { value: '480x832', width: 480, height: 832, label: '480×832(标准档,竖屏)', maxFrames: 1125 }, | |
| 414 | - { value: '448x256', width: 448, height: 256, label: '448×256(长时长档,横屏)', maxFrames: 1200 }, | |
| 415 | - { value: '256x448', width: 256, height: 448, label: '256×448(长时长档,竖屏)', maxFrames: 1200 }, | |
| 416 | - { value: '1024x576', width: 1024, height: 576, label: '1024×576(高清档,横屏)', maxFrames: 743 }, | |
| 417 | - { value: '576x1024', width: 576, height: 1024, label: '576×1024(高清档,竖屏)', maxFrames: 743 }, | |
| 418 | -]; | |
| 419 | -const DEFAULT_RES = '480x832'; // 竖屏标准档 | |
| 420 | -const DEFAULT_DUR = '243'; // 10s @24fps | |
| 421 | -const DURATIONS = [ | |
| 422 | - { value: '124', frames: 124, label: '5s' }, | |
| 423 | - { value: '243', frames: 243, label: '10s' }, | |
| 424 | - { value: '362', frames: 362, label: '15s' }, | |
| 425 | - { value: '412', frames: 412, label: '17s(1344×768 实测上限)' }, | |
| 426 | - { value: '600', frames: 600, label: '25s' }, | |
| 427 | - { value: '743', frames: 743, label: '31s(1024×576 实测上限)' }, | |
| 428 | - { value: '900', frames: 900, label: '37.5s' }, | |
| 429 | - { value: '1125', frames: 1125, label: '47s(832×480 实测上限)' }, | |
| 430 | - { value: '1200', frames: 1200, label: '50s(448×256 画质上限,非显存上限)' }, | |
| 431 | -]; | |
| 432 | -// Turbo LoRA 是 4 步蒸馏的,步数选项跟着 Turbo 开关联动——这两个字段本来就是耦合的, | |
| 433 | -// 分开选很容易选出"关 Turbo 却只给4步"这种没意义的组合。 | |
| 434 | -const STEPS_BY_TURBO = { | |
| 435 | - true: [{ value: '4', label: '4步(推荐,Turbo LoRA 就是4步蒸馏的)' }, | |
| 436 | - { value: '8', label: '8步(协议允许上限,未专门测过)' }], | |
| 437 | - false: [{ value: '20', label: '20步' }, | |
| 438 | - { value: '50', label: '50步(实测全质量,约9.6倍耗时)' }], | |
| 439 | -}; | |
| 440 | - | |
| 441 | -function fillSelect(select, options) { | |
| 442 | - select.innerHTML = options.map(o => `<option value="${o.value}">${o.label}</option>`).join(''); | |
| 443 | -} | |
| 444 | - | |
| 445 | -function syncDurOptions(prefix) { | |
| 446 | - const resSelect = document.getElementById(prefix + '-res'); | |
| 447 | - const durSelect = document.getElementById(prefix + '-dur'); | |
| 448 | - const hint = document.getElementById(prefix + '-hint'); | |
| 449 | - if (!resSelect || !durSelect) return; | |
| 450 | - const res = RESOLUTIONS.find(r => r.value === resSelect.value); | |
| 451 | - const prevValue = durSelect.value; | |
| 452 | - const allowed = DURATIONS.filter(d => d.frames <= res.maxFrames); | |
| 453 | - fillSelect(durSelect, allowed); | |
| 454 | - durSelect.value = allowed.some(d => d.value === prevValue) ? prevValue : allowed[0].value; | |
| 455 | - if (hint) { | |
| 456 | - const dropped = DURATIONS.filter(d => !allowed.includes(d)).map(d => d.label); | |
| 457 | - hint.textContent = dropped.length | |
| 458 | - ? `⚠ ${res.label} 分辨率实测上限 ${res.maxFrames} 帧,${dropped.join('、')} 会撞真实上限,已不可选。` | |
| 459 | - : `${res.label} 分辨率下,${DURATIONS.map(d => d.label).join('/')} 均可选。`; | |
| 460 | - } | |
| 461 | -} | |
| 462 | - | |
| 463 | -function initParamSelects(prefix) { | |
| 464 | - const res = document.getElementById(prefix + '-res'); | |
| 465 | - const dur = document.getElementById(prefix + '-dur'); | |
| 466 | - if (res) { fillSelect(res, RESOLUTIONS); res.value = DEFAULT_RES; } | |
| 467 | - if (dur) { fillSelect(dur, DURATIONS); dur.value = DEFAULT_DUR; } | |
| 468 | - if (res) { syncDurOptions(prefix); res.onchange = () => syncDurOptions(prefix); } | |
| 469 | - | |
| 470 | - const turboSelect = document.getElementById(prefix + '-turbo'); | |
| 471 | - if (turboSelect) { | |
| 472 | - const stepsSelect = document.getElementById(turboSelect.dataset.steps); | |
| 473 | - const syncSteps = () => fillSelect(stepsSelect, STEPS_BY_TURBO[turboSelect.value]); | |
| 474 | - turboSelect.onchange = syncSteps; | |
| 475 | - syncSteps(); | |
| 476 | - } | |
| 477 | -} | |
| 478 | - | |
| 479 | -['text', 'fl2va', 'ref2va'].forEach(initParamSelects); | |
| 480 | - | |
| 481 | -async function uploadFile(file) { | |
| 482 | - const fd = new FormData(); fd.append('file', file); | |
| 483 | - const r = await fetch(H3_BASE + '/v1/assets', { method: 'POST', body: fd }); | |
| 484 | - if (!r.ok) throw new Error(await r.text()); | |
| 485 | - return await r.json(); | |
| 486 | -} | |
| 487 | - | |
| 488 | -// 外部 URL 不经过 /v1/assets 转存,直接把地址原样交给后端——raylight 拿到 reference_image_urls | |
| 489 | -// 等字段里的 URL 就是 urllib.request.urlopen() 下载,本机 /v1/assets 生成的 URL 和外部 URL | |
| 490 | -// 对它没有区别。所以这里跳过上传,直接把用户粘贴的地址塞进 uploaded 状态。 | |
| 491 | -// ponytail: 不校验 URL 是否可达/是图片——排队执行时后端下载失败才会报错,不在提交阶段拦截。 | |
| 492 | -function addSingleUrl(key, inputId, renderFn, errBoxId) { | |
| 493 | - const input = document.getElementById(inputId); | |
| 494 | - const url = input.value.trim(); | |
| 495 | - if (!url) return; | |
| 496 | - uploaded[key] = url; | |
| 497 | - input.value = ''; | |
| 498 | - document.getElementById(errBoxId).textContent = ''; | |
| 499 | - renderFn(); | |
| 500 | -} | |
| 501 | - | |
| 502 | -function addArrayUrl(key, inputId, renderFn, errBoxId, cap) { | |
| 503 | - const input = document.getElementById(inputId); | |
| 504 | - const url = input.value.trim(); | |
| 505 | - if (!url) return; | |
| 506 | - if (cap && uploaded[key].length >= cap) { | |
| 507 | - document.getElementById(errBoxId).textContent = `最多${cap}个,已达上限`; | |
| 508 | - return; | |
| 509 | - } | |
| 510 | - uploaded[key].push(url); | |
| 511 | - input.value = ''; | |
| 512 | - document.getElementById(errBoxId).textContent = ''; | |
| 513 | - renderFn(); | |
| 514 | -} | |
| 515 | - | |
| 516 | -// server.py 把原始文件名塞进了存盘文件名里(<aid>__<原名>.ext),这里直接从 URL 反解出来 | |
| 517 | -// 显示——不用单独维护一份 filename 状态,旧任务(改动前上传的,URL 里没有 __ 分段)会 | |
| 518 | -// 退化成显示 uuid 文件名,不算错误,只是没有原名可用。 | |
| 519 | -function filenameFromUrl(u) { | |
| 520 | - try { | |
| 521 | - const base = decodeURIComponent(u.split('/').pop().split('?')[0]); | |
| 522 | - const m = base.match(/^[0-9a-f]{16}__(.+)$/); | |
| 523 | - return m ? m[1] : base; | |
| 524 | - } catch (e) { return u; } | |
| 525 | -} | |
| 526 | - | |
| 527 | -// 每个预览项都包一层 .thumb-wrap,文件名 caption 放在最上面、媒体本体再包一层 | |
| 528 | -// .thumb-media 挂 × 删除按钮——上传上去选错了/传多了,之前只能整个表单清空重来, | |
| 529 | -// 2026-08-24 用户要求能单个删;文件名是 2026-08-24 补的,之前只有个位置标签看不出传的是 | |
| 530 | -// 哪个文件;2026-08-25 改成放图片上方(之前放下面,用户反馈不够显眼,容易当成没显示)。 | |
| 531 | -function wrapWithDelete(mediaEl, onDelete, caption) { | |
| 532 | - const wrap = document.createElement('span'); | |
| 533 | - wrap.className = 'thumb-wrap'; | |
| 534 | - if (caption) { | |
| 535 | - const cap = document.createElement('span'); | |
| 536 | - cap.className = 'thumb-name'; cap.textContent = caption; cap.title = caption; | |
| 537 | - wrap.appendChild(cap); | |
| 538 | - } | |
| 539 | - const mediaWrap = document.createElement('span'); | |
| 540 | - mediaWrap.className = 'thumb-media'; | |
| 541 | - const del = document.createElement('button'); | |
| 542 | - del.type = 'button'; del.className = 'thumb-del'; del.textContent = '×'; del.title = '删除'; | |
| 543 | - del.onclick = onDelete; | |
| 544 | - mediaWrap.appendChild(mediaEl); mediaWrap.appendChild(del); | |
| 545 | - wrap.appendChild(mediaWrap); | |
| 546 | - return wrap; | |
| 547 | -} | |
| 548 | - | |
| 549 | -function renderFl2vaThumbs() { | |
| 550 | - const box = document.getElementById('fl2va-thumbs'); box.innerHTML = ''; | |
| 551 | - [['fl2va-first', '首帧'], ['fl2va-last', '尾帧']].forEach(([key, label]) => { | |
| 552 | - const u = uploaded[key]; | |
| 553 | - if (!u) return; | |
| 554 | - const img = document.createElement('img'); img.src = u; img.title = label; | |
| 555 | - box.appendChild(wrapWithDelete(img, () => { | |
| 556 | - uploaded[key] = null; | |
| 557 | - document.getElementById(key).value = ''; // 清掉file input,不然重选同一个文件不会触发change | |
| 558 | - renderFl2vaThumbs(); | |
| 559 | - }, `${label} · ${filenameFromUrl(u)}`)); | |
| 560 | - }); | |
| 561 | -} | |
| 562 | - | |
| 563 | -async function uploadTo(inputId) { | |
| 564 | - const el = document.getElementById(inputId); | |
| 565 | - if (!el.files[0]) return; | |
| 566 | - try { | |
| 567 | - const res = await uploadFile(el.files[0]); | |
| 568 | - uploaded[inputId] = res.url; | |
| 569 | - renderFl2vaThumbs(); | |
| 570 | - } catch (e) { document.getElementById('fl2va-err').textContent = '上传失败: ' + e.message; } | |
| 571 | -} | |
| 572 | - | |
| 573 | -function renderRefThumbs() { | |
| 574 | - const box = document.getElementById('ref2va-thumbs'); box.innerHTML = ''; | |
| 575 | - uploaded['ref2va-refs'].forEach((u, i) => { | |
| 576 | - const img = document.createElement('img'); img.src = u; | |
| 577 | - const label = `参考图${i+1}`; img.title = label; | |
| 578 | - box.appendChild(wrapWithDelete(img, () => { | |
| 579 | - uploaded['ref2va-refs'].splice(i, 1); | |
| 580 | - renderRefThumbs(); | |
| 581 | - }, `${label} · ${filenameFromUrl(u)}`)); | |
| 582 | - }); | |
| 583 | -} | |
| 584 | - | |
| 585 | -async function uploadMulti() { | |
| 586 | - const el = document.getElementById('ref2va-refs'); | |
| 587 | - for (const f of el.files) { | |
| 588 | - try { | |
| 589 | - const res = await uploadFile(f); | |
| 590 | - uploaded['ref2va-refs'].push(res.url); | |
| 591 | - } catch (e) { document.getElementById('ref2va-err').textContent = '上传失败: ' + e.message; } | |
| 592 | - } | |
| 593 | - renderRefThumbs(); | |
| 594 | -} | |
| 595 | - | |
| 596 | -// 参考视频/独立音频参考共用——不像参考图没有上限,这两个都封顶3个(跟节点协议一致), | |
| 597 | -// elId 里带 "video"/"audio" 判断放哪种播放器——跟生成结果的视频一样直接能播放预览。 | |
| 598 | -function renderTags(elId, stateKey) { | |
| 599 | - const box = document.getElementById(elId); box.innerHTML = ''; | |
| 600 | - const isVideo = elId.includes('video'); | |
| 601 | - uploaded[stateKey].forEach((u, i) => { | |
| 602 | - const el = document.createElement(isVideo ? 'video' : 'audio'); | |
| 603 | - el.src = u; el.controls = true; | |
| 604 | - const label = (isVideo ? '参考视频' : '参考音频') + (i + 1); | |
| 605 | - el.title = label; | |
| 606 | - box.appendChild(wrapWithDelete(el, () => { | |
| 607 | - uploaded[stateKey].splice(i, 1); | |
| 608 | - renderTags(elId, stateKey); | |
| 609 | - }, `${label} · ${filenameFromUrl(u)}`)); | |
| 610 | - }); | |
| 611 | -} | |
| 612 | - | |
| 613 | -async function uploadMultiTagged(inputId, stateKey, tagsElId) { | |
| 614 | - const el = document.getElementById(inputId); | |
| 615 | - const errBox = document.getElementById('ref2va-err'); | |
| 616 | - for (const f of el.files) { | |
| 617 | - if (uploaded[stateKey].length >= 3) { errBox.textContent = '最多3个,已达上限'; break; } | |
| 618 | - try { | |
| 619 | - const res = await uploadFile(f); | |
| 620 | - uploaded[stateKey].push(res.url); | |
| 621 | - } catch (e) { errBox.textContent = '上传失败: ' + e.message; } | |
| 622 | - } | |
| 623 | - renderTags(tagsElId, stateKey); | |
| 624 | -} | |
| 625 | - | |
| 626 | -// 分辨率/时长/Turbo/步数/Seed 五个字段,三个 tab 结构完全一样,抽出来一份读取逻辑。 | |
| 627 | -function readParamSelects(prefix) { | |
| 628 | - const res = RESOLUTIONS.find(r => r.value === document.getElementById(prefix + '-res').value); | |
| 629 | - const dur = DURATIONS.find(d => d.value === document.getElementById(prefix + '-dur').value); | |
| 630 | - const seedRaw = document.getElementById(prefix + '-seed').value; | |
| 631 | - const out = { | |
| 632 | - width: res.width, height: res.height, frames: dur.frames, | |
| 633 | - turbo: document.getElementById(prefix + '-turbo').value === 'true', | |
| 634 | - steps: +document.getElementById(prefix + '-steps').value, | |
| 635 | - seed: seedRaw === 'random' ? Math.floor(Math.random() * 2**31) : +seedRaw, | |
| 636 | - }; | |
| 637 | - // 留空就不放进请求体(不是传 null)——api.py 的 Optional 字段收到 None/缺失都当"不覆盖", | |
| 638 | - // 但省略键更直观地对应"没填"。 | |
| 639 | - const cfgRaw = document.getElementById(prefix + '-cfg').value.trim(); | |
| 640 | - if (cfgRaw !== '') out.cfg_scale = +cfgRaw; | |
| 641 | - const negRaw = document.getElementById(prefix + '-negprompt').value.trim(); | |
| 642 | - if (negRaw !== '') out.negative_prompt = negRaw; | |
| 643 | - return out; | |
| 644 | -} | |
| 645 | - | |
| 646 | -async function submitJob(kind) { | |
| 647 | - const errBox = document.getElementById(kind + '-err'); errBox.textContent = ''; | |
| 648 | - if (resetting) { errBox.textContent = 'GPU正在重置,请等重置完成后再提交'; return; } | |
| 649 | - let body = {}; | |
| 650 | - if (kind === 'text') { | |
| 651 | - body = { prompt: document.getElementById('text-prompt').value, ...readParamSelects('text') }; | |
| 652 | - } else if (kind === 'fl2va') { | |
| 653 | - if (!uploaded['fl2va-first']) { errBox.textContent = '请先上传首帧图'; return; } | |
| 654 | - body = { | |
| 655 | - prompt: document.getElementById('fl2va-prompt').value, | |
| 656 | - first_frame_url: uploaded['fl2va-first'], | |
| 657 | - last_frame_url: uploaded['fl2va-last'] || undefined, | |
| 658 | - ...readParamSelects('fl2va'), | |
| 659 | - }; | |
| 660 | - } else if (kind === 'ref2va') { | |
| 661 | - if (uploaded['ref2va-refs'].length === 0 && uploaded['ref2va-videos'].length === 0 && uploaded['ref2va-audios'].length === 0) { | |
| 662 | - errBox.textContent = '请先上传至少一张参考图/一段参考视频/一个参考音频'; return; | |
| 663 | - } | |
| 664 | - body = { | |
| 665 | - prompt: document.getElementById('ref2va-prompt').value, | |
| 666 | - reference_image_urls: uploaded['ref2va-refs'], | |
| 667 | - reference_video_urls: uploaded['ref2va-videos'], | |
| 668 | - reference_audio_urls: uploaded['ref2va-audios'], | |
| 669 | - ...readParamSelects('ref2va'), | |
| 670 | - }; | |
| 671 | - } | |
| 672 | - if (!body.prompt) { errBox.textContent = '请填写 prompt'; return; } | |
| 673 | - try { | |
| 674 | - const r = await fetch(H3_BASE + '/v1/videos', { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify(body) }); | |
| 675 | - if (!r.ok) throw new Error(await r.text()); | |
| 676 | - const job = await r.json(); | |
| 677 | - await refreshJobs(); | |
| 678 | - selectJob(job.id); // 提交完直接跳到这条任务的详情,能立刻看到排队/运行状态 | |
| 679 | - } catch (e) { errBox.textContent = '提交失败: ' + e.message; } | |
| 680 | -} | |
| 681 | - | |
| 682 | -// 一键清空——2026-08-24 用户要求:重跑会把整个表单灌满,之前只能一个个手动清,没有回退路径。 | |
| 683 | -// 直接恢复成 initParamSelects 那套默认值(DEFAULT_RES=480×832 竖屏、DEFAULT_DUR=10s、 | |
| 684 | -// Turbo关/20步/seed=0),不是清空成空值——分辨率/时长/Turbo/步数这几个下拉框本来就不允许空选项。 | |
| 685 | -function clearForm(kind) { | |
| 686 | - if (!confirm('确定清空这个表单的所有内容?')) return; | |
| 687 | - document.getElementById(kind + '-prompt').value = ''; | |
| 688 | - document.getElementById(kind + '-cfg').value = ''; | |
| 689 | - document.getElementById(kind + '-negprompt').value = ''; | |
| 690 | - document.getElementById(kind + '-res').value = DEFAULT_RES; | |
| 691 | - syncDurOptions(kind); | |
| 692 | - const durSel = document.getElementById(kind + '-dur'); | |
| 693 | - if ([...durSel.options].some(o => o.value === DEFAULT_DUR)) durSel.value = DEFAULT_DUR; | |
| 694 | - const turboSel = document.getElementById(kind + '-turbo'); | |
| 695 | - turboSel.value = 'false'; | |
| 696 | - turboSel.onchange(); // 联动刷新步数选项 | |
| 697 | - document.getElementById(kind + '-seed').value = '0'; | |
| 698 | - document.getElementById(kind + '-err').textContent = ''; | |
| 699 | - | |
| 700 | - if (kind === 'fl2va') { | |
| 701 | - uploaded['fl2va-first'] = null; uploaded['fl2va-last'] = null; | |
| 702 | - document.getElementById('fl2va-first').value = ''; | |
| 703 | - document.getElementById('fl2va-last').value = ''; | |
| 704 | - document.getElementById('fl2va-first-url').value = ''; | |
| 705 | - document.getElementById('fl2va-last-url').value = ''; | |
| 706 | - renderFl2vaThumbs(); | |
| 707 | - } else if (kind === 'ref2va') { | |
| 708 | - uploaded['ref2va-refs'] = []; uploaded['ref2va-videos'] = []; uploaded['ref2va-audios'] = []; | |
| 709 | - document.getElementById('ref2va-refs').value = ''; | |
| 710 | - document.getElementById('ref2va-videos-input').value = ''; | |
| 711 | - document.getElementById('ref2va-audios-input').value = ''; | |
| 712 | - document.getElementById('ref2va-refs-url').value = ''; | |
| 713 | - document.getElementById('ref2va-videos-url').value = ''; | |
| 714 | - document.getElementById('ref2va-audios-url').value = ''; | |
| 715 | - renderRefThumbs(); | |
| 716 | - renderTags('ref2va-video-tags', 'ref2va-videos'); | |
| 717 | - renderTags('ref2va-audio-tags', 'ref2va-audios'); | |
| 718 | - } | |
| 719 | -} | |
| 720 | - | |
| 721 | -// 重跑:不直接提交,而是把这条任务当初的 req 灌回"新建任务"表单(对应的 tab、参数、 | |
| 722 | -// 已上传的图片 URL 都原样带过去),跳到 /newtask.html,用户看一眼确认无误后自己点提交—— | |
| 723 | -// 跟正常新建任务走的是同一条路径、同一次人工确认,不是绕过表单直接后台再发一次请求。 | |
| 724 | -function prefillCreate(req) { | |
| 725 | - const kind = (req.first_frame_url || req.last_frame_url) ? 'fl2va' | |
| 726 | - : ((req.reference_image_urls || []).length || (req.reference_video_urls || []).length || (req.reference_audio_urls || []).length) ? 'ref2va' : 'text'; | |
| 727 | - | |
| 728 | - document.querySelectorAll('.tabs button').forEach(b => b.classList.toggle('active', b.dataset.tab === kind)); | |
| 729 | - ['text', 'fl2va', 'ref2va'].forEach(t => document.getElementById('tab-' + t).style.display = (t === kind ? 'block' : 'none')); | |
| 730 | - | |
| 731 | - document.getElementById(kind + '-prompt').value = req.prompt || ''; | |
| 732 | - | |
| 733 | - const resOpt = RESOLUTIONS.find(o => o.width === req.width && o.height === req.height); | |
| 734 | - if (resOpt) document.getElementById(kind + '-res').value = resOpt.value; | |
| 735 | - syncDurOptions(kind); // 按刚设好的分辨率重新过滤时长选项,再决定原来的档位还能不能选 | |
| 736 | - const durSel = document.getElementById(kind + '-dur'); | |
| 737 | - const durOpt = DURATIONS.find(o => o.frames === req.frames); | |
| 738 | - if (durOpt && [...durSel.options].some(o => o.value === durOpt.value)) durSel.value = durOpt.value; | |
| 739 | - | |
| 740 | - const turboSel = document.getElementById(kind + '-turbo'); | |
| 741 | - turboSel.value = req.turbo === false ? 'false' : 'true'; | |
| 742 | - turboSel.onchange(); // 联动刷新步数选项,必须在设置步数值之前调用 | |
| 743 | - const stepsSel = document.getElementById(kind + '-steps'); | |
| 744 | - if (req.steps != null && [...stepsSel.options].some(o => o.value === String(req.steps))) { | |
| 745 | - stepsSel.value = String(req.steps); | |
| 746 | - } | |
| 747 | - const seedSel = document.getElementById(kind + '-seed'); | |
| 748 | - if (req.seed != null) { | |
| 749 | - if (![...seedSel.options].some(o => o.value === String(req.seed))) { | |
| 750 | - const opt = document.createElement('option'); | |
| 751 | - opt.value = String(req.seed); opt.textContent = req.seed + '(原任务的 seed)'; | |
| 752 | - seedSel.insertBefore(opt, seedSel.firstChild); | |
| 753 | - } | |
| 754 | - seedSel.value = String(req.seed); | |
| 755 | - } | |
| 756 | - | |
| 757 | - document.getElementById(kind + '-cfg').value = req.cfg_scale != null ? req.cfg_scale : ''; | |
| 758 | - document.getElementById(kind + '-negprompt').value = req.negative_prompt || ''; | |
| 759 | - | |
| 760 | - if (kind === 'fl2va') { | |
| 761 | - uploaded['fl2va-first'] = req.first_frame_url || null; | |
| 762 | - uploaded['fl2va-last'] = req.last_frame_url || null; | |
| 763 | - renderFl2vaThumbs(); | |
| 764 | - } else if (kind === 'ref2va') { | |
| 765 | - uploaded['ref2va-refs'] = (req.reference_image_urls || []).slice(); | |
| 766 | - uploaded['ref2va-videos'] = (req.reference_video_urls || []).slice(); | |
| 767 | - uploaded['ref2va-audios'] = (req.reference_audio_urls || []).slice(); | |
| 768 | - renderRefThumbs(); | |
| 769 | - renderTags('ref2va-video-tags', 'ref2va-videos'); | |
| 770 | - renderTags('ref2va-audio-tags', 'ref2va-audios'); | |
| 771 | - } | |
| 772 | - | |
| 773 | - showCreate(); | |
| 774 | -} | |
| 775 | - | |
| 776 | -async function rerunJob(id) { | |
| 777 | - try { | |
| 778 | - const r = await fetch(`${H3_BASE}/v1/videos/${id}`); | |
| 779 | - if (!r.ok) throw new Error(await r.text()); | |
| 780 | - const req = (await r.json()).req || {}; | |
| 781 | - prefillCreate(req); | |
| 782 | - } catch (e) { alert('重跑失败: ' + e.message); } | |
| 783 | -} | |
| 784 | - | |
| 785 | -// 硬重启期间(停止运行中任务/重置显存)端口直接连不上,提交/轮询都会失败——用这个全局开关 | |
| 786 | -// 锁住提交按钮,轮询/health直到真正恢复,不让用户在这段时间瞎点提交撞一堆报错。 | |
| 787 | -let resetting = false; | |
| 788 | - | |
| 789 | -function setResetting(on) { | |
| 790 | - resetting = on; | |
| 791 | - document.querySelectorAll('button.submit').forEach(b => { | |
| 792 | - b.disabled = on; | |
| 793 | - if (on) { b.dataset.origText = b.dataset.origText || b.textContent; b.textContent = '重置中…'; } | |
| 794 | - else if (b.dataset.origText) { b.textContent = b.dataset.origText; } | |
| 795 | - }); | |
| 796 | - const btn = document.getElementById('reset-gpu-btn'); | |
| 797 | - if (btn) btn.disabled = on; | |
| 798 | -} | |
| 799 | - | |
| 800 | -async function waitForHealthy() { | |
| 801 | - // 重启那几秒端口没监听,fetch会直接抛异常——这是预期中的过程,不是失败,一直重试到连上为止 | |
| 802 | - while (true) { | |
| 803 | - await new Promise(res => setTimeout(res, 3000)); | |
| 804 | - try { | |
| 805 | - const r = await fetch(H3_BASE + '/v1/backends'); | |
| 806 | - if (r.ok) { const d = await r.json(); if (d.ready >= d.total) return; } | |
| 807 | - } catch (e) { /* 重启中,继续等 */ } | |
| 808 | - } | |
| 809 | -} | |
| 810 | - | |
| 811 | -async function cancelJob(id, running) { | |
| 812 | - // running=true 时是"停止":Raylight的Ray子进程不理会ComfyUI的/interrupt,唯一能真正把 | |
| 813 | - // GPU收回来的办法是硬重启整个服务——所以要把这个代价明确告诉用户,不能假装是优雅停止。 | |
| 814 | - const msg = running | |
| 815 | - ? '确定停止这条正在运行的任务?会硬重启整个服务来打断它(没有更温和的办法,Raylight的计算跑在独立进程里,收不到普通的打断信号),大约15-20秒后GPU恢复可用,重启期间无法提交新任务。' | |
| 816 | - : '确定取消这条排队中的任务?'; | |
| 817 | - if (!confirm(msg)) return; | |
| 818 | - try { | |
| 819 | - const r = await fetch(`${H3_BASE}/v1/videos/${id}/cancel`, { method: 'POST' }); | |
| 820 | - if (!r.ok) throw new Error(await r.text()); | |
| 821 | - if (running) { | |
| 822 | - setResetting(true); | |
| 823 | - document.getElementById('backends').textContent = '⏳ 正在重置GPU,服务重启中,请稍候…'; | |
| 824 | - await waitForHealthy(); | |
| 825 | - setResetting(false); | |
| 826 | - await refreshBackends(); | |
| 827 | - } | |
| 828 | - await refreshDetail(); | |
| 829 | - await refreshJobs(); | |
| 830 | - } catch (e) { alert((running ? '停止' : '取消') + '失败: ' + e.message); } | |
| 831 | -} | |
| 832 | - | |
| 833 | -async function resetGpu() { | |
| 834 | - if (!confirm('确定重置GPU?会硬重启整个服务,打断当前正在运行的任务(如果有),大约15-20秒,重置完成前无法提交新任务。')) return; | |
| 835 | - try { | |
| 836 | - const r = await fetch(`${H3_BASE}/v1/admin/reset-gpu`, { method: 'POST' }); | |
| 837 | - if (!r.ok) throw new Error(await r.text()); | |
| 838 | - } catch (e) { alert('触发重置失败: ' + e.message); return; } | |
| 839 | - setResetting(true); | |
| 840 | - document.getElementById('backends').textContent = '⏳ 正在重置GPU,服务重启中,请稍候…'; | |
| 841 | - await waitForHealthy(); | |
| 842 | - setResetting(false); | |
| 843 | - await refreshBackends(); | |
| 844 | - await refreshJobs(); | |
| 845 | -} | |
| 846 | - | |
| 847 | -function jobKindLabel(req) { | |
| 848 | - if (req.first_frame_url || req.last_frame_url) return '首尾帧'; | |
| 849 | - if ((req.reference_image_urls || []).length || (req.reference_video_urls || []).length || (req.reference_audio_urls || []).length) return '参考图'; | |
| 850 | - return '文生'; | |
| 851 | -} | |
| 852 | - | |
| 853 | -// 已完成的任务直接拿结果视频当封面(preload=metadata 只取第一帧,不下载整段); | |
| 854 | -// 还没完成的用输入的首帧图/参考图占位(缩略图版本,见 thumbUrl),好歹能看出这条任务在 | |
| 855 | -// 做什么;两者都没有(纯文生视频还没跑完)就退化成显示任务类型文字。 | |
| 856 | -// ponytail: 列表里同时出现很多条"已完成"任务时,浏览器会并发发起同等数量的 | |
| 857 | -// metadata 探测请求,量大可能变卡——真遇到再改成后端生成静态封面图。 | |
| 858 | -function jobThumbHtml(j) { | |
| 859 | - const req = j.req || {}; | |
| 860 | - if (j.status === 'done') { | |
| 861 | - const src = h3FileUrl(H3_BASE + '/v1/videos/' + j.id + '/file'); | |
| 862 | - return `<video src="${src}" muted preload="metadata"></video>`; | |
| 863 | - } | |
| 864 | - const imgUrl = req.first_frame_url || (req.reference_image_urls || [])[0]; | |
| 865 | - if (imgUrl) return `<img src="${thumbUrl(imgUrl)}" loading="lazy">`; | |
| 866 | - return `<div class="jr-thumb-empty">${jobKindLabel(req)}</div>`; | |
| 867 | -} | |
| 868 | - | |
| 869 | -function statusLabel(s) { | |
| 870 | - const map = { queued: '排队中', running: '运行中', done: '已完成', failed: '失败', cancelled: '已取消' }; | |
| 871 | - return `<span class="status-${s}">${map[s] || s}</span>`; | |
| 872 | -} | |
| 873 | - | |
| 874 | -function timeAgo(ts) { | |
| 875 | - if (!ts) return ''; | |
| 876 | - const s = Math.max(0, Math.round(Date.now()/1000 - ts)); | |
| 877 | - if (s < 60) return s + '秒前'; | |
| 878 | - if (s < 3600) return Math.round(s/60) + '分钟前'; | |
| 879 | - return Math.round(s/3600) + '小时前'; | |
| 880 | -} | |
| 881 | - | |
| 882 | -function fmtTime(ts) { | |
| 883 | - if (!ts) return '—'; | |
| 884 | - return new Date(ts * 1000).toLocaleString('zh-CN', { hour12: false }); | |
| 885 | -} | |
| 886 | - | |
| 887 | -// id -> { el, thumbSig }。renderSidebar() 每 5 秒被 refreshJobs() 轮询触发一次,加了缩略图 | |
| 888 | -// 之后如果还是老办法"box.innerHTML=''整表重建",<img loading=lazy>/<video preload=metadata> | |
| 889 | -// 就会在真正加载出内容之前被连根拔掉重来一遍——缩略图永远来不及显示,长期空白。 | |
| 890 | -// 这两个变量按 job id 缓存已经建好的行节点,跨轮询复用,缩略图只在来源真的变了(比如 | |
| 891 | -// 排队中变成已完成,thumbSig 从 img:xxx 变成 video)才重建;只是状态/时间文字变化则原地更新。 | |
| 892 | -let jobRowNodes = new Map(); | |
| 893 | -let lastSidebarMode = null; | |
| 894 | - | |
| 895 | -function jobThumbSig(j) { | |
| 896 | - if (j.status === 'done') return 'video'; | |
| 897 | - const req = j.req || {}; | |
| 898 | - return 'img:' + (req.first_frame_url || (req.reference_image_urls || [])[0] || ''); | |
| 899 | -} | |
| 900 | - | |
| 901 | -function renderSidebar() { | |
| 902 | - const box = document.getElementById('job-list'); | |
| 903 | - const mode = viewingTrash ? 'trash' : 'normal'; | |
| 904 | - if (mode !== lastSidebarMode) { box.innerHTML = ''; jobRowNodes.clear(); lastSidebarMode = mode; } | |
| 905 | - document.getElementById('sidebar-filters').style.display = viewingTrash ? 'none' : 'flex'; | |
| 906 | - // "+新建任务" 固定在筛选框上面、列表外面,不随 #job-list 滚动——之前是塞进 job-list 第一 | |
| 907 | - // 行的,列表一滚就跟着跑没了,2026-08-28 用户反馈要求固定住。 | |
| 908 | - const newTaskRow = document.getElementById('new-task-row'); | |
| 909 | - newTaskRow.style.display = viewingTrash ? 'none' : 'flex'; | |
| 910 | - newTaskRow.classList.toggle('selected', !viewingTrash && selectedId === null); | |
| 911 | - | |
| 912 | - if (viewingTrash) { | |
| 913 | - box.innerHTML = ''; | |
| 914 | - const backRow = document.createElement('div'); | |
| 915 | - backRow.className = 'job-row new-row'; | |
| 916 | - backRow.onclick = () => backToList(); | |
| 917 | - backRow.innerHTML = `<span>←</span><span>返回任务列表</span>`; | |
| 918 | - box.appendChild(backRow); | |
| 919 | - | |
| 920 | - if (!trashCache.length) { | |
| 921 | - const empty = document.createElement('div'); | |
| 922 | - empty.style.cssText = 'padding:16px;font-size:13px;opacity:.6'; | |
| 923 | - empty.textContent = '回收站是空的'; | |
| 924 | - box.appendChild(empty); | |
| 925 | - } | |
| 926 | - trashCache.forEach(j => { | |
| 927 | - const row = document.createElement('div'); | |
| 928 | - row.className = 'job-row'; | |
| 929 | - const prompt = j.req ? (j.req.prompt || '(无 prompt)') : ''; | |
| 930 | - row.innerHTML = ` | |
| 931 | - <div class="jr-top"><span>${j.id}</span> | |
| 932 | - <button class="jr-restore" onclick="event.stopPropagation(); restoreJob('${j.id}')">恢复</button></div> | |
| 933 | - <div class="jr-prompt" title="${prompt}">${prompt}</div> | |
| 934 | - <div class="jr-time">删除于 ${timeAgo(j.deleted_at)}</div>`; | |
| 935 | - box.appendChild(row); | |
| 936 | - }); | |
| 937 | - return; | |
| 938 | - } | |
| 939 | - | |
| 940 | - const seen = new Set(); | |
| 941 | - jobsCache.forEach(j => { | |
| 942 | - seen.add(j.id); | |
| 943 | - let cached = jobRowNodes.get(j.id); | |
| 944 | - if (!cached) { | |
| 945 | - cached = { el: document.createElement('div'), thumbSig: null }; | |
| 946 | - jobRowNodes.set(j.id, cached); | |
| 947 | - } | |
| 948 | - const row = cached.el; | |
| 949 | - row.className = 'job-row' + (j.id === selectedId ? ' selected' : ''); | |
| 950 | - row.onclick = () => selectJob(j.id); | |
| 951 | - | |
| 952 | - const thumbSig = jobThumbSig(j); | |
| 953 | - if (cached.thumbSig !== thumbSig) { | |
| 954 | - row.innerHTML = `<div class="jr-body"><div class="jr-thumb">${jobThumbHtml(j)}</div><div class="jr-info"></div></div>`; | |
| 955 | - cached.thumbSig = thumbSig; | |
| 956 | - } | |
| 957 | - | |
| 958 | - const prompt = j.req ? (j.req.prompt || '(无 prompt)') : ''; | |
| 959 | - const menuOpen = openMenuFor === j.id; | |
| 960 | - row.querySelector('.jr-info').innerHTML = ` | |
| 961 | - <div class="jr-top"><span>${j.id}</span> | |
| 962 | - <div class="jr-actions"> | |
| 963 | - ${statusLabel(j.status)} | |
| 964 | - <span class="jr-menu-btn" onclick="event.stopPropagation(); toggleJobMenu('${j.id}')">⋯</span> | |
| 965 | - </div> | |
| 966 | - </div> | |
| 967 | - <div class="jr-prompt" title="${prompt}">${prompt}</div> | |
| 968 | - <div class="jr-time">${timeAgo(j.created_at)}</div>`; | |
| 969 | - | |
| 970 | - const oldMenu = row.querySelector(':scope > .jr-menu'); | |
| 971 | - if (oldMenu) oldMenu.remove(); | |
| 972 | - if (menuOpen) { | |
| 973 | - row.insertAdjacentHTML('beforeend', `<div class="jr-menu" onclick="event.stopPropagation()"> | |
| 974 | - ${j.status === 'queued' ? `<div class="jr-menu-item" onclick="prioritizeJob('${j.id}')">优先插队</div>` : ''} | |
| 975 | - <div class="jr-menu-item" onclick="deleteJob('${j.id}')">删除</div> | |
| 976 | - </div>`); | |
| 977 | - } | |
| 978 | - box.appendChild(row); // 已经在 DOM 里的话是"挪位置",不会销毁子节点(缩略图不受影响) | |
| 979 | - }); | |
| 980 | - | |
| 981 | - // 丢掉不在当前列表里的行缓存(被删除/被筛选掉了),顺带把对应 DOM 节点也摘掉 | |
| 982 | - for (const [id, cached] of jobRowNodes) { | |
| 983 | - if (!seen.has(id)) { cached.el.remove(); jobRowNodes.delete(id); } | |
| 984 | - } | |
| 985 | - | |
| 986 | - let footer = document.getElementById('job-list-footer'); | |
| 987 | - if (!footer) { | |
| 988 | - footer = document.createElement('div'); | |
| 989 | - footer.id = 'job-list-footer'; | |
| 990 | - } | |
| 991 | - box.appendChild(footer); // 挪到最后一行任务后面(新建的话就是插入) | |
| 992 | - | |
| 993 | - if (totalJobs === 0) { | |
| 994 | - footer.innerHTML = `<div style="padding:6px 0">${(filterQ || filterStatus || filterKind) ? '没有匹配的任务' : '还没有任务'}</div>`; | |
| 995 | - return; | |
| 996 | - } | |
| 997 | - const totalPages = Math.max(1, Math.ceil(totalJobs / PAGE_SIZE)); | |
| 998 | - const numBtns = pageNumbers(currentPage, totalPages).map(p => | |
| 999 | - p === '…' ? `<span style="padding:0 2px;opacity:.5">…</span>` | |
| 1000 | - : `<button class="page-btn" style="${p === currentPage ? 'background:#4a7;color:#fff;border-color:#4a7' : ''}" onclick="gotoPage(${p})">${p}</button>` | |
| 1001 | - ).join(''); | |
| 1002 | - footer.innerHTML = ` | |
| 1003 | - <div style="display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap"> | |
| 1004 | - <button class="page-btn" ${currentPage <= 1 ? 'disabled' : ''} onclick="gotoPage(${currentPage - 1})">‹</button> | |
| 1005 | - ${numBtns} | |
| 1006 | - <button class="page-btn" ${currentPage >= totalPages ? 'disabled' : ''} onclick="gotoPage(${currentPage + 1})">›</button> | |
| 1007 | - <span style="opacity:.7">共 ${totalJobs} 条</span> | |
| 1008 | - ${totalPages > 1 ? ` | |
| 1009 | - <span style="display:flex;align-items:center;gap:4px"> | |
| 1010 | - <input id="page-jump-input" type="number" min="1" max="${totalPages}" placeholder="页码" style="width:52px;padding:2px 4px;font-size:12px" | |
| 1011 | - onkeydown="if(event.key==='Enter') jumpToPage(${totalPages})"> | |
| 1012 | - <button class="page-btn" onclick="jumpToPage(${totalPages})">跳转</button> | |
| 1013 | - </span>` : ''} | |
| 1014 | - </div>`; | |
| 1015 | -} | |
| 1016 | - | |
| 1017 | -// 页码窗口:首末页永远显示,当前页前后各2页,其余折叠成省略号——页数一多不至于铺满一整行 | |
| 1018 | -function pageNumbers(current, total) { | |
| 1019 | - const set = new Set([1, total, current, current - 1, current + 1, current - 2, current + 2]); | |
| 1020 | - const nums = [...set].filter(p => p >= 1 && p <= total).sort((a, b) => a - b); | |
| 1021 | - const out = []; | |
| 1022 | - for (let i = 0; i < nums.length; i++) { | |
| 1023 | - if (i > 0 && nums[i] - nums[i - 1] > 1) out.push('…'); | |
| 1024 | - out.push(nums[i]); | |
| 1025 | - } | |
| 1026 | - return out; | |
| 1027 | -} | |
| 1028 | - | |
| 1029 | -function jumpToPage(totalPages) { | |
| 1030 | - const input = document.getElementById('page-jump-input'); | |
| 1031 | - const p = parseInt(input.value, 10); | |
| 1032 | - if (!p || p < 1 || p > totalPages) return; | |
| 1033 | - gotoPage(p); | |
| 1034 | -} | |
| 1035 | - | |
| 1036 | -// 任意点击落在某条任务的「⋯」菜单外面,就把菜单收起来——不然点开一个菜单后点别处它会一直挂着 | |
| 1037 | -document.addEventListener('click', () => { if (openMenuFor !== null) { openMenuFor = null; renderSidebar(); } }); | |
| 1038 | - | |
| 1039 | -function toggleJobMenu(id) { | |
| 1040 | - openMenuFor = (openMenuFor === id) ? null : id; | |
| 1041 | - renderSidebar(); | |
| 1042 | -} | |
| 1043 | - | |
| 1044 | -async function prioritizeJob(id) { | |
| 1045 | - openMenuFor = null; | |
| 1046 | - try { | |
| 1047 | - const r = await fetch(`${H3_BASE}/v1/videos/${id}/prioritize`, { method: 'POST' }); | |
| 1048 | - if (!r.ok) throw new Error(await r.text()); | |
| 1049 | - const job = await r.json(); | |
| 1050 | - alert(`已插队到第 ${job.queue_position} 位`); | |
| 1051 | - await refreshJobs(); | |
| 1052 | - if (selectedId === id) await refreshDetail(); | |
| 1053 | - } catch (e) { alert('插队失败: ' + e.message); } | |
| 1054 | -} | |
| 1055 | - | |
| 1056 | -async function deleteJob(id) { | |
| 1057 | - openMenuFor = null; | |
| 1058 | - try { | |
| 1059 | - const r = await fetch(`${H3_BASE}/v1/videos/${id}`, { method: 'DELETE' }); | |
| 1060 | - if (!r.ok) throw new Error(await r.text()); | |
| 1061 | - jobsCache = jobsCache.filter(j => j.id !== id); | |
| 1062 | - if (selectedId === id) showCreate(); | |
| 1063 | - renderSidebar(); | |
| 1064 | - } catch (e) { alert('删除失败: ' + e.message); } | |
| 1065 | -} | |
| 1066 | - | |
| 1067 | -async function restoreJob(id) { | |
| 1068 | - try { | |
| 1069 | - const r = await fetch(`${H3_BASE}/v1/videos/${id}/restore`, { method: 'POST' }); | |
| 1070 | - if (!r.ok) throw new Error(await r.text()); | |
| 1071 | - trashCache = trashCache.filter(j => j.id !== id); | |
| 1072 | - renderSidebar(); | |
| 1073 | - } catch (e) { alert('恢复失败: ' + e.message); } | |
| 1074 | -} | |
| 1075 | - | |
| 1076 | -async function loadTrash() { | |
| 1077 | - try { | |
| 1078 | - const r = await fetch(H3_BASE + '/v1/videos?trash=true&limit=50'); | |
| 1079 | - trashCache = (await r.json()).jobs || []; | |
| 1080 | - } catch (e) { /* 下一轮轮询再试 */ } | |
| 1081 | -} | |
| 1082 | - | |
| 1083 | -async function toggleTrash() { | |
| 1084 | - viewingTrash = true; | |
| 1085 | - await loadTrash(); | |
| 1086 | - renderSidebar(); | |
| 1087 | -} | |
| 1088 | - | |
| 1089 | -function backToList() { | |
| 1090 | - viewingTrash = false; | |
| 1091 | - refreshJobs(); // 立即拉一次主列表,不用等下一轮 5 秒轮询 | |
| 1092 | - renderSidebar(); | |
| 1093 | -} | |
| 1094 | - | |
| 1095 | -async function selectJob(id, pushUrl = true) { | |
| 1096 | - selectedId = id; | |
| 1097 | - if (pushUrl) history.pushState(null, '', H3_BASE + '/task.html/' + encodeURIComponent(id)); | |
| 1098 | - document.getElementById('create-view').style.display = 'none'; | |
| 1099 | - document.getElementById('detail').style.display = 'block'; | |
| 1100 | - renderSidebar(); | |
| 1101 | - await refreshDetail(); | |
| 1102 | -} | |
| 1103 | - | |
| 1104 | -// 浏览器前进/后退要同步这个状态,不然 URL 变了但页面没跟着变 | |
| 1105 | -window.addEventListener('popstate', () => { | |
| 1106 | - const tid = tidFromPath(); | |
| 1107 | - if (tid) selectJob(tid, false); else showCreate(false); | |
| 1108 | -}); | |
| 1109 | - | |
| 1110 | -async function refreshDetail() { | |
| 1111 | - if (!selectedId) return; | |
| 1112 | - const box = document.getElementById('detail'); | |
| 1113 | - try { | |
| 1114 | - const r = await fetch(`${H3_BASE}/v1/videos/${selectedId}`); | |
| 1115 | - if (!r.ok) { box.innerHTML = `<div class="back" onclick="showCreate()">← 新建任务</div><div class="err">找不到这个任务</div>`; return; } | |
| 1116 | - const j = await r.json(); | |
| 1117 | - const req = j.req || {}; | |
| 1118 | - | |
| 1119 | - let resultHtml = ''; | |
| 1120 | - if (j.status === 'done') { | |
| 1121 | - resultHtml = `<video controls src="${h3FileUrl(H3_BASE + '/v1/videos/' + j.id + '/file')}"></video> | |
| 1122 | - <a class="download" href="${h3FileUrl(H3_BASE + '/v1/videos/' + j.id + '/file')}" download>下载 mp4${j.size_bytes ? ' ('+(j.size_bytes/1024/1024).toFixed(1)+'MB)' : ''}</a>`; | |
| 1123 | - } else if (j.status === 'failed') { | |
| 1124 | - resultHtml = `<div class="err">${(j.error || '未知错误').replace(/</g,'<')}</div>`; | |
| 1125 | - } else if (j.status === 'running') { | |
| 1126 | - resultHtml = `<div>已运行 ${j.elapsed_seconds || 0} 秒(共 ${j.total_steps || req.steps || '?'} 步,当前第 ${j.step || 0} 步)</div>`; | |
| 1127 | - } else if (j.status === 'cancelled') { | |
| 1128 | - resultHtml = `<div class="err">${(j.error || '已取消').replace(/</g,'<')}</div>`; | |
| 1129 | - } else { | |
| 1130 | - resultHtml = `<div>排队中,等待可用的 ${j.partition || ''} 后端…</div>`; | |
| 1131 | - } | |
| 1132 | - | |
| 1133 | - let refThumbs = ''; | |
| 1134 | - const imgs = []; | |
| 1135 | - if (req.first_frame_url) imgs.push(['首帧', req.first_frame_url]); | |
| 1136 | - if (req.last_frame_url) imgs.push(['尾帧', req.last_frame_url]); | |
| 1137 | - (req.reference_image_urls || []).forEach((u, i) => imgs.push(['参考图'+(i+1), u])); | |
| 1138 | - // 图片点开看大图,参考视频/音频跟生成结果的视频一样用原生播放器直接预览;每个媒体上面 | |
| 1139 | - // 带一行文件名(从上传时 server.py 塞进 URL 里的原名反解出来,见 filenameFromUrl—— | |
| 1140 | - // 引用外部图床的旧任务URL里没有这个原名分段,会退化成显示URL里的原始文件名/hash, | |
| 1141 | - // 不算错误,只是没有更好的名字可用)。2026-08-25:caption 挪到图片上方(之前在下面, | |
| 1142 | - // 用户反馈不够显眼)。 | |
| 1143 | - const thumbCap = (label, u) => `${label} · ${filenameFromUrl(u)}`.replace(/</g, '<'); | |
| 1144 | - const viewThumb = (mediaHtml, label, u) => | |
| 1145 | - `<span class="thumb-wrap"><span class="thumb-name" title="${thumbCap(label,u)}">${thumbCap(label,u)}</span><span class="thumb-media">${mediaHtml}</span></span>`; | |
| 1146 | - const imgTags = imgs.map(([label, u]) => | |
| 1147 | - viewThumb(`<a href="${u}" target="_blank" title="${label},点击查看大图"><img src="${thumbUrl(u)}" title="${label}"></a>`, label, u)).join(''); | |
| 1148 | - const videoTags = (req.reference_video_urls || []).map((u, i) => | |
| 1149 | - viewThumb(`<video controls src="${u}" title="参考视频${i+1}"></video>`, '参考视频'+(i+1), u)).join(''); | |
| 1150 | - const audioTags = (req.reference_audio_urls || []).map((u, i) => | |
| 1151 | - viewThumb(`<audio controls src="${u}" title="参考音频${i+1}"></audio>`, '参考音频'+(i+1), u)).join(''); | |
| 1152 | - if (imgTags || videoTags) refThumbs += `<div class="thumbrow">${imgTags}${videoTags}</div>`; | |
| 1153 | - if (audioTags) refThumbs += `<div class="thumbrow">${audioTags}</div>`; | |
| 1154 | - | |
| 1155 | - // 2026-09-03:原始请求参数(req 原样 JSON)跟 ComfyUI history(实际发给模型的完整 | |
| 1156 | - // workflow graph + 执行结果)都放页面最底部——排查问题时才需要看,默认折叠不占地方。 | |
| 1157 | - // history 不跟着 resultHtml 一起渲染,是懒加载(点了才去问 ComfyUI),因为 queued/running | |
| 1158 | - // 状态的任务每几秒轮询一次详情,没必要每次都多打一次 ComfyUI 的 /history。 | |
| 1159 | - const rawReqHtml = `<details class="raw-block"> | |
| 1160 | - <summary>用户提交的原始参数(JSON)</summary> | |
| 1161 | - <pre>${JSON.stringify(req, null, 2).replace(/</g, '<')}</pre> | |
| 1162 | - </details>`; | |
| 1163 | - const comfyHistoryHtml = j.comfy_prompt_id | |
| 1164 | - ? `<details class="raw-block" ontoggle="if(this.open) loadComfyHistory('${j.id}')"> | |
| 1165 | - <summary>ComfyUI History(实际发给模型的 workflow + 执行结果)</summary> | |
| 1166 | - <pre id="comfy-history-${j.id}">点开后加载中…</pre> | |
| 1167 | - </details>` | |
| 1168 | - : ''; | |
| 1169 | - | |
| 1170 | - box.innerHTML = ` | |
| 1171 | - <div class="back" onclick="showCreate()">← 新建任务</div> | |
| 1172 | - <h2>${j.id}</h2> | |
| 1173 | - <div>${statusLabel(j.status)}${j.status === 'queued' && j.queue_position ? ` <span style="opacity:.7;font-size:13px">排第 ${j.queue_position} 位</span>` : ''} <button class="submit" style="padding:4px 12px;margin-left:8px" onclick="rerunJob('${j.id}')">重跑</button>${j.status === 'queued' ? ` <button style="padding:4px 12px;margin-left:8px" onclick="prioritizeJob('${j.id}')">优先插队</button> <button style="padding:4px 12px;margin-left:8px" onclick="cancelJob('${j.id}',false)">取消</button>` : ''}${j.status === 'running' ? ` <button style="padding:4px 12px;margin-left:8px;color:#c33" onclick="cancelJob('${j.id}',true)">停止</button>` : ''}</div> | |
| 1174 | - ${resultHtml} | |
| 1175 | - <dl class="dl"> | |
| 1176 | - <dt>Prompt</dt><dd>${(req.prompt || '').replace(/</g,'<')}</dd> | |
| 1177 | - <dt>分区</dt><dd>${j.partition || '—'}</dd> | |
| 1178 | - <dt>分辨率/帧数</dt><dd>${req.width || '?'}×${req.height || '?'} × ${req.frames || '?'}帧</dd> | |
| 1179 | - <dt>时长</dt><dd>${req.frames ? (req.frames / 24).toFixed(1) + ' 秒(按 24fps 折算)' : '?'}</dd> | |
| 1180 | - <dt>Turbo/步数</dt><dd>${req.turbo === false ? '关' : '开'} / ${req.steps ?? '?'} 步,seed=${req.seed ?? 0}</dd> | |
| 1181 | - ${req.cfg_scale != null ? `<dt>CFG Scale</dt><dd>${req.cfg_scale}</dd>` : ''} | |
| 1182 | - ${req.negative_prompt ? `<dt>负面提示词</dt><dd>${req.negative_prompt.replace(/</g,'<')}</dd>` : ''} | |
| 1183 | - <dt>后端</dt><dd>${j.backend || '(尚未分配)'}</dd> | |
| 1184 | - <dt>提交时间</dt><dd>${fmtTime(j.created_at)}</dd> | |
| 1185 | - <dt>开始时间</dt><dd>${fmtTime(j.started_at)}</dd> | |
| 1186 | - <dt>完成时间</dt><dd>${fmtTime(j.finished_at)}</dd> | |
| 1187 | - ${(j.started_at && j.finished_at) ? `<dt>生成耗时</dt><dd>${(j.finished_at - j.started_at).toFixed(1)} 秒</dd>` : ''} | |
| 1188 | - <dt>峰值显存</dt><dd>${j.peak_vram_gb ? j.peak_vram_gb + ' GB' : '—'}</dd> | |
| 1189 | - </dl> | |
| 1190 | - ${refThumbs} | |
| 1191 | - ${rawReqHtml} | |
| 1192 | - ${comfyHistoryHtml} | |
| 1193 | - `; | |
| 1194 | - } catch (e) { /* 暂时连不上,保留当前显示,下一轮再试 */ } | |
| 1195 | -} | |
| 1196 | - | |
| 1197 | -async function loadComfyHistory(id) { | |
| 1198 | - const pre = document.getElementById(`comfy-history-${id}`); | |
| 1199 | - if (!pre) return; | |
| 1200 | - try { | |
| 1201 | - const r = await fetch(`${H3_BASE}/v1/videos/${id}/comfy_history`); | |
| 1202 | - if (!r.ok) { pre.textContent = '加载失败: ' + (await r.text()); return; } | |
| 1203 | - pre.textContent = JSON.stringify(await r.json(), null, 2); | |
| 1204 | - } catch (e) { pre.textContent = '加载失败: ' + e.message; } | |
| 1205 | -} | |
| 1206 | - | |
| 1207 | -async function refreshJobs() { | |
| 1208 | - if (viewingTrash) { await loadTrash(); renderSidebar(); return; } | |
| 1209 | - try { | |
| 1210 | - const params = new URLSearchParams({ limit: String(PAGE_SIZE), offset: String((currentPage - 1) * PAGE_SIZE), sort: sortOrder }); | |
| 1211 | - if (filterQ) params.set('q', filterQ); | |
| 1212 | - if (filterStatus) params.set('status', filterStatus); | |
| 1213 | - if (filterKind) params.set('kind', filterKind); | |
| 1214 | - const r = await fetch(`${H3_BASE}/v1/videos?${params}`); const d = await r.json(); | |
| 1215 | - jobsCache = d.jobs || []; | |
| 1216 | - totalJobs = d.total ?? jobsCache.length; | |
| 1217 | - // 轮询轮到的这一页如果因为任务被删/移出回收站而变空了(比如正好停在最后一页), | |
| 1218 | - // 退回上一页重新拉一次,不要晾着一页空列表。 | |
| 1219 | - if (jobsCache.length === 0 && currentPage > 1 && totalJobs > 0) { | |
| 1220 | - currentPage = Math.max(1, Math.ceil(totalJobs / PAGE_SIZE)); | |
| 1221 | - return refreshJobs(); | |
| 1222 | - } | |
| 1223 | - renderSidebar(); | |
| 1224 | - // 只有还在变化的任务(排队/运行中)才需要重新拉详情。`refreshDetail()` 是整段 | |
| 1225 | - // innerHTML 重建,`done` 之后再重建会把正在播放的 <video> 元素连根拔掉—— | |
| 1226 | - // 播放到一半被这个 5 秒轮询打断、进度条弹回 0,这就是"下载和播放好像有问题"的真正原因, | |
| 1227 | - // 不是文件本身坏了(文件本身一直是好的,见 README「已实测排查过的坑」)。 | |
| 1228 | - const cached = jobsCache.find(j => j.id === selectedId); | |
| 1229 | - if (selectedId && (!cached || cached.status === 'queued' || cached.status === 'running')) { | |
| 1230 | - refreshDetail(); | |
| 1231 | - } | |
| 1232 | - } catch (e) { /* 后端暂时连不上,静默跳过这一轮,下次轮询再试 */ } | |
| 1233 | -} | |
| 1234 | - | |
| 1235 | -async function refreshBackends() { | |
| 1236 | - try { | |
| 1237 | - const r = await fetch(H3_BASE + '/v1/backends'); const d = await r.json(); | |
| 1238 | - let text = | |
| 1239 | - `后端: ${d.ready}/${d.total} ready · 排队 ${d.queued} · 运行中 ${d.running}\n` + | |
| 1240 | - d.backends.map(b => { | |
| 1241 | - // b.status 只是模型健康态(ok/down),不代表这张卡是否正在跑任务—— | |
| 1242 | - // running/queued 是 api.py /health 里单独的计数字段,之前没往界面上带, | |
| 1243 | - // 导致明明有任务在跑却只显示 "ok",看着像空闲。 | |
| 1244 | - const busy = b.running > 0 ? ` running×${b.running}` : (b.queued > 0 ? ` queued×${b.queued}` : ''); | |
| 1245 | - return `${b.backend.replace('http://127.0.0.1:','')} gpu${b.gpu} [${b.partition||'?'}] ${b.status}${busy}`; | |
| 1246 | - }).join('\n'); | |
| 1247 | - // 2026-08-24:实时显存/利用率——之前撞过好几次OOM,事后查才发现是别的工作负载(比如旧 | |
| 1248 | - // minimax-h3 四卡worker)在偷偷占显存,提交前完全看不出来。>18GB(跟22.5GB总量比,剩不到 | |
| 1249 | - // 4GB)标红提醒可能会OOM。 | |
| 1250 | - if ((d.gpus || []).length) { | |
| 1251 | - text += '\n' + d.gpus.map(g => { | |
| 1252 | - const pct = Math.round(g.memory_used_mb / g.memory_total_mb * 100); | |
| 1253 | - const warn = g.memory_used_mb > 18000 ? ' ⚠' : ''; | |
| 1254 | - return `GPU${g.index}: ${(g.memory_used_mb/1024).toFixed(1)}/${(g.memory_total_mb/1024).toFixed(1)}GB (${pct}%) ${g.utilization_pct}%util${warn}`; | |
| 1255 | - }).join('\n'); | |
| 1256 | - } | |
| 1257 | - document.getElementById('backends').textContent = text; | |
| 1258 | - } catch (e) {} | |
| 1259 | -} | |
| 1260 | - | |
| 1261 | -// 刷新页面(或直接打开一条分享出去的 /task.html/<id> 链接)时,按当前 URL 决定初始视图 | |
| 1262 | -if (selectedId) { | |
| 1263 | - document.getElementById('create-view').style.display = 'none'; | |
| 1264 | - document.getElementById('detail').style.display = 'block'; | |
| 1265 | - refreshDetail(); | |
| 1266 | -} | |
| 1267 | - | |
| 1268 | -refreshJobs(); refreshBackends(); | |
| 1269 | -setInterval(refreshJobs, 5000); | |
| 1270 | -setInterval(refreshBackends, 8000); | |
| 1271 | -</script> | |
| 1272 | -</body> | |
| 3 | + <head> | |
| 4 | + <meta charset="UTF-8" /> | |
| 5 | + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| 6 | + <title>H3 Console - AI Video Studio</title> | |
| 7 | + <script> | |
| 8 | + window.__H3_BASE__ = "__H3_BASE_PATH__"; | |
| 9 | + </script> | |
| 10 | + <script type="module" crossorigin>(function(){const p=document.createElement("link").relList;if(p&&p.supports&&p.supports("modulepreload"))return;for(const T of document.querySelectorAll('link[rel="modulepreload"]'))r(T);new MutationObserver(T=>{for(const M of T)if(M.type==="childList")for(const $ of M.addedNodes)$.tagName==="LINK"&&$.rel==="modulepreload"&&r($)}).observe(document,{childList:!0,subtree:!0});function O(T){const M={};return T.integrity&&(M.integrity=T.integrity),T.referrerPolicy&&(M.referrerPolicy=T.referrerPolicy),T.crossOrigin==="use-credentials"?M.credentials="include":T.crossOrigin==="anonymous"?M.credentials="omit":M.credentials="same-origin",M}function r(T){if(T.ep)return;T.ep=!0;const M=O(T);fetch(T.href,M)}})();function Om(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var Mf={exports:{}},su={};/** | |
| 11 | + * @license React | |
| 12 | + * react-jsx-runtime.production.js | |
| 13 | + * | |
| 14 | + * Copyright (c) Meta Platforms, Inc. and affiliates. | |
| 15 | + * | |
| 16 | + * This source code is licensed under the MIT license found in the | |
| 17 | + * LICENSE file in the root directory of this source tree. | |
| 18 | + */var vm;function yx(){if(vm)return su;vm=1;var o=Symbol.for("react.transitional.element"),p=Symbol.for("react.fragment");function O(r,T,M){var $=null;if(M!==void 0&&($=""+M),T.key!==void 0&&($=""+T.key),"key"in T){M={};for(var q in T)q!=="key"&&(M[q]=T[q])}else M=T;return T=M.ref,{$$typeof:o,type:r,key:$,ref:T!==void 0?T:null,props:M}}return su.Fragment=p,su.jsx=O,su.jsxs=O,su}var xm;function gx(){return xm||(xm=1,Mf.exports=yx()),Mf.exports}var c=gx(),Df={exports:{}},te={};/** | |
| 19 | + * @license React | |
| 20 | + * react.production.js | |
| 21 | + * | |
| 22 | + * Copyright (c) Meta Platforms, Inc. and affiliates. | |
| 23 | + * | |
| 24 | + * This source code is licensed under the MIT license found in the | |
| 25 | + * LICENSE file in the root directory of this source tree. | |
| 26 | + */var ym;function bx(){if(ym)return te;ym=1;var o=Symbol.for("react.transitional.element"),p=Symbol.for("react.portal"),O=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),T=Symbol.for("react.profiler"),M=Symbol.for("react.consumer"),$=Symbol.for("react.context"),q=Symbol.for("react.forward_ref"),k=Symbol.for("react.suspense"),I=Symbol.for("react.memo"),D=Symbol.for("react.lazy"),S=Symbol.for("react.activity"),j=Symbol.for("react.view_transition"),X=Symbol.iterator;function le(m){return m===null||typeof m!="object"?null:(m=X&&m[X]||m["@@iterator"],typeof m=="function"?m:null)}var ie={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},F=Object.assign,De={};function ve(m,E,V){this.props=m,this.context=E,this.refs=De,this.updater=V||ie}ve.prototype.isReactComponent={},ve.prototype.setState=function(m,E){if(typeof m!="object"&&typeof m!="function"&&m!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,m,E,"setState")},ve.prototype.forceUpdate=function(m){this.updater.enqueueForceUpdate(this,m,"forceUpdate")};function Re(){}Re.prototype=ve.prototype;function Z(m,E,V){this.props=m,this.context=E,this.refs=De,this.updater=V||ie}var R=Z.prototype=new Re;R.constructor=Z,F(R,ve.prototype),R.isPureReactComponent=!0;var se=Array.isArray;function Q(){}var P={H:null,A:null,T:null,S:null},Ve=Object.prototype.hasOwnProperty;function qe(m,E,V){var N=V.ref;return{$$typeof:o,type:m,key:E,ref:N!==void 0?N:null,props:V}}function Ae(m,E){return qe(m.type,E,m.props)}function Ne(m){return typeof m=="object"&&m!==null&&m.$$typeof===o}function Le(m){var E={"=":"=0",":":"=2"};return"$"+m.replace(/[=:]/g,function(V){return E[V]})}var Ye=/\/+/g;function je(m,E){return typeof m=="object"&&m!==null&&m.key!=null?Le(""+m.key):E.toString(36)}function A(m){switch(m.status){case"fulfilled":return m.value;case"rejected":throw m.reason;default:switch(typeof m.status=="string"?m.then(Q,Q):(m.status="pending",m.then(function(E){m.status==="pending"&&(m.status="fulfilled",m.value=E)},function(E){m.status==="pending"&&(m.status="rejected",m.reason=E)})),m.status){case"fulfilled":return m.value;case"rejected":throw m.reason}}throw m}function K(m,E,V,N,fe){var ae=typeof m;(ae==="undefined"||ae==="boolean")&&(m=null);var ce=!1;if(m===null)ce=!0;else switch(ae){case"bigint":case"string":case"number":ce=!0;break;case"object":switch(m.$$typeof){case o:case p:ce=!0;break;case D:return ce=m._init,K(ce(m._payload),E,V,N,fe)}}if(ce)return fe=fe(m),ce=N===""?"."+je(m,0):N,se(fe)?(V="",ce!=null&&(V=ce.replace(Ye,"$&/")+"/"),K(fe,E,V,"",function(cl){return cl})):fe!=null&&(Ne(fe)&&(fe=Ae(fe,V+(fe.key==null||m&&m.key===fe.key?"":(""+fe.key).replace(Ye,"$&/")+"/")+ce)),E.push(fe)),1;ce=0;var B=N===""?".":N+":";if(se(m))for(var ee=0;ee<m.length;ee++)N=m[ee],ae=B+je(N,ee),ce+=K(N,E,V,ae,fe);else if(ee=le(m),typeof ee=="function")for(m=ee.call(m),ee=0;!(N=m.next()).done;)N=N.value,ae=B+je(N,ee++),ce+=K(N,E,V,ae,fe);else if(ae==="object"){if(typeof m.then=="function")return K(A(m),E,V,N,fe);throw E=String(m),Error("Objects are not valid as a React child (found: "+(E==="[object Object]"?"object with keys {"+Object.keys(m).join(", ")+"}":E)+"). If you meant to render a collection of children, use an array instead.")}return ce}function J(m,E,V){if(m==null)return m;var N=[],fe=0;return K(m,N,"","",function(ae){return E.call(V,ae,fe++)}),N}function de(m){if(m._status===-1){var E=m._result,V=E();V.then(function(N){(m._status===0||m._status===-1)&&(m._status=1,m._result=N,V.status===void 0&&(V.status="fulfilled",V.value=N))},function(N){(m._status===0||m._status===-1)&&(m._status=2,m._result=N,V.status===void 0&&(V.status="rejected",V.reason=N))}),m._status===-1&&(m._status=0,m._result=V)}if(m._status===1)return m._result.default;throw m._result}var w=typeof reportError=="function"?reportError:function(m){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var E=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof m=="object"&&m!==null&&typeof m.message=="string"?String(m.message):String(m),error:m});if(!window.dispatchEvent(E))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",m);return}console.error(m)};function G(m){var E=P.T,V={};V.types=E!==null?E.types:null,P.T=V;try{var N=m(),fe=P.S;fe!==null&&fe(V,N),typeof N=="object"&&N!==null&&typeof N.then=="function"&&N.then(Q,w)}catch(ae){w(ae)}finally{E!==null&&V.types!==null&&(E.types=V.types),P.T=E}}function Ee(m){var E=P.T;if(E!==null){var V=E.types;V===null?E.types=[m]:V.indexOf(m)===-1&&V.push(m)}else G(Ee.bind(null,m))}var il={map:J,forEach:function(m,E,V){J(m,function(){E.apply(this,arguments)},V)},count:function(m){var E=0;return J(m,function(){E++}),E},toArray:function(m){return J(m,function(E){return E})||[]},only:function(m){if(!Ne(m))throw Error("React.Children.only expected to receive a single React element child.");return m}};return te.Activity=S,te.Children=il,te.Component=ve,te.Fragment=O,te.Profiler=T,te.PureComponent=Z,te.StrictMode=r,te.Suspense=k,te.ViewTransition=j,te.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=P,te.__COMPILER_RUNTIME={__proto__:null,c:function(m){return P.H.useMemoCache(m)}},te.addTransitionType=Ee,te.cache=function(m){return function(){return m.apply(null,arguments)}},te.cacheSignal=function(){return null},te.cloneElement=function(m,E,V){if(m==null)throw Error("The argument must be a React element, but you passed "+m+".");var N=F({},m.props),fe=m.key;if(E!=null)for(ae in E.key!==void 0&&(fe=""+E.key),E)!Ve.call(E,ae)||ae==="key"||ae==="__self"||ae==="__source"||ae==="ref"&&E.ref===void 0||(N[ae]=E[ae]);var ae=arguments.length-2;if(ae===1)N.children=V;else if(1<ae){for(var ce=Array(ae),B=0;B<ae;B++)ce[B]=arguments[B+2];N.children=ce}return qe(m.type,fe,N)},te.createContext=function(m){return m={$$typeof:$,_currentValue:m,_currentValue2:m,_threadCount:0,Provider:null,Consumer:null},m.Provider=m,m.Consumer={$$typeof:M,_context:m},m},te.createElement=function(m,E,V){var N,fe={},ae=null;if(E!=null)for(N in E.key!==void 0&&(ae=""+E.key),E)Ve.call(E,N)&&N!=="key"&&N!=="__self"&&N!=="__source"&&(fe[N]=E[N]);var ce=arguments.length-2;if(ce===1)fe.children=V;else if(1<ce){for(var B=Array(ce),ee=0;ee<ce;ee++)B[ee]=arguments[ee+2];fe.children=B}if(m&&m.defaultProps)for(N in ce=m.defaultProps,ce)fe[N]===void 0&&(fe[N]=ce[N]);return qe(m,ae,fe)},te.createRef=function(){return{current:null}},te.forwardRef=function(m){return{$$typeof:q,render:m}},te.isValidElement=Ne,te.lazy=function(m){return{$$typeof:D,_payload:{_status:-1,_result:m},_init:de}},te.memo=function(m,E){return{$$typeof:I,type:m,compare:E===void 0?null:E}},te.startTransition=G,te.unstable_useCacheRefresh=function(){return P.H.useCacheRefresh()},te.use=function(m){return P.H.use(m)},te.useActionState=function(m,E,V){return P.H.useActionState(m,E,V)},te.useCallback=function(m,E){return P.H.useCallback(m,E)},te.useContext=function(m){return P.H.useContext(m)},te.useDebugValue=function(){},te.useDeferredValue=function(m,E){return P.H.useDeferredValue(m,E)},te.useEffect=function(m,E){return P.H.useEffect(m,E)},te.useEffectEvent=function(m){return P.H.useEffectEvent(m)},te.useId=function(){return P.H.useId()},te.useImperativeHandle=function(m,E,V){return P.H.useImperativeHandle(m,E,V)},te.useInsertionEffect=function(m,E){return P.H.useInsertionEffect(m,E)},te.useLayoutEffect=function(m,E){return P.H.useLayoutEffect(m,E)},te.useMemo=function(m,E){return P.H.useMemo(m,E)},te.useOptimistic=function(m,E){return P.H.useOptimistic(m,E)},te.useReducer=function(m,E,V){return P.H.useReducer(m,E,V)},te.useRef=function(m){return P.H.useRef(m)},te.useState=function(m){return P.H.useState(m)},te.useSyncExternalStore=function(m,E,V){return P.H.useSyncExternalStore(m,E,V)},te.useTransition=function(){return P.H.useTransition()},te.version="19.3.1",te}var gm;function Xf(){return gm||(gm=1,Df.exports=bx()),Df.exports}var H=Xf();const px=Om(H);var Cf={exports:{}},fu={},wf={exports:{}},Uf={};/** | |
| 27 | + * @license React | |
| 28 | + * scheduler.production.js | |
| 29 | + * | |
| 30 | + * Copyright (c) Meta Platforms, Inc. and affiliates. | |
| 31 | + * | |
| 32 | + * This source code is licensed under the MIT license found in the | |
| 33 | + * LICENSE file in the root directory of this source tree. | |
| 34 | + */var bm;function Sx(){return bm||(bm=1,(function(o){function p(A,K){var J=A.length;A.push(K);e:for(;0<J;){var de=J-1>>>1,w=A[de];if(0<T(w,K))A[de]=K,A[J]=w,J=de;else break e}}function O(A){return A.length===0?null:A[0]}function r(A){if(A.length===0)return null;var K=A[0],J=A.pop();if(J!==K){A[0]=J;e:for(var de=0,w=A.length,G=w>>>1;de<G;){var Ee=2*(de+1)-1,il=A[Ee],m=Ee+1,E=A[m];if(0>T(il,J))m<w&&0>T(E,il)?(A[de]=E,A[m]=J,de=m):(A[de]=il,A[Ee]=J,de=Ee);else if(m<w&&0>T(E,J))A[de]=E,A[m]=J,de=m;else break e}}return K}function T(A,K){var J=A.sortIndex-K.sortIndex;return J!==0?J:A.id-K.id}if(o.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var M=performance;o.unstable_now=function(){return M.now()}}else{var $=Date,q=$.now();o.unstable_now=function(){return $.now()-q}}var k=[],I=[],D=1,S=null,j=3,X=!1,le=!1,ie=!1,F=!1,De=typeof setTimeout=="function"?setTimeout:null,ve=typeof clearTimeout=="function"?clearTimeout:null,Re=typeof setImmediate<"u"?setImmediate:null;function Z(A){for(var K=O(I);K!==null;){if(K.callback===null)r(I);else if(K.startTime<=A)r(I),K.sortIndex=K.expirationTime,p(k,K);else break;K=O(I)}}function R(A){if(ie=!1,Z(A),!le)if(O(k)!==null)le=!0,se||(se=!0,Ne());else{var K=O(I);K!==null&&je(R,K.startTime-A)}}var se=!1,Q=-1,P=5,Ve=-1;function qe(){return F?!0:!(o.unstable_now()-Ve<P)}function Ae(){if(F=!1,se){var A=o.unstable_now();Ve=A;var K=!0;try{e:{le=!1,ie&&(ie=!1,ve(Q),Q=-1),X=!0;var J=j;try{t:{for(Z(A),S=O(k);S!==null&&!(S.expirationTime>A&&qe());){var de=S.callback;if(typeof de=="function"){S.callback=null,j=S.priorityLevel;var w=de(S.expirationTime<=A);if(A=o.unstable_now(),typeof w=="function"){S.callback=w,Z(A),K=!0;break t}S===O(k)&&r(k),Z(A)}else r(k);S=O(k)}if(S!==null)K=!0;else{var G=O(I);G!==null&&je(R,G.startTime-A),K=!1}}break e}finally{S=null,j=J,X=!1}K=void 0}}finally{K?Ne():se=!1}}}var Ne;if(typeof Re=="function")Ne=function(){Re(Ae)};else if(typeof MessageChannel<"u"){var Le=new MessageChannel,Ye=Le.port2;Le.port1.onmessage=Ae,Ne=function(){Ye.postMessage(null)}}else Ne=function(){De(Ae,0)};function je(A,K){Q=De(function(){A(o.unstable_now())},K)}o.unstable_IdlePriority=5,o.unstable_ImmediatePriority=1,o.unstable_LowPriority=4,o.unstable_NormalPriority=3,o.unstable_Profiling=null,o.unstable_UserBlockingPriority=2,o.unstable_cancelCallback=function(A){A.callback=null},o.unstable_forceFrameRate=function(A){0>A||125<A?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):P=0<A?Math.floor(1e3/A):5},o.unstable_getCurrentPriorityLevel=function(){return j},o.unstable_next=function(A){switch(j){case 1:case 2:case 3:var K=3;break;default:K=j}var J=j;j=K;try{return A()}finally{j=J}},o.unstable_requestPaint=function(){F=!0},o.unstable_runWithPriority=function(A,K){switch(A){case 1:case 2:case 3:case 4:case 5:break;default:A=3}var J=j;j=A;try{return K()}finally{j=J}},o.unstable_scheduleCallback=function(A,K,J){var de=o.unstable_now();switch(typeof J=="object"&&J!==null?(J=J.delay,J=typeof J=="number"&&0<J?de+J:de):J=de,A){case 1:var w=-1;break;case 2:w=250;break;case 5:w=1073741823;break;case 4:w=1e4;break;default:w=5e3}return w=J+w,A={id:D++,callback:K,priorityLevel:A,startTime:J,expirationTime:w,sortIndex:-1},J>de?(A.sortIndex=J,p(I,A),O(k)===null&&A===O(I)&&(ie?(ve(Q),Q=-1):ie=!0,je(R,J-de))):(A.sortIndex=w,p(k,A),le||X||(le=!0,se||(se=!0,Ne()))),A},o.unstable_shouldYield=qe,o.unstable_wrapCallback=function(A){var K=j;return function(){var J=j;j=K;try{return A.apply(this,arguments)}finally{j=J}}}})(Uf)),Uf}var pm;function Nx(){return pm||(pm=1,wf.exports=Sx()),wf.exports}var Rf={exports:{}},ct={};/** | |
| 35 | + * @license React | |
| 36 | + * react-dom.production.js | |
| 37 | + * | |
| 38 | + * Copyright (c) Meta Platforms, Inc. and affiliates. | |
| 39 | + * | |
| 40 | + * This source code is licensed under the MIT license found in the | |
| 41 | + * LICENSE file in the root directory of this source tree. | |
| 42 | + */var Sm;function zx(){if(Sm)return ct;Sm=1;var o=Xf();function p(D){var S="https://react.dev/errors/"+D;if(1<arguments.length){S+="?args[]="+encodeURIComponent(arguments[1]);for(var j=2;j<arguments.length;j++)S+="&args[]="+encodeURIComponent(arguments[j])}return"Minified React error #"+D+"; visit "+S+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function O(){}var r={d:{f:O,r:function(){throw Error(p(522))},D:O,C:O,L:O,m:O,X:O,S:O,M:O},p:0,findDOMNode:null},T=Symbol.for("react.portal"),M=Symbol.for("react.recoverable"),$=Symbol.for("react.optimistic_key");function q(D,S,j){var X=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:T,key:X==null?null:X===$?$:""+X,children:D,containerInfo:S,implementation:j}}var k=o.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function I(D,S){if(D==="font")return"";if(typeof S=="string")return S==="use-credentials"?S:""}return ct.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=r,ct.browser=function(D){return{$$typeof:M,_reason:D}},ct.createPortal=function(D,S){var j=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!S||S.nodeType!==1&&S.nodeType!==9&&S.nodeType!==11)throw Error(p(299));return q(D,S,null,j)},ct.flushSync=function(D){var S=k.T,j=r.p;try{if(k.T=null,r.p=2,D)return D()}finally{k.T=S,r.p=j,r.d.f()}},ct.preconnect=function(D,S){typeof D=="string"&&(S?(S=S.crossOrigin,S=typeof S=="string"?S==="use-credentials"?S:"":void 0):S=null,r.d.C(D,S))},ct.prefetchDNS=function(D){typeof D=="string"&&r.d.D(D)},ct.preinit=function(D,S){if(typeof D=="string"&&S&&typeof S.as=="string"){var j=S.as,X=I(j,S.crossOrigin),le=typeof S.integrity=="string"?S.integrity:void 0,ie=typeof S.fetchPriority=="string"?S.fetchPriority:void 0;j==="style"?r.d.S(D,typeof S.precedence=="string"?S.precedence:void 0,{crossOrigin:X,integrity:le,fetchPriority:ie}):j==="script"&&r.d.X(D,{crossOrigin:X,integrity:le,fetchPriority:ie,nonce:typeof S.nonce=="string"?S.nonce:void 0})}},ct.preinitModule=function(D,S){if(typeof D=="string")if(typeof S=="object"&&S!==null){if(S.as==null||S.as==="script"){var j=I(S.as,S.crossOrigin);r.d.M(D,{crossOrigin:j,integrity:typeof S.integrity=="string"?S.integrity:void 0,nonce:typeof S.nonce=="string"?S.nonce:void 0,fetchPriority:typeof S.fetchPriority=="string"?S.fetchPriority:void 0})}}else S==null&&r.d.M(D)},ct.preload=function(D,S){if(typeof D=="string"&&typeof S=="object"&&S!==null&&typeof S.as=="string"){var j=S.as,X=I(j,S.crossOrigin);r.d.L(D,j,{crossOrigin:X,integrity:typeof S.integrity=="string"?S.integrity:void 0,nonce:typeof S.nonce=="string"?S.nonce:void 0,type:typeof S.type=="string"?S.type:void 0,fetchPriority:typeof S.fetchPriority=="string"?S.fetchPriority:void 0,referrerPolicy:typeof S.referrerPolicy=="string"?S.referrerPolicy:void 0,imageSrcSet:typeof S.imageSrcSet=="string"?S.imageSrcSet:void 0,imageSizes:typeof S.imageSizes=="string"?S.imageSizes:void 0,media:typeof S.media=="string"?S.media:void 0})}},ct.preloadModule=function(D,S){if(typeof D=="string")if(S){var j=I(S.as,S.crossOrigin);r.d.m(D,{as:typeof S.as=="string"&&S.as!=="script"?S.as:void 0,crossOrigin:j,integrity:typeof S.integrity=="string"?S.integrity:void 0,nonce:typeof S.nonce=="string"?S.nonce:void 0,fetchPriority:typeof S.fetchPriority=="string"?S.fetchPriority:void 0})}else r.d.m(D)},ct.requestFormReset=function(D){r.d.r(D)},ct.unstable_batchedUpdates=function(D,S){return D(S)},ct.useFormState=function(D,S,j){return k.H.useFormState(D,S,j)},ct.useFormStatus=function(){return k.H.useHostTransitionStatus()},ct.version="19.3.1",ct}var Nm;function _x(){if(Nm)return Rf.exports;Nm=1;function o(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(o)}catch(p){console.error(p)}}return o(),Rf.exports=zx(),Rf.exports}/** | |
| 43 | + * @license React | |
| 44 | + * react-dom-client.production.js | |
| 45 | + * | |
| 46 | + * Copyright (c) Meta Platforms, Inc. and affiliates. | |
| 47 | + * | |
| 48 | + * This source code is licensed under the MIT license found in the | |
| 49 | + * LICENSE file in the root directory of this source tree. | |
| 50 | + */var zm;function Tx(){if(zm)return fu;zm=1;var o=Nx(),p=Xf(),O=_x();function r(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var l=2;l<arguments.length;l++)t+="&args[]="+encodeURIComponent(arguments[l])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function T(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function M(e){for(var t=e,l=t;l&&!l.alternate;)t=l,(t.flags&4098)!==0&&(e=t.return),l=t.return;for(;t.return;)t=t.return;return t.tag===3?e:null}function $(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function q(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function k(e){if(M(e)!==e)throw Error(r(188))}function I(e){var t=e.alternate;if(!t){if(t=M(e),t===null)throw Error(r(188));return t!==e?null:e}for(var l=e,a=t;;){var n=l.return;if(n===null)break;var u=n.alternate;if(u===null){if(a=n.return,a!==null){l=a;continue}break}if(n.child===u.child){for(u=n.child;u;){if(u===l)return k(n),e;if(u===a)return k(n),t;u=u.sibling}throw Error(r(188))}if(l.return!==a.return)l=n,a=u;else{for(var i=!1,s=n.child;s;){if(s===l){i=!0,l=n,a=u;break}if(s===a){i=!0,a=n,l=u;break}s=s.sibling}if(!i){for(s=u.child;s;){if(s===l){i=!0,l=u,a=n;break}if(s===a){i=!0,a=u,l=n;break}s=s.sibling}if(!i)throw Error(r(189))}}if(l.alternate!==a)throw Error(r(190))}if(l.tag!==3)throw Error(r(188));return l.stateNode.current===l?e:t}function D(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=D(e),t!==null)return t;e=e.sibling}return null}function S(e,t,l,a,n,u){for(;e!==null;){if((e.tag===5||e.tag===27||e.tag===6)&&l(e,a,n,u)||(e.tag!==22||e.memoizedState===null)&&(t||e.tag!==5&&e.tag!==27)&&S(e.child,t,l,a,n,u))return!0;e=e.sibling}return!1}function j(e){for(e=e.return;e!==null;){if(e.tag===3||e.tag===5||e.tag===27)return e;e=e.return}return null}function X(e){var t=!1;for(e=e.return;e!==null&&(e.tag===4&&(t=!0),!(e.tag===3||e.tag===5||e.tag===27));)e=e.return;return t}function le(e){var t=[null,null],l=j(e);return l===null||ie(t,e,l.child,{foundSelf:!1}),t}function ie(e,t,l,a){for(;l!==null;){if(l===t)a.foundSelf=!0;else if(l.tag===5||l.tag===27||l.tag===6){if(a.foundSelf)return e[1]=l,!0;e[0]=l}else if((l.tag!==22||l.memoizedState===null)&&ie(e,t,l.child,a))return!0;l=l.sibling}return!1}function F(e){switch(e.tag){case 5:case 27:case 6:return e.stateNode;case 3:return e.stateNode.containerInfo;default:throw Error(r(559))}}var De=null,ve=null;function Re(e,t,l){return e===l?!0:e===t?(De=e,!0):!1}function Z(e,t,l){return e===l?(ve=e,!1):e===t?(ve!==null&&(De=e),!0):!1}function R(e){if(e===null)return null;do e=e===null?null:e.return;while(e&&e.tag!==5&&e.tag!==27&&e.tag!==3);return e||null}function se(e,t,l){for(var a=0,n=e;n;n=l(n))a++;n=0;for(var u=t;u;u=l(u))n++;for(;0<a-n;)e=l(e),a--;for(;0<n-a;)t=l(t),n--;for(;a--;){if(e===t||t!==null&&e===t.alternate)return e;e=l(e),t=l(t)}return null}var Q=Object.assign,P=Symbol.for("react.element"),Ve=Symbol.for("react.transitional.element"),qe=Symbol.for("react.portal"),Ae=Symbol.for("react.fragment"),Ne=Symbol.for("react.strict_mode"),Le=Symbol.for("react.profiler"),Ye=Symbol.for("react.consumer"),je=Symbol.for("react.context"),A=Symbol.for("react.forward_ref"),K=Symbol.for("react.suspense"),J=Symbol.for("react.suspense_list"),de=Symbol.for("react.memo"),w=Symbol.for("react.lazy"),G=Symbol.for("react.activity"),Ee=Symbol.for("react.legacy_hidden"),il=Symbol.for("react.memo_cache_sentinel"),m=Symbol.for("react.view_transition"),E=Symbol.for("react.recoverable"),V=Symbol.iterator;function N(e){return e===null||typeof e!="object"?null:(e=V&&e[V]||e["@@iterator"],typeof e=="function"?e:null)}var fe=Symbol.for("react.client.reference");function ae(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===fe?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ae:return"Fragment";case Le:return"Profiler";case Ne:return"StrictMode";case K:return"Suspense";case J:return"SuspenseList";case G:return"Activity";case m:return"ViewTransition"}if(typeof e=="object")switch(e.$$typeof){case qe:return"Portal";case je:return e.displayName||"Context";case Ye:return(e._context.displayName||"Context")+".Consumer";case A:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case de:return t=e.displayName||null,t!==null?t:ae(e.type)||"Memo";case w:t=e._payload,e=e._init;try{return ae(e(t))}catch{}}return null}var ce=Array.isArray,B=p.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ee=O.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,cl={pending:!1,data:null,method:null,action:null},ki=[],Na=-1;function Kt(e){return{current:e}}function et(e){0>Na||(e.current=ki[Na],ki[Na]=null,Na--)}function Ce(e,t){Na++,ki[Na]=e.current,e.current=t}var Jt=Kt(null),hn=Kt(null),zl=Kt(null),du=Kt(null);function mu(e,t){switch(Ce(zl,t),Ce(hn,e),Ce(Jt,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?_0(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=_0(t),e=T0(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}et(Jt),Ce(Jt,e)}function za(){et(Jt),et(hn),et(zl)}function $i(e){var t=e.memoizedState;t!==null&&(rn._currentValue=t.memoizedState,Ce(du,e)),t=Jt.current;var l=T0(t,e.type);t!==l&&(Ce(hn,e),Ce(Jt,l))}function hu(e){hn.current===e&&(et(Jt),et(hn)),du.current===e&&(et(du),rn._currentValue=cl)}var Fi,Lf;function _l(e){if(Fi===void 0)try{throw Error()}catch(l){var t=l.stack.trim().match(/\n( *(at )?)/);Fi=t&&t[1]||"",Lf=-1<l.stack.indexOf(` | |
| 51 | + at`)?" (<anonymous>)":-1<l.stack.indexOf("@")?"@unknown:0:0":""}return` | |
| 52 | +`+Fi+e+Lf}var Wi=!1;function Ii(e,t){if(!e||Wi)return"";Wi=!0;var l=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var a={DetermineComponentFrameRoot:function(){try{if(t){var _=function(){throw Error()};if(Object.defineProperty(_.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(_,[])}catch(C){var h=C}Reflect.construct(e,[],_)}else{try{_.call()}catch(C){h=C}_=!1;try{var g=Object.getOwnPropertyDescriptor(e.prototype,"props");Object.defineProperty(e.prototype,"props",{configurable:!0,set:function(){throw Error()}}),_=!0,new e}finally{_&&(g!==void 0?Object.defineProperty(e.prototype,"props",g):delete e.prototype.props)}}}else{try{throw Error()}catch(C){h=C}(_=e())&&typeof _.catch=="function"&&_.catch(function(){})}}catch(C){if(C&&h&&typeof C.stack=="string")return[C.stack,h.stack]}return[null,null]}};a.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var n=Object.getOwnPropertyDescriptor(a.DetermineComponentFrameRoot,"name");n&&n.configurable&&Object.defineProperty(a.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=a.DetermineComponentFrameRoot(),i=u[0],s=u[1];if(i&&s){var f=i.split(` | |
| 53 | +`),x=s.split(` | |
| 54 | +`);for(n=a=0;a<f.length&&!f[a].includes("DetermineComponentFrameRoot");)a++;for(;n<x.length&&!x[n].includes("DetermineComponentFrameRoot");)n++;if(a===f.length||n===x.length)for(a=f.length-1,n=x.length-1;1<=a&&0<=n&&f[a]!==x[n];)n--;for(;1<=a&&0<=n;a--,n--)if(f[a]!==x[n]){if(a!==1||n!==1)do if(a--,n--,0>n||f[a]!==x[n]){var b=` | |
| 55 | +`+f[a].replace(" at new "," at ");return e.displayName&&b.includes("<anonymous>")&&(b=b.replace("<anonymous>",e.displayName)),b}while(1<=a&&0<=n);break}}}finally{Wi=!1,Error.prepareStackTrace=l}return(l=e?e.displayName||e.name:"")?_l(l):""}function Sh(e,t){switch(e.tag){case 26:case 27:case 5:return _l(e.type);case 16:return _l("Lazy");case 13:return e.child!==t&&t!==null?_l("Suspense Fallback"):_l("Suspense");case 19:return _l("SuspenseList");case 0:case 15:return Ii(e.type,!1);case 11:return Ii(e.type.render,!1);case 1:return Ii(e.type,!0);case 31:return _l("Activity");case 30:return _l("ViewTransition");default:return""}}function Zf(e){try{var t="",l=null;do t+=Sh(e,l),l=e,e=e.return;while(e);return t}catch(a){return` | |
| 56 | +Error generating stack: `+a.message+` | |
| 57 | +`+a.stack}}var Pi=Object.prototype.hasOwnProperty,ec=o.unstable_scheduleCallback,tc=o.unstable_cancelCallback,Nh=o.unstable_shouldYield,zh=o.unstable_requestPaint,bt=o.unstable_now,_h=o.unstable_getCurrentPriorityLevel,Kf=o.unstable_ImmediatePriority,Jf=o.unstable_UserBlockingPriority,vu=o.unstable_NormalPriority,Th=o.unstable_LowPriority,kf=o.unstable_IdlePriority,jh=o.log,Eh=o.unstable_setDisableYieldValue,vn=null,pt=null;function Tl(e){if(typeof jh=="function"&&Eh(e),pt&&typeof pt.setStrictMode=="function")try{pt.setStrictMode(vn,e)}catch{}}var St=Math.clz32?Math.clz32:Mh,Oh=Math.log,Ah=Math.LN2;function Mh(e){return e>>>=0,e===0?32:31-(Oh(e)/Ah|0)|0}var xu=256,yu=262144,gu=4194304;function Il(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function bu(e,t,l){var a=e.pendingLanes;if(a===0)return 0;var n=0,u=e.suspendedLanes,i=e.pingedLanes;e=e.warmLanes;var s=a&134217727;return s!==0?(a=s&~u,a!==0?n=Il(a):(i&=s,i!==0?n=Il(i):l||(l=s&~e,l!==0&&(n=Il(l))))):(s=a&~u,s!==0?n=Il(s):i!==0?n=Il(i):l||(l=a&~e,l!==0&&(n=Il(l)))),n===0?0:t!==0&&t!==n&&(t&u)===0&&(u=n&-n,l=t&-t,u>=l||u===32&&(l&4194048)!==0)?t:n}function xn(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function $f(e,t){(t&8)!==0&&(t|=t&32);var l=e.entangledLanes;if(l!==0)for(e=e.entanglements,l&=t;0<l;){var a=31-St(l),n=1<<a;t|=e[a],l&=~n}return t}function Dh(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ff(){var e=gu;return gu<<=1,(gu&62914560)===0&&(gu=4194304),e}function lc(e){for(var t=[],l=0;31>l;l++)t.push(e);return t}function yn(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ch(e,t,l,a,n,u){var i=e.pendingLanes;e.pendingLanes=l,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=l,e.entangledLanes&=l,e.errorRecoveryDisabledLanes&=l,e.shellSuspendCounter=0;var s=e.entanglements,f=e.expirationTimes,x=e.hiddenUpdates;for(l=i&~l;0<l;){var b=31-St(l),_=1<<b;s[b]=0,f[b]=-1;var h=x[b];if(h!==null)for(x[b]=null,b=0;b<h.length;b++){var g=h[b];g!==null&&(g.lane&=-536870913)}l&=~_}a!==0&&Wf(e,a,0),u!==0&&n===0&&e.tag!==0&&(e.suspendedLanes|=u&~(i&~t))}function Wf(e,t,l){e.pendingLanes|=t,e.suspendedLanes&=~t;var a=31-St(t);e.entangledLanes|=t,e.entanglements[a]=e.entanglements[a]|1073741824|l&261930}function If(e,t){var l=e.entangledLanes|=t;for(e=e.entanglements;l;){var a=31-St(l),n=1<<a;n&t|e[a]&t&&(e[a]|=t),l&=~n}}function Pf(e,t){var l=t&-t;return l=(l&42)!==0?1:ac(l),(l&(e.suspendedLanes|t))!==0?0:l}function ac(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function nc(e){return e&=-e,2<e?8<e?(e&134217727)!==0?32:268435456:8:2}function eo(){var e=ee.p;return e!==0?e:(e=window.event,e===void 0?32:sm(e.type))}function to(e,t){var l=ee.p;try{return ee.p=e,t()}finally{ee.p=l}}var sl=Math.random().toString(36).slice(2),tt="__reactFiber$"+sl,mt="__reactProps$"+sl,_a="__reactContainer$"+sl,lo="__reactEvents$"+sl,wh="__reactListeners$"+sl,Uh="__reactHandles$"+sl,ao="__reactResources$"+sl,gn="__reactMarker$"+sl,pu="__reactLoad$"+sl;function Su(e){delete e[tt],delete e[mt],delete e[wh],delete e[Uh]}function Pl(e){var t;if(t=e[tt])return t;for(var l=e.parentNode;l;){if(t=l[_a]||l[tt]){if(l=t.alternate,t.child!==null||l!==null&&l.child!==null)for(e=X0(e);e!==null;){if(l=e[tt])return l;e=X0(e)}return t}e=l,l=e.parentNode}return null}function Ta(e){if(e=e[tt]||e[_a]){var t=e.tag;if(t===5||t===6||t===13||t===31||t===26||t===27||t===3)return e}return null}function bn(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e.stateNode;throw Error(r(33))}function ja(e){var t=e[ao];return t||(t=e[ao]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function Fe(e){e[gn]=!0}function no(e){e[pu]=void 0}var uo=new Set,io={};function ea(e,t){Ea(e,t),Ea(e+"Capture",t)}function Ea(e,t){for(io[e]=t,e=0;e<t.length;e++)uo.add(t[e])}var Rh=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),co={},so={};function Hh(e){return Pi.call(so,e)?!0:Pi.call(co,e)?!1:Rh.test(e)?so[e]=!0:(co[e]=!0,!1)}var be=!1;function fo(){var e=be;return be=!1,e}function Nu(e,t,l){if(Hh(t))if(l===null)e.removeAttribute(t);else{switch(typeof l){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var a=t.toLowerCase().slice(0,5);if(a!=="data-"&&a!=="aria-"){e.removeAttribute(t);return}}e.setAttribute(t,l)}}function zu(e,t,l){if(l===null)e.removeAttribute(t);else{switch(typeof l){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,l)}}function fl(e,t,l,a){if(a===null)e.removeAttribute(l);else{switch(typeof a){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(l);return}e.setAttributeNS(t,l,a)}}function Nt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function oo(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function qh(e,t,l){var a=Object.getOwnPropertyDescriptor(e.constructor.prototype,t);if(!e.hasOwnProperty(t)&&typeof a<"u"&&typeof a.get=="function"&&typeof a.set=="function"){var n=a.get,u=a.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return n.call(this)},set:function(i){l=""+i,u.call(this,i)}}),Object.defineProperty(e,t,{enumerable:a.enumerable}),{getValue:function(){return l},setValue:function(i){l=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function uc(e){if(!e._valueTracker){var t=oo(e)?"checked":"value";e._valueTracker=qh(e,t,""+e[t])}}function ro(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var l=t.getValue(),a="";return e&&(a=oo(e)?e.checked?"true":"false":e.value),e=a,e!==l?(t.setValue(e),!0):!1}var Bh=/[\n"\\]/g;function Mt(e){return e.replace(Bh,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function ic(e,t,l,a,n,u,i,s){e.name="",i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?e.type=i:e.removeAttribute("type"),t!=null?i==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Nt(t)):e.value!==""+Nt(t)&&(e.value=""+Nt(t)):i!=="submit"&&i!=="reset"||e.removeAttribute("value"),t!=null?i==="number"&&e.value==t?cc(e,Nt(e.value)):cc(e,Nt(t)):l!=null?cc(e,Nt(l)):a!=null&&e.removeAttribute("value"),n==null&&u!=null&&(e.defaultChecked=!!u),n!=null&&(e.checked=n&&typeof n!="function"&&typeof n!="symbol"),s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"?e.name=""+Nt(s):e.removeAttribute("name")}function mo(e,t,l,a,n,u,i,s){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||l!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){uc(e);return}l=l!=null?""+Nt(l):"",t=t!=null?""+Nt(t):l,s||t===e.value||(e.value=t),e.defaultValue=t}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=s?e.checked:!!a,e.defaultChecked=!!a,i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(e.name=i),uc(e)}function cc(e,t){e.defaultValue!==""+t&&(e.defaultValue=""+t)}function Oa(e,t,l,a){if(e=e.options,t){t={};for(var n=0;n<l.length;n++)t["$"+l[n]]=!0;for(l=0;l<e.length;l++)n=t.hasOwnProperty("$"+e[l].value),e[l].selected!==n&&(e[l].selected=n),n&&a&&(e[l].defaultSelected=!0)}else{for(l=""+Nt(l),t=null,n=0;n<e.length;n++){if(e[n].value===l){e[n].selected=!0,a&&(e[n].defaultSelected=!0);return}t!==null||e[n].disabled||(t=e[n])}t!==null&&(t.selected=!0)}}function ho(e,t,l){if(t!=null&&(t=""+Nt(t),t!==e.value&&(e.value=t),l==null)){e.defaultValue!==t&&(e.defaultValue=t);return}e.defaultValue=l!=null?""+Nt(l):""}function vo(e,t,l,a){if(t==null){if(a!=null){if(l!=null)throw Error(r(92));if(ce(a)){if(1<a.length)throw Error(r(93));a=a[0]}l=a}l==null&&(l=""),t=l}l=Nt(t),e.defaultValue=l,a=e.textContent,a===l&&a!==""&&a!==null&&(e.value=a),uc(e)}function Aa(e,t){if(t){var l=e.firstChild;if(l&&l===e.lastChild&&l.nodeType===3){l.nodeValue=t;return}}e.textContent=t}var Yh=new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" "));function xo(e,t,l){var a=t.indexOf("--")===0;l==null||typeof l=="boolean"||l===""?a?e.setProperty(t,""):t==="float"?e.cssFloat="":e[t]="":a?e.setProperty(t,l):typeof l!="number"||l===0||Yh.has(t)?t==="float"?e.cssFloat=l:e[t]=(""+l).trim():e[t]=l+"px"}function yo(e,t,l){if(t!=null&&typeof t!="object")throw Error(r(62));if(e=e.style,l!=null){for(var a in l)!l.hasOwnProperty(a)||t!=null&&t.hasOwnProperty(a)||(a.indexOf("--")===0?e.setProperty(a,""):a==="float"?e.cssFloat="":e[a]="",be=!0);for(var n in t)a=t[n],t.hasOwnProperty(n)&&l[n]!==a&&(xo(e,n,a),be=!0)}else for(var u in t)t.hasOwnProperty(u)&&xo(e,u,t[u])}function sc(e){if(e.indexOf("-")===-1)return!1;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Gh=new Map([["acceptCharset","accept-charset"],["htmlFor","for"],["httpEquiv","http-equiv"],["crossOrigin","crossorigin"],["accentHeight","accent-height"],["alignmentBaseline","alignment-baseline"],["arabicForm","arabic-form"],["baselineShift","baseline-shift"],["capHeight","cap-height"],["clipPath","clip-path"],["clipRule","clip-rule"],["colorInterpolation","color-interpolation"],["colorInterpolationFilters","color-interpolation-filters"],["colorProfile","color-profile"],["colorRendering","color-rendering"],["dominantBaseline","dominant-baseline"],["enableBackground","enable-background"],["fillOpacity","fill-opacity"],["fillRule","fill-rule"],["floodColor","flood-color"],["floodOpacity","flood-opacity"],["fontFamily","font-family"],["fontSize","font-size"],["fontSizeAdjust","font-size-adjust"],["fontStretch","font-stretch"],["fontStyle","font-style"],["fontVariant","font-variant"],["fontWeight","font-weight"],["glyphName","glyph-name"],["glyphOrientationHorizontal","glyph-orientation-horizontal"],["glyphOrientationVertical","glyph-orientation-vertical"],["horizAdvX","horiz-adv-x"],["horizOriginX","horiz-origin-x"],["imageRendering","image-rendering"],["letterSpacing","letter-spacing"],["lightingColor","lighting-color"],["markerEnd","marker-end"],["markerMid","marker-mid"],["markerStart","marker-start"],["maskType","mask-type"],["overlinePosition","overline-position"],["overlineThickness","overline-thickness"],["paintOrder","paint-order"],["panose-1","panose-1"],["pointerEvents","pointer-events"],["renderingIntent","rendering-intent"],["shapeRendering","shape-rendering"],["stopColor","stop-color"],["stopOpacity","stop-opacity"],["strikethroughPosition","strikethrough-position"],["strikethroughThickness","strikethrough-thickness"],["strokeDasharray","stroke-dasharray"],["strokeDashoffset","stroke-dashoffset"],["strokeLinecap","stroke-linecap"],["strokeLinejoin","stroke-linejoin"],["strokeMiterlimit","stroke-miterlimit"],["strokeOpacity","stroke-opacity"],["strokeWidth","stroke-width"],["textAnchor","text-anchor"],["textDecoration","text-decoration"],["textRendering","text-rendering"],["transformOrigin","transform-origin"],["underlinePosition","underline-position"],["underlineThickness","underline-thickness"],["unicodeBidi","unicode-bidi"],["unicodeRange","unicode-range"],["unitsPerEm","units-per-em"],["vAlphabetic","v-alphabetic"],["vHanging","v-hanging"],["vIdeographic","v-ideographic"],["vMathematical","v-mathematical"],["vectorEffect","vector-effect"],["vertAdvY","vert-adv-y"],["vertOriginX","vert-origin-x"],["vertOriginY","vert-origin-y"],["wordSpacing","word-spacing"],["writingMode","writing-mode"],["xmlnsXlink","xmlns:xlink"],["xHeight","x-height"]]),Qh=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;function _u(e){return Qh.test(""+e)?"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')":e}function kt(){}var fc=null;function oc(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ma=null,Da=null;function go(e){var t=Ta(e);if(t&&(e=t.stateNode)){var l=e[mt]||null;e:switch(e=t.stateNode,t.type){case"input":if(ic(e,l.value,l.defaultValue,l.defaultValue,l.checked,l.defaultChecked,l.type,l.name),t=l.name,l.type==="radio"&&t!=null){for(l=e;l.parentNode;)l=l.parentNode;for(l=l.querySelectorAll('input[name="'+Mt(""+t)+'"][type="radio"]'),t=0;t<l.length;t++){var a=l[t];if(a!==e&&a.form===e.form){var n=a[mt]||null;if(!n)throw Error(r(90));ic(a,n.value,n.defaultValue,n.defaultValue,n.checked,n.defaultChecked,n.type,n.name)}}for(t=0;t<l.length;t++)a=l[t],a.form===e.form&&ro(a)}break e;case"textarea":ho(e,l.value,l.defaultValue);break e;case"select":t=l.value,t!=null&&Oa(e,!!l.multiple,t,!1)}}}var rc=!1;function bo(e,t,l){if(rc)return e(t,l);rc=!0;try{var a=e(t);return a}finally{if(rc=!1,(Ma!==null||Da!==null)&&(_i(),Ma&&(t=Ma,e=Da,Da=Ma=null,go(t),e)))for(t=0;t<e.length;t++)go(e[t])}}function pn(e,t){var l=e.stateNode;if(l===null)return null;var a=l[mt]||null;if(a===null)return null;l=a[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(a=!a.disabled)||(e=e.type,a=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!a;break e;default:e=!1}if(e)return null;if(l&&typeof l!="function")throw Error(r(231,t,typeof l));return l}var ol=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),dc=!1;if(ol)try{var Sn={};Object.defineProperty(Sn,"passive",{get:function(){dc=!0}}),window.addEventListener("test",Sn,Sn),window.removeEventListener("test",Sn,Sn)}catch{dc=!1}var jl=null,mc=null,Tu=null;function po(){if(Tu)return Tu;var e,t=mc,l=t.length,a,n="value"in jl?jl.value:jl.textContent,u=n.length;for(e=0;e<l&&t[e]===n[e];e++);var i=l-e;for(a=1;a<=i&&t[l-a]===n[u-a];a++);return Tu=n.slice(e,1<a?1-a:void 0)}function ju(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Eu(){return!0}function So(){return!1}function ft(e){function t(l,a,n,u,i){this._reactName=l,this._targetInst=n,this.type=a,this.nativeEvent=u,this.target=i,this.currentTarget=null;for(var s in e)e.hasOwnProperty(s)&&(l=e[s],this[s]=l?l(u):u[s]);return this.isDefaultPrevented=(u.defaultPrevented!=null?u.defaultPrevented:u.returnValue===!1)?Eu:So,this.isPropagationStopped=So,this}return Q(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var l=this.nativeEvent;l&&(l.preventDefault?l.preventDefault():typeof l.returnValue!="unknown"&&(l.returnValue=!1),this.isDefaultPrevented=Eu)},stopPropagation:function(){var l=this.nativeEvent;l&&(l.stopPropagation?l.stopPropagation():typeof l.cancelBubble!="unknown"&&(l.cancelBubble=!0),this.isPropagationStopped=Eu)},persist:function(){},isPersistent:Eu}),t}var El={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Ou=ft(El),Nn=Q({},El,{view:0,detail:0}),Xh=ft(Nn),hc,vc,zn,Au=Q({},Nn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:yc,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==zn&&(zn&&e.type==="mousemove"?(hc=e.screenX-zn.screenX,vc=e.screenY-zn.screenY):vc=hc=0,zn=e),hc)},movementY:function(e){return"movementY"in e?e.movementY:vc}}),No=ft(Au),Vh=Q({},Au,{dataTransfer:0}),Lh=ft(Vh),Zh=Q({},Nn,{relatedTarget:0}),xc=ft(Zh),Kh=Q({},El,{animationName:0,elapsedTime:0,pseudoElement:0}),Jh=ft(Kh),kh=Q({},El,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),$h=ft(kh),Fh=Q({},El,{data:0}),zo=ft(Fh),Wh={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Ih={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Ph={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function e1(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=Ph[e])?!!t[e]:!1}function yc(){return e1}var t1=Q({},Nn,{key:function(e){if(e.key){var t=Wh[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=ju(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?Ih[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:yc,charCode:function(e){return e.type==="keypress"?ju(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?ju(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),l1=ft(t1),a1=Q({},Au,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),_o=ft(a1),n1=Q({},El,{submitter:0}),u1=ft(n1),i1=Q({},Nn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:yc}),c1=ft(i1),s1=Q({},El,{propertyName:0,elapsedTime:0,pseudoElement:0}),f1=ft(s1),o1=Q({},Au,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),r1=ft(o1),d1=Q({},El,{newState:0,oldState:0,source:0}),m1=ft(d1),h1=[9,13,27,32],gc=ol&&"CompositionEvent"in window,_n=null;ol&&"documentMode"in document&&(_n=document.documentMode);var v1=ol&&"TextEvent"in window&&!_n,To=ol&&(!gc||_n&&8<_n&&11>=_n),jo=" ",Eo=!1;function Oo(e,t){switch(e){case"keyup":return h1.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ao(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Ca=!1;function x1(e,t){switch(e){case"compositionend":return Ao(t);case"keypress":return t.which!==32?null:(Eo=!0,jo);case"textInput":return e=t.data,e===jo&&Eo?null:e;default:return null}}function y1(e,t){if(Ca)return e==="compositionend"||!gc&&Oo(e,t)?(e=po(),Tu=mc=jl=null,Ca=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return To&&t.locale!=="ko"?null:t.data;default:return null}}var g1={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Mo(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!g1[e.type]:t==="textarea"}function Do(e,t,l,a){Ma?Da?Da.push(a):Da=[a]:Ma=a,t=Mi(t,"onChange"),0<t.length&&(l=new Ou("onChange","change",null,l,a),e.push({event:l,listeners:t}))}var Tn=null,jn=null;function b1(e){g0(e,0)}function Mu(e){var t=bn(e);if(ro(t))return e}function Co(e,t){if(e==="change")return t}var wo=!1;if(ol){var bc;if(ol){var pc="oninput"in document;if(!pc){var Uo=document.createElement("div");Uo.setAttribute("oninput","return;"),pc=typeof Uo.oninput=="function"}bc=pc}else bc=!1;wo=bc&&(!document.documentMode||9<document.documentMode)}function Ro(){Tn&&(Tn.detachEvent("onpropertychange",Ho),jn=Tn=null)}function Ho(e){if(e.propertyName==="value"&&Mu(jn)){var t=[];Do(t,jn,e,oc(e)),bo(b1,t)}}function p1(e,t,l){e==="focusin"?(Ro(),Tn=t,jn=l,Tn.attachEvent("onpropertychange",Ho)):e==="focusout"&&Ro()}function S1(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return Mu(jn)}function N1(e,t){if(e==="click")return Mu(t)}function z1(e,t){if(e==="input"||e==="change")return Mu(t)}function _1(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var zt=typeof Object.is=="function"?Object.is:_1;function En(e,t){if(zt(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var l=Object.keys(e),a=Object.keys(t);if(l.length!==a.length)return!1;for(a=0;a<l.length;a++){var n=l[a];if(!Pi.call(t,n)||!zt(e[n],t[n]))return!1}return!0}function Sc(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function qo(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Bo(e,t){var l=qo(e);e=0;for(var a;l;){if(l.nodeType===3){if(a=e+l.textContent.length,e<=t&&a>=t)return{node:l,offset:t-e};e=a}e:{for(;l;){if(l.nextSibling){l=l.nextSibling;break e}l=l.parentNode}l=void 0}l=qo(l)}}function Yo(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Yo(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Go(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Sc(e.document);t instanceof e.HTMLIFrameElement;){try{var l=typeof t.contentWindow.location.href=="string"}catch{l=!1}if(l)e=t.contentWindow;else break;t=Sc(e.document)}return t}function Nc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var T1=ol&&"documentMode"in document&&11>=document.documentMode,wa=null,zc=null,On=null,_c=!1;function Qo(e,t,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;_c||wa==null||wa!==Sc(a)||(a=wa,"selectionStart"in a&&Nc(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),On&&En(On,a)||(On=a,a=Mi(zc,"onSelect"),0<a.length&&(t=new Ou("onSelect","select",null,t,l),e.push({event:t,listeners:a}),t.target=wa)))}function ta(e,t){var l={};return l[e.toLowerCase()]=t.toLowerCase(),l["Webkit"+e]="webkit"+t,l["Moz"+e]="moz"+t,l}var Ua={animationend:ta("Animation","AnimationEnd"),animationiteration:ta("Animation","AnimationIteration"),animationstart:ta("Animation","AnimationStart"),transitionrun:ta("Transition","TransitionRun"),transitionstart:ta("Transition","TransitionStart"),transitioncancel:ta("Transition","TransitionCancel"),transitionend:ta("Transition","TransitionEnd")},Tc={},Xo={};ol&&(Xo=document.createElement("div").style,"AnimationEvent"in window||(delete Ua.animationend.animation,delete Ua.animationiteration.animation,delete Ua.animationstart.animation),"TransitionEvent"in window||delete Ua.transitionend.transition);function la(e){if(Tc[e])return Tc[e];if(!Ua[e])return e;var t=Ua[e],l;for(l in t)if(t.hasOwnProperty(l)&&l in Xo)return Tc[e]=t[l];return e}var Vo=la("animationend"),Lo=la("animationiteration"),Zo=la("animationstart"),j1=la("transitionrun"),E1=la("transitionstart"),O1=la("transitioncancel"),Ko=la("transitionend"),Jo=new Map,jc="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error fullscreenChange fullscreenError gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");jc.push("scrollEnd");function Yt(e,t){Jo.set(e,t),ea(t,[e])}var A1=0;function rl(e,t){if(e.name!=null&&e.name!=="auto")return e.name;if(t.autoName!==null)return t.autoName;e=Vt.identifierPrefix;var l=A1++;return e="_"+e+"t_"+l.toString(32)+"_",t.autoName=e}function ko(e){if(e==null||typeof e=="string")return e;var t=null,l=en;if(l!==null)for(var a=0;a<l.length;a++){var n=e[l[a]];if(n!=null){if(n==="none")return"none";t=t==null?n:t+(" "+n)}}return t??e.default}function dl(e,t){return e=ko(e),t=ko(t),t==null?e==="auto"?null:e:t==="auto"?null:t}var Du=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)},Dt=[],Ra=0,Ec=0;function Cu(){for(var e=Ra,t=Ec=Ra=0;t<e;){var l=Dt[t];Dt[t++]=null;var a=Dt[t];Dt[t++]=null;var n=Dt[t];Dt[t++]=null;var u=Dt[t];if(Dt[t++]=null,a!==null&&n!==null){var i=a.pending;i===null?n.next=n:(n.next=i.next,i.next=n),a.pending=n}u!==0&&$o(l,n,u)}}function wu(e,t,l,a){Dt[Ra++]=e,Dt[Ra++]=t,Dt[Ra++]=l,Dt[Ra++]=a,Ec|=a,e.lanes|=a,e=e.alternate,e!==null&&(e.lanes|=a)}function Oc(e,t,l,a){return wu(e,t,l,a),Uu(e)}function aa(e,t){return wu(e,null,null,t),Uu(e)}function $o(e,t,l){e.lanes|=l;var a=e.alternate;a!==null&&(a.lanes|=l);for(var n=!1,u=e.return;u!==null;)u.childLanes|=l,a=u.alternate,a!==null&&(a.childLanes|=l),u.tag===22&&(e=u.stateNode,e===null||e._visibility&1||(n=!0)),e=u,u=u.return;return e.tag===3?(u=e.stateNode,n&&t!==null&&(n=31-St(l),e=u.hiddenUpdates,a=e[n],a===null?e[n]=[t]:a.push(t),t.lane=l|536870912),u):null}function Uu(e){if(50<Fn)throw Fn=0,zi=null,Error(r(185));for(var t=e.return;t!==null;)e=t,t=e.return;return e.tag===3?e.stateNode:null}var Ha={};function M1(e,t,l,a){this.tag=e,this.key=l,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ht(e,t,l,a){return new M1(e,t,l,a)}function Ac(e){return e=e.prototype,!(!e||!e.isReactComponent)}function ml(e,t){var l=e.alternate;return l===null?(l=ht(e.tag,t,e.key,e.mode),l.elementType=e.elementType,l.type=e.type,l.stateNode=e.stateNode,l.alternate=e,e.alternate=l):(l.pendingProps=t,l.type=e.type,l.flags=0,l.subtreeFlags=0,l.deletions=null),l.flags=e.flags&1206910976,l.childLanes=e.childLanes,l.lanes=e.lanes,l.child=e.child,l.memoizedProps=e.memoizedProps,l.memoizedState=e.memoizedState,l.updateQueue=e.updateQueue,t=e.dependencies,l.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},l.sibling=e.sibling,l.index=e.index,l.ref=e.ref,l.refCleanup=e.refCleanup,l}function Fo(e,t){e.flags&=1206910978;var l=e.alternate;return l===null?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=l.childLanes,e.lanes=l.lanes,e.child=l.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=l.memoizedProps,e.memoizedState=l.memoizedState,e.updateQueue=l.updateQueue,e.type=l.type,t=l.dependencies,e.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function Ru(e,t,l,a,n,u){var i=0;if(a=e,typeof a=="function")Ac(a)&&(i=1);else if(typeof a=="string")i=nx(e,l,Jt.current)?26:e==="html"||e==="head"||e==="body"?27:5;else e:switch(a){case G:return e=ht(31,l,t,n),e.elementType=G,e.lanes=u,e;case Ae:return na(l.children,n,u,t);case Ne:i=8,n|=24;break;case Le:return e=ht(12,l,t,n|2),e.elementType=Le,e.lanes=u,e;case K:return e=ht(13,l,t,n),e.elementType=K,e.lanes=u,e;case J:return e=ht(19,l,t,n),e.elementType=J,e.lanes=u,e;case Ee:case m:return e=n|32,e=ht(30,l,t,e),e.elementType=m,e.lanes=u,e.stateNode={autoName:null,paired:null,clones:null,ref:null},e;default:if(typeof a=="object"&&a!==null)switch(a.$$typeof){case je:i=10;break e;case Ye:i=9;break e;case A:i=11;break e;case de:i=14;break e;case w:i=16,a=null;break e}i=29,l=Error(r(130,e===null?"null":typeof e,"")),a=null}return t=ht(i,l,t,n),t.elementType=e,t.type=a,t.lanes=u,t}function na(e,t,l,a){return e=ht(7,e,a,t),e.lanes=l,e}function Mc(e,t,l){return e=ht(6,e,null,t),e.lanes=l,e}function Wo(e){var t=ht(18,null,null,0);return t.stateNode=e,t}function Dc(e,t,l){return t=ht(4,e.children!==null?e.children:[],e.key,t),t.lanes=l,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var Io=new WeakMap;function Ct(e,t){if(typeof e=="object"&&e!==null){var l=Io.get(e);return l!==void 0?l:(t={value:e,source:t,stack:Zf(t)},Io.set(e,t),t)}return{value:e,source:t,stack:Zf(t)}}var qa=[],Ba=0,Hu=null,An=0,wt=[],Ut=0,Ol=null,$t=1,Ft="";function hl(e,t){qa[Ba++]=An,qa[Ba++]=Hu,Hu=e,An=t}function Po(e,t,l){wt[Ut++]=$t,wt[Ut++]=Ft,wt[Ut++]=Ol,Ol=e;var a=$t;e=Ft;var n=32-St(a)-1;a&=~(1<<n),l+=1;var u=32-St(t)+n;if(30<u){var i=n-n%5;u=(a&(1<<i)-1).toString(32),a>>=i,n-=i,$t=1<<32-St(t)+n|l<<n|a,Ft=u+e}else $t=1<<u|l<<n|a,Ft=e}function qu(e){e.return!==null&&(hl(e,1),Po(e,1,0))}function Cc(e){for(;e===Hu;)Hu=qa[--Ba],qa[Ba]=null,An=qa[--Ba],qa[Ba]=null;for(;e===Ol;)Ol=wt[--Ut],wt[Ut]=null,Ft=wt[--Ut],wt[Ut]=null,$t=wt[--Ut],wt[Ut]=null}function er(e,t){wt[Ut++]=$t,wt[Ut++]=Ft,wt[Ut++]=Ol,$t=t.id,Ft=t.overflow,Ol=e}var We=null,we=null,oe=!1,Al=null,Rt=!1,wc=Error(r(519));function Ml(e){var t=Error(r(418,1<arguments.length&&arguments[1]!==void 0&&arguments[1]?"text":"HTML",""));throw Mn(Ct(t,e)),wc}function tr(e){var t=e.stateNode,l=e.type,a=e.memoizedProps;switch(t[tt]=e,t[mt]=a,l){case"dialog":he("cancel",t),he("close",t);break;case"iframe":case"object":case"embed":he("load",t);break;case"video":case"audio":for(l=0;l<In.length;l++)he(In[l],t);break;case"source":he("error",t);break;case"img":case"image":case"link":he("error",t),he("load",t);break;case"details":he("toggle",t);break;case"input":he("invalid",t),mo(t,a.value,a.defaultValue,a.checked,a.defaultChecked,a.type,a.name,!0);break;case"select":he("invalid",t);break;case"textarea":he("invalid",t),vo(t,a.value,a.defaultValue,a.children)}l=a.children,typeof l!="string"&&typeof l!="number"&&typeof l!="bigint"||t.textContent===""+l||a.suppressHydrationWarning===!0||N0(t.textContent,l)?(a.popover!=null&&(he("beforetoggle",t),he("toggle",t)),a.onScroll!=null&&he("scroll",t),a.onScrollEnd!=null&&he("scrollend",t),a.onClick!=null&&(t.onclick=kt),t=!0):t=!1,t||Ml(e,!0)}function Bu(e){for(We=e.return;We;)switch(We.tag){case 5:case 31:case 13:Rt=!1;return;case 27:case 3:Rt=!0;return;default:We=We.return}}function Ya(e){if(e!==We)return!1;if(!oe)return Bu(e),oe=!0,!1;var t=e.tag,l;if((l=t!==3&&t!==27)&&((l=t===5)&&(l=e.type,l=!(l!=="form"&&l!=="button")||of(e.type,e.memoizedProps)),l=!l),l&&we&&Ml(e),Bu(e),t===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(317));we=Q0(e)}else if(t===31){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(317));we=Q0(e)}else t===27?(t=we,Kl(e.type)?(e=bf,bf=null,we=e):we=t):we=We?qt(e.stateNode.nextSibling):null;return!0}function ua(){we=We=null,oe=!1}function Uc(){var e=Al;return e!==null&&(yt===null?yt=e:yt.push.apply(yt,e),Al=null),e}function Mn(e){Al===null?Al=[e]:Al.push(e)}var Rc=Kt(null),ia=null,vl=null;function Dl(e,t,l){Ce(Rc,t._currentValue),t._currentValue=l}function xl(e){e._currentValue=Rc.current,et(Rc)}function Yu(e,t,l){for(;e!==null;){var a=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,a!==null&&(a.childLanes|=t)):a!==null&&(a.childLanes&t)!==t&&(a.childLanes|=t),e===l)break;e=e.return}}function Hc(e,t,l,a){var n=e.child;for(n!==null&&(n.return=e);n!==null;){var u=n.dependencies;if(u!==null){var i=n.child;u=u.firstContext;e:for(;u!==null;){var s=u;u=n;for(var f=0;f<t.length;f++)if(s.context===t[f]){u.lanes|=l,s=u.alternate,s!==null&&(s.lanes|=l),Yu(u.return,l,e),a||(i=null);break e}u=s.next}}else if(n.tag===18){if(i=n.return,i===null)throw Error(r(341));i.lanes|=l,u=i.alternate,u!==null&&(u.lanes|=l),Yu(i,l,e),i=null}else n.tag===13&&n.memoizedState!==null&&n.memoizedState.dehydrated===null?(n.lanes|=l,i=n.alternate,i!==null&&(i.lanes|=l),Yu(n.return,l,e),i=n.child,i=i!==null?i.sibling:null):i=n.child;if(i!==null)i.return=n;else for(i=n;i!==null;){if(i===e){i=null;break}if(n=i.sibling,n!==null){n.return=i.return,i=n;break}i=i.return}n=i}}function ca(e,t,l,a){e=null;for(var n=t,u=!1;n!==null;){if(!u){if((n.flags&524288)!==0)u=!0;else if((n.flags&262144)!==0)break}if(n.tag===10){var i=n.alternate;if(i===null)throw Error(r(387));if(i=i.memoizedProps,i!==null){var s=n.type;zt(n.pendingProps.value,i.value)||(e!==null?e.push(s):e=[s])}}else if(n===du.current){if(i=n.alternate,i===null)throw Error(r(387));i.memoizedState.memoizedState!==n.memoizedState.memoizedState&&(e!==null?e.push(rn):e=[rn])}n=n.return}return e!==null&&Hc(t,e,l,a),t.flags|=262144,e!==null}function Gu(e){for(e=e.firstContext;e!==null;){if(!zt(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function sa(e){ia=e,vl=null,e=e.dependencies,e!==null&&(e.firstContext=null)}function lt(e){return lr(ia,e)}function Qu(e,t){return ia===null&&sa(e),lr(e,t)}function lr(e,t){var l=t._currentValue;if(t={context:t,memoizedValue:l,next:null},vl===null){if(e===null)throw Error(r(308));vl=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else vl=vl.next=t;return l}var D1=typeof AbortController<"u"?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(l,a){e.push(a)}};this.abort=function(){t.aborted=!0,e.forEach(function(l){return l()})}},C1=o.unstable_scheduleCallback,w1=o.unstable_NormalPriority,Ze={$$typeof:je,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function qc(){return{controller:new D1,data:new Map,refCount:0}}function Dn(e){e.refCount--,e.refCount===0&&C1(w1,function(){e.controller.abort()})}function ar(e,t){if((e.pendingLanes&4194048)!==0){var l=e.transitionTypes;for(l===null&&(l=e.transitionTypes=[]),e=0;e<t.length;e++){var a=t[e];l.indexOf(a)===-1&&l.push(a)}}}var Cn=null;function U1(e){var t=e.transitionTypes;return e.transitionTypes=null,t}var wn=null,Bc=0,fa=0,Ga=null;function R1(e,t){if(wn===null){var l=wn=[];Bc=0,fa=ef(),Ga={status:"pending",value:void 0,then:function(a){l.push(a)}}}return Bc++,t.then(nr,nr),t}function nr(){if(--Bc===0&&(Cn=null,wn!==null)){Ga!==null&&(Ga.status="fulfilled");var e=wn;wn=null,fa=0,Ga=null;for(var t=0;t<e.length;t++)(0,e[t])()}}function H1(e,t){var l=[],a={status:"pending",value:null,reason:null,then:function(n){l.push(n)}};return e.then(function(){a.status="fulfilled",a.value=t;for(var n=0;n<l.length;n++)(0,l[n])(t)},function(n){for(a.status="rejected",a.reason=n,n=0;n<l.length;n++)(0,l[n])(void 0)}),a}var ur=B.S;B.S=function(e,t){if(Wd=bt(),typeof t=="object"&&t!==null&&typeof t.then=="function"&&R1(e,t),Cn!==null)for(var l=nn;l!==null;)ar(l,Cn),l=l.next;if(l=e.types,l!==null){for(var a=nn;a!==null;)ar(a,l),a=a.next;if(fa!==0){a=Cn,a===null&&(a=Cn=[]);for(var n=0;n<l.length;n++){var u=l[n];a.indexOf(u)===-1&&a.push(u)}}}ur!==null&&ur(e,t)};var oa=Kt(null);function Yc(){var e=oa.current;return e!==null?e:Me.pooledCache}function Xu(e,t){t===null?Ce(oa,oa.current):Ce(oa,t.pool)}function ir(){var e=Yc();return e===null?null:{parent:Ze._currentValue,pool:e}}var Qa=Error(r(460)),Gc=Error(r(474)),Vu=Error(r(542)),Lu={then:function(){}};function cr(e){return e=e.status,e==="fulfilled"||e==="rejected"}function sr(e,t,l){switch(l=e[l],l===void 0?e.push(t):l!==t&&(t.then(kt,kt),t=l),t.status){case"fulfilled":return t.value;case"rejected":throw e=t.reason,or(e),e===void 0&&!("reason"in t)?Error(r(600)):e;default:if(typeof t.status=="string")t.then(kt,kt);else{if(e=Me,e!==null&&100<e.shellSuspendCounter)throw Error(r(482));e=t,e.status="pending",e.then(function(a){if(t.status==="pending"){var n=t;n.status="fulfilled",n.value=a}},function(a){if(t.status==="pending"){var n=t;n.status="rejected",n.reason=a}})}switch(t.status){case"fulfilled":return t.value;case"rejected":throw e=t.reason,or(e),e}throw da=t,Qa}}function ra(e){try{var t=e._init;return t(e._payload)}catch(l){throw l!==null&&typeof l=="object"&&typeof l.then=="function"?(da=l,Qa):l}}var da=null;function fr(){if(da===null)throw Error(r(459));var e=da;return da=null,e}function or(e){if(e===Qa||e===Vu)throw Error(r(483))}var Xa=null,Un=0;function Zu(e){var t=Un;return Un+=1,Xa===null&&(Xa=[]),sr(Xa,e,t)}function Cl(e,t){t=t.props.ref,e.ref=t!==void 0?t:null}function Ku(e,t){throw t.$$typeof===P?Error(r(525)):(e=Object.prototype.toString.call(t),Error(r(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e)))}function rr(e){function t(v,d){if(e){var y=v.deletions;y===null?(v.deletions=[d],v.flags|=16):y.push(d)}}function l(v,d){if(!e)return null;for(;d!==null;)t(v,d),d=d.sibling;return null}function a(v){for(var d=new Map;v!==null;)v.key===null?d.set(v.index,v):d.set(v.key,v),v=v.sibling;return d}function n(v,d){return v=ml(v,d),v.index=0,v.sibling=null,v}function u(v,d,y){return v.index=y,e?(y=v.alternate,y!==null?(y=y.index,y<d?(v.flags|=2,d):y):(v.flags|=134217730,d)):(v.flags|=1048576,d)}function i(v){return e&&v.alternate===null&&(v.flags|=134217730),v}function s(v,d,y,z){return d===null||d.tag!==6?(d=Mc(y,v.mode,z),d.return=v,d):(d=n(d,y),d.return=v,d)}function f(v,d,y,z){var U=y.type;return U===Ae?(v=b(v,d,y.props.children,z,y.key),Cl(v,y),v):d!==null&&(d.elementType===U||typeof U=="object"&&U!==null&&U.$$typeof===w&&ra(U)===d.type)?(d=n(d,y.props),Cl(d,y),d.return=v,d):(d=Ru(y.type,y.key,y.props,null,v.mode,z),Cl(d,y),d.return=v,d)}function x(v,d,y,z){return d===null||d.tag!==4||d.stateNode.containerInfo!==y.containerInfo||d.stateNode.implementation!==y.implementation?(d=Dc(y,v.mode,z),d.return=v,d):(d=n(d,y.children||[]),d.return=v,d)}function b(v,d,y,z,U){return d===null||d.tag!==7?(d=na(y,v.mode,z,U),d.return=v,d):(d=n(d,y),d.return=v,d)}function _(v,d,y){if(typeof d=="string"&&d!==""||typeof d=="number"||typeof d=="bigint")return d=Mc(""+d,v.mode,y),d.return=v,d;if(typeof d=="object"&&d!==null){switch(d.$$typeof){case Ve:return y=Ru(d.type,d.key,d.props,null,v.mode,y),Cl(y,d),y.return=v,y;case qe:return d=Dc(d,v.mode,y),d.return=v,d;case w:return d=ra(d),_(v,d,y)}if(ce(d)||N(d))return d=na(d,v.mode,y,null),d.return=v,d;if(typeof d.then=="function")return _(v,Zu(d),y);if(d.$$typeof===je)return _(v,Qu(v,d),y);Ku(v,d)}return null}function h(v,d,y,z){var U=d!==null?d.key:null;if(typeof y=="string"&&y!==""||typeof y=="number"||typeof y=="bigint")return U!==null?null:s(v,d,""+y,z);if(typeof y=="object"&&y!==null){switch(y.$$typeof){case Ve:return y.key===U?f(v,d,y,z):null;case qe:return y.key===U?x(v,d,y,z):null;case w:return y=ra(y),h(v,d,y,z)}if(ce(y)||N(y))return U!==null?null:b(v,d,y,z,null);if(typeof y.then=="function")return h(v,d,Zu(y),z);if(y.$$typeof===je)return h(v,d,Qu(v,y),z);Ku(v,y)}return null}function g(v,d,y,z,U){if(typeof z=="string"&&z!==""||typeof z=="number"||typeof z=="bigint")return v=v.get(y)||null,s(d,v,""+z,U);if(typeof z=="object"&&z!==null){switch(z.$$typeof){case Ve:return v=v.get(z.key===null?y:z.key)||null,f(d,v,z,U);case qe:return v=v.get(z.key===null?y:z.key)||null,x(d,v,z,U);case w:return z=ra(z),g(v,d,y,z,U)}if(ce(z)||N(z))return v=v.get(y)||null,b(d,v,z,U,null);if(typeof z.then=="function")return g(v,d,y,Zu(z),U);if(z.$$typeof===je)return g(v,d,y,Qu(d,z),U);Ku(d,z)}return null}function C(v,d,y,z){for(var U=null,ye=null,L=d,W=d=0,ke=null;L!==null&&W<y.length;W++){L.index>W?(ke=L,L=null):ke=L.sibling;var ge=h(v,L,y[W],z);if(ge===null){L===null&&(L=ke);break}e&&L&&ge.alternate===null&&t(v,L),d=u(ge,d,W),ye===null?U=ge:ye.sibling=ge,ye=ge,L=ke}if(W===y.length)return l(v,L),oe&&hl(v,W),U;if(L===null){for(;W<y.length;W++)L=_(v,y[W],z),L!==null&&(d=u(L,d,W),ye===null?U=L:ye.sibling=L,ye=L);return oe&&hl(v,W),U}for(L=a(L);W<y.length;W++)ke=g(L,v,W,y[W],z),ke!==null&&(e&&(ge=ke.alternate,ge!==null&&L.delete(ge.key===null?W:ge.key)),d=u(ke,d,W),ye===null?U=ke:ye.sibling=ke,ye=ke);return e&&L.forEach(function(Wl){return t(v,Wl)}),oe&&hl(v,W),U}function Y(v,d,y,z){if(y==null)throw Error(r(151));for(var U=null,ye=null,L=d,W=d=0,ke=null,ge=y.next();L!==null&&!ge.done;W++,ge=y.next()){L.index>W?(ke=L,L=null):ke=L.sibling;var Wl=h(v,L,ge.value,z);if(Wl===null){L===null&&(L=ke);break}e&&L&&Wl.alternate===null&&t(v,L),d=u(Wl,d,W),ye===null?U=Wl:ye.sibling=Wl,ye=Wl,L=ke}if(ge.done)return l(v,L),oe&&hl(v,W),U;if(L===null){for(;!ge.done;W++,ge=y.next())ge=_(v,ge.value,z),ge!==null&&(d=u(ge,d,W),ye===null?U=ge:ye.sibling=ge,ye=ge);return oe&&hl(v,W),U}for(L=a(L);!ge.done;W++,ge=y.next())ge=g(L,v,W,ge.value,z),ge!==null&&(e&&(ke=ge.alternate,ke!==null&&L.delete(ke.key===null?W:ke.key)),d=u(ge,d,W),ye===null?U=ge:ye.sibling=ge,ye=ge);return e&&L.forEach(function(xx){return t(v,xx)}),oe&&hl(v,W),U}function ue(v,d,y,z){if(typeof y=="object"&&y!==null&&y.type===Ae&&y.key===null&&y.props.ref===void 0&&(y=y.props.children),typeof y=="object"&&y!==null){switch(y.$$typeof){case Ve:e:{for(var U=y.key;d!==null;){if(d.key===U){if(U=y.type,U===Ae){if(d.tag===7){l(v,d.sibling),z=n(d,y.props.children),Cl(z,y),z.return=v,v=z;break e}}else if(d.elementType===U||typeof U=="object"&&U!==null&&U.$$typeof===w&&ra(U)===d.type){l(v,d.sibling),z=n(d,y.props),Cl(z,y),z.return=v,v=z;break e}l(v,d);break}else t(v,d);d=d.sibling}y.type===Ae?(z=na(y.props.children,v.mode,z,y.key),Cl(z,y),z.return=v,v=z):(z=Ru(y.type,y.key,y.props,null,v.mode,z),Cl(z,y),z.return=v,v=z)}return i(v);case qe:e:{for(U=y.key;d!==null;){if(d.key===U)if(d.tag===4&&d.stateNode.containerInfo===y.containerInfo&&d.stateNode.implementation===y.implementation){l(v,d.sibling),z=n(d,y.children||[]),z.return=v,v=z;break e}else{l(v,d);break}else t(v,d);d=d.sibling}z=Dc(y,v.mode,z),z.return=v,v=z}return i(v);case w:return y=ra(y),ue(v,d,y,z)}if(ce(y))return C(v,d,y,z);if(N(y)){if(U=N(y),typeof U!="function")throw Error(r(150));return y=U.call(y),Y(v,d,y,z)}if(typeof y.then=="function")return ue(v,d,Zu(y),z);if(y.$$typeof===je)return ue(v,d,Qu(v,y),z);Ku(v,y)}return typeof y=="string"&&y!==""||typeof y=="number"||typeof y=="bigint"?(y=""+y,d!==null&&d.tag===6?(l(v,d.sibling),z=n(d,y),z.return=v,v=z):(l(v,d),z=Mc(y,v.mode,z),z.return=v,v=z),i(v)):l(v,d)}return function(v,d,y,z){try{Un=0;var U=ue(v,d,y,z);return Xa=null,U}catch(L){if(L===Qa||L===Vu)throw L;var ye=ht(29,L,null,v.mode);return ye.lanes=z,ye.return=v,ye}finally{}}}var ma=rr(!0),dr=rr(!1),wl=!1;function Qc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Xc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ul(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Rl(e,t,l){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(pe&2)!==0){var n=a.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),a.pending=t,t=Uu(e),$o(e,null,l),t}return wu(e,a,t,l),Uu(e)}function Rn(e,t,l){if(t=t.updateQueue,t!==null&&(t=t.shared,(l&4194048)!==0)){var a=t.lanes;a&=e.pendingLanes,l|=a,t.lanes=l,If(e,l)}}function Vc(e,t){var l=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,l===a)){var n=null,u=null;if(l=l.firstBaseUpdate,l!==null){do{var i={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=i:u=u.next=i,l=l.next}while(l!==null);u===null?n=u=t:u=u.next=t}else n=u=t;l={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},e.updateQueue=l;return}e=l.lastBaseUpdate,e===null?l.firstBaseUpdate=t:e.next=t,l.lastBaseUpdate=t}var Lc=!1;function Hn(){if(Lc){var e=Ga;if(e!==null)throw e}}function qn(e,t,l,a){Lc=!1;var n=e.updateQueue;wl=!1;var u=n.firstBaseUpdate,i=n.lastBaseUpdate,s=n.shared.pending;if(s!==null){n.shared.pending=null;var f=s,x=f.next;f.next=null,i===null?u=x:i.next=x,i=f;var b=e.alternate;b!==null&&(b=b.updateQueue,s=b.lastBaseUpdate,s!==i&&(s===null?b.firstBaseUpdate=x:s.next=x,b.lastBaseUpdate=f))}if(u!==null){var _=n.baseState;i=0,b=x=f=null,s=u;do{var h=s.lane&-536870913,g=h!==s.lane;if(g?(xe&h)===h:(a&h)===h){h!==0&&h===fa&&(Lc=!0),b!==null&&(b=b.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});e:{var C=e,Y=s;h=t;var ue=l;switch(Y.tag){case 1:if(C=Y.payload,typeof C=="function"){_=C.call(ue,_,h);break e}_=C;break e;case 3:C.flags=C.flags&-65537|128;case 0:if(C=Y.payload,h=typeof C=="function"?C.call(ue,_,h):C,h==null)break e;_=Q({},_,h);break e;case 2:wl=!0}}h=s.callback,h!==null&&(e.flags|=64,g&&(e.flags|=8192),g=n.callbacks,g===null?n.callbacks=[h]:g.push(h))}else g={lane:h,tag:s.tag,payload:s.payload,callback:s.callback,next:null},b===null?(x=b=g,f=_):b=b.next=g,i|=h;if(s=s.next,s===null){if(s=n.shared.pending,s===null)break;g=s,s=g.next,g.next=null,n.lastBaseUpdate=g,n.shared.pending=null}}while(!0);b===null&&(f=_),n.baseState=f,n.firstBaseUpdate=x,n.lastBaseUpdate=b,u===null&&(n.shared.lanes=0),Xl|=i,e.lanes=i,e.memoizedState=_}}function mr(e,t){if(typeof e!="function")throw Error(r(191,e));e.call(t)}function hr(e,t){var l=e.callbacks;if(l!==null)for(e.callbacks=null,e=0;e<l.length;e++)mr(l[e],t)}var Hl=Kt(null),Ju=Kt(0);function vr(e,t){e=Sl,Ce(Ju,e),Ce(Hl,t),Sl=e|t.baseLanes}function Zc(){Ce(Ju,Sl),Ce(Hl,Hl.current)}function Kc(){Sl=Ju.current,et(Hl),et(Ju)}var at=Kt(null),st=null;function ql(e){var t=e.alternate;Ce(nt,nt.current&1),Ce(at,e),st===null&&(t===null||Hl.current!==null||t.memoizedState!==null)&&(st=e)}function Jc(e){Ce(nt,nt.current),Ce(at,e),st===null&&(st=e)}function xr(e){e.tag===22?(Ce(nt,nt.current),Ce(at,e),st===null&&(st=e)):Bl()}function Bl(){Ce(nt,nt.current),Ce(at,at.current)}function _t(e){et(at),st===e&&(st=null),et(nt)}var nt=Kt(0);function Bn(e,t){Ce(at,at.current),Ce(nt,t)}function kc(e){et(nt),et(at),st===e&&(st=null)}function ku(e){for(var t=e;t!==null;){if(t.tag===13){var l=t.memoizedState;if(l!==null&&(l=l.dehydrated,l===null||yf(l)||gf(l)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!=="independent"){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var yl=0,ne=null,Oe=null,Ke=null,$u=!1,Va=!1,ha=!1,Fu=0,Yn=0,La=null,q1=0;function Ge(){throw Error(r(321))}function $c(e,t){if(t===null)return!1;for(var l=0;l<t.length&&l<e.length;l++)if(!zt(e[l],t[l]))return!1;return!0}function Fc(e,t,l,a,n,u){return yl=u,ne=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,B.H=e===null||e.memoizedState===null?Pr:ed,ha=!1,u=l(a,n),ha=!1,Va&&(u=gr(t,l,a,n)),yr(e),u}function yr(e){B.H=ai;var t=Oe!==null&&Oe.next!==null;if(yl=0,Ke=Oe=ne=null,$u=!1,Yn=0,La=null,t)throw Error(r(300));e===null||Je||(e=e.dependencies,e!==null&&Gu(e)&&(Je=!0))}function gr(e,t,l,a){ne=e;var n=0;do{if(Va&&(La=null),Yn=0,Va=!1,25<=n)throw Error(r(301));if(n+=1,Ke=Oe=null,e.updateQueue!=null){var u=e.updateQueue;u.lastEffect=null,u.events=null,u.stores=null,u.memoCache!=null&&(u.memoCache.index=0)}B.H=Z1,u=t(l,a)}while(Va);return u}function B1(){var e=B.H,t=e.useState()[0];return t=typeof t.then=="function"?Gn(t):t,e=e.useState()[0],(Oe!==null?Oe.memoizedState:null)!==e&&(ne.flags|=1024),t}function Wc(){var e=Fu!==0;return Fu=0,e}function Ic(e,t,l){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l}function Pc(e){if($u){for(e=e.memoizedState;e!==null;){var t=e.queue;t!==null&&(t.pending=null),e=e.next}$u=!1}yl=0,Ke=Oe=ne=null,Va=!1,Yn=Fu=0,La=null}function ot(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Ke===null?ne.memoizedState=Ke=e:Ke=Ke.next=e,Ke}function Xe(){if(Oe===null){var e=ne.alternate;e=e!==null?e.memoizedState:null}else e=Oe.next;var t=Ke===null?ne.memoizedState:Ke.next;if(t!==null)Ke=t,Oe=e;else{if(e===null)throw ne.alternate===null?Error(r(467)):Error(r(310));Oe=e,e={memoizedState:Oe.memoizedState,baseState:Oe.baseState,baseQueue:Oe.baseQueue,queue:Oe.queue,next:null},Ke===null?ne.memoizedState=Ke=e:Ke=Ke.next=e}return Ke}function Wu(){return{lastEffect:null,events:null,stores:null,memoCache:null}}function Gn(e){var t=Yn;return Yn+=1,La===null&&(La=[]),e=sr(La,e,t),t=ne,(Ke===null?t.memoizedState:Ke.next)===null&&(t=t.alternate,B.H=t===null||t.memoizedState===null?Pr:ed),e}function Iu(e){if(e!==null&&typeof e=="object"){if(typeof e.then=="function")return Gn(e);if(e.$$typeof===E)return;if(e.$$typeof===je)return lt(e)}throw Error(r(438,String(e)))}function es(e){var t=null,l=ne.updateQueue;if(l!==null&&(t=l.memoCache),t==null){var a=ne.alternate;a!==null&&(a=a.updateQueue,a!==null&&(a=a.memoCache,a!=null&&(t={data:a.data.map(function(n){return n.slice()}),index:0})))}if(t==null&&(t={data:[],index:0}),l===null&&(l=Wu(),ne.updateQueue=l),l.memoCache=t,l=t.data[t.index],l===void 0)for(l=t.data[t.index]=Array(e),a=0;a<e;a++)l[a]=il;return t.index++,l}function gl(e,t){return typeof t=="function"?t(e):t}function Pu(e){var t=Xe();return ts(t,Oe,e)}function ts(e,t,l){var a=e.queue;if(a===null)throw Error(r(311));a.lastRenderedReducer=l;var n=e.baseQueue,u=a.pending;if(u!==null){if(n!==null){var i=n.next;n.next=u.next,u.next=i}t.baseQueue=n=u,a.pending=null}if(u=e.baseState,n===null)e.memoizedState=u;else{t=n.next;var s=i=null,f=null,x=t,b=!1;do{var _=x.lane&-536870913;if(_!==x.lane?(xe&_)===_:(yl&_)===_){var h=x.revertLane;if(h===0)f!==null&&(f=f.next={lane:0,revertLane:0,gesture:null,action:x.action,hasEagerState:x.hasEagerState,eagerState:x.eagerState,next:null}),_===fa&&(b=!0);else if((yl&h)===h){x=x.next,h===fa&&(b=!0);continue}else _={lane:0,revertLane:x.revertLane,gesture:null,action:x.action,hasEagerState:x.hasEagerState,eagerState:x.eagerState,next:null},f===null?(s=f=_,i=u):f=f.next=_,ne.lanes|=h,Xl|=h;_=x.action,ha&&l(u,_),u=x.hasEagerState?x.eagerState:l(u,_)}else h={lane:_,revertLane:x.revertLane,gesture:x.gesture,action:x.action,hasEagerState:x.hasEagerState,eagerState:x.eagerState,next:null},f===null?(s=f=h,i=u):f=f.next=h,ne.lanes|=_,Xl|=_;x=x.next}while(x!==null&&x!==t);if(f===null?i=u:f.next=s,!zt(u,e.memoizedState)&&(Je=!0,b&&(l=Ga,l!==null)))throw l;e.memoizedState=u,e.baseState=i,e.baseQueue=f,a.lastRenderedState=u}return n===null&&(a.lanes=0),[e.memoizedState,a.dispatch]}function ls(e){var t=Xe(),l=t.queue;if(l===null)throw Error(r(311));l.lastRenderedReducer=e;var a=l.dispatch,n=l.pending,u=t.memoizedState;if(n!==null){l.pending=null;var i=n=n.next;do u=e(u,i.action),i=i.next;while(i!==n);zt(u,t.memoizedState)||(Je=!0),t.memoizedState=u,t.baseQueue===null&&(t.baseState=u),l.lastRenderedState=u}return[u,a]}function br(e,t,l){var a=ne,n=Xe(),u=oe;if(u){if(l===void 0)throw Error(r(407));l=l()}else l=t();var i=!zt((Oe||n).memoizedState,l);if(i&&(n.memoizedState=l,Je=!0),n=n.queue,us(Nr.bind(null,a,n,e),[e]),e=n.getSnapshot!==t||i||Ke!==null&&(Ke.memoizedState.tag&1)!==0,Za(e?9:8,{destroy:void 0},Sr.bind(null,a,n,l,t),null),e){if(a.flags|=2048,Me===null)throw Error(r(349));u||(yl&127)!==0||pr(a,t,l)}return l}function pr(e,t,l){e.flags|=16384,e={getSnapshot:t,value:l},t=ne.updateQueue,t===null?(t=Wu(),ne.updateQueue=t,t.stores=[e]):(l=t.stores,l===null?t.stores=[e]:l.push(e))}function Sr(e,t,l,a){t.value=l,t.getSnapshot=a,zr(t)&&_r(e)}function Nr(e,t,l){return l(function(){zr(t)&&_r(e)})}function zr(e){var t=e.getSnapshot;e=e.value;try{var l=t();return!zt(e,l)}catch{return!0}}function _r(e){var t=aa(e,2);t!==null&>(t,e,2)}function as(e){var t=ot();if(typeof e=="function"){var l=e;if(e=l(),ha){Tl(!0);try{l()}finally{Tl(!1)}}}return t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:gl,lastRenderedState:e},t}function Tr(e,t,l,a){return e.baseState=l,ts(e,Oe,typeof a=="function"?a:gl)}function Y1(e,t,l,a,n){if(li(e))throw Error(r(485));if(e=t.action,e!==null){var u={payload:n,action:e,next:null,isTransition:!0,status:"pending",value:null,reason:null,listeners:[],then:function(i){u.listeners.push(i)}};B.T!==null?l(!0):u.isTransition=!1,a(u),l=t.pending,l===null?(u.next=t.pending=u,jr(t,u)):(u.next=l.next,t.pending=l.next=u)}}function jr(e,t){var l=t.action,a=t.payload,n=e.state;if(t.isTransition){var u=B.T,i={};i.types=u!==null?u.types:null,B.T=i;try{var s=l(n,a),f=B.S;f!==null&&f(i,s),Er(e,t,s)}catch(x){ns(e,t,x)}finally{u!==null&&i.types!==null&&(u.types=i.types),B.T=u}}else try{u=l(n,a),Er(e,t,u)}catch(x){ns(e,t,x)}}function Er(e,t,l){l!==null&&typeof l=="object"&&typeof l.then=="function"?l.then(function(a){Or(e,t,a)},function(a){return ns(e,t,a)}):Or(e,t,l)}function Or(e,t,l){t.status="fulfilled",t.value=l,Ar(t),e.state=l,t=e.pending,t!==null&&(l=t.next,l===t?e.pending=null:(l=l.next,t.next=l,jr(e,l)))}function ns(e,t,l){var a=e.pending;if(e.pending=null,a!==null){a=a.next;do t.status="rejected",t.reason=l,Ar(t),t=t.next;while(t!==a)}e.action=null}function Ar(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}function Mr(e,t){return t}function Dr(e,t){if(oe){var l=Me.formState;if(l!==null){e:{var a=ne;if(oe){if(we){t:{for(var n=we,u=Rt;n.nodeType!==8;){if(!u){n=null;break t}if(n=qt(n.nextSibling),n===null){n=null;break t}}u=n.data,n=u==="F!"||u==="F"?n:null}if(n){we=qt(n.nextSibling),a=n.data==="F!";break e}}Ml(a)}a=!1}a&&(t=l[0])}}return l=ot(),l.memoizedState=l.baseState=t,a={pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mr,lastRenderedState:t},l.queue=a,l=Fr.bind(null,ne,a),a.dispatch=l,a=as(!1),u=os.bind(null,ne,!1,a.queue),a=ot(),n={state:t,dispatch:null,action:e,pending:null},a.queue=n,l=Y1.bind(null,ne,n,u,l),n.dispatch=l,a.memoizedState=e,[t,l,!1]}function Cr(e){var t=Xe();return wr(t,Oe,e)}function wr(e,t,l){if(t=ts(e,t,Mr)[0],e=Pu(gl)[0],typeof t=="object"&&t!==null&&typeof t.then=="function")try{var a=Gn(t)}catch(i){throw i===Qa?Vu:i}else a=t;t=Xe();var n=t.queue,u=n.dispatch;return l!==t.memoizedState&&(ne.flags|=2048,Za(9,{destroy:void 0},G1.bind(null,n,l),null)),[a,u,e]}function G1(e,t){e.action=t}function Ur(e){var t=Xe(),l=Oe;if(l!==null)return wr(t,l,e);Xe(),t=t.memoizedState,l=Xe();var a=l.queue.dispatch;return l.memoizedState=e,[t,a,!1]}function Za(e,t,l,a){return e={tag:e,create:l,deps:a,inst:t,next:null},t=ne.updateQueue,t===null&&(t=Wu(),ne.updateQueue=t),l=t.lastEffect,l===null?t.lastEffect=e.next=e:(a=l.next,l.next=e,e.next=a,t.lastEffect=e),e}function Rr(){return Xe().memoizedState}function ei(e,t,l,a){var n=ot();ne.flags|=e,n.memoizedState=Za(1|t,{destroy:void 0},l,a===void 0?null:a)}function ti(e,t,l,a){var n=Xe();a=a===void 0?null:a;var u=n.memoizedState.inst;Oe!==null&&a!==null&&$c(a,Oe.memoizedState.deps)?n.memoizedState=Za(t,u,l,a):(ne.flags|=e,n.memoizedState=Za(1|t,u,l,a))}function Hr(e,t){ei(8390656,8,e,t)}function us(e,t){ti(2048,8,e,t)}function Q1(e){ne.flags|=4;var t=ne.updateQueue;if(t===null)t=Wu(),ne.updateQueue=t,t.events=[e];else{var l=t.events;l===null?t.events=[e]:l.push(e)}}function qr(e){var t=Xe().memoizedState;return Q1({ref:t,nextImpl:e}),function(){if((pe&2)!==0)throw Error(r(440));return t.impl.apply(void 0,arguments)}}function Br(e,t){return ti(4,2,e,t)}function Yr(e,t){return ti(4,4,e,t)}function Gr(e,t){if(typeof t=="function"){e=e();var l=t(e);return function(){typeof l=="function"?l():t(null)}}if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function Qr(e,t,l){l=l!=null?l.concat([e]):null,ti(4,4,Gr.bind(null,t,e),l)}function is(){}function Xr(e,t){var l=Xe();t=t===void 0?null:t;var a=l.memoizedState;return t!==null&&$c(t,a[1])?a[0]:(l.memoizedState=[e,t],e)}function Vr(e,t){var l=Xe();t=t===void 0?null:t;var a=l.memoizedState;if(t!==null&&$c(t,a[1]))return a[0];if(a=e(),ha){Tl(!0);try{e()}finally{Tl(!1)}}return l.memoizedState=[a,t],a}function cs(e,t,l){return l===void 0||(yl&1073741824)!==0&&(xe&261930)===0?e.memoizedState=t:(e.memoizedState=l,e=Pd(),ne.lanes|=e,Xl|=e,l)}function Lr(e,t,l,a){return zt(l,t)?l:Hl.current!==null?(e=cs(e,l,a),zt(e,t)||(Je=!0),e):(yl&106)===0||(yl&1073741824)!==0&&(xe&261930)===0?(Je=!0,e.memoizedState=l):(e=Pd(),ne.lanes|=e,Xl|=e,t)}function Zr(e,t,l,a,n){var u=ee.p;ee.p=u!==0&&8>u?u:8;var i=B.T,s={};s.types=i!==null?i.types:null,B.T=s,os(e,!1,t,l);try{var f=n(),x=B.S;if(x!==null&&x(s,f),f!==null&&typeof f=="object"&&typeof f.then=="function"){var b=H1(f,a);Qn(e,t,b,Ot(e))}else Qn(e,t,a,Ot(e))}catch(_){Qn(e,t,{then:function(){},status:"rejected",reason:_},Ot())}finally{ee.p=u,i!==null&&s.types!==null&&(i.types=s.types),B.T=i}}function X1(){}function ss(e,t,l,a){if(e.tag!==5)throw Error(r(476));var n=Kr(e).queue;Zr(e,n,t,cl,l===null?X1:function(){return Jr(e),l(a)})}function Kr(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:cl,baseState:cl,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:gl,lastRenderedState:cl},next:null};var l={};return t.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:gl,lastRenderedState:l},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Jr(e){var t=Kr(e);t.next===null&&(t=e.alternate.memoizedState),Qn(e,t.next.queue,{},Ot())}function fs(){return lt(rn)}function kr(){return Xe().memoizedState}function $r(){return Xe().memoizedState}function V1(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var l=Ot();e=Ul(l);var a=Rl(t,e,l);a!==null&&(gt(a,t,l),Rn(a,t,l)),t={cache:qc()},e.payload=t;return}t=t.return}}function L1(e,t,l){var a=Ot();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},li(e)?Wr(t,l):(l=Oc(e,t,l,a),l!==null&&(gt(l,e,a),Ir(l,t,a)))}function Fr(e,t,l){var a=Ot();Qn(e,t,l,a)}function Qn(e,t,l,a){var n={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null};if(li(e))Wr(t,n);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var i=t.lastRenderedState,s=u(i,l);if(n.hasEagerState=!0,n.eagerState=s,zt(s,i))return wu(e,t,n,0),Me===null&&Cu(),!1}catch{}finally{}if(l=Oc(e,t,n,a),l!==null)return gt(l,e,a),Ir(l,t,a),!0}return!1}function os(e,t,l,a){if(a={lane:2,revertLane:ef(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},li(e)){if(t)throw Error(r(479))}else t=Oc(e,l,a,2),t!==null&>(t,e,2)}function li(e){var t=e.alternate;return e===ne||t!==null&&t===ne}function Wr(e,t){Va=$u=!0;var l=e.pending;l===null?t.next=t:(t.next=l.next,l.next=t),e.pending=t}function Ir(e,t,l){if((l&4194048)!==0){var a=t.lanes;a&=e.pendingLanes,l|=a,t.lanes=l,If(e,l)}}var ai={readContext:lt,use:Iu,useCallback:Ge,useContext:Ge,useEffect:Ge,useImperativeHandle:Ge,useLayoutEffect:Ge,useInsertionEffect:Ge,useMemo:Ge,useReducer:Ge,useRef:Ge,useState:Ge,useDebugValue:Ge,useDeferredValue:Ge,useTransition:Ge,useSyncExternalStore:Ge,useId:Ge,useHostTransitionStatus:Ge,useFormState:Ge,useActionState:Ge,useOptimistic:Ge,useMemoCache:Ge,useCacheRefresh:Ge,useEffectEvent:Ge},Pr={readContext:lt,use:Iu,useCallback:function(e,t){return ot().memoizedState=[e,t===void 0?null:t],e},useContext:lt,useEffect:Hr,useImperativeHandle:function(e,t,l){l=l!=null?l.concat([e]):null,ei(4194308,4,Gr.bind(null,t,e),l)},useLayoutEffect:function(e,t){return ei(4194308,4,e,t)},useInsertionEffect:function(e,t){ei(4,2,e,t)},useMemo:function(e,t){var l=ot();t=t===void 0?null:t;var a=e();if(ha){Tl(!0);try{e()}finally{Tl(!1)}}return l.memoizedState=[a,t],a},useReducer:function(e,t,l){var a=ot();if(l!==void 0){var n=l(t);if(ha){Tl(!0);try{l(t)}finally{Tl(!1)}}}else n=t;return a.memoizedState=a.baseState=n,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},a.queue=e,e=e.dispatch=L1.bind(null,ne,e),[a.memoizedState,e]},useRef:function(e){var t=ot();return e={current:e},t.memoizedState=e},useState:function(e){e=as(e);var t=e.queue,l=Fr.bind(null,ne,t);return t.dispatch=l,[e.memoizedState,l]},useDebugValue:is,useDeferredValue:function(e,t){var l=ot();return cs(l,e,t)},useTransition:function(){var e=as(!1);return e=Zr.bind(null,ne,e.queue,!0,!1),ot().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,l){var a=ne,n=ot();if(oe){if(l===void 0)throw Error(r(407));l=l()}else{if(l=t(),Me===null)throw Error(r(349));(xe&127)!==0||pr(a,t,l)}n.memoizedState=l;var u={value:l,getSnapshot:t};return n.queue=u,Hr(Nr.bind(null,a,u,e),[e]),a.flags|=2048,Za(9,{destroy:void 0},Sr.bind(null,a,u,l,t),null),l},useId:function(){var e=ot(),t=Me.identifierPrefix;if(oe){var l=Ft,a=$t;l=(a&~(1<<32-St(a)-1)).toString(32)+l,t="_"+t+"R_"+l,l=Fu++,0<l&&(t+="H"+l.toString(32)),t+="_"}else l=q1++,t="_"+t+"r_"+l.toString(32)+"_";return e.memoizedState=t},useHostTransitionStatus:fs,useFormState:Dr,useActionState:Dr,useOptimistic:function(e){var t=ot();t.memoizedState=t.baseState=e;var l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=l,t=os.bind(null,ne,!0,l),l.dispatch=t,[e,t]},useMemoCache:es,useCacheRefresh:function(){return ot().memoizedState=V1.bind(null,ne)},useEffectEvent:function(e){var t=ot(),l={impl:e};return t.memoizedState=l,function(){if((pe&2)!==0)throw Error(r(440));return l.impl.apply(void 0,arguments)}}},ed={readContext:lt,use:Iu,useCallback:Xr,useContext:lt,useEffect:us,useImperativeHandle:Qr,useInsertionEffect:Br,useLayoutEffect:Yr,useMemo:Vr,useReducer:Pu,useRef:Rr,useState:function(){return Pu(gl)},useDebugValue:is,useDeferredValue:function(e,t){var l=Xe();return Lr(l,Oe.memoizedState,e,t)},useTransition:function(){var e=Pu(gl)[0],t=Xe().memoizedState;return[typeof e=="boolean"?e:Gn(e),t]},useSyncExternalStore:br,useId:kr,useHostTransitionStatus:fs,useFormState:Cr,useActionState:Cr,useOptimistic:function(e,t){var l=Xe();return Tr(l,Oe,e,t)},useMemoCache:es,useCacheRefresh:$r,useEffectEvent:qr},Z1={readContext:lt,use:Iu,useCallback:Xr,useContext:lt,useEffect:us,useImperativeHandle:Qr,useInsertionEffect:Br,useLayoutEffect:Yr,useMemo:Vr,useReducer:ls,useRef:Rr,useState:function(){return ls(gl)},useDebugValue:is,useDeferredValue:function(e,t){var l=Xe();return Oe===null?cs(l,e,t):Lr(l,Oe.memoizedState,e,t)},useTransition:function(){var e=ls(gl)[0],t=Xe().memoizedState;return[typeof e=="boolean"?e:Gn(e),t]},useSyncExternalStore:br,useId:kr,useHostTransitionStatus:fs,useFormState:Ur,useActionState:Ur,useOptimistic:function(e,t){var l=Xe();return Oe!==null?Tr(l,Oe,e,t):(l.baseState=e,[e,l.queue.dispatch])},useMemoCache:es,useCacheRefresh:$r,useEffectEvent:qr};function rs(e,t,l,a){t=e.memoizedState,l=l(a,t),l=l==null?t:Q({},t,l),e.memoizedState=l,e.lanes===0&&(e.updateQueue.baseState=l)}var ds={enqueueSetState:function(e,t,l){e=e._reactInternals;var a=Ot(),n=Ul(a);n.payload=t,l!=null&&(n.callback=l),t=Rl(e,n,a),t!==null&&(gt(t,e,a),Rn(t,e,a))},enqueueReplaceState:function(e,t,l){e=e._reactInternals;var a=Ot(),n=Ul(a);n.tag=1,n.payload=t,l!=null&&(n.callback=l),t=Rl(e,n,a),t!==null&&(gt(t,e,a),Rn(t,e,a))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var l=Ot(),a=Ul(l);a.tag=2,t!=null&&(a.callback=t),t=Rl(e,a,l),t!==null&&(gt(t,e,l),Rn(t,e,l))}};function td(e,t,l,a,n,u,i){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(a,u,i):t.prototype&&t.prototype.isPureReactComponent?!En(l,a)||!En(n,u):!0}function ld(e,t,l,a){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(l,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(l,a),t.state!==e&&ds.enqueueReplaceState(t,t.state,null)}function va(e,t){var l=t;if("ref"in t){l={};for(var a in t)a!=="ref"&&(l[a]=t[a])}if(e=e.defaultProps){l===t&&(l=Q({},l));for(var n in e)l[n]===void 0&&(l[n]=e[n])}return l}function ad(e){Du(e)}function nd(e){console.error(e)}function ud(e){Du(e)}function ni(e,t){try{var l=e.onUncaughtError;l(t.value,{componentStack:t.stack})}catch(a){setTimeout(function(){throw a})}}function id(e,t,l){try{var a=e.onCaughtError;a(l.value,{componentStack:l.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(n){setTimeout(function(){throw n})}}function ms(e,t,l){return l=Ul(l),l.tag=3,l.payload={element:null},l.callback=function(){ni(e,t)},l}function cd(e){return e=Ul(e),e.tag=3,e}function sd(e,t,l,a){var n=l.type.getDerivedStateFromError;if(typeof n=="function"){var u=a.value;e.payload=function(){return n(u)},e.callback=function(){id(t,l,a)}}var i=l.stateNode;i!==null&&typeof i.componentDidCatch=="function"&&(e.callback=function(){id(t,l,a),typeof n!="function"&&(Vl===null?Vl=new Set([this]):Vl.add(this));var s=a.stack;this.componentDidCatch(a.value,{componentStack:s!==null?s:""})})}function K1(e,t,l,a,n){if(l.flags|=32768,a!==null&&typeof a=="object"&&typeof a.then=="function"){if(t=l.alternate,t!==null&&ca(t,l,n,!0),l=at.current,l!==null){switch(l.tag){case 31:case 13:case 19:return st===null?Ti():l.alternate===null&&Qe===0&&(Qe=3),l.flags&=-257,l.flags|=65536,l.lanes=n,a===Lu?l.flags|=16384:(t=l.updateQueue,t===null?l.updateQueue=new Set([a]):t.add(a),Ws(e,a,n)),!1;case 22:return l.flags|=65536,a===Lu?l.flags|=16384:(t=l.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([a])},l.updateQueue=t):(l=t.retryQueue,l===null?t.retryQueue=new Set([a]):l.add(a)),Ws(e,a,n)),!1}throw Error(r(435,l.tag))}return Ws(e,a,n),Ti(),!1}if(oe)return t=at.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=n,a!==wc&&(e=Error(r(422),{cause:a}),Mn(Ct(e,l)))):(a!==wc&&(t=Error(r(423),{cause:a}),Mn(Ct(t,l))),e=e.current.alternate,e.flags|=65536,n&=-n,e.lanes|=n,a=Ct(a,l),n=ms(e.stateNode,a,n),Vc(e,n),Qe!==4&&(Qe=2)),!1;var u=Error(r(520),{cause:a});if(u=Ct(u,l),$n===null?$n=[u]:$n.push(u),Qe!==4&&(Qe=2),t===null)return!0;a=Ct(a,l),l=t;do{switch(l.tag){case 3:return l.flags|=65536,e=n&-n,l.lanes|=e,e=ms(l.stateNode,a,e),Vc(l,e),!1;case 1:if(t=l.type,u=l.stateNode,(l.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||u!==null&&typeof u.componentDidCatch=="function"&&(Vl===null||!Vl.has(u))))return l.flags|=65536,n&=-n,l.lanes|=n,n=cd(n),sd(n,e,l,a),Vc(l,n),!1;break;case 22:if(l.memoizedState!==null)return l.flags|=65536,!1}l=l.return}while(l!==null);return!1}var hs=Error(r(461)),Je=!1;function $e(e,t,l,a){t.child=e===null?dr(t,null,l,a):ma(t,e.child,l,a)}function fd(e,t,l,a,n){l=l.render;var u=t.ref;if("ref"in a){var i={};for(var s in a)s!=="ref"&&(i[s]=a[s])}else i=a;return sa(t),a=Fc(e,t,l,i,u,n),s=Wc(),e!==null&&!Je?(Ic(e,t,n),bl(e,t,n)):(oe&&s&&qu(t),t.flags|=1,$e(e,t,a,n),t.child)}function od(e,t,l,a,n){if(e===null){var u=l.type;return typeof u=="function"&&!Ac(u)&&u.defaultProps===void 0&&l.compare===null?(t.tag=15,t.type=u,rd(e,t,u,a,n)):(e=Ru(l.type,null,a,t,t.mode,n),e.ref=t.ref,e.return=t,t.child=e)}if(u=e.child,!Ns(e,n)){var i=u.memoizedProps;if(l=l.compare,l=l!==null?l:En,l(i,a)&&e.ref===t.ref)return bl(e,t,n)}return t.flags|=1,e=ml(u,a),e.ref=t.ref,e.return=t,t.child=e}function rd(e,t,l,a,n){if(e!==null){var u=e.memoizedProps;if(En(u,a)&&e.ref===t.ref)if(Je=!1,t.pendingProps=a=u,Ns(e,n))(e.flags&131072)!==0&&(Je=!0);else return t.lanes=e.lanes,bl(e,t,n)}return vs(e,t,l,a,n)}function dd(e,t,l,a){var n=a.children,u=e!==null?e.memoizedState:null;if(e===null&&t.stateNode===null&&(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),a.mode==="hidden"){if((t.flags&128)!==0){if(u=u!==null?u.baseLanes|l:l,e!==null){for(a=t.child=e.child,n=0;a!==null;)n=n|a.lanes|a.childLanes,a=a.sibling;a=n&~u}else a=0,t.child=null;return md(e,t,u,l,a)}if((l&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&Xu(t,u!==null?u.cachePool:null),u!==null?vr(t,u):Zc(),xr(t);else return a=t.lanes=536870912,md(e,t,u!==null?u.baseLanes|l:l,l,a)}else u!==null?(Xu(t,u.cachePool),vr(t,u),Bl(),t.memoizedState=null):(e!==null&&Xu(t,null),Zc(),Bl());return $e(e,t,n,l),t.child}function Xn(e,t){return e!==null&&e.tag===22||t.stateNode!==null||(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),t.sibling}function md(e,t,l,a,n){var u=Yc();return u=u===null?null:{parent:Ze._currentValue,pool:u},t.memoizedState={baseLanes:l,cachePool:u},e!==null&&Xu(t,null),Zc(),xr(t),e!==null&&ca(e,t,a,!0),t.childLanes=n,null}function ui(e,t){return t=ii({mode:t.mode,children:t.children},e.mode),t.ref=e.ref,e.child=t,t.return=e,t}function hd(e,t,l){return ma(t,e.child,null,l),e=ui(t,t.pendingProps),e.flags|=2,_t(t),t.memoizedState=null,e}function J1(e,t,l){var a=t.pendingProps,n=(t.flags&128)!==0;if(t.flags&=-129,e===null){if(oe){if(a.mode==="hidden")return e=ui(t,a),t.lanes=536870912,e.memoizedState={baseLanes:0,cachePool:null},Xn(null,e);if(Jc(t),(e=we)?(e=G0(e,Rt),e=e!==null&&e.data==="&"?e:null,e!==null&&(t.memoizedState={dehydrated:e,treeContext:Ol!==null?{id:$t,overflow:Ft}:null,retryLane:536870912,hydrationErrors:null},l=Wo(e),l.return=t,t.child=l,We=t,we=null)):e=null,e===null)throw Ml(t);return t.lanes=536870912,null}return ui(t,a)}var u=e.memoizedState;if(u!==null){var i=u.dehydrated;if(Jc(t),n)if(t.flags&256)t.flags&=-257,t=hd(e,t,l);else if(t.memoizedState!==null)t.child=e.child,t.flags|=128,t=null;else throw Error(r(558));else if(Je||ca(e,t,l,!1),n=(l&e.childLanes)!==0,Je||n){if(Hl.current===null){if(a=Me,a!==null&&(i=Pf(a,l),i!==0&&i!==u.retryLane))throw u.retryLane=i,aa(e,i),gt(a,e,i),hs;Ti()}t=hd(e,t,l)}else e=u.treeContext,we=qt(i.nextSibling),We=t,oe=!0,Al=null,Rt=!1,e!==null&&er(t,e),t=ui(t,a),t.flags|=134221824;return t}return e=ml(e.child,{mode:a.mode,children:a.children}),e.ref=t.ref,t.child=e,e.return=t,e}function Ka(e,t){var l=t.ref;if(l===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof l!="function"&&typeof l!="object")throw Error(r(284));(e===null||e.ref!==l)&&(t.flags|=4194816)}}function vs(e,t,l,a,n){return sa(t),l=Fc(e,t,l,a,void 0,n),a=Wc(),e!==null&&!Je?(Ic(e,t,n),bl(e,t,n)):(oe&&a&&qu(t),t.flags|=1,$e(e,t,l,n),t.child)}function vd(e,t,l,a,n,u){return sa(t),t.updateQueue=null,l=gr(t,a,l,n),yr(e),a=Wc(),e!==null&&!Je?(Ic(e,t,u),bl(e,t,u)):(oe&&a&&qu(t),t.flags|=1,$e(e,t,l,u),t.child)}function xd(e,t,l,a,n){if(sa(t),t.stateNode===null){var u=Ha,i=l.contextType;typeof i=="object"&&i!==null&&(u=lt(i)),u=new l(a,u),t.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,u.updater=ds,t.stateNode=u,u._reactInternals=t,u=t.stateNode,u.props=a,u.state=t.memoizedState,u.refs={},Qc(t),i=l.contextType,u.context=typeof i=="object"&&i!==null?lt(i):Ha,u.state=t.memoizedState,i=l.getDerivedStateFromProps,typeof i=="function"&&(rs(t,l,i,a),u.state=t.memoizedState),typeof l.getDerivedStateFromProps=="function"||typeof u.getSnapshotBeforeUpdate=="function"||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(i=u.state,typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount(),i!==u.state&&ds.enqueueReplaceState(u,u.state,null),qn(t,a,u,n),Hn(),u.state=t.memoizedState),typeof u.componentDidMount=="function"&&(t.flags|=4194308),a=!0}else if(e===null){u=t.stateNode;var s=t.memoizedProps,f=va(l,s);u.props=f;var x=u.context,b=l.contextType;i=Ha,typeof b=="object"&&b!==null&&(i=lt(b));var _=l.getDerivedStateFromProps;b=typeof _=="function"||typeof u.getSnapshotBeforeUpdate=="function",s=t.pendingProps!==s,b||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(s||x!==i)&&ld(t,u,a,i),wl=!1;var h=t.memoizedState;u.state=h,qn(t,a,u,n),Hn(),x=t.memoizedState,s||h!==x||wl?(typeof _=="function"&&(rs(t,l,_,a),x=t.memoizedState),(f=wl||td(t,l,f,a,h,x,i))?(b||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount()),typeof u.componentDidMount=="function"&&(t.flags|=4194308)):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=a,t.memoizedState=x),u.props=a,u.state=x,u.context=i,a=f):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{u=t.stateNode,Xc(e,t),i=t.memoizedProps,b=va(l,i),u.props=b,_=t.pendingProps,h=u.context,x=l.contextType,f=Ha,typeof x=="object"&&x!==null&&(f=lt(x)),s=l.getDerivedStateFromProps,(x=typeof s=="function"||typeof u.getSnapshotBeforeUpdate=="function")||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(i!==_||h!==f)&&ld(t,u,a,f),wl=!1,h=t.memoizedState,u.state=h,qn(t,a,u,n),Hn();var g=t.memoizedState;i!==_||h!==g||wl||e!==null&&e.dependencies!==null&&Gu(e.dependencies)?(typeof s=="function"&&(rs(t,l,s,a),g=t.memoizedState),(b=wl||td(t,l,b,a,h,g,f)||e!==null&&e.dependencies!==null&&Gu(e.dependencies))?(x||typeof u.UNSAFE_componentWillUpdate!="function"&&typeof u.componentWillUpdate!="function"||(typeof u.componentWillUpdate=="function"&&u.componentWillUpdate(a,g,f),typeof u.UNSAFE_componentWillUpdate=="function"&&u.UNSAFE_componentWillUpdate(a,g,f)),typeof u.componentDidUpdate=="function"&&(t.flags|=4),typeof u.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof u.componentDidUpdate!="function"||i===e.memoizedProps&&h===e.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&h===e.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=g),u.props=a,u.state=g,u.context=f,a=b):(typeof u.componentDidUpdate!="function"||i===e.memoizedProps&&h===e.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&h===e.memoizedState||(t.flags|=1024),a=!1)}return u=a,Ka(e,t),a=(t.flags&128)!==0,u||a?(u=t.stateNode,l=a&&typeof l.getDerivedStateFromError!="function"?null:u.render(),t.flags|=1,e!==null&&a?(t.child=ma(t,e.child,null,n),t.child=ma(t,null,l,n)):$e(e,t,l,n),t.memoizedState=u.state,e=t.child):e=bl(e,t,n),e}function yd(e,t,l,a){return ua(),t.flags|=256,$e(e,t,l,a),t.child}var xs={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function ys(e){return{baseLanes:e,cachePool:ir()}}function gs(e,t,l){return e=e!==null?e.childLanes&~l:0,t&&(e|=Et),e}function gd(e,t,l){var a=t.pendingProps,n=!1,u=(t.flags&128)!==0,i;if((i=u)||(i=e!==null&&e.memoizedState===null?!1:(nt.current&2)!==0),i&&(n=!0,t.flags&=-129),i=(t.flags&32)!==0,t.flags&=-33,e===null){if(oe){if(n?ql(t):Bl(),(e=we)?(e=G0(e,Rt),e=e!==null&&e.data!=="&"?e:null,e!==null&&(t.memoizedState={dehydrated:e,treeContext:Ol!==null?{id:$t,overflow:Ft}:null,retryLane:536870912,hydrationErrors:null},l=Wo(e),l.return=t,t.child=l,We=t,we=null)):e=null,e===null)throw Ml(t);return gf(e)?t.lanes=32:t.lanes=536870912,null}return u=a.children,a=a.fallback,n?(Bl(),n=t.mode,u=ii({mode:"hidden",children:u},n),a=na(a,n,l,null),u.return=t,a.return=t,u.sibling=a,t.child=u,a=t.child,a.memoizedState=ys(l),a.childLanes=gs(e,i,l),t.memoizedState=xs,Xn(null,a)):(ql(t),bs(t,u))}var s=e.memoizedState;if(s!==null){var f=s.dehydrated;if(f!==null)return k1(e,t,u,i,a,f,s,l)}return n?(Bl(),n=a.fallback,u=t.mode,s=e.child,f=s.sibling,a=ml(s,{mode:"hidden",children:a.children}),a.subtreeFlags=s.subtreeFlags&1206910976,f!==null?n=ml(f,n):(n=na(n,u,l,null),n.flags|=2),n.return=t,a.return=t,a.sibling=n,t.child=a,Xn(null,a),a=t.child,n=e.child.memoizedState,n===null?n=ys(l):(u=n.cachePool,u!==null?(s=Ze._currentValue,u=u.parent!==s?{parent:s,pool:s}:u):u=ir(),n={baseLanes:n.baseLanes|l,cachePool:u}),a.memoizedState=n,a.childLanes=gs(e,i,l),t.memoizedState=xs,Xn(e.child,a)):(ql(t),l=e.child,e=l.sibling,l=ml(l,{mode:"visible",children:a.children}),l.return=t,l.sibling=null,e!==null&&(i=t.deletions,i===null?(t.deletions=[e],t.flags|=16):i.push(e)),t.child=l,t.memoizedState=null,l)}function bs(e,t){return t=ii({mode:"visible",children:t},e.mode),t.return=e,e.child=t}function ii(e,t){return e=ht(22,e,null,t),e.lanes=0,e}function ci(e,t,l){return ma(t,e.child,null,l),e=bs(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function k1(e,t,l,a,n,u,i,s){if(l)return t.flags&256?(ql(t),t.flags&=-257,ci(e,t,s)):t.memoizedState!==null?(Bl(),t.child=e.child,t.flags|=128,null):(Bl(),u=n.fallback,i=t.mode,n=ii({mode:"visible",children:n.children},i),u=na(u,i,s,null),u.flags|=2,n.return=t,u.return=t,n.sibling=u,t.child=n,ma(t,e.child,null,s),n=t.child,n.memoizedState=ys(s),n.childLanes=gs(e,a,s),t.memoizedState=xs,Xn(null,n));if(ql(t),gf(u)){if(a=u.nextSibling&&u.nextSibling.dataset,a)var f=a.dgst;return a=f,a!==""&&(n=Error(r(419)),n.stack="",n.digest=a,Mn({value:n,source:null,stack:null})),ci(e,t,s)}if(Je||ca(e,t,s,!1),a=(s&e.childLanes)!==0,Je||a){if(Hl.current!==null)return ci(e,t,s);if(a=Me,a!==null&&(n=Pf(a,s),n!==0&&n!==i.retryLane))throw i.retryLane=n,aa(e,n),gt(a,e,n),hs;return yf(u)||Ti(),ci(e,t,s)}return yf(u)?(t.flags|=192,t.child=e.child,null):(e=i.treeContext,we=qt(u.nextSibling),We=t,oe=!0,Al=null,Rt=!1,e!==null&&er(t,e),t=bs(t,n.children),t.flags|=134221824,t)}function bd(e,t,l){e.lanes|=t;var a=e.alternate;a!==null&&(a.lanes|=t),Yu(e.return,t,l)}function pd(e){for(var t=null;e!==null;){var l=e.alternate;l!==null&&ku(l)===null&&(t=e),e=e.sibling}return t}function si(e,t,l,a,n,u){var i=e.memoizedState;i===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:l,tailMode:n,treeForkCount:u}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=a,i.tail=l,i.tailMode=n,i.treeForkCount=u)}function ps(e){var t=e.child;for(e.child=null;t!==null;){var l=t.sibling;t.sibling=e.child,e.child=t,t=l}}function Ss(e,t,l){var a=t.pendingProps,n=a.revealOrder,u=a.tail;a=a.children;var i=nt.current;if(t.flags&128)return Bn(t,i),null;var s=(i&2)!==0;if(s?(i=i&1|2,t.flags|=128):i&=1,Bn(t,i),n==="backwards"&&e!==null?(ps(e),$e(e,t,a,l),ps(e)):$e(e,t,a,l),a=oe?An:0,!s&&e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&bd(e,l,t);else if(e.tag===19)bd(e,l,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}switch(n){case"backwards":l=pd(t.child),l===null?(n=t.child,t.child=null):(n=l.sibling,l.sibling=null,ps(t)),si(t,!0,n,null,u,a);break;case"unstable_legacy-backwards":for(l=null,n=t.child,t.child=null;n!==null;){if(e=n.alternate,e!==null&&ku(e)===null){t.child=n;break}e=n.sibling,n.sibling=l,l=n,n=e}si(t,!0,l,null,u,a);break;case"together":si(t,!1,null,null,void 0,a);break;case"independent":t.memoizedState=null;break;default:l=pd(t.child),l===null?(n=t.child,t.child=null):(n=l.sibling,l.sibling=null),si(t,!1,n,l,u,a)}return t.child}function Sd(e,t,l){var a=t.pendingProps;return Dl(t,t.type,a.value),$e(e,t,a.children,l),t.child}function bl(e,t,l){if(e!==null&&(t.dependencies=e.dependencies),Xl|=t.lanes,(l&t.childLanes)===0)if(e!==null){if(ca(e,t,l,!1),(l&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(r(153));if(t.child!==null){for(e=t.child,l=ml(e,e.pendingProps),t.child=l,l.return=t;e.sibling!==null;)e=e.sibling,l=l.sibling=ml(e,e.pendingProps),l.return=t;l.sibling=null}return t.child}function Ns(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&Gu(e)))}function $1(e,t,l){switch(t.tag){case 3:mu(t,t.stateNode.containerInfo),Dl(t,Ze,e.memoizedState.cache),ua();break;case 27:case 5:$i(t);break;case 4:mu(t,t.stateNode.containerInfo);break;case 10:Dl(t,t.type,t.memoizedProps.value);break;case 31:if(t.memoizedState!==null)return t.flags|=128,Jc(t),null;break;case 13:var a=t.memoizedState;if(a!==null){if(a.dehydrated!==null)return ql(t),t.flags|=128,null;a=ca(e,t,l,!1);var n=t.child.childLanes;return a||(l&n)!==0?gd(e,t,l):(ql(t),e=bl(e,t,l),e!==null?e.sibling:null)}ql(t);break;case 19:if(t.flags&128)return Ss(e,t,l);if(n=(e.flags&128)!==0,a=(l&t.childLanes)!==0,a||(ca(e,t,l,!1),a=(l&t.childLanes)!==0),n){if(a)return Ss(e,t,l);t.flags|=128}if(n=t.memoizedState,n!==null&&(n.rendering=null,n.tail=null,n.lastEffect=null),Bn(t,nt.current),a)break;return null;case 22:return t.lanes=0,dd(e,t,l,t.pendingProps);case 24:Dl(t,Ze,e.memoizedState.cache)}return bl(e,t,l)}function Nd(e,t,l){if(e!==null)if(e.memoizedProps!==t.pendingProps)Je=!0;else{if(!Ns(e,l)&&(t.flags&128)===0)return Je=!1,$1(e,t,l);Je=(e.flags&131072)!==0}else Je=!1,oe&&(t.flags&1048576)!==0&&Po(t,An,t.index);switch(t.lanes=0,t.tag){case 16:e:{var a=t.pendingProps;if(e=ra(t.elementType),t.type=e,typeof e=="function")Ac(e)?(a=va(e,a),t.tag=1,t=xd(null,t,e,a,l)):(t.tag=0,t=vs(null,t,e,a,l));else{if(e!=null){var n=e.$$typeof;if(n===A){t.tag=11,t=fd(null,t,e,a,l);break e}else if(n===de){t.tag=14,t=od(null,t,e,a,l);break e}else if(n===je){t.tag=10,t.type=e,t=Sd(null,t,l);break e}}throw t=ae(e)||e,Error(r(306,t,""))}}return t;case 0:return vs(e,t,t.type,t.pendingProps,l);case 1:return a=t.type,n=va(a,t.pendingProps),xd(e,t,a,n,l);case 3:e:{if(mu(t,t.stateNode.containerInfo),e===null)throw Error(r(387));a=t.pendingProps;var u=t.memoizedState;n=u.element,Xc(e,t),qn(t,a,null,l);var i=t.memoizedState;if(a=i.cache,Dl(t,Ze,a),a!==u.cache&&Hc(t,[Ze],l,!0),Hn(),a=i.element,u.isDehydrated)if(u={element:a,isDehydrated:!1,cache:i.cache},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){t=yd(e,t,a,l);break e}else if(a!==n){n=Ct(Error(r(424)),t),Mn(n),t=yd(e,t,a,l);break e}else{switch(e=t.stateNode.containerInfo,e.nodeType){case 9:e=e.body;break;default:e=e.nodeName==="HTML"?e.ownerDocument.body:e}for(we=qt(e.firstChild),We=t,oe=!0,Al=null,Rt=!0,l=dr(t,null,a,l),t.child=l;l;)l.flags=l.flags&-3|134221824,l=l.sibling}else{if(ua(),a===n){t=bl(e,t,l);break e}$e(e,t,a,l)}t=t.child}return t;case 26:return Ka(e,t),e===null?(l=J0(t.type,null,t.pendingProps,null))?t.memoizedState=l:oe||(t.stateNode=j0(t.type,t.pendingProps,zl.current,t)):t.memoizedState=J0(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return $i(t),e===null&&oe&&(a=t.stateNode=V0(t.type,t.pendingProps,zl.current),We=t,Rt=!0,n=we,Kl(t.type)?(bf=n,we=qt(a.firstChild)):we=n),$e(e,t,t.pendingProps.children,l),Ka(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&oe&&((n=a=we)&&(a=Vv(a,t.type,t.pendingProps,Rt),a!==null?(t.stateNode=a,We=t,we=qt(a.firstChild),Rt=!1,n=!0):n=!1),n||Ml(t)),$i(t),n=t.type,u=t.pendingProps,i=e!==null?e.memoizedProps:null,a=u.children,of(n,u)?a=null:i!==null&&of(n,i)&&(t.flags|=32),t.memoizedState!==null&&(n=Fc(e,t,B1,null,null,l),rn._currentValue=n),Ka(e,t),$e(e,t,a,l),t.child;case 6:return e===null&&oe&&((e=l=we)&&(l=Lv(l,t.pendingProps,Rt),l!==null?(t.stateNode=l,We=t,we=null,e=!0):e=!1),e||Ml(t)),null;case 13:return gd(e,t,l);case 4:return mu(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=ma(t,null,a,l):$e(e,t,a,l),t.child;case 11:return fd(e,t,t.type,t.pendingProps,l);case 7:return a=t.pendingProps,Ka(e,t),$e(e,t,a,l),t.child;case 8:return $e(e,t,t.pendingProps.children,l),t.child;case 12:return $e(e,t,t.pendingProps.children,l),t.child;case 10:return Sd(e,t,l);case 9:return n=t.type._context,a=t.pendingProps.children,sa(t),n=lt(n),a=a(n),t.flags|=1,$e(e,t,a,l),t.child;case 14:return od(e,t,t.type,t.pendingProps,l);case 15:return rd(e,t,t.type,t.pendingProps,l);case 19:return Ss(e,t,l);case 31:return J1(e,t,l);case 22:return dd(e,t,l,t.pendingProps);case 24:return sa(t),a=lt(Ze),e===null?(n=Yc(),n===null&&(n=Me,u=qc(),n.pooledCache=u,u.refCount++,u!==null&&(n.pooledCacheLanes|=l),n=u),t.memoizedState={parent:a,cache:n},Qc(t),Dl(t,Ze,n)):((e.lanes&l)!==0&&(Xc(e,t),qn(t,null,null,l),Hn()),n=e.memoizedState,u=t.memoizedState,n.parent!==a?(n={parent:a,cache:a},t.memoizedState=n,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=n),Dl(t,Ze,a)):(a=u.cache,Dl(t,Ze,a),a!==n.cache&&Hc(t,[Ze],l,!0))),$e(e,t,t.pendingProps.children,l),t.child;case 30:return t.stateNode===null&&(t.stateNode={autoName:null,paired:null,clones:null,ref:null}),a=t.pendingProps,a.name!=null&&a.name!=="auto"?t.flags|=e===null?18882560:18874368:oe&&qu(t),e!==null&&e.memoizedProps.name!==a.name?t.flags|=4194816:Ka(e,t),$e(e,t,a.children,l),t.child;case 29:throw t.pendingProps}throw Error(r(156,t.tag))}function pl(e){e.flags|=4}function zs(e,t,l,a,n){var u;if((u=(e.mode&32)!==0)&&(u=l===null?W0(t,a):W0(t,a)&&(a.src!==l.src||a.srcSet!==l.srcSet)),u){if(e.flags|=16777216,(n&335544128)===n)if(e.stateNode.complete)e.flags|=8192;else if(a0())e.flags|=8192;else throw da=Lu,Gc}else e.flags&=-16777217}function zd(e,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!I0(t))if(a0())e.flags|=8192;else throw da=Lu,Gc}function fi(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?Ff():536870912,e.lanes|=t,Wa|=t)}function Vn(e,t){if(!oe)switch(e.tailMode){case"visible":break;case"collapsed":for(var l=e.tail,a=null;l!==null;)l.alternate!==null&&(a=l),l=l.sibling;a===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:a.sibling=null;break;default:for(t=e.tail,l=null;t!==null;)t.alternate!==null&&(l=t),t=t.sibling;l===null?e.tail=null:l.sibling=null}}function Ue(e){var t=e.alternate!==null&&e.alternate.child===e.child,l=0,a=0;if(t)for(var n=e.child;n!==null;)l|=n.lanes|n.childLanes,a|=n.subtreeFlags&1206910976,a|=n.flags&1206910976,n.return=e,n=n.sibling;else for(n=e.child;n!==null;)l|=n.lanes|n.childLanes,a|=n.subtreeFlags,a|=n.flags,n.return=e,n=n.sibling;return e.subtreeFlags|=a,e.childLanes=l,t}function F1(e,t,l){var a=t.pendingProps;switch(Cc(t),t.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ue(t),null;case 1:return Ue(t),null;case 3:return l=t.stateNode,a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),xl(Ze),za(),l.pendingContext&&(l.context=l.pendingContext,l.pendingContext=null),(e===null||e.child===null)&&(Ya(t)?pl(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Uc())),Ue(t),null;case 26:var n=t.type,u=t.memoizedState;return e===null?(pl(t),u!==null?(Ue(t),zd(t,u)):(Ue(t),zs(t,n,null,a,l))):u?u!==e.memoizedState?(pl(t),Ue(t),zd(t,u)):(Ue(t),t.flags&=-16777217):(e=e.memoizedProps,e!==a&&pl(t),Ue(t),zs(t,n,e,a,l)),null;case 27:if(hu(t),l=zl.current,n=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==a&&pl(t);else{if(!a){if(t.stateNode===null)throw Error(r(166));return Ue(t),t.subtreeFlags&=-33554433,null}e=Jt.current,Ya(t)?tr(t):(e=V0(n,a,l),t.stateNode=e,pl(t))}return Ue(t),t.subtreeFlags&=-33554433,null;case 5:if(hu(t),n=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==a&&pl(t);else{if(!a){if(t.stateNode===null)throw Error(r(166));return Ue(t),t.subtreeFlags&=-33554433,null}if(u=Jt.current,Ya(t))tr(t);else{var i=eu(zl.current);switch(u){case 1:u=i.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:u=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":u=i.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":u=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":u=i.createElement("div"),u.innerHTML="<script><\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?i.createElement("select",{is:a.is}):i.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?i.createElement(n,{is:a.is}):i.createElement(n)}}u[tt]=t,u[mt]=a;e:for(i=t.child;i!==null;){if(i.tag===5||i.tag===6)u.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===t)break e;for(;i.sibling===null;){if(i.return===null||i.return===t)break e;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=u;e:switch(it(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}a&&pl(t)}}return Ue(t),t.subtreeFlags&=-33554433,zs(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,l),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==a&&pl(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(r(166));if(e=zl.current,Ya(t)){if(e=t.stateNode,l=t.memoizedProps,a=null,n=We,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}e[tt]=t,e=!!(e.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||N0(e.nodeValue,l)),e||Ml(t,!0)}else e=eu(e).createTextNode(a),e[tt]=t,t.stateNode=e}return Ue(t),null;case 31:if(l=t.memoizedState,e===null||e.memoizedState!==null){if(a=Ya(t),l!==null){if(e===null){if(!a)throw Error(r(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(557));e[tt]=t}else ua(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),e=!1}else l=Uc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=l),e=!0;if(!e)return t.flags&256?(_t(t),t):(_t(t),null);if((t.flags&128)!==0)throw Error(r(558))}return Ue(t),null;case 13:if(a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(n=Ya(t),a!==null&&a.dehydrated!==null){if(e===null){if(!n)throw Error(r(318));if(n=t.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(r(317));n[tt]=t}else ua(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),n=!1}else n=Uc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),n=!0;if(!n)return t.flags&256?(_t(t),t):(_t(t),null)}return _t(t),(t.flags&128)!==0?(t.lanes=l,t):(l=a!==null,e=e!==null&&e.memoizedState!==null,l&&(a=t.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),l!==e&&l&&(t.child.flags|=8192),fi(t,t.updateQueue),Ue(t),null);case 4:return za(),e===null&&nf(t.stateNode.containerInfo),t.flags|=67108864,Ue(t),null;case 10:return xl(t.type),Ue(t),null;case 19:if(kc(t),a=t.memoizedState,a===null)return Ue(t),null;if(n=(t.flags&128)!==0,u=a.rendering,u===null)if(n)Vn(a,!1);else{if(Qe!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=ku(e),u!==null){for(t.flags|=128,Vn(a,!1),e=u.updateQueue,t.updateQueue=e,fi(t,e),t.subtreeFlags=0,e=l,l=t.child;l!==null;)Fo(l,e),l=l.sibling;return Bn(t,nt.current&1|2),oe&&hl(t,a.treeForkCount),t.child}e=e.sibling}a.tail!==null&&bt()>Si&&(t.flags|=128,n=!0,Vn(a,!1),t.lanes=4194304)}else{if(!n)if(e=ku(u),e!==null){if(t.flags|=128,n=!0,e=e.updateQueue,t.updateQueue=e,fi(t,e),Vn(a,!0),a.tail===null&&a.tailMode!=="collapsed"&&a.tailMode!=="visible"&&!u.alternate&&!oe)return Ue(t),null}else 2*bt()-a.renderingStartTime>Si&&l!==536870912&&(t.flags|=128,n=!0,Vn(a,!1),t.lanes=4194304);a.isBackwards?(u.sibling=t.child,t.child=u):(e=a.last,e!==null?e.sibling=u:t.child=u,a.last=u)}if(a.tail!==null){e=a.tail;e:{for(l=e;l!==null;){if(l.alternate!==null){l=!1;break e}l=l.sibling}l=!0}return a.rendering=e,a.tail=e.sibling,a.renderingStartTime=bt(),e.sibling=null,u=nt.current,u=n?u&1|2:u&1,a.tailMode==="visible"||a.tailMode==="collapsed"||!l||oe?Bn(t,u):(l=u,Ce(at,t),Ce(nt,l),st===null&&(st=t)),oe&&hl(t,a.treeForkCount),e}return Ue(t),null;case 22:case 23:return _t(t),Kc(),a=t.memoizedState!==null,e!==null?e.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?(l&536870912)!==0&&(t.flags&128)===0&&(Ue(t),t.subtreeFlags&6&&(t.flags|=8192)):Ue(t),l=t.updateQueue,l!==null&&fi(t,l.retryQueue),l=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(l=e.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==l&&(t.flags|=2048),e!==null&&et(oa),null;case 24:return l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),xl(Ze),Ue(t),null;case 25:return null;case 30:return t.flags|=33554432,Ue(t),null}throw Error(r(156,t.tag))}function W1(e,t){switch(Cc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return xl(Ze),za(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return hu(t),null;case 31:if(t.memoizedState!==null){if(_t(t),t.alternate===null)throw Error(r(340));ua()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(_t(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));ua()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return kc(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return za(),null;case 10:return xl(t.type),null;case 22:case 23:return _t(t),Kc(),e!==null&&et(oa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return xl(Ze),null;case 25:return null;default:return null}}function _d(e,t){switch(Cc(t),t.tag){case 3:xl(Ze),za();break;case 26:case 27:case 5:hu(t);break;case 4:za();break;case 31:t.memoizedState!==null&&_t(t);break;case 13:_t(t);break;case 19:kc(t);break;case 10:xl(t.type);break;case 22:case 23:_t(t),Kc(),e!==null&&et(oa);break;case 24:xl(Ze)}}function Ln(e,t){try{var l=t.updateQueue,a=l!==null?l.lastEffect:null;if(a!==null){var n=a.next;l=n;do{if((l.tag&e)===e){a=void 0;var u=l.create,i=l.inst;a=u(),i.destroy=a}l=l.next}while(l!==n)}}catch(s){_e(t,t.return,s)}}function Yl(e,t,l){try{var a=t.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&e)===e){var i=a.inst,s=i.destroy;if(s!==void 0){i.destroy=void 0,n=t;var f=l,x=s;try{x()}catch(b){_e(n,f,b)}}}a=a.next}while(a!==u)}}catch(b){_e(t,t.return,b)}}function Td(e){var t=e.updateQueue;if(t!==null){var l=e.stateNode;try{hr(t,l)}catch(a){_e(e,e.return,a)}}}function jd(e,t,l){l.props=va(e.type,e.memoizedProps),l.state=e.memoizedState;try{l.componentWillUnmount()}catch(a){_e(e,t,a)}}function Wt(e,t){try{var l=e.ref;if(l!==null){switch(e.tag){case 26:case 27:case 5:var a=e.stateNode;break;case 30:var n=e.stateNode,u=rl(e.memoizedProps,n);(n.ref===null||n.ref.name!==u)&&(n.ref=w0(u)),a=n.ref;break;case 7:if(e.stateNode===null){var i=new At(e);S(e.child,!1,Qv,i,void 0,void 0),e.stateNode=i}a=e.stateNode;break;default:a=e.stateNode}typeof l=="function"?e.refCleanup=l(a):l.current=a}}catch(s){_e(e,t,s)}}function ut(e,t){var l=e.ref,a=e.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){_e(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof l=="function")try{l(null)}catch(n){_e(e,t,n)}else l.current=null}function oi(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var l=0;l<t.length;l++)Y0(e.stateNode,t[l])}function Ed(e){for(var t=e.return;t!==null&&(Ts(t)&&Y0(e.stateNode,t.stateNode),!_s(t));)t=t.return}function Zn(e){for(var t=e.return;t!==null&&(Ts(t)&&Xv(e.stateNode,t.stateNode),!_s(t));)t=t.return}function _s(e){return e.tag===5||e.tag===3||e.tag===27}function Ts(e){return e&&e.tag===7&&e.stateNode!==null}function js(e){var t=e.type,l=e.memoizedProps,a=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":l.autoFocus&&a.focus();break e;case"img":l.src?a.src=l.src:l.srcSet&&(a.srcset=l.srcSet)}}catch(n){_e(e,e.return,n)}}function Es(e,t,l){try{var a=e.stateNode;zv(a,e.type,l,t),a[mt]=t}catch(n){_e(e,e.return,n)}}function Od(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Kl(e.type)||e.tag===4}function Os(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Od(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Kl(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function As(e,t,l,a){var n=e.tag;if(n===5||n===6)n=e.stateNode,t?(l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l).insertBefore(n,t):(t=l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l,t.appendChild(n),l=l._reactRootContainer,l!=null||t.onclick!==null||(t.onclick=kt)),oi(e,a),be=!0;else if(n!==4&&(n===27&&(oi(e,a),a=null,Kl(e.type)&&(l=e.stateNode,t=null)),e=e.child,e!==null))for(As(e,t,l,a),e=e.sibling;e!==null;)As(e,t,l,a),e=e.sibling}function ri(e,t,l,a){var n=e.tag;if(n===5||n===6)n=e.stateNode,t?l.insertBefore(n,t):l.appendChild(n),oi(e,a),be=!0;else if(n!==4&&(n===27&&(oi(e,a),a=null,Kl(e.type)&&(l=e.stateNode)),e=e.child,e!==null))for(ri(e,t,l,a),e=e.sibling;e!==null;)ri(e,t,l,a),e=e.sibling}function Ad(e){var t=e.stateNode,l=e.memoizedProps;try{for(var a=e.type,n=t.attributes;n.length;)t.removeAttributeNode(n[0]);it(t,a,l),t[tt]=e,t[mt]=l}catch(u){_e(e,e.return,u)}}var di=!1,Tt=null;function Md(e){(e.tag===30||(e.subtreeFlags&33554432)!==0)&&(di=!0)}var It=null;function Dd(){var e=It;return It=null,e}var vt=0;function Ja(e,t,l,a,n){return vt=0,Cd(e.child,t,l,a,n)}function Cd(e,t,l,a,n){for(var u=!1;e!==null;){if(e.tag===5){var i=e.stateNode;if(a!==null){var s=mf(i);a.push(s),s.view&&(u=!0)}else u||mf(i).view&&(u=!0);di=!0,D0(i,vt===0?t:t+"_"+vt,l),vt++}else(e.tag!==22||e.memoizedState===null)&&(e.tag===30&&n||Cd(e.child,t,l,a,n)&&(u=!0));e=e.sibling}return u}function Pt(e,t){for(;e!==null;)e.tag===5?C0(e.stateNode,e.memoizedProps):(e.tag!==22||e.memoizedState===null)&&(e.tag===30&&t||Pt(e.child,t)),e=e.sibling}function mi(e){if((e.subtreeFlags&18874368)!==0)for(e=e.child;e!==null;){if((e.tag!==22||e.memoizedState===null)&&(mi(e),e.tag===30&&(e.flags&18874368)!==0&&e.stateNode.paired)){var t=e.memoizedProps;if(t.name==null||t.name==="auto")throw Error(r(544));var l=t.name;t=dl(t.default,t.share),t!=="none"&&(Ja(e,l,t,null,!1)||Pt(e.child,!1))}e=e.sibling}}function Ms(e,t){if(e.tag===30){var l=e.stateNode,a=e.memoizedProps,n=rl(a,l),u=dl(a.default,l.paired?a.share:a.enter);u!=="none"?Ja(e,n,u,null,!1)?(mi(e),l.paired||t||tn(e,a.onEnter)):Pt(e.child,!1):mi(e)}else if((e.subtreeFlags&33554432)!==0)for(e=e.child;e!==null;)Ms(e,t),e=e.sibling;else mi(e)}function Ds(e){if(Tt!==null&&Tt.size!==0){var t=Tt;if((e.subtreeFlags&18874368)!==0)for(e=e.child;e!==null;){if(e.tag!==22||e.memoizedState===null){if(e.tag===30&&(e.flags&18874368)!==0){var l=e.memoizedProps,a=l.name;if(a!=null&&a!=="auto"){var n=t.get(a);if(n!==void 0){var u=dl(l.default,l.share);if(u!=="none"&&(Ja(e,a,u,null,!1)?(u=e.stateNode,n.paired=u,u.paired=n,tn(e,l.onShare)):Pt(e.child,!1)),t.delete(a),t.size===0)break}}}Ds(e)}e=e.sibling}}}function Cs(e){if(e.tag===30){var t=e.memoizedProps,l=rl(t,e.stateNode),a=Tt!==null?Tt.get(l):void 0,n=dl(t.default,a!==void 0?t.share:t.exit);n!=="none"&&(Ja(e,l,n,null,!1)?a!==void 0?(n=e.stateNode,a.paired=n,n.paired=a,Tt.delete(l),tn(e,t.onShare)):tn(e,t.onExit):Pt(e.child,!1)),Tt!==null&&Ds(e)}else if((e.subtreeFlags&33554432)!==0)for(e=e.child;e!==null;)Cs(e),e=e.sibling;else Tt!==null&&Ds(e)}function wd(e){for(e=e.child;e!==null;){if(e.tag===30){var t=e.memoizedProps,l=rl(t,e.stateNode);t=dl(t.default,t.update),e.flags&=-5,t!=="none"&&Ja(e,l,t,e.memoizedState=[],!1)}else(e.subtreeFlags&33554432)!==0&&wd(e);e=e.sibling}}function ws(e){if((e.subtreeFlags&18874368)!==0)for(e=e.child;e!==null;){if(e.tag!==22||e.memoizedState===null){if(e.tag===30&&(e.flags&18874368)!==0){var t=e.stateNode;t.paired!==null&&(t.paired=null,Pt(e.child,!1))}ws(e)}e=e.sibling}}function hi(e){if(e.tag===30)e.stateNode.paired=null,Pt(e.child,!1),ws(e);else if((e.subtreeFlags&33554432)!==0)for(e=e.child;e!==null;)hi(e),e=e.sibling;else ws(e)}function Ud(e){for(e=e.child;e!==null;)e.tag===30?Pt(e.child,!1):(e.subtreeFlags&33554432)!==0&&Ud(e),e=e.sibling}function Us(e,t,l,a,n,u,i){for(var s=!1;t!==null;){if(t.tag===5){var f=t.stateNode;if(u!==null&&vt<u.length){var x=u[vt],b=mf(f);(x.view||b.view)&&(s=!0);var _;if(_=(e.flags&4)===0)if(b.clip)_=!0;else{_=x.rect;var h=b.rect;_=_.y!==h.y||_.x!==h.x||_.height!==h.height||_.width!==h.width}_&&(e.flags|=4),b.abs?b=!x.abs:(x=x.rect,b=b.rect,b=x.height!==b.height||x.width!==b.width),b&&(e.flags|=32)}else e.flags|=32;(e.flags&4)!==0&&D0(f,vt===0?l:l+"_"+vt,n),s&&(e.flags&4)!==0||(It===null&&(It=[]),It.push(f,vt===0?a:a+"_"+vt,t.memoizedProps)),vt++}else(t.tag!==22||t.memoizedState===null)&&(t.tag===30&&i?e.flags|=t.flags&32:Us(e,t.child,l,a,n,u,i)&&(s=!0));t=t.sibling}return s}function Rd(e,t){for(e=e.child;e!==null;){if(e.tag===30){var l=e.memoizedProps,a=e.stateNode,n=rl(l,a),u=dl(l.default,l.update),i;i=e.memoizedState,e.memoizedState=null,a=e;var s=e.child;vt=0,n=Us(a,s,n,n,u,i,!1),(e.flags&4)!==0&&n&&tn(e,l.onUpdate)}else(e.subtreeFlags&33554432)!==0&&Rd(e);e=e.sibling}}var Ie=!1,Se=!1,el=!1,Rs=!1,Hd=typeof WeakSet=="function"?WeakSet:Set,Pe=null,tl=!1,Kn=!1,vi=!1,Hs=!1;function I1(e,t,l){if(e=e.containerInfo,sf=dn,e=Go(e),Nc(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var n=a.getSelection&&a.getSelection();if(n&&n.rangeCount!==0){a=n.anchorNode;var u=n.anchorOffset,i=n.focusNode;n=n.focusOffset;try{a.nodeType,i.nodeType}catch{a=null;break e}var s=0,f=-1,x=-1,b=0,_=0,h=e,g=null;t:for(;;){for(var C;h!==a||u!==0&&h.nodeType!==3||(f=s+u),h!==i||n!==0&&h.nodeType!==3||(x=s+n),h.nodeType===3&&(s+=h.nodeValue.length),(C=h.firstChild)!==null;)g=h,h=C;for(;;){if(h===e)break t;if(g===a&&++b===u&&(f=s),g===i&&++_===n&&(x=s),(C=h.nextSibling)!==null)break;h=g,g=h.parentNode}h=C}a=f===-1||x===-1?null:{start:f,end:x}}else a=null}a=a||{start:0,end:0}}else a=null;for(ff={focusedElem:e,selectionRange:a},dn=!1,l=(l&335544064)===l,Pe=t,t=l?9270:1024;Pe!==null;){if(e=Pe,l&&(a=e.deletions,a!==null))for(u=0;u<a.length;u++)l&&Cs(a[u]);if(e.alternate===null&&(e.flags&2)!==0)l&&Md(e),xi(l);else{if(e.tag===22){if(a=e.alternate,e.memoizedState!==null){a!==null&&a.memoizedState===null&&l&&Cs(a),xi(l);continue}else if(a!==null&&a.memoizedState!==null){l&&Md(e),xi(l);continue}}a=e.child,(e.subtreeFlags&t)!==0&&a!==null?(a.return=e,Pe=a):(l&&wd(e),xi(l))}}Tt=null}function xi(e){for(;Pe!==null;){var t=Pe,l=e,a=t.alternate,n=t.flags;switch(t.tag){case 0:case 11:case 15:break;case 1:if((n&1024)!==0&&a!==null){l=void 0,n=a.memoizedProps,a=a.memoizedState;var u=t.stateNode;try{var i=va(t.type,n);l=u.getSnapshotBeforeUpdate(i,a),u.__reactInternalSnapshotBeforeUpdate=l}catch(s){_e(t,t.return,s)}}break;case 3:if((n&1024)!==0){if(a=t.stateNode.containerInfo,l=a.nodeType,l===9)xf(a);else if(l===1)switch(a.nodeName){case"HEAD":case"HTML":case"BODY":xf(a);break;default:a.textContent=""}}break;case 5:case 26:case 27:case 6:case 4:case 17:break;case 30:l&&a!==null&&(l=rl(a.memoizedProps,a.stateNode),n=t.memoizedProps,n=dl(n.default,n.update),n!=="none"&&Ja(a,l,n,a.memoizedState=[],!0));break;default:if((n&1024)!==0)throw Error(r(163))}if(a=t.sibling,a!==null){a.return=t.return,Pe=a;break}Pe=t.return}}function qd(e,t,l){var a=l.flags;switch(l.tag){case 0:case 11:case 15:ll(e,l),a&4&&Ln(5,l);break;case 1:if(ll(e,l),a&4)if(e=l.stateNode,t===null)try{e.componentDidMount()}catch(i){_e(l,l.return,i)}else{var n=va(l.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(n,t,e.__reactInternalSnapshotBeforeUpdate)}catch(i){_e(l,l.return,i)}}a&64&&Td(l),a&512&&Wt(l,l.return);break;case 3:if(ll(e,l),a&64&&(e=l.updateQueue,e!==null)){if(t=null,l.child!==null)switch(l.child.tag){case 27:case 5:t=l.child.stateNode;break;case 1:t=l.child.stateNode}try{hr(e,t)}catch(i){_e(l,l.return,i)}}break;case 27:t===null&&a&4&&Ad(l);case 26:case 5:ll(e,l),t===null&&a&4&&js(l),a&512&&Wt(l,l.return);break;case 12:ll(e,l);break;case 31:ll(e,l),a&4&&Qd(e,l);break;case 13:ll(e,l),a&4&&Xd(e,l),a&64&&(e=l.memoizedState,e!==null&&(e=e.dehydrated,e!==null&&(l=ov.bind(null,l),Zv(e,l))));break;case 22:if(a=l.memoizedState!==null||Ie,!a){var u=t!==null&&t.memoizedState!==null||Se;t=Ie,n=Se,Ie=a,(Se=u)&&!n?(a=2,(l.subtreeFlags&8772)!==0&&(a|=1),Xt(e,l,a)):ll(e,l),Ie=t,Se=n}break;case 30:ll(e,l),a&512&&Wt(l,l.return);break;case 7:a&512&&Wt(l,l.return);default:ll(e,l)}}function qs(e,t){for(e=e.child;e!==null;)Bd(e,t),e=e.sibling}function Bd(e,t){switch(e.tag){case 5:case 26:try{var l=e.stateNode;if(t){var a=l.style;typeof a.setProperty=="function"?a.setProperty("display","none","important"):a.display="none"}else{var n=e.stateNode,u=e.memoizedProps.style,i=u!=null&&u.hasOwnProperty("display")?u.display:null;n.style.display=i==null||typeof i=="boolean"?"":(""+i).trim()}}catch(f){_e(e,e.return,f)}Bs(e,t);break;case 6:try{e.stateNode.nodeValue=t?"":e.memoizedProps,be=!0}catch(f){_e(e,e.return,f)}break;case 18:try{var s=e.stateNode;t?M0(s,!0):M0(e.stateNode,!1)}catch(f){_e(e,e.return,f)}break;case 22:case 23:e.memoizedState===null&&qs(e,t);break;default:qs(e,t)}}function Bs(e,t){if(e.subtreeFlags&67108864)for(e=e.child;e!==null;){e:{var l=e,a=t;switch(l.tag){case 4:Bd(l,a);break e;case 22:l.memoizedState===null&&Bs(l,a);break e;default:Bs(l,a)}}e=e.sibling}}function Yd(e){var t=e.alternate;t!==null&&(e.alternate=null,Yd(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&Su(t)),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var He=null,xt=!1;function Gt(e,t,l){for(l=l.child;l!==null;)Gd(e,t,l),l=l.sibling}function Gd(e,t,l){if(pt&&typeof pt.onCommitFiberUnmount=="function")try{pt.onCommitFiberUnmount(vn,l)}catch{}switch(l.tag){case 26:Se||ut(l,t),Gt(e,t,l),l.memoizedState?l.memoizedState.count--:l.stateNode&&!Se&&(l=l.stateNode,l.parentNode.removeChild(l));break;case 27:Se||ut(l,t),Zn(l);var a=He,n=xt;Kl(l.type)&&(He=l.stateNode,xt=!1),Gt(e,t,l),L0(l.stateNode,l.type,l.memoizedProps),He=a,xt=n;break;case 5:Se||ut(l,t),Zn(l);case 6:if(l.tag===6&&Zn(l),a=He,n=xt,He=null,Gt(e,t,l),He=a,xt=n,He!==null)if(xt)try{(He.nodeType===9?He.body:He.nodeName==="HTML"?He.ownerDocument.body:He).removeChild(l.stateNode),be=!0}catch(u){_e(l,t,u)}else try{He.removeChild(l.stateNode),be=!0}catch(u){_e(l,t,u)}break;case 18:He!==null&&(xt?(e=He,A0(e.nodeType===9?e.body:e.nodeName==="HTML"?e.ownerDocument.body:e,l.stateNode),mn(e)):A0(He,l.stateNode));break;case 4:a=He,n=xt,He=l.stateNode.containerInfo,xt=!0,Gt(e,t,l),He=a,xt=n;break;case 0:case 11:case 14:case 15:Yl(2,l,t),Se||Yl(4,l,t),Gt(e,t,l);break;case 1:Se||(ut(l,t),a=l.stateNode,typeof a.componentWillUnmount=="function"&&jd(l,t,a)),Gt(e,t,l);break;case 21:Gt(e,t,l);break;case 22:Se=(a=Se)||l.memoizedState!==null,Gt(e,t,l),Se=a;break;case 30:ut(l,t),Gt(e,t,l);break;case 7:Se||ut(l,t),Gt(e,t,l);break;default:Gt(e,t,l)}}function Qd(e,t){if(t.memoizedState===null&&(e=t.alternate,e!==null&&(e=e.memoizedState,e!==null))){e=e.dehydrated;try{mn(e)}catch(l){_e(t,t.return,l)}}}function Xd(e,t){if(t.memoizedState===null&&(e=t.alternate,e!==null&&(e=e.memoizedState,e!==null&&(e=e.dehydrated,e!==null))))try{mn(e)}catch(l){_e(t,t.return,l)}}function P1(e){switch(e.tag){case 31:case 13:case 19:var t=e.stateNode;return t===null&&(t=e.stateNode=new Hd),t;case 22:return e=e.stateNode,t=e._retryCache,t===null&&(t=e._retryCache=new Hd),t;default:throw Error(r(435,e.tag))}}function yi(e,t){var l=P1(e);t.forEach(function(a){if(!l.has(a)){l.add(a);var n=rv.bind(null,e,a);a.then(n,n)}})}function rt(e,t,l){var a=t.deletions;if(a!==null)for(var n=0;n<a.length;n++){var u=a[n],i=e,s=t,f=s;e:for(;f!==null;){switch(f.tag){case 27:if(Kl(f.type)){He=f.stateNode,xt=!1;break e}break;case 5:He=f.stateNode,xt=!1;break e;case 3:case 4:He=f.stateNode.containerInfo,xt=!0;break e}f=f.return}if(He===null)throw Error(r(160));Gd(i,s,u),He=null,xt=!1,i=u.alternate,i!==null&&(i.return=null),u.return=null}if(t.subtreeFlags&13886)for(t=t.child;t!==null;)Vd(t,e,l),t=t.sibling}var Qt=null;function Vd(e,t,l){var a=e.alternate,n=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(n&4&&(a=e.updateQueue,a=a!==null?a.events:null,a!==null))for(var u=0;u<a.length;u++){var i=a[u];i.ref.impl=i.nextImpl}rt(t,e,l),dt(e),n&4&&(Yl(3,e,e.return),Ln(3,e),Yl(5,e,e.return));break;case 1:rt(t,e,l),dt(e),n&512&&(Se||a===null||ut(a,a.return)),n&64&&Ie&&(e=e.updateQueue,e!==null&&(t=e.callbacks,t!==null&&(l=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=l===null?t:l.concat(t))));break;case 26:if(u=Qt,rt(t,e,l),dt(e),n&512&&(Se||a===null||ut(a,a.return)),n&4)if(n=a!==null?a.memoizedState:null,l=e.memoizedState,a===null)if(l===null)if(e.stateNode===null)if(Ie)e.stateNode=j0(e.type,e.memoizedProps,t.containerInfo,e);else{e:{t=e.type,l=e.memoizedProps,n=u.ownerDocument||u;t:switch(t){case"title":a=n.getElementsByTagName("title")[0],(!a||a[gn]||a[tt]||a.namespaceURI==="http://www.w3.org/2000/svg"||a.hasAttribute("itemprop"))&&(a=n.createElement(t),n.head.insertBefore(a,n.querySelector("head > title"))),it(a,t,l),a[tt]=e,Fe(a),t=a;break e;case"link":if(u=F0("link","href",n).get(t+(l.href||""))){for(i=0;i<u.length;i++)if(a=u[i],a.getAttribute("href")===(l.href==null||l.href===""?null:l.href)&&a.getAttribute("rel")===(l.rel==null?null:l.rel)&&a.getAttribute("title")===(l.title==null?null:l.title)&&a.getAttribute("crossorigin")===(l.crossOrigin==null?null:l.crossOrigin)){u.splice(i,1);break t}}a=n.createElement(t),it(a,t,l),n.head.appendChild(a);break;case"meta":if(u=F0("meta","content",n).get(t+(l.content||""))){for(i=0;i<u.length;i++)if(a=u[i],a.getAttribute("content")===(l.content==null?null:""+l.content)&&a.getAttribute("name")===(l.name==null?null:l.name)&&a.getAttribute("property")===(l.property==null?null:l.property)&&a.getAttribute("http-equiv")===(l.httpEquiv==null?null:l.httpEquiv)&&a.getAttribute("charset")===(l.charSet==null?null:l.charSet)){u.splice(i,1);break t}}a=n.createElement(t),it(a,t,l),n.head.appendChild(a);break;default:throw Error(r(468,t))}a[tt]=e,Fe(a),t=a}e.stateNode=t}else Ie||zf(u,e.type,e.stateNode);else e.stateNode=$0(u,l,e.memoizedProps);else n!==l?(n===null?(t=a.stateNode,t===null||Se||t.parentNode.removeChild(t)):n.count--,l===null?Ie||zf(u,e.type,e.stateNode):$0(u,l,e.memoizedProps)):l===null&&e.stateNode!==null&&Es(e,e.memoizedProps,a.memoizedProps);break;case 27:rt(t,e,l),dt(e),n&512&&(Se||a===null||ut(a,a.return)),a!==null&&n&4&&Es(e,e.memoizedProps,a.memoizedProps);break;case 5:if(u=el,el=!1,rt(t,e,l),el=u,dt(e),n&512&&(Se||a===null||ut(a,a.return)),e.flags&32){t=e.stateNode;try{Aa(t,""),be=!0}catch(b){_e(e,e.return,b)}}n&4&&e.stateNode!=null&&(t=e.memoizedProps,Es(e,t,a!==null?a.memoizedProps:t)),n&1024&&(Rs=!0);break;case 6:if(rt(t,e,l),dt(e),n&4){if(e.stateNode===null)throw Error(r(162));t=e.memoizedProps,l=e.stateNode;try{l.nodeValue=t,be=!0}catch(b){_e(e,e.return,b)}}break;case 3:if(be=!1,Ci=null,u=Qt,Qt=tu(t.containerInfo),rt(t,e,l),Qt=u,dt(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{mn(t.containerInfo)}catch(b){_e(e,e.return,b)}Rs&&(Rs=!1,Ld(e)),be=!1;break;case 4:n=el,el=Ie,a=fo(),u=Qt,Qt=tu(e.stateNode.containerInfo),rt(t,e,l),dt(e),Qt=u,be&&Kn&&(vi=!0),be=a,el=n;break;case 12:rt(t,e,l),dt(e);break;case 31:rt(t,e,l),dt(e),n&4&&(t=e.updateQueue,t!==null&&(e.updateQueue=null,yi(e,t)));break;case 13:rt(t,e,l),dt(e),e.child.flags&8192&&e.memoizedState!==null!=(a!==null&&a.memoizedState!==null)&&(pi=bt()),n&4&&(t=e.updateQueue,t!==null&&(e.updateQueue=null,yi(e,t)));break;case 22:u=e.memoizedState!==null,i=a!==null&&a.memoizedState!==null;var s=Ie,f=Se,x=el;Ie=s||u,el=x||u,Se=f||i,rt(t,e,l),Se=f,el=x,Ie=s,dt(e),n&8192&&(t=e.stateNode,t._visibility=u?t._visibility&-2:t._visibility|1,!u||a===null||i||Ie||Se||(t=i||Se,l=Ie,a=Se,Ie=u||Ie,Se=t,Gl(e,2),Ie=l,Se=a),!u&&el||qs(e,u)),n&4&&(t=e.updateQueue,t!==null&&(l=t.retryQueue,l!==null&&(t.retryQueue=null,yi(e,l))));break;case 19:rt(t,e,l),dt(e),n&4&&(t=e.updateQueue,t!==null&&(e.updateQueue=null,yi(e,t)));break;case 30:n&512&&(Se||a===null||ut(a,a.return)),n=fo(),u=Kn,i=(l&335544064)===l,s=e.memoizedProps,Kn=i&&dl(s.default,s.update)!=="none",rt(t,e,l),dt(e),i&&a!==null&&be&&(e.flags|=4),Kn=u,be=n;break;case 21:break;case 7:n&512&&(Se||a===null||ut(a,a.return)),a&&a.stateNode!==null&&(a.stateNode._fragmentFiber=e);default:rt(t,e,l),dt(e)}}function dt(e){var t=e.flags;if(t&2){try{for(var l,a=e.return;a!==null;){if(Od(a)){l=a;break}a=a.return}a=null;for(var n=e.return;n!==null;){if(Ts(n)){var u=n.stateNode;a===null?a=[u]:a.push(u)}if(_s(n))break;n=n.return}var i=a;if(l==null)throw Error(r(160));switch(l.tag){case 27:var s=l.stateNode,f=Os(e);ri(e,f,s,i);break;case 5:var x=l.stateNode;l.flags&32&&(Aa(x,""),l.flags&=-33);var b=Os(e);ri(e,b,x,i);break;case 3:case 4:var _=l.stateNode.containerInfo,h=Os(e);As(e,h,_,i);break;default:throw Error(r(161))}}catch(g){_e(e,e.return,g)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function Ld(e){if(e.subtreeFlags&1024)for(e=e.child;e!==null;){var t=e;Ld(t),t.tag===5&&t.flags&1024&&(t=t.stateNode,dn=!0,t.reset(),dn=!1),e=e.sibling}}function ka(e,t){if(t.subtreeFlags&9270)for(t=t.child;t!==null;)Zd(t,e),t=t.sibling;else Rd(t)}function Zd(e,t){var l=e.alternate;if(l===null)Ms(e,!1);else switch(e.tag){case 3:if(Hs=tl=!1,Dd(),ka(t,e),!tl&&!vi){if(e=It,e!==null)for(var a=0;a<e.length;a+=3){l=e[a];var n=e[a+1];C0(l,e[a+2]),l=l.ownerDocument.documentElement,l!==null&&l.animate({opacity:[0,0],pointerEvents:["none","none"]},{duration:0,fill:"forwards",pseudoElement:"::view-transition-group("+n+")"})}e=t.containerInfo,e=e.nodeType===9?e.documentElement:e.ownerDocument.documentElement,e!==null&&e.style.viewTransitionName===""&&(e.style.viewTransitionName="none",e.animate({opacity:[0,0],pointerEvents:["none","none"]},{duration:0,fill:"forwards",pseudoElement:"::view-transition-group(root)"}),e.animate({width:[0,0],height:[0,0]},{duration:0,fill:"forwards",pseudoElement:"::view-transition"})),Hs=!0}It=null;break;case 5:ka(t,e);break;case 4:a=tl,tl=!1,ka(t,e),tl&&(vi=!0),tl=a;break;case 22:e.memoizedState===null&&(l.memoizedState!==null?Ms(e,!1):ka(t,e));break;case 30:a=tl,n=Dd(),tl=!1,ka(t,e),tl&&(e.flags|=4);var u=e.memoizedProps,i=e.stateNode;t=rl(u,i),i=rl(l.memoizedProps,i);var s=dl(u.default,u.update);s==="none"?t=!1:(u=l.memoizedState,l.memoizedState=null,l=e.child,vt=0,t=Us(e,l,t,i,s,u,!0),vt!==(u===null?0:u.length)&&(e.flags|=32)),(e.flags&4)!==0&&t?(tn(e,e.memoizedProps.onUpdate),It=n):n!==null&&(n.push.apply(n,It),It=n),tl=(e.flags&32)!==0?!0:a;break;default:ka(t,e)}}function ll(e,t){if(t.subtreeFlags&8772)for(t=t.child;t!==null;)qd(e,t.alternate,t),t=t.sibling}function Gl(e,t){for(e=e.child;e!==null;){var l=e,a=t;switch(l.tag){case 0:case 11:case 14:case 15:Yl(4,l,l.return),Gl(l,a);break;case 1:ut(l,l.return);var n=l.stateNode;typeof n.componentWillUnmount=="function"&&jd(l,l.return,n),Gl(l,a);break;case 27:(a&2)!==0&&L0(l.stateNode,l.type,l.memoizedProps);case 5:ut(l,l.return),l.tag!==5&&l.tag!==27||Zn(l),Gl(l,a);break;case 6:Zn(l);break;case 26:ut(l,l.return),n=l.stateNode,l.memoizedState!==null||n===null||Se||n.parentNode.removeChild(n),Gl(l,a);break;case 22:l.memoizedState===null&&Gl(l,a);break;case 30:ut(l,l.return),Gl(l,a);break;case 7:ut(l,l.return);default:Gl(l,a)}e=e.sibling}}function Xt(e,t,l){for(l=(t.subtreeFlags&8772)!==0?l:l&-2,t=t.child;t!==null;){var a=t.alternate,n=e,u=t,i=u.flags,s=(l&1)!==0;switch(u.tag){case 0:case 11:case 15:Xt(n,u,l),Ln(4,u);break;case 1:if(Xt(n,u,l),a=u,n=a.stateNode,typeof n.componentDidMount=="function")try{n.componentDidMount()}catch(b){_e(a,a.return,b)}if(a=u,n=a.updateQueue,n!==null){var f=a.stateNode;try{var x=n.shared.hiddenCallbacks;if(x!==null)for(n.shared.hiddenCallbacks=null,n=0;n<x.length;n++)mr(x[n],f)}catch(b){_e(a,a.return,b)}}s&&i&64&&Td(u),Wt(u,u.return);break;case 27:(l&2)!==0&&Ad(u);case 5:u.tag!==5&&u.tag!==27||Ed(u),Xt(n,u,l),s&&a===null&&i&4&&js(u),Wt(u,u.return);break;case 6:Ed(u);break;case 26:f=u.stateNode,u.memoizedState!==null||f===null||Ie||zf(tu(f.ownerDocument),u.type,f),Xt(n,u,l),s&&a===null&&i&4&&js(u),Wt(u,u.return);break;case 12:Xt(n,u,l);break;case 31:Xt(n,u,l),s&&i&4&&Qd(n,u);break;case 13:Xt(n,u,l),s&&i&4&&Xd(n,u);break;case 22:u.memoizedState===null&&Xt(n,u,l),Wt(u,u.return);break;case 30:Xt(n,u,l),Wt(u,u.return);break;case 7:Wt(u,u.return);default:Xt(n,u,l)}t=t.sibling}}function Ys(e,t){var l=null;e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(l=e.memoizedState.cachePool.pool),e=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(e=t.memoizedState.cachePool.pool),e!==l&&(e!=null&&e.refCount++,l!=null&&Dn(l))}function Gs(e,t){e=null,t.alternate!==null&&(e=t.alternate.memoizedState.cache),t=t.memoizedState.cache,t!==e&&(t.refCount++,e!=null&&Dn(e))}function Ht(e,t,l,a){var n=(l&335544064)===l;if(t.subtreeFlags&(n?10262:10256))for(t=t.child;t!==null;)Kd(e,t,l,a),t=t.sibling;else n&&Ud(t)}function Kd(e,t,l,a){var n=(l&335544064)===l;n&&t.alternate===null&&t.return!==null&&t.return.alternate!==null&&hi(t);var u=t.flags;switch(t.tag){case 0:case 11:case 15:Ht(e,t,l,a),u&2048&&Ln(9,t);break;case 1:Ht(e,t,l,a);break;case 3:Ht(e,t,l,a),n&&Hs&&(e=e.containerInfo,e=e.nodeType===9?e.body:e.nodeName==="HTML"?e.ownerDocument.body:e,e.style.viewTransitionName==="root"&&(e.style.viewTransitionName=""),e=e.ownerDocument.documentElement,e!==null&&e.style.viewTransitionName==="none"&&(e.style.viewTransitionName="")),u&2048&&(u=null,t.alternate!==null&&(u=t.alternate.memoizedState.cache),t=t.memoizedState.cache,t!==u&&(t.refCount++,u!=null&&Dn(u)));break;case 12:if(u&2048){Ht(e,t,l,a),u=t.stateNode;try{var i=t.memoizedProps,s=i.id,f=i.onPostCommit;typeof f=="function"&&f(s,t.alternate===null?"mount":"update",u.passiveEffectDuration,-0)}catch(x){_e(t,t.return,x)}}else Ht(e,t,l,a);break;case 31:Ht(e,t,l,a);break;case 13:Ht(e,t,l,a);break;case 23:break;case 22:i=t.stateNode,s=t.alternate,t.memoizedState!==null?(n&&s!==null&&s.memoizedState===null&&hi(s),i._visibility&2?Ht(e,t,l,a):Jn(e,t)):(n&&s!==null&&s.memoizedState!==null&&hi(t),i._visibility&2?Ht(e,t,l,a):(i._visibility|=2,$a(e,t,l,a,(t.subtreeFlags&10256)!==0||!1))),u&2048&&Ys(s,t);break;case 24:Ht(e,t,l,a),u&2048&&Gs(t.alternate,t);break;case 30:n&&(u=t.alternate,u!==null&&(Pt(u.child,!0),Pt(t.child,!0))),Ht(e,t,l,a);break;default:Ht(e,t,l,a)}}function $a(e,t,l,a,n){for(n=n&&((t.subtreeFlags&10256)!==0||!1),t=t.child;t!==null;){var u=e,i=t,s=l,f=a,x=i.flags;switch(i.tag){case 0:case 11:case 15:$a(u,i,s,f,n),Ln(8,i);break;case 23:break;case 22:var b=i.stateNode;i.memoizedState!==null?b._visibility&2?$a(u,i,s,f,n):Jn(u,i):(b._visibility|=2,$a(u,i,s,f,n)),n&&x&2048&&Ys(i.alternate,i);break;case 24:$a(u,i,s,f,n),n&&x&2048&&Gs(i.alternate,i);break;default:$a(u,i,s,f,n)}t=t.sibling}}function Jn(e,t){if(t.subtreeFlags&10256)for(t=t.child;t!==null;){var l=e,a=t,n=a.flags;switch(a.tag){case 22:Jn(l,a),n&2048&&Ys(a.alternate,a);break;case 24:Jn(l,a),n&2048&&Gs(a.alternate,a);break;default:Jn(l,a)}t=t.sibling}}var xa=8192;function ya(e,t,l){if(e.subtreeFlags&xa)for(e=e.child;e!==null;)Jd(e,t,l),e=e.sibling}function Jd(e,t,l){switch(e.tag){case 26:ya(e,t,l),e.flags&xa&&(e.memoizedState!==null?ux(l,Qt,e.memoizedState,e.memoizedProps):(e=e.stateNode,(t&335544128)===t&&em(l,e)));break;case 5:ya(e,t,l),e.flags&xa&&(e=e.stateNode,(t&335544128)===t&&em(l,e));break;case 3:case 4:var a=Qt;Qt=tu(e.stateNode.containerInfo),ya(e,t,l),Qt=a;break;case 22:e.memoizedState===null&&(a=e.alternate,a!==null&&a.memoizedState!==null?(a=xa,xa=16777216,ya(e,t,l),xa=a):ya(e,t,l));break;case 30:if((e.flags&xa)!==0&&(a=e.memoizedProps.name,a!=null&&a!=="auto")){var n=e.stateNode;n.paired=null,Tt===null&&(Tt=new Map),Tt.set(a,n)}ya(e,t,l);break;default:ya(e,t,l)}}function kd(e){var t=e.alternate;if(t!==null&&(e=t.child,e!==null)){t.child=null;do t=e.sibling,e.sibling=null,e=t;while(e!==null)}}function kn(e){var t=e.deletions;if((e.flags&16)!==0){if(t!==null)for(var l=0;l<t.length;l++){var a=t[l];Pe=a,Fd(a,e)}kd(e)}if(e.subtreeFlags&10256)for(e=e.child;e!==null;)$d(e),e=e.sibling}function $d(e){switch(e.tag){case 0:case 11:case 15:kn(e),e.flags&2048&&Yl(9,e,e.return);break;case 3:kn(e);break;case 12:kn(e);break;case 22:var t=e.stateNode;e.memoizedState!==null&&t._visibility&2&&(e.return===null||e.return.tag!==13)?(t._visibility&=-3,gi(e)):kn(e);break;default:kn(e)}}function gi(e){var t=e.deletions;if((e.flags&16)!==0){if(t!==null)for(var l=0;l<t.length;l++){var a=t[l];Pe=a,Fd(a,e)}kd(e)}for(e=e.child;e!==null;){switch(t=e,t.tag){case 0:case 11:case 15:Yl(8,t,t.return),gi(t);break;case 22:l=t.stateNode,l._visibility&2&&(l._visibility&=-3,gi(t));break;default:gi(t)}e=e.sibling}}function Fd(e,t){for(;Pe!==null;){var l=Pe;switch(l.tag){case 0:case 11:case 15:Yl(8,l,t);break;case 23:case 22:if(l.memoizedState!==null&&l.memoizedState.cachePool!==null){var a=l.memoizedState.cachePool.pool;a!=null&&a.refCount++}break;case 24:Dn(l.memoizedState.cache)}if(a=l.child,a!==null)a.return=l,Pe=a;else e:for(l=e;Pe!==null;){a=Pe;var n=a.sibling,u=a.return;if(Yd(a),a===l){Pe=null;break e}if(n!==null){n.return=u,Pe=n;break e}Pe=u}}}var ev={getCacheForType:function(e){var t=lt(Ze),l=t.data.get(e);return l===void 0&&(l=e(),t.data.set(e,l)),l},cacheSignal:function(){return lt(Ze).controller.signal}},tv=typeof WeakMap=="function"?WeakMap:Map,pe=0,Me=null,me=null,xe=0,ze=0,jt=null,Ql=!1,Fa=!1,Qs=!1,Sl=0,Qe=0,Xl=0,ga=0,bi=0,Et=0,Wa=0,$n=null,yt=null,Xs=!1,pi=0,Wd=0,Si=1/0,Ni=null,Vl=null,Be=0,Vt=null,ba=null,al=0,Vs=0,Ls=null,Id=null,Ia=null,Pa=null,en=null,Fn=0,zi=null;function Ot(){return(pe&2)!==0&&xe!==0?xe&-xe:B.T!==null?ef():eo()}function Pd(){if(Et===0)if((xe&536870912)===0||oe){var e=yu;yu<<=1,(yu&3932160)===0&&(yu=262144),Et=e}else Et=536870912;return e=at.current,e!==null&&(e.flags|=32),Et}function tn(e,t){if(t!=null){var l=e.stateNode,a=l.ref;a===null&&(a=l.ref=w0(rl(e.memoizedProps,l))),Pa===null&&(Pa=[]),Pa.push(t.bind(null,a))}}function gt(e,t,l){(e===Me&&(ze===2||ze===9)||e.cancelPendingCommit!==null)&&(ln(e,0),Ll(e,xe,Et,!1)),yn(e,l),((pe&2)===0||e!==Me)&&(e===Me&&((pe&2)===0&&(ga|=l),Qe===4&&Ll(e,xe,Et,!1)),nl(e))}function e0(e,t,l){if((pe&6)!==0)throw Error(r(327));var a=!l&&(t&127)===0&&(t&e.expiredLanes)===0||xn(e,t),n=a?nv(e,t):Ks(e,t,!0),u=a;do{if(n===0){Fa&&!a&&Ll(e,t,0,!1);break}else{if(l=e.current.alternate,u&&!lv(l)){n=Ks(e,t,!1),u=!1;continue}if(n===2){if(u=t,e.errorRecoveryDisabledLanes&u)var i=0;else i=e.pendingLanes&-536870913,i=i!==0?i:i&536870912?536870912:0;if(i!==0){t=i;e:{var s=e;n=$n;var f=s.current.memoizedState.isDehydrated;if(f&&(ln(s,i).flags|=256),i=Ks(s,i,!1),i!==2&&i!==6){if(Qs&&!f){s.errorRecoveryDisabledLanes|=u,ga|=u,n=4;break e}u=yt,yt=n,u!==null&&(yt===null?yt=u:yt.push.apply(yt,u))}n=i}if(u=!1,n!==2)continue}}if(n===1){ln(e,0),Ll(e,t,0,!0);break}e:{switch(a=e,u=n,u){case 0:case 1:throw Error(r(345));case 4:if((t&4194048)!==t&&(t&62914560)!==t)break;case 6:Ll(a,t,Et,!Ql);break e;case 2:yt=null;break;case 3:case 5:break;default:throw Error(r(329))}if((t&62914560)===t&&(n=pi+300-bt(),10<n)){if(Ll(a,t,Et,!Ql),bu(a,0,!0)!==0)break e;al=t,a.timeoutHandle=df(t0.bind(null,a,l,yt,Ni,Xs,t,Et,ga,Wa,Ql,u,"Throttled",-0,0),n);break e}t0(a,l,yt,Ni,Xs,t,Et,ga,Wa,Ql,u,null,-0,0)}}break}while(!0);nl(e)}function t0(e,t,l,a,n,u,i,s,f,x,b,_,h,g){e.timeoutHandle=-1;var C=t.subtreeFlags,Y=(u&335544064)===u;if(_=null,(Y||C&8192||(C&16785408)===16785408)&&(_={stylesheets:null,count:0,imgCount:0,imgBytes:0,suspenseyImages:[],waitingForImages:!0,waitingForViewTransition:!1,unsuspend:kt},Tt=null,Jd(t,u,_),Y&&(C=_,Y=e.containerInfo,Y=(Y.nodeType===9?Y:Y.ownerDocument).__reactViewTransition,Y!=null&&(C.count++,C.waitingForViewTransition=!0,C=nu.bind(C),Y.finished.then(C,C))),C=(u&62914560)===u?pi-bt():(u&4194048)===u?Wd-bt():0,C=ix(_,C),C!==null)){al=u,e.cancelPendingCommit=C(f0.bind(null,e,t,u,l,a,n,i,s,f,x,b,_,null,h,g)),Ll(e,u,i,!x);return}f0(e,t,u,l,a,n,i,s,f,x,b,_)}function lv(e){for(var t=e;;){var l=t.tag;if((l===0||l===11||l===15)&&t.flags&16384&&(l=t.updateQueue,l!==null&&(l=l.stores,l!==null)))for(var a=0;a<l.length;a++){var n=l[a],u=n.getSnapshot;n=n.value;try{if(!zt(u(),n))return!1}catch{return!1}}if(l=t.child,t.subtreeFlags&16384&&l!==null)l.return=t,t=l;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Ll(e,t,l,a){t=$f(e,t),t&=~bi,t&=~ga,e.suspendedLanes|=t,e.pingedLanes&=~t,a&&(e.warmLanes|=t),a=e.expirationTimes;for(var n=t;0<n;){var u=31-St(n),i=1<<u;a[u]=-1,n&=~i}l!==0&&Wf(e,l,t)}function _i(){return(pe&6)===0?(Wn(0),!1):!0}function Zs(){if(me!==null){if(ze===0)var e=me.return;else e=me,vl=ia=null,Pc(e),Xa=null,Un=0,e=me;for(;e!==null;)_d(e.alternate,e),e=e.return;me=null}}function ln(e,t){var l=e.timeoutHandle;return l!==-1&&(e.timeoutHandle=-1,jv(l)),l=e.cancelPendingCommit,l!==null&&(e.cancelPendingCommit=null,l()),al=0,Zs(),Me=e,me=l=ml(e.current,null),xe=t,ze=0,jt=null,Ql=!1,Fa=xn(e,t),Qs=!1,Wa=Et=bi=ga=Xl=Qe=0,yt=$n=null,Xs=!1,Sl=$f(e,t),Cu(),l}function l0(e,t){ne=null,B.H=ai,t===Qa||t===Vu?(t=fr(),ze=3):t===Gc?(t=fr(),ze=4):ze=t===hs?8:t!==null&&typeof t=="object"&&typeof t.then=="function"?6:1,jt=t,me===null&&(Qe=1,ni(e,Ct(t,e.current)))}function a0(){var e=at.current;return e===null?!0:(xe&4194048)===xe?st===null:(xe&62914560)===xe||(xe&536870912)!==0?e===st:!1}function n0(){var e=B.H;return B.H=ai,e===null?ai:e}function u0(){var e=B.A;return B.A=ev,e}function Ti(){Qe=4,Ql||(xe&4194048)!==xe&&at.current!==null||(Fa=!0),(Xl&134217727)===0&&(ga&134217727)===0||Me===null||Ll(Me,xe,Et,!1)}function Ks(e,t,l){var a=pe;pe|=2;var n=n0(),u=u0();(Me!==e||xe!==t)&&(Ni=null,ln(e,t)),t=!1;var i=Qe;e:do try{if(ze!==0&&me!==null){var s=me,f=jt;switch(ze){case 8:Zs(),i=6;break e;case 3:case 2:case 9:case 6:at.current===null&&(t=!0);var x=ze;if(ze=0,jt=null,an(e,s,f,x),l&&Fa){i=0;break e}break;default:x=ze,ze=0,jt=null,an(e,s,f,x)}}av(),i=Qe;break}catch(b){l0(e,b)}while(!0);return t&&e.shellSuspendCounter++,vl=ia=null,pe=a,B.H=n,B.A=u,me===null&&(Me=null,xe=0,Cu()),i}function av(){for(;me!==null;)i0(me)}function nv(e,t){var l=pe;pe|=2;var a=n0(),n=u0();Me!==e||xe!==t?(Ni=null,Si=bt()+500,ln(e,t)):Fa=xn(e,t);e:do try{if(ze!==0&&me!==null){t=me;var u=jt;t:switch(ze){case 1:ze=0,jt=null,an(e,t,u,1);break;case 2:case 9:if(cr(u)){ze=0,jt=null,c0(t);break}t=function(){ze!==2&&ze!==9||Me!==e||(ze=7),nl(e)},u.then(t,t);break e;case 3:ze=7;break e;case 4:ze=5;break e;case 7:cr(u)?(ze=0,jt=null,c0(t)):(ze=0,jt=null,an(e,t,u,7));break;case 5:var i=null;switch(me.tag){case 26:i=me.memoizedState;case 5:case 27:var s=me;if(i?I0(i):s.stateNode.complete){ze=0,jt=null;var f=s.sibling;if(f!==null)me=f;else{var x=s.return;x!==null?(me=x,ji(x)):me=null}break t}}ze=0,jt=null,an(e,t,u,5);break;case 6:ze=0,jt=null,an(e,t,u,6);break;case 8:Zs(),Qe=6;break e;default:throw Error(r(462))}}uv();break}catch(b){l0(e,b)}while(!0);return vl=ia=null,B.H=a,B.A=n,pe=l,me!==null?0:(Me=null,xe=0,Cu(),Qe)}function uv(){for(;me!==null&&!Nh();)i0(me)}function i0(e){var t=Nd(e.alternate,e,Sl);e.memoizedProps=e.pendingProps,t===null?ji(e):me=t}function c0(e){var t=e,l=t.alternate;switch(t.tag){case 15:case 0:t=vd(l,t,t.pendingProps,t.type,void 0,xe);break;case 11:t=vd(l,t,t.pendingProps,t.type.render,t.ref,xe);break;case 5:Pc(t);var a=t;a===We&&(oe?(Bu(a),a.tag===5&&a.stateNode!=null&&(we=a.stateNode)):(Bu(a),oe=!0));default:_d(l,t),t=me=Fo(t,Sl),t=Nd(l,t,Sl)}e.memoizedProps=e.pendingProps,t===null?ji(e):me=t}function an(e,t,l,a){vl=ia=null,Pc(t),Xa=null,Un=0;var n=t.return;try{if(K1(e,n,t,l,xe)){Qe=1,ni(e,Ct(l,e.current)),me=null;return}}catch(u){if(n!==null)throw me=n,u;Qe=1,ni(e,Ct(l,e.current)),me=null;return}t.flags&32768?(oe||a===1?e=!0:Fa||(xe&536870912)!==0?e=!1:(Ql=e=!0,(a===2||a===9||a===3||a===6)&&(a=at.current,a!==null&&a.tag===13&&(a.flags|=16384))),s0(t,e)):ji(t)}function ji(e){var t=e;do{if((t.flags&32768)!==0){s0(t,Ql);return}e=t.return;var l=F1(t.alternate,t,Sl);if(l!==null){me=l;return}if(t=t.sibling,t!==null){me=t;return}me=t=e}while(t!==null);Qe===0&&(Qe=5)}function s0(e,t){do{var l=W1(e.alternate,e);if(l!==null){l.flags&=32767,me=l;return}if(l=e.return,l!==null&&(l.flags|=32768,l.subtreeFlags=0,l.deletions=null),!t&&(e=e.sibling,e!==null)){me=e;return}me=e=l}while(e!==null);Qe=6,me=null}function f0(e,t,l,a,n,u,i,s,f,x,b,_){e.cancelPendingCommit=null;do Ei();while(Be!==0);if((pe&6)!==0)throw Error(r(327));if(t!==null){if(t===e.current)throw Error(r(177));e===Me&&(me=Me=null,xe=0),ba=t,Vt=e,al=l,Ls=n,Id=a,iv(e,t,l,i,s,f,_)}}function iv(e,t,l,a,n,u,i){var s=t.lanes|t.childLanes;if(Vs=s,s|=Ec,Ch(e,l,s,a,n,u),Pa=null,(l&335544064)===l?(en=U1(e),a=10262):(en=null,a=10256),(t.subtreeFlags&a)!==0||(t.flags&a)!==0?(e.callbackNode=null,e.callbackPriority=0,dv(vu,function(){return Fs(),null})):(e.callbackNode=null,e.callbackPriority=0),di=!1,a=(t.flags&13878)!==0,(t.subtreeFlags&13878)!==0||a){a=B.T,B.T=null,n=ee.p,ee.p=2,u=pe,pe|=4;try{I1(e,t,l)}finally{pe=u,ee.p=n,B.T=a}}Be=1,di?Ia=Cv(i,e.containerInfo,en,Js,ks,sv,$s,Fs,cv):(Js(),ks(),$s())}function cv(e){if(Be!==0){var t=Vt.onRecoverableError;t(e,{componentStack:null})}}function sv(){Be===3&&(Be=0,Zd(ba,Vt),Be=4)}function Js(){if(Be===1){Be=0;var e=Vt,t=ba,l=al,a=(t.flags&13878)!==0;if((t.subtreeFlags&13878)!==0||a){a=B.T,B.T=null;var n=ee.p;ee.p=2;var u=pe;pe|=4;try{Kn=vi=!1,Vd(t,e,l),l=ff;var i=Go(e.containerInfo),s=l.focusedElem,f=l.selectionRange;if(i!==s&&s&&s.ownerDocument&&Yo(s.ownerDocument.documentElement,s)){if(f!==null&&Nc(s)){var x=f.start,b=f.end;if(b===void 0&&(b=x),"selectionStart"in s)s.selectionStart=x,s.selectionEnd=Math.min(b,s.value.length);else{var _=s.ownerDocument||document,h=_&&_.defaultView||window;if(h.getSelection){var g=h.getSelection(),C=s.textContent.length,Y=Math.min(f.start,C),ue=f.end===void 0?Y:Math.min(f.end,C);!g.extend&&Y>ue&&(i=ue,ue=Y,Y=i);var v=Bo(s,Y),d=Bo(s,ue);if(v&&d&&(g.rangeCount!==1||g.anchorNode!==v.node||g.anchorOffset!==v.offset||g.focusNode!==d.node||g.focusOffset!==d.offset)){var y=_.createRange();y.setStart(v.node,v.offset),g.removeAllRanges(),Y>ue?(g.addRange(y),g.extend(d.node,d.offset)):(y.setEnd(d.node,d.offset),g.addRange(y))}}}}for(_=[],g=s;g=g.parentNode;)g.nodeType===1&&_.push({element:g,left:g.scrollLeft,top:g.scrollTop});for(typeof s.focus=="function"&&s.focus(),s=0;s<_.length;s++){var z=_[s];z.element.scrollLeft=z.left,z.element.scrollTop=z.top}}dn=!!sf,ff=sf=null}finally{pe=u,ee.p=n,B.T=a}}e.current=t,Be=2}}function ks(){if(Be===2){Be=0;var e=Vt,t=ba,l=(t.flags&8772)!==0;if((t.subtreeFlags&8772)!==0||l){l=B.T,B.T=null;var a=ee.p;ee.p=2;var n=pe;pe|=4;try{qd(e,t.alternate,t)}finally{pe=n,ee.p=a,B.T=l}}Be=3}}function $s(){if(Be===4||Be===3){Be=0;var e=Ia;Ia=null,zh();var t=Vt,l=ba,a=al,n=Id,u=(a&335544064)===a?10262:10256;if((l.subtreeFlags&u)!==0||(l.flags&u)!==0?Be=5:(Be=0,ba=Vt=null,o0(t,t.pendingLanes)),u=t.pendingLanes,u===0&&(Vl=null),nc(a),l=l.stateNode,pt&&typeof pt.onCommitFiberRoot=="function")try{pt.onCommitFiberRoot(vn,l,void 0,(l.current.flags&128)===128)}catch{}if(n!==null){l=B.T,u=ee.p,ee.p=2,B.T=null;try{for(var i=t.onRecoverableError,s=0;s<n.length;s++){var f=n[s];i(f.value,{componentStack:f.stack})}}finally{B.T=l,ee.p=u}}if(n=Pa,i=en,en=null,n!==null&&(Pa=null,i===null&&(i=[]),e!==null))for(f=0;f<n.length;f++)l=(0,n[f])(i),l!==void 0&&e.finished.finally(l);(al&3)!==0&&Ei(),nl(t),u=t.pendingLanes,(a&261930)!==0&&(u&42)!==0?t===zi?Fn++:(Fn=0,zi=t):(Fn=0,zi=null),Wn(0)}}function o0(e,t){(e.pooledCacheLanes&=t)===0&&(t=e.pooledCache,t!=null&&(e.pooledCache=null,Dn(t)))}function Ei(){return Ia!==null&&(Ia.skipTransition(),Ia=null),Js(),ks(),$s(),Fs()}function Fs(){if(Be!==5)return!1;var e=Vt,t=Vs;Vs=0;var l=nc(al),a=B.T,n=ee.p;try{ee.p=32>l?32:l,B.T=null,l=Ls,Ls=null;var u=Vt,i=al;if(Be=0,ba=Vt=null,al=0,(pe&6)!==0)throw Error(r(331));var s=pe;if(pe|=4,$d(u.current),Kd(u,u.current,i,l),pe=s,Wn(0,!1),pt&&typeof pt.onPostCommitFiberRoot=="function")try{pt.onPostCommitFiberRoot(vn,u)}catch{}return!0}finally{ee.p=n,B.T=a,o0(e,t)}}function r0(e,t,l){t=Ct(l,t),t=ms(e.stateNode,t,2),e=Rl(e,t,2),e!==null&&(yn(e,2),nl(e))}function _e(e,t,l){if(e.tag===3)r0(e,e,l);else for(;t!==null;){if(t.tag===3){r0(t,e,l);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Vl===null||!Vl.has(a))){e=Ct(l,e),l=cd(2),a=Rl(t,l,2),a!==null&&(sd(l,a,t,e),yn(a,2),nl(a));break}}t=t.return}}function Ws(e,t,l){var a=e.pingCache;if(a===null){a=e.pingCache=new tv;var n=new Set;a.set(t,n)}else n=a.get(t),n===void 0&&(n=new Set,a.set(t,n));n.has(l)||(Qs=!0,n.add(l),e=fv.bind(null,e,t,l),t.then(e,e))}function fv(e,t,l){var a=e.pingCache;a!==null&&a.delete(t),e.pingedLanes|=e.suspendedLanes&l,e.warmLanes&=~l,Me===e&&(xe&l)===l&&((Qe===4||Qe===3&&(xe&62914560)===xe&&300>bt()-pi)&&(pe&2)===0?ln(e,0):bi|=l,Wa===xe&&(Wa=0)),nl(e)}function d0(e,t){t===0&&(t=Ff()),e=aa(e,t),e!==null&&(yn(e,t),nl(e))}function ov(e){var t=e.memoizedState,l=0;t!==null&&(l=t.retryLane),d0(e,l)}function rv(e,t){var l=0;switch(e.tag){case 31:case 13:var a=e.stateNode,n=e.memoizedState;n!==null&&(l=n.retryLane);break;case 19:a=e.stateNode;break;case 22:a=e.stateNode._retryCache;break;default:throw Error(r(314))}a!==null&&a.delete(t),d0(e,l)}function dv(e,t){return ec(e,t)}var nn=null,un=null,Is=!1,Oi=!1,Ps=!1,Zl=0;function nl(e){e!==un&&e.next===null&&(un===null?nn=un=e:un=un.next=e),Oi=!0,Is||(Is=!0,hv())}function Wn(e,t){if(!Ps&&Oi){Ps=!0;do for(var l=!1,a=nn;a!==null;){if(e!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var i=a.suspendedLanes,s=a.pingedLanes;u=(1<<31-St(42|e)+1)-1,u&=n&~(i&~s),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,x0(a,u))}else u=xe,u=bu(a,a===Me?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||xn(a,u)||(l=!0,x0(a,u));a=a.next}while(l);Ps=!1}}function mv(){m0()}function m0(){Oi=Is=!1;var e=0;Zl!==0&&Tv()&&(e=Zl);for(var t=bt(),l=null,a=nn;a!==null;){var n=a.next,u=h0(a,t);u===0?(a.next=null,l===null?nn=n:l.next=n,n===null&&(un=l)):(l=a,(e!==0||(u&3)!==0)&&(Oi=!0)),a=n}Be!==0&&Be!==5||Wn(e),Zl!==0&&(Zl=0)}function h0(e,t){for(var l=e.suspendedLanes,a=e.pingedLanes,n=e.expirationTimes,u=e.pendingLanes&-62914561;0<u;){var i=31-St(u),s=1<<i,f=n[i];f===-1?((s&l)===0||(s&a)!==0)&&(n[i]=Dh(s,t)):f<=t&&(e.expiredLanes|=s),u&=~s}if(t=Me,l=xe,l=bu(e,e===t?l:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),a=e.callbackNode,l===0||e===t&&(ze===2||ze===9)||e.cancelPendingCommit!==null)return a!==null&&a!==null&&tc(a),e.callbackNode=null,e.callbackPriority=0;if((l&3)===0||xn(e,l)){if(t=l&-l,t===e.callbackPriority)return t;switch(a!==null&&tc(a),nc(l)){case 2:case 8:l=Jf;break;case 32:l=vu;break;case 268435456:l=kf;break;default:l=vu}return a=v0.bind(null,e),l=ec(l,a),e.callbackPriority=t,e.callbackNode=l,t}return a!==null&&a!==null&&tc(a),e.callbackPriority=2,e.callbackNode=null,2}function v0(e,t){if(Be!==0&&Be!==5)return e.callbackNode=null,e.callbackPriority=0,null;var l=e.callbackNode;if(Ei()&&e.callbackNode!==l)return null;var a=xe;return a=bu(e,e===Me?a:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),a===0?null:(e0(e,a,t),h0(e,bt()),e.callbackNode!=null&&e.callbackNode===l?v0.bind(null,e):null)}function x0(e,t){if(Ei())return null;e0(e,t,!0)}function hv(){Ev(function(){(pe&6)!==0?ec(Kf,mv):m0()})}function ef(){if(Zl===0){var e=fa;e===0&&(e=xu,xu<<=1,(xu&261888)===0&&(xu=256)),Zl=e}return Zl}function y0(e){return e==null||typeof e=="symbol"||typeof e=="boolean"?null:typeof e=="function"?e:_u(e)}function vv(e,t,l,a,n){if(t==="submit"&&l&&l.stateNode===n){var u=y0((n[mt]||null).action),i=a.submitter;i&&(t=(t=i[mt]||null)?y0(t.formAction):i.getAttribute("formAction"),t!==null&&(u=t,i=null));var s=new Ou("action","action",null,a,n);e.push({event:s,listeners:[{instance:null,listener:function(){if(a.defaultPrevented){if(Zl!==0){var f=new FormData(n,i);ss(l,{pending:!0,data:f,method:n.method,action:u},null,f)}}else typeof u=="function"&&(s.preventDefault(),f=new FormData(n,i),ss(l,{pending:!0,data:f,method:n.method,action:u},u,f))},currentTarget:n}]})}}for(var tf=0;tf<jc.length;tf++){var lf=jc[tf],xv=lf.toLowerCase(),yv=lf[0].toUpperCase()+lf.slice(1);Yt(xv,"on"+yv)}Yt(Vo,"onAnimationEnd"),Yt(Lo,"onAnimationIteration"),Yt(Zo,"onAnimationStart"),Yt("dblclick","onDoubleClick"),Yt("focusin","onFocus"),Yt("focusout","onBlur"),Yt(j1,"onTransitionRun"),Yt(E1,"onTransitionStart"),Yt(O1,"onTransitionCancel"),Yt(Ko,"onTransitionEnd"),Ea("onMouseEnter",["mouseout","mouseover"]),Ea("onMouseLeave",["mouseout","mouseover"]),Ea("onPointerEnter",["pointerout","pointerover"]),Ea("onPointerLeave",["pointerout","pointerover"]),ea("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),ea("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),ea("onBeforeInput",["compositionend","keypress","textInput","paste"]),ea("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),ea("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),ea("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var In="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),gv=new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(In));function g0(e,t){t=(t&4)!==0;for(var l=0;l<e.length;l++){var a=e[l],n=a.event;a=a.listeners;e:{var u=void 0;if(t)for(var i=a.length-1;0<=i;i--){var s=a[i],f=s.instance,x=s.currentTarget;if(s=s.listener,f!==u&&n.isPropagationStopped())break e;u=s,n.currentTarget=x;try{u(n)}catch(b){Du(b)}n.currentTarget=null,u=f}else for(i=0;i<a.length;i++){if(s=a[i],f=s.instance,x=s.currentTarget,s=s.listener,f!==u&&n.isPropagationStopped())break e;u=s,n.currentTarget=x;try{u(n)}catch(b){Du(b)}n.currentTarget=null,u=f}}}}function he(e,t){var l=t[lo];l===void 0&&(l=t[lo]=new Set);var a=e+"__bubble";l.has(a)||(b0(t,e,2,!1),l.add(a))}function af(e,t,l){var a=0;t&&(a|=4),b0(l,e,a,t)}var Ai="_reactListening"+Math.random().toString(36).slice(2);function nf(e){if(!e[Ai]){e[Ai]=!0,uo.forEach(function(l){l!=="selectionchange"&&(gv.has(l)||af(l,!1,e),af(l,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Ai]||(t[Ai]=!0,af("selectionchange",!1,t))}}function b0(e,t,l,a){switch(sm(t)){case 2:var n=ox;break;case 8:n=rx;break;default:n=Tf}l=n.bind(null,t,l,e),n=void 0,!dc||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(n=!0),a?n!==void 0?e.addEventListener(t,l,{capture:!0,passive:n}):e.addEventListener(t,l,!0):n!==void 0?e.addEventListener(t,l,{passive:n}):e.addEventListener(t,l,!1)}function uf(e,t,l,a,n){var u=a;if((t&1)===0&&(t&2)===0&&a!==null)e:for(;;){if(a===null)return;var i=a.tag;if(i===3||i===4){var s=a.stateNode.containerInfo;if(s===n)break;if(i===4)for(i=a.return;i!==null;){var f=i.tag;if((f===3||f===4)&&i.stateNode.containerInfo===n)return;i=i.return}for(;s!==null;){if(i=Pl(s),i===null)return;if(f=i.tag,f===5||f===6||f===26||f===27){a=u=i;continue e}s=s.parentNode}}a=a.return}bo(function(){var x=u,b=oc(l),_=[];e:{var h=Jo.get(e);if(h!==void 0){var g=Ou,C=e;switch(e){case"keypress":if(ju(l)===0)break e;case"keydown":case"keyup":g=l1;break;case"focusin":C="focus",g=xc;break;case"focusout":C="blur",g=xc;break;case"beforeblur":case"afterblur":g=xc;break;case"click":if(l.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":g=No;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":g=Lh;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":g=c1;break;case Vo:case Lo:case Zo:g=Jh;break;case Ko:g=f1;break;case"scroll":case"scrollend":g=Xh;break;case"wheel":g=r1;break;case"copy":case"cut":case"paste":g=$h;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":g=_o;break;case"submit":g=u1;break;case"toggle":case"beforetoggle":g=m1}var Y=(t&4)!==0,ue=!Y&&(e==="scroll"||e==="scrollend"),v=Y?h!==null?h+"Capture":null:h;Y=[];for(var d=x,y;d!==null;){var z=d;if(y=z.stateNode,z=z.tag,z!==5&&z!==26&&z!==27||y===null||v===null||(z=pn(d,v),z!=null&&Y.push(Pn(d,z,y))),ue)break;d=d.return}0<Y.length&&(h=new g(h,C,null,l,b),_.push({event:h,listeners:Y}))}}if((t&7)===0){e:{if(g=e==="mouseover"||e==="pointerover",h=e==="mouseout"||e==="pointerout",g&&l!==fc&&(C=l.relatedTarget||l.fromElement)&&(Pl(C)||C[_a]))break e;(h||g)&&(C=b.window===b?b:(g=b.ownerDocument)?g.defaultView||g.parentWindow:window,h?(g=l.relatedTarget||l.toElement,h=x,g=g?Pl(g):null,g!==null&&(ue=M(g),Y=g.tag,g!==ue||Y!==5&&Y!==27&&Y!==6)&&(g=null)):(h=null,g=x),h!==g&&(Y=No,z="onMouseLeave",v="onMouseEnter",d="mouse",(e==="pointerout"||e==="pointerover")&&(Y=_o,z="onPointerLeave",v="onPointerEnter",d="pointer"),ue=h==null?C:bn(h),y=g==null?C:bn(g),C=new Y(z,d+"leave",h,l,b),C.target=ue,C.relatedTarget=y,z=null,Pl(b)===x&&(Y=new Y(v,d+"enter",g,l,b),Y.target=y,Y.relatedTarget=ue,z=Y),ue=z,Y=h&&g?se(h,g,bv):null,h!==null&&p0(_,C,h,Y,!1),g!==null&&ue!==null&&p0(_,ue,g,Y,!0)))}e:{if(h=x?bn(x):window,g=h.nodeName&&h.nodeName.toLowerCase(),g==="select"||g==="input"&&h.type==="file")var U=Co;else if(Mo(h))if(wo)U=z1;else{U=S1;var ye=p1}else g=h.nodeName,!g||g.toLowerCase()!=="input"||h.type!=="checkbox"&&h.type!=="radio"?x&&sc(x.elementType)&&(U=Co):U=N1;if(U&&(U=U(e,x))){Do(_,U,l,b);break e}ye&&ye(e,h,x)}switch(ye=x?bn(x):window,e){case"focusin":(Mo(ye)||ye.contentEditable==="true")&&(wa=ye,zc=x,On=null);break;case"focusout":On=zc=wa=null;break;case"mousedown":_c=!0;break;case"contextmenu":case"mouseup":case"dragend":_c=!1,Qo(_,l,b);break;case"selectionchange":if(T1)break;case"keydown":case"keyup":Qo(_,l,b)}var L;if(gc)e:{switch(e){case"compositionstart":var W="onCompositionStart";break e;case"compositionend":W="onCompositionEnd";break e;case"compositionupdate":W="onCompositionUpdate";break e}W=void 0}else Ca?Oo(e,l)&&(W="onCompositionEnd"):e==="keydown"&&l.keyCode===229&&(W="onCompositionStart");W&&(To&&l.locale!=="ko"&&(Ca||W!=="onCompositionStart"?W==="onCompositionEnd"&&Ca&&(L=po()):(jl=b,mc="value"in jl?jl.value:jl.textContent,Ca=!0)),ye=Mi(x,W),0<ye.length&&(W=new zo(W,e,null,l,b),_.push({event:W,listeners:ye}),L?W.data=L:(L=Ao(l),L!==null&&(W.data=L)))),(L=v1?x1(e,l):y1(e,l))&&(W=Mi(x,"onBeforeInput"),0<W.length&&(ye=new zo("onBeforeInput","beforeinput",null,l,b),_.push({event:ye,listeners:W}),ye.data=L)),vv(_,e,x,l,b)}g0(_,t)})}function Pn(e,t,l){return{instance:e,listener:t,currentTarget:l}}function Mi(e,t){for(var l=t+"Capture",a=[];e!==null;){var n=e,u=n.stateNode;if(n=n.tag,n!==5&&n!==26&&n!==27||u===null||(n=pn(e,l),n!=null&&a.unshift(Pn(e,n,u)),n=pn(e,t),n!=null&&a.push(Pn(e,n,u))),e.tag===3)return a;e=e.return}return[]}function bv(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5&&e.tag!==27);return e||null}function p0(e,t,l,a,n){for(var u=t._reactName,i=[];l!==null&&l!==a;){var s=l,f=s.alternate,x=s.stateNode;if(s=s.tag,f!==null&&f===a)break;s!==5&&s!==26&&s!==27||x===null||(f=x,n?(x=pn(l,u),x!=null&&i.unshift(Pn(l,x,f))):n||(x=pn(l,u),x!=null&&i.push(Pn(l,x,f)))),l=l.return}i.length!==0&&e.push({event:t,listeners:i})}var pv=/\r\n?/g,Sv=/\u0000|\uFFFD/g;function S0(e){return(typeof e=="string"?e:""+e).replace(pv,` | |
| 58 | +`).replace(Sv,"")}function N0(e,t){return t=S0(t),S0(e)===t}function Te(e,t,l,a,n,u){switch(l){case"children":if(typeof a=="string")t==="body"||t==="textarea"&&a===""||Aa(e,a);else if(typeof a=="number"||typeof a=="bigint")t!=="body"&&Aa(e,""+a);else return;break;case"className":zu(e,"class",a);break;case"tabIndex":zu(e,"tabindex",a);break;case"dir":case"role":case"viewBox":case"width":case"height":zu(e,l,a);break;case"style":yo(e,a,u);return;case"data":if(t!=="object"){zu(e,"data",a);break}case"src":case"href":if(a===""&&(t!=="a"||l!=="href")){e.removeAttribute(l);break}if(a==null||typeof a=="function"||typeof a=="symbol"||typeof a=="boolean"){e.removeAttribute(l);break}a=_u(a),e.setAttribute(l,a);break;case"action":case"formAction":if(typeof a=="function"){e.setAttribute(l,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof u=="function"&&(l==="formAction"?(t!=="input"&&Te(e,t,"name",n.name,n,null),Te(e,t,"formEncType",n.formEncType,n,null),Te(e,t,"formMethod",n.formMethod,n,null),Te(e,t,"formTarget",n.formTarget,n,null)):(Te(e,t,"encType",n.encType,n,null),Te(e,t,"method",n.method,n,null),Te(e,t,"target",n.target,n,null)));if(a==null||typeof a=="symbol"||typeof a=="boolean"){e.removeAttribute(l);break}a=_u(a),e.setAttribute(l,a);break;case"onClick":a!=null&&(e.onclick=kt);return;case"onScroll":a!=null&&he("scroll",e);return;case"onScrollEnd":a!=null&&he("scrollend",e);return;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(r(61));if(l=a.__html,l!=null){if(n.children!=null)throw Error(r(60));u?.__html!==l&&(e.innerHTML=l)}}break;case"multiple":e.multiple=a&&typeof a!="function"&&typeof a!="symbol";break;case"muted":e.muted=a&&typeof a!="function"&&typeof a!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(a==null||typeof a=="function"||typeof a=="boolean"||typeof a=="symbol"){e.removeAttribute("xlink:href");break}l=_u(a),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",l);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":a!=null&&typeof a!="function"&&typeof a!="symbol"?e.setAttribute(l,a):e.removeAttribute(l);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"credentialless":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":a&&typeof a!="function"&&typeof a!="symbol"?e.setAttribute(l,""):e.removeAttribute(l);break;case"capture":case"download":a===!0?e.setAttribute(l,""):a!==!1&&a!=null&&typeof a!="function"&&typeof a!="symbol"?e.setAttribute(l,a):e.removeAttribute(l);break;case"cols":case"rows":case"size":case"span":a!=null&&typeof a!="function"&&typeof a!="symbol"&&!isNaN(a)&&1<=a?e.setAttribute(l,a):e.removeAttribute(l);break;case"rowSpan":case"start":a==null||typeof a=="function"||typeof a=="symbol"||isNaN(a)?e.removeAttribute(l):e.setAttribute(l,a);break;case"popover":he("beforetoggle",e),he("toggle",e),Nu(e,"popover",a);break;case"xlinkActuate":fl(e,"http://www.w3.org/1999/xlink","xlink:actuate",a);break;case"xlinkArcrole":fl(e,"http://www.w3.org/1999/xlink","xlink:arcrole",a);break;case"xlinkRole":fl(e,"http://www.w3.org/1999/xlink","xlink:role",a);break;case"xlinkShow":fl(e,"http://www.w3.org/1999/xlink","xlink:show",a);break;case"xlinkTitle":fl(e,"http://www.w3.org/1999/xlink","xlink:title",a);break;case"xlinkType":fl(e,"http://www.w3.org/1999/xlink","xlink:type",a);break;case"xmlBase":fl(e,"http://www.w3.org/XML/1998/namespace","xml:base",a);break;case"xmlLang":fl(e,"http://www.w3.org/XML/1998/namespace","xml:lang",a);break;case"xmlSpace":fl(e,"http://www.w3.org/XML/1998/namespace","xml:space",a);break;case"is":Nu(e,"is",a);break;case"innerText":case"textContent":return;default:if(!(2<l.length)||l[0]!=="o"&&l[0]!=="O"||l[1]!=="n"&&l[1]!=="N")l=Gh.get(l)||l,Nu(e,l,a);else return}be=!0}function cf(e,t,l,a,n,u){switch(l){case"style":yo(e,a,u);return;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(r(61));if(l=a.__html,l!=null){if(n.children!=null)throw Error(r(60));u?.__html!==l&&(e.innerHTML=l)}}break;case"children":if(typeof a=="string")Aa(e,a);else if(typeof a=="number"||typeof a=="bigint")Aa(e,""+a);else return;break;case"onScroll":a!=null&&he("scroll",e);return;case"onScrollEnd":a!=null&&he("scrollend",e);return;case"onClick":a!=null&&(e.onclick=kt);return;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"innerHTML":case"ref":return;case"innerText":case"textContent":return;default:if(!io.hasOwnProperty(l))e:{if(l[0]==="o"&&l[1]==="n"&&(n=l.endsWith("Capture"),u=l.slice(2,n?l.length-7:void 0),t=e[mt]||null,t=t!=null?t[l]:null,typeof t=="function"&&e.removeEventListener(u,t,n),typeof a=="function")){typeof t!="function"&&t!==null&&(l in e?e[l]=null:e.hasAttribute(l)&&e.removeAttribute(l)),e.addEventListener(u,a,n);break e}be=!0,l in e?e[l]=a:a===!0?e.setAttribute(l,""):Nu(e,l,a)}return}be=!0}function it(e,t,l){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"img":he("error",e),he("load",e);var a=!1,n=!1,u;for(u in l)if(l.hasOwnProperty(u)){var i=l[u];if(i!=null)switch(u){case"src":a=!0;break;case"srcSet":n=!0;break;case"children":case"dangerouslySetInnerHTML":throw Error(r(137,t));default:Te(e,t,u,i,l,null)}}n&&Te(e,t,"srcSet",l.srcSet,l,null),a&&Te(e,t,"src",l.src,l,null);return;case"input":he("invalid",e);var s=u=i=n=null,f=null,x=null;for(a in l)if(l.hasOwnProperty(a)){var b=l[a];if(b!=null)switch(a){case"name":n=b;break;case"type":i=b;break;case"checked":f=b;break;case"defaultChecked":x=b;break;case"value":u=b;break;case"defaultValue":s=b;break;case"children":case"dangerouslySetInnerHTML":if(b!=null)throw Error(r(137,t));break;default:Te(e,t,a,b,l,null)}}mo(e,u,s,f,x,i,n,!1);return;case"select":he("invalid",e),a=i=u=null;for(n in l)if(l.hasOwnProperty(n)&&(s=l[n],s!=null))switch(n){case"value":u=s;break;case"defaultValue":i=s;break;case"multiple":a=s;default:Te(e,t,n,s,l,null)}t=u,l=i,e.multiple=!!a,t!=null?Oa(e,!!a,t,!1):l!=null&&Oa(e,!!a,l,!0);return;case"textarea":he("invalid",e),u=n=a=null;for(i in l)if(l.hasOwnProperty(i)&&(s=l[i],s!=null))switch(i){case"value":a=s;break;case"defaultValue":n=s;break;case"children":u=s;break;case"dangerouslySetInnerHTML":if(s!=null)throw Error(r(91));break;default:Te(e,t,i,s,l,null)}vo(e,a,n,u);return;case"option":for(f in l)if(l.hasOwnProperty(f)&&(a=l[f],a!=null))switch(f){case"selected":e.selected=a&&typeof a!="function"&&typeof a!="symbol";break;default:Te(e,t,f,a,l,null)}return;case"dialog":he("beforetoggle",e),he("toggle",e),he("cancel",e),he("close",e);break;case"iframe":case"object":he("load",e);break;case"video":case"audio":for(a=0;a<In.length;a++)he(In[a],e);break;case"image":he("error",e),he("load",e);break;case"details":he("toggle",e);break;case"embed":case"source":case"link":he("error",e),he("load",e);case"area":case"base":case"br":case"col":case"hr":case"keygen":case"meta":case"param":case"track":case"wbr":case"menuitem":for(x in l)if(l.hasOwnProperty(x)&&(a=l[x],a!=null))switch(x){case"children":case"dangerouslySetInnerHTML":throw Error(r(137,t));default:Te(e,t,x,a,l,null)}return;default:if(sc(t)){for(b in l)l.hasOwnProperty(b)&&(a=l[b],a!==void 0&&cf(e,t,b,a,l,void 0));return}}for(s in l)l.hasOwnProperty(s)&&(a=l[s],a!=null&&Te(e,t,s,a,l,null))}var Nv={};function zv(e,t,l,a){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var n=null,u=null,i=null,s=null,f=null,x=null,b=null;for(g in l){var _=l[g];if(l.hasOwnProperty(g)&&_!=null)switch(g){case"checked":break;case"value":break;case"defaultValue":f=_;default:a.hasOwnProperty(g)||Te(e,t,g,null,a,_)}}for(var h in a){var g=a[h];if(_=l[h],a.hasOwnProperty(h)&&(g!=null||_!=null))switch(h){case"type":g!==_&&(be=!0),u=g;break;case"name":g!==_&&(be=!0),n=g;break;case"checked":g!==_&&(be=!0),x=g;break;case"defaultChecked":g!==_&&(be=!0),b=g;break;case"value":g!==_&&(be=!0),i=g;break;case"defaultValue":g!==_&&(be=!0),s=g;break;case"children":case"dangerouslySetInnerHTML":if(g!=null)throw Error(r(137,t));break;default:g!==_&&Te(e,t,h,g,a,_)}}ic(e,i,s,f,x,b,u,n);return;case"select":g=i=s=h=null;for(u in l)if(f=l[u],l.hasOwnProperty(u)&&f!=null)switch(u){case"value":break;case"multiple":g=f;default:a.hasOwnProperty(u)||Te(e,t,u,null,a,f)}for(n in a)if(u=a[n],f=l[n],a.hasOwnProperty(n)&&(u!=null||f!=null))switch(n){case"value":u!==f&&(be=!0),h=u;break;case"defaultValue":u!==f&&(be=!0),s=u;break;case"multiple":u!==f&&(be=!0),i=u;default:u!==f&&Te(e,t,n,u,a,f)}t=s,l=i,a=g,h!=null?Oa(e,!!l,h,!1):!!a!=!!l&&(t!=null?Oa(e,!!l,t,!0):Oa(e,!!l,l?[]:"",!1));return;case"textarea":g=h=null;for(s in l)if(n=l[s],l.hasOwnProperty(s)&&n!=null&&!a.hasOwnProperty(s))switch(s){case"value":break;case"children":break;default:Te(e,t,s,null,a,n)}for(i in a)if(n=a[i],u=l[i],a.hasOwnProperty(i)&&(n!=null||u!=null))switch(i){case"value":n!==u&&(be=!0),h=n;break;case"defaultValue":n!==u&&(be=!0),g=n;break;case"children":break;case"dangerouslySetInnerHTML":if(n!=null)throw Error(r(91));break;default:n!==u&&Te(e,t,i,n,a,u)}ho(e,h,g);return;case"option":for(var C in l)if(h=l[C],l.hasOwnProperty(C)&&h!=null&&!a.hasOwnProperty(C))switch(C){case"selected":e.selected=!1;break;default:Te(e,t,C,null,a,h)}for(f in a)if(h=a[f],g=l[f],a.hasOwnProperty(f)&&h!==g&&(h!=null||g!=null))switch(f){case"selected":h!==g&&(be=!0),e.selected=h&&typeof h!="function"&&typeof h!="symbol";break;default:Te(e,t,f,h,a,g)}return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var Y in l)h=l[Y],l.hasOwnProperty(Y)&&h!=null&&!a.hasOwnProperty(Y)&&Te(e,t,Y,null,a,h);for(x in a)if(h=a[x],g=l[x],a.hasOwnProperty(x)&&h!==g&&(h!=null||g!=null))switch(x){case"children":case"dangerouslySetInnerHTML":if(h!=null)throw Error(r(137,t));break;default:Te(e,t,x,h,a,g)}return;default:if(sc(t)){for(var ue in l)h=l[ue],l.hasOwnProperty(ue)&&h!==void 0&&!a.hasOwnProperty(ue)&&cf(e,t,ue,void 0,a,h);for(b in a)h=a[b],g=l[b],!a.hasOwnProperty(b)||h===g||h===void 0&&g===void 0||cf(e,t,b,h,a,g);return}}for(var v in l)h=l[v],l.hasOwnProperty(v)&&h!=null&&!a.hasOwnProperty(v)&&Te(e,t,v,null,a,h);for(_ in a)h=a[_],g=l[_],!a.hasOwnProperty(_)||h===g||h==null&&g==null||Te(e,t,_,h,a,g)}function z0(e){switch(e){case"css":case"script":case"font":case"img":case"image":case"input":case"link":return!0;default:return!1}}function _v(){if(typeof performance.getEntriesByType=="function"){for(var e=0,t=0,l=performance.getEntriesByType("resource"),a=0;a<l.length;a++){var n=l[a],u=n.transferSize,i=n.initiatorType,s=n.duration;if(u&&s&&z0(i)){for(i=0,s=n.responseEnd,a+=1;a<l.length;a++){var f=l[a],x=f.startTime;if(x>s)break;var b=f.transferSize,_=f.initiatorType;b&&z0(_)&&(f=f.responseEnd,i+=b*(f<s?1:(s-x)/(f-x)))}if(--a,t+=8*(u+i)/(n.duration/1e3),e++,10<e)break}}if(0<e)return t/e/1e6}return navigator.connection&&(e=navigator.connection.downlink,typeof e=="number")?e:5}var sf=null,ff=null;function eu(e){return e.nodeType===9?e:e.ownerDocument}function _0(e){switch(e){case"http://www.w3.org/2000/svg":return 1;case"http://www.w3.org/1998/Math/MathML":return 2;default:return 0}}function T0(e,t){if(e===0)switch(t){case"svg":return 1;case"math":return 2;default:return 0}return e===1&&t==="foreignObject"?0:e}function j0(e,t,l,a){return l=eu(l).createElement(e),l[tt]=a,l[mt]=t,it(l,e,t),Fe(l),l}function of(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.children=="bigint"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var rf=null;function Tv(){var e=window.event;return e&&e.type==="popstate"?e===rf?!1:(rf=e,!0):(rf=null,!1)}var df=typeof setTimeout=="function"?setTimeout:void 0,jv=typeof clearTimeout=="function"?clearTimeout:void 0,E0=typeof Promise=="function"?Promise:void 0,O0=typeof requestAnimationFrame=="function"?requestAnimationFrame:df,Ev=typeof queueMicrotask=="function"?queueMicrotask:typeof E0<"u"?function(e){return E0.resolve(null).then(e).catch(Ov)}:df;function Ov(e){setTimeout(function(){throw e})}function Kl(e){return e==="head"}function A0(e,t){var l=t,a=0;do{var n=l.nextSibling;if(e.removeChild(l),n&&n.nodeType===8)if(l=n.data,l==="/$"||l==="/&"){if(a===0){e.removeChild(n),mn(t);return}a--}else if(l==="$"||l==="$?"||l==="$~"||l==="$!"||l==="&")a++;else if(l==="html")pf(e.ownerDocument.documentElement);else if(l==="head"){l=e.ownerDocument.head,pf(l);for(var u=l.firstChild;u;){var i=u.nextSibling,s=u.nodeName;u[gn]||s==="SCRIPT"||s==="STYLE"||s==="LINK"&&u.rel.toLowerCase()==="stylesheet"||l.removeChild(u),u=i}}else l==="body"&&pf(e.ownerDocument.body);l=n}while(l);mn(t)}function M0(e,t){var l=e;e=0;do{var a=l.nextSibling;if(l.nodeType===1?t?(l._stashedDisplay=l.style.display,l.style.display="none"):(l.style.display=l._stashedDisplay||"",l.getAttribute("style")===""&&l.removeAttribute("style")):l.nodeType===3&&(t?(l._stashedText=l.nodeValue,l.nodeValue=""):l.nodeValue=l._stashedText||""),a&&a.nodeType===8)if(l=a.data,l==="/$"){if(e===0)break;e--}else l!=="$"&&l!=="$?"&&l!=="$~"&&l!=="$!"||e++;l=a}while(l)}function D0(e,t,l){if(t=CSS.escape(t)!==t?"r-"+btoa(t).replace(/=/g,""):t,e.style.viewTransitionName=t,l!=null&&(e.style.viewTransitionClass=l),l=getComputedStyle(e),l.display==="inline"){if(t=e.getClientRects(),t.length===1)var a=1;else for(var n=a=0;n<t.length;n++){var u=t[n];0<u.width&&0<u.height&&a++}a===1&&(e=e.style,e.display=t.length===1?"inline-block":"block",e.marginTop="-"+l.paddingTop,e.marginBottom="-"+l.paddingBottom)}}function C0(e,t){e=e.style,t=t.style;var l=t!=null?t.hasOwnProperty("viewTransitionName")?t.viewTransitionName:t.hasOwnProperty("view-transition-name")?t["view-transition-name"]:null:null;e.viewTransitionName=l==null||typeof l=="boolean"?"":(""+l).trim(),l=t!=null?t.hasOwnProperty("viewTransitionClass")?t.viewTransitionClass:t.hasOwnProperty("view-transition-class")?t["view-transition-class"]:null:null,e.viewTransitionClass=l==null||typeof l=="boolean"?"":(""+l).trim(),e.display==="inline-block"&&(t==null?e.display=e.margin="":(l=t.display,e.display=l==null||typeof l=="boolean"?"":l,l=t.margin,l!=null?e.margin=l:(l=t.hasOwnProperty("marginTop")?t.marginTop:t["margin-top"],e.marginTop=l==null||typeof l=="boolean"?"":l,t=t.hasOwnProperty("marginBottom")?t.marginBottom:t["margin-bottom"],e.marginBottom=t==null||typeof t=="boolean"?"":t)))}function Av(e,t,l){return l=l.ownerDocument.defaultView,{rect:e,abs:t.position==="absolute"||t.position==="fixed",clip:t.clipPath!=="none"||t.overflow!=="visible"||t.filter!=="none"||t.mask!=="none"||t.mask!=="none"||t.borderRadius!=="0px",view:0<=e.bottom&&0<=e.right&&e.top<=l.innerHeight&&e.left<=l.innerWidth}}function mf(e){var t=e.getBoundingClientRect(),l=getComputedStyle(e);return Av(t,l,e)}function Mv(e){return e.documentElement.clientHeight}function Dv(e){this.addEventListener("load",e),this.addEventListener("error",e)}function Cv(e,t,l,a,n,u,i,s,f){var x=t.nodeType===9?t:t.ownerDocument;try{var b=x.startViewTransition({update:function(){var h=x.defaultView,g=h.navigation&&h.navigation.transition,C=x.fonts.status;a();var Y=[];if(C==="loaded"&&(Mv(x),x.fonts.status==="loading"&&Y.push(x.fonts.ready)),C=Y.length,e!==null)for(var ue=e.suspenseyImages,v=0,d=0;d<ue.length;d++){var y=ue[d];if(!y.complete){var z=y.getBoundingClientRect();if(0<z.bottom&&0<z.right&&z.top<h.innerHeight&&z.left<h.innerWidth){if(v+=P0(y),v>wi){Y.length=C;break}y=new Promise(Dv.bind(y)),Y.push(y)}}}if(0<Y.length)return h=Promise.race([Promise.all(Y),new Promise(function(U){return setTimeout(U,500)})]).then(n,n),(g?Promise.allSettled([g.finished,h]):h).then(u,u);if(n(),g)return g.finished.then(u,u);u()},types:l});x.__reactViewTransition=b;var _=[];return b.ready.then(function(){for(var h=x.documentElement.getAnimations({subtree:!0}),g=0;g<h.length;g++){var C=h[g],Y=C.effect,ue=Y.pseudoElement;if(ue!=null&&ue.startsWith("::view-transition")){_.push(C),C=Y.getKeyframes();for(var v=ue=void 0,d=!0,y=0;y<C.length;y++){var z=C[y],U=z.width;if(ue===void 0)ue=U;else if(ue!==U){d=!1;break}if(U=z.height,v===void 0)v=U;else if(v!==U){d=!1;break}delete z.width,delete z.height,z.transform==="none"&&delete z.transform}d&&ue!==void 0&&v!==void 0&&(Y.setKeyframes(C),d=getComputedStyle(Y.target,Y.pseudoElement),d.width!==ue||d.height!==v)&&(d=C[0],d.width=ue,d.height=v,d=C[C.length-1],d.width=ue,d.height=v,Y.setKeyframes(C))}}i()},function(h){x.__reactViewTransition===b&&(x.__reactViewTransition=null);try{if(typeof h=="object"&&h!==null)switch(h.name){case"InvalidStateError":(h.message==="View transition was skipped because document visibility state is hidden."||h.message==="Skipping view transition because document visibility state has become hidden."||h.message==="Skipping view transition because viewport size changed."||h.message==="Transition was aborted because of invalid state")&&(h=null)}h!==null&&f(h)}finally{a(),n(),i()}}),b.finished.finally(function(){for(var h=0;h<_.length;h++)_[h].cancel();x.__reactViewTransition===b&&(x.__reactViewTransition=null),s()}),b}catch{return a(),n(),i(),null}}function pa(e,t){this._scope=document.documentElement,this._selector="::view-transition-"+e+"("+t+")"}pa.prototype.animate=function(e,t){return t=typeof t=="number"?{duration:t}:Q({},t),t.pseudoElement=this._selector,this._scope.animate(e,t)},pa.prototype.getAnimations=function(){for(var e=this._scope,t=this._selector,l=e.getAnimations({subtree:!0}),a=[],n=0;n<l.length;n++){var u=l[n].effect;u!==null&&u.target===e&&u.pseudoElement===t&&a.push(l[n])}return a},pa.prototype.getComputedStyle=function(){return getComputedStyle(this._scope,this._selector)};function w0(e){return{name:e,group:new pa("group",e),imagePair:new pa("image-pair",e),old:new pa("old",e),new:new pa("new",e)}}function At(e){this._fragmentFiber=e,this._observers=this._eventListeners=null}At.prototype.addEventListener=function(e,t,l){var a=null,n=null;if(!(l!=null&&typeof l!="boolean"&&(a=l.signal||null,a!==null&&a.aborted))){this._eventListeners===null&&(this._eventListeners=[]);var u=this._eventListeners;if(R0(u,e,t,l)===-1){var i=this,s=t;l!=null&&typeof l!="boolean"&&l.once===!0&&(s=function(f){i.removeEventListener(e,t,l),typeof t=="function"?t.call(this,f):t.handleEvent(f)}),a!==null&&(n=i.removeEventListener.bind(i,e,t,l),a.addEventListener("abort",n,{once:!0}),n=a.removeEventListener.bind(a,"abort",n)),a=cn(l),u.push({type:e,listener:t,optionsOrUseCapture:l,attachedListener:s,cleanup:n}),S(this._fragmentFiber.child,!1,wv,e,s,a)}this._eventListeners=u}};function wv(e,t,l,a){return F(e).addEventListener(t,l,a),!1}At.prototype.removeEventListener=function(e,t,l){var a=this._eventListeners;if(a!==null&&(t=R0(a,e,t,l),t!==-1)){var n=a[t];l=n.attachedListener;var u=n.cleanup;n=cn(n.optionsOrUseCapture),S(this._fragmentFiber.child,!1,Uv,e,l,n),a.splice(t,1),u!==null&&u()}};function Uv(e,t,l,a){return F(e).removeEventListener(t,l,a),!1}function cn(e){return e!=null&&typeof e!="boolean"&&(e.once===!0||e.signal instanceof AbortSignal)?{capture:e.capture,passive:e.passive}:e}function U0(e){return e==null?"c=0":typeof e=="boolean"?"c="+(e?"1":"0"):"c="+(e.capture?"1":"0")}function R0(e,t,l,a){if(e.length===0)return-1;a=U0(a);for(var n=0;n<e.length;n++){var u=e[n];if(u.type===t&&u.listener===l&&U0(u.optionsOrUseCapture)===a)return n}return-1}At.prototype.dispatchEvent=function(e){var t=j(this._fragmentFiber);if(t===null)return!0;t=F(t);var l=this._eventListeners;if(l!==null&&0<l.length||!e.bubbles){var a=t.nodeType===9?t.createComment(""):document.createTextNode("");if(l)for(var n=0;n<l.length;n++){var u=l[n];a.addEventListener(u.type,u.attachedListener,cn(u.optionsOrUseCapture))}if(t.appendChild(a),e=a.dispatchEvent(e),l)for(n=0;n<l.length;n++)u=l[n],a.removeEventListener(u.type,u.attachedListener,cn(u.optionsOrUseCapture));return t.removeChild(a),e}return t.dispatchEvent(e)},At.prototype.focus=function(e){S(this._fragmentFiber.child,!0,H0,e,void 0,void 0)};function H0(e,t){return e.tag===6?!1:(e=F(e),Kv(e,t))}At.prototype.focusLast=function(e){var t=[];S(this._fragmentFiber.child,!0,hf,t,void 0,void 0);for(var l=t.length-1;0<=l&&!H0(t[l],e);l--);};function hf(e,t){return t.push(e),!1}At.prototype.blur=function(){var e=j(this._fragmentFiber);e!==null&&(e=F(e),e=eu(e).activeElement,e!==null&&S(this._fragmentFiber.child,!1,Rv,e,void 0,void 0))};function Rv(e,t){return e.tag===6?!1:(e=F(e),e===t||e.contains(t)?(t.blur(),!0):!1)}At.prototype.observeUsing=function(e){this._observers===null&&(this._observers=new Set),this._observers.add(e),S(this._fragmentFiber.child,!1,Hv,e,void 0,void 0)};function Hv(e,t){return e.tag===6||(e=F(e),t.observe(e)),!1}At.prototype.unobserveUsing=function(e){var t=this._observers;if(t!==null&&t.has(e)){t.delete(e),S(this._fragmentFiber.child,!1,qv,e,void 0,void 0);for(var l=t=0;l<Lt.length;l++){var a=Lt[l];a.fragmentInstance===this&&a.observer===e?e.unobserve(a.instance):Lt[t++]=a}Lt.length=t}};function qv(e,t){return e.tag===6||(e=F(e),t.unobserve(e)),!1}var Lt=[],vf=!1;function Bv(e,t,l){Lt.push({fragmentInstance:e,observer:t,instance:l}),vf||(vf=!0,Jv(function(){vf=!1;var a=Lt;Lt=[];for(var n=0;n<a.length;n++){var u=a[n];u.observer.unobserve(u.instance)}}))}At.prototype.getClientRects=function(){var e=[];return S(this._fragmentFiber.child,!1,Yv,e,void 0,void 0),e};function Yv(e,t){if(e.tag===6){e=e.stateNode;var l=e.ownerDocument.createRange();l.selectNodeContents(e),t.push.apply(t,l.getClientRects())}else e=F(e),t.push.apply(t,e.getClientRects());return!1}At.prototype.getRootNode=function(e){var t=j(this._fragmentFiber);return t===null?this:F(t).getRootNode(e)},At.prototype.compareDocumentPosition=function(e){var t=j(this._fragmentFiber);if(t===null)return Node.DOCUMENT_POSITION_DISCONNECTED;var l=[];S(this._fragmentFiber.child,!1,hf,l,void 0,void 0);var a=F(t);if(l.length===0){if(l=a,X(this._fragmentFiber)){e:{for(t=this._fragmentFiber.return;t!==null;){if(t.tag===4){t=t.stateNode.containerInfo;break e}if(t.tag===3||t.tag===5||t.tag===27)break;t=t.return}t=null}t!=null&&(l=t)}t=this._fragmentFiber;var n=a=l.compareDocumentPosition(e);return l===e?n=Node.DOCUMENT_POSITION_CONTAINS:a&Node.DOCUMENT_POSITION_CONTAINED_BY&&(l=le(t)[1],l===null?n=Node.DOCUMENT_POSITION_PRECEDING:(e=F(l).compareDocumentPosition(e),n=e===0||e&Node.DOCUMENT_POSITION_FOLLOWING?Node.DOCUMENT_POSITION_FOLLOWING:Node.DOCUMENT_POSITION_PRECEDING)),n|=Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC}t=F(l[0]),n=F(l[l.length-1]);var u=X(this._fragmentFiber)?t.parentElement:a;if(u==null)return Node.DOCUMENT_POSITION_DISCONNECTED;a=u.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY,u=u.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_CONTAINED_BY;var i=t.compareDocumentPosition(e),s=n.compareDocumentPosition(e),f=i&Node.DOCUMENT_POSITION_CONTAINED_BY||s&Node.DOCUMENT_POSITION_CONTAINED_BY;return s=a&&u&&i&Node.DOCUMENT_POSITION_FOLLOWING&&s&Node.DOCUMENT_POSITION_PRECEDING,t=a&&t===e||u&&n===e||f||s?Node.DOCUMENT_POSITION_CONTAINED_BY:!a&&t===e||!u&&n===e?Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC:i,t&Node.DOCUMENT_POSITION_DISCONNECTED||t&Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC||Gv(t,this._fragmentFiber,l[0],l[l.length-1],e)?t:Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC};function Gv(e,t,l,a,n){var u=Pl(n);if(e&Node.DOCUMENT_POSITION_CONTAINED_BY){if(l=!!u)e:{for(;u!==null;){if(u.tag===7&&(u===t||u.alternate===t)){l=!0;break e}u=u.return}l=!1}return l}if(e&Node.DOCUMENT_POSITION_CONTAINS){if(u===null)return u=n.ownerDocument,n===u||n===u.documentElement||n===u.body;e:{for(u=t,t=j(t);u!==null;){if(!(u.tag!==5&&u.tag!==3&&u.tag!==27||u!==t&&u.alternate!==t)){u=!0;break e}u=u.return}u=!1}return u}return e&Node.DOCUMENT_POSITION_PRECEDING?((t=!!u)&&!(t=u===l)&&(t=se(l,u,R),t===null?t=!1:(S(t,!0,Re,u,l),u=De,De=null,t=u!==null)),t):e&Node.DOCUMENT_POSITION_FOLLOWING?((t=!!u)&&!(t=u===a)&&(t=se(a,u,R),t===null?t=!1:(S(t,!0,Z,u,a),u=De,ve=De=null,t=u!==null)),t):!1}function q0(e,t){var l=e.ownerDocument.createRange();l.selectNodeContents(e),e=l.getBoundingClientRect(),window.scrollTo(window.scrollX+e.left,t?window.scrollY+e.top:window.scrollY+e.bottom-window.innerHeight)}At.prototype.scrollIntoView=function(e){if(typeof e=="object")throw Error(r(566));var t=[];S(this._fragmentFiber.child,!1,hf,t,void 0,void 0);var l=e!==!1;if(t.length===0){var a=le(this._fragmentFiber);if(a=l?a[1]||a[0]||j(this._fragmentFiber):a[0]||a[1],a===null)return;if(a.tag===6){e=F(a),q0(e,l);return}if(a=F(a),a.nodeType!==9){if(a.nodeType===11){l="host"in a?a.host:null,l!==null&&l.scrollIntoView(e);return}a.scrollIntoView(e)}}for(a=l?t.length-1:0;a!==(l?-1:t.length);){var n=t[a];n.tag===6?(n=F(n),q0(n,l)):F(n).scrollIntoView(e),a+=l?-1:1}};function Qv(e,t){return e=F(e),B0(e,t),!1}function B0(e,t){e.reactFragments==null&&(e.reactFragments=new Set),e.reactFragments.add(t)}function Y0(e,t){var l=t._eventListeners;if(l!==null)for(var a=0;a<l.length;a++){var n=l[a];e.addEventListener(n.type,n.attachedListener,cn(n.optionsOrUseCapture))}e.nodeType!==3&&(l=t._observers,l!==null&&l.forEach(function(u){for(var i=0,s=0;s<Lt.length;s++){var f=Lt[s];(f.fragmentInstance!==t||f.observer!==u||f.instance!==e)&&(Lt[i++]=f)}Lt.length=i,u.observe(e)}),B0(e,t))}function Xv(e,t){var l=t._eventListeners;if(l!==null)for(var a=0;a<l.length;a++){var n=l[a];e.removeEventListener(n.type,n.attachedListener,cn(n.optionsOrUseCapture))}e.nodeType!==3&&(l=t._observers,l!==null&&l.forEach(function(u){typeof u.rootMargin=="string"?Bv(t,u,e):u.unobserve(e)}),e.reactFragments!=null&&e.reactFragments.delete(t))}function xf(e){var t=e.firstChild;for(t&&t.nodeType===10&&(t=t.nextSibling);t;){var l=t;switch(t=t.nextSibling,l.nodeName){case"HTML":case"HEAD":case"BODY":xf(l),Su(l);continue;case"SCRIPT":case"STYLE":continue;case"LINK":if(l.rel.toLowerCase()==="stylesheet")continue}e.removeChild(l)}}function Vv(e,t,l,a){for(;e.nodeType===1;){var n=l;if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!a&&(e.nodeName!=="INPUT"||e.type!=="hidden"))break}else if(a){if(!e[gn])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if(u=e.getAttribute("rel"),u==="stylesheet"&&e.hasAttribute("data-precedence"))break;if(u!==n.rel||e.getAttribute("href")!==(n.href==null||n.href===""?null:n.href)||e.getAttribute("crossorigin")!==(n.crossOrigin==null?null:n.crossOrigin)||e.getAttribute("title")!==(n.title==null?null:n.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(u=e.getAttribute("src"),(u!==(n.src==null?null:n.src)||e.getAttribute("type")!==(n.type==null?null:n.type)||e.getAttribute("crossorigin")!==(n.crossOrigin==null?null:n.crossOrigin))&&u&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else if(t==="input"&&e.type==="hidden"){var u=n.name==null?null:""+n.name;if(n.type==="hidden"&&e.getAttribute("name")===u)return e}else return e;if(e=qt(e.nextSibling),e===null)break}return null}function Lv(e,t,l){if(t==="")return null;for(;e.nodeType!==3;)if((e.nodeType!==1||e.nodeName!=="INPUT"||e.type!=="hidden")&&!l||(e=qt(e.nextSibling),e===null))return null;return e}function G0(e,t){for(;e.nodeType!==8;)if((e.nodeType!==1||e.nodeName!=="INPUT"||e.type!=="hidden")&&!t||(e=qt(e.nextSibling),e===null))return null;return e}function yf(e){return e.data==="$?"||e.data==="$~"}function gf(e){return e.data==="$!"||e.data==="$?"&&e.ownerDocument.readyState!=="loading"}function Zv(e,t){var l=e.ownerDocument;if(e.data==="$~")e._reactRetry=t;else if(e.data!=="$?"||l.readyState!=="loading")t();else{var a=function(){t(),l.removeEventListener("DOMContentLoaded",a)};l.addEventListener("DOMContentLoaded",a),e._reactRetry=a}}function qt(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?"||t==="$~"||t==="&"||t==="F!"||t==="F")break;if(t==="/$"||t==="/&")return null}}return e}var bf=null;function Q0(e){e=e.nextSibling;for(var t=0;e;){if(e.nodeType===8){var l=e.data;if(l==="/$"||l==="/&"){if(t===0)return qt(e.nextSibling);t--}else l!=="$"&&l!=="$!"&&l!=="$?"&&l!=="$~"&&l!=="&"||t++}e=e.nextSibling}return null}function X0(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var l=e.data;if(l==="$"||l==="$!"||l==="$?"||l==="$~"||l==="&"){if(t===0)return e;t--}else l!=="/$"&&l!=="/&"||t++}e=e.previousSibling}return null}function Kv(e,t){function l(){a=!0}if(e.ownerDocument.activeElement===e)return!0;var a=!1;try{e.ownerDocument.addEventListener("focus",l,!0),(e.focus||HTMLElement.prototype.focus).call(e,t)}finally{e.ownerDocument.removeEventListener("focus",l,!0)}return a}function Jv(e){O0(function(){O0(function(t){return e(t)})})}function V0(e,t,l){switch(t=eu(l),e){case"html":if(e=t.documentElement,!e)throw Error(r(452));return e;case"head":if(e=t.head,!e)throw Error(r(453));return e;case"body":if(e=t.body,!e)throw Error(r(454));return e;default:throw Error(r(451))}}function L0(e,t,l){for(var a in l){var n=l[a];l.hasOwnProperty(a)&&n!=null&&Te(e,t,a,null,Nv,n)}l.dangerouslySetInnerHTML!=null&&(e.textContent=""),e.onclick===kt&&(e.onclick=null),Su(e)}function pf(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);Su(e)}var Bt=new Map,Z0=new Set;function tu(e){if(typeof e.getRootNode=="function"){var t=e.getRootNode();if(t.nodeType===9||t.nodeType===11)return t}return e.nodeType===9?e:e.ownerDocument}var Nl=ee.d;ee.d={f:kv,r:$v,D:Fv,C:Wv,L:Iv,m:Pv,X:tx,S:ex,M:lx};function kv(){var e=Nl.f(),t=_i();return e||t}function $v(e){var t=Ta(e);t!==null&&t.tag===5&&t.type==="form"?Jr(t):Nl.r(e)}var sn=typeof document>"u"?null:document;function K0(e,t,l){var a=sn;if(a&&typeof t=="string"&&t){var n=Mt(t);n='link[rel="'+e+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),Z0.has(n)||(Z0.add(n),e={rel:e,crossOrigin:l,href:t},a.querySelector(n)===null&&(t=a.createElement("link"),it(t,"link",e),Fe(t),a.head.appendChild(t)))}}function Fv(e){Nl.D(e),K0("dns-prefetch",e,null)}function Wv(e,t){Nl.C(e,t),K0("preconnect",e,t)}function Iv(e,t,l){Nl.L(e,t,l);var a=sn;if(a&&e&&t){var n='link[rel="preload"][as="'+Mt(t)+'"]';t==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+Mt(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+Mt(l.imageSizes)+'"]')):n+='[href="'+Mt(e)+'"]';var u=n;switch(t){case"style":u=fn(e);break;case"script":u=on(e)}if(!(Bt.has(u)||(e=Q({rel:"preload",href:t==="image"&&l&&l.imageSrcSet?void 0:e,as:t},l),Bt.set(u,e),a.querySelector(n)!==null||t==="style"&&a.querySelector(lu(u))||t==="script"&&a.querySelector(au(u))))){var i=a.createElement("link");it(i,"link",e),t==="style"&&(i[pu]=!0,i.onload=i.onerror=function(){no(i)}),Fe(i),a.head.appendChild(i)}}}function Pv(e,t){Nl.m(e,t);var l=sn;if(l&&e){var a=t&&typeof t.as=="string"?t.as:"script",n='link[rel="modulepreload"][as="'+Mt(a)+'"][href="'+Mt(e)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=on(e)}if(!Bt.has(u)&&(e=Q({rel:"modulepreload",href:e},t),Bt.set(u,e),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(au(u)))return}a=l.createElement("link"),it(a,"link",e),Fe(a),l.head.appendChild(a)}}}function ex(e,t,l){Nl.S(e,t,l);var a=sn;if(a&&e){var n=ja(a).hoistableStyles,u=fn(e);t=t||"default";var i=n.get(u);if(!i){var s={loading:0,preload:null};if(i=a.querySelector(lu(u)))s.loading=5;else{e=Q({rel:"stylesheet",href:e,"data-precedence":t},l),(l=Bt.get(u))&&Sf(e,l);var f=i=a.createElement("link");Fe(f),it(f,"link",e),f._p=new Promise(function(x,b){f.onload=x,f.onerror=b}),f.addEventListener("load",function(){s.loading|=1}),f.addEventListener("error",function(){s.loading|=2}),s.loading|=4,Di(i,t,a)}i={type:"stylesheet",instance:i,count:1,state:s},n.set(u,i)}}}function tx(e,t){Nl.X(e,t);var l=sn;if(l&&e){var a=ja(l).hoistableScripts,n=on(e),u=a.get(n);u||(u=l.querySelector(au(n)),u||(e=Q({src:e,async:!0},t),(t=Bt.get(n))&&Nf(e,t),u=l.createElement("script"),Fe(u),it(u,"link",e),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function lx(e,t){Nl.M(e,t);var l=sn;if(l&&e){var a=ja(l).hoistableScripts,n=on(e),u=a.get(n);u||(u=l.querySelector(au(n)),u||(e=Q({src:e,async:!0,type:"module"},t),(t=Bt.get(n))&&Nf(e,t),u=l.createElement("script"),Fe(u),it(u,"link",e),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function J0(e,t,l,a){var n=(n=zl.current)?tu(n):null;if(!n)throw Error(r(446));switch(e){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(l=fn(l.href),t=ja(n).hoistableStyles,a=t.get(l),a||(a={type:"style",instance:null,count:0,state:null},t.set(l,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(l.rel==="stylesheet"&&typeof l.href=="string"&&typeof l.precedence=="string"){e=fn(l.href);var u=ja(n).hoistableStyles,i=u.get(e);if(i||(n=n.ownerDocument||n,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,i),(u=n.querySelector(lu(e)))?u._p||(i.instance=u,i.state.loading=5):(u=Bt.get(e),u||(u={rel:"preload",as:"style",href:l.href,crossOrigin:l.crossOrigin,integrity:l.integrity,media:l.media,hrefLang:l.hrefLang,referrerPolicy:l.referrerPolicy},Bt.set(e,u)),ax(n,e,u,i.state))),t&&a===null)throw Error(r(528,""));return i}if(t&&a!==null)throw Error(r(529,""));return null;case"script":return t=l.async,l=l.src,typeof l=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(l=on(l),t=ja(n).hoistableScripts,a=t.get(l),a||(a={type:"script",instance:null,count:0,state:null},t.set(l,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,e))}}function fn(e){return'href="'+Mt(e)+'"'}function lu(e){return'link[rel="stylesheet"]['+e+"]"}function k0(e){return Q({},e,{"data-precedence":e.precedence,precedence:null})}function ax(e,t,l,a){if(t=e.querySelector('link[rel="preload"][as="style"]['+t+"]")){if(t[pu]!==!0){a.loading=1;return}}else t=e.createElement("link"),t[pu]=!0,t.onload=t.onerror=no.bind(null,t),it(t,"link",l),Fe(t),e.head.appendChild(t);a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2})}function on(e){return'[src="'+Mt(e)+'"]'}function au(e){return"script[async]"+e}function $0(e,t,l){if(t.count++,t.instance===null)switch(t.type){case"style":var a=e.querySelector('style[data-href~="'+Mt(l.href)+'"]');if(a)return t.instance=a,Fe(a),a;var n=Q({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(e.ownerDocument||e).createElement("style"),Fe(a),it(a,"style",n),Di(a,l.precedence,e),t.instance=a;case"stylesheet":n=fn(l.href);var u=e.querySelector(lu(n));if(u)return t.state.loading|=4,t.instance=u,Fe(u),u;a=k0(l),(n=Bt.get(n))&&Sf(a,n),u=(e.ownerDocument||e).createElement("link"),Fe(u);var i=u;return i._p=new Promise(function(s,f){i.onload=s,i.onerror=f}),it(u,"link",a),t.state.loading|=4,Di(u,l.precedence,e),t.instance=u;case"script":return u=on(l.src),(n=e.querySelector(au(u)))?(t.instance=n,Fe(n),n):(a=l,(n=Bt.get(u))&&(a=Q({},l),Nf(a,n)),e=e.ownerDocument||e,n=e.createElement("script"),Fe(n),it(n,"link",a),e.head.appendChild(n),t.instance=n);case"void":return null;default:throw Error(r(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(a=t.instance,t.state.loading|=4,Di(a,l.precedence,e));return t.instance}function Di(e,t,l){for(var a=l.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,i=0;i<a.length;i++){var s=a[i];if(s.dataset.precedence===t)u=s;else if(u!==n)break}u?u.parentNode.insertBefore(e,u.nextSibling):(t=l.nodeType===9?l.head:l,t.insertBefore(e,t.firstChild))}function Sf(e,t){e.crossOrigin==null&&(e.crossOrigin=t.crossOrigin),e.referrerPolicy==null&&(e.referrerPolicy=t.referrerPolicy),e.title==null&&(e.title=t.title)}function Nf(e,t){e.crossOrigin==null&&(e.crossOrigin=t.crossOrigin),e.referrerPolicy==null&&(e.referrerPolicy=t.referrerPolicy),e.integrity==null&&(e.integrity=t.integrity)}var Ci=null;function F0(e,t,l){if(Ci===null){var a=new Map,n=Ci=new Map;n.set(l,a)}else n=Ci,a=n.get(l),a||(a=new Map,n.set(l,a));if(a.has(e))return a;for(a.set(e,null),l=l.getElementsByTagName(e),n=0;n<l.length;n++){var u=l[n];if(!(u[gn]||u[tt]||e==="link"&&u.getAttribute("rel")==="stylesheet")&&u.namespaceURI!=="http://www.w3.org/2000/svg"){var i=u.getAttribute(t)||"";i=e+i;var s=a.get(i);s?s.push(u):a.set(i,[u])}}return a}function zf(e,t,l){e=e.ownerDocument||e,e.head.insertBefore(l,t==="title"?e.querySelector("head > title"):null)}function nx(e,t,l){if(l===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function W0(e,t){return e==="img"&&t.src!=null&&t.src!==""&&t.onLoad==null&&t.loading!=="lazy"}function I0(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function P0(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function em(e,t){typeof t.decode=="function"&&(e.imgCount++,t.complete||(e.imgBytes+=P0(t),e.suspenseyImages.push(t)),e=cx.bind(e),t.decode().then(e,e))}function ux(e,t,l,a){if(l.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(l.state.loading&4)===0){if(l.instance===null){var n=fn(a.href),u=t.querySelector(lu(n));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=nu.bind(e),t.then(e,e)),l.state.loading|=4,l.instance=u,Fe(u);return}u=t.ownerDocument||t,a=k0(a),(n=Bt.get(n))&&Sf(a,n),u=u.createElement("link"),Fe(u);var i=u;i._p=new Promise(function(s,f){i.onload=s,i.onerror=f}),it(u,"link",a),l.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(l,t),(t=l.state.preload)&&(l.state.loading&3)===0&&(e.count++,l=nu.bind(e),t.addEventListener("load",l),t.addEventListener("error",l))}}var wi=0;function ix(e,t){return e.stylesheets&&e.count===0&&Ri(e,e.stylesheets),0<e.count||0<e.imgCount?function(l){var a=setTimeout(function(){if(e.stylesheets&&Ri(e,e.stylesheets),e.unsuspend){var u=e.unsuspend;e.unsuspend=null,u()}},6e4+t);0<e.imgBytes&&wi===0&&(wi=62500*_v());var n=setTimeout(function(){if(e.waitingForImages=!1,e.count===0&&(e.stylesheets&&Ri(e,e.stylesheets),e.unsuspend)){var u=e.unsuspend;e.unsuspend=null,u()}},(e.imgBytes>wi?50:800)+t);return e.unsuspend=l,function(){e.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function tm(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)Ri(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nu(){this.count--,tm(this)}function cx(){this.imgCount--,tm(this)}var Ui=null;function Ri(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Ui=new Map,t.forEach(sx,e),Ui=null,nu.call(e))}function sx(e,t){if(!(t.state.loading&4)){var l=Ui.get(e);if(l)var a=l.get(null);else{l=new Map,Ui.set(e,l);for(var n=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u<n.length;u++){var i=n[u];(i.nodeName==="LINK"||i.getAttribute("media")!=="not all")&&(l.set(i.dataset.precedence,i),a=i)}a&&l.set(null,a)}n=t.instance,i=n.getAttribute("data-precedence"),u=l.get(i)||a,u===a&&l.set(null,n),l.set(i,n),this.count++,a=nu.bind(this),n.addEventListener("load",a),n.addEventListener("error",a),u?u.parentNode.insertBefore(n,u.nextSibling):(e=e.nodeType===9?e.head:e,e.insertBefore(n,e.firstChild)),t.state.loading|=4}}var rn={$$typeof:je,Provider:null,Consumer:null,_currentValue:cl,_currentValue2:cl,_threadCount:0};function fx(e,t,l,a,n,u,i,s,f){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=lc(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=lc(0),this.hiddenUpdates=lc(null),this.identifierPrefix=a,this.onUncaughtError=n,this.onCaughtError=u,this.onRecoverableError=i,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=f,this.transitionTypes=null,this.incompleteTransitions=new Map}function lm(e,t,l,a,n,u,i,s,f,x,b,_){return e=new fx(e,t,l,i,f,x,b,_,s),t=1,u===!0&&(t|=24),u=ht(3,null,null,t),e.current=u,u.stateNode=e,t=qc(),t.refCount++,e.pooledCache=t,t.refCount++,u.memoizedState={element:a,isDehydrated:l,cache:t},Qc(u),e}function am(e){return e?(e=Ha,e):Ha}function nm(e,t,l,a,n,u){n=am(n),a.context===null?a.context=n:a.pendingContext=n,a=Ul(t),a.payload={element:l},u=u===void 0?null:u,u!==null&&(a.callback=u),l=Rl(e,a,t),l!==null&&(gt(l,e,t),Rn(l,e,t))}function um(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var l=e.retryLane;e.retryLane=l!==0&&l<t?l:t}}function _f(e,t){um(e,t),(e=e.alternate)&&um(e,t)}function im(e){if(e.tag===13||e.tag===31){var t=aa(e,67108864);t!==null&>(t,e,67108864),_f(e,67108864)}}function cm(e){if(e.tag===13||e.tag===31){var t=Ot();t=ac(t);var l=aa(e,t);l!==null&>(l,e,t),_f(e,t)}}var dn=!0;function ox(e,t,l,a){var n=B.T;B.T=null;var u=ee.p;try{ee.p=2,Tf(e,t,l,a)}finally{ee.p=u,B.T=n}}function rx(e,t,l,a){var n=B.T;B.T=null;var u=ee.p;try{ee.p=8,Tf(e,t,l,a)}finally{ee.p=u,B.T=n}}function Tf(e,t,l,a){if(dn){var n=jf(a);if(n===null)uf(e,t,a,Hi,l),fm(e,a);else if(mx(n,e,t,l,a))a.stopPropagation();else if(fm(e,a),t&4&&-1<dx.indexOf(e)){for(;n!==null;){var u=Ta(n);if(u!==null)switch(u.tag){case 3:if(u=u.stateNode,u.current.memoizedState.isDehydrated){var i=Il(u.pendingLanes);if(i!==0){var s=u;for(s.pendingLanes|=2,s.entangledLanes|=2;i;){var f=1<<31-St(i);s.entanglements[1]|=f,i&=~f}nl(u),(pe&6)===0&&(Si=bt()+500,Wn(0))}}break;case 31:case 13:s=aa(u,2),s!==null&>(s,u,2),_i(),_f(u,2)}if(u=jf(a),u===null&&uf(e,t,a,Hi,l),u===n)break;n=u}n!==null&&a.stopPropagation()}else uf(e,t,a,null,l)}}function jf(e){return e=oc(e),Ef(e)}var Hi=null;function Ef(e){if(Hi=null,e=Pl(e),e!==null){var t=M(e);if(t===null)e=null;else{var l=t.tag;if(l===13){if(e=$(t),e!==null)return e;e=null}else if(l===31){if(e=q(t),e!==null)return e;e=null}else if(l===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return Hi=e,null}function sm(e){switch(e){case"beforetoggle":case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"seeked":case"submit":case"toggle":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"fullscreenerror":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 2;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"resize":case"scroll":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 8;case"message":switch(_h()){case Kf:return 2;case Jf:return 8;case vu:case Th:return 32;case kf:return 268435456;default:return 32}default:return 32}}var Of=!1,Jl=null,kl=null,$l=null,uu=new Map,iu=new Map,Fl=[],dx="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" ");function fm(e,t){switch(e){case"focusin":case"focusout":Jl=null;break;case"dragenter":case"dragleave":kl=null;break;case"mouseover":case"mouseout":$l=null;break;case"pointerover":case"pointerout":uu.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":iu.delete(t.pointerId)}}function cu(e,t,l,a,n,u){return e===null||e.nativeEvent!==u?(e={blockedOn:t,domEventName:l,eventSystemFlags:a,nativeEvent:u,targetContainers:[n]},t!==null&&(t=Ta(t),t!==null&&im(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,n!==null&&t.indexOf(n)===-1&&t.push(n),e)}function mx(e,t,l,a,n){switch(t){case"focusin":return Jl=cu(Jl,e,t,l,a,n),!0;case"dragenter":return kl=cu(kl,e,t,l,a,n),!0;case"mouseover":return $l=cu($l,e,t,l,a,n),!0;case"pointerover":var u=n.pointerId;return uu.set(u,cu(uu.get(u)||null,e,t,l,a,n)),!0;case"gotpointercapture":return u=n.pointerId,iu.set(u,cu(iu.get(u)||null,e,t,l,a,n)),!0}return!1}function om(e){var t=Pl(e.target);if(t!==null){var l=M(t);if(l!==null){if(t=l.tag,t===13){if(t=$(l),t!==null){e.blockedOn=t,to(e.priority,function(){cm(l)});return}}else if(t===31){if(t=q(l),t!==null){e.blockedOn=t,to(e.priority,function(){cm(l)});return}}else if(t===3&&l.stateNode.current.memoizedState.isDehydrated){e.blockedOn=l.tag===3?l.stateNode.containerInfo:null;return}}}e.blockedOn=null}function qi(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var l=jf(e.nativeEvent);if(l===null){l=e.nativeEvent;var a=new l.constructor(l.type,l);fc=a,l.target.dispatchEvent(a),fc=null}else return t=Ta(l),t!==null&&im(t),e.blockedOn=l,!1;t.shift()}return!0}function rm(e,t,l){qi(e)&&l.delete(t)}function hx(){Of=!1,Jl!==null&&qi(Jl)&&(Jl=null),kl!==null&&qi(kl)&&(kl=null),$l!==null&&qi($l)&&($l=null),uu.forEach(rm),iu.forEach(rm)}function Bi(e,t){e.blockedOn===t&&(e.blockedOn=null,Of||(Of=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,hx)))}var Yi=null;function dm(e){Yi!==e&&(Yi=e,o.unstable_scheduleCallback(o.unstable_NormalPriority,function(){Yi===e&&(Yi=null);for(var t=0;t<e.length;t+=3){var l=e[t],a=e[t+1],n=e[t+2];if(typeof a!="function"){if(Ef(a||l)===null)continue;break}var u=Ta(l);u!==null&&(e.splice(t,3),t-=3,ss(u,{pending:!0,data:n,method:l.method,action:a},a,n))}}))}function mn(e){function t(f){return Bi(f,e)}Jl!==null&&Bi(Jl,e),kl!==null&&Bi(kl,e),$l!==null&&Bi($l,e),uu.forEach(t),iu.forEach(t);for(var l=0;l<Fl.length;l++){var a=Fl[l];a.blockedOn===e&&(a.blockedOn=null)}for(;0<Fl.length&&(l=Fl[0],l.blockedOn===null);)om(l),l.blockedOn===null&&Fl.shift();if(l=(e.ownerDocument||e).$$reactFormReplay,l!=null)for(a=0;a<l.length;a+=3){var n=l[a],u=l[a+1],i=n[mt]||null;if(typeof u=="function")i||dm(l);else if(i){var s=null;if(u&&u.hasAttribute("formAction")){if(n=u,i=u[mt]||null)s=i.formAction;else if(Ef(n)!==null)continue}else s=i.action;typeof s=="function"?l[a+1]=s:(l.splice(a,3),a-=3),dm(l)}}}function mm(){function e(u){u.canIntercept&&u.info==="react-transition"&&u.intercept({handler:function(){return new Promise(function(i){return n=i})},focusReset:"manual",scroll:"manual"})}function t(){n!==null&&(n(),n=null),a||setTimeout(l,20)}function l(){if(!a&&!navigation.transition){var u=navigation.currentEntry;u&&u.url!=null&&navigation.navigate(u.url,{state:u.getState(),info:"react-transition",history:"replace"})}}if(typeof navigation=="object"){var a=!1,n=null;return navigation.addEventListener("navigate",e),navigation.addEventListener("navigatesuccess",t),navigation.addEventListener("navigateerror",t),setTimeout(l,100),function(){a=!0,navigation.removeEventListener("navigate",e),navigation.removeEventListener("navigatesuccess",t),navigation.removeEventListener("navigateerror",t),n!==null&&(n(),n=null)}}}function Af(e){this._internalRoot=e}Gi.prototype.render=Af.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(r(409));var l=t.current,a=Ot();nm(l,a,e,t,null,null)},Gi.prototype.unmount=Af.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;nm(e.current,2,null,e,null,null),_i(),t[_a]=null}};function Gi(e){this._internalRoot=e}Gi.prototype.unstable_scheduleHydration=function(e){if(e){var t=eo();e={blockedOn:null,target:e,priority:t};for(var l=0;l<Fl.length&&t!==0&&t<Fl[l].priority;l++);Fl.splice(l,0,e),l===0&&om(e)}};var hm=p.version;if(hm!=="19.3.1")throw Error(r(527,hm,"19.3.1"));ee.findDOMNode=function(e){var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(r(188)):(e=Object.keys(e).join(","),Error(r(268,e)));return e=I(t),e=e!==null?D(e):null,e=e===null?null:e.stateNode,e};var vx={bundleType:0,version:"19.3.1",rendererPackageName:"react-dom",currentDispatcherRef:B,reconcilerVersion:"19.3.1"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var Qi=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Qi.isDisabled&&Qi.supportsFiber)try{vn=Qi.inject(vx),pt=Qi}catch{}}return fu.createRoot=function(e,t){if(!T(e))throw Error(r(299));var l=!1,a="",n=ad,u=nd,i=ud;return t!=null&&(t.unstable_strictMode===!0&&(l=!0),t.identifierPrefix!==void 0&&(a=t.identifierPrefix),t.onUncaughtError!==void 0&&(n=t.onUncaughtError),t.onCaughtError!==void 0&&(u=t.onCaughtError),t.onRecoverableError!==void 0&&(i=t.onRecoverableError)),t=lm(e,1,!1,null,null,l,a,null,n,u,i,mm),e[_a]=t.current,nf(e),new Af(t)},fu.hydrateRoot=function(e,t,l){if(!T(e))throw Error(r(299));var a=!1,n="",u=ad,i=nd,s=ud,f=null;return l!=null&&(l.unstable_strictMode===!0&&(a=!0),l.identifierPrefix!==void 0&&(n=l.identifierPrefix),l.onUncaughtError!==void 0&&(u=l.onUncaughtError),l.onCaughtError!==void 0&&(i=l.onCaughtError),l.onRecoverableError!==void 0&&(s=l.onRecoverableError),l.formState!==void 0&&(f=l.formState)),t=lm(e,1,!0,t,l??null,a,n,f,u,i,s,mm),t.context=am(null),l=t.current,a=Ot(),a=ac(a),n=Ul(a),n.callback=null,Rl(l,n,a),l=a,t.current.lanes=l,yn(t,l),nl(t),e[_a]=t.current,nf(e),new Gi(t)},fu.version="19.3.1",fu}var _m;function jx(){if(_m)return Cf.exports;_m=1;function o(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(o)}catch(p){console.error(p)}}return o(),Cf.exports=Tx(),Cf.exports}var Ex=jx();const Ox=Om(Ex);/** | |
| 59 | + * @license lucide-react v1.64.0 - ISC | |
| 60 | + * | |
| 61 | + * This source code is licensed under the ISC license. | |
| 62 | + * See the LICENSE file in the root directory of this source tree. | |
| 63 | + */const Ax=o=>o?.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();/** | |
| 64 | + * @license lucide-react v1.64.0 - ISC | |
| 65 | + * | |
| 66 | + * This source code is licensed under the ISC license. | |
| 67 | + * See the LICENSE file in the root directory of this source tree. | |
| 68 | + */function Mx(o,p,O=[]){if(p==null)throw new Error("[lucide]: iconNode is required when icon name is used");return{name:Ax(o),size:24,node:p,...O.length>0?{aliases:O}:{}}}/** | |
| 69 | + * @license lucide-react v1.64.0 - ISC | |
| 70 | + * | |
| 71 | + * This source code is licensed under the ISC license. | |
| 72 | + * See the LICENSE file in the root directory of this source tree. | |
| 73 | + */const Dx=o=>{let p="",O=!1;for(const r of o){if(r==="-"||r==="_"||r<=" "){O=p.length>0;continue}p.length===0?p+=r.toLowerCase():p+=O?r.toUpperCase():r,O=!1}return p};/** | |
| 74 | + * @license lucide-react v1.64.0 - ISC | |
| 75 | + * | |
| 76 | + * This source code is licensed under the ISC license. | |
| 77 | + * See the LICENSE file in the root directory of this source tree. | |
| 78 | + */const Cx=o=>{const p=Dx(o);return p.charAt(0).toUpperCase()+p.slice(1)};/** | |
| 79 | + * @license lucide-react v1.64.0 - ISC | |
| 80 | + * | |
| 81 | + * This source code is licensed under the ISC license. | |
| 82 | + * See the LICENSE file in the root directory of this source tree. | |
| 83 | + */const Bf=(...o)=>o.filter((p,O,r)=>!!p&&p.trim()!==""&&r.indexOf(p)===O).join(" ").trim();/** | |
| 84 | + * @license lucide-react v1.64.0 - ISC | |
| 85 | + * | |
| 86 | + * This source code is licensed under the ISC license. | |
| 87 | + * See the LICENSE file in the root directory of this source tree. | |
| 88 | + */const Sa={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/** | |
| 89 | + * @license lucide-react v1.64.0 - ISC | |
| 90 | + * | |
| 91 | + * This source code is licensed under the ISC license. | |
| 92 | + * See the LICENSE file in the root directory of this source tree. | |
| 93 | + */function Hf(o){return o!=null}function wx(o,p={}){const O=p.attributeNames??{},r=j=>O[j]??j,T=o.size??o.width??Sa.width,M=o.size??o.height??Sa.height,$=o.aliases?.filter(j=>typeof j=="string"&&j.trim()!=="").map(j=>`lucide-${j}`)??[],q=[...o.name?[`lucide-${o.name}`]:[],...$],k=p.className?.split(" ").filter(Boolean)??[],I=p.includeDefaultClasses===!1?Bf(...k):Bf("lucide",...q,...k),D=p.absoluteStrokeWidth?Number(p.strokeWidth??Sa["stroke-width"])*Number(o.size??o.width??Sa.width)/Number(p.size??p.width??Sa.width):p.strokeWidth??Sa["stroke-width"];return["svg",{...Object.entries(Sa).reduce((j,[X,le])=>(j[r(X)]=le,j),{}),..."color"in p&&p.color&&{[r("stroke")]:p.color},..."size"in p&&Hf(p.size)&&{[r("width")]:p.size,[r("height")]:p.size},..."width"in p&&Hf(p.width)&&{[r("width")]:p.width},..."height"in p&&Hf(p.height)&&{[r("height")]:p.height},[r("stroke-width")]:D,...I&&{[r("class")]:I},[r("viewBox")]:`0 0 ${T} ${M}`,...p.hasA11yProp===!1?{[r("aria-hidden")]:"true"}:{},..."attributes"in p&&p.attributes},o.node.map(j=>{const[X,le,ie]=j,F=p.nonScalingStroke?{[r("vector-effect")]:"non-scaling-stroke",...le}:le;return ie?[X,F,ie]:[X,F]})]}/** | |
| 94 | + * @license lucide-react v1.64.0 - ISC | |
| 95 | + * | |
| 96 | + * This source code is licensed under the ISC license. | |
| 97 | + * See the LICENSE file in the root directory of this source tree. | |
| 98 | + */function Ux(o,p={}){return wx(o,{...p,attributeNames:{...p.attributeNames,class:"className","stroke-width":"strokeWidth","stroke-linecap":"strokeLinecap","stroke-linejoin":"strokeLinejoin","vector-effect":"vectorEffect"}})}/** | |
| 99 | + * @license lucide-react v1.64.0 - ISC | |
| 100 | + * | |
| 101 | + * This source code is licensed under the ISC license. | |
| 102 | + * See the LICENSE file in the root directory of this source tree. | |
| 103 | + */const Rx=o=>{for(const p in o)if(p.startsWith("aria-")||p==="role"||p==="title")return!0;return!1},Hx=H.createContext({}),qx=()=>H.useContext(Hx),Bx=H.forwardRef(({color:o,size:p,width:O,height:r,strokeWidth:T,absoluteStrokeWidth:M,nonScalingStroke:$,className:q="",children:k,iconNode:I=[],icon:D={node:I,aliases:[],size:24},...S},j)=>{const{size:X=24,strokeWidth:le=2,absoluteStrokeWidth:ie=!1,nonScalingStroke:F=!1,color:De="currentColor",className:ve=""}=qx()??{},Re=!!k||Rx(S),[Z,R,se=[]]=Ux(D,{color:o??De,width:O??p??X,height:r??p??X,strokeWidth:T??le,absoluteStrokeWidth:M??ie,nonScalingStroke:$??F,className:Bf(ve,q),hasA11yProp:Re,attributes:S});return H.createElement(Z,{ref:j,...R},[...se.map(([Q,P])=>H.createElement(Q,P)),...Array.isArray(k)?k:[k]])});/** | |
| 104 | + * @license lucide-react v1.64.0 - ISC | |
| 105 | + * | |
| 106 | + * This source code is licensed under the ISC license. | |
| 107 | + * See the LICENSE file in the root directory of this source tree. | |
| 108 | + */function re(o,p=[],O=[]){const r=typeof o=="string"?Mx(o,p,O):o,T=H.forwardRef(({className:M,...$},q)=>H.createElement(Bx,{ref:q,icon:r,className:M,...$}));return r.name&&(T.displayName=Cx(r.name)),T}/** | |
| 109 | + * @license lucide-react v1.64.0 - ISC | |
| 110 | + * | |
| 111 | + * This source code is licensed under the ISC license. | |
| 112 | + * See the LICENSE file in the root directory of this source tree. | |
| 113 | + */const Am={name:"activity",size:24,node:[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]};Am.node;const Yx=re(Am);/** | |
| 114 | + * @license lucide-react v1.64.0 - ISC | |
| 115 | + * | |
| 116 | + * This source code is licensed under the ISC license. | |
| 117 | + * See the LICENSE file in the root directory of this source tree. | |
| 118 | + */const Mm={name:"arrow-left",size:24,node:[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]};Mm.node;const Gx=re(Mm);/** | |
| 119 | + * @license lucide-react v1.64.0 - ISC | |
| 120 | + * | |
| 121 | + * This source code is licensed under the ISC license. | |
| 122 | + * See the LICENSE file in the root directory of this source tree. | |
| 123 | + */const Dm={name:"arrow-up-down",size:24,node:[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]]};Dm.node;const Qx=re(Dm);/** | |
| 124 | + * @license lucide-react v1.64.0 - ISC | |
| 125 | + * | |
| 126 | + * This source code is licensed under the ISC license. | |
| 127 | + * See the LICENSE file in the root directory of this source tree. | |
| 128 | + */const Cm={name:"arrow-up-to-line",size:24,node:[["path",{d:"M5 3h14",key:"7usisc"}],["path",{d:"m18 13-6-6-6 6",key:"1kf1n9"}],["path",{d:"M12 7v14",key:"1akyts"}]]};Cm.node;const wm=re(Cm);/** | |
| 129 | + * @license lucide-react v1.64.0 - ISC | |
| 130 | + * | |
| 131 | + * This source code is licensed under the ISC license. | |
| 132 | + * See the LICENSE file in the root directory of this source tree. | |
| 133 | + */const Um={name:"check",size:24,node:[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]};Um.node;const Xx=re(Um);/** | |
| 134 | + * @license lucide-react v1.64.0 - ISC | |
| 135 | + * | |
| 136 | + * This source code is licensed under the ISC license. | |
| 137 | + * See the LICENSE file in the root directory of this source tree. | |
| 138 | + */const Rm={name:"chevron-down",size:24,node:[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]};Rm.node;const Vx=re(Rm);/** | |
| 139 | + * @license lucide-react v1.64.0 - ISC | |
| 140 | + * | |
| 141 | + * This source code is licensed under the ISC license. | |
| 142 | + * See the LICENSE file in the root directory of this source tree. | |
| 143 | + */const Hm={name:"chevron-left",size:24,node:[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]};Hm.node;const Lx=re(Hm);/** | |
| 144 | + * @license lucide-react v1.64.0 - ISC | |
| 145 | + * | |
| 146 | + * This source code is licensed under the ISC license. | |
| 147 | + * See the LICENSE file in the root directory of this source tree. | |
| 148 | + */const qm={name:"chevron-right",size:24,node:[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]};qm.node;const Zx=re(qm);/** | |
| 149 | + * @license lucide-react v1.64.0 - ISC | |
| 150 | + * | |
| 151 | + * This source code is licensed under the ISC license. | |
| 152 | + * See the LICENSE file in the root directory of this source tree. | |
| 153 | + */const Bm={name:"chevron-up",size:24,node:[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]};Bm.node;const Kx=re(Bm);/** | |
| 154 | + * @license lucide-react v1.64.0 - ISC | |
| 155 | + * | |
| 156 | + * This source code is licensed under the ISC license. | |
| 157 | + * See the LICENSE file in the root directory of this source tree. | |
| 158 | + */const Ym={name:"circle-alert",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],aliases:["alert-circle"]};Ym.node;const Yf=re(Ym);/** | |
| 159 | + * @license lucide-react v1.64.0 - ISC | |
| 160 | + * | |
| 161 | + * This source code is licensed under the ISC license. | |
| 162 | + * See the LICENSE file in the root directory of this source tree. | |
| 163 | + */const Gm={name:"circle-check",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m16 9-5.5 5.5L8 12",key:"xofnsj"}]],aliases:["check-circle-2"]};Gm.node;const Jx=re(Gm);/** | |
| 164 | + * @license lucide-react v1.64.0 - ISC | |
| 165 | + * | |
| 166 | + * This source code is licensed under the ISC license. | |
| 167 | + * See the LICENSE file in the root directory of this source tree. | |
| 168 | + */const Qm={name:"circle-stop",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["rect",{x:"9",y:"9",width:"6",height:"6",rx:"1",key:"1ssd4o"}]],aliases:["stop-circle"]};Qm.node;const kx=re(Qm);/** | |
| 169 | + * @license lucide-react v1.64.0 - ISC | |
| 170 | + * | |
| 171 | + * This source code is licensed under the ISC license. | |
| 172 | + * See the LICENSE file in the root directory of this source tree. | |
| 173 | + */const Xm={name:"circle-x",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],aliases:["x-circle"]};Xm.node;const $x=re(Xm);/** | |
| 174 | + * @license lucide-react v1.64.0 - ISC | |
| 175 | + * | |
| 176 | + * This source code is licensed under the ISC license. | |
| 177 | + * See the LICENSE file in the root directory of this source tree. | |
| 178 | + */const Vm={name:"clock",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 6v6l4 2",key:"mmk7yg"}]]};Vm.node;const Li=re(Vm);/** | |
| 179 | + * @license lucide-react v1.64.0 - ISC | |
| 180 | + * | |
| 181 | + * This source code is licensed under the ISC license. | |
| 182 | + * See the LICENSE file in the root directory of this source tree. | |
| 183 | + */const Lm={name:"code",size:24,node:[["path",{d:"m16 18 6-6-6-6",key:"eg8j8"}],["path",{d:"m8 6-6 6 6 6",key:"ppft3o"}]]};Lm.node;const Fx=re(Lm);/** | |
| 184 | + * @license lucide-react v1.64.0 - ISC | |
| 185 | + * | |
| 186 | + * This source code is licensed under the ISC license. | |
| 187 | + * See the LICENSE file in the root directory of this source tree. | |
| 188 | + */const Zm={name:"copy",size:24,node:[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]};Zm.node;const Wx=re(Zm);/** | |
| 189 | + * @license lucide-react v1.64.0 - ISC | |
| 190 | + * | |
| 191 | + * This source code is licensed under the ISC license. | |
| 192 | + * See the LICENSE file in the root directory of this source tree. | |
| 193 | + */const Km={name:"cpu",size:24,node:[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]]};Km.node;const Ix=re(Km);/** | |
| 194 | + * @license lucide-react v1.64.0 - ISC | |
| 195 | + * | |
| 196 | + * This source code is licensed under the ISC license. | |
| 197 | + * See the LICENSE file in the root directory of this source tree. | |
| 198 | + */const Jm={name:"download",size:24,node:[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]]};Jm.node;const Px=re(Jm);/** | |
| 199 | + * @license lucide-react v1.64.0 - ISC | |
| 200 | + * | |
| 201 | + * This source code is licensed under the ISC license. | |
| 202 | + * See the LICENSE file in the root directory of this source tree. | |
| 203 | + */const km={name:"eighth-notes",size:24,node:[["path",{d:"M21 16V3a1 1 0 0 0-1.28-.96l-10 2.917a1 1 0 0 0-.72.96V19",key:"uy6ho8"}],["circle",{cx:"18",cy:"16",r:"3",key:"1hluhg"}],["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}]],aliases:["music"]};km.node;const ey=re(km);/** | |
| 204 | + * @license lucide-react v1.64.0 - ISC | |
| 205 | + * | |
| 206 | + * This source code is licensed under the ISC license. | |
| 207 | + * See the LICENSE file in the root directory of this source tree. | |
| 208 | + */const $m={name:"ellipsis-vertical",size:24,node:[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"12",cy:"5",r:"1",key:"gxeob9"}],["circle",{cx:"12",cy:"19",r:"1",key:"lyex9k"}]],aliases:["more-vertical"]};$m.node;const ty=re($m);/** | |
| 209 | + * @license lucide-react v1.64.0 - ISC | |
| 210 | + * | |
| 211 | + * This source code is licensed under the ISC license. | |
| 212 | + * See the LICENSE file in the root directory of this source tree. | |
| 213 | + */const Fm={name:"external-link",size:24,node:[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]};Fm.node;const ly=re(Fm);/** | |
| 214 | + * @license lucide-react v1.64.0 - ISC | |
| 215 | + * | |
| 216 | + * This source code is licensed under the ISC license. | |
| 217 | + * See the LICENSE file in the root directory of this source tree. | |
| 218 | + */const Wm={name:"info",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]};Wm.node;const ay=re(Wm);/** | |
| 219 | + * @license lucide-react v1.64.0 - ISC | |
| 220 | + * | |
| 221 | + * This source code is licensed under the ISC license. | |
| 222 | + * See the LICENSE file in the root directory of this source tree. | |
| 223 | + */const Im={name:"key-round",size:24,node:[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]};Im.node;const ny=re(Im);/** | |
| 224 | + * @license lucide-react v1.64.0 - ISC | |
| 225 | + * | |
| 226 | + * This source code is licensed under the ISC license. | |
| 227 | + * See the LICENSE file in the root directory of this source tree. | |
| 228 | + */const Pm={name:"layers",size:24,node:[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],aliases:["layers-3"]};Pm.node;const uy=re(Pm);/** | |
| 229 | + * @license lucide-react v1.64.0 - ISC | |
| 230 | + * | |
| 231 | + * This source code is licensed under the ISC license. | |
| 232 | + * See the LICENSE file in the root directory of this source tree. | |
| 233 | + */const eh={name:"link",size:24,node:[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]};eh.node;const iy=re(eh);/** | |
| 234 | + * @license lucide-react v1.64.0 - ISC | |
| 235 | + * | |
| 236 | + * This source code is licensed under the ISC license. | |
| 237 | + * See the LICENSE file in the root directory of this source tree. | |
| 238 | + */const th={name:"play",size:24,node:[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]};th.node;const cy=re(th);/** | |
| 239 | + * @license lucide-react v1.64.0 - ISC | |
| 240 | + * | |
| 241 | + * This source code is licensed under the ISC license. | |
| 242 | + * See the LICENSE file in the root directory of this source tree. | |
| 243 | + */const lh={name:"plus",size:24,node:[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]};lh.node;const sy=re(lh);/** | |
| 244 | + * @license lucide-react v1.64.0 - ISC | |
| 245 | + * | |
| 246 | + * This source code is licensed under the ISC license. | |
| 247 | + * See the LICENSE file in the root directory of this source tree. | |
| 248 | + */const ah={name:"refresh-cw",size:24,node:[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]};ah.node;const nh=re(ah);/** | |
| 249 | + * @license lucide-react v1.64.0 - ISC | |
| 250 | + * | |
| 251 | + * This source code is licensed under the ISC license. | |
| 252 | + * See the LICENSE file in the root directory of this source tree. | |
| 253 | + */const uh={name:"rotate-ccw",size:24,node:[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]};uh.node;const ih=re(uh);/** | |
| 254 | + * @license lucide-react v1.64.0 - ISC | |
| 255 | + * | |
| 256 | + * This source code is licensed under the ISC license. | |
| 257 | + * See the LICENSE file in the root directory of this source tree. | |
| 258 | + */const ch={name:"search",size:24,node:[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]};ch.node;const fy=re(ch);/** | |
| 259 | + * @license lucide-react v1.64.0 - ISC | |
| 260 | + * | |
| 261 | + * This source code is licensed under the ISC license. | |
| 262 | + * See the LICENSE file in the root directory of this source tree. | |
| 263 | + */const sh={name:"send",size:24,node:[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]};sh.node;const oy=re(sh);/** | |
| 264 | + * @license lucide-react v1.64.0 - ISC | |
| 265 | + * | |
| 266 | + * This source code is licensed under the ISC license. | |
| 267 | + * See the LICENSE file in the root directory of this source tree. | |
| 268 | + */const fh={name:"server",size:24,node:[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]};fh.node;const ry=re(fh);/** | |
| 269 | + * @license lucide-react v1.64.0 - ISC | |
| 270 | + * | |
| 271 | + * This source code is licensed under the ISC license. | |
| 272 | + * See the LICENSE file in the root directory of this source tree. | |
| 273 | + */const oh={name:"shield-alert",size:24,node:[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]};oh.node;const dy=re(oh);/** | |
| 274 | + * @license lucide-react v1.64.0 - ISC | |
| 275 | + * | |
| 276 | + * This source code is licensed under the ISC license. | |
| 277 | + * See the LICENSE file in the root directory of this source tree. | |
| 278 | + */const rh={name:"sliders-vertical",size:24,node:[["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M12 21v-9",key:"17s77i"}],["path",{d:"M12 8V3",key:"13r4qs"}],["path",{d:"M17 16h4",key:"h1uq16"}],["path",{d:"M19 12V3",key:"o1uvq1"}],["path",{d:"M19 21v-5",key:"qua636"}],["path",{d:"M3 14h4",key:"bcjad9"}],["path",{d:"M5 10V3",key:"cb8scm"}],["path",{d:"M5 21v-7",key:"1w1uti"}]],aliases:["sliders"]};rh.node;const my=re(rh);/** | |
| 279 | + * @license lucide-react v1.64.0 - ISC | |
| 280 | + * | |
| 281 | + * This source code is licensed under the ISC license. | |
| 282 | + * See the LICENSE file in the root directory of this source tree. | |
| 283 | + */const dh={name:"sparkles",size:24,node:[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],aliases:["stars"]};dh.node;const hy=re(dh);/** | |
| 284 | + * @license lucide-react v1.64.0 - ISC | |
| 285 | + * | |
| 286 | + * This source code is licensed under the ISC license. | |
| 287 | + * See the LICENSE file in the root directory of this source tree. | |
| 288 | + */const mh={name:"trash",size:24,node:[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],aliases:["trash-2"]};mh.node;const Gf=re(mh);/** | |
| 289 | + * @license lucide-react v1.64.0 - ISC | |
| 290 | + * | |
| 291 | + * This source code is licensed under the ISC license. | |
| 292 | + * See the LICENSE file in the root directory of this source tree. | |
| 293 | + */const hh={name:"triangle-alert",size:24,node:[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],aliases:["alert-triangle"]};hh.node;const vy=re(hh);/** | |
| 294 | + * @license lucide-react v1.64.0 - ISC | |
| 295 | + * | |
| 296 | + * This source code is licensed under the ISC license. | |
| 297 | + * See the LICENSE file in the root directory of this source tree. | |
| 298 | + */const vh={name:"upload",size:24,node:[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]]};vh.node;const xy=re(vh);/** | |
| 299 | + * @license lucide-react v1.64.0 - ISC | |
| 300 | + * | |
| 301 | + * This source code is licensed under the ISC license. | |
| 302 | + * See the LICENSE file in the root directory of this source tree. | |
| 303 | + */const xh={name:"x",size:24,node:[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]};xh.node;const Vf=re(xh);function ul(){return typeof window<"u"&&window.__H3_BASE__!==void 0?window.__H3_BASE__:""}function Ki(){return typeof window>"u"?"":localStorage.getItem("h3_console_token")||""}function Qf(o){typeof window>"u"||(o?localStorage.setItem("h3_console_token",o.trim()):localStorage.removeItem("h3_console_token"))}function yy(o){if(!o)return"—";const p=Date.now()/1e3,O=Math.max(0,Math.round(p-o));return O<60?`${O}秒前`:O<3600?`${Math.round(O/60)}分钟前`:O<86400?`${Math.round(O/3600)}小时前`:`${Math.round(O/86400)}天前`}function gy(o){return o?new Date(o*1e3).toLocaleString("zh-CN",{hour12:!1,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"—"}function by(o){if(!o||o<=0)return"0 B";const p=["B","KB","MB","GB"],O=Math.floor(Math.log(o)/Math.log(1024));return`${(o/Math.pow(1024,O)).toFixed(1)} ${p[O]}`}function py(o){if(!o)return"";try{const p=decodeURIComponent(o.split("/").pop().split("?")[0]),O=p.match(/^[0-9a-f]{16}__(.+)$/);return O?O[1]:p}catch{return o}}function Zi(o){const p=o&&o.match(/\/assets\/([0-9a-f]{16}__[^/?#]*)$/);return p?ul()+"/assets/"+p[1]:o}function ru(o){if(!o)return o;o=Zi(o);const p=o.indexOf("/assets/");return p===-1?o:o.slice(0,p)+"/thumbs/"+o.slice(p+8)}function yh(o){if(!o)return"";const p=Ki();return p?`${o}${o.includes("?")?"&":"?"}token=${encodeURIComponent(p)}`:o}function Sy(o={}){return o.first_frame_url||o.last_frame_url?{key:"fl2va",label:"首尾帧"}:(o.reference_image_urls||[]).length||(o.reference_video_urls||[]).length||(o.reference_audio_urls||[]).length?{key:"ref2va",label:"参考图"}:{key:"text",label:"文生"}}function Ny({job:o,isSelected:p,onSelect:O,onRerun:r,onPrioritize:T,onDelete:M}){const[$,q]=H.useState(!1),[k,I]=H.useState(!1),D=H.useRef(null),S=o.req||{},j=Sy(S),X=o.status==="done",le=o.status==="running",ie=o.status==="queued",F=o.status==="failed",De=o.status==="cancelled",ve=o.step||0,Re=o.total_steps||S.steps||20,Z=Re>0?Math.min(100,Math.max(ve>0?5:2,Math.round(ve/Re*100))):0,R=()=>{q(!0),X&&D.current&&(D.current.currentTime=0,D.current.play().catch(()=>{}))},se=()=>{q(!1),I(!1),X&&D.current&&D.current.pause()},Q=X?yh(`${ul()}/v1/videos/${o.id}/file`):null,P=S.first_frame_url||(S.reference_image_urls||[])[0];return c.jsxs("div",{onClick:()=>O(o.id),onMouseEnter:R,onMouseLeave:se,className:`group relative p-3 rounded-2xl border transition-all duration-200 cursor-pointer flex flex-col gap-2 ${p?"bg-emerald-50/80 border-emerald-500 ring-1 ring-emerald-500/40 shadow-xs":"bg-white border-slate-200/90 hover:bg-slate-50/80 hover:border-slate-300 shadow-xs"}`,children:[c.jsxs("div",{className:"flex gap-3.5",children:[c.jsxs("div",{className:"relative w-24 h-32 shrink-0 rounded-xl overflow-hidden bg-slate-100 border border-slate-200 flex items-center justify-center",children:[X&&Q?c.jsx("video",{ref:D,src:Q,muted:!0,loop:!0,playsInline:!0,preload:"metadata",className:"w-full h-full object-cover"}):P?c.jsx("img",{src:ru(P),alt:"",loading:"lazy",className:"w-full h-full object-cover"}):c.jsxs("div",{className:"flex flex-col items-center justify-center text-slate-400 text-[11px] gap-1 p-2 text-center",children:[c.jsx("span",{className:"font-semibold text-slate-600",children:j.label}),c.jsx("span",{className:"text-[10px] opacity-70",children:o.partition||"H3"})]}),X&&c.jsx("div",{className:"absolute top-1.5 left-1.5 p-1 bg-emerald-600/90 rounded-md backdrop-blur-md text-white shadow-xs",children:c.jsx(cy,{className:"w-2.5 h-2.5 fill-current"})}),le&&c.jsx("div",{className:"absolute inset-0 bg-emerald-950/20 backdrop-blur-[1px] flex flex-col items-center justify-center gap-1",children:c.jsxs("span",{className:"text-xs font-bold text-emerald-700 bg-white/90 px-1.5 py-0.5 rounded shadow-xs font-mono",children:[Z,"%"]})}),ie&&c.jsx("div",{className:"absolute bottom-1.5 left-1.5 px-1.5 py-0.5 bg-blue-600/90 text-white text-[10px] rounded font-mono shadow-xs",children:o.queue_position?`#${o.queue_position}`:"排队中"})]}),c.jsxs("div",{className:"flex-1 min-w-0 flex flex-col justify-between py-0.5",children:[c.jsxs("div",{children:[c.jsxs("div",{className:"flex items-center justify-between gap-2",children:[c.jsxs("span",{className:"text-xs font-mono font-bold text-slate-600 group-hover:text-slate-900 transition-colors",children:["#",o.id.substring(0,8)]}),c.jsxs("div",{className:"flex items-center gap-1.5",children:[X&&c.jsx("span",{className:"px-2 py-0.5 text-[10px] font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200 rounded-full",children:"已完成"}),le&&c.jsxs("span",{className:"px-2 py-0.5 text-[10px] font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200 rounded-full flex items-center gap-1",children:[c.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-emerald-500 animate-ping"}),"采样 ",ve,"/",Re,"步"]}),ie&&c.jsx("span",{className:"px-2 py-0.5 text-[10px] font-semibold bg-slate-100 text-slate-700 border border-slate-200 rounded-full",children:"排队中"}),F&&c.jsx("span",{className:"px-2 py-0.5 text-[10px] font-semibold bg-rose-50 text-rose-700 border border-rose-200 rounded-full",children:"失败"}),De&&c.jsx("span",{className:"px-2 py-0.5 text-[10px] font-semibold bg-slate-100 text-slate-500 border border-slate-200 rounded-full",children:"已取消"})]})]}),c.jsx("p",{className:"mt-1.5 text-xs text-slate-700 line-clamp-3 leading-relaxed break-words font-normal",children:S.prompt||"(无 prompt 描述)"})]}),c.jsxs("div",{className:"mt-2 pt-2 border-t border-slate-100 flex items-center justify-between text-[11px] text-slate-500",children:[c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsxs("span",{className:"px-1.5 py-0.5 bg-slate-100 rounded text-slate-600 font-mono text-[10px]",children:[j.label," · ",S.width?`${S.width}p`:""]}),c.jsxs("span",{className:"flex items-center gap-1 text-slate-400",children:[c.jsx(Li,{className:"w-3 h-3"}),c.jsx("span",{children:yy(o.created_at)})]})]}),c.jsxs("div",{className:"relative",onClick:Ve=>Ve.stopPropagation(),children:[c.jsx("button",{onClick:()=>I(!k),className:"p-1 hover:bg-slate-100 rounded-md text-slate-400 hover:text-slate-700 transition-colors cursor-pointer",children:c.jsx(ty,{className:"w-3.5 h-3.5"})}),k&&c.jsxs("div",{className:"absolute right-0 bottom-full mb-1.5 w-32 py-1 bg-white border border-slate-200 rounded-xl shadow-xl z-30 text-xs flex flex-col",children:[c.jsxs("button",{onClick:()=>{I(!1),r(o)},className:"px-3 py-1.5 flex items-center gap-2 text-slate-700 hover:bg-slate-50 transition-colors cursor-pointer",children:[c.jsx(ih,{className:"w-3.5 h-3.5 text-emerald-600"}),c.jsx("span",{children:"复用重跑"})]}),ie&&c.jsxs("button",{onClick:()=>{I(!1),T(o.id)},className:"px-3 py-1.5 flex items-center gap-2 text-slate-700 hover:bg-slate-50 transition-colors cursor-pointer",children:[c.jsx(wm,{className:"w-3.5 h-3.5 text-indigo-600"}),c.jsx("span",{children:"优先插队"})]}),c.jsx("div",{className:"my-1 border-t border-slate-100"}),c.jsxs("button",{onClick:()=>{I(!1),M(o.id)},className:"px-3 py-1.5 flex items-center gap-2 text-rose-600 hover:bg-rose-50 transition-colors cursor-pointer",children:[c.jsx(Gf,{className:"w-3.5 h-3.5"}),c.jsx("span",{children:"移入回收站"})]})]})]})]})]})]}),le&&c.jsx("div",{className:"w-full bg-slate-100 rounded-full h-1.5 overflow-hidden mt-1 border border-slate-200/60",children:c.jsx("div",{className:"bg-emerald-500 h-full transition-all duration-300 rounded-full",style:{width:`${Z}%`}})})]})}async function Zt(o,p={}){const O=ul(),r=o.startsWith("http")?o:`${O}${o}`,T=Ki(),M={...p.headers||{}};T&&(M.Authorization=`Bearer ${T}`);const $=await fetch(r,{...p,headers:M});if($.status===401){Qf("");const q=window.prompt("H3 访问令牌 (Token) 已过期或无效,请输入新令牌:");if(q)return Qf(q),M.Authorization=`Bearer ${q}`,fetch(r,{...p,headers:M})}return $}async function Tm({page:o=1,limit:p=20,q:O="",status:r="",kind:T="",sort:M="desc",trash:$=!1}={}){const q=new URLSearchParams;$?(q.set("trash","true"),q.set("limit","50")):(q.set("page",String(o)),q.set("limit",String(p)),O&&q.set("q",O),r&&q.set("status",r),T&&q.set("kind",T),M&&q.set("sort",M));const k=await Zt(`/v1/videos?${q.toString()}`);if(!k.ok)throw new Error(await k.text());return k.json()}async function zy(o){const p=await Zt(`/v1/videos/${o}`);if(!p.ok)throw new Error(await p.text());return p.json()}async function _y(o){const p=await Zt("/v1/videos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(!p.ok)throw new Error(await p.text());return p.json()}async function Ty(o){const p=new FormData;p.append("file",o);const O=await Zt("/v1/assets",{method:"POST",body:p});if(!O.ok)throw new Error(await O.text());return O.json()}async function gh(o){const p=await Zt(`/v1/videos/${o}/prioritize`,{method:"POST"});if(!p.ok)throw new Error(await p.text());return p.json()}async function jy(o){const p=await Zt(`/v1/videos/${o}`,{method:"DELETE"});if(!p.ok)throw new Error(await p.text());return p.json()}async function Ey(o){const p=await Zt(`/v1/videos/${o}/restore`,{method:"POST"});if(!p.ok)throw new Error(await p.text());return p.json()}async function Oy(o){const p=await Zt(`/v1/videos/${o}/cancel`,{method:"POST"});if(!p.ok)throw new Error(await p.text());return p.json()}async function Ay(){const o=await Zt("/v1/admin/reset-gpu",{method:"POST"});if(!o.ok)throw new Error(await o.text());return o.json()}async function My(){const o=await Zt("/v1/backends");return o.ok?o.json():null}async function Dy(o){const p=await Zt(`/v1/videos/${o}/comfy-history`);if(!p.ok)throw new Error(await p.text());return p.json()}const bh=H.createContext(null);function Cy({children:o}){const[p,O]=H.useState([]),r=H.useCallback((M,$="info",q=3e3)=>{const k=Date.now()+Math.random().toString(36).substring(2,6);O(I=>[...I,{id:k,msg:M,type:$}]),q>0&&setTimeout(()=>{O(I=>I.filter(D=>D.id!==k))},q)},[]),T=H.useCallback(M=>{O($=>$.filter(q=>q.id!==M))},[]);return c.jsxs(bh.Provider,{value:{addToast:r},children:[o,c.jsx("div",{className:"fixed top-4 right-4 z-50 flex flex-col gap-2 pointer-events-none",children:p.map(M=>c.jsxs("div",{className:`pointer-events-auto flex items-center gap-3 px-4 py-3 rounded-xl shadow-2xl border backdrop-blur-md transition-all duration-300 animate-in slide-in-from-top-2 ${M.type==="success"?"bg-emerald-950/90 border-emerald-500/40 text-emerald-200 shadow-emerald-950/50":M.type==="error"?"bg-rose-950/90 border-rose-500/40 text-rose-200 shadow-rose-950/50":"bg-zinc-900/95 border-zinc-700/60 text-zinc-200 shadow-black/60"}`,children:[M.type==="success"&&c.jsx(Jx,{className:"w-5 h-5 text-emerald-400 shrink-0"}),M.type==="error"&&c.jsx(Yf,{className:"w-5 h-5 text-rose-400 shrink-0"}),M.type==="info"&&c.jsx(ay,{className:"w-5 h-5 text-indigo-400 shrink-0"}),c.jsx("span",{className:"text-sm font-medium",children:M.msg}),c.jsx("button",{onClick:()=>T(M.id),className:"ml-2 text-zinc-400 hover:text-white p-0.5 rounded-lg hover:bg-white/10 transition-colors",children:c.jsx(Vf,{className:"w-4 h-4"})})]},M.id))})]})}function Ji(){const o=H.useContext(bh);if(!o)throw new Error("useToast must be used within ToastProvider");return o}function ph({isOpen:o,title:p,content:O,confirmText:r="确定",cancelText:T="取消",isDanger:M=!1,onConfirm:$,onCancel:q}){return o?c.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/70 backdrop-blur-sm animate-in fade-in duration-200",children:c.jsxs("div",{className:"relative w-full max-w-md p-6 bg-zinc-900 border border-zinc-800 rounded-2xl shadow-2xl text-zinc-100 animate-in zoom-in-95 duration-200",children:[c.jsxs("div",{className:"flex items-start gap-4",children:[c.jsx("div",{className:`p-3 rounded-xl shrink-0 ${M?"bg-rose-500/10 text-rose-400":"bg-indigo-500/10 text-indigo-400"}`,children:c.jsx(vy,{className:"w-6 h-6"})}),c.jsxs("div",{className:"flex-1",children:[c.jsx("h3",{className:"text-base font-semibold text-zinc-100",children:p}),c.jsx("div",{className:"mt-2 text-sm text-zinc-400 leading-relaxed whitespace-pre-wrap",children:O})]}),c.jsx("button",{onClick:q,className:"text-zinc-500 hover:text-zinc-300 p-1 rounded-lg hover:bg-zinc-800 transition-colors",children:c.jsx(Vf,{className:"w-5 h-5"})})]}),c.jsxs("div",{className:"flex justify-end gap-3 mt-6",children:[c.jsx("button",{onClick:q,className:"px-4 py-2 text-sm font-medium text-zinc-300 bg-zinc-800 hover:bg-zinc-700/80 rounded-xl transition-colors cursor-pointer",children:T}),c.jsx("button",{onClick:$,className:`px-4 py-2 text-sm font-medium text-white rounded-xl transition-all cursor-pointer shadow-lg ${M?"bg-rose-600 hover:bg-rose-500 shadow-rose-950/50":"bg-emerald-600 hover:bg-emerald-500 shadow-emerald-950/50"}`,children:r})]})]})}):null}function wy({selectedId:o,onSelectTask:p,onCreateTask:O,onRerunTask:r,backendInfo:T,onRefreshBackends:M,onManageToken:$}){const{addToast:q}=Ji(),[k,I]=H.useState([]),[D,S]=H.useState(0),[j,X]=H.useState(1),[le,ie]=H.useState(""),[F,De]=H.useState(""),[ve,Re]=H.useState(""),[Z,R]=H.useState("desc"),[se,Q]=H.useState(!1),[P,Ve]=H.useState([]),[qe,Ae]=H.useState(!1),[Ne,Le]=H.useState({isOpen:!1,title:"",content:"",isDanger:!1,onConfirm:null}),Ye=async(w=j)=>{Ae(!0);try{if(se){const G=await Tm({trash:!0});Ve(G.jobs||[])}else{const G=await Tm({page:w,limit:20,q:le.trim(),status:F,kind:ve,sort:Z});I(G.jobs||[]),S(G.total||0)}}catch(G){console.error(G)}finally{Ae(!1)}};H.useEffect(()=>{Ye(1),X(1)},[le,F,ve,Z,se]),H.useEffect(()=>{const w=setInterval(()=>{se||Ye(j)},5e3);return()=>clearInterval(w)},[j,le,F,ve,Z,se]);const je=async w=>{try{const G=await gh(w);q(`任务 #${w.substring(0,8)} 已插队到第 ${G.queue_position} 位`,"success"),Ye(j)}catch(G){q("插队失败: "+G.message,"error")}},A=async w=>{try{await jy(w),q("已将任务移入回收站","info"),o===w&&O(),Ye(j)}catch(G){q("删除失败: "+G.message,"error")}},K=async w=>{try{await Ey(w),q("任务已从回收站恢复","success"),Ye()}catch(G){q("恢复失败: "+G.message,"error")}},J=()=>{Le({isOpen:!0,title:"重置整个服务的 GPU 显存",content:`确定要触发硬重启? | |
| 304 | +这会打断当前正在执行的任务(如果有),并重启后端的 Ray 与推理进程以回收显存泄露。 | |
| 305 | +大约需要耗时 15-20 秒,重置完成前无法提交新任务。`,isDanger:!0,onConfirm:async()=>{Le(w=>({...w,isOpen:!1}));try{await Ay(),q("已触发 GPU 重启,正在回收显存…","info"),M&&M()}catch(w){q("重置失败: "+w.message,"error")}}})},de=Math.max(1,Math.ceil(D/20));return c.jsxs("aside",{className:"w-full md:w-[390px] lg:w-[420px] shrink-0 border-r border-slate-200 bg-white flex flex-col h-full select-none shadow-xs",children:[c.jsxs("div",{className:"p-4 border-b border-slate-200 flex flex-col gap-3",children:[c.jsxs("div",{className:"flex items-center justify-between",children:[c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsx("div",{className:"w-2.5 h-2.5 rounded-full bg-emerald-500 shadow-xs shadow-emerald-500/50"}),c.jsx("h1",{className:"text-sm font-bold tracking-wide text-slate-800",children:"H3 Console"})]}),c.jsx("span",{className:"text-[11px] font-mono text-slate-400",children:"AI Video Studio"})]}),c.jsxs("button",{onClick:O,className:`w-full py-2.5 px-4 rounded-xl text-xs font-semibold flex items-center justify-center gap-2 transition-all cursor-pointer shadow-xs ${!se&&!o?"bg-emerald-600 hover:bg-emerald-700 text-white shadow-emerald-600/30":"bg-slate-50 hover:bg-slate-100 text-slate-700 border border-slate-200"}`,children:[c.jsx(sy,{className:"w-4 h-4 text-emerald-500"}),c.jsx("span",{children:"新建生成任务"})]})]}),se?c.jsxs("div",{className:"p-3 border-b border-slate-200 flex items-center justify-between bg-slate-100/70",children:[c.jsxs("span",{className:"text-xs font-semibold text-slate-700 flex items-center gap-1.5",children:[c.jsx(Gf,{className:"w-4 h-4 text-rose-500"}),c.jsx("span",{children:"回收站视图"})]}),c.jsx("button",{onClick:()=>Q(!1),className:"text-xs text-emerald-600 hover:underline cursor-pointer font-medium",children:"← 返回列表"})]}):c.jsxs("div",{className:"p-3 border-b border-slate-200 flex flex-col gap-2 bg-slate-50/60",children:[c.jsxs("div",{className:"relative",children:[c.jsx(fy,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-slate-400"}),c.jsx("input",{type:"text",placeholder:"搜索 Prompt 或任务 ID…",value:le,onChange:w=>ie(w.target.value),className:"w-full pl-8 pr-3 py-1.5 bg-white border border-slate-200 rounded-xl text-xs text-slate-800 placeholder-slate-400 outline-none focus:border-emerald-500 focus:ring-1 focus:ring-emerald-500/20 transition-all"})]}),c.jsxs("div",{className:"flex items-center gap-1.5",children:[c.jsxs("select",{value:F,onChange:w=>De(w.target.value),className:"flex-1 bg-white border border-slate-200 rounded-xl px-2 py-1.5 text-xs text-slate-700 outline-none focus:border-emerald-500 cursor-pointer",children:[c.jsx("option",{value:"",children:"全部状态"}),c.jsx("option",{value:"queued",children:"排队中"}),c.jsx("option",{value:"running",children:"运行中"}),c.jsx("option",{value:"done",children:"已完成"}),c.jsx("option",{value:"failed",children:"失败"}),c.jsx("option",{value:"cancelled",children:"已取消"})]}),c.jsxs("select",{value:ve,onChange:w=>Re(w.target.value),className:"flex-1 bg-white border border-slate-200 rounded-xl px-2 py-1.5 text-xs text-slate-700 outline-none focus:border-emerald-500 cursor-pointer",children:[c.jsx("option",{value:"",children:"全部类型"}),c.jsx("option",{value:"text",children:"文生视频"}),c.jsx("option",{value:"fl2va",children:"首尾帧"}),c.jsx("option",{value:"ref2va",children:"多参考图"})]}),c.jsx("button",{onClick:()=>R(Z==="desc"?"asc":"desc"),className:"p-1.5 bg-white hover:bg-slate-100 border border-slate-200 rounded-xl text-slate-600 transition-colors cursor-pointer shrink-0",title:"切换排序",children:c.jsx(Qx,{className:"w-3.5 h-3.5"})})]})]}),c.jsx("div",{className:"flex-1 overflow-y-auto p-3 flex flex-col gap-2.5 bg-slate-50/40",children:se?P.length>0?P.map(w=>c.jsxs("div",{className:"p-3 bg-white border border-slate-200 rounded-xl flex items-center justify-between text-xs shadow-xs",children:[c.jsxs("div",{className:"min-w-0 flex-1 pr-2",children:[c.jsxs("span",{className:"font-mono text-slate-500 font-semibold",children:["#",w.id.substring(0,8)]}),c.jsx("p",{className:"text-slate-700 truncate mt-0.5",children:w.req?.prompt||"(无 prompt)"})]}),c.jsx("button",{onClick:()=>K(w.id),className:"px-3 py-1 bg-emerald-50 hover:bg-emerald-100 text-emerald-700 border border-emerald-200 rounded-lg shrink-0 cursor-pointer transition-colors font-medium",children:"恢复"})]},w.id)):c.jsx("div",{className:"py-12 text-center text-xs text-slate-400",children:"回收站是空的"}):k.length>0?k.map(w=>c.jsx(Ny,{job:w,isSelected:o===w.id,onSelect:p,onRerun:r,onPrioritize:je,onDelete:A},w.id)):c.jsx("div",{className:"py-12 text-center text-xs text-slate-400",children:qe?"正在加载任务…":"暂无符合筛选条件的任务"})}),!se&&D>0&&c.jsxs("div",{className:"p-3 border-t border-slate-200 bg-white flex items-center justify-between text-xs text-slate-600",children:[c.jsxs("div",{className:"flex items-center gap-1",children:[c.jsx("button",{disabled:j<=1,onClick:()=>{const w=j-1;X(w),Ye(w)},className:"p-1 hover:bg-slate-100 disabled:opacity-30 rounded-lg cursor-pointer transition-colors",children:c.jsx(Lx,{className:"w-4 h-4"})}),c.jsxs("span",{className:"font-medium",children:[j," / ",de]}),c.jsx("button",{disabled:j>=de,onClick:()=>{const w=j+1;X(w),Ye(w)},className:"p-1 hover:bg-slate-100 disabled:opacity-30 rounded-lg cursor-pointer transition-colors",children:c.jsx(Zx,{className:"w-4 h-4"})})]}),c.jsxs("span",{className:"text-[11px] text-slate-400",children:["共 ",D," 条记录"]})]}),c.jsxs("div",{className:"p-3 border-t border-slate-200 bg-slate-50/80 flex flex-col gap-2",children:[T&&c.jsxs("div",{className:"flex items-center justify-between text-[11px] text-slate-600 bg-white px-2.5 py-1.5 rounded-lg border border-slate-200 font-mono shadow-xs",children:[c.jsxs("div",{className:"flex items-center gap-1.5",children:[c.jsx(ry,{className:"w-3.5 h-3.5 text-emerald-600"}),c.jsxs("span",{className:"font-semibold",children:["GPU: ",T.ready,"/",T.total," 就绪"]})]}),c.jsxs("span",{className:"text-slate-400",children:["fl2va: ",T.partitions?.fl2va||0," | ref2va: ",T.partitions?.ref2va||0]})]}),c.jsxs("div",{className:"flex items-center gap-3 text-[11px] text-slate-500",children:[c.jsx("a",{href:`${ul()}/docs/api.md`,target:"_blank",rel:"noreferrer",className:"hover:text-slate-800 underline-offset-2 hover:underline",children:"API 文档"}),c.jsx("a",{href:`${ul()}/skill.md`,target:"_blank",rel:"noreferrer",className:"hover:text-slate-800 underline-offset-2 hover:underline",children:"skill.md"})]}),c.jsxs("div",{className:"flex items-center justify-between pt-1 text-[11px]",children:[c.jsxs("button",{onClick:()=>Q(!se),className:"flex items-center gap-1 text-slate-500 hover:text-slate-800 transition-colors cursor-pointer",children:[c.jsx(Gf,{className:"w-3.5 h-3.5"}),c.jsx("span",{children:"回收站"})]}),c.jsxs("button",{onClick:$,className:"flex items-center gap-1 text-slate-500 hover:text-slate-800 transition-colors cursor-pointer font-mono",title:"点击配置访问令牌",children:[c.jsx(ny,{className:"w-3.5 h-3.5 text-emerald-600"}),c.jsx("span",{children:Ki()?"Token:已配":"Token:未设"})]}),c.jsxs("button",{onClick:J,className:"flex items-center gap-1 text-amber-600 hover:text-amber-700 transition-colors cursor-pointer font-medium",title:"硬重启服务打断任务并回收显存",children:[c.jsx(nh,{className:"w-3.5 h-3.5"}),c.jsx("span",{children:"重置显存"})]})]})]}),c.jsx(ph,{isOpen:Ne.isOpen,title:Ne.title,content:Ne.content,isDanger:Ne.isDanger,onConfirm:Ne.onConfirm,onCancel:()=>Le(w=>({...w,isOpen:!1}))})]})}function ou({label:o,accept:p="image/*",type:O="image",multiple:r=!1,maxCount:T=99,value:M,onChange:$,hint:q}){const[k,I]=H.useState(""),[D,S]=H.useState(!1),[j,X]=H.useState(!1),le=H.useRef(null),ie=r?Array.isArray(M)?M:[]:M?[M]:[],F=async Z=>{if(!(!Z||Z.length===0)){S(!0);try{const R=[];for(const se of Array.from(Z)){if(ie.length+R.length>=T)break;const Q=await Ty(se);Q.url&&R.push(Q.url)}r?$([...ie,...R].slice(0,T)):R.length>0&&$(R[0])}catch(R){alert("上传失败: "+R.message)}finally{S(!1),le.current&&(le.current.value="")}}},De=Z=>{if(Z.key==="Enter"){Z.preventDefault();const R=k.trim();if(!R)return;if(r){if(ie.length>=T){alert(`最多只允许添加 ${T} 个`);return}$([...ie,R])}else $(R);I("")}},ve=Z=>{if(r){const R=ie.filter((se,Q)=>Q!==Z);$(R)}else $(null)},Re=Z=>{const R=Z.clipboardData?.files;R&&R.length>0&&(Z.preventDefault(),F(R))};return c.jsxs("div",{className:"flex flex-col gap-2.5",onPaste:Re,children:[c.jsxs("div",{className:"flex items-center justify-between",children:[c.jsxs("label",{className:"text-xs font-semibold uppercase tracking-wider text-zinc-300",children:[o," ",T<99&&c.jsxs("span",{className:"text-zinc-500 font-normal",children:["(",ie.length,"/",T,")"]})]}),q&&c.jsx("span",{className:"text-xs text-zinc-500",children:q})]}),(ie.length<T||!r)&&c.jsxs("div",{onDragOver:Z=>{Z.preventDefault(),X(!0)},onDragLeave:()=>X(!1),onDrop:Z=>{Z.preventDefault(),X(!1),F(Z.dataTransfer.files)},className:`relative border-2 border-dashed rounded-xl p-3.5 transition-all flex flex-col sm:flex-row items-center gap-3 bg-zinc-900/60 ${j?"border-emerald-500 bg-emerald-950/20 shadow-inner":"border-zinc-800 hover:border-zinc-700"}`,children:[c.jsx("input",{type:"file",ref:le,accept:p,multiple:r,className:"hidden",onChange:Z=>F(Z.target.files)}),c.jsxs("button",{type:"button",disabled:D,onClick:()=>le.current?.click(),className:"w-full sm:w-auto px-4 py-2 bg-zinc-800 hover:bg-zinc-700/80 text-zinc-200 text-xs font-medium rounded-lg flex items-center justify-center gap-2 border border-zinc-700/60 transition-colors shrink-0 cursor-pointer shadow-sm disabled:opacity-50",children:[c.jsx(xy,{className:"w-4 h-4 text-emerald-400"}),c.jsx("span",{children:D?"正在上传…":"选择或拖拽文件"})]}),c.jsxs("div",{className:"relative flex-1 w-full",children:[c.jsx(iy,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-zinc-500"}),c.jsx("input",{type:"url",placeholder:"或粘贴 URL,回车添加(支持 Ctrl+V 粘贴截图)",value:k,onChange:Z=>I(Z.target.value),onKeyDown:De,className:"w-full pl-9 pr-3 py-1.5 bg-zinc-950/60 border border-zinc-800 focus:border-emerald-500/60 focus:ring-1 focus:ring-emerald-500/40 rounded-lg text-xs text-zinc-200 placeholder-zinc-500 outline-none transition-all"})]})]}),ie.length>0&&c.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3 mt-1",children:ie.map((Z,R)=>{const se=py(Z);return c.jsxs("div",{className:"group relative bg-zinc-900 border border-zinc-800 rounded-xl overflow-hidden flex flex-col shadow-md hover:border-zinc-700 transition-all",children:[c.jsxs("div",{className:"relative aspect-video bg-black flex items-center justify-center overflow-hidden",children:[O==="image"&&c.jsx("img",{src:ru(Z),alt:se,className:"w-full h-full object-cover transition-transform group-hover:scale-105 duration-300"}),O==="video"&&c.jsx("video",{src:Zi(Z),controls:!0,className:"w-full h-full object-contain bg-black"}),O==="audio"&&c.jsxs("div",{className:"p-2 w-full flex flex-col items-center justify-center gap-1 text-zinc-400",children:[c.jsx(ey,{className:"w-6 h-6 text-emerald-400 mb-1"}),c.jsx("audio",{src:Zi(Z),controls:!0,className:"w-full h-8"})]}),c.jsxs("div",{className:"absolute top-1.5 right-1.5 flex gap-1 z-10",children:[c.jsx("a",{href:Z,target:"_blank",rel:"noreferrer",className:"p-1 bg-black/60 hover:bg-black/90 text-zinc-300 hover:text-white rounded-md backdrop-blur-md transition-colors",title:"打开原图",children:c.jsx(ly,{className:"w-3.5 h-3.5"})}),c.jsx("button",{type:"button",onClick:()=>ve(R),className:"p-1 bg-rose-950/80 hover:bg-rose-600 text-rose-300 hover:text-white rounded-md backdrop-blur-md transition-colors cursor-pointer",title:"删除",children:c.jsx(Vf,{className:"w-3.5 h-3.5"})})]})]}),c.jsx("div",{className:"px-2.5 py-1.5 bg-zinc-900/90 text-[11px] text-zinc-400 truncate border-t border-zinc-800/80 font-mono",title:se,children:se||"媒体文件"})]},R)})})]})}const Xi=[{value:"1344x768",width:1344,height:768,label:"1344×768 (横屏 · 官方默认)",maxFrames:412,isLandscape:!0,aspect:"16:9"},{value:"768x1344",width:768,height:1344,label:"768×1344 (竖屏 · 官方默认)",maxFrames:412,isLandscape:!1,aspect:"9:16"},{value:"832x480",width:832,height:480,label:"832×480 (横屏 · 标准)",maxFrames:1125,isLandscape:!0,aspect:"16:9"},{value:"480x832",width:480,height:832,label:"480×832 (竖屏 · 推荐短剧)",maxFrames:1125,isLandscape:!1,aspect:"9:16"},{value:"1024x576",width:1024,height:576,label:"1024×576 (横屏 · 高清)",maxFrames:743,isLandscape:!0,aspect:"16:9"},{value:"576x1024",width:576,height:1024,label:"576×1024 (竖屏 · 高清)",maxFrames:743,isLandscape:!1,aspect:"9:16"},{value:"448x256",width:448,height:256,label:"448×256 (横屏 · 超长)",maxFrames:1200,isLandscape:!0,aspect:"16:9"},{value:"256x448",width:256,height:448,label:"256×448 (竖屏 · 超长)",maxFrames:1200,isLandscape:!1,aspect:"9:16"}],jm="480x832",qf="243",Vi=[{value:"124",frames:124,label:"5秒 (124帧)"},{value:"243",frames:243,label:"10秒 (243帧 · 默认)"},{value:"362",frames:362,label:"15秒 (362帧)"},{value:"412",frames:412,label:"17秒 (412帧 · 1344上限)"},{value:"600",frames:600,label:"25秒 (600帧)"},{value:"743",frames:743,label:"31秒 (743帧 · 1024上限)"},{value:"900",frames:900,label:"37.5秒 (900帧)"},{value:"1125",frames:1125,label:"47秒 (1125帧 · 832上限)"},{value:"1200",frames:1200,label:"50秒 (1200帧 · 256画质上限)"}],Uy={true:[{value:"4",label:"4 步 (极速推荐 · LoRA 蒸馏)"},{value:"8",label:"8 步 (上限)"}],false:[{value:"20",label:"20 步 (平衡标准)"},{value:"50",label:"50 步 (全质量 · 约9.6倍耗时)"}]},Ry=[{value:"0",label:"0 (默认固定)"},{value:"42",label:"42"},{value:"123",label:"123"},{value:"2024",label:"2024"},{value:"random",label:"🎲 随机 Seed"}];function Hy({initialValues:o,onCreated:p}){const{addToast:O}=Ji(),[r,T]=H.useState("text"),[M,$]=H.useState(""),[q,k]=H.useState(jm),[I,D]=H.useState(qf),[S,j]=H.useState(!1),[X,le]=H.useState("20"),[ie,F]=H.useState("0"),[De,ve]=H.useState(""),[Re,Z]=H.useState(""),[R,se]=H.useState(!1),[Q,P]=H.useState(!1),[Ve,qe]=H.useState(""),[Ae,Ne]=H.useState(null),[Le,Ye]=H.useState(null),[je,A]=H.useState([]),[K,J]=H.useState([]),[de,w]=H.useState([]);H.useEffect(()=>{if(!o)return;const N=o;N.first_frame_url||N.last_frame_url?(T("fl2va"),Ne(N.first_frame_url||null),Ye(N.last_frame_url||null)):(N.reference_image_urls||[]).length||(N.reference_video_urls||[]).length||(N.reference_audio_urls||[]).length?(T("ref2va"),A(N.reference_image_urls||[]),J(N.reference_video_urls||[]),w(N.reference_audio_urls||[])):T("text"),$(N.prompt||"");const fe=Xi.find(B=>B.width===N.width&&B.height===N.height);fe&&k(fe.value);const ae=Vi.find(B=>B.frames===N.frames);ae&&D(ae.value);const ce=N.turbo!==!1;j(ce),N.steps!=null&&le(String(N.steps)),N.seed!=null&&F(String(N.seed)),N.cfg_scale!=null&&ve(String(N.cfg_scale)),N.negative_prompt&&Z(N.negative_prompt)},[o]);const G=Xi.find(N=>N.value===q)||Xi[0],Ee=Vi.filter(N=>N.frames<=G.maxFrames),il=Vi.filter(N=>N.frames>G.maxFrames);H.useEffect(()=>{Ee.some(N=>N.value===I)||D(Ee[0]?.value||qf)},[q]);const m=Uy[S];H.useEffect(()=>{m.some(N=>N.value===X)||le(m[0].value)},[S]);const E=()=>{confirm("确定清空当前表单所有内容?")&&($(""),k(jm),D(qf),j(!1),le("20"),F("0"),ve(""),Z(""),Ne(null),Ye(null),A([]),J([]),w([]),qe(""),O("已恢复默认配置","info"))},V=async N=>{if(N.preventDefault(),qe(""),!M.trim()){qe("请填写 Prompt 提示词");return}const fe=Vi.find(ce=>ce.value===I),ae={prompt:M.trim(),width:G.width,height:G.height,frames:fe?fe.frames:243,turbo:S,steps:parseInt(X,10),seed:ie==="random"?Math.floor(Math.random()*2**31):parseInt(ie,10)};if(De.trim()!==""&&(ae.cfg_scale=parseFloat(De)),Re.trim()!==""&&(ae.negative_prompt=Re.trim()),r==="fl2va"){if(!Ae){qe("首尾帧模式下必须上传【首帧图】");return}ae.first_frame_url=Ae,Le&&(ae.last_frame_url=Le)}else if(r==="ref2va"){if(je.length===0&&K.length===0&&de.length===0){qe("参考模式下至少需要上传 1 张参考图、1 段参考视频或 1 个音频");return}ae.reference_image_urls=je,ae.reference_video_urls=K,ae.reference_audio_urls=de}P(!0);try{const ce=await _y(ae);O(`任务提交成功 (#${ce.id.substring(0,8)})`,"success"),p(ce.id)}catch(ce){qe("提交失败: "+ce.message),O("提交失败: "+ce.message,"error")}finally{P(!1)}};return c.jsxs("div",{className:"max-w-4xl mx-auto py-6 px-4 sm:px-8",children:[c.jsx("div",{className:"flex items-center gap-1.5 p-1.5 bg-slate-100 dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl w-fit shadow-xs mb-6",children:[{key:"text",label:"文生视频",desc:"Text to Video"},{key:"fl2va",label:"首尾帧生视频",desc:"FL2VA"},{key:"ref2va",label:"多参考图生视频",desc:"Ref2VA"}].map(N=>c.jsxs("button",{onClick:()=>T(N.key),className:`flex flex-col items-start px-4 py-2 rounded-xl text-xs transition-all cursor-pointer ${r===N.key?"bg-emerald-600 text-white font-semibold shadow-sm":"text-slate-600 hover:text-slate-900 hover:bg-white/80 dark:text-zinc-400 dark:hover:text-zinc-200 dark:hover:bg-zinc-800/60"}`,children:[c.jsx("span",{children:N.label}),c.jsx("span",{className:`text-[10px] ${r===N.key?"text-emerald-100":"text-slate-400 dark:text-zinc-500"}`,children:N.desc})]},N.key))}),c.jsxs("form",{onSubmit:V,className:"flex flex-col gap-6",children:[c.jsxs("div",{className:"bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl p-5 shadow-xs",children:[c.jsxs("div",{className:"flex items-center justify-between mb-2.5",children:[c.jsxs("label",{className:"text-xs font-bold uppercase tracking-wider text-slate-700 dark:text-zinc-300 flex items-center gap-2",children:[c.jsx(hy,{className:"w-3.5 h-3.5 text-emerald-600 dark:text-emerald-400"}),c.jsx("span",{children:"Prompt 提示词"})]}),c.jsxs("span",{className:"text-xs text-slate-400 dark:text-zinc-500",children:[M.length," 字"]})]}),c.jsx("textarea",{rows:5,value:M,onChange:N=>$(N.target.value),placeholder:r==="fl2va"?"描述首帧到尾帧之间的动态演变过程,例如:女子缓缓端起茶杯,轻轻抿了一口,微风拂动发丝...":"描述您想要生成的电影级视频画面、光影运镜与角色动作...",className:"w-full bg-slate-50 dark:bg-zinc-950/70 border border-slate-200 dark:border-zinc-800 focus:bg-white focus:border-emerald-500 focus:ring-1 focus:ring-emerald-500/20 rounded-xl p-3.5 text-sm text-slate-900 dark:text-zinc-100 placeholder-slate-400 dark:placeholder-zinc-500 outline-none transition-all resize-y min-h-[120px] leading-relaxed"})]}),r==="fl2va"&&c.jsxs("div",{className:"bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl p-5 shadow-xs flex flex-col gap-5",children:[c.jsx(ou,{label:"首帧图片 (必填)",accept:"image/*",type:"image",value:Ae,onChange:Ne,hint:"视频起始画面"}),c.jsx("div",{className:"border-t border-slate-100 dark:border-zinc-800/80 pt-4",children:c.jsx(ou,{label:"尾帧图片 (可选)",accept:"image/*",type:"image",value:Le,onChange:Ye,hint:"视频结束画面,不填则自由发散"})})]}),r==="ref2va"&&c.jsxs("div",{className:"bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl p-5 shadow-xs flex flex-col gap-5",children:[c.jsx(ou,{label:"参考图片 (可多选)",accept:"image/*",type:"image",multiple:!0,value:je,onChange:A,hint:"角色/场景设定图,无数量限制"}),c.jsx("div",{className:"border-t border-slate-100 dark:border-zinc-800/80 pt-4",children:c.jsx(ou,{label:"参考视频 (可选 · 最多3段)",accept:"video/*",type:"video",multiple:!0,maxCount:3,value:K,onChange:J,hint:"2-15秒动态参考,自动保留音轨"})}),c.jsx("div",{className:"border-t border-slate-100 dark:border-zinc-800/80 pt-4",children:c.jsx(ou,{label:"独立音频参考 (可选 · 最多3首)",accept:"audio/*",type:"audio",multiple:!0,maxCount:3,value:de,onChange:w,hint:"背景音乐或台词声音参考"})})]}),c.jsxs("div",{className:"bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-2xl p-5 shadow-xs flex flex-col gap-5",children:[c.jsxs("div",{className:"flex items-center gap-2 text-xs font-bold uppercase tracking-wider text-slate-700 dark:text-zinc-300",children:[c.jsx(my,{className:"w-3.5 h-3.5 text-emerald-600 dark:text-emerald-400"}),c.jsx("span",{children:"生成参数与画质规格"})]}),c.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[c.jsxs("div",{className:"flex flex-col gap-1.5",children:[c.jsx("label",{className:"text-xs text-slate-600 dark:text-zinc-400 font-medium",children:"分辨率与画幅"}),c.jsx("select",{value:q,onChange:N=>k(N.target.value),className:"bg-slate-50 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2.5 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 cursor-pointer",children:Xi.map(N=>c.jsx("option",{value:N.value,children:N.label},N.value))})]}),c.jsxs("div",{className:"flex flex-col gap-1.5",children:[c.jsx("label",{className:"text-xs text-slate-600 dark:text-zinc-400 font-medium",children:"生成时长 (帧数)"}),c.jsx("select",{value:I,onChange:N=>D(N.target.value),className:"bg-slate-50 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2.5 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 cursor-pointer",children:Ee.map(N=>c.jsx("option",{value:N.value,children:N.label},N.value))})]})]}),il.length>0&&c.jsxs("div",{className:"flex items-center gap-2 p-2.5 bg-amber-50 border border-amber-200 dark:bg-amber-950/30 dark:border-amber-600/30 rounded-xl text-xs text-amber-800 dark:text-amber-300",children:[c.jsx(Yf,{className:"w-4 h-4 shrink-0 text-amber-600 dark:text-amber-400"}),c.jsxs("span",{children:[G.label," 实测上限 ",G.maxFrames," 帧,已自动过滤超出显存承受的超长档位。"]})]}),c.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4 pt-3 border-t border-slate-100 dark:border-zinc-800/80 items-center",children:[c.jsxs("div",{className:"flex flex-col gap-1.5",children:[c.jsx("label",{className:"text-xs text-slate-600 dark:text-zinc-400 font-medium",children:"Turbo 加速 LoRA"}),c.jsxs("div",{className:"flex p-1 bg-slate-100 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl",children:[c.jsx("button",{type:"button",onClick:()=>j(!1),className:`flex-1 py-1.5 text-xs font-medium rounded-lg transition-colors cursor-pointer ${S?"text-slate-500 dark:text-zinc-400 hover:text-slate-800":"bg-white dark:bg-zinc-800 text-slate-800 dark:text-white shadow-xs"}`,children:"关 (稳健多步)"}),c.jsx("button",{type:"button",onClick:()=>j(!0),className:`flex-1 py-1.5 text-xs font-medium rounded-lg transition-colors cursor-pointer ${S?"bg-emerald-600 text-white shadow-xs":"text-slate-500 dark:text-zinc-400 hover:text-slate-800"}`,children:"开 (4步极速)"})]})]}),c.jsxs("div",{className:"flex flex-col gap-1.5",children:[c.jsx("label",{className:"text-xs text-slate-600 dark:text-zinc-400 font-medium",children:"采样步数 (Steps)"}),c.jsx("select",{value:X,onChange:N=>le(N.target.value),className:"bg-slate-50 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 cursor-pointer",children:m.map(N=>c.jsx("option",{value:N.value,children:N.label},N.value))})]}),c.jsxs("div",{className:"flex flex-col gap-1.5",children:[c.jsx("label",{className:"text-xs text-slate-600 dark:text-zinc-400 font-medium",children:"随机种子 (Seed)"}),c.jsx("select",{value:ie,onChange:N=>F(N.target.value),className:"bg-slate-50 dark:bg-zinc-950/80 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 cursor-pointer",children:Ry.map(N=>c.jsx("option",{value:N.value,children:N.label},N.value))})]})]}),c.jsxs("div",{className:"pt-2",children:[c.jsxs("button",{type:"button",onClick:()=>se(!R),className:"flex items-center gap-1.5 text-xs font-medium text-slate-600 dark:text-zinc-400 hover:text-slate-900 dark:hover:text-zinc-200 transition-colors cursor-pointer",children:[c.jsx("span",{children:"高级调参 (CFG / 负面提示词)"}),R?c.jsx(Kx,{className:"w-3.5 h-3.5"}):c.jsx(Vx,{className:"w-3.5 h-3.5"})]}),R&&c.jsxs("div",{className:"mt-3 p-4 bg-slate-50 dark:bg-zinc-950/50 border border-slate-200 dark:border-zinc-800/80 rounded-xl flex flex-col gap-4",children:[c.jsxs("div",{className:"flex flex-col gap-1.5",children:[c.jsx("label",{className:"text-xs text-slate-600 dark:text-zinc-400",children:"CFG Scale (留空默认 1.0)"}),c.jsx("input",{type:"number",step:"0.1",min:"0",placeholder:"留空 = 1.0 (蒸馏 LoRA 调太高易出伪影)",value:De,onChange:N=>ve(N.target.value),className:"bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-xl px-3 py-2 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500"})]}),c.jsxs("div",{className:"flex flex-col gap-1.5",children:[c.jsx("label",{className:"text-xs text-slate-600 dark:text-zinc-400",children:"负面提示词 Negative Prompt"}),c.jsx("textarea",{rows:2,placeholder:"例如:模糊,低画质,肢体变形,拖影,五官扭曲",value:Re,onChange:N=>Z(N.target.value),className:"bg-white dark:bg-zinc-900 border border-slate-200 dark:border-zinc-800 rounded-xl p-2.5 text-xs text-slate-800 dark:text-zinc-200 outline-none focus:border-emerald-500 resize-none"})]})]})]})]}),Ve&&c.jsxs("div",{className:"p-3 bg-rose-50 border border-rose-200 dark:bg-rose-950/60 dark:border-rose-500/40 rounded-xl text-xs text-rose-700 dark:text-rose-300 flex items-center gap-2",children:[c.jsx(Yf,{className:"w-4 h-4 shrink-0 text-rose-500"}),c.jsx("span",{children:Ve})]}),c.jsxs("div",{className:"flex items-center justify-end gap-3 pb-8",children:[c.jsx("button",{type:"button",onClick:E,className:"px-5 py-2.5 bg-slate-100 hover:bg-slate-200 dark:bg-zinc-800 dark:hover:bg-zinc-700 text-slate-700 dark:text-zinc-300 text-xs font-medium rounded-xl transition-colors cursor-pointer border border-slate-200 dark:border-zinc-700",children:"清空表单"}),c.jsxs("button",{type:"submit",disabled:Q,className:"px-7 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white text-xs font-semibold rounded-xl transition-all shadow-md shadow-emerald-600/30 flex items-center gap-2 cursor-pointer disabled:opacity-50",children:[Q?c.jsx(nh,{className:"w-4 h-4 animate-spin"}):c.jsx(oy,{className:"w-4 h-4"}),c.jsx("span",{children:Q?"正在提交…":"立即生成视频"})]})]})]})]})}function qy({taskId:o,onBack:p,onRerun:O}){const{addToast:r}=Ji(),[T,M]=H.useState(null),[$,q]=H.useState(!0),[k,I]=H.useState(!1),[D,S]=H.useState(null),[j,X]=H.useState(!1),[le,ie]=H.useState(!1),[F,De]=H.useState(!1),[ve,Re]=H.useState({isOpen:!1,title:"",content:"",isDanger:!1,onConfirm:null}),Z=async()=>{try{const G=await zy(o);M(G)}catch(G){console.error(G)}finally{q(!1)}};if(H.useEffect(()=>{Z();const G=setInterval(()=>{T&&(T.status==="queued"||T.status==="running")&&Z()},2500);return()=>clearInterval(G)},[o,T?.status]),$&&!T)return c.jsx("div",{className:"flex-1 flex items-center justify-center text-slate-500 text-sm",children:c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsx("div",{className:"w-5 h-5 border-2 border-emerald-500 border-t-transparent rounded-full animate-spin"}),c.jsx("span",{children:"正在加载任务详情…"})]})});if(!T)return c.jsxs("div",{className:"p-8 text-center flex flex-col items-center gap-4 text-slate-500",children:[c.jsx("p",{children:"未找到该任务或已被彻底删除"}),c.jsx("button",{onClick:p,className:"px-4 py-2 bg-slate-100 hover:bg-slate-200 text-xs rounded-xl text-slate-700 cursor-pointer font-medium",children:"返回创建视图"})]});const R=T.req||{},se=T.status==="done",Q=T.status==="running",P=T.status==="queued",Ve=T.status==="failed",qe=T.status==="cancelled",Ae=T.step||0,Ne=T.total_steps||R.steps||20,Le=Ne>0?Math.min(100,Math.max(Ae>0?5:2,Math.round(Ae/Ne*100))):0,Ye=T.elapsed_seconds||0;let je=null;if(Ae>0&&Ne>Ae){const G=Ye/Ae,Ee=Math.round(G*(Ne-Ae));je=Ee>60?`约 ${Math.round(Ee/60)} 分钟`:`约 ${Ee} 秒`}const A=se?yh(`${ul()}/v1/videos/${T.id}/file`):null,K=()=>{R.prompt&&(navigator.clipboard.writeText(R.prompt),I(!0),r("已复制 Prompt 提示词到剪贴板","success"),setTimeout(()=>I(!1),2e3))},J=async()=>{try{const G=await gh(T.id);r(`已成功插队至第 ${G.queue_position} 位`,"success"),Z()}catch(G){r("插队失败: "+G.message,"error")}},de=G=>{Re({isOpen:!0,title:G?"停止正在运行的任务":"取消排队任务",content:G?`确定停止当前正在运行的任务? | |
| 306 | +这会硬重启后台 Raylight 服务以释放 GPU 显存(约耗时 15-20 秒),重启完成前将暂时无法提交新任务。`:"确定取消这条排队中的任务?",isDanger:G,onConfirm:async()=>{Re(Ee=>({...Ee,isOpen:!1}));try{await Oy(T.id),r(G?"已发出停止与 GPU 重置指令":"已取消任务","info"),Z()}catch(Ee){r("操作失败: "+Ee.message,"error")}}})},w=async()=>{if(!le&&!D){X(!0);try{const G=await Dy(T.id);S(G)}catch(G){r("获取 ComfyUI History 失败: "+G.message,"error")}finally{X(!1)}}ie(!le)};return c.jsxs("div",{className:"max-w-5xl mx-auto py-6 px-4 sm:px-8 flex flex-col gap-6",children:[c.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4 pb-4 border-b border-slate-200",children:[c.jsxs("div",{className:"flex items-center gap-3",children:[c.jsx("button",{onClick:p,className:"p-2 hover:bg-slate-100 rounded-xl text-slate-500 hover:text-slate-800 transition-colors cursor-pointer",title:"返回新建",children:c.jsx(Gx,{className:"w-5 h-5"})}),c.jsxs("div",{children:[c.jsxs("div",{className:"flex items-center gap-2.5",children:[c.jsxs("h2",{className:"text-base font-mono font-bold text-slate-800",children:["#",T.id]}),se&&c.jsx("span",{className:"px-2.5 py-0.5 text-xs font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200 rounded-full",children:"已完成"}),Q&&c.jsxs("span",{className:"px-2.5 py-0.5 text-xs font-semibold bg-emerald-50 text-emerald-700 border border-emerald-200 rounded-full flex items-center gap-1.5 animate-pulse",children:[c.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-emerald-500"}),"正在采样 · ",Le,"%"]}),P&&c.jsxs("span",{className:"px-2.5 py-0.5 text-xs font-semibold bg-slate-100 text-slate-700 border border-slate-200 rounded-full",children:["排队中 ",T.queue_position?`(第 ${T.queue_position} 位)`:""]}),Ve&&c.jsx("span",{className:"px-2.5 py-0.5 text-xs font-semibold bg-rose-50 text-rose-700 border border-rose-200 rounded-full",children:"执行失败"}),qe&&c.jsx("span",{className:"px-2.5 py-0.5 text-xs font-semibold bg-slate-100 text-slate-500 border border-slate-200 rounded-full",children:"已取消"})]}),c.jsxs("div",{className:"text-xs text-slate-400 mt-0.5",children:["创建于 ",gy(T.created_at)]})]})]}),c.jsxs("div",{className:"flex items-center gap-2",children:[c.jsxs("button",{onClick:()=>O(T),className:"px-3.5 py-2 bg-slate-50 hover:bg-slate-100 text-slate-700 text-xs font-medium rounded-xl flex items-center gap-1.5 transition-colors cursor-pointer border border-slate-200 shadow-xs",children:[c.jsx(ih,{className:"w-3.5 h-3.5 text-emerald-600"}),c.jsx("span",{children:"复用此任务重跑"})]}),P&&c.jsxs(c.Fragment,{children:[c.jsxs("button",{onClick:J,className:"px-3.5 py-2 bg-indigo-50 hover:bg-indigo-100 text-indigo-700 border border-indigo-200 text-xs font-medium rounded-xl flex items-center gap-1.5 transition-colors cursor-pointer",children:[c.jsx(wm,{className:"w-3.5 h-3.5"}),c.jsx("span",{children:"优先插队"})]}),c.jsxs("button",{onClick:()=>de(!1),className:"px-3.5 py-2 bg-slate-50 hover:bg-slate-100 text-slate-600 text-xs font-medium rounded-xl flex items-center gap-1.5 transition-colors cursor-pointer border border-slate-200",children:[c.jsx($x,{className:"w-3.5 h-3.5"}),c.jsx("span",{children:"取消"})]})]}),Q&&c.jsxs("button",{onClick:()=>de(!0),className:"px-3.5 py-2 bg-rose-50 hover:bg-rose-100 text-rose-700 border border-rose-200 text-xs font-medium rounded-xl flex items-center gap-1.5 transition-colors cursor-pointer shadow-xs",children:[c.jsx(kx,{className:"w-3.5 h-3.5"}),c.jsx("span",{children:"强行终止任务"})]})]})]}),c.jsx("div",{className:"relative bg-slate-900 border border-slate-200 rounded-2xl overflow-hidden shadow-xs flex flex-col items-center justify-center min-h-[360px]",children:se&&A?c.jsxs("div",{className:"w-full flex flex-col items-center p-4",children:[c.jsx("video",{src:A,controls:!0,autoPlay:!0,loop:!0,playsInline:!0,className:"max-h-[560px] w-auto max-w-full rounded-xl shadow-xl bg-black"}),c.jsxs("div",{className:"w-full flex items-center justify-between mt-3 px-2",children:[c.jsxs("span",{className:"text-xs text-slate-400 font-mono",children:["规格:",R.width,"×",R.height," · ",R.frames," 帧 (约 ",(R.frames/24).toFixed(1),"s)"]}),c.jsxs("a",{href:A,download:`h3_${T.id.substring(0,8)}.mp4`,className:"px-4 py-2 bg-emerald-600 hover:bg-emerald-700 text-white text-xs font-medium rounded-xl flex items-center gap-2 transition-all shadow-sm",children:[c.jsx(Px,{className:"w-4 h-4"}),c.jsxs("span",{children:["下载 MP4 视频 ",T.size_bytes?`(${by(T.size_bytes)})`:""]})]})]})]}):Q?c.jsxs("div",{className:"w-full max-w-2xl p-8 flex flex-col items-center gap-6",children:[c.jsxs("div",{className:"flex items-center gap-2 text-emerald-400 text-xs font-bold uppercase tracking-wider bg-emerald-950/60 px-3 py-1 rounded-full border border-emerald-500/30",children:[c.jsx(Yx,{className:"w-3.5 h-3.5 animate-spin"}),c.jsx("span",{children:"GPU 扩散采样中 · 实时推演"})]}),c.jsxs("div",{className:"flex flex-col items-center",children:[c.jsxs("div",{className:"text-5xl font-extrabold font-mono text-white tracking-tight flex items-baseline gap-1",children:[c.jsx("span",{children:Le}),c.jsx("span",{className:"text-2xl text-emerald-400 font-semibold",children:"%"})]}),c.jsxs("p",{className:"text-xs text-slate-400 mt-1",children:["正在执行第 ",c.jsx("span",{className:"text-white font-mono font-bold",children:Ae})," 步 / 共 ",c.jsx("span",{className:"text-slate-300 font-mono",children:Ne})," 步"]})]}),c.jsxs("div",{className:"w-full flex flex-col gap-2",children:[c.jsx("div",{className:"w-full bg-slate-800/90 h-3.5 rounded-full overflow-hidden p-0.5 border border-slate-700 shadow-inner",children:c.jsx("div",{className:"bg-gradient-to-r from-emerald-500 to-teal-400 h-full rounded-full transition-all duration-300 relative overflow-hidden",style:{width:`${Le}%`},children:c.jsx("div",{className:"absolute inset-0 bg-white/25 animate-pulse"})})}),c.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400 px-1 font-mono",children:[c.jsxs("span",{className:"flex items-center gap-1 text-slate-300",children:[c.jsx(Li,{className:"w-3.5 h-3.5 text-emerald-400"}),c.jsxs("span",{children:["已耗时: ",Ye," 秒"]})]}),je&&c.jsxs("span",{className:"text-emerald-400 font-medium",children:["预计还需: ",je]})]})]}),c.jsxs("div",{className:"grid grid-cols-4 w-full gap-2 pt-4 border-t border-slate-800 text-center",children:[c.jsxs("div",{className:"flex flex-col items-center gap-1",children:[c.jsx("div",{className:"w-6 h-6 rounded-full bg-emerald-500/20 text-emerald-400 text-xs font-bold flex items-center justify-center border border-emerald-500/40",children:"✓"}),c.jsx("span",{className:"text-[11px] text-slate-400",children:"1. 排队调度"})]}),c.jsxs("div",{className:"flex flex-col items-center gap-1",children:[c.jsx("div",{className:"w-6 h-6 rounded-full bg-emerald-500/20 text-emerald-400 text-xs font-bold flex items-center justify-center border border-emerald-500/40",children:"✓"}),c.jsx("span",{className:"text-[11px] text-slate-400",children:"2. 模型装载"})]}),c.jsxs("div",{className:"flex flex-col items-center gap-1",children:[c.jsx("div",{className:"w-6 h-6 rounded-full bg-emerald-500 text-white text-xs font-bold flex items-center justify-center shadow-md animate-pulse",children:"3"}),c.jsx("span",{className:"text-[11px] text-white font-semibold",children:"3. 扩散计算"})]}),c.jsxs("div",{className:"flex flex-col items-center gap-1 opacity-40",children:[c.jsx("div",{className:"w-6 h-6 rounded-full bg-slate-800 text-slate-400 text-xs font-bold flex items-center justify-center border border-slate-700",children:"4"}),c.jsx("span",{className:"text-[11px] text-slate-400",children:"4. 压制出片"})]})]})]}):P?c.jsxs("div",{className:"p-12 flex flex-col items-center gap-3 text-center",children:[c.jsx(Li,{className:"w-10 h-10 text-blue-400 animate-pulse"}),c.jsxs("div",{children:[c.jsxs("h3",{className:"text-base font-semibold text-blue-300",children:["正在等待空闲的 ",T.partition||"GPU"," 后端…"]}),c.jsxs("p",{className:"text-xs text-slate-400 mt-1",children:["当前排队第 ",T.queue_position||1," 位,空闲节点就绪后将自动调度启动"]})]})]}):c.jsxs("div",{className:"p-12 flex flex-col items-center gap-3 text-center max-w-lg",children:[c.jsx(dy,{className:"w-10 h-10 text-rose-400"}),c.jsx("h3",{className:"text-base font-semibold text-rose-300",children:Ve?"生成失败":"任务已取消"}),c.jsx("div",{className:"p-3 bg-rose-950/40 border border-rose-500/30 rounded-xl text-xs text-rose-200/90 font-mono text-left w-full max-h-48 overflow-y-auto whitespace-pre-wrap",children:T.error||"无详细错误日志"})]})}),c.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3.5",children:[c.jsxs("div",{className:"p-4 bg-white border border-slate-200 rounded-xl flex flex-col gap-1 shadow-xs",children:[c.jsxs("span",{className:"text-[11px] uppercase tracking-wider text-slate-500 font-semibold flex items-center gap-1.5",children:[c.jsx(Li,{className:"w-3.5 h-3.5 text-emerald-600"}),c.jsx("span",{children:"生成耗时"})]}),c.jsx("span",{className:"text-sm font-bold font-mono text-slate-800",children:T.started_at&&T.finished_at?`${(T.finished_at-T.started_at).toFixed(1)} 秒`:Q?`${T.elapsed_seconds||0} 秒 (进行中)`:"—"})]}),c.jsxs("div",{className:"p-4 bg-white border border-slate-200 rounded-xl flex flex-col gap-1 shadow-xs",children:[c.jsxs("span",{className:"text-[11px] uppercase tracking-wider text-slate-500 font-semibold flex items-center gap-1.5",children:[c.jsx(Ix,{className:"w-3.5 h-3.5 text-indigo-600"}),c.jsx("span",{children:"峰值显存"})]}),c.jsx("span",{className:"text-sm font-bold font-mono text-slate-800",children:T.peak_vram_gb?`${T.peak_vram_gb} GB`:"—"})]}),c.jsxs("div",{className:"p-4 bg-white border border-slate-200 rounded-xl flex flex-col gap-1 shadow-xs",children:[c.jsxs("span",{className:"text-[11px] uppercase tracking-wider text-slate-500 font-semibold flex items-center gap-1.5",children:[c.jsx(uy,{className:"w-3.5 h-3.5 text-amber-600"}),c.jsx("span",{children:"分配后端卡"})]}),c.jsx("span",{className:"text-sm font-bold font-mono text-slate-800 truncate",children:T.backend||"自动弹性调度"})]}),c.jsxs("div",{className:"p-4 bg-white border border-slate-200 rounded-xl flex flex-col gap-1 shadow-xs",children:[c.jsxs("span",{className:"text-[11px] uppercase tracking-wider text-slate-500 font-semibold flex items-center gap-1.5",children:[c.jsx(Fx,{className:"w-3.5 h-3.5 text-teal-600"}),c.jsx("span",{children:"采样规格"})]}),c.jsxs("span",{className:"text-sm font-bold font-mono text-slate-800",children:[R.turbo===!1?"常规":"Turbo"," · ",R.steps??"?","步 · seed=",R.seed??0]})]})]}),c.jsxs("div",{className:"p-5 bg-white border border-slate-200 rounded-2xl flex flex-col gap-3 shadow-xs",children:[c.jsxs("div",{className:"flex items-center justify-between",children:[c.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-slate-600",children:"Prompt 提示词"}),c.jsxs("button",{onClick:K,className:"flex items-center gap-1.5 text-xs text-slate-500 hover:text-emerald-600 transition-colors cursor-pointer",children:[k?c.jsx(Xx,{className:"w-3.5 h-3.5 text-emerald-600"}):c.jsx(Wx,{className:"w-3.5 h-3.5"}),c.jsx("span",{children:k?"已复制":"复制文本"})]})]}),c.jsx("p",{className:"text-sm text-slate-800 leading-relaxed font-normal bg-slate-50 p-3.5 rounded-xl border border-slate-200 whitespace-pre-wrap",children:R.prompt||"(无提示词)"}),R.negative_prompt&&c.jsxs("div",{className:"text-xs text-slate-600 flex flex-col gap-1 pt-1",children:[c.jsx("span",{className:"font-semibold text-slate-500",children:"负面提示词:"}),c.jsx("span",{className:"bg-slate-50 p-2.5 rounded-xl border border-slate-200 text-slate-600",children:R.negative_prompt})]})]}),(R.first_frame_url||R.last_frame_url||(R.reference_image_urls||[]).length>0||(R.reference_video_urls||[]).length>0||(R.reference_audio_urls||[]).length>0)&&c.jsxs("div",{className:"p-5 bg-white border border-slate-200 rounded-2xl flex flex-col gap-3.5 shadow-xs",children:[c.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-slate-600",children:"输入素材与参考源"}),c.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 md:grid-cols-6 gap-3",children:[R.first_frame_url&&c.jsxs("div",{className:"relative group bg-slate-100 rounded-xl overflow-hidden border border-slate-200 shadow-xs",children:[c.jsx("img",{src:ru(R.first_frame_url),alt:"首帧",className:"w-full aspect-square object-cover"}),c.jsx("div",{className:"absolute bottom-0 inset-x-0 bg-slate-900/80 px-2 py-1 text-[10px] text-white font-medium text-center",children:"首帧"})]}),R.last_frame_url&&c.jsxs("div",{className:"relative group bg-slate-100 rounded-xl overflow-hidden border border-slate-200 shadow-xs",children:[c.jsx("img",{src:ru(R.last_frame_url),alt:"尾帧",className:"w-full aspect-square object-cover"}),c.jsx("div",{className:"absolute bottom-0 inset-x-0 bg-slate-900/80 px-2 py-1 text-[10px] text-white font-medium text-center",children:"尾帧"})]}),(R.reference_image_urls||[]).map((G,Ee)=>c.jsxs("div",{className:"relative group bg-slate-100 rounded-xl overflow-hidden border border-slate-200 shadow-xs",children:[c.jsx("img",{src:ru(G),alt:`参考图${Ee+1}`,className:"w-full aspect-square object-cover"}),c.jsxs("div",{className:"absolute bottom-0 inset-x-0 bg-slate-900/80 px-2 py-1 text-[10px] text-white font-medium text-center truncate",children:["参考图 ",Ee+1]})]},Ee)),(R.reference_video_urls||[]).map((G,Ee)=>c.jsxs("div",{className:"relative group bg-slate-100 rounded-xl overflow-hidden border border-slate-200 shadow-xs",children:[c.jsx("video",{src:Zi(G),controls:!0,className:"w-full aspect-square object-cover"}),c.jsxs("div",{className:"absolute bottom-0 inset-x-0 bg-slate-900/80 px-2 py-1 text-[10px] text-white font-medium text-center truncate",children:["参考视频 ",Ee+1]})]},Ee))]})]}),c.jsxs("div",{className:"flex flex-col gap-3 pt-2 pb-12",children:[c.jsxs("div",{className:"border border-slate-200 rounded-xl overflow-hidden bg-slate-50/60",children:[c.jsxs("button",{onClick:()=>De(!F),className:"w-full px-4 py-3 text-left text-xs font-mono text-slate-600 hover:text-slate-900 hover:bg-slate-100 flex items-center justify-between cursor-pointer",children:[c.jsx("span",{children:"用户提交的原始请求参数 (JSON)"}),c.jsx("span",{className:"text-[11px] text-slate-400",children:F?"收起":"展开"})]}),F&&c.jsx("pre",{className:"p-4 text-[11px] font-mono text-slate-700 overflow-x-auto border-t border-slate-200 bg-white leading-relaxed",children:JSON.stringify(R,null,2)})]}),T.comfy_prompt_id&&c.jsxs("div",{className:"border border-slate-200 rounded-xl overflow-hidden bg-slate-50/60",children:[c.jsxs("button",{onClick:w,className:"w-full px-4 py-3 text-left text-xs font-mono text-slate-600 hover:text-slate-900 hover:bg-slate-100 flex items-center justify-between cursor-pointer",children:[c.jsx("span",{children:"ComfyUI 执行图谱与日志 (History)"}),c.jsx("span",{className:"text-[11px] text-slate-400",children:le?"收起":"展开"})]}),le&&c.jsx("pre",{className:"p-4 text-[11px] font-mono text-slate-700 overflow-x-auto border-t border-slate-200 bg-white leading-relaxed max-h-96",children:j?"正在拉取 ComfyUI History…":D?JSON.stringify(D,null,2):"无可用数据"})]})]}),c.jsx(ph,{isOpen:ve.isOpen,title:ve.title,content:ve.content,isDanger:ve.isDanger,onConfirm:ve.onConfirm,onCancel:()=>Re(G=>({...G,isOpen:!1}))})]})}function Em(){if(typeof window>"u")return null;let o=window.location.pathname;const p=ul();p&&o.startsWith(p)&&(o=o.slice(p.length));const O=o.match(/^\/task\.html\/(.+)$/);return O?decodeURIComponent(O[1]):null}function By(){const{addToast:o}=Ji(),[p,O]=H.useState(()=>Em()),[r,T]=H.useState(null),[M,$]=H.useState(null);H.useEffect(()=>{const j=()=>{const X=Em();O(X)};return window.addEventListener("popstate",j),()=>window.removeEventListener("popstate",j)},[]);const q=async()=>{const j=await My();j&&$(j)};H.useEffect(()=>{q();const j=setInterval(q,6e3);return()=>clearInterval(j)},[]);const k=j=>{O(j);const X=ul();window.history.pushState(null,"",`${X}/task.html/${encodeURIComponent(j)}`)},I=()=>{O(null),T(null);const j=ul();window.history.pushState(null,"",`${j}/newtask.html`)},D=j=>{O(null),T(j.req||{});const X=ul();window.history.pushState(null,"",`${X}/newtask.html`),o("已将历史任务参数灌入表单,可直接微调或提交","info")},S=()=>{const j=Ki(),X=window.prompt("设置 H3 访问令牌 (Access Token),留空清除:",j);X!==null&&(Qf(X),o(X?"令牌已保存":"令牌已清除","info"))};return c.jsxs("div",{className:"flex h-screen w-screen overflow-hidden bg-slate-50 text-slate-800 font-sans",children:[c.jsx(wy,{selectedId:p,onSelectTask:k,onCreateTask:I,onRerunTask:D,backendInfo:M,onRefreshBackends:q,onManageToken:S}),c.jsx("main",{className:"flex-1 h-full overflow-y-auto relative flex flex-col bg-white",children:c.jsx("div",{className:"flex-1 w-full",children:p?c.jsx(qy,{taskId:p,onBack:I,onRerun:D}):c.jsx(Hy,{initialValues:r,onCreated:k})})})]})}function Yy(){return c.jsx(Cy,{children:c.jsx(By,{})})}Ox.createRoot(document.getElementById("root")).render(c.jsx(px.StrictMode,{children:c.jsx(Yy,{})}));</script> | |
| 307 | + <style rel="stylesheet" crossorigin>/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-950:oklch(27.9% .077 45.635);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-600:oklch(60% .118 184.704);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-600:oklch(54.6% .245 262.881);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.inset-x-0{inset-inline:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.right-0{right:0}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-full{bottom:100%}.left-1\.5{left:calc(var(--spacing) * 1.5)}.left-3{left:calc(var(--spacing) * 3)}.z-10{z-index:10}.z-30{z-index:30}.z-50{z-index:50}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-2{margin-left:calc(var(--spacing) * 2)}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.flex{display:flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-32{height:calc(var(--spacing) * 32)}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[560px\]{max-height:560px}.min-h-\[120px\]{min-height:120px}.min-h-\[360px\]{min-height:360px}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.border-indigo-200{border-color:var(--color-indigo-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-500\/30{border-color:#ff23574d}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/30{border-color:color-mix(in oklab,var(--color-rose-500) 30%,transparent)}}.border-rose-500\/40{border-color:#ff235766}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/40{border-color:color-mix(in oklab,var(--color-rose-500) 40%,transparent)}}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-200\/60{border-color:#e2e8f099}@supports (color:color-mix(in lab,red,red)){.border-slate-200\/60{border-color:color-mix(in oklab,var(--color-slate-200) 60%,transparent)}}.border-slate-200\/90{border-color:#e2e8f0e6}@supports (color:color-mix(in lab,red,red)){.border-slate-200\/90{border-color:color-mix(in oklab,var(--color-slate-200) 90%,transparent)}}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-800{border-color:var(--color-slate-800)}.border-zinc-700\/60{border-color:#3f3f4699}@supports (color:color-mix(in lab,red,red)){.border-zinc-700\/60{border-color:color-mix(in oklab,var(--color-zinc-700) 60%,transparent)}}.border-zinc-800{border-color:var(--color-zinc-800)}.border-zinc-800\/80{border-color:#27272acc}@supports (color:color-mix(in lab,red,red)){.border-zinc-800\/80{border-color:color-mix(in oklab,var(--color-zinc-800) 80%,transparent)}}.border-t-transparent{border-top-color:#0000}.bg-amber-50{background-color:var(--color-amber-50)}.bg-black{background-color:var(--color-black)}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-blue-600\/90{background-color:#155dfce6}@supports (color:color-mix(in lab,red,red)){.bg-blue-600\/90{background-color:color-mix(in oklab,var(--color-blue-600) 90%,transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/80{background-color:#ecfdf5cc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-50\/80{background-color:color-mix(in oklab,var(--color-emerald-50) 80%,transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-emerald-600\/90{background-color:#009767e6}@supports (color:color-mix(in lab,red,red)){.bg-emerald-600\/90{background-color:color-mix(in oklab,var(--color-emerald-600) 90%,transparent)}}.bg-emerald-950\/20{background-color:#002c2233}@supports (color:color-mix(in lab,red,red)){.bg-emerald-950\/20{background-color:color-mix(in oklab,var(--color-emerald-950) 20%,transparent)}}.bg-emerald-950\/60{background-color:#002c2299}@supports (color:color-mix(in lab,red,red)){.bg-emerald-950\/60{background-color:color-mix(in oklab,var(--color-emerald-950) 60%,transparent)}}.bg-emerald-950\/90{background-color:#002c22e6}@supports (color:color-mix(in lab,red,red)){.bg-emerald-950\/90{background-color:color-mix(in oklab,var(--color-emerald-950) 90%,transparent)}}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/10{background-color:color-mix(in oklab,var(--color-rose-500) 10%,transparent)}}.bg-rose-600{background-color:var(--color-rose-600)}.bg-rose-950\/40{background-color:#4d021866}@supports (color:color-mix(in lab,red,red)){.bg-rose-950\/40{background-color:color-mix(in oklab,var(--color-rose-950) 40%,transparent)}}.bg-rose-950\/80{background-color:#4d0218cc}@supports (color:color-mix(in lab,red,red)){.bg-rose-950\/80{background-color:color-mix(in oklab,var(--color-rose-950) 80%,transparent)}}.bg-rose-950\/90{background-color:#4d0218e6}@supports (color:color-mix(in lab,red,red)){.bg-rose-950\/90{background-color:color-mix(in oklab,var(--color-rose-950) 90%,transparent)}}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/40{background-color:#f8fafc66}@supports (color:color-mix(in lab,red,red)){.bg-slate-50\/40{background-color:color-mix(in oklab,var(--color-slate-50) 40%,transparent)}}.bg-slate-50\/60{background-color:#f8fafc99}@supports (color:color-mix(in lab,red,red)){.bg-slate-50\/60{background-color:color-mix(in oklab,var(--color-slate-50) 60%,transparent)}}.bg-slate-50\/80{background-color:#f8fafccc}@supports (color:color-mix(in lab,red,red)){.bg-slate-50\/80{background-color:color-mix(in oklab,var(--color-slate-50) 80%,transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-100\/70{background-color:#f1f5f9b3}@supports (color:color-mix(in lab,red,red)){.bg-slate-100\/70{background-color:color-mix(in oklab,var(--color-slate-100) 70%,transparent)}}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-800\/90{background-color:#1d293de6}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/90{background-color:color-mix(in oklab,var(--color-slate-800) 90%,transparent)}}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/80{background-color:color-mix(in oklab,var(--color-slate-900) 80%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.bg-white\/90{background-color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-900\/60{background-color:#18181b99}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/60{background-color:color-mix(in oklab,var(--color-zinc-900) 60%,transparent)}}.bg-zinc-900\/90{background-color:#18181be6}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/90{background-color:color-mix(in oklab,var(--color-zinc-900) 90%,transparent)}}.bg-zinc-900\/95{background-color:#18181bf2}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/95{background-color:color-mix(in oklab,var(--color-zinc-900) 95%,transparent)}}.bg-zinc-950\/60{background-color:#09090b99}@supports (color:color-mix(in lab,red,red)){.bg-zinc-950\/60{background-color:color-mix(in oklab,var(--color-zinc-950) 60%,transparent)}}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-emerald-500{--tw-gradient-from:var(--color-emerald-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-400{--tw-gradient-to:var(--color-teal-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-12{padding:calc(var(--spacing) * 12)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-7{padding-inline:calc(var(--spacing) * 7)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-amber-800{color:var(--color-amber-800)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-emerald-100{color:var(--color-emerald-100)}.text-emerald-200{color:var(--color-emerald-200)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-indigo-400{color:var(--color-indigo-400)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-rose-200{color:var(--color-rose-200)}.text-rose-200\/90{color:#ffccd3e6}@supports (color:color-mix(in lab,red,red)){.text-rose-200\/90{color:color-mix(in oklab,var(--color-rose-200) 90%,transparent)}}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-rose-500{color:var(--color-rose-500)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-teal-600{color:var(--color-teal-600)}.text-white{color:var(--color-white)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.uppercase{text-transform:uppercase}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-slate-400::placeholder{color:var(--color-slate-400)}.placeholder-zinc-500::placeholder{color:var(--color-zinc-500)}.opacity-40{opacity:.4}.opacity-70{opacity:.7}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-black\/60{--tw-shadow-color:#0009}@supports (color:color-mix(in lab,red,red)){.shadow-black\/60{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 60%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-emerald-500\/50{--tw-shadow-color:#00bb7f80}@supports (color:color-mix(in lab,red,red)){.shadow-emerald-500\/50{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-emerald-500) 50%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-emerald-600\/30{--tw-shadow-color:#0097674d}@supports (color:color-mix(in lab,red,red)){.shadow-emerald-600\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-emerald-600) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-emerald-950\/50{--tw-shadow-color:#002c2280}@supports (color:color-mix(in lab,red,red)){.shadow-emerald-950\/50{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-emerald-950) 50%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-rose-950\/50{--tw-shadow-color:#4d021880}@supports (color:color-mix(in lab,red,red)){.shadow-rose-950\/50{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-rose-950) 50%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-emerald-500\/40{--tw-ring-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.ring-emerald-500\/40{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:text-slate-900:is(:where(.group):hover *){color:var(--color-slate-900)}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:border-zinc-700:hover{border-color:var(--color-zinc-700)}.hover\:bg-black\/90:hover{background-color:#000000e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/90:hover{background-color:color-mix(in oklab,var(--color-black) 90%,transparent)}}.hover\:bg-emerald-100:hover{background-color:var(--color-emerald-100)}.hover\:bg-emerald-500:hover{background-color:var(--color-emerald-500)}.hover\:bg-emerald-700:hover{background-color:var(--color-emerald-700)}.hover\:bg-indigo-100:hover{background-color:var(--color-indigo-100)}.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-rose-500:hover{background-color:var(--color-rose-500)}.hover\:bg-rose-600:hover{background-color:var(--color-rose-600)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-50\/80:hover{background-color:#f8fafccc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-50\/80:hover{background-color:color-mix(in oklab,var(--color-slate-50) 80%,transparent)}}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/80:hover{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/80:hover{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.hover\:bg-zinc-700\/80:hover{background-color:#3f3f46cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-700\/80:hover{background-color:color-mix(in oklab,var(--color-zinc-700) 80%,transparent)}}.hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.hover\:text-amber-700:hover{color:var(--color-amber-700)}.hover\:text-emerald-600:hover{color:var(--color-emerald-600)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-300:hover{color:var(--color-zinc-300)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-emerald-500:focus{border-color:var(--color-emerald-500)}.focus\:border-emerald-500\/60:focus{border-color:#00bb7f99}@supports (color:color-mix(in lab,red,red)){.focus\:border-emerald-500\/60:focus{border-color:color-mix(in oklab,var(--color-emerald-500) 60%,transparent)}}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-emerald-500\/20:focus{--tw-ring-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.focus\:ring-emerald-500\/20:focus{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 20%, transparent)}}.focus\:ring-emerald-500\/40:focus{--tw-ring-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.focus\:ring-emerald-500\/40:focus{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:w-auto{width:auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}}@media(min-width:48rem){.md\:w-\[390px\]{width:390px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media(min-width:64rem){.lg\:w-\[420px\]{width:420px}}@media(prefers-color-scheme:dark){.dark\:border-amber-600\/30{border-color:#dd74004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-600\/30{border-color:color-mix(in oklab,var(--color-amber-600) 30%,transparent)}}.dark\:border-rose-500\/40{border-color:#ff235766}@supports (color:color-mix(in lab,red,red)){.dark\:border-rose-500\/40{border-color:color-mix(in oklab,var(--color-rose-500) 40%,transparent)}}.dark\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:border-zinc-800\/80{border-color:#27272acc}@supports (color:color-mix(in lab,red,red)){.dark\:border-zinc-800\/80{border-color:color-mix(in oklab,var(--color-zinc-800) 80%,transparent)}}.dark\:bg-amber-950\/30{background-color:#4619014d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/30{background-color:color-mix(in oklab,var(--color-amber-950) 30%,transparent)}}.dark\:bg-rose-950\/60{background-color:#4d021899}@supports (color:color-mix(in lab,red,red)){.dark\:bg-rose-950\/60{background-color:color-mix(in oklab,var(--color-rose-950) 60%,transparent)}}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950\/50{background-color:#09090b80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-zinc-950\/50{background-color:color-mix(in oklab,var(--color-zinc-950) 50%,transparent)}}.dark\:bg-zinc-950\/70{background-color:#09090bb3}@supports (color:color-mix(in lab,red,red)){.dark\:bg-zinc-950\/70{background-color:color-mix(in oklab,var(--color-zinc-950) 70%,transparent)}}.dark\:bg-zinc-950\/80{background-color:#09090bcc}@supports (color:color-mix(in lab,red,red)){.dark\:bg-zinc-950\/80{background-color:color-mix(in oklab,var(--color-zinc-950) 80%,transparent)}}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-emerald-400{color:var(--color-emerald-400)}.dark\:text-rose-300{color:var(--color-rose-300)}.dark\:text-white{color:var(--color-white)}.dark\:text-zinc-100{color:var(--color-zinc-100)}.dark\:text-zinc-200{color:var(--color-zinc-200)}.dark\:text-zinc-300{color:var(--color-zinc-300)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-500,.dark\:placeholder-zinc-500::placeholder{color:var(--color-zinc-500)}@media(hover:hover){.dark\:hover\:bg-zinc-700:hover{background-color:var(--color-zinc-700)}.dark\:hover\:bg-zinc-800\/60:hover{background-color:#27272a99}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-zinc-800\/60:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 60%,transparent)}}.dark\:hover\:text-zinc-200:hover{color:var(--color-zinc-200)}}}}:root{--bg-app:#f8fafc;--bg-surface:#fff;--bg-subtle:#f1f5f9;--border-color:#e2e8f0;--text-main:#0f172a;--text-muted:#64748b;--primary:#059669}.dark{--bg-app:#090a0f;--bg-surface:#13151c;--bg-subtle:#1c1f2b;--border-color:#272c3d;--text-main:#f8fafc;--text-muted:#94a3b8;--primary:#10b981}body{background-color:var(--bg-app);color:var(--text-main);height:100vh;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,sans-serif;overflow:hidden}.theme-surface{background-color:var(--bg-surface);border-color:var(--border-color);color:var(--text-main)}.theme-subtle{background-color:var(--bg-subtle);border-color:var(--border-color);color:var(--text-main)}.theme-border{border-color:var(--border-color)}.theme-text-muted{color:var(--text-muted)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}</style> | |
| 308 | + </head> | |
| 309 | + <body class="bg-slate-50 text-slate-800 antialiased overflow-hidden"> | |
| 310 | + <div id="root"></div> | |
| 311 | + </body> | |
| 1273 | 312 | </html> | ... | ... |