SPB Git forge
2commits 1branches 0releases
492.0 KBsize
maindefault branch
1 h agolast push
TypeScript 96.1% CSS 3.1% JavaScript 0.8%

adopt: état déployé sur M2U64 adopté comme source de vérité (remote-first, 2026-10-02)

mld committed 1 h ago (Oct 2, 2026)

43 changed files +8,632 −0

added .gitignore +41 −0
@@ -0,0 +1,41 @@
1 +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 +
3 +# dependencies
4 +/node_modules
5 +/.pnp
6 +.pnp.*
7 +.yarn/*
8 +!.yarn/patches
9 +!.yarn/plugins
10 +!.yarn/releases
11 +!.yarn/versions
12 +
13 +# testing
14 +/coverage
15 +
16 +# next.js
17 +/.next/
18 +/out/
19 +
20 +# production
21 +/build
22 +
23 +# misc
24 +.DS_Store
25 +*.pem
26 +
27 +# debug
28 +npm-debug.log*
29 +yarn-debug.log*
30 +yarn-error.log*
31 +.pnpm-debug.log*
32 +
33 +# env files (can opt-in for committing if needed)
34 +.env*
35 +
36 +# vercel
37 +.vercel
38 +
39 +# typescript
40 +*.tsbuildinfo
41 +next-env.d.ts
added AGENTS.md +5 −0
@@ -0,0 +1,5 @@
1 +<!-- BEGIN:nextjs-agent-rules -->
2 +# This is NOT the Next.js you know
3 +
4 +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
5 +<!-- END:nextjs-agent-rules -->
added CLAUDE.md +1 −0
@@ -0,0 +1 @@
1 +@AGENTS.md
added README.md +36 −0
@@ -0,0 +1,36 @@
1 +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2 +
3 +## Getting Started
4 +
5 +First, run the development server:
6 +
7 +```bash
8 +npm run dev
9 +# or
10 +yarn dev
11 +# or
12 +pnpm dev
13 +# or
14 +bun dev
15 +```
16 +
17 +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18 +
19 +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20 +
21 +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22 +
23 +## Learn More
24 +
25 +To learn more about Next.js, take a look at the following resources:
26 +
27 +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28 +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29 +
30 +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31 +
32 +## Deploy on Vercel
33 +
34 +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35 +
36 +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
added eslint.config.mjs +18 −0
@@ -0,0 +1,18 @@
1 +import { defineConfig, globalIgnores } from "eslint/config";
2 +import nextVitals from "eslint-config-next/core-web-vitals";
3 +import nextTs from "eslint-config-next/typescript";
4 +
5 +const eslintConfig = defineConfig([
6 + ...nextVitals,
7 + ...nextTs,
8 + // Override default ignores of eslint-config-next.
9 + globalIgnores([
10 + // Default ignores of eslint-config-next:
11 + ".next/**",
12 + "out/**",
13 + "build/**",
14 + "next-env.d.ts",
15 + ]),
16 +]);
17 +
18 +export default eslintConfig;
added next.config.ts +7 −0
@@ -0,0 +1,7 @@
1 +import type { NextConfig } from "next";
2 +
3 +const nextConfig: NextConfig = {
4 + serverExternalPackages: ["ssh2"],
5 +};
6 +
7 +export default nextConfig;
added package-lock.json +6799 −0
@@ -0,0 +1,6799 @@
1 +{
2 + "name": "maclustr-web",
3 + "version": "0.1.0",
4 + "lockfileVersion": 3,
5 + "requires": true,
6 + "packages": {
7 + "": {
8 + "name": "maclustr-web",
9 + "version": "0.1.0",
10 + "dependencies": {
11 + "next": "16.2.4",
12 + "react": "19.2.4",
13 + "react-dom": "19.2.4",
14 + "ssh2": "^1.17.0"
15 + },
16 + "devDependencies": {
17 + "@tailwindcss/postcss": "^4",
18 + "@types/node": "^20",
19 + "@types/react": "^19",
20 + "@types/react-dom": "^19",
21 + "@types/ssh2": "^1.15.5",
22 + "eslint": "^9",
23 + "eslint-config-next": "16.2.4",
24 + "tailwindcss": "^4",
25 + "typescript": "^5"
26 + }
27 + },
28 + "node_modules/@alloc/quick-lru": {
29 + "version": "5.2.0",
30 + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
31 + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
32 + "dev": true,
33 + "license": "MIT",
34 + "engines": {
35 + "node": ">=10"
36 + },
37 + "funding": {
38 + "url": "https://github.com/sponsors/sindresorhus"
39 + }
40 + },
41 + "node_modules/@babel/code-frame": {
42 + "version": "7.29.0",
43 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
44 + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
45 + "dev": true,
46 + "license": "MIT",
47 + "dependencies": {
48 + "@babel/helper-validator-identifier": "^7.28.5",
49 + "js-tokens": "^4.0.0",
50 + "picocolors": "^1.1.1"
51 + },
52 + "engines": {
53 + "node": ">=6.9.0"
54 + }
55 + },
56 + "node_modules/@babel/compat-data": {
57 + "version": "7.29.0",
58 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
59 + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
60 + "dev": true,
61 + "license": "MIT",
62 + "engines": {
63 + "node": ">=6.9.0"
64 + }
65 + },
66 + "node_modules/@babel/core": {
67 + "version": "7.29.0",
68 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
69 + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
70 + "dev": true,
71 + "license": "MIT",
72 + "dependencies": {
73 + "@babel/code-frame": "^7.29.0",
74 + "@babel/generator": "^7.29.0",
75 + "@babel/helper-compilation-targets": "^7.28.6",
76 + "@babel/helper-module-transforms": "^7.28.6",
77 + "@babel/helpers": "^7.28.6",
78 + "@babel/parser": "^7.29.0",
79 + "@babel/template": "^7.28.6",
80 + "@babel/traverse": "^7.29.0",
81 + "@babel/types": "^7.29.0",
82 + "@jridgewell/remapping": "^2.3.5",
83 + "convert-source-map": "^2.0.0",
84 + "debug": "^4.1.0",
85 + "gensync": "^1.0.0-beta.2",
86 + "json5": "^2.2.3",
87 + "semver": "^6.3.1"
88 + },
89 + "engines": {
90 + "node": ">=6.9.0"
91 + },
92 + "funding": {
93 + "type": "opencollective",
94 + "url": "https://opencollective.com/babel"
95 + }
96 + },
97 + "node_modules/@babel/generator": {
98 + "version": "7.29.1",
99 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
100 + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
101 + "dev": true,
102 + "license": "MIT",
103 + "dependencies": {
104 + "@babel/parser": "^7.29.0",
105 + "@babel/types": "^7.29.0",
106 + "@jridgewell/gen-mapping": "^0.3.12",
107 + "@jridgewell/trace-mapping": "^0.3.28",
108 + "jsesc": "^3.0.2"
109 + },
110 + "engines": {
111 + "node": ">=6.9.0"
112 + }
113 + },
114 + "node_modules/@babel/helper-compilation-targets": {
115 + "version": "7.28.6",
116 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
117 + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
118 + "dev": true,
119 + "license": "MIT",
120 + "dependencies": {
121 + "@babel/compat-data": "^7.28.6",
122 + "@babel/helper-validator-option": "^7.27.1",
123 + "browserslist": "^4.24.0",
124 + "lru-cache": "^5.1.1",
125 + "semver": "^6.3.1"
126 + },
127 + "engines": {
128 + "node": ">=6.9.0"
129 + }
130 + },
131 + "node_modules/@babel/helper-globals": {
132 + "version": "7.28.0",
133 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
134 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
135 + "dev": true,
136 + "license": "MIT",
137 + "engines": {
138 + "node": ">=6.9.0"
139 + }
140 + },
141 + "node_modules/@babel/helper-module-imports": {
142 + "version": "7.28.6",
143 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
144 + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
145 + "dev": true,
146 + "license": "MIT",
147 + "dependencies": {
148 + "@babel/traverse": "^7.28.6",
149 + "@babel/types": "^7.28.6"
150 + },
151 + "engines": {
152 + "node": ">=6.9.0"
153 + }
154 + },
155 + "node_modules/@babel/helper-module-transforms": {
156 + "version": "7.28.6",
157 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
158 + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
159 + "dev": true,
160 + "license": "MIT",
161 + "dependencies": {
162 + "@babel/helper-module-imports": "^7.28.6",
163 + "@babel/helper-validator-identifier": "^7.28.5",
164 + "@babel/traverse": "^7.28.6"
165 + },
166 + "engines": {
167 + "node": ">=6.9.0"
168 + },
169 + "peerDependencies": {
170 + "@babel/core": "^7.0.0"
171 + }
172 + },
173 + "node_modules/@babel/helper-string-parser": {
174 + "version": "7.27.1",
175 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
176 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
177 + "dev": true,
178 + "license": "MIT",
179 + "engines": {
180 + "node": ">=6.9.0"
181 + }
182 + },
183 + "node_modules/@babel/helper-validator-identifier": {
184 + "version": "7.28.5",
185 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
186 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
187 + "dev": true,
188 + "license": "MIT",
189 + "engines": {
190 + "node": ">=6.9.0"
191 + }
192 + },
193 + "node_modules/@babel/helper-validator-option": {
194 + "version": "7.27.1",
195 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
196 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
197 + "dev": true,
198 + "license": "MIT",
199 + "engines": {
200 + "node": ">=6.9.0"
201 + }
202 + },
203 + "node_modules/@babel/helpers": {
204 + "version": "7.29.2",
205 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
206 + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
207 + "dev": true,
208 + "license": "MIT",
209 + "dependencies": {
210 + "@babel/template": "^7.28.6",
211 + "@babel/types": "^7.29.0"
212 + },
213 + "engines": {
214 + "node": ">=6.9.0"
215 + }
216 + },
217 + "node_modules/@babel/parser": {
218 + "version": "7.29.2",
219 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
220 + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
221 + "dev": true,
222 + "license": "MIT",
223 + "dependencies": {
224 + "@babel/types": "^7.29.0"
225 + },
226 + "bin": {
227 + "parser": "bin/babel-parser.js"
228 + },
229 + "engines": {
230 + "node": ">=6.0.0"
231 + }
232 + },
233 + "node_modules/@babel/template": {
234 + "version": "7.28.6",
235 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
236 + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
237 + "dev": true,
238 + "license": "MIT",
239 + "dependencies": {
240 + "@babel/code-frame": "^7.28.6",
241 + "@babel/parser": "^7.28.6",
242 + "@babel/types": "^7.28.6"
243 + },
244 + "engines": {
245 + "node": ">=6.9.0"
246 + }
247 + },
248 + "node_modules/@babel/traverse": {
249 + "version": "7.29.0",
250 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
251 + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
252 + "dev": true,
253 + "license": "MIT",
254 + "dependencies": {
255 + "@babel/code-frame": "^7.29.0",
256 + "@babel/generator": "^7.29.0",
257 + "@babel/helper-globals": "^7.28.0",
258 + "@babel/parser": "^7.29.0",
259 + "@babel/template": "^7.28.6",
260 + "@babel/types": "^7.29.0",
261 + "debug": "^4.3.1"
262 + },
263 + "engines": {
264 + "node": ">=6.9.0"
265 + }
266 + },
267 + "node_modules/@babel/types": {
268 + "version": "7.29.0",
269 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
270 + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
271 + "dev": true,
272 + "license": "MIT",
273 + "dependencies": {
274 + "@babel/helper-string-parser": "^7.27.1",
275 + "@babel/helper-validator-identifier": "^7.28.5"
276 + },
277 + "engines": {
278 + "node": ">=6.9.0"
279 + }
280 + },
281 + "node_modules/@emnapi/core": {
282 + "version": "1.10.0",
283 + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
284 + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
285 + "dev": true,
286 + "license": "MIT",
287 + "optional": true,
288 + "dependencies": {
289 + "@emnapi/wasi-threads": "1.2.1",
290 + "tslib": "^2.4.0"
291 + }
292 + },
293 + "node_modules/@emnapi/runtime": {
294 + "version": "1.10.0",
295 + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
296 + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
297 + "license": "MIT",
298 + "optional": true,
299 + "dependencies": {
300 + "tslib": "^2.4.0"
301 + }
302 + },
303 + "node_modules/@emnapi/wasi-threads": {
304 + "version": "1.2.1",
305 + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
306 + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
307 + "dev": true,
308 + "license": "MIT",
309 + "optional": true,
310 + "dependencies": {
311 + "tslib": "^2.4.0"
312 + }
313 + },
314 + "node_modules/@eslint-community/eslint-utils": {
315 + "version": "4.9.1",
316 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
317 + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
318 + "dev": true,
319 + "license": "MIT",
320 + "dependencies": {
321 + "eslint-visitor-keys": "^3.4.3"
322 + },
323 + "engines": {
324 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
325 + },
326 + "funding": {
327 + "url": "https://opencollective.com/eslint"
328 + },
329 + "peerDependencies": {
330 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
331 + }
332 + },
333 + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
334 + "version": "3.4.3",
335 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
336 + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
337 + "dev": true,
338 + "license": "Apache-2.0",
339 + "engines": {
340 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
341 + },
342 + "funding": {
343 + "url": "https://opencollective.com/eslint"
344 + }
345 + },
346 + "node_modules/@eslint-community/regexpp": {
347 + "version": "4.12.2",
348 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
349 + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
350 + "dev": true,
351 + "license": "MIT",
352 + "engines": {
353 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
354 + }
355 + },
356 + "node_modules/@eslint/config-array": {
357 + "version": "0.21.2",
358 + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
359 + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
360 + "dev": true,
361 + "license": "Apache-2.0",
362 + "dependencies": {
363 + "@eslint/object-schema": "^2.1.7",
364 + "debug": "^4.3.1",
365 + "minimatch": "^3.1.5"
366 + },
367 + "engines": {
368 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
369 + }
370 + },
371 + "node_modules/@eslint/config-helpers": {
372 + "version": "0.4.2",
373 + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
374 + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
375 + "dev": true,
376 + "license": "Apache-2.0",
377 + "dependencies": {
378 + "@eslint/core": "^0.17.0"
379 + },
380 + "engines": {
381 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
382 + }
383 + },
384 + "node_modules/@eslint/core": {
385 + "version": "0.17.0",
386 + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
387 + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
388 + "dev": true,
389 + "license": "Apache-2.0",
390 + "dependencies": {
391 + "@types/json-schema": "^7.0.15"
392 + },
393 + "engines": {
394 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
395 + }
396 + },
397 + "node_modules/@eslint/eslintrc": {
398 + "version": "3.3.5",
399 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
400 + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
401 + "dev": true,
402 + "license": "MIT",
403 + "dependencies": {
404 + "ajv": "^6.14.0",
405 + "debug": "^4.3.2",
406 + "espree": "^10.0.1",
407 + "globals": "^14.0.0",
408 + "ignore": "^5.2.0",
409 + "import-fresh": "^3.2.1",
410 + "js-yaml": "^4.1.1",
411 + "minimatch": "^3.1.5",
412 + "strip-json-comments": "^3.1.1"
413 + },
414 + "engines": {
415 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
416 + },
417 + "funding": {
418 + "url": "https://opencollective.com/eslint"
419 + }
420 + },
421 + "node_modules/@eslint/js": {
422 + "version": "9.39.4",
423 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
424 + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
425 + "dev": true,
426 + "license": "MIT",
427 + "engines": {
428 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
429 + },
430 + "funding": {
431 + "url": "https://eslint.org/donate"
432 + }
433 + },
434 + "node_modules/@eslint/object-schema": {
435 + "version": "2.1.7",
436 + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
437 + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
438 + "dev": true,
439 + "license": "Apache-2.0",
440 + "engines": {
441 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
442 + }
443 + },
444 + "node_modules/@eslint/plugin-kit": {
445 + "version": "0.4.1",
446 + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
447 + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
448 + "dev": true,
449 + "license": "Apache-2.0",
450 + "dependencies": {
451 + "@eslint/core": "^0.17.0",
452 + "levn": "^0.4.1"
453 + },
454 + "engines": {
455 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
456 + }
457 + },
458 + "node_modules/@humanfs/core": {
459 + "version": "0.19.2",
460 + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
461 + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
462 + "dev": true,
463 + "license": "Apache-2.0",
464 + "dependencies": {
465 + "@humanfs/types": "^0.15.0"
466 + },
467 + "engines": {
468 + "node": ">=18.18.0"
469 + }
470 + },
471 + "node_modules/@humanfs/node": {
472 + "version": "0.16.8",
473 + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
474 + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
475 + "dev": true,
476 + "license": "Apache-2.0",
477 + "dependencies": {
478 + "@humanfs/core": "^0.19.2",
479 + "@humanfs/types": "^0.15.0",
480 + "@humanwhocodes/retry": "^0.4.0"
481 + },
482 + "engines": {
483 + "node": ">=18.18.0"
484 + }
485 + },
486 + "node_modules/@humanfs/types": {
487 + "version": "0.15.0",
488 + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
489 + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
490 + "dev": true,
491 + "license": "Apache-2.0",
492 + "engines": {
493 + "node": ">=18.18.0"
494 + }
495 + },
496 + "node_modules/@humanwhocodes/module-importer": {
497 + "version": "1.0.1",
498 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
499 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
500 + "dev": true,
501 + "license": "Apache-2.0",
502 + "engines": {
503 + "node": ">=12.22"
504 + },
505 + "funding": {
506 + "type": "github",
507 + "url": "https://github.com/sponsors/nzakas"
508 + }
509 + },
510 + "node_modules/@humanwhocodes/retry": {
511 + "version": "0.4.3",
512 + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
513 + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
514 + "dev": true,
515 + "license": "Apache-2.0",
516 + "engines": {
517 + "node": ">=18.18"
518 + },
519 + "funding": {
520 + "type": "github",
521 + "url": "https://github.com/sponsors/nzakas"
522 + }
523 + },
524 + "node_modules/@img/colour": {
525 + "version": "1.1.0",
526 + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
527 + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
528 + "license": "MIT",
529 + "optional": true,
530 + "engines": {
531 + "node": ">=18"
532 + }
533 + },
534 + "node_modules/@img/sharp-darwin-arm64": {
535 + "version": "0.34.5",
536 + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
537 + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
538 + "cpu": [
539 + "arm64"
540 + ],
541 + "license": "Apache-2.0",
542 + "optional": true,
543 + "os": [
544 + "darwin"
545 + ],
546 + "engines": {
547 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
548 + },
549 + "funding": {
550 + "url": "https://opencollective.com/libvips"
551 + },
552 + "optionalDependencies": {
553 + "@img/sharp-libvips-darwin-arm64": "1.2.4"
554 + }
555 + },
556 + "node_modules/@img/sharp-darwin-x64": {
557 + "version": "0.34.5",
558 + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
559 + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
560 + "cpu": [
561 + "x64"
562 + ],
563 + "license": "Apache-2.0",
564 + "optional": true,
565 + "os": [
566 + "darwin"
567 + ],
568 + "engines": {
569 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
570 + },
571 + "funding": {
572 + "url": "https://opencollective.com/libvips"
573 + },
574 + "optionalDependencies": {
575 + "@img/sharp-libvips-darwin-x64": "1.2.4"
576 + }
577 + },
578 + "node_modules/@img/sharp-libvips-darwin-arm64": {
579 + "version": "1.2.4",
580 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
581 + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
582 + "cpu": [
583 + "arm64"
584 + ],
585 + "license": "LGPL-3.0-or-later",
586 + "optional": true,
587 + "os": [
588 + "darwin"
589 + ],
590 + "funding": {
591 + "url": "https://opencollective.com/libvips"
592 + }
593 + },
594 + "node_modules/@img/sharp-libvips-darwin-x64": {
595 + "version": "1.2.4",
596 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
597 + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
598 + "cpu": [
599 + "x64"
600 + ],
601 + "license": "LGPL-3.0-or-later",
602 + "optional": true,
603 + "os": [
604 + "darwin"
605 + ],
606 + "funding": {
607 + "url": "https://opencollective.com/libvips"
608 + }
609 + },
610 + "node_modules/@img/sharp-libvips-linux-arm": {
611 + "version": "1.2.4",
612 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
613 + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
614 + "cpu": [
615 + "arm"
616 + ],
617 + "libc": [
618 + "glibc"
619 + ],
620 + "license": "LGPL-3.0-or-later",
621 + "optional": true,
622 + "os": [
623 + "linux"
624 + ],
625 + "funding": {
626 + "url": "https://opencollective.com/libvips"
627 + }
628 + },
629 + "node_modules/@img/sharp-libvips-linux-arm64": {
630 + "version": "1.2.4",
631 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
632 + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
633 + "cpu": [
634 + "arm64"
635 + ],
636 + "libc": [
637 + "glibc"
638 + ],
639 + "license": "LGPL-3.0-or-later",
640 + "optional": true,
641 + "os": [
642 + "linux"
643 + ],
644 + "funding": {
645 + "url": "https://opencollective.com/libvips"
646 + }
647 + },
648 + "node_modules/@img/sharp-libvips-linux-ppc64": {
649 + "version": "1.2.4",
650 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
651 + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
652 + "cpu": [
653 + "ppc64"
654 + ],
655 + "libc": [
656 + "glibc"
657 + ],
658 + "license": "LGPL-3.0-or-later",
659 + "optional": true,
660 + "os": [
661 + "linux"
662 + ],
663 + "funding": {
664 + "url": "https://opencollective.com/libvips"
665 + }
666 + },
667 + "node_modules/@img/sharp-libvips-linux-riscv64": {
668 + "version": "1.2.4",
669 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
670 + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
671 + "cpu": [
672 + "riscv64"
673 + ],
674 + "libc": [
675 + "glibc"
676 + ],
677 + "license": "LGPL-3.0-or-later",
678 + "optional": true,
679 + "os": [
680 + "linux"
681 + ],
682 + "funding": {
683 + "url": "https://opencollective.com/libvips"
684 + }
685 + },
686 + "node_modules/@img/sharp-libvips-linux-s390x": {
687 + "version": "1.2.4",
688 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
689 + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
690 + "cpu": [
691 + "s390x"
692 + ],
693 + "libc": [
694 + "glibc"
695 + ],
696 + "license": "LGPL-3.0-or-later",
697 + "optional": true,
698 + "os": [
699 + "linux"
700 + ],
701 + "funding": {
702 + "url": "https://opencollective.com/libvips"
703 + }
704 + },
705 + "node_modules/@img/sharp-libvips-linux-x64": {
706 + "version": "1.2.4",
707 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
708 + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
709 + "cpu": [
710 + "x64"
711 + ],
712 + "libc": [
713 + "glibc"
714 + ],
715 + "license": "LGPL-3.0-or-later",
716 + "optional": true,
717 + "os": [
718 + "linux"
719 + ],
720 + "funding": {
721 + "url": "https://opencollective.com/libvips"
722 + }
723 + },
724 + "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
725 + "version": "1.2.4",
726 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
727 + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
728 + "cpu": [
729 + "arm64"
730 + ],
731 + "libc": [
732 + "musl"
733 + ],
734 + "license": "LGPL-3.0-or-later",
735 + "optional": true,
736 + "os": [
737 + "linux"
738 + ],
739 + "funding": {
740 + "url": "https://opencollective.com/libvips"
741 + }
742 + },
743 + "node_modules/@img/sharp-libvips-linuxmusl-x64": {
744 + "version": "1.2.4",
745 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
746 + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
747 + "cpu": [
748 + "x64"
749 + ],
750 + "libc": [
751 + "musl"
752 + ],
753 + "license": "LGPL-3.0-or-later",
754 + "optional": true,
755 + "os": [
756 + "linux"
757 + ],
758 + "funding": {
759 + "url": "https://opencollective.com/libvips"
760 + }
761 + },
762 + "node_modules/@img/sharp-linux-arm": {
763 + "version": "0.34.5",
764 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
765 + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
766 + "cpu": [
767 + "arm"
768 + ],
769 + "libc": [
770 + "glibc"
771 + ],
772 + "license": "Apache-2.0",
773 + "optional": true,
774 + "os": [
775 + "linux"
776 + ],
777 + "engines": {
778 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
779 + },
780 + "funding": {
781 + "url": "https://opencollective.com/libvips"
782 + },
783 + "optionalDependencies": {
784 + "@img/sharp-libvips-linux-arm": "1.2.4"
785 + }
786 + },
787 + "node_modules/@img/sharp-linux-arm64": {
788 + "version": "0.34.5",
789 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
790 + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
791 + "cpu": [
792 + "arm64"
793 + ],
794 + "libc": [
795 + "glibc"
796 + ],
797 + "license": "Apache-2.0",
798 + "optional": true,
799 + "os": [
800 + "linux"
801 + ],
802 + "engines": {
803 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
804 + },
805 + "funding": {
806 + "url": "https://opencollective.com/libvips"
807 + },
808 + "optionalDependencies": {
809 + "@img/sharp-libvips-linux-arm64": "1.2.4"
810 + }
811 + },
812 + "node_modules/@img/sharp-linux-ppc64": {
813 + "version": "0.34.5",
814 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
815 + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
816 + "cpu": [
817 + "ppc64"
818 + ],
819 + "libc": [
820 + "glibc"
821 + ],
822 + "license": "Apache-2.0",
823 + "optional": true,
824 + "os": [
825 + "linux"
826 + ],
827 + "engines": {
828 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
829 + },
830 + "funding": {
831 + "url": "https://opencollective.com/libvips"
832 + },
833 + "optionalDependencies": {
834 + "@img/sharp-libvips-linux-ppc64": "1.2.4"
835 + }
836 + },
837 + "node_modules/@img/sharp-linux-riscv64": {
838 + "version": "0.34.5",
839 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
840 + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
841 + "cpu": [
842 + "riscv64"
843 + ],
844 + "libc": [
845 + "glibc"
846 + ],
847 + "license": "Apache-2.0",
848 + "optional": true,
849 + "os": [
850 + "linux"
851 + ],
852 + "engines": {
853 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
854 + },
855 + "funding": {
856 + "url": "https://opencollective.com/libvips"
857 + },
858 + "optionalDependencies": {
859 + "@img/sharp-libvips-linux-riscv64": "1.2.4"
860 + }
861 + },
862 + "node_modules/@img/sharp-linux-s390x": {
863 + "version": "0.34.5",
864 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
865 + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
866 + "cpu": [
867 + "s390x"
868 + ],
869 + "libc": [
870 + "glibc"
871 + ],
872 + "license": "Apache-2.0",
873 + "optional": true,
874 + "os": [
875 + "linux"
876 + ],
877 + "engines": {
878 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
879 + },
880 + "funding": {
881 + "url": "https://opencollective.com/libvips"
882 + },
883 + "optionalDependencies": {
884 + "@img/sharp-libvips-linux-s390x": "1.2.4"
885 + }
886 + },
887 + "node_modules/@img/sharp-linux-x64": {
888 + "version": "0.34.5",
889 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
890 + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
891 + "cpu": [
892 + "x64"
893 + ],
894 + "libc": [
895 + "glibc"
896 + ],
897 + "license": "Apache-2.0",
898 + "optional": true,
899 + "os": [
900 + "linux"
901 + ],
902 + "engines": {
903 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
904 + },
905 + "funding": {
906 + "url": "https://opencollective.com/libvips"
907 + },
908 + "optionalDependencies": {
909 + "@img/sharp-libvips-linux-x64": "1.2.4"
910 + }
911 + },
912 + "node_modules/@img/sharp-linuxmusl-arm64": {
913 + "version": "0.34.5",
914 + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
915 + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
916 + "cpu": [
917 + "arm64"
918 + ],
919 + "libc": [
920 + "musl"
921 + ],
922 + "license": "Apache-2.0",
923 + "optional": true,
924 + "os": [
925 + "linux"
926 + ],
927 + "engines": {
928 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
929 + },
930 + "funding": {
931 + "url": "https://opencollective.com/libvips"
932 + },
933 + "optionalDependencies": {
934 + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
935 + }
936 + },
937 + "node_modules/@img/sharp-linuxmusl-x64": {
938 + "version": "0.34.5",
939 + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
940 + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
941 + "cpu": [
942 + "x64"
943 + ],
944 + "libc": [
945 + "musl"
946 + ],
947 + "license": "Apache-2.0",
948 + "optional": true,
949 + "os": [
950 + "linux"
951 + ],
952 + "engines": {
953 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
954 + },
955 + "funding": {
956 + "url": "https://opencollective.com/libvips"
957 + },
958 + "optionalDependencies": {
959 + "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
960 + }
961 + },
962 + "node_modules/@img/sharp-wasm32": {
963 + "version": "0.34.5",
964 + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
965 + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
966 + "cpu": [
967 + "wasm32"
968 + ],
969 + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
970 + "optional": true,
971 + "dependencies": {
972 + "@emnapi/runtime": "^1.7.0"
973 + },
974 + "engines": {
975 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
976 + },
977 + "funding": {
978 + "url": "https://opencollective.com/libvips"
979 + }
980 + },
981 + "node_modules/@img/sharp-win32-arm64": {
982 + "version": "0.34.5",
983 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
984 + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
985 + "cpu": [
986 + "arm64"
987 + ],
988 + "license": "Apache-2.0 AND LGPL-3.0-or-later",
989 + "optional": true,
990 + "os": [
991 + "win32"
992 + ],
993 + "engines": {
994 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
995 + },
996 + "funding": {
997 + "url": "https://opencollective.com/libvips"
998 + }
999 + },
1000 + "node_modules/@img/sharp-win32-ia32": {
1001 + "version": "0.34.5",
1002 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
1003 + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
1004 + "cpu": [
1005 + "ia32"
1006 + ],
1007 + "license": "Apache-2.0 AND LGPL-3.0-or-later",
1008 + "optional": true,
1009 + "os": [
1010 + "win32"
1011 + ],
1012 + "engines": {
1013 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
1014 + },
1015 + "funding": {
1016 + "url": "https://opencollective.com/libvips"
1017 + }
1018 + },
1019 + "node_modules/@img/sharp-win32-x64": {
1020 + "version": "0.34.5",
1021 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
1022 + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
1023 + "cpu": [
1024 + "x64"
1025 + ],
1026 + "license": "Apache-2.0 AND LGPL-3.0-or-later",
1027 + "optional": true,
1028 + "os": [
1029 + "win32"
1030 + ],
1031 + "engines": {
1032 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
1033 + },
1034 + "funding": {
1035 + "url": "https://opencollective.com/libvips"
1036 + }
1037 + },
1038 + "node_modules/@jridgewell/gen-mapping": {
1039 + "version": "0.3.13",
1040 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
1041 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
1042 + "dev": true,
1043 + "license": "MIT",
1044 + "dependencies": {
1045 + "@jridgewell/sourcemap-codec": "^1.5.0",
1046 + "@jridgewell/trace-mapping": "^0.3.24"
1047 + }
1048 + },
1049 + "node_modules/@jridgewell/remapping": {
1050 + "version": "2.3.5",
1051 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
1052 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
1053 + "dev": true,
1054 + "license": "MIT",
1055 + "dependencies": {
1056 + "@jridgewell/gen-mapping": "^0.3.5",
1057 + "@jridgewell/trace-mapping": "^0.3.24"
1058 + }
1059 + },
1060 + "node_modules/@jridgewell/resolve-uri": {
1061 + "version": "3.1.2",
1062 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
1063 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
1064 + "dev": true,
1065 + "license": "MIT",
1066 + "engines": {
1067 + "node": ">=6.0.0"
1068 + }
1069 + },
1070 + "node_modules/@jridgewell/sourcemap-codec": {
1071 + "version": "1.5.5",
1072 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
1073 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
1074 + "dev": true,
1075 + "license": "MIT"
1076 + },
1077 + "node_modules/@jridgewell/trace-mapping": {
1078 + "version": "0.3.31",
1079 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
1080 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
1081 + "dev": true,
1082 + "license": "MIT",
1083 + "dependencies": {
1084 + "@jridgewell/resolve-uri": "^3.1.0",
1085 + "@jridgewell/sourcemap-codec": "^1.4.14"
1086 + }
1087 + },
1088 + "node_modules/@napi-rs/wasm-runtime": {
1089 + "version": "0.2.12",
1090 + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
1091 + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
1092 + "dev": true,
1093 + "license": "MIT",
1094 + "optional": true,
1095 + "dependencies": {
1096 + "@emnapi/core": "^1.4.3",
1097 + "@emnapi/runtime": "^1.4.3",
1098 + "@tybys/wasm-util": "^0.10.0"
1099 + }
1100 + },
1101 + "node_modules/@next/env": {
1102 + "version": "16.2.4",
1103 + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.4.tgz",
1104 + "integrity": "sha512-dKkkOzOSwFYe5RX6y26fZgkSpVAlIOJKQHIiydQcrWH6y/97+RceSOAdjZ14Qa3zLduVUy0TXcn+EiM6t4rPgw==",
1105 + "license": "MIT"
1106 + },
1107 + "node_modules/@next/eslint-plugin-next": {
1108 + "version": "16.2.4",
1109 + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.4.tgz",
1110 + "integrity": "sha512-tOX826JJ96gYK/go18sPUgMq9FK1tqxBFfUCEufJb5XIkWFFmpgU7mahJANKGkHs7F41ir3tReJ3Lv5La0RvhA==",
1111 + "dev": true,
1112 + "license": "MIT",
1113 + "dependencies": {
1114 + "fast-glob": "3.3.1"
1115 + }
1116 + },
1117 + "node_modules/@next/swc-darwin-arm64": {
1118 + "version": "16.2.4",
1119 + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.4.tgz",
1120 + "integrity": "sha512-OXTFFox5EKN1Ym08vfrz+OXxmCcEjT4SFMbNRsWZE99dMqt2Kcusl5MqPXcW232RYkMLQTy0hqgAMEsfEd/l2A==",
1121 + "cpu": [
1122 + "arm64"
1123 + ],
1124 + "license": "MIT",
1125 + "optional": true,
1126 + "os": [
1127 + "darwin"
1128 + ],
1129 + "engines": {
1130 + "node": ">= 10"
1131 + }
1132 + },
1133 + "node_modules/@next/swc-darwin-x64": {
1134 + "version": "16.2.4",
1135 + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.4.tgz",
1136 + "integrity": "sha512-XhpVnUfmYWvD3YrXu55XdcAkQtOnvaI6wtQa8fuF5fGoKoxIUZ0kWPtcOfqJEWngFF/lOS9l3+O9CcownhiQxQ==",
1137 + "cpu": [
1138 + "x64"
1139 + ],
1140 + "license": "MIT",
1141 + "optional": true,
1142 + "os": [
1143 + "darwin"
1144 + ],
1145 + "engines": {
1146 + "node": ">= 10"
1147 + }
1148 + },
1149 + "node_modules/@next/swc-linux-arm64-gnu": {
1150 + "version": "16.2.4",
1151 + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.4.tgz",
1152 + "integrity": "sha512-Mx/tjlNA3G8kg14QvuGAJ4xBwPk1tUHq56JxZ8CXnZwz1Etz714soCEzGQQzVMz4bEnGPowzkV6Xrp6wAkEWOQ==",
1153 + "cpu": [
1154 + "arm64"
1155 + ],
1156 + "libc": [
1157 + "glibc"
1158 + ],
1159 + "license": "MIT",
1160 + "optional": true,
1161 + "os": [
1162 + "linux"
1163 + ],
1164 + "engines": {
1165 + "node": ">= 10"
1166 + }
1167 + },
1168 + "node_modules/@next/swc-linux-arm64-musl": {
1169 + "version": "16.2.4",
1170 + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.4.tgz",
1171 + "integrity": "sha512-iVMMp14514u7Nup2umQS03nT/bN9HurK8ufylC3FZNykrwjtx7V1A7+4kvhbDSCeonTVqV3Txnv0Lu+m2oDXNg==",
1172 + "cpu": [
1173 + "arm64"
1174 + ],
1175 + "libc": [
1176 + "musl"
1177 + ],
1178 + "license": "MIT",
1179 + "optional": true,
1180 + "os": [
1181 + "linux"
1182 + ],
1183 + "engines": {
1184 + "node": ">= 10"
1185 + }
1186 + },
1187 + "node_modules/@next/swc-linux-x64-gnu": {
1188 + "version": "16.2.4",
1189 + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.4.tgz",
1190 + "integrity": "sha512-EZOvm1aQWgnI/N/xcWOlnS3RQBk0VtVav5Zo7n4p0A7UKyTDx047k8opDbXgBpHl4CulRqRfbw3QrX2w5UOXMQ==",
1191 + "cpu": [
1192 + "x64"
1193 + ],
1194 + "libc": [
1195 + "glibc"
1196 + ],
1197 + "license": "MIT",
1198 + "optional": true,
1199 + "os": [
1200 + "linux"
1201 + ],
1202 + "engines": {
1203 + "node": ">= 10"
1204 + }
1205 + },
1206 + "node_modules/@next/swc-linux-x64-musl": {
1207 + "version": "16.2.4",
1208 + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.4.tgz",
1209 + "integrity": "sha512-h9FxsngCm9cTBf71AR4fGznDEDx1hS7+kSEiIRjq5kO1oXWm07DxVGZjCvk0SGx7TSjlUqhI8oOyz7NfwAdPoA==",
1210 + "cpu": [
1211 + "x64"
1212 + ],
1213 + "libc": [
1214 + "musl"
1215 + ],
1216 + "license": "MIT",
1217 + "optional": true,
1218 + "os": [
1219 + "linux"
1220 + ],
1221 + "engines": {
1222 + "node": ">= 10"
1223 + }
1224 + },
1225 + "node_modules/@next/swc-win32-arm64-msvc": {
1226 + "version": "16.2.4",
1227 + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.4.tgz",
1228 + "integrity": "sha512-3NdJV5OXMSOeJYijX+bjaLge3mJBlh4ybydbT4GFoB/2hAojWHtMhl3CYlYoMrjPuodp0nzFVi4Tj2+WaMg+Ow==",
1229 + "cpu": [
1230 + "arm64"
1231 + ],
1232 + "license": "MIT",
1233 + "optional": true,
1234 + "os": [
1235 + "win32"
1236 + ],
1237 + "engines": {
1238 + "node": ">= 10"
1239 + }
1240 + },
1241 + "node_modules/@next/swc-win32-x64-msvc": {
1242 + "version": "16.2.4",
1243 + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.4.tgz",
1244 + "integrity": "sha512-kMVGgsqhO5YTYODD9IPGGhA6iprWidQckK3LmPeW08PIFENRmgfb4MjXHO+p//d+ts2rpjvK5gXWzXSMrPl9cw==",
1245 + "cpu": [
1246 + "x64"
1247 + ],
1248 + "license": "MIT",
1249 + "optional": true,
1250 + "os": [
1251 + "win32"
1252 + ],
1253 + "engines": {
1254 + "node": ">= 10"
1255 + }
1256 + },
1257 + "node_modules/@nodelib/fs.scandir": {
1258 + "version": "2.1.5",
1259 + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
1260 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
1261 + "dev": true,
1262 + "license": "MIT",
1263 + "dependencies": {
1264 + "@nodelib/fs.stat": "2.0.5",
1265 + "run-parallel": "^1.1.9"
1266 + },
1267 + "engines": {
1268 + "node": ">= 8"
1269 + }
1270 + },
1271 + "node_modules/@nodelib/fs.stat": {
1272 + "version": "2.0.5",
1273 + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
1274 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
1275 + "dev": true,
1276 + "license": "MIT",
1277 + "engines": {
1278 + "node": ">= 8"
1279 + }
1280 + },
1281 + "node_modules/@nodelib/fs.walk": {
1282 + "version": "1.2.8",
1283 + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
1284 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
1285 + "dev": true,
1286 + "license": "MIT",
1287 + "dependencies": {
1288 + "@nodelib/fs.scandir": "2.1.5",
1289 + "fastq": "^1.6.0"
1290 + },
1291 + "engines": {
1292 + "node": ">= 8"
1293 + }
1294 + },
1295 + "node_modules/@nolyfill/is-core-module": {
1296 + "version": "1.0.39",
1297 + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
1298 + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
1299 + "dev": true,
1300 + "license": "MIT",
1301 + "engines": {
1302 + "node": ">=12.4.0"
1303 + }
1304 + },
1305 + "node_modules/@rtsao/scc": {
1306 + "version": "1.1.0",
1307 + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
1308 + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
1309 + "dev": true,
1310 + "license": "MIT"
1311 + },
1312 + "node_modules/@swc/helpers": {
1313 + "version": "0.5.15",
1314 + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
1315 + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
1316 + "license": "Apache-2.0",
1317 + "dependencies": {
1318 + "tslib": "^2.8.0"
1319 + }
1320 + },
1321 + "node_modules/@tailwindcss/node": {
1322 + "version": "4.2.4",
1323 + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
1324 + "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==",
1325 + "dev": true,
1326 + "license": "MIT",
1327 + "dependencies": {
1328 + "@jridgewell/remapping": "^2.3.5",
1329 + "enhanced-resolve": "^5.19.0",
1330 + "jiti": "^2.6.1",
1331 + "lightningcss": "1.32.0",
1332 + "magic-string": "^0.30.21",
1333 + "source-map-js": "^1.2.1",
1334 + "tailwindcss": "4.2.4"
1335 + }
1336 + },
1337 + "node_modules/@tailwindcss/oxide": {
1338 + "version": "4.2.4",
1339 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz",
1340 + "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==",
1341 + "dev": true,
1342 + "license": "MIT",
1343 + "engines": {
1344 + "node": ">= 20"
1345 + },
1346 + "optionalDependencies": {
1347 + "@tailwindcss/oxide-android-arm64": "4.2.4",
1348 + "@tailwindcss/oxide-darwin-arm64": "4.2.4",
1349 + "@tailwindcss/oxide-darwin-x64": "4.2.4",
1350 + "@tailwindcss/oxide-freebsd-x64": "4.2.4",
1351 + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4",
1352 + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4",
1353 + "@tailwindcss/oxide-linux-arm64-musl": "4.2.4",
1354 + "@tailwindcss/oxide-linux-x64-gnu": "4.2.4",
1355 + "@tailwindcss/oxide-linux-x64-musl": "4.2.4",
1356 + "@tailwindcss/oxide-wasm32-wasi": "4.2.4",
1357 + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4",
1358 + "@tailwindcss/oxide-win32-x64-msvc": "4.2.4"
1359 + }
1360 + },
1361 + "node_modules/@tailwindcss/oxide-android-arm64": {
1362 + "version": "4.2.4",
1363 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz",
1364 + "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==",
1365 + "cpu": [
1366 + "arm64"
1367 + ],
1368 + "dev": true,
1369 + "license": "MIT",
1370 + "optional": true,
1371 + "os": [
1372 + "android"
1373 + ],
1374 + "engines": {
1375 + "node": ">= 20"
1376 + }
1377 + },
1378 + "node_modules/@tailwindcss/oxide-darwin-arm64": {
1379 + "version": "4.2.4",
1380 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz",
1381 + "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==",
1382 + "cpu": [
1383 + "arm64"
1384 + ],
1385 + "dev": true,
1386 + "license": "MIT",
1387 + "optional": true,
1388 + "os": [
1389 + "darwin"
1390 + ],
1391 + "engines": {
1392 + "node": ">= 20"
1393 + }
1394 + },
1395 + "node_modules/@tailwindcss/oxide-darwin-x64": {
1396 + "version": "4.2.4",
1397 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz",
1398 + "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==",
1399 + "cpu": [
1400 + "x64"
1401 + ],
1402 + "dev": true,
1403 + "license": "MIT",
1404 + "optional": true,
1405 + "os": [
1406 + "darwin"
1407 + ],
1408 + "engines": {
1409 + "node": ">= 20"
1410 + }
1411 + },
1412 + "node_modules/@tailwindcss/oxide-freebsd-x64": {
1413 + "version": "4.2.4",
1414 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz",
1415 + "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==",
1416 + "cpu": [
1417 + "x64"
1418 + ],
1419 + "dev": true,
1420 + "license": "MIT",
1421 + "optional": true,
1422 + "os": [
1423 + "freebsd"
1424 + ],
1425 + "engines": {
1426 + "node": ">= 20"
1427 + }
1428 + },
1429 + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
1430 + "version": "4.2.4",
1431 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz",
1432 + "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==",
1433 + "cpu": [
1434 + "arm"
1435 + ],
1436 + "dev": true,
1437 + "license": "MIT",
1438 + "optional": true,
1439 + "os": [
1440 + "linux"
1441 + ],
1442 + "engines": {
1443 + "node": ">= 20"
1444 + }
1445 + },
1446 + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
1447 + "version": "4.2.4",
1448 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz",
1449 + "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==",
1450 + "cpu": [
1451 + "arm64"
1452 + ],
1453 + "dev": true,
1454 + "libc": [
1455 + "glibc"
1456 + ],
1457 + "license": "MIT",
1458 + "optional": true,
1459 + "os": [
1460 + "linux"
1461 + ],
1462 + "engines": {
1463 + "node": ">= 20"
1464 + }
1465 + },
1466 + "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
1467 + "version": "4.2.4",
1468 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz",
1469 + "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==",
1470 + "cpu": [
1471 + "arm64"
1472 + ],
1473 + "dev": true,
1474 + "libc": [
1475 + "musl"
1476 + ],
1477 + "license": "MIT",
1478 + "optional": true,
1479 + "os": [
1480 + "linux"
1481 + ],
1482 + "engines": {
1483 + "node": ">= 20"
1484 + }
1485 + },
1486 + "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
1487 + "version": "4.2.4",
1488 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz",
1489 + "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==",
1490 + "cpu": [
1491 + "x64"
1492 + ],
1493 + "dev": true,
1494 + "libc": [
1495 + "glibc"
1496 + ],
1497 + "license": "MIT",
1498 + "optional": true,
1499 + "os": [
1500 + "linux"
1501 + ],
1502 + "engines": {
1503 + "node": ">= 20"
1504 + }
1505 + },
1506 + "node_modules/@tailwindcss/oxide-linux-x64-musl": {
1507 + "version": "4.2.4",
1508 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz",
1509 + "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==",
1510 + "cpu": [
1511 + "x64"
1512 + ],
1513 + "dev": true,
1514 + "libc": [
1515 + "musl"
1516 + ],
1517 + "license": "MIT",
1518 + "optional": true,
1519 + "os": [
1520 + "linux"
1521 + ],
1522 + "engines": {
1523 + "node": ">= 20"
1524 + }
1525 + },
1526 + "node_modules/@tailwindcss/oxide-wasm32-wasi": {
1527 + "version": "4.2.4",
1528 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz",
1529 + "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==",
1530 + "bundleDependencies": [
1531 + "@napi-rs/wasm-runtime",
1532 + "@emnapi/core",
1533 + "@emnapi/runtime",
1534 + "@tybys/wasm-util",
1535 + "@emnapi/wasi-threads",
1536 + "tslib"
1537 + ],
1538 + "cpu": [
1539 + "wasm32"
1540 + ],
1541 + "dev": true,
1542 + "license": "MIT",
1543 + "optional": true,
1544 + "dependencies": {
1545 + "@emnapi/core": "^1.8.1",
1546 + "@emnapi/runtime": "^1.8.1",
1547 + "@emnapi/wasi-threads": "^1.1.0",
1548 + "@napi-rs/wasm-runtime": "^1.1.1",
1549 + "@tybys/wasm-util": "^0.10.1",
1550 + "tslib": "^2.8.1"
1551 + },
1552 + "engines": {
1553 + "node": ">=14.0.0"
1554 + }
1555 + },
1556 + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
1557 + "version": "4.2.4",
1558 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz",
1559 + "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==",
1560 + "cpu": [
1561 + "arm64"
1562 + ],
1563 + "dev": true,
1564 + "license": "MIT",
1565 + "optional": true,
1566 + "os": [
1567 + "win32"
1568 + ],
1569 + "engines": {
1570 + "node": ">= 20"
1571 + }
1572 + },
1573 + "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
1574 + "version": "4.2.4",
1575 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz",
1576 + "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==",
1577 + "cpu": [
1578 + "x64"
1579 + ],
1580 + "dev": true,
1581 + "license": "MIT",
1582 + "optional": true,
1583 + "os": [
1584 + "win32"
1585 + ],
1586 + "engines": {
1587 + "node": ">= 20"
1588 + }
1589 + },
1590 + "node_modules/@tailwindcss/postcss": {
1591 + "version": "4.2.4",
1592 + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz",
1593 + "integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==",
1594 + "dev": true,
1595 + "license": "MIT",
1596 + "dependencies": {
1597 + "@alloc/quick-lru": "^5.2.0",
1598 + "@tailwindcss/node": "4.2.4",
1599 + "@tailwindcss/oxide": "4.2.4",
1600 + "postcss": "^8.5.6",
1601 + "tailwindcss": "4.2.4"
1602 + }
1603 + },
1604 + "node_modules/@tybys/wasm-util": {
1605 + "version": "0.10.1",
1606 + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
1607 + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
1608 + "dev": true,
1609 + "license": "MIT",
1610 + "optional": true,
1611 + "dependencies": {
1612 + "tslib": "^2.4.0"
1613 + }
1614 + },
1615 + "node_modules/@types/estree": {
1616 + "version": "1.0.8",
1617 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1618 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1619 + "dev": true,
1620 + "license": "MIT"
1621 + },
1622 + "node_modules/@types/json-schema": {
1623 + "version": "7.0.15",
1624 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
1625 + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
1626 + "dev": true,
1627 + "license": "MIT"
1628 + },
1629 + "node_modules/@types/json5": {
1630 + "version": "0.0.29",
1631 + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
1632 + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
1633 + "dev": true,
1634 + "license": "MIT"
1635 + },
1636 + "node_modules/@types/node": {
1637 + "version": "20.19.39",
1638 + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz",
1639 + "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==",
1640 + "dev": true,
1641 + "license": "MIT",
1642 + "dependencies": {
1643 + "undici-types": "~6.21.0"
1644 + }
1645 + },
1646 + "node_modules/@types/react": {
1647 + "version": "19.2.14",
1648 + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
1649 + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
1650 + "dev": true,
1651 + "license": "MIT",
1652 + "dependencies": {
1653 + "csstype": "^3.2.2"
1654 + }
1655 + },
1656 + "node_modules/@types/react-dom": {
1657 + "version": "19.2.3",
1658 + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
1659 + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
1660 + "dev": true,
1661 + "license": "MIT",
1662 + "peerDependencies": {
1663 + "@types/react": "^19.2.0"
1664 + }
1665 + },
1666 + "node_modules/@types/ssh2": {
1667 + "version": "1.15.5",
1668 + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz",
1669 + "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==",
1670 + "dev": true,
1671 + "license": "MIT",
1672 + "dependencies": {
1673 + "@types/node": "^18.11.18"
1674 + }
1675 + },
1676 + "node_modules/@types/ssh2/node_modules/@types/node": {
1677 + "version": "18.19.130",
1678 + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz",
1679 + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==",
1680 + "dev": true,
1681 + "license": "MIT",
1682 + "dependencies": {
1683 + "undici-types": "~5.26.4"
1684 + }
1685 + },
1686 + "node_modules/@types/ssh2/node_modules/undici-types": {
1687 + "version": "5.26.5",
1688 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
1689 + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
1690 + "dev": true,
1691 + "license": "MIT"
1692 + },
1693 + "node_modules/@typescript-eslint/eslint-plugin": {
1694 + "version": "8.59.0",
1695 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz",
1696 + "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==",
1697 + "dev": true,
1698 + "license": "MIT",
1699 + "dependencies": {
1700 + "@eslint-community/regexpp": "^4.12.2",
1701 + "@typescript-eslint/scope-manager": "8.59.0",
1702 + "@typescript-eslint/type-utils": "8.59.0",
1703 + "@typescript-eslint/utils": "8.59.0",
1704 + "@typescript-eslint/visitor-keys": "8.59.0",
1705 + "ignore": "^7.0.5",
1706 + "natural-compare": "^1.4.0",
1707 + "ts-api-utils": "^2.5.0"
1708 + },
1709 + "engines": {
1710 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1711 + },
1712 + "funding": {
1713 + "type": "opencollective",
1714 + "url": "https://opencollective.com/typescript-eslint"
1715 + },
1716 + "peerDependencies": {
1717 + "@typescript-eslint/parser": "^8.59.0",
1718 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
1719 + "typescript": ">=4.8.4 <6.1.0"
1720 + }
1721 + },
1722 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
1723 + "version": "7.0.5",
1724 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
1725 + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
1726 + "dev": true,
1727 + "license": "MIT",
1728 + "engines": {
1729 + "node": ">= 4"
1730 + }
1731 + },
1732 + "node_modules/@typescript-eslint/parser": {
1733 + "version": "8.59.0",
1734 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz",
1735 + "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==",
1736 + "dev": true,
1737 + "license": "MIT",
1738 + "dependencies": {
1739 + "@typescript-eslint/scope-manager": "8.59.0",
1740 + "@typescript-eslint/types": "8.59.0",
1741 + "@typescript-eslint/typescript-estree": "8.59.0",
1742 + "@typescript-eslint/visitor-keys": "8.59.0",
1743 + "debug": "^4.4.3"
1744 + },
1745 + "engines": {
1746 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1747 + },
1748 + "funding": {
1749 + "type": "opencollective",
1750 + "url": "https://opencollective.com/typescript-eslint"
1751 + },
1752 + "peerDependencies": {
1753 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
1754 + "typescript": ">=4.8.4 <6.1.0"
1755 + }
1756 + },
1757 + "node_modules/@typescript-eslint/project-service": {
1758 + "version": "8.59.0",
1759 + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz",
1760 + "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==",
1761 + "dev": true,
1762 + "license": "MIT",
1763 + "dependencies": {
1764 + "@typescript-eslint/tsconfig-utils": "^8.59.0",
1765 + "@typescript-eslint/types": "^8.59.0",
1766 + "debug": "^4.4.3"
1767 + },
1768 + "engines": {
1769 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1770 + },
1771 + "funding": {
1772 + "type": "opencollective",
1773 + "url": "https://opencollective.com/typescript-eslint"
1774 + },
1775 + "peerDependencies": {
1776 + "typescript": ">=4.8.4 <6.1.0"
1777 + }
1778 + },
1779 + "node_modules/@typescript-eslint/scope-manager": {
1780 + "version": "8.59.0",
1781 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz",
1782 + "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==",
1783 + "dev": true,
1784 + "license": "MIT",
1785 + "dependencies": {
1786 + "@typescript-eslint/types": "8.59.0",
1787 + "@typescript-eslint/visitor-keys": "8.59.0"
1788 + },
1789 + "engines": {
1790 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1791 + },
1792 + "funding": {
1793 + "type": "opencollective",
1794 + "url": "https://opencollective.com/typescript-eslint"
1795 + }
1796 + },
1797 + "node_modules/@typescript-eslint/tsconfig-utils": {
1798 + "version": "8.59.0",
1799 + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz",
1800 + "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==",
1801 + "dev": true,
1802 + "license": "MIT",
1803 + "engines": {
1804 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1805 + },
1806 + "funding": {
1807 + "type": "opencollective",
1808 + "url": "https://opencollective.com/typescript-eslint"
1809 + },
1810 + "peerDependencies": {
1811 + "typescript": ">=4.8.4 <6.1.0"
1812 + }
1813 + },
1814 + "node_modules/@typescript-eslint/type-utils": {
1815 + "version": "8.59.0",
1816 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz",
1817 + "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==",
1818 + "dev": true,
1819 + "license": "MIT",
1820 + "dependencies": {
1821 + "@typescript-eslint/types": "8.59.0",
1822 + "@typescript-eslint/typescript-estree": "8.59.0",
1823 + "@typescript-eslint/utils": "8.59.0",
1824 + "debug": "^4.4.3",
1825 + "ts-api-utils": "^2.5.0"
1826 + },
1827 + "engines": {
1828 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1829 + },
1830 + "funding": {
1831 + "type": "opencollective",
1832 + "url": "https://opencollective.com/typescript-eslint"
1833 + },
1834 + "peerDependencies": {
1835 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
1836 + "typescript": ">=4.8.4 <6.1.0"
1837 + }
1838 + },
1839 + "node_modules/@typescript-eslint/types": {
1840 + "version": "8.59.0",
1841 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz",
1842 + "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==",
1843 + "dev": true,
1844 + "license": "MIT",
1845 + "engines": {
1846 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1847 + },
1848 + "funding": {
1849 + "type": "opencollective",
1850 + "url": "https://opencollective.com/typescript-eslint"
1851 + }
1852 + },
1853 + "node_modules/@typescript-eslint/typescript-estree": {
1854 + "version": "8.59.0",
1855 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz",
1856 + "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==",
1857 + "dev": true,
1858 + "license": "MIT",
1859 + "dependencies": {
1860 + "@typescript-eslint/project-service": "8.59.0",
1861 + "@typescript-eslint/tsconfig-utils": "8.59.0",
1862 + "@typescript-eslint/types": "8.59.0",
1863 + "@typescript-eslint/visitor-keys": "8.59.0",
1864 + "debug": "^4.4.3",
1865 + "minimatch": "^10.2.2",
1866 + "semver": "^7.7.3",
1867 + "tinyglobby": "^0.2.15",
1868 + "ts-api-utils": "^2.5.0"
1869 + },
1870 + "engines": {
1871 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1872 + },
1873 + "funding": {
1874 + "type": "opencollective",
1875 + "url": "https://opencollective.com/typescript-eslint"
1876 + },
1877 + "peerDependencies": {
1878 + "typescript": ">=4.8.4 <6.1.0"
1879 + }
1880 + },
1881 + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
1882 + "version": "4.0.4",
1883 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
1884 + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
1885 + "dev": true,
1886 + "license": "MIT",
1887 + "engines": {
1888 + "node": "18 || 20 || >=22"
1889 + }
1890 + },
1891 + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
1892 + "version": "5.0.5",
1893 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
1894 + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
1895 + "dev": true,
1896 + "license": "MIT",
1897 + "dependencies": {
1898 + "balanced-match": "^4.0.2"
1899 + },
1900 + "engines": {
1901 + "node": "18 || 20 || >=22"
1902 + }
1903 + },
1904 + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
1905 + "version": "10.2.5",
1906 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
1907 + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
1908 + "dev": true,
1909 + "license": "BlueOak-1.0.0",
1910 + "dependencies": {
1911 + "brace-expansion": "^5.0.5"
1912 + },
1913 + "engines": {
1914 + "node": "18 || 20 || >=22"
1915 + },
1916 + "funding": {
1917 + "url": "https://github.com/sponsors/isaacs"
1918 + }
1919 + },
1920 + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
1921 + "version": "7.7.4",
1922 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
1923 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
1924 + "dev": true,
1925 + "license": "ISC",
1926 + "bin": {
1927 + "semver": "bin/semver.js"
1928 + },
1929 + "engines": {
1930 + "node": ">=10"
1931 + }
1932 + },
1933 + "node_modules/@typescript-eslint/utils": {
1934 + "version": "8.59.0",
1935 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz",
1936 + "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==",
1937 + "dev": true,
1938 + "license": "MIT",
1939 + "dependencies": {
1940 + "@eslint-community/eslint-utils": "^4.9.1",
1941 + "@typescript-eslint/scope-manager": "8.59.0",
1942 + "@typescript-eslint/types": "8.59.0",
1943 + "@typescript-eslint/typescript-estree": "8.59.0"
1944 + },
1945 + "engines": {
1946 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1947 + },
1948 + "funding": {
1949 + "type": "opencollective",
1950 + "url": "https://opencollective.com/typescript-eslint"
1951 + },
1952 + "peerDependencies": {
1953 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
1954 + "typescript": ">=4.8.4 <6.1.0"
1955 + }
1956 + },
1957 + "node_modules/@typescript-eslint/visitor-keys": {
1958 + "version": "8.59.0",
1959 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz",
1960 + "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==",
1961 + "dev": true,
1962 + "license": "MIT",
1963 + "dependencies": {
1964 + "@typescript-eslint/types": "8.59.0",
1965 + "eslint-visitor-keys": "^5.0.0"
1966 + },
1967 + "engines": {
1968 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1969 + },
1970 + "funding": {
1971 + "type": "opencollective",
1972 + "url": "https://opencollective.com/typescript-eslint"
1973 + }
1974 + },
1975 + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
1976 + "version": "5.0.1",
1977 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
1978 + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
1979 + "dev": true,
1980 + "license": "Apache-2.0",
1981 + "engines": {
1982 + "node": "^20.19.0 || ^22.13.0 || >=24"
1983 + },
1984 + "funding": {
1985 + "url": "https://opencollective.com/eslint"
1986 + }
1987 + },
1988 + "node_modules/@unrs/resolver-binding-android-arm-eabi": {
1989 + "version": "1.11.1",
1990 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
1991 + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
1992 + "cpu": [
1993 + "arm"
1994 + ],
1995 + "dev": true,
1996 + "license": "MIT",
1997 + "optional": true,
1998 + "os": [
1999 + "android"
2000 + ]
2001 + },
2002 + "node_modules/@unrs/resolver-binding-android-arm64": {
2003 + "version": "1.11.1",
2004 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
2005 + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
2006 + "cpu": [
2007 + "arm64"
2008 + ],
2009 + "dev": true,
2010 + "license": "MIT",
2011 + "optional": true,
2012 + "os": [
2013 + "android"
2014 + ]
2015 + },
2016 + "node_modules/@unrs/resolver-binding-darwin-arm64": {
2017 + "version": "1.11.1",
2018 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
2019 + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==",
2020 + "cpu": [
2021 + "arm64"
2022 + ],
2023 + "dev": true,
2024 + "license": "MIT",
2025 + "optional": true,
2026 + "os": [
2027 + "darwin"
2028 + ]
2029 + },
2030 + "node_modules/@unrs/resolver-binding-darwin-x64": {
2031 + "version": "1.11.1",
2032 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
2033 + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
2034 + "cpu": [
2035 + "x64"
2036 + ],
2037 + "dev": true,
2038 + "license": "MIT",
2039 + "optional": true,
2040 + "os": [
2041 + "darwin"
2042 + ]
2043 + },
2044 + "node_modules/@unrs/resolver-binding-freebsd-x64": {
2045 + "version": "1.11.1",
2046 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
2047 + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
2048 + "cpu": [
2049 + "x64"
2050 + ],
2051 + "dev": true,
2052 + "license": "MIT",
2053 + "optional": true,
2054 + "os": [
2055 + "freebsd"
2056 + ]
2057 + },
2058 + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
2059 + "version": "1.11.1",
2060 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
2061 + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
2062 + "cpu": [
2063 + "arm"
2064 + ],
2065 + "dev": true,
2066 + "license": "MIT",
2067 + "optional": true,
2068 + "os": [
2069 + "linux"
2070 + ]
2071 + },
2072 + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
2073 + "version": "1.11.1",
2074 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
2075 + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
2076 + "cpu": [
2077 + "arm"
2078 + ],
2079 + "dev": true,
2080 + "license": "MIT",
2081 + "optional": true,
2082 + "os": [
2083 + "linux"
2084 + ]
2085 + },
2086 + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
2087 + "version": "1.11.1",
2088 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
2089 + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
2090 + "cpu": [
2091 + "arm64"
2092 + ],
2093 + "dev": true,
2094 + "libc": [
2095 + "glibc"
2096 + ],
2097 + "license": "MIT",
2098 + "optional": true,
2099 + "os": [
2100 + "linux"
2101 + ]
2102 + },
2103 + "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
2104 + "version": "1.11.1",
2105 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
2106 + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
2107 + "cpu": [
2108 + "arm64"
2109 + ],
2110 + "dev": true,
2111 + "libc": [
2112 + "musl"
2113 + ],
2114 + "license": "MIT",
2115 + "optional": true,
2116 + "os": [
2117 + "linux"
2118 + ]
2119 + },
2120 + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
2121 + "version": "1.11.1",
2122 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
2123 + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
2124 + "cpu": [
2125 + "ppc64"
2126 + ],
2127 + "dev": true,
2128 + "libc": [
2129 + "glibc"
2130 + ],
2131 + "license": "MIT",
2132 + "optional": true,
2133 + "os": [
2134 + "linux"
2135 + ]
2136 + },
2137 + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
2138 + "version": "1.11.1",
2139 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
2140 + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
2141 + "cpu": [
2142 + "riscv64"
2143 + ],
2144 + "dev": true,
2145 + "libc": [
2146 + "glibc"
2147 + ],
2148 + "license": "MIT",
2149 + "optional": true,
2150 + "os": [
2151 + "linux"
2152 + ]
2153 + },
2154 + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
2155 + "version": "1.11.1",
2156 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
2157 + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
2158 + "cpu": [
2159 + "riscv64"
2160 + ],
2161 + "dev": true,
2162 + "libc": [
2163 + "musl"
2164 + ],
2165 + "license": "MIT",
2166 + "optional": true,
2167 + "os": [
2168 + "linux"
2169 + ]
2170 + },
2171 + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
2172 + "version": "1.11.1",
2173 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
2174 + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
2175 + "cpu": [
2176 + "s390x"
2177 + ],
2178 + "dev": true,
2179 + "libc": [
2180 + "glibc"
2181 + ],
2182 + "license": "MIT",
2183 + "optional": true,
2184 + "os": [
2185 + "linux"
2186 + ]
2187 + },
2188 + "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
2189 + "version": "1.11.1",
2190 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
2191 + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
2192 + "cpu": [
2193 + "x64"
2194 + ],
2195 + "dev": true,
2196 + "libc": [
2197 + "glibc"
2198 + ],
2199 + "license": "MIT",
2200 + "optional": true,
2201 + "os": [
2202 + "linux"
2203 + ]
2204 + },
2205 + "node_modules/@unrs/resolver-binding-linux-x64-musl": {
2206 + "version": "1.11.1",
2207 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
2208 + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
2209 + "cpu": [
2210 + "x64"
2211 + ],
2212 + "dev": true,
2213 + "libc": [
2214 + "musl"
2215 + ],
2216 + "license": "MIT",
2217 + "optional": true,
2218 + "os": [
2219 + "linux"
2220 + ]
2221 + },
2222 + "node_modules/@unrs/resolver-binding-wasm32-wasi": {
2223 + "version": "1.11.1",
2224 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
2225 + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
2226 + "cpu": [
2227 + "wasm32"
2228 + ],
2229 + "dev": true,
2230 + "license": "MIT",
2231 + "optional": true,
2232 + "dependencies": {
2233 + "@napi-rs/wasm-runtime": "^0.2.11"
2234 + },
2235 + "engines": {
2236 + "node": ">=14.0.0"
2237 + }
2238 + },
2239 + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
2240 + "version": "1.11.1",
2241 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
2242 + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
2243 + "cpu": [
2244 + "arm64"
2245 + ],
2246 + "dev": true,
2247 + "license": "MIT",
2248 + "optional": true,
2249 + "os": [
2250 + "win32"
2251 + ]
2252 + },
2253 + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
2254 + "version": "1.11.1",
2255 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
2256 + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
2257 + "cpu": [
2258 + "ia32"
2259 + ],
2260 + "dev": true,
2261 + "license": "MIT",
2262 + "optional": true,
2263 + "os": [
2264 + "win32"
2265 + ]
2266 + },
2267 + "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
2268 + "version": "1.11.1",
2269 + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
2270 + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
2271 + "cpu": [
2272 + "x64"
2273 + ],
2274 + "dev": true,
2275 + "license": "MIT",
2276 + "optional": true,
2277 + "os": [
2278 + "win32"
2279 + ]
2280 + },
2281 + "node_modules/acorn": {
2282 + "version": "8.16.0",
2283 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
2284 + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
2285 + "dev": true,
2286 + "license": "MIT",
2287 + "bin": {
2288 + "acorn": "bin/acorn"
2289 + },
2290 + "engines": {
2291 + "node": ">=0.4.0"
2292 + }
2293 + },
2294 + "node_modules/acorn-jsx": {
2295 + "version": "5.3.2",
2296 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
2297 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
2298 + "dev": true,
2299 + "license": "MIT",
2300 + "peerDependencies": {
2301 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
2302 + }
2303 + },
2304 + "node_modules/ajv": {
2305 + "version": "6.14.0",
2306 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
2307 + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
2308 + "dev": true,
2309 + "license": "MIT",
2310 + "dependencies": {
2311 + "fast-deep-equal": "^3.1.1",
2312 + "fast-json-stable-stringify": "^2.0.0",
2313 + "json-schema-traverse": "^0.4.1",
2314 + "uri-js": "^4.2.2"
2315 + },
2316 + "funding": {
2317 + "type": "github",
2318 + "url": "https://github.com/sponsors/epoberezkin"
2319 + }
2320 + },
2321 + "node_modules/ansi-styles": {
2322 + "version": "4.3.0",
2323 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2324 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2325 + "dev": true,
2326 + "license": "MIT",
2327 + "dependencies": {
2328 + "color-convert": "^2.0.1"
2329 + },
2330 + "engines": {
2331 + "node": ">=8"
2332 + },
2333 + "funding": {
2334 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2335 + }
2336 + },
2337 + "node_modules/argparse": {
2338 + "version": "2.0.1",
2339 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
2340 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
2341 + "dev": true,
2342 + "license": "Python-2.0"
2343 + },
2344 + "node_modules/aria-query": {
2345 + "version": "5.3.2",
2346 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
2347 + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
2348 + "dev": true,
2349 + "license": "Apache-2.0",
2350 + "engines": {
2351 + "node": ">= 0.4"
2352 + }
2353 + },
2354 + "node_modules/array-buffer-byte-length": {
2355 + "version": "1.0.2",
2356 + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
2357 + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
2358 + "dev": true,
2359 + "license": "MIT",
2360 + "dependencies": {
2361 + "call-bound": "^1.0.3",
2362 + "is-array-buffer": "^3.0.5"
2363 + },
2364 + "engines": {
2365 + "node": ">= 0.4"
2366 + },
2367 + "funding": {
2368 + "url": "https://github.com/sponsors/ljharb"
2369 + }
2370 + },
2371 + "node_modules/array-includes": {
2372 + "version": "3.1.9",
2373 + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
2374 + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
2375 + "dev": true,
2376 + "license": "MIT",
2377 + "dependencies": {
2378 + "call-bind": "^1.0.8",
2379 + "call-bound": "^1.0.4",
2380 + "define-properties": "^1.2.1",
2381 + "es-abstract": "^1.24.0",
2382 + "es-object-atoms": "^1.1.1",
2383 + "get-intrinsic": "^1.3.0",
2384 + "is-string": "^1.1.1",
2385 + "math-intrinsics": "^1.1.0"
2386 + },
2387 + "engines": {
2388 + "node": ">= 0.4"
2389 + },
2390 + "funding": {
2391 + "url": "https://github.com/sponsors/ljharb"
2392 + }
2393 + },
2394 + "node_modules/array.prototype.findlast": {
2395 + "version": "1.2.5",
2396 + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
2397 + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
2398 + "dev": true,
2399 + "license": "MIT",
2400 + "dependencies": {
2401 + "call-bind": "^1.0.7",
2402 + "define-properties": "^1.2.1",
2403 + "es-abstract": "^1.23.2",
2404 + "es-errors": "^1.3.0",
2405 + "es-object-atoms": "^1.0.0",
2406 + "es-shim-unscopables": "^1.0.2"
2407 + },
2408 + "engines": {
2409 + "node": ">= 0.4"
2410 + },
2411 + "funding": {
2412 + "url": "https://github.com/sponsors/ljharb"
2413 + }
2414 + },
2415 + "node_modules/array.prototype.findlastindex": {
2416 + "version": "1.2.6",
2417 + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
2418 + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
2419 + "dev": true,
2420 + "license": "MIT",
2421 + "dependencies": {
2422 + "call-bind": "^1.0.8",
2423 + "call-bound": "^1.0.4",
2424 + "define-properties": "^1.2.1",
2425 + "es-abstract": "^1.23.9",
2426 + "es-errors": "^1.3.0",
2427 + "es-object-atoms": "^1.1.1",
2428 + "es-shim-unscopables": "^1.1.0"
2429 + },
2430 + "engines": {
2431 + "node": ">= 0.4"
2432 + },
2433 + "funding": {
2434 + "url": "https://github.com/sponsors/ljharb"
2435 + }
2436 + },
2437 + "node_modules/array.prototype.flat": {
2438 + "version": "1.3.3",
2439 + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
2440 + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
2441 + "dev": true,
2442 + "license": "MIT",
2443 + "dependencies": {
2444 + "call-bind": "^1.0.8",
2445 + "define-properties": "^1.2.1",
2446 + "es-abstract": "^1.23.5",
2447 + "es-shim-unscopables": "^1.0.2"
2448 + },
2449 + "engines": {
2450 + "node": ">= 0.4"
2451 + },
2452 + "funding": {
2453 + "url": "https://github.com/sponsors/ljharb"
2454 + }
2455 + },
2456 + "node_modules/array.prototype.flatmap": {
2457 + "version": "1.3.3",
2458 + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
2459 + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
2460 + "dev": true,
2461 + "license": "MIT",
2462 + "dependencies": {
2463 + "call-bind": "^1.0.8",
2464 + "define-properties": "^1.2.1",
2465 + "es-abstract": "^1.23.5",
2466 + "es-shim-unscopables": "^1.0.2"
2467 + },
2468 + "engines": {
2469 + "node": ">= 0.4"
2470 + },
2471 + "funding": {
2472 + "url": "https://github.com/sponsors/ljharb"
2473 + }
2474 + },
2475 + "node_modules/array.prototype.tosorted": {
2476 + "version": "1.1.4",
2477 + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
2478 + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
2479 + "dev": true,
2480 + "license": "MIT",
2481 + "dependencies": {
2482 + "call-bind": "^1.0.7",
2483 + "define-properties": "^1.2.1",
2484 + "es-abstract": "^1.23.3",
2485 + "es-errors": "^1.3.0",
2486 + "es-shim-unscopables": "^1.0.2"
2487 + },
2488 + "engines": {
2489 + "node": ">= 0.4"
2490 + }
2491 + },
2492 + "node_modules/arraybuffer.prototype.slice": {
2493 + "version": "1.0.4",
2494 + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
2495 + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
2496 + "dev": true,
2497 + "license": "MIT",
2498 + "dependencies": {
2499 + "array-buffer-byte-length": "^1.0.1",
2500 + "call-bind": "^1.0.8",
2501 + "define-properties": "^1.2.1",
2502 + "es-abstract": "^1.23.5",
2503 + "es-errors": "^1.3.0",
2504 + "get-intrinsic": "^1.2.6",
2505 + "is-array-buffer": "^3.0.4"
2506 + },
2507 + "engines": {
2508 + "node": ">= 0.4"
2509 + },
2510 + "funding": {
2511 + "url": "https://github.com/sponsors/ljharb"
2512 + }
2513 + },
2514 + "node_modules/asn1": {
2515 + "version": "0.2.6",
2516 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
2517 + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
2518 + "license": "MIT",
2519 + "dependencies": {
2520 + "safer-buffer": "~2.1.0"
2521 + }
2522 + },
2523 + "node_modules/ast-types-flow": {
2524 + "version": "0.0.8",
2525 + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
2526 + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
2527 + "dev": true,
2528 + "license": "MIT"
2529 + },
2530 + "node_modules/async-function": {
2531 + "version": "1.0.0",
2532 + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
2533 + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
2534 + "dev": true,
2535 + "license": "MIT",
2536 + "engines": {
2537 + "node": ">= 0.4"
2538 + }
2539 + },
2540 + "node_modules/available-typed-arrays": {
2541 + "version": "1.0.7",
2542 + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
2543 + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
2544 + "dev": true,
2545 + "license": "MIT",
2546 + "dependencies": {
2547 + "possible-typed-array-names": "^1.0.0"
2548 + },
2549 + "engines": {
2550 + "node": ">= 0.4"
2551 + },
2552 + "funding": {
2553 + "url": "https://github.com/sponsors/ljharb"
2554 + }
2555 + },
2556 + "node_modules/axe-core": {
2557 + "version": "4.11.3",
2558 + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.3.tgz",
2559 + "integrity": "sha512-zBQouZixDTbo3jMGqHKyePxYxr1e5W8UdTmBQ7sNtaA9M2bE32daxxPLS/jojhKOHxQ7LWwPjfiwf/fhaJWzlg==",
2560 + "dev": true,
2561 + "license": "MPL-2.0",
2562 + "engines": {
2563 + "node": ">=4"
2564 + }
2565 + },
2566 + "node_modules/axobject-query": {
2567 + "version": "4.1.0",
2568 + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
2569 + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
2570 + "dev": true,
2571 + "license": "Apache-2.0",
2572 + "engines": {
2573 + "node": ">= 0.4"
2574 + }
2575 + },
2576 + "node_modules/balanced-match": {
2577 + "version": "1.0.2",
2578 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
2579 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2580 + "dev": true,
2581 + "license": "MIT"
2582 + },
2583 + "node_modules/baseline-browser-mapping": {
2584 + "version": "2.10.21",
2585 + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz",
2586 + "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==",
2587 + "license": "Apache-2.0",
2588 + "bin": {
2589 + "baseline-browser-mapping": "dist/cli.cjs"
2590 + },
2591 + "engines": {
2592 + "node": ">=6.0.0"
2593 + }
2594 + },
2595 + "node_modules/bcrypt-pbkdf": {
2596 + "version": "1.0.2",
2597 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
2598 + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
2599 + "license": "BSD-3-Clause",
2600 + "dependencies": {
2601 + "tweetnacl": "^0.14.3"
2602 + }
2603 + },
2604 + "node_modules/brace-expansion": {
2605 + "version": "1.1.14",
2606 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
2607 + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
2608 + "dev": true,
2609 + "license": "MIT",
2610 + "dependencies": {
2611 + "balanced-match": "^1.0.0",
2612 + "concat-map": "0.0.1"
2613 + }
2614 + },
2615 + "node_modules/braces": {
2616 + "version": "3.0.3",
2617 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
2618 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
2619 + "dev": true,
2620 + "license": "MIT",
2621 + "dependencies": {
2622 + "fill-range": "^7.1.1"
2623 + },
2624 + "engines": {
2625 + "node": ">=8"
2626 + }
2627 + },
2628 + "node_modules/browserslist": {
2629 + "version": "4.28.2",
2630 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
2631 + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
2632 + "dev": true,
2633 + "funding": [
2634 + {
2635 + "type": "opencollective",
2636 + "url": "https://opencollective.com/browserslist"
2637 + },
2638 + {
2639 + "type": "tidelift",
2640 + "url": "https://tidelift.com/funding/github/npm/browserslist"
2641 + },
2642 + {
2643 + "type": "github",
2644 + "url": "https://github.com/sponsors/ai"
2645 + }
2646 + ],
2647 + "license": "MIT",
2648 + "dependencies": {
2649 + "baseline-browser-mapping": "^2.10.12",
2650 + "caniuse-lite": "^1.0.30001782",
2651 + "electron-to-chromium": "^1.5.328",
2652 + "node-releases": "^2.0.36",
2653 + "update-browserslist-db": "^1.2.3"
2654 + },
2655 + "bin": {
2656 + "browserslist": "cli.js"
2657 + },
2658 + "engines": {
2659 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
2660 + }
2661 + },
2662 + "node_modules/buildcheck": {
2663 + "version": "0.0.7",
2664 + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz",
2665 + "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==",
2666 + "optional": true,
2667 + "engines": {
2668 + "node": ">=10.0.0"
2669 + }
2670 + },
2671 + "node_modules/call-bind": {
2672 + "version": "1.0.9",
2673 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
2674 + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
2675 + "dev": true,
2676 + "license": "MIT",
2677 + "dependencies": {
2678 + "call-bind-apply-helpers": "^1.0.2",
2679 + "es-define-property": "^1.0.1",
2680 + "get-intrinsic": "^1.3.0",
2681 + "set-function-length": "^1.2.2"
2682 + },
2683 + "engines": {
2684 + "node": ">= 0.4"
2685 + },
2686 + "funding": {
2687 + "url": "https://github.com/sponsors/ljharb"
2688 + }
2689 + },
2690 + "node_modules/call-bind-apply-helpers": {
2691 + "version": "1.0.2",
2692 + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
2693 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
2694 + "dev": true,
2695 + "license": "MIT",
2696 + "dependencies": {
2697 + "es-errors": "^1.3.0",
2698 + "function-bind": "^1.1.2"
2699 + },
2700 + "engines": {
2701 + "node": ">= 0.4"
2702 + }
2703 + },
2704 + "node_modules/call-bound": {
2705 + "version": "1.0.4",
2706 + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
2707 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
2708 + "dev": true,
2709 + "license": "MIT",
2710 + "dependencies": {
2711 + "call-bind-apply-helpers": "^1.0.2",
2712 + "get-intrinsic": "^1.3.0"
2713 + },
2714 + "engines": {
2715 + "node": ">= 0.4"
2716 + },
2717 + "funding": {
2718 + "url": "https://github.com/sponsors/ljharb"
2719 + }
2720 + },
2721 + "node_modules/callsites": {
2722 + "version": "3.1.0",
2723 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
2724 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
2725 + "dev": true,
2726 + "license": "MIT",
2727 + "engines": {
2728 + "node": ">=6"
2729 + }
2730 + },
2731 + "node_modules/caniuse-lite": {
2732 + "version": "1.0.30001790",
2733 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz",
2734 + "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==",
2735 + "funding": [
2736 + {
2737 + "type": "opencollective",
2738 + "url": "https://opencollective.com/browserslist"
2739 + },
2740 + {
2741 + "type": "tidelift",
2742 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
2743 + },
2744 + {
2745 + "type": "github",
2746 + "url": "https://github.com/sponsors/ai"
2747 + }
2748 + ],
2749 + "license": "CC-BY-4.0"
2750 + },
2751 + "node_modules/chalk": {
2752 + "version": "4.1.2",
2753 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2754 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2755 + "dev": true,
2756 + "license": "MIT",
2757 + "dependencies": {
2758 + "ansi-styles": "^4.1.0",
2759 + "supports-color": "^7.1.0"
2760 + },
2761 + "engines": {
2762 + "node": ">=10"
2763 + },
2764 + "funding": {
2765 + "url": "https://github.com/chalk/chalk?sponsor=1"
2766 + }
2767 + },
2768 + "node_modules/client-only": {
2769 + "version": "0.0.1",
2770 + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
2771 + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
2772 + "license": "MIT"
2773 + },
2774 + "node_modules/color-convert": {
2775 + "version": "2.0.1",
2776 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2777 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2778 + "dev": true,
2779 + "license": "MIT",
2780 + "dependencies": {
2781 + "color-name": "~1.1.4"
2782 + },
2783 + "engines": {
2784 + "node": ">=7.0.0"
2785 + }
2786 + },
2787 + "node_modules/color-name": {
2788 + "version": "1.1.4",
2789 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2790 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2791 + "dev": true,
2792 + "license": "MIT"
2793 + },
2794 + "node_modules/concat-map": {
2795 + "version": "0.0.1",
2796 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2797 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
2798 + "dev": true,
2799 + "license": "MIT"
2800 + },
2801 + "node_modules/convert-source-map": {
2802 + "version": "2.0.0",
2803 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
2804 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
2805 + "dev": true,
2806 + "license": "MIT"
2807 + },
2808 + "node_modules/cpu-features": {
2809 + "version": "0.0.10",
2810 + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
2811 + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==",
2812 + "hasInstallScript": true,
2813 + "optional": true,
2814 + "dependencies": {
2815 + "buildcheck": "~0.0.6",
2816 + "nan": "^2.19.0"
2817 + },
2818 + "engines": {
2819 + "node": ">=10.0.0"
2820 + }
2821 + },
2822 + "node_modules/cross-spawn": {
2823 + "version": "7.0.6",
2824 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
2825 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
2826 + "dev": true,
2827 + "license": "MIT",
2828 + "dependencies": {
2829 + "path-key": "^3.1.0",
2830 + "shebang-command": "^2.0.0",
2831 + "which": "^2.0.1"
2832 + },
2833 + "engines": {
2834 + "node": ">= 8"
2835 + }
2836 + },
2837 + "node_modules/csstype": {
2838 + "version": "3.2.3",
2839 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
2840 + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
2841 + "dev": true,
2842 + "license": "MIT"
2843 + },
2844 + "node_modules/damerau-levenshtein": {
2845 + "version": "1.0.8",
2846 + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
2847 + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
2848 + "dev": true,
2849 + "license": "BSD-2-Clause"
2850 + },
2851 + "node_modules/data-view-buffer": {
2852 + "version": "1.0.2",
2853 + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
2854 + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
2855 + "dev": true,
2856 + "license": "MIT",
2857 + "dependencies": {
2858 + "call-bound": "^1.0.3",
2859 + "es-errors": "^1.3.0",
2860 + "is-data-view": "^1.0.2"
2861 + },
2862 + "engines": {
2863 + "node": ">= 0.4"
2864 + },
2865 + "funding": {
2866 + "url": "https://github.com/sponsors/ljharb"
2867 + }
2868 + },
2869 + "node_modules/data-view-byte-length": {
2870 + "version": "1.0.2",
2871 + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
2872 + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
2873 + "dev": true,
2874 + "license": "MIT",
2875 + "dependencies": {
2876 + "call-bound": "^1.0.3",
2877 + "es-errors": "^1.3.0",
2878 + "is-data-view": "^1.0.2"
2879 + },
2880 + "engines": {
2881 + "node": ">= 0.4"
2882 + },
2883 + "funding": {
2884 + "url": "https://github.com/sponsors/inspect-js"
2885 + }
2886 + },
2887 + "node_modules/data-view-byte-offset": {
2888 + "version": "1.0.1",
2889 + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
2890 + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
2891 + "dev": true,
2892 + "license": "MIT",
2893 + "dependencies": {
2894 + "call-bound": "^1.0.2",
2895 + "es-errors": "^1.3.0",
2896 + "is-data-view": "^1.0.1"
2897 + },
2898 + "engines": {
2899 + "node": ">= 0.4"
2900 + },
2901 + "funding": {
2902 + "url": "https://github.com/sponsors/ljharb"
2903 + }
2904 + },
2905 + "node_modules/debug": {
2906 + "version": "4.4.3",
2907 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
2908 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
2909 + "dev": true,
2910 + "license": "MIT",
2911 + "dependencies": {
2912 + "ms": "^2.1.3"
2913 + },
2914 + "engines": {
2915 + "node": ">=6.0"
2916 + },
2917 + "peerDependenciesMeta": {
2918 + "supports-color": {
2919 + "optional": true
2920 + }
2921 + }
2922 + },
2923 + "node_modules/deep-is": {
2924 + "version": "0.1.4",
2925 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
2926 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
2927 + "dev": true,
2928 + "license": "MIT"
2929 + },
2930 + "node_modules/define-data-property": {
2931 + "version": "1.1.4",
2932 + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
2933 + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
2934 + "dev": true,
2935 + "license": "MIT",
2936 + "dependencies": {
2937 + "es-define-property": "^1.0.0",
2938 + "es-errors": "^1.3.0",
2939 + "gopd": "^1.0.1"
2940 + },
2941 + "engines": {
2942 + "node": ">= 0.4"
2943 + },
2944 + "funding": {
2945 + "url": "https://github.com/sponsors/ljharb"
2946 + }
2947 + },
2948 + "node_modules/define-properties": {
2949 + "version": "1.2.1",
2950 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
2951 + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
2952 + "dev": true,
2953 + "license": "MIT",
2954 + "dependencies": {
2955 + "define-data-property": "^1.0.1",
2956 + "has-property-descriptors": "^1.0.0",
2957 + "object-keys": "^1.1.1"
2958 + },
2959 + "engines": {
2960 + "node": ">= 0.4"
2961 + },
2962 + "funding": {
2963 + "url": "https://github.com/sponsors/ljharb"
2964 + }
2965 + },
2966 + "node_modules/detect-libc": {
2967 + "version": "2.1.2",
2968 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
2969 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
2970 + "devOptional": true,
2971 + "license": "Apache-2.0",
2972 + "engines": {
2973 + "node": ">=8"
2974 + }
2975 + },
2976 + "node_modules/doctrine": {
2977 + "version": "2.1.0",
2978 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
2979 + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
2980 + "dev": true,
2981 + "license": "Apache-2.0",
2982 + "dependencies": {
2983 + "esutils": "^2.0.2"
2984 + },
2985 + "engines": {
2986 + "node": ">=0.10.0"
2987 + }
2988 + },
2989 + "node_modules/dunder-proto": {
2990 + "version": "1.0.1",
2991 + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
2992 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
2993 + "dev": true,
2994 + "license": "MIT",
2995 + "dependencies": {
2996 + "call-bind-apply-helpers": "^1.0.1",
2997 + "es-errors": "^1.3.0",
2998 + "gopd": "^1.2.0"
2999 + },
3000 + "engines": {
3001 + "node": ">= 0.4"
3002 + }
3003 + },
3004 + "node_modules/electron-to-chromium": {
3005 + "version": "1.5.344",
3006 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz",
3007 + "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==",
3008 + "dev": true,
3009 + "license": "ISC"
3010 + },
3011 + "node_modules/emoji-regex": {
3012 + "version": "9.2.2",
3013 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
3014 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
3015 + "dev": true,
3016 + "license": "MIT"
3017 + },
3018 + "node_modules/enhanced-resolve": {
3019 + "version": "5.20.1",
3020 + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
3021 + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==",
3022 + "dev": true,
3023 + "license": "MIT",
3024 + "dependencies": {
3025 + "graceful-fs": "^4.2.4",
3026 + "tapable": "^2.3.0"
3027 + },
3028 + "engines": {
3029 + "node": ">=10.13.0"
3030 + }
3031 + },
3032 + "node_modules/es-abstract": {
3033 + "version": "1.24.2",
3034 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz",
3035 + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==",
3036 + "dev": true,
3037 + "license": "MIT",
3038 + "dependencies": {
3039 + "array-buffer-byte-length": "^1.0.2",
3040 + "arraybuffer.prototype.slice": "^1.0.4",
3041 + "available-typed-arrays": "^1.0.7",
3042 + "call-bind": "^1.0.8",
3043 + "call-bound": "^1.0.4",
3044 + "data-view-buffer": "^1.0.2",
3045 + "data-view-byte-length": "^1.0.2",
3046 + "data-view-byte-offset": "^1.0.1",
3047 + "es-define-property": "^1.0.1",
3048 + "es-errors": "^1.3.0",
3049 + "es-object-atoms": "^1.1.1",
3050 + "es-set-tostringtag": "^2.1.0",
3051 + "es-to-primitive": "^1.3.0",
3052 + "function.prototype.name": "^1.1.8",
3053 + "get-intrinsic": "^1.3.0",
3054 + "get-proto": "^1.0.1",
3055 + "get-symbol-description": "^1.1.0",
3056 + "globalthis": "^1.0.4",
3057 + "gopd": "^1.2.0",
3058 + "has-property-descriptors": "^1.0.2",
3059 + "has-proto": "^1.2.0",
3060 + "has-symbols": "^1.1.0",
3061 + "hasown": "^2.0.2",
3062 + "internal-slot": "^1.1.0",
3063 + "is-array-buffer": "^3.0.5",
3064 + "is-callable": "^1.2.7",
3065 + "is-data-view": "^1.0.2",
3066 + "is-negative-zero": "^2.0.3",
3067 + "is-regex": "^1.2.1",
3068 + "is-set": "^2.0.3",
3069 + "is-shared-array-buffer": "^1.0.4",
3070 + "is-string": "^1.1.1",
3071 + "is-typed-array": "^1.1.15",
3072 + "is-weakref": "^1.1.1",
3073 + "math-intrinsics": "^1.1.0",
3074 + "object-inspect": "^1.13.4",
3075 + "object-keys": "^1.1.1",
3076 + "object.assign": "^4.1.7",
3077 + "own-keys": "^1.0.1",
3078 + "regexp.prototype.flags": "^1.5.4",
3079 + "safe-array-concat": "^1.1.3",
3080 + "safe-push-apply": "^1.0.0",
3081 + "safe-regex-test": "^1.1.0",
3082 + "set-proto": "^1.0.0",
3083 + "stop-iteration-iterator": "^1.1.0",
3084 + "string.prototype.trim": "^1.2.10",
3085 + "string.prototype.trimend": "^1.0.9",
3086 + "string.prototype.trimstart": "^1.0.8",
3087 + "typed-array-buffer": "^1.0.3",
3088 + "typed-array-byte-length": "^1.0.3",
3089 + "typed-array-byte-offset": "^1.0.4",
3090 + "typed-array-length": "^1.0.7",
3091 + "unbox-primitive": "^1.1.0",
3092 + "which-typed-array": "^1.1.19"
3093 + },
3094 + "engines": {
3095 + "node": ">= 0.4"
3096 + },
3097 + "funding": {
3098 + "url": "https://github.com/sponsors/ljharb"
3099 + }
3100 + },
3101 + "node_modules/es-define-property": {
3102 + "version": "1.0.1",
3103 + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
3104 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
3105 + "dev": true,
3106 + "license": "MIT",
3107 + "engines": {
3108 + "node": ">= 0.4"
3109 + }
3110 + },
3111 + "node_modules/es-errors": {
3112 + "version": "1.3.0",
3113 + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
3114 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
3115 + "dev": true,
3116 + "license": "MIT",
3117 + "engines": {
3118 + "node": ">= 0.4"
3119 + }
3120 + },
3121 + "node_modules/es-iterator-helpers": {
3122 + "version": "1.3.2",
3123 + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz",
3124 + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==",
3125 + "dev": true,
3126 + "license": "MIT",
3127 + "dependencies": {
3128 + "call-bind": "^1.0.9",
3129 + "call-bound": "^1.0.4",
3130 + "define-properties": "^1.2.1",
3131 + "es-abstract": "^1.24.2",
3132 + "es-errors": "^1.3.0",
3133 + "es-set-tostringtag": "^2.1.0",
3134 + "function-bind": "^1.1.2",
3135 + "get-intrinsic": "^1.3.0",
3136 + "globalthis": "^1.0.4",
3137 + "gopd": "^1.2.0",
3138 + "has-property-descriptors": "^1.0.2",
3139 + "has-proto": "^1.2.0",
3140 + "has-symbols": "^1.1.0",
3141 + "internal-slot": "^1.1.0",
3142 + "iterator.prototype": "^1.1.5",
3143 + "math-intrinsics": "^1.1.0"
3144 + },
3145 + "engines": {
3146 + "node": ">= 0.4"
3147 + }
3148 + },
3149 + "node_modules/es-object-atoms": {
3150 + "version": "1.1.1",
3151 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
3152 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
3153 + "dev": true,
3154 + "license": "MIT",
3155 + "dependencies": {
3156 + "es-errors": "^1.3.0"
3157 + },
3158 + "engines": {
3159 + "node": ">= 0.4"
3160 + }
3161 + },
3162 + "node_modules/es-set-tostringtag": {
3163 + "version": "2.1.0",
3164 + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
3165 + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
3166 + "dev": true,
3167 + "license": "MIT",
3168 + "dependencies": {
3169 + "es-errors": "^1.3.0",
3170 + "get-intrinsic": "^1.2.6",
3171 + "has-tostringtag": "^1.0.2",
3172 + "hasown": "^2.0.2"
3173 + },
3174 + "engines": {
3175 + "node": ">= 0.4"
3176 + }
3177 + },
3178 + "node_modules/es-shim-unscopables": {
3179 + "version": "1.1.0",
3180 + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
3181 + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
3182 + "dev": true,
3183 + "license": "MIT",
3184 + "dependencies": {
3185 + "hasown": "^2.0.2"
3186 + },
3187 + "engines": {
3188 + "node": ">= 0.4"
3189 + }
3190 + },
3191 + "node_modules/es-to-primitive": {
3192 + "version": "1.3.0",
3193 + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
3194 + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
3195 + "dev": true,
3196 + "license": "MIT",
3197 + "dependencies": {
3198 + "is-callable": "^1.2.7",
3199 + "is-date-object": "^1.0.5",
3200 + "is-symbol": "^1.0.4"
3201 + },
3202 + "engines": {
3203 + "node": ">= 0.4"
3204 + },
3205 + "funding": {
3206 + "url": "https://github.com/sponsors/ljharb"
3207 + }
3208 + },
3209 + "node_modules/escalade": {
3210 + "version": "3.2.0",
3211 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
3212 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
3213 + "dev": true,
3214 + "license": "MIT",
3215 + "engines": {
3216 + "node": ">=6"
3217 + }
3218 + },
3219 + "node_modules/escape-string-regexp": {
3220 + "version": "4.0.0",
3221 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
3222 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
3223 + "dev": true,
3224 + "license": "MIT",
3225 + "engines": {
3226 + "node": ">=10"
3227 + },
3228 + "funding": {
3229 + "url": "https://github.com/sponsors/sindresorhus"
3230 + }
3231 + },
3232 + "node_modules/eslint": {
3233 + "version": "9.39.4",
3234 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
3235 + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
3236 + "dev": true,
3237 + "license": "MIT",
3238 + "dependencies": {
3239 + "@eslint-community/eslint-utils": "^4.8.0",
3240 + "@eslint-community/regexpp": "^4.12.1",
3241 + "@eslint/config-array": "^0.21.2",
3242 + "@eslint/config-helpers": "^0.4.2",
3243 + "@eslint/core": "^0.17.0",
3244 + "@eslint/eslintrc": "^3.3.5",
3245 + "@eslint/js": "9.39.4",
3246 + "@eslint/plugin-kit": "^0.4.1",
3247 + "@humanfs/node": "^0.16.6",
3248 + "@humanwhocodes/module-importer": "^1.0.1",
3249 + "@humanwhocodes/retry": "^0.4.2",
3250 + "@types/estree": "^1.0.6",
3251 + "ajv": "^6.14.0",
3252 + "chalk": "^4.0.0",
3253 + "cross-spawn": "^7.0.6",
3254 + "debug": "^4.3.2",
3255 + "escape-string-regexp": "^4.0.0",
3256 + "eslint-scope": "^8.4.0",
3257 + "eslint-visitor-keys": "^4.2.1",
3258 + "espree": "^10.4.0",
3259 + "esquery": "^1.5.0",
3260 + "esutils": "^2.0.2",
3261 + "fast-deep-equal": "^3.1.3",
3262 + "file-entry-cache": "^8.0.0",
3263 + "find-up": "^5.0.0",
3264 + "glob-parent": "^6.0.2",
3265 + "ignore": "^5.2.0",
3266 + "imurmurhash": "^0.1.4",
3267 + "is-glob": "^4.0.0",
3268 + "json-stable-stringify-without-jsonify": "^1.0.1",
3269 + "lodash.merge": "^4.6.2",
3270 + "minimatch": "^3.1.5",
3271 + "natural-compare": "^1.4.0",
3272 + "optionator": "^0.9.3"
3273 + },
3274 + "bin": {
3275 + "eslint": "bin/eslint.js"
3276 + },
3277 + "engines": {
3278 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3279 + },
3280 + "funding": {
3281 + "url": "https://eslint.org/donate"
3282 + },
3283 + "peerDependencies": {
3284 + "jiti": "*"
3285 + },
3286 + "peerDependenciesMeta": {
3287 + "jiti": {
3288 + "optional": true
3289 + }
3290 + }
3291 + },
3292 + "node_modules/eslint-config-next": {
3293 + "version": "16.2.4",
3294 + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.4.tgz",
3295 + "integrity": "sha512-A6ekXYFj/YQxBPMl45g3e+U8zJo+X2+ZQwcz34pPKjpc/3S4roBA2Rd9xWB4FKuSxhofo1/95WjzmUY+wHrOhg==",
3296 + "dev": true,
3297 + "license": "MIT",
3298 + "dependencies": {
3299 + "@next/eslint-plugin-next": "16.2.4",
3300 + "eslint-import-resolver-node": "^0.3.6",
3301 + "eslint-import-resolver-typescript": "^3.5.2",
3302 + "eslint-plugin-import": "^2.32.0",
3303 + "eslint-plugin-jsx-a11y": "^6.10.0",
3304 + "eslint-plugin-react": "^7.37.0",
3305 + "eslint-plugin-react-hooks": "^7.0.0",
3306 + "globals": "16.4.0",
3307 + "typescript-eslint": "^8.46.0"
3308 + },
3309 + "peerDependencies": {
3310 + "eslint": ">=9.0.0",
3311 + "typescript": ">=3.3.1"
3312 + },
3313 + "peerDependenciesMeta": {
3314 + "typescript": {
3315 + "optional": true
3316 + }
3317 + }
3318 + },
3319 + "node_modules/eslint-config-next/node_modules/globals": {
3320 + "version": "16.4.0",
3321 + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
3322 + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
3323 + "dev": true,
3324 + "license": "MIT",
3325 + "engines": {
3326 + "node": ">=18"
3327 + },
3328 + "funding": {
3329 + "url": "https://github.com/sponsors/sindresorhus"
3330 + }
3331 + },
3332 + "node_modules/eslint-import-resolver-node": {
3333 + "version": "0.3.10",
3334 + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz",
3335 + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==",
3336 + "dev": true,
3337 + "license": "MIT",
3338 + "dependencies": {
3339 + "debug": "^3.2.7",
3340 + "is-core-module": "^2.16.1",
3341 + "resolve": "^2.0.0-next.6"
3342 + }
3343 + },
3344 + "node_modules/eslint-import-resolver-node/node_modules/debug": {
3345 + "version": "3.2.7",
3346 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
3347 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
3348 + "dev": true,
3349 + "license": "MIT",
3350 + "dependencies": {
3351 + "ms": "^2.1.1"
3352 + }
3353 + },
3354 + "node_modules/eslint-import-resolver-typescript": {
3355 + "version": "3.10.1",
3356 + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
3357 + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
3358 + "dev": true,
3359 + "license": "ISC",
3360 + "dependencies": {
3361 + "@nolyfill/is-core-module": "1.0.39",
3362 + "debug": "^4.4.0",
3363 + "get-tsconfig": "^4.10.0",
3364 + "is-bun-module": "^2.0.0",
3365 + "stable-hash": "^0.0.5",
3366 + "tinyglobby": "^0.2.13",
3367 + "unrs-resolver": "^1.6.2"
3368 + },
3369 + "engines": {
3370 + "node": "^14.18.0 || >=16.0.0"
3371 + },
3372 + "funding": {
3373 + "url": "https://opencollective.com/eslint-import-resolver-typescript"
3374 + },
3375 + "peerDependencies": {
3376 + "eslint": "*",
3377 + "eslint-plugin-import": "*",
3378 + "eslint-plugin-import-x": "*"
3379 + },
3380 + "peerDependenciesMeta": {
3381 + "eslint-plugin-import": {
3382 + "optional": true
3383 + },
3384 + "eslint-plugin-import-x": {
3385 + "optional": true
3386 + }
3387 + }
3388 + },
3389 + "node_modules/eslint-module-utils": {
3390 + "version": "2.12.1",
3391 + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
3392 + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
3393 + "dev": true,
3394 + "license": "MIT",
3395 + "dependencies": {
3396 + "debug": "^3.2.7"
3397 + },
3398 + "engines": {
3399 + "node": ">=4"
3400 + },
3401 + "peerDependenciesMeta": {
3402 + "eslint": {
3403 + "optional": true
3404 + }
3405 + }
3406 + },
3407 + "node_modules/eslint-module-utils/node_modules/debug": {
3408 + "version": "3.2.7",
3409 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
3410 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
3411 + "dev": true,
3412 + "license": "MIT",
3413 + "dependencies": {
3414 + "ms": "^2.1.1"
3415 + }
3416 + },
3417 + "node_modules/eslint-plugin-import": {
3418 + "version": "2.32.0",
3419 + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
3420 + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
3421 + "dev": true,
3422 + "license": "MIT",
3423 + "dependencies": {
3424 + "@rtsao/scc": "^1.1.0",
3425 + "array-includes": "^3.1.9",
3426 + "array.prototype.findlastindex": "^1.2.6",
3427 + "array.prototype.flat": "^1.3.3",
3428 + "array.prototype.flatmap": "^1.3.3",
3429 + "debug": "^3.2.7",
3430 + "doctrine": "^2.1.0",
3431 + "eslint-import-resolver-node": "^0.3.9",
3432 + "eslint-module-utils": "^2.12.1",
3433 + "hasown": "^2.0.2",
3434 + "is-core-module": "^2.16.1",
3435 + "is-glob": "^4.0.3",
3436 + "minimatch": "^3.1.2",
3437 + "object.fromentries": "^2.0.8",
3438 + "object.groupby": "^1.0.3",
3439 + "object.values": "^1.2.1",
3440 + "semver": "^6.3.1",
3441 + "string.prototype.trimend": "^1.0.9",
3442 + "tsconfig-paths": "^3.15.0"
3443 + },
3444 + "engines": {
3445 + "node": ">=4"
3446 + },
3447 + "peerDependencies": {
3448 + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
3449 + }
3450 + },
3451 + "node_modules/eslint-plugin-import/node_modules/debug": {
3452 + "version": "3.2.7",
3453 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
3454 + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
3455 + "dev": true,
3456 + "license": "MIT",
3457 + "dependencies": {
3458 + "ms": "^2.1.1"
3459 + }
3460 + },
3461 + "node_modules/eslint-plugin-jsx-a11y": {
3462 + "version": "6.10.2",
3463 + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
3464 + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
3465 + "dev": true,
3466 + "license": "MIT",
3467 + "dependencies": {
3468 + "aria-query": "^5.3.2",
3469 + "array-includes": "^3.1.8",
3470 + "array.prototype.flatmap": "^1.3.2",
3471 + "ast-types-flow": "^0.0.8",
3472 + "axe-core": "^4.10.0",
3473 + "axobject-query": "^4.1.0",
3474 + "damerau-levenshtein": "^1.0.8",
3475 + "emoji-regex": "^9.2.2",
3476 + "hasown": "^2.0.2",
3477 + "jsx-ast-utils": "^3.3.5",
3478 + "language-tags": "^1.0.9",
3479 + "minimatch": "^3.1.2",
3480 + "object.fromentries": "^2.0.8",
3481 + "safe-regex-test": "^1.0.3",
3482 + "string.prototype.includes": "^2.0.1"
3483 + },
3484 + "engines": {
3485 + "node": ">=4.0"
3486 + },
3487 + "peerDependencies": {
3488 + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
3489 + }
3490 + },
3491 + "node_modules/eslint-plugin-react": {
3492 + "version": "7.37.5",
3493 + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
3494 + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
3495 + "dev": true,
3496 + "license": "MIT",
3497 + "dependencies": {
3498 + "array-includes": "^3.1.8",
3499 + "array.prototype.findlast": "^1.2.5",
3500 + "array.prototype.flatmap": "^1.3.3",
3501 + "array.prototype.tosorted": "^1.1.4",
3502 + "doctrine": "^2.1.0",
3503 + "es-iterator-helpers": "^1.2.1",
3504 + "estraverse": "^5.3.0",
3505 + "hasown": "^2.0.2",
3506 + "jsx-ast-utils": "^2.4.1 || ^3.0.0",
3507 + "minimatch": "^3.1.2",
3508 + "object.entries": "^1.1.9",
3509 + "object.fromentries": "^2.0.8",
3510 + "object.values": "^1.2.1",
3511 + "prop-types": "^15.8.1",
3512 + "resolve": "^2.0.0-next.5",
3513 + "semver": "^6.3.1",
3514 + "string.prototype.matchall": "^4.0.12",
3515 + "string.prototype.repeat": "^1.0.0"
3516 + },
3517 + "engines": {
3518 + "node": ">=4"
3519 + },
3520 + "peerDependencies": {
3521 + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
3522 + }
3523 + },
3524 + "node_modules/eslint-plugin-react-hooks": {
3525 + "version": "7.1.1",
3526 + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
3527 + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
3528 + "dev": true,
3529 + "license": "MIT",
3530 + "dependencies": {
3531 + "@babel/core": "^7.24.4",
3532 + "@babel/parser": "^7.24.4",
3533 + "hermes-parser": "^0.25.1",
3534 + "zod": "^3.25.0 || ^4.0.0",
3535 + "zod-validation-error": "^3.5.0 || ^4.0.0"
3536 + },
3537 + "engines": {
3538 + "node": ">=18"
3539 + },
3540 + "peerDependencies": {
3541 + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
3542 + }
3543 + },
3544 + "node_modules/eslint-scope": {
3545 + "version": "8.4.0",
3546 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
3547 + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
3548 + "dev": true,
3549 + "license": "BSD-2-Clause",
3550 + "dependencies": {
3551 + "esrecurse": "^4.3.0",
3552 + "estraverse": "^5.2.0"
3553 + },
3554 + "engines": {
3555 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3556 + },
3557 + "funding": {
3558 + "url": "https://opencollective.com/eslint"
3559 + }
3560 + },
3561 + "node_modules/eslint-visitor-keys": {
3562 + "version": "4.2.1",
3563 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
3564 + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
3565 + "dev": true,
3566 + "license": "Apache-2.0",
3567 + "engines": {
3568 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3569 + },
3570 + "funding": {
3571 + "url": "https://opencollective.com/eslint"
3572 + }
3573 + },
3574 + "node_modules/espree": {
3575 + "version": "10.4.0",
3576 + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
3577 + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
3578 + "dev": true,
3579 + "license": "BSD-2-Clause",
3580 + "dependencies": {
3581 + "acorn": "^8.15.0",
3582 + "acorn-jsx": "^5.3.2",
3583 + "eslint-visitor-keys": "^4.2.1"
3584 + },
3585 + "engines": {
3586 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3587 + },
3588 + "funding": {
3589 + "url": "https://opencollective.com/eslint"
3590 + }
3591 + },
3592 + "node_modules/esquery": {
3593 + "version": "1.7.0",
3594 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
3595 + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
3596 + "dev": true,
3597 + "license": "BSD-3-Clause",
3598 + "dependencies": {
3599 + "estraverse": "^5.1.0"
3600 + },
3601 + "engines": {
3602 + "node": ">=0.10"
3603 + }
3604 + },
3605 + "node_modules/esrecurse": {
3606 + "version": "4.3.0",
3607 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
3608 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
3609 + "dev": true,
3610 + "license": "BSD-2-Clause",
3611 + "dependencies": {
3612 + "estraverse": "^5.2.0"
3613 + },
3614 + "engines": {
3615 + "node": ">=4.0"
3616 + }
3617 + },
3618 + "node_modules/estraverse": {
3619 + "version": "5.3.0",
3620 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
3621 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
3622 + "dev": true,
3623 + "license": "BSD-2-Clause",
3624 + "engines": {
3625 + "node": ">=4.0"
3626 + }
3627 + },
3628 + "node_modules/esutils": {
3629 + "version": "2.0.3",
3630 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
3631 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
3632 + "dev": true,
3633 + "license": "BSD-2-Clause",
3634 + "engines": {
3635 + "node": ">=0.10.0"
3636 + }
3637 + },
3638 + "node_modules/fast-deep-equal": {
3639 + "version": "3.1.3",
3640 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
3641 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
3642 + "dev": true,
3643 + "license": "MIT"
3644 + },
3645 + "node_modules/fast-glob": {
3646 + "version": "3.3.1",
3647 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
3648 + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
3649 + "dev": true,
3650 + "license": "MIT",
3651 + "dependencies": {
3652 + "@nodelib/fs.stat": "^2.0.2",
3653 + "@nodelib/fs.walk": "^1.2.3",
3654 + "glob-parent": "^5.1.2",
3655 + "merge2": "^1.3.0",
3656 + "micromatch": "^4.0.4"
3657 + },
3658 + "engines": {
3659 + "node": ">=8.6.0"
3660 + }
3661 + },
3662 + "node_modules/fast-glob/node_modules/glob-parent": {
3663 + "version": "5.1.2",
3664 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
3665 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
3666 + "dev": true,
3667 + "license": "ISC",
3668 + "dependencies": {
3669 + "is-glob": "^4.0.1"
3670 + },
3671 + "engines": {
3672 + "node": ">= 6"
3673 + }
3674 + },
3675 + "node_modules/fast-json-stable-stringify": {
3676 + "version": "2.1.0",
3677 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
3678 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
3679 + "dev": true,
3680 + "license": "MIT"
3681 + },
3682 + "node_modules/fast-levenshtein": {
3683 + "version": "2.0.6",
3684 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
3685 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
3686 + "dev": true,
3687 + "license": "MIT"
3688 + },
3689 + "node_modules/fastq": {
3690 + "version": "1.20.1",
3691 + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
3692 + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
3693 + "dev": true,
3694 + "license": "ISC",
3695 + "dependencies": {
3696 + "reusify": "^1.0.4"
3697 + }
3698 + },
3699 + "node_modules/file-entry-cache": {
3700 + "version": "8.0.0",
3701 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
3702 + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
3703 + "dev": true,
3704 + "license": "MIT",
3705 + "dependencies": {
3706 + "flat-cache": "^4.0.0"
3707 + },
3708 + "engines": {
3709 + "node": ">=16.0.0"
3710 + }
3711 + },
3712 + "node_modules/fill-range": {
3713 + "version": "7.1.1",
3714 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
3715 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
3716 + "dev": true,
3717 + "license": "MIT",
3718 + "dependencies": {
3719 + "to-regex-range": "^5.0.1"
3720 + },
3721 + "engines": {
3722 + "node": ">=8"
3723 + }
3724 + },
3725 + "node_modules/find-up": {
3726 + "version": "5.0.0",
3727 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
3728 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
3729 + "dev": true,
3730 + "license": "MIT",
3731 + "dependencies": {
3732 + "locate-path": "^6.0.0",
3733 + "path-exists": "^4.0.0"
3734 + },
3735 + "engines": {
3736 + "node": ">=10"
3737 + },
3738 + "funding": {
3739 + "url": "https://github.com/sponsors/sindresorhus"
3740 + }
3741 + },
3742 + "node_modules/flat-cache": {
3743 + "version": "4.0.1",
3744 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
3745 + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
3746 + "dev": true,
3747 + "license": "MIT",
3748 + "dependencies": {
3749 + "flatted": "^3.2.9",
3750 + "keyv": "^4.5.4"
3751 + },
3752 + "engines": {
3753 + "node": ">=16"
3754 + }
3755 + },
3756 + "node_modules/flatted": {
3757 + "version": "3.4.2",
3758 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
3759 + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
3760 + "dev": true,
3761 + "license": "ISC"
3762 + },
3763 + "node_modules/for-each": {
3764 + "version": "0.3.5",
3765 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
3766 + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
3767 + "dev": true,
3768 + "license": "MIT",
3769 + "dependencies": {
3770 + "is-callable": "^1.2.7"
3771 + },
3772 + "engines": {
3773 + "node": ">= 0.4"
3774 + },
3775 + "funding": {
3776 + "url": "https://github.com/sponsors/ljharb"
3777 + }
3778 + },
3779 + "node_modules/function-bind": {
3780 + "version": "1.1.2",
3781 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
3782 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
3783 + "dev": true,
3784 + "license": "MIT",
3785 + "funding": {
3786 + "url": "https://github.com/sponsors/ljharb"
3787 + }
3788 + },
3789 + "node_modules/function.prototype.name": {
3790 + "version": "1.1.8",
3791 + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
3792 + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
3793 + "dev": true,
3794 + "license": "MIT",
3795 + "dependencies": {
3796 + "call-bind": "^1.0.8",
3797 + "call-bound": "^1.0.3",
3798 + "define-properties": "^1.2.1",
3799 + "functions-have-names": "^1.2.3",
3800 + "hasown": "^2.0.2",
3801 + "is-callable": "^1.2.7"
3802 + },
3803 + "engines": {
3804 + "node": ">= 0.4"
3805 + },
3806 + "funding": {
3807 + "url": "https://github.com/sponsors/ljharb"
3808 + }
3809 + },
3810 + "node_modules/functions-have-names": {
3811 + "version": "1.2.3",
3812 + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
3813 + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
3814 + "dev": true,
3815 + "license": "MIT",
3816 + "funding": {
3817 + "url": "https://github.com/sponsors/ljharb"
3818 + }
3819 + },
3820 + "node_modules/generator-function": {
3821 + "version": "2.0.1",
3822 + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
3823 + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
3824 + "dev": true,
3825 + "license": "MIT",
3826 + "engines": {
3827 + "node": ">= 0.4"
3828 + }
3829 + },
3830 + "node_modules/gensync": {
3831 + "version": "1.0.0-beta.2",
3832 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
3833 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
3834 + "dev": true,
3835 + "license": "MIT",
3836 + "engines": {
3837 + "node": ">=6.9.0"
3838 + }
3839 + },
3840 + "node_modules/get-intrinsic": {
3841 + "version": "1.3.0",
3842 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
3843 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
3844 + "dev": true,
3845 + "license": "MIT",
3846 + "dependencies": {
3847 + "call-bind-apply-helpers": "^1.0.2",
3848 + "es-define-property": "^1.0.1",
3849 + "es-errors": "^1.3.0",
3850 + "es-object-atoms": "^1.1.1",
3851 + "function-bind": "^1.1.2",
3852 + "get-proto": "^1.0.1",
3853 + "gopd": "^1.2.0",
3854 + "has-symbols": "^1.1.0",
3855 + "hasown": "^2.0.2",
3856 + "math-intrinsics": "^1.1.0"
3857 + },
3858 + "engines": {
3859 + "node": ">= 0.4"
3860 + },
3861 + "funding": {
3862 + "url": "https://github.com/sponsors/ljharb"
3863 + }
3864 + },
3865 + "node_modules/get-proto": {
3866 + "version": "1.0.1",
3867 + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
3868 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
3869 + "dev": true,
3870 + "license": "MIT",
3871 + "dependencies": {
3872 + "dunder-proto": "^1.0.1",
3873 + "es-object-atoms": "^1.0.0"
3874 + },
3875 + "engines": {
3876 + "node": ">= 0.4"
3877 + }
3878 + },
3879 + "node_modules/get-symbol-description": {
3880 + "version": "1.1.0",
3881 + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
3882 + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
3883 + "dev": true,
3884 + "license": "MIT",
3885 + "dependencies": {
3886 + "call-bound": "^1.0.3",
3887 + "es-errors": "^1.3.0",
3888 + "get-intrinsic": "^1.2.6"
3889 + },
3890 + "engines": {
3891 + "node": ">= 0.4"
3892 + },
3893 + "funding": {
3894 + "url": "https://github.com/sponsors/ljharb"
3895 + }
3896 + },
3897 + "node_modules/get-tsconfig": {
3898 + "version": "4.14.0",
3899 + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
3900 + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
3901 + "dev": true,
3902 + "license": "MIT",
3903 + "dependencies": {
3904 + "resolve-pkg-maps": "^1.0.0"
3905 + },
3906 + "funding": {
3907 + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
3908 + }
3909 + },
3910 + "node_modules/glob-parent": {
3911 + "version": "6.0.2",
3912 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
3913 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
3914 + "dev": true,
3915 + "license": "ISC",
3916 + "dependencies": {
3917 + "is-glob": "^4.0.3"
3918 + },
3919 + "engines": {
3920 + "node": ">=10.13.0"
3921 + }
3922 + },
3923 + "node_modules/globals": {
3924 + "version": "14.0.0",
3925 + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
3926 + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
3927 + "dev": true,
3928 + "license": "MIT",
3929 + "engines": {
3930 + "node": ">=18"
3931 + },
3932 + "funding": {
3933 + "url": "https://github.com/sponsors/sindresorhus"
3934 + }
3935 + },
3936 + "node_modules/globalthis": {
3937 + "version": "1.0.4",
3938 + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
3939 + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
3940 + "dev": true,
3941 + "license": "MIT",
3942 + "dependencies": {
3943 + "define-properties": "^1.2.1",
3944 + "gopd": "^1.0.1"
3945 + },
3946 + "engines": {
3947 + "node": ">= 0.4"
3948 + },
3949 + "funding": {
3950 + "url": "https://github.com/sponsors/ljharb"
3951 + }
3952 + },
3953 + "node_modules/gopd": {
3954 + "version": "1.2.0",
3955 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
3956 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
3957 + "dev": true,
3958 + "license": "MIT",
3959 + "engines": {
3960 + "node": ">= 0.4"
3961 + },
3962 + "funding": {
3963 + "url": "https://github.com/sponsors/ljharb"
3964 + }
3965 + },
3966 + "node_modules/graceful-fs": {
3967 + "version": "4.2.11",
3968 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
3969 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
3970 + "dev": true,
3971 + "license": "ISC"
3972 + },
3973 + "node_modules/has-bigints": {
3974 + "version": "1.1.0",
3975 + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
3976 + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
3977 + "dev": true,
3978 + "license": "MIT",
3979 + "engines": {
3980 + "node": ">= 0.4"
3981 + },
3982 + "funding": {
3983 + "url": "https://github.com/sponsors/ljharb"
3984 + }
3985 + },
3986 + "node_modules/has-flag": {
3987 + "version": "4.0.0",
3988 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
3989 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
3990 + "dev": true,
3991 + "license": "MIT",
3992 + "engines": {
3993 + "node": ">=8"
3994 + }
3995 + },
3996 + "node_modules/has-property-descriptors": {
3997 + "version": "1.0.2",
3998 + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
3999 + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
4000 + "dev": true,
4001 + "license": "MIT",
4002 + "dependencies": {
4003 + "es-define-property": "^1.0.0"
4004 + },
4005 + "funding": {
4006 + "url": "https://github.com/sponsors/ljharb"
4007 + }
4008 + },
4009 + "node_modules/has-proto": {
4010 + "version": "1.2.0",
4011 + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
4012 + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
4013 + "dev": true,
4014 + "license": "MIT",
4015 + "dependencies": {
4016 + "dunder-proto": "^1.0.0"
4017 + },
4018 + "engines": {
4019 + "node": ">= 0.4"
4020 + },
4021 + "funding": {
4022 + "url": "https://github.com/sponsors/ljharb"
4023 + }
4024 + },
4025 + "node_modules/has-symbols": {
4026 + "version": "1.1.0",
4027 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
4028 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
4029 + "dev": true,
4030 + "license": "MIT",
4031 + "engines": {
4032 + "node": ">= 0.4"
4033 + },
4034 + "funding": {
4035 + "url": "https://github.com/sponsors/ljharb"
4036 + }
4037 + },
4038 + "node_modules/has-tostringtag": {
4039 + "version": "1.0.2",
4040 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
4041 + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
4042 + "dev": true,
4043 + "license": "MIT",
4044 + "dependencies": {
4045 + "has-symbols": "^1.0.3"
4046 + },
4047 + "engines": {
4048 + "node": ">= 0.4"
4049 + },
4050 + "funding": {
4051 + "url": "https://github.com/sponsors/ljharb"
4052 + }
4053 + },
4054 + "node_modules/hasown": {
4055 + "version": "2.0.3",
4056 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
4057 + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
4058 + "dev": true,
4059 + "license": "MIT",
4060 + "dependencies": {
4061 + "function-bind": "^1.1.2"
4062 + },
4063 + "engines": {
4064 + "node": ">= 0.4"
4065 + }
4066 + },
4067 + "node_modules/hermes-estree": {
4068 + "version": "0.25.1",
4069 + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
4070 + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
4071 + "dev": true,
4072 + "license": "MIT"
4073 + },
4074 + "node_modules/hermes-parser": {
4075 + "version": "0.25.1",
4076 + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
4077 + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
4078 + "dev": true,
4079 + "license": "MIT",
4080 + "dependencies": {
4081 + "hermes-estree": "0.25.1"
4082 + }
4083 + },
4084 + "node_modules/ignore": {
4085 + "version": "5.3.2",
4086 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
4087 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
4088 + "dev": true,
4089 + "license": "MIT",
4090 + "engines": {
4091 + "node": ">= 4"
4092 + }
4093 + },
4094 + "node_modules/import-fresh": {
4095 + "version": "3.3.1",
4096 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
4097 + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
4098 + "dev": true,
4099 + "license": "MIT",
4100 + "dependencies": {
4101 + "parent-module": "^1.0.0",
4102 + "resolve-from": "^4.0.0"
4103 + },
4104 + "engines": {
4105 + "node": ">=6"
4106 + },
4107 + "funding": {
4108 + "url": "https://github.com/sponsors/sindresorhus"
4109 + }
4110 + },
4111 + "node_modules/imurmurhash": {
4112 + "version": "0.1.4",
4113 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
4114 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
4115 + "dev": true,
4116 + "license": "MIT",
4117 + "engines": {
4118 + "node": ">=0.8.19"
4119 + }
4120 + },
4121 + "node_modules/internal-slot": {
4122 + "version": "1.1.0",
4123 + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
4124 + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
4125 + "dev": true,
4126 + "license": "MIT",
4127 + "dependencies": {
4128 + "es-errors": "^1.3.0",
4129 + "hasown": "^2.0.2",
4130 + "side-channel": "^1.1.0"
4131 + },
4132 + "engines": {
4133 + "node": ">= 0.4"
4134 + }
4135 + },
4136 + "node_modules/is-array-buffer": {
4137 + "version": "3.0.5",
4138 + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
4139 + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
4140 + "dev": true,
4141 + "license": "MIT",
4142 + "dependencies": {
4143 + "call-bind": "^1.0.8",
4144 + "call-bound": "^1.0.3",
4145 + "get-intrinsic": "^1.2.6"
4146 + },
4147 + "engines": {
4148 + "node": ">= 0.4"
4149 + },
4150 + "funding": {
4151 + "url": "https://github.com/sponsors/ljharb"
4152 + }
4153 + },
4154 + "node_modules/is-async-function": {
4155 + "version": "2.1.1",
4156 + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
4157 + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
4158 + "dev": true,
4159 + "license": "MIT",
4160 + "dependencies": {
4161 + "async-function": "^1.0.0",
4162 + "call-bound": "^1.0.3",
4163 + "get-proto": "^1.0.1",
4164 + "has-tostringtag": "^1.0.2",
4165 + "safe-regex-test": "^1.1.0"
4166 + },
4167 + "engines": {
4168 + "node": ">= 0.4"
4169 + },
4170 + "funding": {
4171 + "url": "https://github.com/sponsors/ljharb"
4172 + }
4173 + },
4174 + "node_modules/is-bigint": {
4175 + "version": "1.1.0",
4176 + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
4177 + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
4178 + "dev": true,
4179 + "license": "MIT",
4180 + "dependencies": {
4181 + "has-bigints": "^1.0.2"
4182 + },
4183 + "engines": {
4184 + "node": ">= 0.4"
4185 + },
4186 + "funding": {
4187 + "url": "https://github.com/sponsors/ljharb"
4188 + }
4189 + },
4190 + "node_modules/is-boolean-object": {
4191 + "version": "1.2.2",
4192 + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
4193 + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
4194 + "dev": true,
4195 + "license": "MIT",
4196 + "dependencies": {
4197 + "call-bound": "^1.0.3",
4198 + "has-tostringtag": "^1.0.2"
4199 + },
4200 + "engines": {
4201 + "node": ">= 0.4"
4202 + },
4203 + "funding": {
4204 + "url": "https://github.com/sponsors/ljharb"
4205 + }
4206 + },
4207 + "node_modules/is-bun-module": {
4208 + "version": "2.0.0",
4209 + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
4210 + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
4211 + "dev": true,
4212 + "license": "MIT",
4213 + "dependencies": {
4214 + "semver": "^7.7.1"
4215 + }
4216 + },
4217 + "node_modules/is-bun-module/node_modules/semver": {
4218 + "version": "7.7.4",
4219 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
4220 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
4221 + "dev": true,
4222 + "license": "ISC",
4223 + "bin": {
4224 + "semver": "bin/semver.js"
4225 + },
4226 + "engines": {
4227 + "node": ">=10"
4228 + }
4229 + },
4230 + "node_modules/is-callable": {
4231 + "version": "1.2.7",
4232 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
4233 + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
4234 + "dev": true,
4235 + "license": "MIT",
4236 + "engines": {
4237 + "node": ">= 0.4"
4238 + },
4239 + "funding": {
4240 + "url": "https://github.com/sponsors/ljharb"
4241 + }
4242 + },
4243 + "node_modules/is-core-module": {
4244 + "version": "2.16.1",
4245 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
4246 + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
4247 + "dev": true,
4248 + "license": "MIT",
4249 + "dependencies": {
4250 + "hasown": "^2.0.2"
4251 + },
4252 + "engines": {
4253 + "node": ">= 0.4"
4254 + },
4255 + "funding": {
4256 + "url": "https://github.com/sponsors/ljharb"
4257 + }
4258 + },
4259 + "node_modules/is-data-view": {
4260 + "version": "1.0.2",
4261 + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
4262 + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
4263 + "dev": true,
4264 + "license": "MIT",
4265 + "dependencies": {
4266 + "call-bound": "^1.0.2",
4267 + "get-intrinsic": "^1.2.6",
4268 + "is-typed-array": "^1.1.13"
4269 + },
4270 + "engines": {
4271 + "node": ">= 0.4"
4272 + },
4273 + "funding": {
4274 + "url": "https://github.com/sponsors/ljharb"
4275 + }
4276 + },
4277 + "node_modules/is-date-object": {
4278 + "version": "1.1.0",
4279 + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
4280 + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
4281 + "dev": true,
4282 + "license": "MIT",
4283 + "dependencies": {
4284 + "call-bound": "^1.0.2",
4285 + "has-tostringtag": "^1.0.2"
4286 + },
4287 + "engines": {
4288 + "node": ">= 0.4"
4289 + },
4290 + "funding": {
4291 + "url": "https://github.com/sponsors/ljharb"
4292 + }
4293 + },
4294 + "node_modules/is-extglob": {
4295 + "version": "2.1.1",
4296 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
4297 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
4298 + "dev": true,
4299 + "license": "MIT",
4300 + "engines": {
4301 + "node": ">=0.10.0"
4302 + }
4303 + },
4304 + "node_modules/is-finalizationregistry": {
4305 + "version": "1.1.1",
4306 + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
4307 + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
4308 + "dev": true,
4309 + "license": "MIT",
4310 + "dependencies": {
4311 + "call-bound": "^1.0.3"
4312 + },
4313 + "engines": {
4314 + "node": ">= 0.4"
4315 + },
4316 + "funding": {
4317 + "url": "https://github.com/sponsors/ljharb"
4318 + }
4319 + },
4320 + "node_modules/is-generator-function": {
4321 + "version": "1.1.2",
4322 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
4323 + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
4324 + "dev": true,
4325 + "license": "MIT",
4326 + "dependencies": {
4327 + "call-bound": "^1.0.4",
4328 + "generator-function": "^2.0.0",
4329 + "get-proto": "^1.0.1",
4330 + "has-tostringtag": "^1.0.2",
4331 + "safe-regex-test": "^1.1.0"
4332 + },
4333 + "engines": {
4334 + "node": ">= 0.4"
4335 + },
4336 + "funding": {
4337 + "url": "https://github.com/sponsors/ljharb"
4338 + }
4339 + },
4340 + "node_modules/is-glob": {
4341 + "version": "4.0.3",
4342 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
4343 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
4344 + "dev": true,
4345 + "license": "MIT",
4346 + "dependencies": {
4347 + "is-extglob": "^2.1.1"
4348 + },
4349 + "engines": {
4350 + "node": ">=0.10.0"
4351 + }
4352 + },
4353 + "node_modules/is-map": {
4354 + "version": "2.0.3",
4355 + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
4356 + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
4357 + "dev": true,
4358 + "license": "MIT",
4359 + "engines": {
4360 + "node": ">= 0.4"
4361 + },
4362 + "funding": {
4363 + "url": "https://github.com/sponsors/ljharb"
4364 + }
4365 + },
4366 + "node_modules/is-negative-zero": {
4367 + "version": "2.0.3",
4368 + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
4369 + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
4370 + "dev": true,
4371 + "license": "MIT",
4372 + "engines": {
4373 + "node": ">= 0.4"
4374 + },
4375 + "funding": {
4376 + "url": "https://github.com/sponsors/ljharb"
4377 + }
4378 + },
4379 + "node_modules/is-number": {
4380 + "version": "7.0.0",
4381 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
4382 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
4383 + "dev": true,
4384 + "license": "MIT",
4385 + "engines": {
4386 + "node": ">=0.12.0"
4387 + }
4388 + },
4389 + "node_modules/is-number-object": {
4390 + "version": "1.1.1",
4391 + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
4392 + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
4393 + "dev": true,
4394 + "license": "MIT",
4395 + "dependencies": {
4396 + "call-bound": "^1.0.3",
4397 + "has-tostringtag": "^1.0.2"
4398 + },
4399 + "engines": {
4400 + "node": ">= 0.4"
4401 + },
4402 + "funding": {
4403 + "url": "https://github.com/sponsors/ljharb"
4404 + }
4405 + },
4406 + "node_modules/is-regex": {
4407 + "version": "1.2.1",
4408 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
4409 + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
4410 + "dev": true,
4411 + "license": "MIT",
4412 + "dependencies": {
4413 + "call-bound": "^1.0.2",
4414 + "gopd": "^1.2.0",
4415 + "has-tostringtag": "^1.0.2",
4416 + "hasown": "^2.0.2"
4417 + },
4418 + "engines": {
4419 + "node": ">= 0.4"
4420 + },
4421 + "funding": {
4422 + "url": "https://github.com/sponsors/ljharb"
4423 + }
4424 + },
4425 + "node_modules/is-set": {
4426 + "version": "2.0.3",
4427 + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
4428 + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
4429 + "dev": true,
4430 + "license": "MIT",
4431 + "engines": {
4432 + "node": ">= 0.4"
4433 + },
4434 + "funding": {
4435 + "url": "https://github.com/sponsors/ljharb"
4436 + }
4437 + },
4438 + "node_modules/is-shared-array-buffer": {
4439 + "version": "1.0.4",
4440 + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
4441 + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
4442 + "dev": true,
4443 + "license": "MIT",
4444 + "dependencies": {
4445 + "call-bound": "^1.0.3"
4446 + },
4447 + "engines": {
4448 + "node": ">= 0.4"
4449 + },
4450 + "funding": {
4451 + "url": "https://github.com/sponsors/ljharb"
4452 + }
4453 + },
4454 + "node_modules/is-string": {
4455 + "version": "1.1.1",
4456 + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
4457 + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
4458 + "dev": true,
4459 + "license": "MIT",
4460 + "dependencies": {
4461 + "call-bound": "^1.0.3",
4462 + "has-tostringtag": "^1.0.2"
4463 + },
4464 + "engines": {
4465 + "node": ">= 0.4"
4466 + },
4467 + "funding": {
4468 + "url": "https://github.com/sponsors/ljharb"
4469 + }
4470 + },
4471 + "node_modules/is-symbol": {
4472 + "version": "1.1.1",
4473 + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
4474 + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
4475 + "dev": true,
4476 + "license": "MIT",
4477 + "dependencies": {
4478 + "call-bound": "^1.0.2",
4479 + "has-symbols": "^1.1.0",
4480 + "safe-regex-test": "^1.1.0"
4481 + },
4482 + "engines": {
4483 + "node": ">= 0.4"
4484 + },
4485 + "funding": {
4486 + "url": "https://github.com/sponsors/ljharb"
4487 + }
4488 + },
4489 + "node_modules/is-typed-array": {
4490 + "version": "1.1.15",
4491 + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
4492 + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
4493 + "dev": true,
4494 + "license": "MIT",
4495 + "dependencies": {
4496 + "which-typed-array": "^1.1.16"
4497 + },
4498 + "engines": {
4499 + "node": ">= 0.4"
4500 + },
4501 + "funding": {
4502 + "url": "https://github.com/sponsors/ljharb"
4503 + }
4504 + },
4505 + "node_modules/is-weakmap": {
4506 + "version": "2.0.2",
4507 + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
4508 + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
4509 + "dev": true,
4510 + "license": "MIT",
4511 + "engines": {
4512 + "node": ">= 0.4"
4513 + },
4514 + "funding": {
4515 + "url": "https://github.com/sponsors/ljharb"
4516 + }
4517 + },
4518 + "node_modules/is-weakref": {
4519 + "version": "1.1.1",
4520 + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
4521 + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
4522 + "dev": true,
4523 + "license": "MIT",
4524 + "dependencies": {
4525 + "call-bound": "^1.0.3"
4526 + },
4527 + "engines": {
4528 + "node": ">= 0.4"
4529 + },
4530 + "funding": {
4531 + "url": "https://github.com/sponsors/ljharb"
4532 + }
4533 + },
4534 + "node_modules/is-weakset": {
4535 + "version": "2.0.4",
4536 + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
4537 + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
4538 + "dev": true,
4539 + "license": "MIT",
4540 + "dependencies": {
4541 + "call-bound": "^1.0.3",
4542 + "get-intrinsic": "^1.2.6"
4543 + },
4544 + "engines": {
4545 + "node": ">= 0.4"
4546 + },
4547 + "funding": {
4548 + "url": "https://github.com/sponsors/ljharb"
4549 + }
4550 + },
4551 + "node_modules/isarray": {
4552 + "version": "2.0.5",
4553 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
4554 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
4555 + "dev": true,
4556 + "license": "MIT"
4557 + },
4558 + "node_modules/isexe": {
4559 + "version": "2.0.0",
4560 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
4561 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
4562 + "dev": true,
4563 + "license": "ISC"
4564 + },
4565 + "node_modules/iterator.prototype": {
4566 + "version": "1.1.5",
4567 + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
4568 + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
4569 + "dev": true,
4570 + "license": "MIT",
4571 + "dependencies": {
4572 + "define-data-property": "^1.1.4",
4573 + "es-object-atoms": "^1.0.0",
4574 + "get-intrinsic": "^1.2.6",
4575 + "get-proto": "^1.0.0",
4576 + "has-symbols": "^1.1.0",
4577 + "set-function-name": "^2.0.2"
4578 + },
4579 + "engines": {
4580 + "node": ">= 0.4"
4581 + }
4582 + },
4583 + "node_modules/jiti": {
4584 + "version": "2.6.1",
4585 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
4586 + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
4587 + "dev": true,
4588 + "license": "MIT",
4589 + "bin": {
4590 + "jiti": "lib/jiti-cli.mjs"
4591 + }
4592 + },
4593 + "node_modules/js-tokens": {
4594 + "version": "4.0.0",
4595 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
4596 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
4597 + "dev": true,
4598 + "license": "MIT"
4599 + },
4600 + "node_modules/js-yaml": {
4601 + "version": "4.1.1",
4602 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
4603 + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
4604 + "dev": true,
4605 + "license": "MIT",
4606 + "dependencies": {
4607 + "argparse": "^2.0.1"
4608 + },
4609 + "bin": {
4610 + "js-yaml": "bin/js-yaml.js"
4611 + }
4612 + },
4613 + "node_modules/jsesc": {
4614 + "version": "3.1.0",
4615 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
4616 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
4617 + "dev": true,
4618 + "license": "MIT",
4619 + "bin": {
4620 + "jsesc": "bin/jsesc"
4621 + },
4622 + "engines": {
4623 + "node": ">=6"
4624 + }
4625 + },
4626 + "node_modules/json-buffer": {
4627 + "version": "3.0.1",
4628 + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
4629 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
4630 + "dev": true,
4631 + "license": "MIT"
4632 + },
4633 + "node_modules/json-schema-traverse": {
4634 + "version": "0.4.1",
4635 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
4636 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
4637 + "dev": true,
4638 + "license": "MIT"
4639 + },
4640 + "node_modules/json-stable-stringify-without-jsonify": {
4641 + "version": "1.0.1",
4642 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
4643 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
4644 + "dev": true,
4645 + "license": "MIT"
4646 + },
4647 + "node_modules/json5": {
4648 + "version": "2.2.3",
4649 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
4650 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
4651 + "dev": true,
4652 + "license": "MIT",
4653 + "bin": {
4654 + "json5": "lib/cli.js"
4655 + },
4656 + "engines": {
4657 + "node": ">=6"
4658 + }
4659 + },
4660 + "node_modules/jsx-ast-utils": {
4661 + "version": "3.3.5",
4662 + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
4663 + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
4664 + "dev": true,
4665 + "license": "MIT",
4666 + "dependencies": {
4667 + "array-includes": "^3.1.6",
4668 + "array.prototype.flat": "^1.3.1",
4669 + "object.assign": "^4.1.4",
4670 + "object.values": "^1.1.6"
4671 + },
4672 + "engines": {
4673 + "node": ">=4.0"
4674 + }
4675 + },
4676 + "node_modules/keyv": {
4677 + "version": "4.5.4",
4678 + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
4679 + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
4680 + "dev": true,
4681 + "license": "MIT",
4682 + "dependencies": {
4683 + "json-buffer": "3.0.1"
4684 + }
4685 + },
4686 + "node_modules/language-subtag-registry": {
4687 + "version": "0.3.23",
4688 + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
4689 + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
4690 + "dev": true,
4691 + "license": "CC0-1.0"
4692 + },
4693 + "node_modules/language-tags": {
4694 + "version": "1.0.9",
4695 + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
4696 + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
4697 + "dev": true,
4698 + "license": "MIT",
4699 + "dependencies": {
4700 + "language-subtag-registry": "^0.3.20"
4701 + },
4702 + "engines": {
4703 + "node": ">=0.10"
4704 + }
4705 + },
4706 + "node_modules/levn": {
4707 + "version": "0.4.1",
4708 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
4709 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
4710 + "dev": true,
4711 + "license": "MIT",
4712 + "dependencies": {
4713 + "prelude-ls": "^1.2.1",
4714 + "type-check": "~0.4.0"
4715 + },
4716 + "engines": {
4717 + "node": ">= 0.8.0"
4718 + }
4719 + },
4720 + "node_modules/lightningcss": {
4721 + "version": "1.32.0",
4722 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
4723 + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
4724 + "dev": true,
4725 + "license": "MPL-2.0",
4726 + "dependencies": {
4727 + "detect-libc": "^2.0.3"
4728 + },
4729 + "engines": {
4730 + "node": ">= 12.0.0"
4731 + },
4732 + "funding": {
4733 + "type": "opencollective",
4734 + "url": "https://opencollective.com/parcel"
4735 + },
4736 + "optionalDependencies": {
4737 + "lightningcss-android-arm64": "1.32.0",
4738 + "lightningcss-darwin-arm64": "1.32.0",
4739 + "lightningcss-darwin-x64": "1.32.0",
4740 + "lightningcss-freebsd-x64": "1.32.0",
4741 + "lightningcss-linux-arm-gnueabihf": "1.32.0",
4742 + "lightningcss-linux-arm64-gnu": "1.32.0",
4743 + "lightningcss-linux-arm64-musl": "1.32.0",
4744 + "lightningcss-linux-x64-gnu": "1.32.0",
4745 + "lightningcss-linux-x64-musl": "1.32.0",
4746 + "lightningcss-win32-arm64-msvc": "1.32.0",
4747 + "lightningcss-win32-x64-msvc": "1.32.0"
4748 + }
4749 + },
4750 + "node_modules/lightningcss-android-arm64": {
4751 + "version": "1.32.0",
4752 + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
4753 + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
4754 + "cpu": [
4755 + "arm64"
4756 + ],
4757 + "dev": true,
4758 + "license": "MPL-2.0",
4759 + "optional": true,
4760 + "os": [
4761 + "android"
4762 + ],
4763 + "engines": {
4764 + "node": ">= 12.0.0"
4765 + },
4766 + "funding": {
4767 + "type": "opencollective",
4768 + "url": "https://opencollective.com/parcel"
4769 + }
4770 + },
4771 + "node_modules/lightningcss-darwin-arm64": {
4772 + "version": "1.32.0",
4773 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
4774 + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
4775 + "cpu": [
4776 + "arm64"
4777 + ],
4778 + "dev": true,
4779 + "license": "MPL-2.0",
4780 + "optional": true,
4781 + "os": [
4782 + "darwin"
4783 + ],
4784 + "engines": {
4785 + "node": ">= 12.0.0"
4786 + },
4787 + "funding": {
4788 + "type": "opencollective",
4789 + "url": "https://opencollective.com/parcel"
4790 + }
4791 + },
4792 + "node_modules/lightningcss-darwin-x64": {
4793 + "version": "1.32.0",
4794 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
4795 + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
4796 + "cpu": [
4797 + "x64"
4798 + ],
4799 + "dev": true,
4800 + "license": "MPL-2.0",
4801 + "optional": true,
4802 + "os": [
4803 + "darwin"
4804 + ],
4805 + "engines": {
4806 + "node": ">= 12.0.0"
4807 + },
4808 + "funding": {
4809 + "type": "opencollective",
4810 + "url": "https://opencollective.com/parcel"
4811 + }
4812 + },
4813 + "node_modules/lightningcss-freebsd-x64": {
4814 + "version": "1.32.0",
4815 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
4816 + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
4817 + "cpu": [
4818 + "x64"
4819 + ],
4820 + "dev": true,
4821 + "license": "MPL-2.0",
4822 + "optional": true,
4823 + "os": [
4824 + "freebsd"
4825 + ],
4826 + "engines": {
4827 + "node": ">= 12.0.0"
4828 + },
4829 + "funding": {
4830 + "type": "opencollective",
4831 + "url": "https://opencollective.com/parcel"
4832 + }
4833 + },
4834 + "node_modules/lightningcss-linux-arm-gnueabihf": {
4835 + "version": "1.32.0",
4836 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
4837 + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
4838 + "cpu": [
4839 + "arm"
4840 + ],
4841 + "dev": true,
4842 + "license": "MPL-2.0",
4843 + "optional": true,
4844 + "os": [
4845 + "linux"
4846 + ],
4847 + "engines": {
4848 + "node": ">= 12.0.0"
4849 + },
4850 + "funding": {
4851 + "type": "opencollective",
4852 + "url": "https://opencollective.com/parcel"
4853 + }
4854 + },
4855 + "node_modules/lightningcss-linux-arm64-gnu": {
4856 + "version": "1.32.0",
4857 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
4858 + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
4859 + "cpu": [
4860 + "arm64"
4861 + ],
4862 + "dev": true,
4863 + "libc": [
4864 + "glibc"
4865 + ],
4866 + "license": "MPL-2.0",
4867 + "optional": true,
4868 + "os": [
4869 + "linux"
4870 + ],
4871 + "engines": {
4872 + "node": ">= 12.0.0"
4873 + },
4874 + "funding": {
4875 + "type": "opencollective",
4876 + "url": "https://opencollective.com/parcel"
4877 + }
4878 + },
4879 + "node_modules/lightningcss-linux-arm64-musl": {
4880 + "version": "1.32.0",
4881 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
4882 + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
4883 + "cpu": [
4884 + "arm64"
4885 + ],
4886 + "dev": true,
4887 + "libc": [
4888 + "musl"
4889 + ],
4890 + "license": "MPL-2.0",
4891 + "optional": true,
4892 + "os": [
4893 + "linux"
4894 + ],
4895 + "engines": {
4896 + "node": ">= 12.0.0"
4897 + },
4898 + "funding": {
4899 + "type": "opencollective",
4900 + "url": "https://opencollective.com/parcel"
4901 + }
4902 + },
4903 + "node_modules/lightningcss-linux-x64-gnu": {
4904 + "version": "1.32.0",
4905 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
4906 + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
4907 + "cpu": [
4908 + "x64"
4909 + ],
4910 + "dev": true,
4911 + "libc": [
4912 + "glibc"
4913 + ],
4914 + "license": "MPL-2.0",
4915 + "optional": true,
4916 + "os": [
4917 + "linux"
4918 + ],
4919 + "engines": {
4920 + "node": ">= 12.0.0"
4921 + },
4922 + "funding": {
4923 + "type": "opencollective",
4924 + "url": "https://opencollective.com/parcel"
4925 + }
4926 + },
4927 + "node_modules/lightningcss-linux-x64-musl": {
4928 + "version": "1.32.0",
4929 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
4930 + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
4931 + "cpu": [
4932 + "x64"
4933 + ],
4934 + "dev": true,
4935 + "libc": [
4936 + "musl"
4937 + ],
4938 + "license": "MPL-2.0",
4939 + "optional": true,
4940 + "os": [
4941 + "linux"
4942 + ],
4943 + "engines": {
4944 + "node": ">= 12.0.0"
4945 + },
4946 + "funding": {
4947 + "type": "opencollective",
4948 + "url": "https://opencollective.com/parcel"
4949 + }
4950 + },
4951 + "node_modules/lightningcss-win32-arm64-msvc": {
4952 + "version": "1.32.0",
4953 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
4954 + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
4955 + "cpu": [
4956 + "arm64"
4957 + ],
4958 + "dev": true,
4959 + "license": "MPL-2.0",
4960 + "optional": true,
4961 + "os": [
4962 + "win32"
4963 + ],
4964 + "engines": {
4965 + "node": ">= 12.0.0"
4966 + },
4967 + "funding": {
4968 + "type": "opencollective",
4969 + "url": "https://opencollective.com/parcel"
4970 + }
4971 + },
4972 + "node_modules/lightningcss-win32-x64-msvc": {
4973 + "version": "1.32.0",
4974 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
4975 + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
4976 + "cpu": [
4977 + "x64"
4978 + ],
4979 + "dev": true,
4980 + "license": "MPL-2.0",
4981 + "optional": true,
4982 + "os": [
4983 + "win32"
4984 + ],
4985 + "engines": {
4986 + "node": ">= 12.0.0"
4987 + },
4988 + "funding": {
4989 + "type": "opencollective",
4990 + "url": "https://opencollective.com/parcel"
4991 + }
4992 + },
4993 + "node_modules/locate-path": {
4994 + "version": "6.0.0",
4995 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
4996 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
4997 + "dev": true,
4998 + "license": "MIT",
4999 + "dependencies": {
5000 + "p-locate": "^5.0.0"
5001 + },
5002 + "engines": {
5003 + "node": ">=10"
5004 + },
5005 + "funding": {
5006 + "url": "https://github.com/sponsors/sindresorhus"
5007 + }
5008 + },
5009 + "node_modules/lodash.merge": {
5010 + "version": "4.6.2",
5011 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
5012 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
5013 + "dev": true,
5014 + "license": "MIT"
5015 + },
5016 + "node_modules/loose-envify": {
5017 + "version": "1.4.0",
5018 + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
5019 + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
5020 + "dev": true,
5021 + "license": "MIT",
5022 + "dependencies": {
5023 + "js-tokens": "^3.0.0 || ^4.0.0"
5024 + },
5025 + "bin": {
5026 + "loose-envify": "cli.js"
5027 + }
5028 + },
5029 + "node_modules/lru-cache": {
5030 + "version": "5.1.1",
5031 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
5032 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
5033 + "dev": true,
5034 + "license": "ISC",
5035 + "dependencies": {
5036 + "yallist": "^3.0.2"
5037 + }
5038 + },
5039 + "node_modules/magic-string": {
5040 + "version": "0.30.21",
5041 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
5042 + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
5043 + "dev": true,
5044 + "license": "MIT",
5045 + "dependencies": {
5046 + "@jridgewell/sourcemap-codec": "^1.5.5"
5047 + }
5048 + },
5049 + "node_modules/math-intrinsics": {
5050 + "version": "1.1.0",
5051 + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
5052 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
5053 + "dev": true,
5054 + "license": "MIT",
5055 + "engines": {
5056 + "node": ">= 0.4"
5057 + }
5058 + },
5059 + "node_modules/merge2": {
5060 + "version": "1.4.1",
5061 + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
5062 + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
5063 + "dev": true,
5064 + "license": "MIT",
5065 + "engines": {
5066 + "node": ">= 8"
5067 + }
5068 + },
5069 + "node_modules/micromatch": {
5070 + "version": "4.0.8",
5071 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
5072 + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
5073 + "dev": true,
5074 + "license": "MIT",
5075 + "dependencies": {
5076 + "braces": "^3.0.3",
5077 + "picomatch": "^2.3.1"
5078 + },
5079 + "engines": {
5080 + "node": ">=8.6"
5081 + }
5082 + },
5083 + "node_modules/minimatch": {
5084 + "version": "3.1.5",
5085 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
5086 + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
5087 + "dev": true,
5088 + "license": "ISC",
5089 + "dependencies": {
5090 + "brace-expansion": "^1.1.7"
5091 + },
5092 + "engines": {
5093 + "node": "*"
5094 + }
5095 + },
5096 + "node_modules/minimist": {
5097 + "version": "1.2.8",
5098 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
5099 + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
5100 + "dev": true,
5101 + "license": "MIT",
5102 + "funding": {
5103 + "url": "https://github.com/sponsors/ljharb"
5104 + }
5105 + },
5106 + "node_modules/ms": {
5107 + "version": "2.1.3",
5108 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
5109 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
5110 + "dev": true,
5111 + "license": "MIT"
5112 + },
5113 + "node_modules/nan": {
5114 + "version": "2.26.2",
5115 + "resolved": "https://registry.npmjs.org/nan/-/nan-2.26.2.tgz",
5116 + "integrity": "sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==",
5117 + "license": "MIT",
5118 + "optional": true
5119 + },
5120 + "node_modules/nanoid": {
5121 + "version": "3.3.11",
5122 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
5123 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
5124 + "funding": [
5125 + {
5126 + "type": "github",
5127 + "url": "https://github.com/sponsors/ai"
5128 + }
5129 + ],
5130 + "license": "MIT",
5131 + "bin": {
5132 + "nanoid": "bin/nanoid.cjs"
5133 + },
5134 + "engines": {
5135 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
5136 + }
5137 + },
5138 + "node_modules/napi-postinstall": {
5139 + "version": "0.3.4",
5140 + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz",
5141 + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==",
5142 + "dev": true,
5143 + "license": "MIT",
5144 + "bin": {
5145 + "napi-postinstall": "lib/cli.js"
5146 + },
5147 + "engines": {
5148 + "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
5149 + },
5150 + "funding": {
5151 + "url": "https://opencollective.com/napi-postinstall"
5152 + }
5153 + },
5154 + "node_modules/natural-compare": {
5155 + "version": "1.4.0",
5156 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
5157 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
5158 + "dev": true,
5159 + "license": "MIT"
5160 + },
5161 + "node_modules/next": {
5162 + "version": "16.2.4",
5163 + "resolved": "https://registry.npmjs.org/next/-/next-16.2.4.tgz",
5164 + "integrity": "sha512-kPvz56wF5frc+FxlHI5qnklCzbq53HTwORaWBGdT0vNoKh1Aya9XC8aPauH4NJxqtzbWsS5mAbctm4cr+EkQ2Q==",
5165 + "license": "MIT",
5166 + "dependencies": {
5167 + "@next/env": "16.2.4",
5168 + "@swc/helpers": "0.5.15",
5169 + "baseline-browser-mapping": "^2.9.19",
5170 + "caniuse-lite": "^1.0.30001579",
5171 + "postcss": "8.4.31",
5172 + "styled-jsx": "5.1.6"
5173 + },
5174 + "bin": {
5175 + "next": "dist/bin/next"
5176 + },
5177 + "engines": {
5178 + "node": ">=20.9.0"
5179 + },
5180 + "optionalDependencies": {
5181 + "@next/swc-darwin-arm64": "16.2.4",
5182 + "@next/swc-darwin-x64": "16.2.4",
5183 + "@next/swc-linux-arm64-gnu": "16.2.4",
5184 + "@next/swc-linux-arm64-musl": "16.2.4",
5185 + "@next/swc-linux-x64-gnu": "16.2.4",
5186 + "@next/swc-linux-x64-musl": "16.2.4",
5187 + "@next/swc-win32-arm64-msvc": "16.2.4",
5188 + "@next/swc-win32-x64-msvc": "16.2.4",
5189 + "sharp": "^0.34.5"
5190 + },
5191 + "peerDependencies": {
5192 + "@opentelemetry/api": "^1.1.0",
5193 + "@playwright/test": "^1.51.1",
5194 + "babel-plugin-react-compiler": "*",
5195 + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
5196 + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
5197 + "sass": "^1.3.0"
5198 + },
5199 + "peerDependenciesMeta": {
5200 + "@opentelemetry/api": {
5201 + "optional": true
5202 + },
5203 + "@playwright/test": {
5204 + "optional": true
5205 + },
5206 + "babel-plugin-react-compiler": {
5207 + "optional": true
5208 + },
5209 + "sass": {
5210 + "optional": true
5211 + }
5212 + }
5213 + },
5214 + "node_modules/next/node_modules/postcss": {
5215 + "version": "8.4.31",
5216 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
5217 + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
5218 + "funding": [
5219 + {
5220 + "type": "opencollective",
5221 + "url": "https://opencollective.com/postcss/"
5222 + },
5223 + {
5224 + "type": "tidelift",
5225 + "url": "https://tidelift.com/funding/github/npm/postcss"
5226 + },
5227 + {
5228 + "type": "github",
5229 + "url": "https://github.com/sponsors/ai"
5230 + }
5231 + ],
5232 + "license": "MIT",
5233 + "dependencies": {
5234 + "nanoid": "^3.3.6",
5235 + "picocolors": "^1.0.0",
5236 + "source-map-js": "^1.0.2"
5237 + },
5238 + "engines": {
5239 + "node": "^10 || ^12 || >=14"
5240 + }
5241 + },
5242 + "node_modules/node-exports-info": {
5243 + "version": "1.6.0",
5244 + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz",
5245 + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==",
5246 + "dev": true,
5247 + "license": "MIT",
5248 + "dependencies": {
5249 + "array.prototype.flatmap": "^1.3.3",
5250 + "es-errors": "^1.3.0",
5251 + "object.entries": "^1.1.9",
5252 + "semver": "^6.3.1"
5253 + },
5254 + "engines": {
5255 + "node": ">= 0.4"
5256 + },
5257 + "funding": {
5258 + "url": "https://github.com/sponsors/ljharb"
5259 + }
5260 + },
5261 + "node_modules/node-releases": {
5262 + "version": "2.0.38",
5263 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
5264 + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==",
5265 + "dev": true,
5266 + "license": "MIT"
5267 + },
5268 + "node_modules/object-assign": {
5269 + "version": "4.1.1",
5270 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
5271 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
5272 + "dev": true,
5273 + "license": "MIT",
5274 + "engines": {
5275 + "node": ">=0.10.0"
5276 + }
5277 + },
5278 + "node_modules/object-inspect": {
5279 + "version": "1.13.4",
5280 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
5281 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
5282 + "dev": true,
5283 + "license": "MIT",
5284 + "engines": {
5285 + "node": ">= 0.4"
5286 + },
5287 + "funding": {
5288 + "url": "https://github.com/sponsors/ljharb"
5289 + }
5290 + },
5291 + "node_modules/object-keys": {
5292 + "version": "1.1.1",
5293 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
5294 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
5295 + "dev": true,
5296 + "license": "MIT",
5297 + "engines": {
5298 + "node": ">= 0.4"
5299 + }
5300 + },
5301 + "node_modules/object.assign": {
5302 + "version": "4.1.7",
5303 + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
5304 + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
5305 + "dev": true,
5306 + "license": "MIT",
5307 + "dependencies": {
5308 + "call-bind": "^1.0.8",
5309 + "call-bound": "^1.0.3",
5310 + "define-properties": "^1.2.1",
5311 + "es-object-atoms": "^1.0.0",
5312 + "has-symbols": "^1.1.0",
5313 + "object-keys": "^1.1.1"
5314 + },
5315 + "engines": {
5316 + "node": ">= 0.4"
5317 + },
5318 + "funding": {
5319 + "url": "https://github.com/sponsors/ljharb"
5320 + }
5321 + },
5322 + "node_modules/object.entries": {
5323 + "version": "1.1.9",
5324 + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
5325 + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
5326 + "dev": true,
5327 + "license": "MIT",
5328 + "dependencies": {
5329 + "call-bind": "^1.0.8",
5330 + "call-bound": "^1.0.4",
5331 + "define-properties": "^1.2.1",
5332 + "es-object-atoms": "^1.1.1"
5333 + },
5334 + "engines": {
5335 + "node": ">= 0.4"
5336 + }
5337 + },
5338 + "node_modules/object.fromentries": {
5339 + "version": "2.0.8",
5340 + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
5341 + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
5342 + "dev": true,
5343 + "license": "MIT",
5344 + "dependencies": {
5345 + "call-bind": "^1.0.7",
5346 + "define-properties": "^1.2.1",
5347 + "es-abstract": "^1.23.2",
5348 + "es-object-atoms": "^1.0.0"
5349 + },
5350 + "engines": {
5351 + "node": ">= 0.4"
5352 + },
5353 + "funding": {
5354 + "url": "https://github.com/sponsors/ljharb"
5355 + }
5356 + },
5357 + "node_modules/object.groupby": {
5358 + "version": "1.0.3",
5359 + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
5360 + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
5361 + "dev": true,
5362 + "license": "MIT",
5363 + "dependencies": {
5364 + "call-bind": "^1.0.7",
5365 + "define-properties": "^1.2.1",
5366 + "es-abstract": "^1.23.2"
5367 + },
5368 + "engines": {
5369 + "node": ">= 0.4"
5370 + }
5371 + },
5372 + "node_modules/object.values": {
5373 + "version": "1.2.1",
5374 + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
5375 + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
5376 + "dev": true,
5377 + "license": "MIT",
5378 + "dependencies": {
5379 + "call-bind": "^1.0.8",
5380 + "call-bound": "^1.0.3",
5381 + "define-properties": "^1.2.1",
5382 + "es-object-atoms": "^1.0.0"
5383 + },
5384 + "engines": {
5385 + "node": ">= 0.4"
5386 + },
5387 + "funding": {
5388 + "url": "https://github.com/sponsors/ljharb"
5389 + }
5390 + },
5391 + "node_modules/optionator": {
5392 + "version": "0.9.4",
5393 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
5394 + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
5395 + "dev": true,
5396 + "license": "MIT",
5397 + "dependencies": {
5398 + "deep-is": "^0.1.3",
5399 + "fast-levenshtein": "^2.0.6",
5400 + "levn": "^0.4.1",
5401 + "prelude-ls": "^1.2.1",
5402 + "type-check": "^0.4.0",
5403 + "word-wrap": "^1.2.5"
5404 + },
5405 + "engines": {
5406 + "node": ">= 0.8.0"
5407 + }
5408 + },
5409 + "node_modules/own-keys": {
5410 + "version": "1.0.1",
5411 + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
5412 + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
5413 + "dev": true,
5414 + "license": "MIT",
5415 + "dependencies": {
5416 + "get-intrinsic": "^1.2.6",
5417 + "object-keys": "^1.1.1",
5418 + "safe-push-apply": "^1.0.0"
5419 + },
5420 + "engines": {
5421 + "node": ">= 0.4"
5422 + },
5423 + "funding": {
5424 + "url": "https://github.com/sponsors/ljharb"
5425 + }
5426 + },
5427 + "node_modules/p-limit": {
5428 + "version": "3.1.0",
5429 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
5430 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
5431 + "dev": true,
5432 + "license": "MIT",
5433 + "dependencies": {
5434 + "yocto-queue": "^0.1.0"
5435 + },
5436 + "engines": {
5437 + "node": ">=10"
5438 + },
5439 + "funding": {
5440 + "url": "https://github.com/sponsors/sindresorhus"
5441 + }
5442 + },
5443 + "node_modules/p-locate": {
5444 + "version": "5.0.0",
5445 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
5446 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
5447 + "dev": true,
5448 + "license": "MIT",
5449 + "dependencies": {
5450 + "p-limit": "^3.0.2"
5451 + },
5452 + "engines": {
5453 + "node": ">=10"
5454 + },
5455 + "funding": {
5456 + "url": "https://github.com/sponsors/sindresorhus"
5457 + }
5458 + },
5459 + "node_modules/parent-module": {
5460 + "version": "1.0.1",
5461 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
5462 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
5463 + "dev": true,
5464 + "license": "MIT",
5465 + "dependencies": {
5466 + "callsites": "^3.0.0"
5467 + },
5468 + "engines": {
5469 + "node": ">=6"
5470 + }
5471 + },
5472 + "node_modules/path-exists": {
5473 + "version": "4.0.0",
5474 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
5475 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
5476 + "dev": true,
5477 + "license": "MIT",
5478 + "engines": {
5479 + "node": ">=8"
5480 + }
5481 + },
5482 + "node_modules/path-key": {
5483 + "version": "3.1.1",
5484 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
5485 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
5486 + "dev": true,
5487 + "license": "MIT",
5488 + "engines": {
5489 + "node": ">=8"
5490 + }
5491 + },
5492 + "node_modules/path-parse": {
5493 + "version": "1.0.7",
5494 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
5495 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
5496 + "dev": true,
5497 + "license": "MIT"
5498 + },
5499 + "node_modules/picocolors": {
5500 + "version": "1.1.1",
5501 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
5502 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
5503 + "license": "ISC"
5504 + },
5505 + "node_modules/picomatch": {
5506 + "version": "2.3.2",
5507 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
5508 + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
5509 + "dev": true,
5510 + "license": "MIT",
5511 + "engines": {
5512 + "node": ">=8.6"
5513 + },
5514 + "funding": {
5515 + "url": "https://github.com/sponsors/jonschlinkert"
5516 + }
5517 + },
5518 + "node_modules/possible-typed-array-names": {
5519 + "version": "1.1.0",
5520 + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
5521 + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
5522 + "dev": true,
5523 + "license": "MIT",
5524 + "engines": {
5525 + "node": ">= 0.4"
5526 + }
5527 + },
5528 + "node_modules/postcss": {
5529 + "version": "8.5.10",
5530 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz",
5531 + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",
5532 + "dev": true,
5533 + "funding": [
5534 + {
5535 + "type": "opencollective",
5536 + "url": "https://opencollective.com/postcss/"
5537 + },
5538 + {
5539 + "type": "tidelift",
5540 + "url": "https://tidelift.com/funding/github/npm/postcss"
5541 + },
5542 + {
5543 + "type": "github",
5544 + "url": "https://github.com/sponsors/ai"
5545 + }
5546 + ],
5547 + "license": "MIT",
5548 + "dependencies": {
5549 + "nanoid": "^3.3.11",
5550 + "picocolors": "^1.1.1",
5551 + "source-map-js": "^1.2.1"
5552 + },
5553 + "engines": {
5554 + "node": "^10 || ^12 || >=14"
5555 + }
5556 + },
5557 + "node_modules/prelude-ls": {
5558 + "version": "1.2.1",
5559 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
5560 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
5561 + "dev": true,
5562 + "license": "MIT",
5563 + "engines": {
5564 + "node": ">= 0.8.0"
5565 + }
5566 + },
5567 + "node_modules/prop-types": {
5568 + "version": "15.8.1",
5569 + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
5570 + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
5571 + "dev": true,
5572 + "license": "MIT",
5573 + "dependencies": {
5574 + "loose-envify": "^1.4.0",
5575 + "object-assign": "^4.1.1",
5576 + "react-is": "^16.13.1"
5577 + }
5578 + },
5579 + "node_modules/punycode": {
5580 + "version": "2.3.1",
5581 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
5582 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
5583 + "dev": true,
5584 + "license": "MIT",
5585 + "engines": {
5586 + "node": ">=6"
5587 + }
5588 + },
5589 + "node_modules/queue-microtask": {
5590 + "version": "1.2.3",
5591 + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
5592 + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
5593 + "dev": true,
5594 + "funding": [
5595 + {
5596 + "type": "github",
5597 + "url": "https://github.com/sponsors/feross"
5598 + },
5599 + {
5600 + "type": "patreon",
5601 + "url": "https://www.patreon.com/feross"
5602 + },
5603 + {
5604 + "type": "consulting",
5605 + "url": "https://feross.org/support"
5606 + }
5607 + ],
5608 + "license": "MIT"
5609 + },
5610 + "node_modules/react": {
5611 + "version": "19.2.4",
5612 + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
5613 + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
5614 + "license": "MIT",
5615 + "engines": {
5616 + "node": ">=0.10.0"
5617 + }
5618 + },
5619 + "node_modules/react-dom": {
5620 + "version": "19.2.4",
5621 + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
5622 + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
5623 + "license": "MIT",
5624 + "dependencies": {
5625 + "scheduler": "^0.27.0"
5626 + },
5627 + "peerDependencies": {
5628 + "react": "^19.2.4"
5629 + }
5630 + },
5631 + "node_modules/react-is": {
5632 + "version": "16.13.1",
5633 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
5634 + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
5635 + "dev": true,
5636 + "license": "MIT"
5637 + },
5638 + "node_modules/reflect.getprototypeof": {
5639 + "version": "1.0.10",
5640 + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
5641 + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
5642 + "dev": true,
5643 + "license": "MIT",
5644 + "dependencies": {
5645 + "call-bind": "^1.0.8",
5646 + "define-properties": "^1.2.1",
5647 + "es-abstract": "^1.23.9",
5648 + "es-errors": "^1.3.0",
5649 + "es-object-atoms": "^1.0.0",
5650 + "get-intrinsic": "^1.2.7",
5651 + "get-proto": "^1.0.1",
5652 + "which-builtin-type": "^1.2.1"
5653 + },
5654 + "engines": {
5655 + "node": ">= 0.4"
5656 + },
5657 + "funding": {
5658 + "url": "https://github.com/sponsors/ljharb"
5659 + }
5660 + },
5661 + "node_modules/regexp.prototype.flags": {
5662 + "version": "1.5.4",
5663 + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
5664 + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
5665 + "dev": true,
5666 + "license": "MIT",
5667 + "dependencies": {
5668 + "call-bind": "^1.0.8",
5669 + "define-properties": "^1.2.1",
5670 + "es-errors": "^1.3.0",
5671 + "get-proto": "^1.0.1",
5672 + "gopd": "^1.2.0",
5673 + "set-function-name": "^2.0.2"
5674 + },
5675 + "engines": {
5676 + "node": ">= 0.4"
5677 + },
5678 + "funding": {
5679 + "url": "https://github.com/sponsors/ljharb"
5680 + }
5681 + },
5682 + "node_modules/resolve": {
5683 + "version": "2.0.0-next.6",
5684 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz",
5685 + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==",
5686 + "dev": true,
5687 + "license": "MIT",
5688 + "dependencies": {
5689 + "es-errors": "^1.3.0",
5690 + "is-core-module": "^2.16.1",
5691 + "node-exports-info": "^1.6.0",
5692 + "object-keys": "^1.1.1",
5693 + "path-parse": "^1.0.7",
5694 + "supports-preserve-symlinks-flag": "^1.0.0"
5695 + },
5696 + "bin": {
5697 + "resolve": "bin/resolve"
5698 + },
5699 + "engines": {
5700 + "node": ">= 0.4"
5701 + },
5702 + "funding": {
5703 + "url": "https://github.com/sponsors/ljharb"
5704 + }
5705 + },
5706 + "node_modules/resolve-from": {
5707 + "version": "4.0.0",
5708 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
5709 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
5710 + "dev": true,
5711 + "license": "MIT",
5712 + "engines": {
5713 + "node": ">=4"
5714 + }
5715 + },
5716 + "node_modules/resolve-pkg-maps": {
5717 + "version": "1.0.0",
5718 + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
5719 + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
5720 + "dev": true,
5721 + "license": "MIT",
5722 + "funding": {
5723 + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
5724 + }
5725 + },
5726 + "node_modules/reusify": {
5727 + "version": "1.1.0",
5728 + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
5729 + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
5730 + "dev": true,
5731 + "license": "MIT",
5732 + "engines": {
5733 + "iojs": ">=1.0.0",
5734 + "node": ">=0.10.0"
5735 + }
5736 + },
5737 + "node_modules/run-parallel": {
5738 + "version": "1.2.0",
5739 + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
5740 + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
5741 + "dev": true,
5742 + "funding": [
5743 + {
5744 + "type": "github",
5745 + "url": "https://github.com/sponsors/feross"
5746 + },
5747 + {
5748 + "type": "patreon",
5749 + "url": "https://www.patreon.com/feross"
5750 + },
5751 + {
5752 + "type": "consulting",
5753 + "url": "https://feross.org/support"
5754 + }
5755 + ],
5756 + "license": "MIT",
5757 + "dependencies": {
5758 + "queue-microtask": "^1.2.2"
5759 + }
5760 + },
5761 + "node_modules/safe-array-concat": {
5762 + "version": "1.1.4",
5763 + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
5764 + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==",
5765 + "dev": true,
5766 + "license": "MIT",
5767 + "dependencies": {
5768 + "call-bind": "^1.0.9",
5769 + "call-bound": "^1.0.4",
5770 + "get-intrinsic": "^1.3.0",
5771 + "has-symbols": "^1.1.0",
5772 + "isarray": "^2.0.5"
5773 + },
5774 + "engines": {
5775 + "node": ">=0.4"
5776 + },
5777 + "funding": {
5778 + "url": "https://github.com/sponsors/ljharb"
5779 + }
5780 + },
5781 + "node_modules/safe-push-apply": {
5782 + "version": "1.0.0",
5783 + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
5784 + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
5785 + "dev": true,
5786 + "license": "MIT",
5787 + "dependencies": {
5788 + "es-errors": "^1.3.0",
5789 + "isarray": "^2.0.5"
5790 + },
5791 + "engines": {
5792 + "node": ">= 0.4"
5793 + },
5794 + "funding": {
5795 + "url": "https://github.com/sponsors/ljharb"
5796 + }
5797 + },
5798 + "node_modules/safe-regex-test": {
5799 + "version": "1.1.0",
5800 + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
5801 + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
5802 + "dev": true,
5803 + "license": "MIT",
5804 + "dependencies": {
5805 + "call-bound": "^1.0.2",
5806 + "es-errors": "^1.3.0",
5807 + "is-regex": "^1.2.1"
5808 + },
5809 + "engines": {
5810 + "node": ">= 0.4"
5811 + },
5812 + "funding": {
5813 + "url": "https://github.com/sponsors/ljharb"
5814 + }
5815 + },
5816 + "node_modules/safer-buffer": {
5817 + "version": "2.1.2",
5818 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
5819 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
5820 + "license": "MIT"
5821 + },
5822 + "node_modules/scheduler": {
5823 + "version": "0.27.0",
5824 + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
5825 + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
5826 + "license": "MIT"
5827 + },
5828 + "node_modules/semver": {
5829 + "version": "6.3.1",
5830 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
5831 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
5832 + "dev": true,
5833 + "license": "ISC",
5834 + "bin": {
5835 + "semver": "bin/semver.js"
5836 + }
5837 + },
5838 + "node_modules/set-function-length": {
5839 + "version": "1.2.2",
5840 + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
5841 + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
5842 + "dev": true,
5843 + "license": "MIT",
5844 + "dependencies": {
5845 + "define-data-property": "^1.1.4",
5846 + "es-errors": "^1.3.0",
5847 + "function-bind": "^1.1.2",
5848 + "get-intrinsic": "^1.2.4",
5849 + "gopd": "^1.0.1",
5850 + "has-property-descriptors": "^1.0.2"
5851 + },
5852 + "engines": {
5853 + "node": ">= 0.4"
5854 + }
5855 + },
5856 + "node_modules/set-function-name": {
5857 + "version": "2.0.2",
5858 + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
5859 + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
5860 + "dev": true,
5861 + "license": "MIT",
5862 + "dependencies": {
5863 + "define-data-property": "^1.1.4",
5864 + "es-errors": "^1.3.0",
5865 + "functions-have-names": "^1.2.3",
5866 + "has-property-descriptors": "^1.0.2"
5867 + },
5868 + "engines": {
5869 + "node": ">= 0.4"
5870 + }
5871 + },
5872 + "node_modules/set-proto": {
5873 + "version": "1.0.0",
5874 + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
5875 + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
5876 + "dev": true,
5877 + "license": "MIT",
5878 + "dependencies": {
5879 + "dunder-proto": "^1.0.1",
5880 + "es-errors": "^1.3.0",
5881 + "es-object-atoms": "^1.0.0"
5882 + },
5883 + "engines": {
5884 + "node": ">= 0.4"
5885 + }
5886 + },
5887 + "node_modules/sharp": {
5888 + "version": "0.34.5",
5889 + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
5890 + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
5891 + "hasInstallScript": true,
5892 + "license": "Apache-2.0",
5893 + "optional": true,
5894 + "dependencies": {
5895 + "@img/colour": "^1.0.0",
5896 + "detect-libc": "^2.1.2",
5897 + "semver": "^7.7.3"
5898 + },
5899 + "engines": {
5900 + "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
5901 + },
5902 + "funding": {
5903 + "url": "https://opencollective.com/libvips"
5904 + },
5905 + "optionalDependencies": {
5906 + "@img/sharp-darwin-arm64": "0.34.5",
5907 + "@img/sharp-darwin-x64": "0.34.5",
5908 + "@img/sharp-libvips-darwin-arm64": "1.2.4",
5909 + "@img/sharp-libvips-darwin-x64": "1.2.4",
5910 + "@img/sharp-libvips-linux-arm": "1.2.4",
5911 + "@img/sharp-libvips-linux-arm64": "1.2.4",
5912 + "@img/sharp-libvips-linux-ppc64": "1.2.4",
5913 + "@img/sharp-libvips-linux-riscv64": "1.2.4",
5914 + "@img/sharp-libvips-linux-s390x": "1.2.4",
5915 + "@img/sharp-libvips-linux-x64": "1.2.4",
5916 + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
5917 + "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
5918 + "@img/sharp-linux-arm": "0.34.5",
5919 + "@img/sharp-linux-arm64": "0.34.5",
5920 + "@img/sharp-linux-ppc64": "0.34.5",
5921 + "@img/sharp-linux-riscv64": "0.34.5",
5922 + "@img/sharp-linux-s390x": "0.34.5",
5923 + "@img/sharp-linux-x64": "0.34.5",
5924 + "@img/sharp-linuxmusl-arm64": "0.34.5",
5925 + "@img/sharp-linuxmusl-x64": "0.34.5",
5926 + "@img/sharp-wasm32": "0.34.5",
5927 + "@img/sharp-win32-arm64": "0.34.5",
5928 + "@img/sharp-win32-ia32": "0.34.5",
5929 + "@img/sharp-win32-x64": "0.34.5"
5930 + }
5931 + },
5932 + "node_modules/sharp/node_modules/semver": {
5933 + "version": "7.7.4",
5934 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
5935 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
5936 + "license": "ISC",
5937 + "optional": true,
5938 + "bin": {
5939 + "semver": "bin/semver.js"
5940 + },
5941 + "engines": {
5942 + "node": ">=10"
5943 + }
5944 + },
5945 + "node_modules/shebang-command": {
5946 + "version": "2.0.0",
5947 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
5948 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
5949 + "dev": true,
5950 + "license": "MIT",
5951 + "dependencies": {
5952 + "shebang-regex": "^3.0.0"
5953 + },
5954 + "engines": {
5955 + "node": ">=8"
5956 + }
5957 + },
5958 + "node_modules/shebang-regex": {
5959 + "version": "3.0.0",
5960 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
5961 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
5962 + "dev": true,
5963 + "license": "MIT",
5964 + "engines": {
5965 + "node": ">=8"
5966 + }
5967 + },
5968 + "node_modules/side-channel": {
5969 + "version": "1.1.0",
5970 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
5971 + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
5972 + "dev": true,
5973 + "license": "MIT",
5974 + "dependencies": {
5975 + "es-errors": "^1.3.0",
5976 + "object-inspect": "^1.13.3",
5977 + "side-channel-list": "^1.0.0",
5978 + "side-channel-map": "^1.0.1",
5979 + "side-channel-weakmap": "^1.0.2"
5980 + },
5981 + "engines": {
5982 + "node": ">= 0.4"
5983 + },
5984 + "funding": {
5985 + "url": "https://github.com/sponsors/ljharb"
5986 + }
5987 + },
5988 + "node_modules/side-channel-list": {
5989 + "version": "1.0.1",
5990 + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
5991 + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
5992 + "dev": true,
5993 + "license": "MIT",
5994 + "dependencies": {
5995 + "es-errors": "^1.3.0",
5996 + "object-inspect": "^1.13.4"
5997 + },
5998 + "engines": {
5999 + "node": ">= 0.4"
6000 + },
6001 + "funding": {
6002 + "url": "https://github.com/sponsors/ljharb"
6003 + }
6004 + },
6005 + "node_modules/side-channel-map": {
6006 + "version": "1.0.1",
6007 + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
6008 + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
6009 + "dev": true,
6010 + "license": "MIT",
6011 + "dependencies": {
6012 + "call-bound": "^1.0.2",
6013 + "es-errors": "^1.3.0",
6014 + "get-intrinsic": "^1.2.5",
6015 + "object-inspect": "^1.13.3"
6016 + },
6017 + "engines": {
6018 + "node": ">= 0.4"
6019 + },
6020 + "funding": {
6021 + "url": "https://github.com/sponsors/ljharb"
6022 + }
6023 + },
6024 + "node_modules/side-channel-weakmap": {
6025 + "version": "1.0.2",
6026 + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
6027 + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
6028 + "dev": true,
6029 + "license": "MIT",
6030 + "dependencies": {
6031 + "call-bound": "^1.0.2",
6032 + "es-errors": "^1.3.0",
6033 + "get-intrinsic": "^1.2.5",
6034 + "object-inspect": "^1.13.3",
6035 + "side-channel-map": "^1.0.1"
6036 + },
6037 + "engines": {
6038 + "node": ">= 0.4"
6039 + },
6040 + "funding": {
6041 + "url": "https://github.com/sponsors/ljharb"
6042 + }
6043 + },
6044 + "node_modules/source-map-js": {
6045 + "version": "1.2.1",
6046 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
6047 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
6048 + "license": "BSD-3-Clause",
6049 + "engines": {
6050 + "node": ">=0.10.0"
6051 + }
6052 + },
6053 + "node_modules/ssh2": {
6054 + "version": "1.17.0",
6055 + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz",
6056 + "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==",
6057 + "hasInstallScript": true,
6058 + "dependencies": {
6059 + "asn1": "^0.2.6",
6060 + "bcrypt-pbkdf": "^1.0.2"
6061 + },
6062 + "engines": {
6063 + "node": ">=10.16.0"
6064 + },
6065 + "optionalDependencies": {
6066 + "cpu-features": "~0.0.10",
6067 + "nan": "^2.23.0"
6068 + }
6069 + },
6070 + "node_modules/stable-hash": {
6071 + "version": "0.0.5",
6072 + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
6073 + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
6074 + "dev": true,
6075 + "license": "MIT"
6076 + },
6077 + "node_modules/stop-iteration-iterator": {
6078 + "version": "1.1.0",
6079 + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
6080 + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
6081 + "dev": true,
6082 + "license": "MIT",
6083 + "dependencies": {
6084 + "es-errors": "^1.3.0",
6085 + "internal-slot": "^1.1.0"
6086 + },
6087 + "engines": {
6088 + "node": ">= 0.4"
6089 + }
6090 + },
6091 + "node_modules/string.prototype.includes": {
6092 + "version": "2.0.1",
6093 + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
6094 + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
6095 + "dev": true,
6096 + "license": "MIT",
6097 + "dependencies": {
6098 + "call-bind": "^1.0.7",
6099 + "define-properties": "^1.2.1",
6100 + "es-abstract": "^1.23.3"
6101 + },
6102 + "engines": {
6103 + "node": ">= 0.4"
6104 + }
6105 + },
6106 + "node_modules/string.prototype.matchall": {
6107 + "version": "4.0.12",
6108 + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
6109 + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
6110 + "dev": true,
6111 + "license": "MIT",
6112 + "dependencies": {
6113 + "call-bind": "^1.0.8",
6114 + "call-bound": "^1.0.3",
6115 + "define-properties": "^1.2.1",
6116 + "es-abstract": "^1.23.6",
6117 + "es-errors": "^1.3.0",
6118 + "es-object-atoms": "^1.0.0",
6119 + "get-intrinsic": "^1.2.6",
6120 + "gopd": "^1.2.0",
6121 + "has-symbols": "^1.1.0",
6122 + "internal-slot": "^1.1.0",
6123 + "regexp.prototype.flags": "^1.5.3",
6124 + "set-function-name": "^2.0.2",
6125 + "side-channel": "^1.1.0"
6126 + },
6127 + "engines": {
6128 + "node": ">= 0.4"
6129 + },
6130 + "funding": {
6131 + "url": "https://github.com/sponsors/ljharb"
6132 + }
6133 + },
6134 + "node_modules/string.prototype.repeat": {
6135 + "version": "1.0.0",
6136 + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
6137 + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
6138 + "dev": true,
6139 + "license": "MIT",
6140 + "dependencies": {
6141 + "define-properties": "^1.1.3",
6142 + "es-abstract": "^1.17.5"
6143 + }
6144 + },
6145 + "node_modules/string.prototype.trim": {
6146 + "version": "1.2.10",
6147 + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
6148 + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
6149 + "dev": true,
6150 + "license": "MIT",
6151 + "dependencies": {
6152 + "call-bind": "^1.0.8",
6153 + "call-bound": "^1.0.2",
6154 + "define-data-property": "^1.1.4",
6155 + "define-properties": "^1.2.1",
6156 + "es-abstract": "^1.23.5",
6157 + "es-object-atoms": "^1.0.0",
6158 + "has-property-descriptors": "^1.0.2"
6159 + },
6160 + "engines": {
6161 + "node": ">= 0.4"
6162 + },
6163 + "funding": {
6164 + "url": "https://github.com/sponsors/ljharb"
6165 + }
6166 + },
6167 + "node_modules/string.prototype.trimend": {
6168 + "version": "1.0.9",
6169 + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
6170 + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
6171 + "dev": true,
6172 + "license": "MIT",
6173 + "dependencies": {
6174 + "call-bind": "^1.0.8",
6175 + "call-bound": "^1.0.2",
6176 + "define-properties": "^1.2.1",
6177 + "es-object-atoms": "^1.0.0"
6178 + },
6179 + "engines": {
6180 + "node": ">= 0.4"
6181 + },
6182 + "funding": {
6183 + "url": "https://github.com/sponsors/ljharb"
6184 + }
6185 + },
6186 + "node_modules/string.prototype.trimstart": {
6187 + "version": "1.0.8",
6188 + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
6189 + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
6190 + "dev": true,
6191 + "license": "MIT",
6192 + "dependencies": {
6193 + "call-bind": "^1.0.7",
6194 + "define-properties": "^1.2.1",
6195 + "es-object-atoms": "^1.0.0"
6196 + },
6197 + "engines": {
6198 + "node": ">= 0.4"
6199 + },
6200 + "funding": {
6201 + "url": "https://github.com/sponsors/ljharb"
6202 + }
6203 + },
6204 + "node_modules/strip-bom": {
6205 + "version": "3.0.0",
6206 + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
6207 + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
6208 + "dev": true,
6209 + "license": "MIT",
6210 + "engines": {
6211 + "node": ">=4"
6212 + }
6213 + },
6214 + "node_modules/strip-json-comments": {
6215 + "version": "3.1.1",
6216 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
6217 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
6218 + "dev": true,
6219 + "license": "MIT",
6220 + "engines": {
6221 + "node": ">=8"
6222 + },
6223 + "funding": {
6224 + "url": "https://github.com/sponsors/sindresorhus"
6225 + }
6226 + },
6227 + "node_modules/styled-jsx": {
6228 + "version": "5.1.6",
6229 + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
6230 + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
6231 + "license": "MIT",
6232 + "dependencies": {
6233 + "client-only": "0.0.1"
6234 + },
6235 + "engines": {
6236 + "node": ">= 12.0.0"
6237 + },
6238 + "peerDependencies": {
6239 + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
6240 + },
6241 + "peerDependenciesMeta": {
6242 + "@babel/core": {
6243 + "optional": true
6244 + },
6245 + "babel-plugin-macros": {
6246 + "optional": true
6247 + }
6248 + }
6249 + },
6250 + "node_modules/supports-color": {
6251 + "version": "7.2.0",
6252 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
6253 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
6254 + "dev": true,
6255 + "license": "MIT",
6256 + "dependencies": {
6257 + "has-flag": "^4.0.0"
6258 + },
6259 + "engines": {
6260 + "node": ">=8"
6261 + }
6262 + },
6263 + "node_modules/supports-preserve-symlinks-flag": {
6264 + "version": "1.0.0",
6265 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
6266 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
6267 + "dev": true,
6268 + "license": "MIT",
6269 + "engines": {
6270 + "node": ">= 0.4"
6271 + },
6272 + "funding": {
6273 + "url": "https://github.com/sponsors/ljharb"
6274 + }
6275 + },
6276 + "node_modules/tailwindcss": {
6277 + "version": "4.2.4",
6278 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
6279 + "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==",
6280 + "dev": true,
6281 + "license": "MIT"
6282 + },
6283 + "node_modules/tapable": {
6284 + "version": "2.3.3",
6285 + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
6286 + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
6287 + "dev": true,
6288 + "license": "MIT",
6289 + "engines": {
6290 + "node": ">=6"
6291 + },
6292 + "funding": {
6293 + "type": "opencollective",
6294 + "url": "https://opencollective.com/webpack"
6295 + }
6296 + },
6297 + "node_modules/tinyglobby": {
6298 + "version": "0.2.16",
6299 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
6300 + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
6301 + "dev": true,
6302 + "license": "MIT",
6303 + "dependencies": {
6304 + "fdir": "^6.5.0",
6305 + "picomatch": "^4.0.4"
6306 + },
6307 + "engines": {
6308 + "node": ">=12.0.0"
6309 + },
6310 + "funding": {
6311 + "url": "https://github.com/sponsors/SuperchupuDev"
6312 + }
6313 + },
6314 + "node_modules/tinyglobby/node_modules/fdir": {
6315 + "version": "6.5.0",
6316 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
6317 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
6318 + "dev": true,
6319 + "license": "MIT",
6320 + "engines": {
6321 + "node": ">=12.0.0"
6322 + },
6323 + "peerDependencies": {
6324 + "picomatch": "^3 || ^4"
6325 + },
6326 + "peerDependenciesMeta": {
6327 + "picomatch": {
6328 + "optional": true
6329 + }
6330 + }
6331 + },
6332 + "node_modules/tinyglobby/node_modules/picomatch": {
6333 + "version": "4.0.4",
6334 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
6335 + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
6336 + "dev": true,
6337 + "license": "MIT",
6338 + "engines": {
6339 + "node": ">=12"
6340 + },
6341 + "funding": {
6342 + "url": "https://github.com/sponsors/jonschlinkert"
6343 + }
6344 + },
6345 + "node_modules/to-regex-range": {
6346 + "version": "5.0.1",
6347 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
6348 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
6349 + "dev": true,
6350 + "license": "MIT",
6351 + "dependencies": {
6352 + "is-number": "^7.0.0"
6353 + },
6354 + "engines": {
6355 + "node": ">=8.0"
6356 + }
6357 + },
6358 + "node_modules/ts-api-utils": {
6359 + "version": "2.5.0",
6360 + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
6361 + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
6362 + "dev": true,
6363 + "license": "MIT",
6364 + "engines": {
6365 + "node": ">=18.12"
6366 + },
6367 + "peerDependencies": {
6368 + "typescript": ">=4.8.4"
6369 + }
6370 + },
6371 + "node_modules/tsconfig-paths": {
6372 + "version": "3.15.0",
6373 + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
6374 + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
6375 + "dev": true,
6376 + "license": "MIT",
6377 + "dependencies": {
6378 + "@types/json5": "^0.0.29",
6379 + "json5": "^1.0.2",
6380 + "minimist": "^1.2.6",
6381 + "strip-bom": "^3.0.0"
6382 + }
6383 + },
6384 + "node_modules/tsconfig-paths/node_modules/json5": {
6385 + "version": "1.0.2",
6386 + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
6387 + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
6388 + "dev": true,
6389 + "license": "MIT",
6390 + "dependencies": {
6391 + "minimist": "^1.2.0"
6392 + },
6393 + "bin": {
6394 + "json5": "lib/cli.js"
6395 + }
6396 + },
6397 + "node_modules/tslib": {
6398 + "version": "2.8.1",
6399 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
6400 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
6401 + "license": "0BSD"
6402 + },
6403 + "node_modules/tweetnacl": {
6404 + "version": "0.14.5",
6405 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
6406 + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
6407 + "license": "Unlicense"
6408 + },
6409 + "node_modules/type-check": {
6410 + "version": "0.4.0",
6411 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
6412 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
6413 + "dev": true,
6414 + "license": "MIT",
6415 + "dependencies": {
6416 + "prelude-ls": "^1.2.1"
6417 + },
6418 + "engines": {
6419 + "node": ">= 0.8.0"
6420 + }
6421 + },
6422 + "node_modules/typed-array-buffer": {
6423 + "version": "1.0.3",
6424 + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
6425 + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
6426 + "dev": true,
6427 + "license": "MIT",
6428 + "dependencies": {
6429 + "call-bound": "^1.0.3",
6430 + "es-errors": "^1.3.0",
6431 + "is-typed-array": "^1.1.14"
6432 + },
6433 + "engines": {
6434 + "node": ">= 0.4"
6435 + }
6436 + },
6437 + "node_modules/typed-array-byte-length": {
6438 + "version": "1.0.3",
6439 + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
6440 + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
6441 + "dev": true,
6442 + "license": "MIT",
6443 + "dependencies": {
6444 + "call-bind": "^1.0.8",
6445 + "for-each": "^0.3.3",
6446 + "gopd": "^1.2.0",
6447 + "has-proto": "^1.2.0",
6448 + "is-typed-array": "^1.1.14"
6449 + },
6450 + "engines": {
6451 + "node": ">= 0.4"
6452 + },
6453 + "funding": {
6454 + "url": "https://github.com/sponsors/ljharb"
6455 + }
6456 + },
6457 + "node_modules/typed-array-byte-offset": {
6458 + "version": "1.0.4",
6459 + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
6460 + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
6461 + "dev": true,
6462 + "license": "MIT",
6463 + "dependencies": {
6464 + "available-typed-arrays": "^1.0.7",
6465 + "call-bind": "^1.0.8",
6466 + "for-each": "^0.3.3",
6467 + "gopd": "^1.2.0",
6468 + "has-proto": "^1.2.0",
6469 + "is-typed-array": "^1.1.15",
6470 + "reflect.getprototypeof": "^1.0.9"
6471 + },
6472 + "engines": {
6473 + "node": ">= 0.4"
6474 + },
6475 + "funding": {
6476 + "url": "https://github.com/sponsors/ljharb"
6477 + }
6478 + },
6479 + "node_modules/typed-array-length": {
6480 + "version": "1.0.7",
6481 + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
6482 + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
6483 + "dev": true,
6484 + "license": "MIT",
6485 + "dependencies": {
6486 + "call-bind": "^1.0.7",
6487 + "for-each": "^0.3.3",
6488 + "gopd": "^1.0.1",
6489 + "is-typed-array": "^1.1.13",
6490 + "possible-typed-array-names": "^1.0.0",
6491 + "reflect.getprototypeof": "^1.0.6"
6492 + },
6493 + "engines": {
6494 + "node": ">= 0.4"
6495 + },
6496 + "funding": {
6497 + "url": "https://github.com/sponsors/ljharb"
6498 + }
6499 + },
6500 + "node_modules/typescript": {
6501 + "version": "5.9.3",
6502 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
6503 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
6504 + "dev": true,
6505 + "license": "Apache-2.0",
6506 + "bin": {
6507 + "tsc": "bin/tsc",
6508 + "tsserver": "bin/tsserver"
6509 + },
6510 + "engines": {
6511 + "node": ">=14.17"
6512 + }
6513 + },
6514 + "node_modules/typescript-eslint": {
6515 + "version": "8.59.0",
6516 + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz",
6517 + "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==",
6518 + "dev": true,
6519 + "license": "MIT",
6520 + "dependencies": {
6521 + "@typescript-eslint/eslint-plugin": "8.59.0",
6522 + "@typescript-eslint/parser": "8.59.0",
6523 + "@typescript-eslint/typescript-estree": "8.59.0",
6524 + "@typescript-eslint/utils": "8.59.0"
6525 + },
6526 + "engines": {
6527 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
6528 + },
6529 + "funding": {
6530 + "type": "opencollective",
6531 + "url": "https://opencollective.com/typescript-eslint"
6532 + },
6533 + "peerDependencies": {
6534 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
6535 + "typescript": ">=4.8.4 <6.1.0"
6536 + }
6537 + },
6538 + "node_modules/unbox-primitive": {
6539 + "version": "1.1.0",
6540 + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
6541 + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
6542 + "dev": true,
6543 + "license": "MIT",
6544 + "dependencies": {
6545 + "call-bound": "^1.0.3",
6546 + "has-bigints": "^1.0.2",
6547 + "has-symbols": "^1.1.0",
6548 + "which-boxed-primitive": "^1.1.1"
6549 + },
6550 + "engines": {
6551 + "node": ">= 0.4"
6552 + },
6553 + "funding": {
6554 + "url": "https://github.com/sponsors/ljharb"
6555 + }
6556 + },
6557 + "node_modules/undici-types": {
6558 + "version": "6.21.0",
6559 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
6560 + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
6561 + "dev": true,
6562 + "license": "MIT"
6563 + },
6564 + "node_modules/unrs-resolver": {
6565 + "version": "1.11.1",
6566 + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
6567 + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
6568 + "dev": true,
6569 + "hasInstallScript": true,
6570 + "license": "MIT",
6571 + "dependencies": {
6572 + "napi-postinstall": "^0.3.0"
6573 + },
6574 + "funding": {
6575 + "url": "https://opencollective.com/unrs-resolver"
6576 + },
6577 + "optionalDependencies": {
6578 + "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
6579 + "@unrs/resolver-binding-android-arm64": "1.11.1",
6580 + "@unrs/resolver-binding-darwin-arm64": "1.11.1",
6581 + "@unrs/resolver-binding-darwin-x64": "1.11.1",
6582 + "@unrs/resolver-binding-freebsd-x64": "1.11.1",
6583 + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
6584 + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
6585 + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
6586 + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
6587 + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
6588 + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
6589 + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
6590 + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
6591 + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
6592 + "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
6593 + "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
6594 + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
6595 + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
6596 + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
6597 + }
6598 + },
6599 + "node_modules/update-browserslist-db": {
6600 + "version": "1.2.3",
6601 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
6602 + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
6603 + "dev": true,
6604 + "funding": [
6605 + {
6606 + "type": "opencollective",
6607 + "url": "https://opencollective.com/browserslist"
6608 + },
6609 + {
6610 + "type": "tidelift",
6611 + "url": "https://tidelift.com/funding/github/npm/browserslist"
6612 + },
6613 + {
6614 + "type": "github",
6615 + "url": "https://github.com/sponsors/ai"
6616 + }
6617 + ],
6618 + "license": "MIT",
6619 + "dependencies": {
6620 + "escalade": "^3.2.0",
6621 + "picocolors": "^1.1.1"
6622 + },
6623 + "bin": {
6624 + "update-browserslist-db": "cli.js"
6625 + },
6626 + "peerDependencies": {
6627 + "browserslist": ">= 4.21.0"
6628 + }
6629 + },
6630 + "node_modules/uri-js": {
6631 + "version": "4.4.1",
6632 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
6633 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
6634 + "dev": true,
6635 + "license": "BSD-2-Clause",
6636 + "dependencies": {
6637 + "punycode": "^2.1.0"
6638 + }
6639 + },
6640 + "node_modules/which": {
6641 + "version": "2.0.2",
6642 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
6643 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
6644 + "dev": true,
6645 + "license": "ISC",
6646 + "dependencies": {
6647 + "isexe": "^2.0.0"
6648 + },
6649 + "bin": {
6650 + "node-which": "bin/node-which"
6651 + },
6652 + "engines": {
6653 + "node": ">= 8"
6654 + }
6655 + },
6656 + "node_modules/which-boxed-primitive": {
6657 + "version": "1.1.1",
6658 + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
6659 + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
6660 + "dev": true,
6661 + "license": "MIT",
6662 + "dependencies": {
6663 + "is-bigint": "^1.1.0",
6664 + "is-boolean-object": "^1.2.1",
6665 + "is-number-object": "^1.1.1",
6666 + "is-string": "^1.1.1",
6667 + "is-symbol": "^1.1.1"
6668 + },
6669 + "engines": {
6670 + "node": ">= 0.4"
6671 + },
6672 + "funding": {
6673 + "url": "https://github.com/sponsors/ljharb"
6674 + }
6675 + },
6676 + "node_modules/which-builtin-type": {
6677 + "version": "1.2.1",
6678 + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
6679 + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
6680 + "dev": true,
6681 + "license": "MIT",
6682 + "dependencies": {
6683 + "call-bound": "^1.0.2",
6684 + "function.prototype.name": "^1.1.6",
6685 + "has-tostringtag": "^1.0.2",
6686 + "is-async-function": "^2.0.0",
6687 + "is-date-object": "^1.1.0",
6688 + "is-finalizationregistry": "^1.1.0",
6689 + "is-generator-function": "^1.0.10",
6690 + "is-regex": "^1.2.1",
6691 + "is-weakref": "^1.0.2",
6692 + "isarray": "^2.0.5",
6693 + "which-boxed-primitive": "^1.1.0",
6694 + "which-collection": "^1.0.2",
6695 + "which-typed-array": "^1.1.16"
6696 + },
6697 + "engines": {
6698 + "node": ">= 0.4"
6699 + },
6700 + "funding": {
6701 + "url": "https://github.com/sponsors/ljharb"
6702 + }
6703 + },
6704 + "node_modules/which-collection": {
6705 + "version": "1.0.2",
6706 + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
6707 + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
6708 + "dev": true,
6709 + "license": "MIT",
6710 + "dependencies": {
6711 + "is-map": "^2.0.3",
6712 + "is-set": "^2.0.3",
6713 + "is-weakmap": "^2.0.2",
6714 + "is-weakset": "^2.0.3"
6715 + },
6716 + "engines": {
6717 + "node": ">= 0.4"
6718 + },
6719 + "funding": {
6720 + "url": "https://github.com/sponsors/ljharb"
6721 + }
6722 + },
6723 + "node_modules/which-typed-array": {
6724 + "version": "1.1.20",
6725 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
6726 + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
6727 + "dev": true,
6728 + "license": "MIT",
6729 + "dependencies": {
6730 + "available-typed-arrays": "^1.0.7",
6731 + "call-bind": "^1.0.8",
6732 + "call-bound": "^1.0.4",
6733 + "for-each": "^0.3.5",
6734 + "get-proto": "^1.0.1",
6735 + "gopd": "^1.2.0",
6736 + "has-tostringtag": "^1.0.2"
6737 + },
6738 + "engines": {
6739 + "node": ">= 0.4"
6740 + },
6741 + "funding": {
6742 + "url": "https://github.com/sponsors/ljharb"
6743 + }
6744 + },
6745 + "node_modules/word-wrap": {
6746 + "version": "1.2.5",
6747 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
6748 + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
6749 + "dev": true,
6750 + "license": "MIT",
6751 + "engines": {
6752 + "node": ">=0.10.0"
6753 + }
6754 + },
6755 + "node_modules/yallist": {
6756 + "version": "3.1.1",
6757 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
6758 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
6759 + "dev": true,
6760 + "license": "ISC"
6761 + },
6762 + "node_modules/yocto-queue": {
6763 + "version": "0.1.0",
6764 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
6765 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
6766 + "dev": true,
6767 + "license": "MIT",
6768 + "engines": {
6769 + "node": ">=10"
6770 + },
6771 + "funding": {
6772 + "url": "https://github.com/sponsors/sindresorhus"
6773 + }
6774 + },
6775 + "node_modules/zod": {
6776 + "version": "4.3.6",
6777 + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
6778 + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
6779 + "dev": true,
6780 + "license": "MIT",
6781 + "funding": {
6782 + "url": "https://github.com/sponsors/colinhacks"
6783 + }
6784 + },
6785 + "node_modules/zod-validation-error": {
6786 + "version": "4.0.2",
6787 + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
6788 + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
6789 + "dev": true,
6790 + "license": "MIT",
6791 + "engines": {
6792 + "node": ">=18.0.0"
6793 + },
6794 + "peerDependencies": {
6795 + "zod": "^3.25.0 || ^4.0.0"
6796 + }
6797 + }
6798 + }
6799 +}
added package.json +28 −0
@@ -0,0 +1,28 @@
1 +{
2 + "name": "maclustr-web",
3 + "version": "0.1.0",
4 + "private": true,
5 + "scripts": {
6 + "dev": "next dev",
7 + "build": "next build",
8 + "start": "next start",
9 + "lint": "eslint"
10 + },
11 + "dependencies": {
12 + "next": "16.2.4",
13 + "react": "19.2.4",
14 + "react-dom": "19.2.4",
15 + "ssh2": "^1.17.0"
16 + },
17 + "devDependencies": {
18 + "@tailwindcss/postcss": "^4",
19 + "@types/node": "^20",
20 + "@types/react": "^19",
21 + "@types/react-dom": "^19",
22 + "@types/ssh2": "^1.15.5",
23 + "eslint": "^9",
24 + "eslint-config-next": "16.2.4",
25 + "tailwindcss": "^4",
26 + "typescript": "^5"
27 + }
28 +}
added postcss.config.mjs +7 −0
@@ -0,0 +1,7 @@
1 +const config = {
2 + plugins: {
3 + "@tailwindcss/postcss": {},
4 + },
5 +};
6 +
7 +export default config;
added public/app-icon-180.png +0 −0

Binary file not shown.

added public/app-icon-192.png +0 −0

Binary file not shown.

added public/app-icon-32.png +0 −0

Binary file not shown.

added public/app-icon-512.png +0 −0

Binary file not shown.

added public/app-icon.png +0 −0

Binary file not shown.

added public/file.svg +1 −0
@@ -0,0 +1 @@
1 +<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
\ No newline at end of file
added public/globe.svg +1 −0
@@ -0,0 +1 @@
1 +<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
\ No newline at end of file
added public/next.svg +1 −0
@@ -0,0 +1 @@
1 +<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
\ No newline at end of file
added public/vercel.svg +1 −0
@@ -0,0 +1 @@
1 +<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
\ No newline at end of file
added public/window.svg +1 −0
@@ -0,0 +1 @@
1 +<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
\ No newline at end of file
added src/app/api/auth/login/route.ts +30 −0
@@ -0,0 +1,30 @@
1 +import { NextResponse } from "next/server";
2 +import { checkCredentials, signSession, SESSION_COOKIE, SESSION_MAX_AGE } from "@/lib/auth";
3 +
4 +export const dynamic = "force-dynamic";
5 +
6 +export async function POST(request: Request) {
7 + let user = "";
8 + let pass = "";
9 + try {
10 + const body = await request.json();
11 + user = String(body.user || "");
12 + pass = String(body.pass || "");
13 + } catch {
14 + return NextResponse.json({ error: "Invalid request" }, { status: 400 });
15 + }
16 +
17 + if (!checkCredentials(user, pass)) {
18 + return NextResponse.json({ error: "Invalid username or password" }, { status: 401 });
19 + }
20 +
21 + const token = await signSession(user);
22 + const res = NextResponse.json({ ok: true, user });
23 + res.cookies.set(SESSION_COOKIE, token, {
24 + httpOnly: true,
25 + sameSite: "lax",
26 + path: "/",
27 + maxAge: SESSION_MAX_AGE,
28 + });
29 + return res;
30 +}
added src/app/api/auth/logout/route.ts +10 −0
@@ -0,0 +1,10 @@
1 +import { NextResponse } from "next/server";
2 +import { SESSION_COOKIE } from "@/lib/auth";
3 +
4 +export const dynamic = "force-dynamic";
5 +
6 +export async function POST() {
7 + const res = NextResponse.json({ ok: true });
8 + res.cookies.set(SESSION_COOKIE, "", { httpOnly: true, path: "/", maxAge: 0 });
9 + return res;
10 +}
added src/app/api/metrics/route.ts +42 −0
@@ -0,0 +1,42 @@
1 +import { NextResponse } from "next/server";
2 +import { CLUSTER_NODES } from "@/lib/cluster";
3 +import { collectMetrics } from "@/lib/ssh";
4 +
5 +export const dynamic = "force-dynamic";
6 +
7 +export async function GET(request: Request) {
8 + const { searchParams } = new URL(request.url);
9 + const nodeId = searchParams.get("node");
10 +
11 + const targets = nodeId
12 + ? CLUSTER_NODES.filter(n => n.id === nodeId)
13 + : CLUSTER_NODES;
14 +
15 + const results = await Promise.allSettled(
16 + targets.map(n => collectMetrics(n.id, n.hostname))
17 + );
18 +
19 + const metrics = results.map((r, i) => {
20 + if (r.status === "fulfilled") return r.value;
21 + return {
22 + nodeId: targets[i].id,
23 + online: false,
24 + cpuUsage: 0,
25 + memoryUsed: 0,
26 + memoryTotal: 0,
27 + diskUsed: 0,
28 + diskTotal: 0,
29 + extDiskUsed: 0,
30 + extDiskTotal: 0,
31 + loadAverage: [0, 0, 0],
32 + uptime: 0,
33 + processes: 0,
34 + thermalState: "unknown",
35 + gpuUsage: -1,
36 + networkIn: 0,
37 + networkOut: 0,
38 + };
39 + });
40 +
41 + return NextResponse.json({ metrics, timestamp: new Date().toISOString() });
42 +}
added src/app/api/nas/route.ts +13 −0
@@ -0,0 +1,13 @@
1 +import { NextResponse } from "next/server";
2 +import { collectNASMetrics } from "@/lib/nas";
3 +
4 +export const dynamic = "force-dynamic";
5 +
6 +export async function GET() {
7 + try {
8 + const nas = await collectNASMetrics();
9 + return NextResponse.json({ nas, timestamp: new Date().toISOString() });
10 + } catch {
11 + return NextResponse.json({ nas: [], timestamp: new Date().toISOString() });
12 + }
13 +}
added src/app/api/ssh/route.ts +41 −0
@@ -0,0 +1,41 @@
1 +import { NextResponse } from "next/server";
2 +import { CLUSTER_NODES } from "@/lib/cluster";
3 +import { executeSSH } from "@/lib/ssh";
4 +
5 +export const dynamic = "force-dynamic";
6 +
7 +export async function POST(request: Request) {
8 + const { nodeId, command } = await request.json();
9 +
10 + if (!nodeId || !command) {
11 + return NextResponse.json({ error: "nodeId and command required" }, { status: 400 });
12 + }
13 +
14 + if (nodeId === "all") {
15 + const results = await Promise.allSettled(
16 + CLUSTER_NODES.map(async (n) => ({
17 + nodeId: n.id,
18 + output: await executeSSH(n.hostname, command),
19 + }))
20 + );
21 +
22 + const outputs = results.map((r, i) => {
23 + if (r.status === "fulfilled") return r.value;
24 + return { nodeId: CLUSTER_NODES[i].id, output: `Error: ${(r.reason as Error).message}` };
25 + });
26 +
27 + return NextResponse.json({ results: outputs });
28 + }
29 +
30 + const node = CLUSTER_NODES.find(n => n.id === nodeId);
31 + if (!node) {
32 + return NextResponse.json({ error: "Unknown node" }, { status: 404 });
33 + }
34 +
35 + try {
36 + const output = await executeSSH(node.hostname, command);
37 + return NextResponse.json({ nodeId, output });
38 + } catch (err) {
39 + return NextResponse.json({ nodeId, output: `Error: ${(err as Error).message}` }, { status: 500 });
40 + }
41 +}
added src/app/api/tailscale/route.ts +38 −0
@@ -0,0 +1,38 @@
1 +import { NextResponse } from "next/server";
2 +import { getTailscaleDevices } from "@/lib/tailscale";
3 +import { CLUSTER_NODES } from "@/lib/cluster";
4 +
5 +export const dynamic = "force-dynamic";
6 +
7 +export async function GET() {
8 + const devices = await getTailscaleDevices();
9 +
10 + const statusMap: Record<string, { online: boolean; lastSeen: string; ip: string; tailscaleName: string }> = {};
11 +
12 + for (const node of CLUSTER_NODES) {
13 + const tsFullName = `${node.tailscaleName}.tail7200aa.ts.net`;
14 + const device = devices.find(d => d.name === tsFullName);
15 +
16 + if (device) {
17 + statusMap[node.id] = {
18 + online: device.online,
19 + lastSeen: device.lastSeen,
20 + ip: device.addresses?.[0] || node.tailscaleIp,
21 + tailscaleName: node.tailscaleName,
22 + };
23 + } else {
24 + statusMap[node.id] = {
25 + online: false,
26 + lastSeen: "",
27 + ip: node.tailscaleIp,
28 + tailscaleName: node.tailscaleName,
29 + };
30 + }
31 + }
32 +
33 + return NextResponse.json({
34 + statusMap,
35 + totalTailscaleDevices: devices.length,
36 + clusterNodesFound: Object.values(statusMap).filter(s => s.online).length,
37 + });
38 +}
added src/app/favicon.ico +0 −0

Binary file not shown.

added src/app/globals.css +60 −0
@@ -0,0 +1,60 @@
1 +@import "tailwindcss";
2 +
3 +@theme inline {
4 + --font-sans: var(--font-geist-sans);
5 + --font-mono: var(--font-geist-mono);
6 +}
7 +
8 +body {
9 + color: #18181b;
10 + font-family: var(--font-sans), system-ui, sans-serif;
11 + background-color: #f4f5fa;
12 + background-image:
13 + radial-gradient(55rem 55rem at 10% -12%, rgba(124, 58, 237, 0.10), transparent 55%),
14 + radial-gradient(48rem 48rem at 98% -5%, rgba(59, 130, 246, 0.10), transparent 50%),
15 + radial-gradient(60rem 38rem at 50% 118%, rgba(20, 184, 166, 0.07), transparent 60%);
16 + background-attachment: fixed;
17 + min-height: 100vh;
18 +}
19 +
20 +* {
21 + scrollbar-width: thin;
22 + scrollbar-color: #cbd5e1 transparent;
23 +}
24 +*::-webkit-scrollbar { width: 8px; height: 8px; }
25 +*::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 8px; }
26 +*::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
27 +
28 +/* Glass surface (light) */
29 +.glass {
30 + background: rgba(255, 255, 255, 0.72);
31 + border: 1px solid rgba(15, 23, 42, 0.08);
32 + backdrop-filter: blur(12px);
33 + -webkit-backdrop-filter: blur(12px);
34 + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04), 0 8px 24px -12px rgba(15, 23, 42, 0.12);
35 +}
36 +.glass-hover { transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease; }
37 +.glass-hover:hover {
38 + transform: translateY(-2px);
39 + border-color: rgba(124, 58, 237, 0.28);
40 + box-shadow: 0 2px 4px rgba(15, 23, 42, 0.06), 0 16px 32px -14px rgba(79, 70, 229, 0.25);
41 +}
42 +
43 +/* Online status pulse */
44 +@keyframes pulse-ring {
45 + 0% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.45); }
46 + 70% { box-shadow: 0 0 0 6px rgba(34, 197, 94, 0); }
47 + 100% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0); }
48 +}
49 +.dot-online { background: #16a34a; animation: pulse-ring 2s infinite; }
50 +.dot-offline { background: #cbd5e1; }
51 +
52 +@keyframes fade-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
53 +.fade-in { animation: fade-in .35s ease both; }
54 +
55 +.gradient-text {
56 + background: linear-gradient(90deg, #7c3aed, #2563eb);
57 + -webkit-background-clip: text;
58 + background-clip: text;
59 + color: transparent;
60 +}
added src/app/layout.tsx +40 −0
@@ -0,0 +1,40 @@
1 +import type { Metadata } from "next";
2 +import { Geist, Geist_Mono } from "next/font/google";
3 +import "./globals.css";
4 +
5 +const geistSans = Geist({
6 + variable: "--font-geist-sans",
7 + subsets: ["latin"],
8 +});
9 +
10 +const geistMono = Geist_Mono({
11 + variable: "--font-geist-mono",
12 + subsets: ["latin"],
13 +});
14 +
15 +export const metadata: Metadata = {
16 + title: "MacLustr — Cluster Console",
17 + description: "Apple Silicon compute cluster management",
18 + icons: {
19 + icon: [
20 + { url: "/app-icon-32.png", sizes: "32x32", type: "image/png" },
21 + { url: "/app-icon-192.png", sizes: "192x192", type: "image/png" },
22 + ],
23 + apple: "/app-icon-180.png",
24 + },
25 +};
26 +
27 +export default function RootLayout({
28 + children,
29 +}: Readonly<{
30 + children: React.ReactNode;
31 +}>) {
32 + return (
33 + <html
34 + lang="en"
35 + className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
36 + >
37 + <body className="min-h-full text-zinc-900">{children}</body>
38 + </html>
39 + );
40 +}
added src/app/login/page.tsx +98 −0
@@ -0,0 +1,98 @@
1 +"use client";
2 +
3 +import { useState, Suspense } from "react";
4 +import { useRouter, useSearchParams } from "next/navigation";
5 +
6 +function LoginForm() {
7 + const router = useRouter();
8 + const params = useSearchParams();
9 + const [user, setUser] = useState("");
10 + const [pass, setPass] = useState("");
11 + const [error, setError] = useState("");
12 + const [loading, setLoading] = useState(false);
13 +
14 + async function submit(e: React.FormEvent) {
15 + e.preventDefault();
16 + setError("");
17 + setLoading(true);
18 + try {
19 + const res = await fetch("/api/auth/login", {
20 + method: "POST",
21 + headers: { "Content-Type": "application/json" },
22 + body: JSON.stringify({ user, pass }),
23 + });
24 + if (res.ok) {
25 + const from = params.get("from") || "/";
26 + router.replace(from.startsWith("/") ? from : "/");
27 + router.refresh();
28 + } else {
29 + const data = await res.json().catch(() => ({}));
30 + setError(data.error || "Login failed");
31 + }
32 + } catch {
33 + setError("Network error");
34 + } finally {
35 + setLoading(false);
36 + }
37 + }
38 +
39 + return (
40 + <div className="flex min-h-screen items-center justify-center px-4">
41 + <form
42 + onSubmit={submit}
43 + className="glass fade-in w-full max-w-sm rounded-3xl p-8"
44 + >
45 + <div className="mb-7 flex flex-col items-center text-center">
46 + {/* eslint-disable-next-line @next/next/no-img-element */}
47 + <img
48 + src="/app-icon.png"
49 + alt="MacLustr"
50 + className="mb-4 h-20 w-20 rounded-[1.25rem] shadow-lg ring-1 ring-black/5"
51 + />
52 + <h1 className="text-xl font-semibold tracking-tight text-zinc-900">
53 + <span className="gradient-text">MacLustr</span> Console
54 + </h1>
55 + <p className="mt-1 text-xs text-zinc-500">Apple Silicon compute cluster · 20 nodes</p>
56 + </div>
57 +
58 + <label className="mb-1 block text-xs font-medium text-zinc-600">Username</label>
59 + <input
60 + value={user}
61 + onChange={(e) => setUser(e.target.value)}
62 + autoCapitalize="none"
63 + autoCorrect="off"
64 + autoFocus
65 + className="mb-4 w-full rounded-lg border border-zinc-300 bg-white/80 px-3 py-2 text-sm text-zinc-900 outline-none transition focus:border-violet-500 focus:ring-2 focus:ring-violet-500/20"
66 + placeholder="user1"
67 + />
68 +
69 + <label className="mb-1 block text-xs font-medium text-zinc-600">Password</label>
70 + <input
71 + value={pass}
72 + onChange={(e) => setPass(e.target.value)}
73 + type="password"
74 + className="mb-5 w-full rounded-lg border border-zinc-300 bg-white/80 px-3 py-2 text-sm text-zinc-900 outline-none transition focus:border-violet-500 focus:ring-2 focus:ring-violet-500/20"
75 + placeholder="••••••"
76 + />
77 +
78 + {error && <p className="mb-4 text-sm text-red-500">{error}</p>}
79 +
80 + <button
81 + type="submit"
82 + disabled={loading}
83 + className="w-full rounded-lg bg-gradient-to-r from-violet-600 to-blue-600 py-2.5 text-sm font-semibold text-white shadow-md transition hover:opacity-90 disabled:opacity-50"
84 + >
85 + {loading ? "Signing in…" : "Sign in"}
86 + </button>
87 + </form>
88 + </div>
89 + );
90 +}
91 +
92 +export default function LoginPage() {
93 + return (
94 + <Suspense fallback={<div className="min-h-screen" />}>
95 + <LoginForm />
96 + </Suspense>
97 + );
98 +}
added src/app/page.tsx +190 −0
@@ -0,0 +1,190 @@
1 +"use client";
2 +
3 +import { useState, useEffect, useCallback } from "react";
4 +import { CLUSTER_NODES } from "@/lib/cluster";
5 +import ClusterOverview from "@/components/ClusterOverview";
6 +import NodeGrid from "@/components/NodeGrid";
7 +import NodeDetail from "@/components/NodeDetail";
8 +import Terminal from "@/components/Terminal";
9 +import NASCard from "@/components/NASCard";
10 +import type { NodeMetrics } from "@/lib/ssh";
11 +import type { NASMetrics } from "@/lib/nas";
12 +
13 +type View = "dashboard" | "terminal";
14 +
15 +interface TailscaleStatus {
16 + online: boolean;
17 + lastSeen: string;
18 + ip: string;
19 +}
20 +
21 +export default function Home() {
22 + const [view, setView] = useState<View>("dashboard");
23 + const [statusMap, setStatusMap] = useState<Record<string, TailscaleStatus>>({});
24 + const [metricsMap, setMetricsMap] = useState<Record<string, NodeMetrics>>({});
25 + const [nas, setNas] = useState<NASMetrics[]>([]);
26 + const [selectedNode, setSelectedNode] = useState<string | null>(null);
27 + const [loading, setLoading] = useState(true);
28 + const [lastRefresh, setLastRefresh] = useState<Date | null>(null);
29 +
30 + const fetchTailscale = useCallback(async () => {
31 + try {
32 + const res = await fetch("/api/tailscale");
33 + const data = await res.json();
34 + setStatusMap(data.statusMap || {});
35 + } catch (err) {
36 + console.error("Tailscale fetch error:", err);
37 + }
38 + }, []);
39 +
40 + const fetchNas = useCallback(async () => {
41 + try {
42 + const res = await fetch("/api/nas");
43 + const data = await res.json();
44 + setNas(Array.isArray(data.nas) ? data.nas : []);
45 + } catch (err) {
46 + console.error("NAS fetch error:", err);
47 + }
48 + }, []);
49 +
50 + const fetchMetrics = useCallback(async () => {
51 + try {
52 + const res = await fetch("/api/metrics");
53 + const data = await res.json();
54 + const map: Record<string, NodeMetrics> = {};
55 + for (const m of data.metrics || []) {
56 + map[m.nodeId] = m;
57 + }
58 + setMetricsMap(map);
59 + setLastRefresh(new Date());
60 + } catch (err) {
61 + console.error("Metrics fetch error:", err);
62 + }
63 + }, []);
64 +
65 + useEffect(() => {
66 + const init = async () => {
67 + setLoading(true);
68 + await Promise.all([fetchTailscale(), fetchMetrics(), fetchNas()]);
69 + setLoading(false);
70 + };
71 + init();
72 +
73 + const tsInterval = setInterval(fetchTailscale, 30000);
74 + const mInterval = setInterval(fetchMetrics, 15000);
75 + const nInterval = setInterval(fetchNas, 30000);
76 + return () => {
77 + clearInterval(tsInterval);
78 + clearInterval(mInterval);
79 + clearInterval(nInterval);
80 + };
81 + }, [fetchTailscale, fetchMetrics, fetchNas]);
82 +
83 + const selected = selectedNode ? CLUSTER_NODES.find(n => n.id === selectedNode) : null;
84 +
85 + return (
86 + <div className="min-h-screen">
87 + {/* Nav */}
88 + <nav className="glass sticky top-0 z-50 border-x-0 border-t-0">
89 + <div className="max-w-7xl mx-auto px-6 py-3 flex items-center justify-between">
90 + <div className="flex items-center gap-4">
91 + {/* eslint-disable-next-line @next/next/no-img-element */}
92 + <img src="/app-icon.png" alt="MacLustr" className="h-9 w-9 rounded-xl ring-1 ring-white/10 shadow" />
93 + <h1 className="text-lg font-bold tracking-tight">
94 + <span className="gradient-text">MacLustr</span>
95 + </h1>
96 + <div className="flex gap-1 ml-2">
97 + <NavButton active={view === "dashboard"} onClick={() => setView("dashboard")}>
98 + Dashboard
99 + </NavButton>
100 + <NavButton active={view === "terminal"} onClick={() => setView("terminal")}>
101 + Terminal
102 + </NavButton>
103 + </div>
104 + </div>
105 + <div className="flex items-center gap-4">
106 + {lastRefresh && (
107 + <span className="hidden sm:inline text-xs text-zinc-500">
108 + Updated {lastRefresh.toLocaleTimeString()}
109 + </span>
110 + )}
111 + <button
112 + onClick={() => { fetchTailscale(); fetchMetrics(); fetchNas(); }}
113 + className="text-xs font-medium bg-white/70 border border-zinc-200 text-zinc-700 px-3 py-1.5 rounded-lg hover:bg-white hover:border-violet-300 transition"
114 + >
115 + Refresh
116 + </button>
117 + <button
118 + onClick={async () => { await fetch("/api/auth/logout", { method: "POST" }); window.location.href = "/login"; }}
119 + className="text-xs font-medium bg-white/70 border border-zinc-200 text-zinc-500 px-3 py-1.5 rounded-lg hover:bg-red-500 hover:border-red-500 hover:text-white transition"
120 + >
121 + Sign out
122 + </button>
123 + </div>
124 + </div>
125 + </nav>
126 +
127 + {/* Content */}
128 + <main className="max-w-7xl mx-auto px-6 py-6">
129 + {loading ? (
130 + <div className="flex items-center justify-center h-64">
131 + <div className="text-zinc-500 animate-pulse">Connecting to cluster…</div>
132 + </div>
133 + ) : view === "dashboard" ? (
134 + <div className="space-y-6">
135 + <ClusterOverview statusMap={statusMap} metricsMap={metricsMap} />
136 +
137 + {nas.length > 0 && (
138 + <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
139 + {nas.map((n) => <NASCard key={n.id} nas={n} />)}
140 + </div>
141 + )}
142 +
143 + <div className="flex items-center justify-between">
144 + <h2 className="text-lg font-semibold text-zinc-900">Nodes</h2>
145 + <span className="text-xs text-zinc-500">{CLUSTER_NODES.length} nodes</span>
146 + </div>
147 +
148 + <div className={selected ? "grid grid-cols-1 lg:grid-cols-3 gap-6" : ""}>
149 + <div className={selected ? "lg:col-span-2" : ""}>
150 + <NodeGrid
151 + nodes={CLUSTER_NODES}
152 + statusMap={statusMap}
153 + metricsMap={metricsMap}
154 + selectedNode={selectedNode}
155 + onSelect={(id) => setSelectedNode(selectedNode === id ? null : id)}
156 + />
157 + </div>
158 + {selected && (
159 + <div>
160 + <NodeDetail
161 + node={selected}
162 + status={statusMap[selected.id]}
163 + metrics={metricsMap[selected.id]}
164 + />
165 + </div>
166 + )}
167 + </div>
168 + </div>
169 + ) : (
170 + <Terminal />
171 + )}
172 + </main>
173 + </div>
174 + );
175 +}
176 +
177 +function NavButton({ active, onClick, children }: { active: boolean; onClick: () => void; children: React.ReactNode }) {
178 + return (
179 + <button
180 + onClick={onClick}
181 + className={`text-sm px-3 py-1.5 rounded-lg transition ${
182 + active
183 + ? "bg-zinc-900 text-white shadow-sm"
184 + : "text-zinc-500 hover:text-zinc-900 hover:bg-zinc-900/5"
185 + }`}
186 + >
187 + {children}
188 + </button>
189 + );
190 +}
added src/components/ClusterOverview.tsx +118 −0
@@ -0,0 +1,118 @@
1 +"use client";
2 +
3 +import { CLUSTER_NODES, TOTAL_CORES, TOTAL_MEMORY, TOTAL_GPU, TIER_COLORS } from "@/lib/cluster";
4 +import type { NodeMetrics } from "@/lib/ssh";
5 +
6 +interface TailscaleStatus {
7 + online: boolean;
8 + lastSeen: string;
9 + ip: string;
10 +}
11 +
12 +/** Format a byte count, auto-switching GB -> TB above 1024 GB. */
13 +function formatStorage(bytes: number): string {
14 + const gb = bytes / (1024 * 1024 * 1024);
15 + if (gb >= 1024) return `${(gb / 1024).toFixed(2)} TB`;
16 + return `${Math.round(gb)} GB`;
17 +}
18 +
19 +export default function ClusterOverview({
20 + statusMap,
21 + metricsMap = {},
22 +}: {
23 + statusMap: Record<string, TailscaleStatus>;
24 + metricsMap?: Record<string, NodeMetrics>;
25 +}) {
26 + const onlineCount = Object.values(statusMap).filter((s) => s.online).length;
27 + const total = CLUSTER_NODES.length;
28 + const pct = total ? Math.round((onlineCount / total) * 100) : 0;
29 + const tiers = ["ultra", "max", "pro", "base"] as const;
30 +
31 + // Cluster-wide storage totals (internal SSD + external drives) across reporting nodes.
32 + const liveMetrics = Object.values(metricsMap).filter((m) => m.online);
33 + const storageUsed = liveMetrics.reduce((a, m) => a + m.diskUsed + (m.extDiskUsed || 0), 0);
34 + const storageTotal = liveMetrics.reduce((a, m) => a + m.diskTotal + (m.extDiskTotal || 0), 0);
35 + const extTotal = liveMetrics.reduce((a, m) => a + (m.extDiskTotal || 0), 0);
36 +
37 + return (
38 + <div className="space-y-5 fade-in">
39 + {/* Hero stat cards */}
40 + <div className="grid grid-cols-2 md:grid-cols-5 gap-4">
41 + <StatCard label="Nodes Online" value={`${onlineCount}/${total}`} sub={`${pct}% reachable`} accent="#16a34a" icon={<ServerIcon />}>
42 + <div className="mt-3 h-1.5 w-full overflow-hidden rounded-full bg-zinc-200">
43 + <div className="h-full rounded-full" style={{ width: `${pct}%`, background: "linear-gradient(90deg,#16a34a,#4ade80)" }} />
44 + </div>
45 + </StatCard>
46 + <StatCard label="CPU Cores" value={TOTAL_CORES.toString()} sub="across cluster" accent="#2563eb" icon={<CpuIcon />} />
47 + <StatCard label="Memory" value={`${TOTAL_MEMORY}`} unit="GB" sub="unified" accent="#7c3aed" icon={<MemIcon />} />
48 + <StatCard label="GPU Cores" value={TOTAL_GPU.toString()} sub="Metal" accent="#d97706" icon={<GpuIcon />} />
49 + <StatCard
50 + label="Storage"
51 + value={storageTotal > 0 ? formatStorage(storageUsed) : "—"}
52 + sub={storageTotal > 0 ? `of ${formatStorage(storageTotal)}${extTotal > 0 ? ` · +${formatStorage(extTotal)} ext` : ""}` : "internal + external"}
53 + accent="#0891b2"
54 + icon={<DiskIcon />}
55 + />
56 + </div>
57 +
58 + {/* Tier breakdown */}
59 + <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
60 + {tiers.map((tier) => {
61 + const nodes = CLUSTER_NODES.filter((n) => n.tier === tier);
62 + const online = nodes.filter((n) => statusMap[n.id]?.online).length;
63 + const tpct = nodes.length ? Math.round((online / nodes.length) * 100) : 0;
64 + const color = TIER_COLORS[tier];
65 + return (
66 + <div key={tier} className="glass glass-hover rounded-2xl p-4">
67 + <div className="mb-2 flex items-center justify-between">
68 + <div className="flex items-center gap-2">
69 + <span className="h-2.5 w-2.5 rounded-full" style={{ backgroundColor: color, boxShadow: `0 0 8px ${color}66` }} />
70 + <span className="text-xs font-semibold uppercase tracking-wider text-zinc-600">{tier}</span>
71 + </div>
72 + <span className="text-xs text-zinc-500">{online}/{nodes.length}</span>
73 + </div>
74 + <div className="text-2xl font-bold text-zinc-900 tabular-nums">
75 + {nodes.reduce((a, n) => a + n.cpuCores, 0)}
76 + <span className="ml-1 text-sm font-normal text-zinc-500">cores</span>
77 + </div>
78 + <div className="mb-2 text-xs text-zinc-500">{nodes.reduce((a, n) => a + n.memoryGB, 0)} GB · {nodes.reduce((a, n) => a + n.gpuCores, 0)} GPU</div>
79 + <div className="h-1 w-full overflow-hidden rounded-full bg-zinc-200">
80 + <div className="h-full rounded-full" style={{ width: `${tpct}%`, backgroundColor: color }} />
81 + </div>
82 + </div>
83 + );
84 + })}
85 + </div>
86 + </div>
87 + );
88 +}
89 +
90 +function StatCard({
91 + label, value, unit, sub, accent, icon, children,
92 +}: {
93 + label: string; value: string; unit?: string; sub: string; accent: string; icon: React.ReactNode; children?: React.ReactNode;
94 +}) {
95 + return (
96 + <div className="glass glass-hover relative overflow-hidden rounded-2xl p-4">
97 + <div className="pointer-events-none absolute -right-6 -top-6 h-20 w-20 rounded-full opacity-25 blur-2xl" style={{ background: accent }} />
98 + <div className="flex items-start justify-between">
99 + <div className="text-xs font-medium uppercase tracking-wide text-zinc-500">{label}</div>
100 + <div style={{ color: accent }}>{icon}</div>
101 + </div>
102 + <div className="mt-2 text-3xl font-bold tabular-nums text-zinc-900">
103 + {value}
104 + {unit && <span className="ml-1 text-base font-medium text-zinc-500">{unit}</span>}
105 + </div>
106 + <div className="mt-0.5 text-xs text-zinc-500">{sub}</div>
107 + {children}
108 + </div>
109 + );
110 +}
111 +
112 +/* Minimal inline icons */
113 +const S = { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.8, strokeLinecap: "round" as const, strokeLinejoin: "round" as const };
114 +const ServerIcon = () => (<svg {...S}><rect x="3" y="4" width="18" height="6" rx="2" /><rect x="3" y="14" width="18" height="6" rx="2" /><path d="M7 7h.01M7 17h.01" /></svg>);
115 +const CpuIcon = () => (<svg {...S}><rect x="6" y="6" width="12" height="12" rx="2" /><path d="M9 2v2M15 2v2M9 20v2M15 20v2M2 9h2M2 15h2M20 9h2M20 15h2" /></svg>);
116 +const MemIcon = () => (<svg {...S}><rect x="3" y="7" width="18" height="10" rx="2" /><path d="M7 7v10M12 7v10M17 7v10" /></svg>);
117 +const GpuIcon = () => (<svg {...S}><rect x="2" y="6" width="20" height="12" rx="2" /><circle cx="9" cy="12" r="2.5" /><path d="M15 10h4M15 14h4" /></svg>);
118 +const DiskIcon = () => (<svg {...S}><rect x="3" y="4" width="18" height="16" rx="2" /><path d="M7 8h10M7 12h10" /><circle cx="8" cy="16" r="1" /></svg>);
added src/components/NASCard.tsx +87 −0
@@ -0,0 +1,87 @@
1 +"use client";
2 +
3 +import type { NASMetrics } from "@/lib/nas";
4 +
5 +function fmt(bytes: number): string {
6 + const gb = bytes / (1024 * 1024 * 1024);
7 + if (gb >= 1024) return `${(gb / 1024).toFixed(2)} TB`;
8 + if (gb >= 1) return `${gb.toFixed(0)} GB`;
9 + return `${(bytes / (1024 * 1024)).toFixed(0)} MB`;
10 +}
11 +
12 +export default function NASCard({ nas }: { nas: NASMetrics }) {
13 + const pct = Math.min(Math.max(nas.usedPercent ?? 0, 0), 100);
14 + const online = nas.online ?? false;
15 + const color = pct >= 90 ? "#ef4444" : pct >= 75 ? "#f59e0b" : "#22c55e";
16 +
17 + const r = 42, c = 2 * Math.PI * r;
18 + const dash = (pct / 100) * c;
19 +
20 + return (
21 + <div className="glass glass-hover rounded-2xl p-5 fade-in">
22 + <div className="flex items-center justify-between mb-4">
23 + <div className="flex items-center gap-3">
24 + <div className="text-orange-500"><DriveIcon /></div>
25 + <div>
26 + <div className="flex items-center gap-2">
27 + <h3 className="text-sm font-bold text-zinc-900">{nas.name}</h3>
28 + <span className={`h-2 w-2 rounded-full ${online ? "bg-green-500" : "bg-red-500"}`}
29 + style={online ? { boxShadow: "0 0 8px #22c55e88" } : {}} />
30 + </div>
31 + <div className="text-xs text-zinc-500">{nas.model} · {nas.host}</div>
32 + </div>
33 + </div>
34 + <a href={nas.webUrl} target="_blank" rel="noreferrer"
35 + className="text-xs font-medium bg-white/70 border border-zinc-200 text-zinc-700 px-3 py-1.5 rounded-lg hover:bg-white hover:border-violet-300 transition">
36 + Open UGOS
37 + </a>
38 + </div>
39 +
40 + <div className="flex items-center gap-6">
41 + <div className="relative shrink-0" style={{ width: 110, height: 110 }}>
42 + <svg width="110" height="110" viewBox="0 0 110 110">
43 + <circle cx="55" cy="55" r={r} fill="none" stroke={color} strokeOpacity="0.15" strokeWidth="10" />
44 + <circle cx="55" cy="55" r={r} fill="none" stroke={color} strokeWidth="10" strokeLinecap="round"
45 + strokeDasharray={`${dash} ${c}`} transform="rotate(-90 55 55)"
46 + style={{ transition: "stroke-dasharray .5s ease" }} />
47 + </svg>
48 + <div className="absolute inset-0 flex flex-col items-center justify-center">
49 + <span className="text-2xl font-bold tabular-nums text-zinc-900">{Math.round(pct)}%</span>
50 + <span className="text-[10px] text-zinc-500">used</span>
51 + </div>
52 + </div>
53 +
54 + <div className="grid grid-cols-2 gap-x-6 gap-y-3 flex-1">
55 + <Stat label="Used" value={fmt(nas.usedBytes)} accent={color} />
56 + <Stat label="Free" value={fmt(nas.availBytes)} accent="#16a34a" />
57 + <Stat label="Capacity" value={fmt(nas.totalBytes)} accent="#2563eb" />
58 + <Stat label="Mounted on" value={`${nas.mountedNodes}/${nas.totalNodes}`}
59 + accent={nas.mountedNodes === nas.totalNodes && online ? "#16a34a" : "#d97706"} />
60 + </div>
61 + </div>
62 +
63 + <div className="mt-4 pt-3 border-t border-zinc-200/70 flex flex-wrap gap-x-6 gap-y-1 text-xs text-zinc-500">
64 + <span>Share: <span className="text-zinc-700 font-medium">{nas.share}</span></span>
65 + <span>OS: <span className="text-zinc-700 font-medium">UGOS Pro</span></span>
66 + </div>
67 + </div>
68 + );
69 +}
70 +
71 +function Stat({ label, value, accent }: { label: string; value: string; accent: string }) {
72 + return (
73 + <div>
74 + <div className="text-xs text-zinc-500">{label}</div>
75 + <div className="text-lg font-bold tabular-nums text-zinc-900" style={{ color: accent }}>{value}</div>
76 + </div>
77 + );
78 +}
79 +
80 +const DriveIcon = () => (
81 + <svg width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor"
82 + strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round">
83 + <rect x="3" y="4" width="18" height="16" rx="2" />
84 + <path d="M7 8h10M7 12h10" />
85 + <circle cx="8" cy="16" r="1" />
86 + </svg>
87 +);
added src/components/NodeDetail.tsx +179 −0
@@ -0,0 +1,179 @@
1 +"use client";
2 +
3 +import { ClusterNode, TIER_COLORS } from "@/lib/cluster";
4 +import type { NodeMetrics } from "@/lib/ssh";
5 +
6 +interface TailscaleStatus {
7 + online: boolean;
8 + lastSeen: string;
9 + ip: string;
10 +}
11 +
12 +export default function NodeDetail({
13 + node,
14 + status,
15 + metrics,
16 +}: {
17 + node: ClusterNode;
18 + status?: TailscaleStatus;
19 + metrics?: NodeMetrics;
20 +}) {
21 + const online = status?.online ?? metrics?.online ?? false;
22 + const m = metrics;
23 +
24 + const formatUptime = (seconds: number) => {
25 + const d = Math.floor(seconds / 86400);
26 + const h = Math.floor((seconds % 86400) / 3600);
27 + const min = Math.floor((seconds % 3600) / 60);
28 + if (d > 0) return `${d}d ${h}h`;
29 + if (h > 0) return `${h}h ${min}m`;
30 + return `${min}m`;
31 + };
32 +
33 + const formatBytes = (bytes: number) => {
34 + if (bytes === 0) return "0 B";
35 + const gb = bytes / (1024 * 1024 * 1024);
36 + if (gb >= 1) return `${gb.toFixed(1)} GB`;
37 + const mb = bytes / (1024 * 1024);
38 + return `${mb.toFixed(0)} MB`;
39 + };
40 +
41 + return (
42 + <div className="glass fade-in rounded-2xl p-6 space-y-6 sticky top-20">
43 + {/* Header */}
44 + <div className="flex items-center justify-between">
45 + <div>
46 + <div className="flex items-center gap-3">
47 + <h2 className="text-xl font-bold text-zinc-900">{node.name}</h2>
48 + <span
49 + className="text-xs font-semibold px-2 py-0.5 rounded-full border uppercase"
50 + style={{
51 + color: TIER_COLORS[node.tier],
52 + borderColor: TIER_COLORS[node.tier] + "55",
53 + backgroundColor: TIER_COLORS[node.tier] + "18",
54 + }}
55 + >
56 + {node.tier}
57 + </span>
58 + <span className={`text-xs font-medium px-2 py-0.5 rounded-full ${online ? "bg-green-100 text-green-700" : "bg-red-100 text-red-600"}`}>
59 + {online ? "Online" : "Offline"}
60 + </span>
61 + </div>
62 + <div className="text-sm text-zinc-500 mt-1">
63 + {node.chip} &middot; {node.modelName} &middot; {node.generation.toUpperCase()}
64 + </div>
65 + </div>
66 + </div>
67 +
68 + {/* Hardware specs */}
69 + <div className="grid grid-cols-3 gap-4">
70 + <InfoBlock label="CPU Cores" value={node.cpuCores.toString()} />
71 + <InfoBlock label="Memory" value={`${node.memoryGB} GB`} />
72 + <InfoBlock label="GPU Cores" value={node.gpuCores.toString()} />
73 + </div>
74 +
75 + {/* Live metrics */}
76 + {m && m.online && (
77 + <>
78 + <div className="border-t border-zinc-200 pt-4">
79 + <h3 className="text-sm font-semibold text-zinc-600 mb-3">Live Metrics</h3>
80 + <div className="grid grid-cols-2 gap-4">
81 + <MetricBar label="CPU Usage" value={m.cpuUsage} color="#2563eb" />
82 + <MetricBar
83 + label="Memory"
84 + value={m.memoryTotal > 0 ? (m.memoryUsed / m.memoryTotal) * 100 : 0}
85 + color="#7c3aed"
86 + detail={`${formatBytes(m.memoryUsed)} / ${formatBytes(m.memoryTotal)}`}
87 + />
88 + <MetricBar
89 + label="Internal SSD"
90 + value={m.diskTotal > 0 ? (m.diskUsed / m.diskTotal) * 100 : 0}
91 + color="#d97706"
92 + detail={`${formatBytes(m.diskUsed)} / ${formatBytes(m.diskTotal)}`}
93 + />
94 + {m.extDiskTotal > 0 && (
95 + <MetricBar
96 + label="External"
97 + value={(m.extDiskUsed / m.extDiskTotal) * 100}
98 + color="#ca8a04"
99 + detail={`${formatBytes(m.extDiskUsed)} / ${formatBytes(m.extDiskTotal)}`}
100 + />
101 + )}
102 + {m.extDiskTotal > 0 && (
103 + <div className="bg-zinc-100 rounded-lg p-3">
104 + <div className="text-xs text-zinc-500 mb-1">Storage Total</div>
105 + <div className="text-lg font-mono text-zinc-900">
106 + {formatBytes(m.diskUsed + m.extDiskUsed)} / {formatBytes(m.diskTotal + m.extDiskTotal)}
107 + </div>
108 + </div>
109 + )}
110 + <div className="bg-zinc-100 rounded-lg p-3">
111 + <div className="text-xs text-zinc-500 mb-1">Load Average</div>
112 + <div className="text-lg font-mono text-zinc-900">
113 + {m.loadAverage.map((l) => l.toFixed(2)).join(" ")}
114 + </div>
115 + </div>
116 + </div>
117 + </div>
118 +
119 + <div className="grid grid-cols-3 gap-4">
120 + <InfoBlock label="Uptime" value={formatUptime(m.uptime)} />
121 + <InfoBlock label="Processes" value={m.processes.toString()} />
122 + <InfoBlock label="Thermal" value={m.thermalState} />
123 + </div>
124 + </>
125 + )}
126 +
127 + {/* Network info */}
128 + <div className="border-t border-zinc-200 pt-4">
129 + <h3 className="text-sm font-semibold text-zinc-600 mb-3">Network</h3>
130 + <div className="grid grid-cols-2 gap-4 text-sm">
131 + <div>
132 + <span className="text-zinc-500">Hostname:</span>{" "}
133 + <span className="text-zinc-800 font-mono text-xs">{node.hostname}</span>
134 + </div>
135 + <div>
136 + <span className="text-zinc-500">Tailscale IP:</span>{" "}
137 + <span className="text-zinc-800 font-mono text-xs">{status?.ip || node.tailscaleIp}</span>
138 + </div>
139 + <div>
140 + <span className="text-zinc-500">Tailscale Name:</span>{" "}
141 + <span className="text-zinc-800 font-mono text-xs">{node.tailscaleName}</span>
142 + </div>
143 + {status?.lastSeen && (
144 + <div>
145 + <span className="text-zinc-500">Last Seen:</span>{" "}
146 + <span className="text-zinc-800">{new Date(status.lastSeen).toLocaleString()}</span>
147 + </div>
148 + )}
149 + </div>
150 + </div>
151 + </div>
152 + );
153 +}
154 +
155 +function InfoBlock({ label, value }: { label: string; value: string }) {
156 + return (
157 + <div className="bg-zinc-100 rounded-lg p-3">
158 + <div className="text-[10px] text-zinc-500 uppercase tracking-wide">{label}</div>
159 + <div className="text-lg font-semibold text-zinc-900 mt-0.5">{value}</div>
160 + </div>
161 + );
162 +}
163 +
164 +function MetricBar({ label, value, color, detail }: { label: string; value: number; color: string; detail?: string }) {
165 + const pct = Math.min(100, Math.max(0, value));
166 + const hot = pct >= 85;
167 + return (
168 + <div className="bg-zinc-100 rounded-lg p-3">
169 + <div className="flex justify-between text-xs mb-1.5">
170 + <span className="text-zinc-500">{label}</span>
171 + <span className="text-zinc-800 font-mono">{pct.toFixed(1)}%</span>
172 + </div>
173 + <div className="h-2 bg-zinc-200 rounded-full overflow-hidden">
174 + <div className="h-full rounded-full transition-all duration-500" style={{ width: `${pct}%`, backgroundColor: hot ? "#dc2626" : color }} />
175 + </div>
176 + {detail && <div className="text-[10px] text-zinc-500 mt-1">{detail}</div>}
177 + </div>
178 + );
179 +}
added src/components/NodeGrid.tsx +110 −0
@@ -0,0 +1,110 @@
1 +"use client";
2 +
3 +import { ClusterNode, TIER_COLORS } from "@/lib/cluster";
4 +import type { NodeMetrics } from "@/lib/ssh";
5 +
6 +interface TailscaleStatus {
7 + online: boolean;
8 + lastSeen: string;
9 + ip: string;
10 +}
11 +
12 +export default function NodeGrid({
13 + nodes,
14 + statusMap,
15 + metricsMap,
16 + selectedNode,
17 + onSelect,
18 +}: {
19 + nodes: ClusterNode[];
20 + statusMap: Record<string, TailscaleStatus>;
21 + metricsMap: Record<string, NodeMetrics>;
22 + selectedNode: string | null;
23 + onSelect: (id: string) => void;
24 +}) {
25 + return (
26 + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
27 + {nodes.map((node) => {
28 + const ts = statusMap[node.id];
29 + const m = metricsMap[node.id];
30 + const online = ts?.online ?? m?.online ?? false;
31 + const selected = selectedNode === node.id;
32 + const color = TIER_COLORS[node.tier];
33 + const cpu = m ? Math.round(m.cpuUsage) : null;
34 + const mem = m && m.memoryTotal > 0 ? Math.round((m.memoryUsed / m.memoryTotal) * 100) : null;
35 + const dsk = m && m.diskTotal > 0 ? Math.round((m.diskUsed / m.diskTotal) * 100) : null;
36 + const ext = m && (m.extDiskTotal ?? 0) > 0 ? Math.round((m.extDiskUsed / m.extDiskTotal) * 100) : null;
37 +
38 + return (
39 + <button
40 + key={node.id}
41 + onClick={() => onSelect(node.id)}
42 + className={`glass glass-hover text-left rounded-2xl p-4 ${
43 + selected ? "ring-2 ring-violet-500/50 border-violet-300" : ""
44 + } ${online ? "" : "opacity-60"}`}
45 + >
46 + <div className="mb-3 flex items-center justify-between">
47 + <div className="flex items-center gap-2">
48 + <span className="text-base font-semibold text-zinc-900">{node.name}</span>
49 + <span
50 + className="rounded-full border px-1.5 py-0.5 text-[10px] font-semibold uppercase"
51 + style={{ color, borderColor: color + "55", backgroundColor: color + "18" }}
52 + >
53 + {node.tier}
54 + </span>
55 + </div>
56 + <span className={`h-2.5 w-2.5 rounded-full ${online ? "dot-online" : "dot-offline"}`} />
57 + </div>
58 +
59 + <div className="mb-3 text-xs text-zinc-500">
60 + {node.chip} · {node.modelName}
61 + </div>
62 +
63 + {/* Usage bars */}
64 + <div className="space-y-2">
65 + <UsageBar label="CPU" value={cpu} color="#2563eb" />
66 + <UsageBar label="MEM" value={mem} color="#7c3aed" />
67 + <UsageBar label="DSK" value={dsk} color="#d97706" />
68 + {ext !== null && <UsageBar label="EXT" value={ext} color="#ca8a04" />}
69 + </div>
70 +
71 + <div className="mt-3 flex items-center justify-between text-[10px] text-zinc-500">
72 + <span>
73 + {node.cpuCores} cores · {node.memoryGB} GB · {node.gpuCores} GPU
74 + {ext !== null && (
75 + <span className="text-yellow-600 font-medium"> · +{fmtStorage(m!.extDiskTotal)} ext</span>
76 + )}
77 + </span>
78 + {m && <span className="font-mono">load {m.loadAverage[0].toFixed(1)}</span>}
79 + </div>
80 + </button>
81 + );
82 + })}
83 + </div>
84 + );
85 +}
86 +
87 +function fmtStorage(bytes: number): string {
88 + const gb = bytes / (1024 * 1024 * 1024);
89 + if (gb >= 1024) return `${(gb / 1024).toFixed(1)} TB`;
90 + return `${Math.round(gb)} GB`;
91 +}
92 +
93 +function UsageBar({ label, value, color }: { label: string; value: number | null; color: string }) {
94 + const v = value ?? 0;
95 + const hot = v >= 85;
96 + return (
97 + <div>
98 + <div className="mb-1 flex items-center justify-between text-[11px]">
99 + <span className="font-medium text-zinc-500">{label}</span>
100 + <span className="font-mono tabular-nums text-zinc-700">{value === null ? "—" : `${v}%`}</span>
101 + </div>
102 + <div className="h-1.5 w-full overflow-hidden rounded-full bg-zinc-200">
103 + <div
104 + className="h-full rounded-full transition-all"
105 + style={{ width: `${v}%`, backgroundColor: hot ? "#dc2626" : color }}
106 + />
107 + </div>
108 + </div>
109 + );
110 +}
added src/components/Terminal.tsx +128 −0
@@ -0,0 +1,128 @@
1 +"use client";
2 +
3 +import { useState, useRef, useEffect } from "react";
4 +import { CLUSTER_NODES } from "@/lib/cluster";
5 +
6 +interface TerminalLine {
7 + type: "input" | "output" | "error" | "system";
8 + text: string;
9 + node?: string;
10 +}
11 +
12 +export default function Terminal() {
13 + const [lines, setLines] = useState<TerminalLine[]>([
14 + { type: "system", text: "MacLustr Terminal — Connected to cluster" },
15 + ]);
16 + const [input, setInput] = useState("");
17 + const [target, setTarget] = useState("all");
18 + const [running, setRunning] = useState(false);
19 + const bottomRef = useRef<HTMLDivElement>(null);
20 +
21 + useEffect(() => {
22 + bottomRef.current?.scrollIntoView({ behavior: "smooth" });
23 + }, [lines]);
24 +
25 + const execute = async () => {
26 + if (!input.trim() || running) return;
27 + const cmd = input.trim();
28 + setInput("");
29 + setRunning(true);
30 +
31 + setLines(prev => [...prev, { type: "input", text: `[${target}] $ ${cmd}` }]);
32 +
33 + try {
34 + const res = await fetch("/api/ssh", {
35 + method: "POST",
36 + headers: { "Content-Type": "application/json" },
37 + body: JSON.stringify({ nodeId: target, command: cmd }),
38 + });
39 + const data = await res.json();
40 +
41 + if (data.results) {
42 + for (const r of data.results) {
43 + setLines(prev => [
44 + ...prev,
45 + { type: "system", text: `--- ${r.nodeId} ---`, node: r.nodeId },
46 + { type: "output", text: r.output, node: r.nodeId },
47 + ]);
48 + }
49 + } else if (data.output !== undefined) {
50 + setLines(prev => [...prev, { type: "output", text: data.output, node: target }]);
51 + } else if (data.error) {
52 + setLines(prev => [...prev, { type: "error", text: data.error }]);
53 + }
54 + } catch (err) {
55 + setLines(prev => [...prev, { type: "error", text: `Error: ${(err as Error).message}` }]);
56 + }
57 +
58 + setRunning(false);
59 + };
60 +
61 + return (
62 + <div className="bg-zinc-950 border border-zinc-800 rounded-xl overflow-hidden flex flex-col h-[500px]">
63 + {/* Header */}
64 + <div className="flex items-center gap-3 px-4 py-2 bg-zinc-900 border-b border-zinc-800">
65 + <div className="flex gap-1.5">
66 + <div className="w-3 h-3 rounded-full bg-red-500" />
67 + <div className="w-3 h-3 rounded-full bg-yellow-500" />
68 + <div className="w-3 h-3 rounded-full bg-green-500" />
69 + </div>
70 + <span className="text-xs text-zinc-400 font-mono">cluster-terminal</span>
71 + <select
72 + value={target}
73 + onChange={(e) => setTarget(e.target.value)}
74 + className="ml-auto text-xs bg-zinc-800 text-zinc-300 border border-zinc-700 rounded px-2 py-1"
75 + >
76 + <option value="all">All Nodes</option>
77 + {CLUSTER_NODES.map(n => (
78 + <option key={n.id} value={n.id}>{n.name}</option>
79 + ))}
80 + </select>
81 + </div>
82 +
83 + {/* Output */}
84 + <div className="flex-1 overflow-y-auto p-4 font-mono text-sm space-y-1">
85 + {lines.map((line, i) => (
86 + <div key={i} className={lineClass(line.type)}>
87 + {line.text}
88 + </div>
89 + ))}
90 + {running && <div className="text-zinc-500 animate-pulse">Running...</div>}
91 + <div ref={bottomRef} />
92 + </div>
93 +
94 + {/* Input */}
95 + <form
96 + onSubmit={(e) => { e.preventDefault(); execute(); }}
97 + className="flex items-center border-t border-zinc-800 px-4 py-2 gap-2"
98 + >
99 + <span className="text-green-400 font-mono text-sm">$</span>
100 + <input
101 + type="text"
102 + value={input}
103 + onChange={(e) => setInput(e.target.value)}
104 + placeholder="Enter command..."
105 + disabled={running}
106 + className="flex-1 bg-transparent text-zinc-200 font-mono text-sm outline-none placeholder:text-zinc-600"
107 + autoFocus
108 + />
109 + <button
110 + type="submit"
111 + disabled={running || !input.trim()}
112 + className="text-xs bg-blue-600 text-white px-3 py-1 rounded hover:bg-blue-500 disabled:opacity-50"
113 + >
114 + Run
115 + </button>
116 + </form>
117 + </div>
118 + );
119 +}
120 +
121 +function lineClass(type: TerminalLine["type"]): string {
122 + switch (type) {
123 + case "input": return "text-green-400";
124 + case "output": return "text-zinc-300 whitespace-pre-wrap";
125 + case "error": return "text-red-400";
126 + case "system": return "text-zinc-500 italic";
127 + }
128 +}
added src/lib/auth.ts +74 −0
@@ -0,0 +1,74 @@
1 +// Lightweight auth for the MacLustr web console.
2 +// 10 fixed accounts: user1..user10 with passwords admin1..admin10.
3 +// Sessions are HMAC-SHA256 signed tokens stored in an httpOnly cookie.
4 +// Works in both the Edge (middleware) and Node (route handler) runtimes
5 +// using Web Crypto + base64url (no Buffer dependency).
6 +
7 +const SECRET = process.env.AUTH_SECRET || "maclustr-console-7f3a9c2e8b14-secret";
8 +export const SESSION_COOKIE = "ml_session";
9 +const SESSION_TTL_SECONDS = 60 * 60 * 12; // 12h
10 +
11 +export const USERS: Record<string, string> = Object.fromEntries(
12 + Array.from({ length: 10 }, (_, i) => [`user${i + 1}`, `admin${i + 1}`])
13 +);
14 +
15 +export function checkCredentials(user: string, pass: string): boolean {
16 + const expected = USERS[user];
17 + return expected !== undefined && expected === pass;
18 +}
19 +
20 +function b64url(bytes: Uint8Array): string {
21 + let s = "";
22 + for (const b of bytes) s += String.fromCharCode(b);
23 + return btoa(s).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
24 +}
25 +
26 +async function hmac(data: string): Promise<string> {
27 + const key = await crypto.subtle.importKey(
28 + "raw",
29 + new TextEncoder().encode(SECRET),
30 + { name: "HMAC", hash: "SHA-256" },
31 + false,
32 + ["sign"]
33 + );
34 + const sig = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(data));
35 + return b64url(new Uint8Array(sig));
36 +}
37 +
38 +export async function signSession(user: string): Promise<string> {
39 + const exp = Math.floor(Date.now() / 1000) + SESSION_TTL_SECONDS;
40 + const payload = `${user}.${exp}`;
41 + const sig = await hmac(payload);
42 + return `${payload}.${sig}`;
43 +}
44 +
45 +/** Returns the username if the token is valid and unexpired, else null. */
46 +export async function verifySession(token: string | undefined): Promise<string | null> {
47 + if (!token) return null;
48 + const parts = token.split(".");
49 + if (parts.length !== 3) return null;
50 + const [user, expStr, sig] = parts;
51 + const expected = await hmac(`${user}.${expStr}`);
52 + if (sig.length !== expected.length) return null;
53 + let diff = 0;
54 + for (let i = 0; i < sig.length; i++) diff |= sig.charCodeAt(i) ^ expected.charCodeAt(i);
55 + if (diff !== 0) return null;
56 + const exp = parseInt(expStr, 10);
57 + if (!Number.isFinite(exp) || exp < Math.floor(Date.now() / 1000)) return null;
58 + return user;
59 +}
60 +
61 +/** Validate an HTTP Basic Auth header (used by API clients such as the iOS app). */
62 +export function checkBasicAuth(header: string | null): boolean {
63 + if (!header || !header.startsWith("Basic ")) return false;
64 + try {
65 + const decoded = atob(header.slice(6));
66 + const idx = decoded.indexOf(":");
67 + if (idx < 0) return false;
68 + return checkCredentials(decoded.slice(0, idx), decoded.slice(idx + 1));
69 + } catch {
70 + return false;
71 + }
72 +}
73 +
74 +export const SESSION_MAX_AGE = SESSION_TTL_SECONDS;
added src/lib/cluster.ts +85 −0
@@ -0,0 +1,85 @@
1 +export interface ClusterNode {
2 + id: string;
3 + name: string;
4 + hostname: string;
5 + tailscaleName: string;
6 + tailscaleIp: string;
7 + /** LAN address (192.168.2.0/24) for direct node-to-node traffic; empty when Tailscale-only. */
8 + lanIp?: string;
9 + chip: string;
10 + modelName: string;
11 + cpuCores: number;
12 + memoryGB: number;
13 + gpuCores: number;
14 + tier: "ultra" | "max" | "pro" | "base";
15 + generation: string;
16 + role: "compute" | "worker";
17 +}
18 +
19 +export const CLUSTER_NODES: ClusterNode[] = [
20 + { id: "M3U96a", name: "M3U96a", hostname: "M3U96a.maclustr.io", tailscaleName: "macstudio-de-simon-pierre-5-1", tailscaleIp: "100.114.37.21", lanIp: "192.168.2.166", chip: "M3 Ultra", modelName: "Mac Studio", cpuCores: 32, memoryGB: 96, gpuCores: 80, tier: "ultra", generation: "m3", role: "compute" },
21 + { id: "M3U96b", name: "M3U96b", hostname: "M3U96b.maclustr.io", tailscaleName: "macstudio-de-simon-pierre-3", tailscaleIp: "100.64.248.66", lanIp: "192.168.2.125", chip: "M3 Ultra", modelName: "Mac Studio", cpuCores: 32, memoryGB: 96, gpuCores: 80, tier: "ultra", generation: "m3", role: "compute" },
22 + { id: "M2U64", name: "M2U64", hostname: "M2U64.maclustr.io", tailscaleName: "macstudio-de-simon-pierre", tailscaleIp: "100.86.37.40", chip: "M2 Ultra", modelName: "Mac Studio", cpuCores: 24, memoryGB: 64, gpuCores: 76, tier: "ultra", generation: "m2", role: "compute" },
23 + { id: "M4M64a", name: "M4M64a", hostname: "M4M64a.maclustr.io", tailscaleName: "macstudio-de-simon-pierre-6", tailscaleIp: "100.67.55.114", lanIp: "192.168.2.127", chip: "M4 Max", modelName: "Mac Studio", cpuCores: 16, memoryGB: 64, gpuCores: 40, tier: "max", generation: "m4", role: "worker" },
24 + { id: "M4M64b", name: "M4M64b", hostname: "M4M64b.maclustr.io", tailscaleName: "macstudio-de-simon-pierre-8", tailscaleIp: "100.96.144.88", lanIp: "192.168.2.128", chip: "M4 Max", modelName: "Mac Studio", cpuCores: 16, memoryGB: 64, gpuCores: 40, tier: "max", generation: "m4", role: "worker" },
25 + { id: "M4BP48", name: "M4BP48", hostname: "M4BP48.maclustr.io", tailscaleName: "simon-pierres-macbook-pro-2", tailscaleIp: "100.66.205.22", lanIp: "192.168.2.137", chip: "M4 Max", modelName: "MacBook Pro", cpuCores: 16, memoryGB: 48, gpuCores: 40, tier: "max", generation: "m4", role: "worker" },
26 + { id: "M4BP36", name: "M4BP36", hostname: "M4BP36.maclustr.io", tailscaleName: "simon-pierres-macbook-pro", tailscaleIp: "100.125.194.59", lanIp: "192.168.2.133", chip: "M4 Max", modelName: "MacBook Pro", cpuCores: 14, memoryGB: 36, gpuCores: 32, tier: "max", generation: "m4", role: "worker" },
27 + { id: "M4M36", name: "M4M36", hostname: "M4M36.maclustr.io", tailscaleName: "macstudio-de-simon-pierre-3-1", tailscaleIp: "100.83.17.53", lanIp: "192.168.2.131", chip: "M4 Max", modelName: "Mac Studio", cpuCores: 14, memoryGB: 36, gpuCores: 40, tier: "max", generation: "m4", role: "worker" },
28 + { id: "M2M32", name: "M2M32", hostname: "M2M32.maclustr.io", tailscaleName: "macstudio-de-simon-pierre-2-1", tailscaleIp: "100.117.121.45", lanIp: "192.168.2.129", chip: "M2 Max", modelName: "Mac Studio", cpuCores: 12, memoryGB: 32, gpuCores: 38, tier: "max", generation: "m2", role: "worker" },
29 + { id: "M2M32b", name: "M2M32b", hostname: "M2M32b.maclustr.io", tailscaleName: "simon-pierres-mac-studio", tailscaleIp: "100.111.100.56", lanIp: "192.168.2.130", chip: "M2 Max", modelName: "Mac Studio", cpuCores: 12, memoryGB: 32, gpuCores: 38, tier: "max", generation: "m2", role: "worker" },
30 + { id: "M2M32c", name: "M2M32c", hostname: "M2M32c.maclustr.io", tailscaleName: "macstudio-de-simon-pierre-7", tailscaleIp: "100.114.153.84", lanIp: "192.168.2.126", chip: "M2 Max", modelName: "Mac Studio", cpuCores: 12, memoryGB: 32, gpuCores: 30, tier: "max", generation: "m2", role: "worker" },
31 + { id: "m4mc", name: "m4mc", hostname: "m4mc.maclustr.io", tailscaleName: "macmini-de-simon-pierre-3", tailscaleIp: "100.119.234.78", lanIp: "192.168.2.134", chip: "M4 Pro", modelName: "Mac mini", cpuCores: 12, memoryGB: 24, gpuCores: 16, tier: "pro", generation: "m4", role: "worker" },
32 + { id: "M1M32", name: "M1M32", hostname: "M1M32.maclustr.io", tailscaleName: "macstudio-de-simon-pierre-4-1", tailscaleIp: "100.71.182.61", lanIp: "192.168.2.132", chip: "M1 Max", modelName: "Mac Studio", cpuCores: 10, memoryGB: 32, gpuCores: 32, tier: "max", generation: "m1", role: "worker" },
33 + { id: "m4ma", name: "m4ma", hostname: "m4ma.maclustr.io", tailscaleName: "macmini-de-simon-pierre", tailscaleIp: "100.79.44.76", lanIp: "192.168.2.135", chip: "M4", modelName: "Mac mini", cpuCores: 10, memoryGB: 24, gpuCores: 10, tier: "base", generation: "m4", role: "worker" },
34 + { id: "m4mb", name: "m4mb", hostname: "m4mb.maclustr.io", tailscaleName: "macmini-de-simon-pierre-2", tailscaleIp: "100.103.74.121", lanIp: "192.168.2.136", chip: "M4", modelName: "Mac mini", cpuCores: 10, memoryGB: 16, gpuCores: 10, tier: "base", generation: "m4", role: "worker" },
35 + { id: "M3BA24", name: "M3BA24", hostname: "M3BA24.maclustr.io", tailscaleName: "macbookair-de-simon-pierre", tailscaleIp: "100.81.73.64", lanIp: "192.168.2.145", chip: "M3", modelName: "MacBook Air", cpuCores: 8, memoryGB: 24, gpuCores: 10, tier: "base", generation: "m3", role: "worker" },
36 + { id: "m2m8a", name: "m2m8a", hostname: "m2m8a.maclustr.io", tailscaleName: "mac-mini-de-simon-pierre-1", tailscaleIp: "100.86.164.23", lanIp: "192.168.2.167", chip: "M2", modelName: "Mac mini", cpuCores: 8, memoryGB: 8, gpuCores: 10, tier: "base", generation: "m2", role: "worker" },
37 + { id: "m2m16", name: "m2m16", hostname: "m2m16.maclustr.io", tailscaleName: "macmini-de-simon-pierre-4", tailscaleIp: "100.64.86.19", lanIp: "192.168.2.169", chip: "M2 Pro", modelName: "Mac mini", cpuCores: 10, memoryGB: 16, gpuCores: 16, tier: "pro", generation: "m2", role: "worker" },
38 + { id: "M3BA16", name: "M3BA16", hostname: "M3BA16.maclustr.io", tailscaleName: "macbookair-de-simon-pierre-1", tailscaleIp: "100.104.125.79", lanIp: "192.168.2.143", chip: "M3", modelName: "MacBook Air", cpuCores: 8, memoryGB: 16, gpuCores: 10, tier: "base", generation: "m3", role: "worker" },
39 + { id: "m2m8b", name: "m2m8b", hostname: "m2m8b.maclustr.io", tailscaleName: "mac-mini-de-simon-pierre-2", tailscaleIp: "100.101.248.32", lanIp: "192.168.2.170", chip: "M2", modelName: "Mac mini", cpuCores: 8, memoryGB: 8, gpuCores: 10, tier: "base", generation: "m2", role: "worker" },
40 +];
41 +
42 +/** UGREEN NAS devices shared across the cluster over SMB (each mounted at ~/<mountSubdir> on every node). */
43 +export interface NASConfig {
44 + id: string;
45 + name: string;
46 + model: string;
47 + os: string;
48 + host: string;
49 + user: string;
50 + share: string;
51 + volume: string;
52 + mountSubdir: string;
53 + webUrl: string;
54 +}
55 +
56 +export const NAS_DEVICES: NASConfig[] = [
57 + {
58 + id: "nas-ugreen-1", name: "UGREEN DXP4800 Plus", model: "DXP4800 Plus", os: "UGOS Pro",
59 + host: "192.168.2.173", user: "maclustr-nas", share: "clustr", volume: "/volume1",
60 + mountSubdir: "nas_clustr", webUrl: "http://192.168.2.173:9999",
61 + },
62 + {
63 + id: "nas-ugreen-2", name: "UGREEN DH4300 Plus", model: "DH4300 Plus", os: "UGOS Pro",
64 + host: "192.168.2.175", user: "maclustr-nas-2", share: "clustr", volume: "/volume1",
65 + mountSubdir: "nas2_clustr", webUrl: "http://192.168.2.175:9999",
66 + },
67 +];
68 +
69 +export const TOTAL_CORES = CLUSTER_NODES.reduce((a, n) => a + n.cpuCores, 0);
70 +export const TOTAL_MEMORY = CLUSTER_NODES.reduce((a, n) => a + n.memoryGB, 0);
71 +export const TOTAL_GPU = CLUSTER_NODES.reduce((a, n) => a + n.gpuCores, 0);
72 +
73 +export const TIER_COLORS: Record<string, string> = {
74 + ultra: "#a855f7",
75 + max: "#3b82f6",
76 + pro: "#14b8a6",
77 + base: "#22c55e",
78 +};
79 +
80 +export const TIER_BG: Record<string, string> = {
81 + ultra: "bg-purple-500/20 text-purple-400 border-purple-500/30",
82 + max: "bg-blue-500/20 text-blue-400 border-blue-500/30",
83 + pro: "bg-teal-500/20 text-teal-400 border-teal-500/30",
84 + base: "bg-green-500/20 text-green-400 border-green-500/30",
85 +};
added src/lib/nas.ts +63 −0
@@ -0,0 +1,63 @@
1 +import { executeSSH } from "./ssh";
2 +import { CLUSTER_NODES, NAS_DEVICES, type NASConfig } from "./cluster";
3 +
4 +export interface NASMetrics {
5 + id: string;
6 + name: string;
7 + model: string;
8 + host: string;
9 + share: string;
10 + webUrl: string;
11 + online: boolean;
12 + totalBytes: number;
13 + usedBytes: number;
14 + availBytes: number;
15 + usedPercent: number;
16 + mountedNodes: number;
17 + totalNodes: number;
18 +}
19 +
20 +/**
21 + * Reads each NAS's storage from its SMB share mounted on the cluster nodes (~/<mountSubdir>).
22 + * Reuses the existing SSH-key access to the nodes (no NAS credentials) and is immune to the
23 + * NAS SSH auto-blocking. One parallel `df` pass per NAS yields storage + mounted-node count.
24 + */
25 +export async function collectNASMetrics(): Promise<NASMetrics[]> {
26 + return Promise.all(NAS_DEVICES.map((dev) => collectOne(dev)));
27 +}
28 +
29 +async function collectOne(dev: NASConfig): Promise<NASMetrics> {
30 + const totalNodes = CLUSTER_NODES.length;
31 + const result: NASMetrics = {
32 + id: dev.id, name: dev.name, model: dev.model, host: dev.host,
33 + share: dev.share, webUrl: dev.webUrl,
34 + online: false, totalBytes: 0, usedBytes: 0, availBytes: 0,
35 + usedPercent: 0, mountedNodes: 0, totalNodes,
36 + };
37 +
38 + const cmd = `df -k "$HOME/${dev.mountSubdir}" 2>/dev/null | tail -1`;
39 + const raws = await Promise.allSettled(
40 + CLUSTER_NODES.map((n) => executeSSH(n.hostname, cmd, 7000))
41 + );
42 +
43 + let mounted = 0;
44 + for (const r of raws) {
45 + if (r.status !== "fulfilled") continue;
46 + const f = r.value.trim().split(/\s+/);
47 + if (f.length >= 4 && f[0].startsWith("//")) {
48 + mounted++;
49 + if (!result.online) {
50 + const blocks = parseInt(f[1], 10) || 0;
51 + const used = parseInt(f[2], 10) || 0;
52 + const avail = parseInt(f[3], 10) || 0;
53 + result.online = true;
54 + result.totalBytes = blocks * 1024;
55 + result.usedBytes = used * 1024;
56 + result.availBytes = avail * 1024;
57 + result.usedPercent = blocks > 0 ? (used / blocks) * 100 : 0;
58 + }
59 + }
60 + }
61 + result.mountedNodes = mounted;
62 + return result;
63 +}
added src/lib/ssh.ts +152 −0
@@ -0,0 +1,152 @@
1 +import { Client } from "ssh2";
2 +import { readFileSync } from "fs";
3 +
4 +const SSH_USER = process.env.SSH_USER || "simon-pierreboucher";
5 +const SSH_KEY_PATH = process.env.SSH_KEY_PATH || `${process.env.HOME}/.ssh/id_ed25519`;
6 +
7 +export function executeSSH(host: string, command: string, timeoutMs = 10000): Promise<string> {
8 + return new Promise((resolve, reject) => {
9 + const conn = new Client();
10 + let output = "";
11 + const timer = setTimeout(() => {
12 + conn.end();
13 + reject(new Error("SSH timeout"));
14 + }, timeoutMs);
15 +
16 + conn
17 + .on("ready", () => {
18 + conn.exec(command, (err, stream) => {
19 + if (err) {
20 + clearTimeout(timer);
21 + conn.end();
22 + reject(err);
23 + return;
24 + }
25 + stream.on("data", (data: Buffer) => { output += data.toString(); });
26 + stream.stderr.on("data", (data: Buffer) => { output += data.toString(); });
27 + stream.on("close", () => {
28 + clearTimeout(timer);
29 + conn.end();
30 + resolve(output.trim());
31 + });
32 + });
33 + })
34 + .on("error", (err) => {
35 + clearTimeout(timer);
36 + reject(err);
37 + })
38 + .connect({
39 + host,
40 + port: 22,
41 + username: SSH_USER,
42 + privateKey: readFileSync(SSH_KEY_PATH),
43 + hostVerifier: () => true,
44 + } as Record<string, unknown>);
45 + });
46 +}
47 +
48 +export interface NodeMetrics {
49 + nodeId: string;
50 + online: boolean;
51 + cpuUsage: number;
52 + memoryUsed: number;
53 + memoryTotal: number;
54 + diskUsed: number; // internal SSD, bytes
55 + diskTotal: number; // internal SSD, bytes
56 + extDiskUsed: number; // external drives (sum of /Volumes/*), bytes
57 + extDiskTotal: number; // external drives, bytes
58 + loadAverage: number[];
59 + uptime: number;
60 + processes: number;
61 + thermalState: string;
62 + gpuUsage: number;
63 + networkIn: number; // KB/s
64 + networkOut: number; // KB/s
65 +}
66 +
67 +const METRICS_COMMAND = `
68 +IFACE=$(route -n get default 2>/dev/null | awk '/interface:/{print $2}')
69 +echo "CPU:$(top -l 1 -n 0 2>/dev/null | awk '/CPU usage/{gsub(/%/,""); print 100 - $7}' || echo 0)"
70 +echo "MEM_TOTAL:$(sysctl -n hw.memsize 2>/dev/null || echo 0)"
71 +echo "MEM_PRESS:$(vm_stat 2>/dev/null | awk '/Pages active/{a=$3} /Pages wired down/{w=$4} /Pages occupied by compressor/{c=$5} /Pages free/{f=$3} /Pages inactive/{i=$3} /Pages speculative/{s=$3} END{u=a+w+c; t=u+f+i+s; if(t>0) printf "%.2f", u/t*100; else print 50}' || echo 0)"
72 +echo "DISK:$(df -k / 2>/dev/null | tail -1 | awk '{print $3,$2}')"
73 +echo "DISK_EXT:$(df -k 2>/dev/null | awk '$9 ~ "^/Volumes/" {u+=$3; t+=$2} END{printf "%d %d", u+0, t+0}')"
74 +echo "LOAD:$(sysctl -n vm.loadavg 2>/dev/null | tr -d '{}' || echo '0 0 0')"
75 +echo "UPTIME:$(sysctl -n kern.boottime 2>/dev/null | awk -F'sec = ' '{print $2}' | awk -F',' '{print $1}')"
76 +echo "PROCS:$(ps aux 2>/dev/null | wc -l | tr -d ' ')"
77 +echo "THERMAL:$(pmset -g therm 2>/dev/null | awk '/CPU_Scheduler_Limit/{print $3}' || echo 100)"
78 +echo "GPU:$(ioreg -r -c IOAccelerator -d 1 2>/dev/null | grep -o '\"Device Utilization %\"=[0-9]*' | grep -o '[0-9]*$' | sort -rn | head -1 || echo -1)"
79 +echo "NET:$(netstat -ibn -I \${IFACE:-en0} 2>/dev/null | grep -v Link | tail -1 | awk '{print $7, $10}' || echo '0 0')"
80 +`.trim();
81 +
82 +// Per-node previous network counters, to derive a KB/s rate between polls.
83 +const netPrev = new Map<string, { in: number; out: number; t: number }>();
84 +
85 +export async function collectMetrics(nodeId: string, hostname: string): Promise<NodeMetrics> {
86 + const defaults: NodeMetrics = {
87 + nodeId, online: false, cpuUsage: 0,
88 + memoryUsed: 0, memoryTotal: 0,
89 + diskUsed: 0, diskTotal: 0,
90 + extDiskUsed: 0, extDiskTotal: 0,
91 + loadAverage: [0, 0, 0], uptime: 0,
92 + processes: 0, thermalState: "nominal",
93 + gpuUsage: -1, networkIn: 0, networkOut: 0,
94 + };
95 +
96 + try {
97 + const raw = await executeSSH(hostname, METRICS_COMMAND);
98 + const lines = raw.split("\n");
99 + const get = (prefix: string) => lines.find(l => l.startsWith(prefix))?.slice(prefix.length) || "";
100 +
101 + const cpuRaw = parseFloat(get("CPU:")) || 0;
102 + const memTotal = parseInt(get("MEM_TOTAL:")) || 0;
103 + // Match the macOS app exactly: memory "pressure" = (active+wired+compressor) /
104 + // (active+wired+compressor+free+inactive+speculative), used = total * pressure.
105 + const memPress = parseFloat(get("MEM_PRESS:")) || 0;
106 + const memUsed = Math.round(memTotal * (memPress / 100));
107 + const diskParts = get("DISK:").split(/\s+/);
108 + const diskUsed = parseInt(diskParts[0] || "0") * 1024;
109 + const diskTotal = parseInt(diskParts[1] || "0") * 1024;
110 + const extParts = get("DISK_EXT:").trim().split(/\s+/);
111 + const extDiskUsed = parseInt(extParts[0] || "0") * 1024;
112 + const extDiskTotal = parseInt(extParts[1] || "0") * 1024;
113 + const loadParts = get("LOAD:").trim().split(/\s+/).map(Number);
114 + const bootTime = parseInt(get("UPTIME:")) || 0;
115 + const uptime = bootTime > 0 ? Math.floor(Date.now() / 1000) - bootTime : 0;
116 + const procs = parseInt(get("PROCS:")) || 0;
117 + const thermal = parseInt(get("THERMAL:")) || 100;
118 + const gpu = parseFloat(get("GPU:"));
119 + const gpuUsage = Number.isFinite(gpu) ? gpu : -1;
120 +
121 + // Network: cumulative bytes -> KB/s rate using the previous sample.
122 + const netParts = get("NET:").trim().split(/\s+/).map(Number);
123 + let networkIn = 0, networkOut = 0;
124 + if (netParts.length >= 2 && Number.isFinite(netParts[0]) && Number.isFinite(netParts[1])) {
125 + const now = Date.now();
126 + const prev = netPrev.get(nodeId);
127 + if (prev && now > prev.t && netParts[0] >= prev.in && netParts[1] >= prev.out) {
128 + const dt = (now - prev.t) / 1000;
129 + networkIn = (netParts[0] - prev.in) / 1024 / dt;
130 + networkOut = (netParts[1] - prev.out) / 1024 / dt;
131 + }
132 + netPrev.set(nodeId, { in: netParts[0], out: netParts[1], t: now });
133 + }
134 +
135 + return {
136 + nodeId, online: true,
137 + cpuUsage: cpuRaw,
138 + memoryUsed: memUsed,
139 + memoryTotal: memTotal,
140 + diskUsed, diskTotal,
141 + extDiskUsed, extDiskTotal,
142 + loadAverage: loadParts.length >= 3 ? loadParts.slice(0, 3) : [0, 0, 0],
143 + uptime, processes: procs,
144 + thermalState: thermal >= 100 ? "nominal" : thermal >= 70 ? "fair" : "serious",
145 + gpuUsage,
146 + networkIn: Math.round(networkIn),
147 + networkOut: Math.round(networkOut),
148 + };
149 + } catch {
150 + return defaults;
151 + }
152 +}
added src/lib/tailscale.ts +43 −0
@@ -0,0 +1,43 @@
1 +export interface TailscaleDevice {
2 + id: string;
3 + name: string;
4 + hostname: string;
5 + addresses: string[];
6 + os: string;
7 + online: boolean;
8 + lastSeen: string;
9 + clientVersion: string;
10 +}
11 +
12 +export async function getTailscaleDevices(): Promise<TailscaleDevice[]> {
13 + const apiKey = process.env.TAILSCALE_API_KEY;
14 + const tailnet = process.env.TAILSCALE_TAILNET;
15 +
16 + if (!apiKey || apiKey.startsWith("tskey-api-XXXX")) {
17 + return [];
18 + }
19 +
20 + const res = await fetch(`https://api.tailscale.com/api/v2/tailnet/${tailnet}/devices`, {
21 + headers: {
22 + Authorization: `Bearer ${apiKey}`,
23 + },
24 + next: { revalidate: 30 },
25 + });
26 +
27 + if (!res.ok) {
28 + console.error("Tailscale API error:", res.status, await res.text());
29 + return [];
30 + }
31 +
32 + const data = await res.json();
33 + return (data.devices || []).map((d: Record<string, unknown>) => ({
34 + id: d.id,
35 + name: d.name,
36 + hostname: d.hostname,
37 + addresses: d.addresses || [],
38 + os: d.os,
39 + online: d.connectedToControl ?? d.online ?? false,
40 + lastSeen: d.lastSeen,
41 + clientVersion: d.clientVersion || "",
42 + }));
43 +}
added src/middleware.ts +42 −0
@@ -0,0 +1,42 @@
1 +import { NextResponse } from "next/server";
2 +import type { NextRequest } from "next/server";
3 +import { SESSION_COOKIE, verifySession, checkBasicAuth } from "@/lib/auth";
4 +
5 +// Protect the whole console. Browsers authenticate via the login cookie;
6 +// API clients (e.g. the iOS app) may instead send HTTP Basic Auth.
7 +export async function middleware(req: NextRequest) {
8 + const { pathname } = req.nextUrl;
9 +
10 + // Public paths: login page + the login API.
11 + if (pathname === "/login" || pathname === "/api/auth/login") {
12 + return NextResponse.next();
13 + }
14 +
15 + const cookie = req.cookies.get(SESSION_COOKIE)?.value;
16 + const user = await verifySession(cookie);
17 + if (user) return NextResponse.next();
18 +
19 + if (checkBasicAuth(req.headers.get("authorization"))) {
20 + return NextResponse.next();
21 + }
22 +
23 + // Unauthenticated.
24 + if (pathname.startsWith("/api/")) {
25 + return NextResponse.json(
26 + { error: "Unauthorized" },
27 + { status: 401, headers: { "WWW-Authenticate": 'Basic realm="MacLustr"' } }
28 + );
29 + }
30 +
31 + const url = req.nextUrl.clone();
32 + url.pathname = "/login";
33 + url.searchParams.set("from", pathname);
34 + return NextResponse.redirect(url);
35 +}
36 +
37 +export const config = {
38 + // Run on everything except Next internals and static asset files (images/fonts).
39 + matcher: [
40 + "/((?!_next/static|_next/image|favicon.ico|robots.txt|.*\\.png$|.*\\.jpg$|.*\\.jpeg$|.*\\.svg$|.*\\.ico$|.*\\.webp$|.*\\.woff2?$).*)",
41 + ],
42 +};
added tsconfig.json +34 −0
@@ -0,0 +1,34 @@
1 +{
2 + "compilerOptions": {
3 + "target": "ES2017",
4 + "lib": ["dom", "dom.iterable", "esnext"],
5 + "allowJs": true,
6 + "skipLibCheck": true,
7 + "strict": true,
8 + "noEmit": true,
9 + "esModuleInterop": true,
10 + "module": "esnext",
11 + "moduleResolution": "bundler",
12 + "resolveJsonModule": true,
13 + "isolatedModules": true,
14 + "jsx": "react-jsx",
15 + "incremental": true,
16 + "plugins": [
17 + {
18 + "name": "next"
19 + }
20 + ],
21 + "paths": {
22 + "@/*": ["./src/*"]
23 + }
24 + },
25 + "include": [
26 + "next-env.d.ts",
27 + "**/*.ts",
28 + "**/*.tsx",
29 + ".next/types/**/*.ts",
30 + ".next/dev/types/**/*.ts",
31 + "**/*.mts"
32 + ],
33 + "exclude": ["node_modules"]
34 +}
added web.log +8 −0
@@ -0,0 +1,8 @@
1 +
2 +> maclustr-web@0.1.0 start
3 +> next start
4 +
5 +▲ Next.js 16.2.4
6 +- Local: http://localhost:3000
7 +- Network: http://192.168.0.98:3000
8 +✓ Ready in 71ms
9