├── Frontend_Web_Console
├── .gitignore
├── README.md
├── eslint.config.js
├── index.html
├── package-lock.json
├── package.json
├── public
│ └── vite.svg
├── src
│ ├── App.css
│ ├── App.jsx
│ ├── index.css
│ ├── layouts
│ │ └── DashboardLayout.jsx
│ ├── lightTheme.js
│ ├── main.jsx
│ ├── pages
│ │ └── Dashboard.jsx
│ └── theme.js
└── vite.config.js
├── Linux_firewall_agent
├── Cargo.toml
└── src
│ └── main.rs
├── Public
└── architecture.png
├── README.md
├── Windows_Agent
├── .env
├── Firewall_utils.py
├── __pycache__
│ ├── Firewall_utils.cpython-312.pyc
│ └── main.cpython-312.pyc
├── main.py
└── requirements.txt
├── docker-compose.yaml
└── firewall_API
├── .dockerignore
├── .env.sample
├── .gitignore
├── dockerfile
├── package-lock.json
├── package.json
└── src
├── DB
└── index.db.js
├── app.js
├── constants.js
├── controllers
├── Agent.controller.js
└── webconsole.controller.js
├── index.js
├── models
├── device.model.js
├── deviceHistory.model.js
├── group.model.js
└── rule.model.js
├── routes
├── agent
│ └── Agent.routes.js
└── webConsole
│ └── WebConsole.routes.js
├── sockets.js
└── utils
└── asyncHandler.js
/Frontend_Web_Console/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/README.md:
--------------------------------------------------------------------------------
1 | # React + Vite
2 |
3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4 |
5 | Currently, two official plugins are available:
6 |
7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9 |
10 | ## Expanding the ESLint configuration
11 |
12 | If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
13 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/eslint.config.js:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js'
2 | import globals from 'globals'
3 | import reactHooks from 'eslint-plugin-react-hooks'
4 | import reactRefresh from 'eslint-plugin-react-refresh'
5 | import { defineConfig, globalIgnores } from 'eslint/config'
6 |
7 | export default defineConfig([
8 | globalIgnores(['dist']),
9 | {
10 | files: ['**/*.{js,jsx}'],
11 | extends: [
12 | js.configs.recommended,
13 | reactHooks.configs['recommended-latest'],
14 | reactRefresh.configs.vite,
15 | ],
16 | languageOptions: {
17 | ecmaVersion: 2020,
18 | globals: globals.browser,
19 | parserOptions: {
20 | ecmaVersion: 'latest',
21 | ecmaFeatures: { jsx: true },
22 | sourceType: 'module',
23 | },
24 | },
25 | rules: {
26 | 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
27 | },
28 | },
29 | ])
30 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | CACAF
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend-web-console",
3 | "version": "0.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "frontend-web-console",
9 | "version": "0.0.0",
10 | "dependencies": {
11 | "@emotion/react": "^11.14.0",
12 | "@emotion/styled": "^11.14.1",
13 | "@fontsource/roboto": "^5.2.6",
14 | "@mui/icons-material": "^7.2.0",
15 | "@mui/material": "^7.2.0",
16 | "react": "^19.1.0",
17 | "react-dom": "^19.1.0",
18 | "react-router-dom": "^7.6.3"
19 | },
20 | "devDependencies": {
21 | "@eslint/js": "^9.29.0",
22 | "@types/react": "^19.1.8",
23 | "@types/react-dom": "^19.1.6",
24 | "@vitejs/plugin-react": "^4.5.2",
25 | "eslint": "^9.29.0",
26 | "eslint-plugin-react-hooks": "^5.2.0",
27 | "eslint-plugin-react-refresh": "^0.4.20",
28 | "globals": "^16.2.0",
29 | "vite": "^7.0.0"
30 | }
31 | },
32 | "node_modules/@ampproject/remapping": {
33 | "version": "2.3.0",
34 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
35 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
36 | "dev": true,
37 | "license": "Apache-2.0",
38 | "dependencies": {
39 | "@jridgewell/gen-mapping": "^0.3.5",
40 | "@jridgewell/trace-mapping": "^0.3.24"
41 | },
42 | "engines": {
43 | "node": ">=6.0.0"
44 | }
45 | },
46 | "node_modules/@babel/code-frame": {
47 | "version": "7.27.1",
48 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
49 | "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
50 | "license": "MIT",
51 | "dependencies": {
52 | "@babel/helper-validator-identifier": "^7.27.1",
53 | "js-tokens": "^4.0.0",
54 | "picocolors": "^1.1.1"
55 | },
56 | "engines": {
57 | "node": ">=6.9.0"
58 | }
59 | },
60 | "node_modules/@babel/compat-data": {
61 | "version": "7.28.0",
62 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
63 | "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
64 | "dev": true,
65 | "license": "MIT",
66 | "engines": {
67 | "node": ">=6.9.0"
68 | }
69 | },
70 | "node_modules/@babel/core": {
71 | "version": "7.28.0",
72 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
73 | "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
74 | "dev": true,
75 | "license": "MIT",
76 | "dependencies": {
77 | "@ampproject/remapping": "^2.2.0",
78 | "@babel/code-frame": "^7.27.1",
79 | "@babel/generator": "^7.28.0",
80 | "@babel/helper-compilation-targets": "^7.27.2",
81 | "@babel/helper-module-transforms": "^7.27.3",
82 | "@babel/helpers": "^7.27.6",
83 | "@babel/parser": "^7.28.0",
84 | "@babel/template": "^7.27.2",
85 | "@babel/traverse": "^7.28.0",
86 | "@babel/types": "^7.28.0",
87 | "convert-source-map": "^2.0.0",
88 | "debug": "^4.1.0",
89 | "gensync": "^1.0.0-beta.2",
90 | "json5": "^2.2.3",
91 | "semver": "^6.3.1"
92 | },
93 | "engines": {
94 | "node": ">=6.9.0"
95 | },
96 | "funding": {
97 | "type": "opencollective",
98 | "url": "https://opencollective.com/babel"
99 | }
100 | },
101 | "node_modules/@babel/generator": {
102 | "version": "7.28.0",
103 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz",
104 | "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==",
105 | "license": "MIT",
106 | "dependencies": {
107 | "@babel/parser": "^7.28.0",
108 | "@babel/types": "^7.28.0",
109 | "@jridgewell/gen-mapping": "^0.3.12",
110 | "@jridgewell/trace-mapping": "^0.3.28",
111 | "jsesc": "^3.0.2"
112 | },
113 | "engines": {
114 | "node": ">=6.9.0"
115 | }
116 | },
117 | "node_modules/@babel/helper-compilation-targets": {
118 | "version": "7.27.2",
119 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
120 | "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
121 | "dev": true,
122 | "license": "MIT",
123 | "dependencies": {
124 | "@babel/compat-data": "^7.27.2",
125 | "@babel/helper-validator-option": "^7.27.1",
126 | "browserslist": "^4.24.0",
127 | "lru-cache": "^5.1.1",
128 | "semver": "^6.3.1"
129 | },
130 | "engines": {
131 | "node": ">=6.9.0"
132 | }
133 | },
134 | "node_modules/@babel/helper-globals": {
135 | "version": "7.28.0",
136 | "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
137 | "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
138 | "license": "MIT",
139 | "engines": {
140 | "node": ">=6.9.0"
141 | }
142 | },
143 | "node_modules/@babel/helper-module-imports": {
144 | "version": "7.27.1",
145 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
146 | "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
147 | "license": "MIT",
148 | "dependencies": {
149 | "@babel/traverse": "^7.27.1",
150 | "@babel/types": "^7.27.1"
151 | },
152 | "engines": {
153 | "node": ">=6.9.0"
154 | }
155 | },
156 | "node_modules/@babel/helper-module-transforms": {
157 | "version": "7.27.3",
158 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
159 | "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
160 | "dev": true,
161 | "license": "MIT",
162 | "dependencies": {
163 | "@babel/helper-module-imports": "^7.27.1",
164 | "@babel/helper-validator-identifier": "^7.27.1",
165 | "@babel/traverse": "^7.27.3"
166 | },
167 | "engines": {
168 | "node": ">=6.9.0"
169 | },
170 | "peerDependencies": {
171 | "@babel/core": "^7.0.0"
172 | }
173 | },
174 | "node_modules/@babel/helper-plugin-utils": {
175 | "version": "7.27.1",
176 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
177 | "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
178 | "dev": true,
179 | "license": "MIT",
180 | "engines": {
181 | "node": ">=6.9.0"
182 | }
183 | },
184 | "node_modules/@babel/helper-string-parser": {
185 | "version": "7.27.1",
186 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
187 | "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
188 | "license": "MIT",
189 | "engines": {
190 | "node": ">=6.9.0"
191 | }
192 | },
193 | "node_modules/@babel/helper-validator-identifier": {
194 | "version": "7.27.1",
195 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
196 | "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
197 | "license": "MIT",
198 | "engines": {
199 | "node": ">=6.9.0"
200 | }
201 | },
202 | "node_modules/@babel/helper-validator-option": {
203 | "version": "7.27.1",
204 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
205 | "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
206 | "dev": true,
207 | "license": "MIT",
208 | "engines": {
209 | "node": ">=6.9.0"
210 | }
211 | },
212 | "node_modules/@babel/helpers": {
213 | "version": "7.27.6",
214 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
215 | "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
216 | "dev": true,
217 | "license": "MIT",
218 | "dependencies": {
219 | "@babel/template": "^7.27.2",
220 | "@babel/types": "^7.27.6"
221 | },
222 | "engines": {
223 | "node": ">=6.9.0"
224 | }
225 | },
226 | "node_modules/@babel/parser": {
227 | "version": "7.28.0",
228 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz",
229 | "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
230 | "license": "MIT",
231 | "dependencies": {
232 | "@babel/types": "^7.28.0"
233 | },
234 | "bin": {
235 | "parser": "bin/babel-parser.js"
236 | },
237 | "engines": {
238 | "node": ">=6.0.0"
239 | }
240 | },
241 | "node_modules/@babel/plugin-transform-react-jsx-self": {
242 | "version": "7.27.1",
243 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
244 | "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
245 | "dev": true,
246 | "license": "MIT",
247 | "dependencies": {
248 | "@babel/helper-plugin-utils": "^7.27.1"
249 | },
250 | "engines": {
251 | "node": ">=6.9.0"
252 | },
253 | "peerDependencies": {
254 | "@babel/core": "^7.0.0-0"
255 | }
256 | },
257 | "node_modules/@babel/plugin-transform-react-jsx-source": {
258 | "version": "7.27.1",
259 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
260 | "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
261 | "dev": true,
262 | "license": "MIT",
263 | "dependencies": {
264 | "@babel/helper-plugin-utils": "^7.27.1"
265 | },
266 | "engines": {
267 | "node": ">=6.9.0"
268 | },
269 | "peerDependencies": {
270 | "@babel/core": "^7.0.0-0"
271 | }
272 | },
273 | "node_modules/@babel/runtime": {
274 | "version": "7.27.6",
275 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
276 | "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
277 | "license": "MIT",
278 | "engines": {
279 | "node": ">=6.9.0"
280 | }
281 | },
282 | "node_modules/@babel/template": {
283 | "version": "7.27.2",
284 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
285 | "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
286 | "license": "MIT",
287 | "dependencies": {
288 | "@babel/code-frame": "^7.27.1",
289 | "@babel/parser": "^7.27.2",
290 | "@babel/types": "^7.27.1"
291 | },
292 | "engines": {
293 | "node": ">=6.9.0"
294 | }
295 | },
296 | "node_modules/@babel/traverse": {
297 | "version": "7.28.0",
298 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz",
299 | "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==",
300 | "license": "MIT",
301 | "dependencies": {
302 | "@babel/code-frame": "^7.27.1",
303 | "@babel/generator": "^7.28.0",
304 | "@babel/helper-globals": "^7.28.0",
305 | "@babel/parser": "^7.28.0",
306 | "@babel/template": "^7.27.2",
307 | "@babel/types": "^7.28.0",
308 | "debug": "^4.3.1"
309 | },
310 | "engines": {
311 | "node": ">=6.9.0"
312 | }
313 | },
314 | "node_modules/@babel/types": {
315 | "version": "7.28.0",
316 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz",
317 | "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==",
318 | "license": "MIT",
319 | "dependencies": {
320 | "@babel/helper-string-parser": "^7.27.1",
321 | "@babel/helper-validator-identifier": "^7.27.1"
322 | },
323 | "engines": {
324 | "node": ">=6.9.0"
325 | }
326 | },
327 | "node_modules/@emotion/babel-plugin": {
328 | "version": "11.13.5",
329 | "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
330 | "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
331 | "license": "MIT",
332 | "dependencies": {
333 | "@babel/helper-module-imports": "^7.16.7",
334 | "@babel/runtime": "^7.18.3",
335 | "@emotion/hash": "^0.9.2",
336 | "@emotion/memoize": "^0.9.0",
337 | "@emotion/serialize": "^1.3.3",
338 | "babel-plugin-macros": "^3.1.0",
339 | "convert-source-map": "^1.5.0",
340 | "escape-string-regexp": "^4.0.0",
341 | "find-root": "^1.1.0",
342 | "source-map": "^0.5.7",
343 | "stylis": "4.2.0"
344 | }
345 | },
346 | "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
347 | "version": "1.9.0",
348 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
349 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
350 | "license": "MIT"
351 | },
352 | "node_modules/@emotion/cache": {
353 | "version": "11.14.0",
354 | "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
355 | "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
356 | "license": "MIT",
357 | "dependencies": {
358 | "@emotion/memoize": "^0.9.0",
359 | "@emotion/sheet": "^1.4.0",
360 | "@emotion/utils": "^1.4.2",
361 | "@emotion/weak-memoize": "^0.4.0",
362 | "stylis": "4.2.0"
363 | }
364 | },
365 | "node_modules/@emotion/hash": {
366 | "version": "0.9.2",
367 | "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
368 | "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
369 | "license": "MIT"
370 | },
371 | "node_modules/@emotion/is-prop-valid": {
372 | "version": "1.3.1",
373 | "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
374 | "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
375 | "license": "MIT",
376 | "dependencies": {
377 | "@emotion/memoize": "^0.9.0"
378 | }
379 | },
380 | "node_modules/@emotion/memoize": {
381 | "version": "0.9.0",
382 | "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
383 | "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
384 | "license": "MIT"
385 | },
386 | "node_modules/@emotion/react": {
387 | "version": "11.14.0",
388 | "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
389 | "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
390 | "license": "MIT",
391 | "dependencies": {
392 | "@babel/runtime": "^7.18.3",
393 | "@emotion/babel-plugin": "^11.13.5",
394 | "@emotion/cache": "^11.14.0",
395 | "@emotion/serialize": "^1.3.3",
396 | "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
397 | "@emotion/utils": "^1.4.2",
398 | "@emotion/weak-memoize": "^0.4.0",
399 | "hoist-non-react-statics": "^3.3.1"
400 | },
401 | "peerDependencies": {
402 | "react": ">=16.8.0"
403 | },
404 | "peerDependenciesMeta": {
405 | "@types/react": {
406 | "optional": true
407 | }
408 | }
409 | },
410 | "node_modules/@emotion/serialize": {
411 | "version": "1.3.3",
412 | "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
413 | "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
414 | "license": "MIT",
415 | "dependencies": {
416 | "@emotion/hash": "^0.9.2",
417 | "@emotion/memoize": "^0.9.0",
418 | "@emotion/unitless": "^0.10.0",
419 | "@emotion/utils": "^1.4.2",
420 | "csstype": "^3.0.2"
421 | }
422 | },
423 | "node_modules/@emotion/sheet": {
424 | "version": "1.4.0",
425 | "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
426 | "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
427 | "license": "MIT"
428 | },
429 | "node_modules/@emotion/styled": {
430 | "version": "11.14.1",
431 | "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz",
432 | "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==",
433 | "license": "MIT",
434 | "dependencies": {
435 | "@babel/runtime": "^7.18.3",
436 | "@emotion/babel-plugin": "^11.13.5",
437 | "@emotion/is-prop-valid": "^1.3.0",
438 | "@emotion/serialize": "^1.3.3",
439 | "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
440 | "@emotion/utils": "^1.4.2"
441 | },
442 | "peerDependencies": {
443 | "@emotion/react": "^11.0.0-rc.0",
444 | "react": ">=16.8.0"
445 | },
446 | "peerDependenciesMeta": {
447 | "@types/react": {
448 | "optional": true
449 | }
450 | }
451 | },
452 | "node_modules/@emotion/unitless": {
453 | "version": "0.10.0",
454 | "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
455 | "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
456 | "license": "MIT"
457 | },
458 | "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
459 | "version": "1.2.0",
460 | "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
461 | "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
462 | "license": "MIT",
463 | "peerDependencies": {
464 | "react": ">=16.8.0"
465 | }
466 | },
467 | "node_modules/@emotion/utils": {
468 | "version": "1.4.2",
469 | "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
470 | "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
471 | "license": "MIT"
472 | },
473 | "node_modules/@emotion/weak-memoize": {
474 | "version": "0.4.0",
475 | "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
476 | "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
477 | "license": "MIT"
478 | },
479 | "node_modules/@esbuild/aix-ppc64": {
480 | "version": "0.25.5",
481 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
482 | "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
483 | "cpu": [
484 | "ppc64"
485 | ],
486 | "dev": true,
487 | "license": "MIT",
488 | "optional": true,
489 | "os": [
490 | "aix"
491 | ],
492 | "engines": {
493 | "node": ">=18"
494 | }
495 | },
496 | "node_modules/@esbuild/android-arm": {
497 | "version": "0.25.5",
498 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
499 | "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
500 | "cpu": [
501 | "arm"
502 | ],
503 | "dev": true,
504 | "license": "MIT",
505 | "optional": true,
506 | "os": [
507 | "android"
508 | ],
509 | "engines": {
510 | "node": ">=18"
511 | }
512 | },
513 | "node_modules/@esbuild/android-arm64": {
514 | "version": "0.25.5",
515 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
516 | "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
517 | "cpu": [
518 | "arm64"
519 | ],
520 | "dev": true,
521 | "license": "MIT",
522 | "optional": true,
523 | "os": [
524 | "android"
525 | ],
526 | "engines": {
527 | "node": ">=18"
528 | }
529 | },
530 | "node_modules/@esbuild/android-x64": {
531 | "version": "0.25.5",
532 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
533 | "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
534 | "cpu": [
535 | "x64"
536 | ],
537 | "dev": true,
538 | "license": "MIT",
539 | "optional": true,
540 | "os": [
541 | "android"
542 | ],
543 | "engines": {
544 | "node": ">=18"
545 | }
546 | },
547 | "node_modules/@esbuild/darwin-arm64": {
548 | "version": "0.25.5",
549 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
550 | "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
551 | "cpu": [
552 | "arm64"
553 | ],
554 | "dev": true,
555 | "license": "MIT",
556 | "optional": true,
557 | "os": [
558 | "darwin"
559 | ],
560 | "engines": {
561 | "node": ">=18"
562 | }
563 | },
564 | "node_modules/@esbuild/darwin-x64": {
565 | "version": "0.25.5",
566 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
567 | "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
568 | "cpu": [
569 | "x64"
570 | ],
571 | "dev": true,
572 | "license": "MIT",
573 | "optional": true,
574 | "os": [
575 | "darwin"
576 | ],
577 | "engines": {
578 | "node": ">=18"
579 | }
580 | },
581 | "node_modules/@esbuild/freebsd-arm64": {
582 | "version": "0.25.5",
583 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
584 | "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
585 | "cpu": [
586 | "arm64"
587 | ],
588 | "dev": true,
589 | "license": "MIT",
590 | "optional": true,
591 | "os": [
592 | "freebsd"
593 | ],
594 | "engines": {
595 | "node": ">=18"
596 | }
597 | },
598 | "node_modules/@esbuild/freebsd-x64": {
599 | "version": "0.25.5",
600 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
601 | "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
602 | "cpu": [
603 | "x64"
604 | ],
605 | "dev": true,
606 | "license": "MIT",
607 | "optional": true,
608 | "os": [
609 | "freebsd"
610 | ],
611 | "engines": {
612 | "node": ">=18"
613 | }
614 | },
615 | "node_modules/@esbuild/linux-arm": {
616 | "version": "0.25.5",
617 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
618 | "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
619 | "cpu": [
620 | "arm"
621 | ],
622 | "dev": true,
623 | "license": "MIT",
624 | "optional": true,
625 | "os": [
626 | "linux"
627 | ],
628 | "engines": {
629 | "node": ">=18"
630 | }
631 | },
632 | "node_modules/@esbuild/linux-arm64": {
633 | "version": "0.25.5",
634 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
635 | "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
636 | "cpu": [
637 | "arm64"
638 | ],
639 | "dev": true,
640 | "license": "MIT",
641 | "optional": true,
642 | "os": [
643 | "linux"
644 | ],
645 | "engines": {
646 | "node": ">=18"
647 | }
648 | },
649 | "node_modules/@esbuild/linux-ia32": {
650 | "version": "0.25.5",
651 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
652 | "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
653 | "cpu": [
654 | "ia32"
655 | ],
656 | "dev": true,
657 | "license": "MIT",
658 | "optional": true,
659 | "os": [
660 | "linux"
661 | ],
662 | "engines": {
663 | "node": ">=18"
664 | }
665 | },
666 | "node_modules/@esbuild/linux-loong64": {
667 | "version": "0.25.5",
668 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
669 | "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
670 | "cpu": [
671 | "loong64"
672 | ],
673 | "dev": true,
674 | "license": "MIT",
675 | "optional": true,
676 | "os": [
677 | "linux"
678 | ],
679 | "engines": {
680 | "node": ">=18"
681 | }
682 | },
683 | "node_modules/@esbuild/linux-mips64el": {
684 | "version": "0.25.5",
685 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
686 | "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
687 | "cpu": [
688 | "mips64el"
689 | ],
690 | "dev": true,
691 | "license": "MIT",
692 | "optional": true,
693 | "os": [
694 | "linux"
695 | ],
696 | "engines": {
697 | "node": ">=18"
698 | }
699 | },
700 | "node_modules/@esbuild/linux-ppc64": {
701 | "version": "0.25.5",
702 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
703 | "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
704 | "cpu": [
705 | "ppc64"
706 | ],
707 | "dev": true,
708 | "license": "MIT",
709 | "optional": true,
710 | "os": [
711 | "linux"
712 | ],
713 | "engines": {
714 | "node": ">=18"
715 | }
716 | },
717 | "node_modules/@esbuild/linux-riscv64": {
718 | "version": "0.25.5",
719 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
720 | "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
721 | "cpu": [
722 | "riscv64"
723 | ],
724 | "dev": true,
725 | "license": "MIT",
726 | "optional": true,
727 | "os": [
728 | "linux"
729 | ],
730 | "engines": {
731 | "node": ">=18"
732 | }
733 | },
734 | "node_modules/@esbuild/linux-s390x": {
735 | "version": "0.25.5",
736 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
737 | "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
738 | "cpu": [
739 | "s390x"
740 | ],
741 | "dev": true,
742 | "license": "MIT",
743 | "optional": true,
744 | "os": [
745 | "linux"
746 | ],
747 | "engines": {
748 | "node": ">=18"
749 | }
750 | },
751 | "node_modules/@esbuild/linux-x64": {
752 | "version": "0.25.5",
753 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
754 | "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
755 | "cpu": [
756 | "x64"
757 | ],
758 | "dev": true,
759 | "license": "MIT",
760 | "optional": true,
761 | "os": [
762 | "linux"
763 | ],
764 | "engines": {
765 | "node": ">=18"
766 | }
767 | },
768 | "node_modules/@esbuild/netbsd-arm64": {
769 | "version": "0.25.5",
770 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
771 | "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
772 | "cpu": [
773 | "arm64"
774 | ],
775 | "dev": true,
776 | "license": "MIT",
777 | "optional": true,
778 | "os": [
779 | "netbsd"
780 | ],
781 | "engines": {
782 | "node": ">=18"
783 | }
784 | },
785 | "node_modules/@esbuild/netbsd-x64": {
786 | "version": "0.25.5",
787 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
788 | "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
789 | "cpu": [
790 | "x64"
791 | ],
792 | "dev": true,
793 | "license": "MIT",
794 | "optional": true,
795 | "os": [
796 | "netbsd"
797 | ],
798 | "engines": {
799 | "node": ">=18"
800 | }
801 | },
802 | "node_modules/@esbuild/openbsd-arm64": {
803 | "version": "0.25.5",
804 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
805 | "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
806 | "cpu": [
807 | "arm64"
808 | ],
809 | "dev": true,
810 | "license": "MIT",
811 | "optional": true,
812 | "os": [
813 | "openbsd"
814 | ],
815 | "engines": {
816 | "node": ">=18"
817 | }
818 | },
819 | "node_modules/@esbuild/openbsd-x64": {
820 | "version": "0.25.5",
821 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
822 | "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
823 | "cpu": [
824 | "x64"
825 | ],
826 | "dev": true,
827 | "license": "MIT",
828 | "optional": true,
829 | "os": [
830 | "openbsd"
831 | ],
832 | "engines": {
833 | "node": ">=18"
834 | }
835 | },
836 | "node_modules/@esbuild/sunos-x64": {
837 | "version": "0.25.5",
838 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
839 | "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
840 | "cpu": [
841 | "x64"
842 | ],
843 | "dev": true,
844 | "license": "MIT",
845 | "optional": true,
846 | "os": [
847 | "sunos"
848 | ],
849 | "engines": {
850 | "node": ">=18"
851 | }
852 | },
853 | "node_modules/@esbuild/win32-arm64": {
854 | "version": "0.25.5",
855 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
856 | "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
857 | "cpu": [
858 | "arm64"
859 | ],
860 | "dev": true,
861 | "license": "MIT",
862 | "optional": true,
863 | "os": [
864 | "win32"
865 | ],
866 | "engines": {
867 | "node": ">=18"
868 | }
869 | },
870 | "node_modules/@esbuild/win32-ia32": {
871 | "version": "0.25.5",
872 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
873 | "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
874 | "cpu": [
875 | "ia32"
876 | ],
877 | "dev": true,
878 | "license": "MIT",
879 | "optional": true,
880 | "os": [
881 | "win32"
882 | ],
883 | "engines": {
884 | "node": ">=18"
885 | }
886 | },
887 | "node_modules/@esbuild/win32-x64": {
888 | "version": "0.25.5",
889 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
890 | "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
891 | "cpu": [
892 | "x64"
893 | ],
894 | "dev": true,
895 | "license": "MIT",
896 | "optional": true,
897 | "os": [
898 | "win32"
899 | ],
900 | "engines": {
901 | "node": ">=18"
902 | }
903 | },
904 | "node_modules/@eslint-community/eslint-utils": {
905 | "version": "4.7.0",
906 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
907 | "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
908 | "dev": true,
909 | "license": "MIT",
910 | "dependencies": {
911 | "eslint-visitor-keys": "^3.4.3"
912 | },
913 | "engines": {
914 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
915 | },
916 | "funding": {
917 | "url": "https://opencollective.com/eslint"
918 | },
919 | "peerDependencies": {
920 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
921 | }
922 | },
923 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
924 | "version": "3.4.3",
925 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
926 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
927 | "dev": true,
928 | "license": "Apache-2.0",
929 | "engines": {
930 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
931 | },
932 | "funding": {
933 | "url": "https://opencollective.com/eslint"
934 | }
935 | },
936 | "node_modules/@eslint-community/regexpp": {
937 | "version": "4.12.1",
938 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
939 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
940 | "dev": true,
941 | "license": "MIT",
942 | "engines": {
943 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
944 | }
945 | },
946 | "node_modules/@eslint/config-array": {
947 | "version": "0.21.0",
948 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
949 | "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
950 | "dev": true,
951 | "license": "Apache-2.0",
952 | "dependencies": {
953 | "@eslint/object-schema": "^2.1.6",
954 | "debug": "^4.3.1",
955 | "minimatch": "^3.1.2"
956 | },
957 | "engines": {
958 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
959 | }
960 | },
961 | "node_modules/@eslint/config-helpers": {
962 | "version": "0.3.0",
963 | "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz",
964 | "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==",
965 | "dev": true,
966 | "license": "Apache-2.0",
967 | "engines": {
968 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
969 | }
970 | },
971 | "node_modules/@eslint/core": {
972 | "version": "0.14.0",
973 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
974 | "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
975 | "dev": true,
976 | "license": "Apache-2.0",
977 | "dependencies": {
978 | "@types/json-schema": "^7.0.15"
979 | },
980 | "engines": {
981 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
982 | }
983 | },
984 | "node_modules/@eslint/eslintrc": {
985 | "version": "3.3.1",
986 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
987 | "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
988 | "dev": true,
989 | "license": "MIT",
990 | "dependencies": {
991 | "ajv": "^6.12.4",
992 | "debug": "^4.3.2",
993 | "espree": "^10.0.1",
994 | "globals": "^14.0.0",
995 | "ignore": "^5.2.0",
996 | "import-fresh": "^3.2.1",
997 | "js-yaml": "^4.1.0",
998 | "minimatch": "^3.1.2",
999 | "strip-json-comments": "^3.1.1"
1000 | },
1001 | "engines": {
1002 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1003 | },
1004 | "funding": {
1005 | "url": "https://opencollective.com/eslint"
1006 | }
1007 | },
1008 | "node_modules/@eslint/eslintrc/node_modules/globals": {
1009 | "version": "14.0.0",
1010 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
1011 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
1012 | "dev": true,
1013 | "license": "MIT",
1014 | "engines": {
1015 | "node": ">=18"
1016 | },
1017 | "funding": {
1018 | "url": "https://github.com/sponsors/sindresorhus"
1019 | }
1020 | },
1021 | "node_modules/@eslint/js": {
1022 | "version": "9.30.1",
1023 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz",
1024 | "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==",
1025 | "dev": true,
1026 | "license": "MIT",
1027 | "engines": {
1028 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1029 | },
1030 | "funding": {
1031 | "url": "https://eslint.org/donate"
1032 | }
1033 | },
1034 | "node_modules/@eslint/object-schema": {
1035 | "version": "2.1.6",
1036 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
1037 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
1038 | "dev": true,
1039 | "license": "Apache-2.0",
1040 | "engines": {
1041 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1042 | }
1043 | },
1044 | "node_modules/@eslint/plugin-kit": {
1045 | "version": "0.3.3",
1046 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz",
1047 | "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==",
1048 | "dev": true,
1049 | "license": "Apache-2.0",
1050 | "dependencies": {
1051 | "@eslint/core": "^0.15.1",
1052 | "levn": "^0.4.1"
1053 | },
1054 | "engines": {
1055 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1056 | }
1057 | },
1058 | "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
1059 | "version": "0.15.1",
1060 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
1061 | "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
1062 | "dev": true,
1063 | "license": "Apache-2.0",
1064 | "dependencies": {
1065 | "@types/json-schema": "^7.0.15"
1066 | },
1067 | "engines": {
1068 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1069 | }
1070 | },
1071 | "node_modules/@fontsource/roboto": {
1072 | "version": "5.2.6",
1073 | "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.2.6.tgz",
1074 | "integrity": "sha512-hzarG7yAhMoP418smNgfY4fO7UmuUEm5JUtbxCoCcFHT0hOJB+d/qAEyoNjz7YkPU5OjM2LM8rJnW8hfm0JLaA==",
1075 | "license": "OFL-1.1",
1076 | "funding": {
1077 | "url": "https://github.com/sponsors/ayuhito"
1078 | }
1079 | },
1080 | "node_modules/@humanfs/core": {
1081 | "version": "0.19.1",
1082 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
1083 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
1084 | "dev": true,
1085 | "license": "Apache-2.0",
1086 | "engines": {
1087 | "node": ">=18.18.0"
1088 | }
1089 | },
1090 | "node_modules/@humanfs/node": {
1091 | "version": "0.16.6",
1092 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
1093 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
1094 | "dev": true,
1095 | "license": "Apache-2.0",
1096 | "dependencies": {
1097 | "@humanfs/core": "^0.19.1",
1098 | "@humanwhocodes/retry": "^0.3.0"
1099 | },
1100 | "engines": {
1101 | "node": ">=18.18.0"
1102 | }
1103 | },
1104 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
1105 | "version": "0.3.1",
1106 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
1107 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
1108 | "dev": true,
1109 | "license": "Apache-2.0",
1110 | "engines": {
1111 | "node": ">=18.18"
1112 | },
1113 | "funding": {
1114 | "type": "github",
1115 | "url": "https://github.com/sponsors/nzakas"
1116 | }
1117 | },
1118 | "node_modules/@humanwhocodes/module-importer": {
1119 | "version": "1.0.1",
1120 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
1121 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
1122 | "dev": true,
1123 | "license": "Apache-2.0",
1124 | "engines": {
1125 | "node": ">=12.22"
1126 | },
1127 | "funding": {
1128 | "type": "github",
1129 | "url": "https://github.com/sponsors/nzakas"
1130 | }
1131 | },
1132 | "node_modules/@humanwhocodes/retry": {
1133 | "version": "0.4.3",
1134 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
1135 | "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
1136 | "dev": true,
1137 | "license": "Apache-2.0",
1138 | "engines": {
1139 | "node": ">=18.18"
1140 | },
1141 | "funding": {
1142 | "type": "github",
1143 | "url": "https://github.com/sponsors/nzakas"
1144 | }
1145 | },
1146 | "node_modules/@jridgewell/gen-mapping": {
1147 | "version": "0.3.12",
1148 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
1149 | "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
1150 | "license": "MIT",
1151 | "dependencies": {
1152 | "@jridgewell/sourcemap-codec": "^1.5.0",
1153 | "@jridgewell/trace-mapping": "^0.3.24"
1154 | }
1155 | },
1156 | "node_modules/@jridgewell/resolve-uri": {
1157 | "version": "3.1.2",
1158 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
1159 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
1160 | "license": "MIT",
1161 | "engines": {
1162 | "node": ">=6.0.0"
1163 | }
1164 | },
1165 | "node_modules/@jridgewell/sourcemap-codec": {
1166 | "version": "1.5.4",
1167 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
1168 | "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
1169 | "license": "MIT"
1170 | },
1171 | "node_modules/@jridgewell/trace-mapping": {
1172 | "version": "0.3.29",
1173 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
1174 | "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
1175 | "license": "MIT",
1176 | "dependencies": {
1177 | "@jridgewell/resolve-uri": "^3.1.0",
1178 | "@jridgewell/sourcemap-codec": "^1.4.14"
1179 | }
1180 | },
1181 | "node_modules/@mui/core-downloads-tracker": {
1182 | "version": "7.2.0",
1183 | "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.2.0.tgz",
1184 | "integrity": "sha512-d49s7kEgI5iX40xb2YPazANvo7Bx0BLg/MNRwv+7BVpZUzXj1DaVCKlQTDex3gy/0jsCb4w7AY2uH4t4AJvSog==",
1185 | "license": "MIT",
1186 | "funding": {
1187 | "type": "opencollective",
1188 | "url": "https://opencollective.com/mui-org"
1189 | }
1190 | },
1191 | "node_modules/@mui/icons-material": {
1192 | "version": "7.2.0",
1193 | "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.2.0.tgz",
1194 | "integrity": "sha512-gRCspp3pfjHQyTmSOmYw7kUQTd9Udpdan4R8EnZvqPeoAtHnPzkvjBrBqzKaoAbbBp5bGF7BcD18zZJh4nwu0A==",
1195 | "license": "MIT",
1196 | "dependencies": {
1197 | "@babel/runtime": "^7.27.6"
1198 | },
1199 | "engines": {
1200 | "node": ">=14.0.0"
1201 | },
1202 | "funding": {
1203 | "type": "opencollective",
1204 | "url": "https://opencollective.com/mui-org"
1205 | },
1206 | "peerDependencies": {
1207 | "@mui/material": "^7.2.0",
1208 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1209 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1210 | },
1211 | "peerDependenciesMeta": {
1212 | "@types/react": {
1213 | "optional": true
1214 | }
1215 | }
1216 | },
1217 | "node_modules/@mui/material": {
1218 | "version": "7.2.0",
1219 | "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.2.0.tgz",
1220 | "integrity": "sha512-NTuyFNen5Z2QY+I242MDZzXnFIVIR6ERxo7vntFi9K1wCgSwvIl0HcAO2OOydKqqKApE6omRiYhpny1ZhGuH7Q==",
1221 | "license": "MIT",
1222 | "dependencies": {
1223 | "@babel/runtime": "^7.27.6",
1224 | "@mui/core-downloads-tracker": "^7.2.0",
1225 | "@mui/system": "^7.2.0",
1226 | "@mui/types": "^7.4.4",
1227 | "@mui/utils": "^7.2.0",
1228 | "@popperjs/core": "^2.11.8",
1229 | "@types/react-transition-group": "^4.4.12",
1230 | "clsx": "^2.1.1",
1231 | "csstype": "^3.1.3",
1232 | "prop-types": "^15.8.1",
1233 | "react-is": "^19.1.0",
1234 | "react-transition-group": "^4.4.5"
1235 | },
1236 | "engines": {
1237 | "node": ">=14.0.0"
1238 | },
1239 | "funding": {
1240 | "type": "opencollective",
1241 | "url": "https://opencollective.com/mui-org"
1242 | },
1243 | "peerDependencies": {
1244 | "@emotion/react": "^11.5.0",
1245 | "@emotion/styled": "^11.3.0",
1246 | "@mui/material-pigment-css": "^7.2.0",
1247 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1248 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1249 | "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
1250 | },
1251 | "peerDependenciesMeta": {
1252 | "@emotion/react": {
1253 | "optional": true
1254 | },
1255 | "@emotion/styled": {
1256 | "optional": true
1257 | },
1258 | "@mui/material-pigment-css": {
1259 | "optional": true
1260 | },
1261 | "@types/react": {
1262 | "optional": true
1263 | }
1264 | }
1265 | },
1266 | "node_modules/@mui/private-theming": {
1267 | "version": "7.2.0",
1268 | "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.2.0.tgz",
1269 | "integrity": "sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw==",
1270 | "license": "MIT",
1271 | "dependencies": {
1272 | "@babel/runtime": "^7.27.6",
1273 | "@mui/utils": "^7.2.0",
1274 | "prop-types": "^15.8.1"
1275 | },
1276 | "engines": {
1277 | "node": ">=14.0.0"
1278 | },
1279 | "funding": {
1280 | "type": "opencollective",
1281 | "url": "https://opencollective.com/mui-org"
1282 | },
1283 | "peerDependencies": {
1284 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1285 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1286 | },
1287 | "peerDependenciesMeta": {
1288 | "@types/react": {
1289 | "optional": true
1290 | }
1291 | }
1292 | },
1293 | "node_modules/@mui/styled-engine": {
1294 | "version": "7.2.0",
1295 | "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.2.0.tgz",
1296 | "integrity": "sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==",
1297 | "license": "MIT",
1298 | "dependencies": {
1299 | "@babel/runtime": "^7.27.6",
1300 | "@emotion/cache": "^11.14.0",
1301 | "@emotion/serialize": "^1.3.3",
1302 | "@emotion/sheet": "^1.4.0",
1303 | "csstype": "^3.1.3",
1304 | "prop-types": "^15.8.1"
1305 | },
1306 | "engines": {
1307 | "node": ">=14.0.0"
1308 | },
1309 | "funding": {
1310 | "type": "opencollective",
1311 | "url": "https://opencollective.com/mui-org"
1312 | },
1313 | "peerDependencies": {
1314 | "@emotion/react": "^11.4.1",
1315 | "@emotion/styled": "^11.3.0",
1316 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1317 | },
1318 | "peerDependenciesMeta": {
1319 | "@emotion/react": {
1320 | "optional": true
1321 | },
1322 | "@emotion/styled": {
1323 | "optional": true
1324 | }
1325 | }
1326 | },
1327 | "node_modules/@mui/system": {
1328 | "version": "7.2.0",
1329 | "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.2.0.tgz",
1330 | "integrity": "sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A==",
1331 | "license": "MIT",
1332 | "dependencies": {
1333 | "@babel/runtime": "^7.27.6",
1334 | "@mui/private-theming": "^7.2.0",
1335 | "@mui/styled-engine": "^7.2.0",
1336 | "@mui/types": "^7.4.4",
1337 | "@mui/utils": "^7.2.0",
1338 | "clsx": "^2.1.1",
1339 | "csstype": "^3.1.3",
1340 | "prop-types": "^15.8.1"
1341 | },
1342 | "engines": {
1343 | "node": ">=14.0.0"
1344 | },
1345 | "funding": {
1346 | "type": "opencollective",
1347 | "url": "https://opencollective.com/mui-org"
1348 | },
1349 | "peerDependencies": {
1350 | "@emotion/react": "^11.5.0",
1351 | "@emotion/styled": "^11.3.0",
1352 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1353 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1354 | },
1355 | "peerDependenciesMeta": {
1356 | "@emotion/react": {
1357 | "optional": true
1358 | },
1359 | "@emotion/styled": {
1360 | "optional": true
1361 | },
1362 | "@types/react": {
1363 | "optional": true
1364 | }
1365 | }
1366 | },
1367 | "node_modules/@mui/types": {
1368 | "version": "7.4.4",
1369 | "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.4.tgz",
1370 | "integrity": "sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==",
1371 | "license": "MIT",
1372 | "dependencies": {
1373 | "@babel/runtime": "^7.27.6"
1374 | },
1375 | "peerDependencies": {
1376 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1377 | },
1378 | "peerDependenciesMeta": {
1379 | "@types/react": {
1380 | "optional": true
1381 | }
1382 | }
1383 | },
1384 | "node_modules/@mui/utils": {
1385 | "version": "7.2.0",
1386 | "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.2.0.tgz",
1387 | "integrity": "sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==",
1388 | "license": "MIT",
1389 | "dependencies": {
1390 | "@babel/runtime": "^7.27.6",
1391 | "@mui/types": "^7.4.4",
1392 | "@types/prop-types": "^15.7.15",
1393 | "clsx": "^2.1.1",
1394 | "prop-types": "^15.8.1",
1395 | "react-is": "^19.1.0"
1396 | },
1397 | "engines": {
1398 | "node": ">=14.0.0"
1399 | },
1400 | "funding": {
1401 | "type": "opencollective",
1402 | "url": "https://opencollective.com/mui-org"
1403 | },
1404 | "peerDependencies": {
1405 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1406 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1407 | },
1408 | "peerDependenciesMeta": {
1409 | "@types/react": {
1410 | "optional": true
1411 | }
1412 | }
1413 | },
1414 | "node_modules/@popperjs/core": {
1415 | "version": "2.11.8",
1416 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
1417 | "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
1418 | "license": "MIT",
1419 | "funding": {
1420 | "type": "opencollective",
1421 | "url": "https://opencollective.com/popperjs"
1422 | }
1423 | },
1424 | "node_modules/@rolldown/pluginutils": {
1425 | "version": "1.0.0-beta.19",
1426 | "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz",
1427 | "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==",
1428 | "dev": true,
1429 | "license": "MIT"
1430 | },
1431 | "node_modules/@rollup/rollup-android-arm-eabi": {
1432 | "version": "4.44.2",
1433 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz",
1434 | "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==",
1435 | "cpu": [
1436 | "arm"
1437 | ],
1438 | "dev": true,
1439 | "license": "MIT",
1440 | "optional": true,
1441 | "os": [
1442 | "android"
1443 | ]
1444 | },
1445 | "node_modules/@rollup/rollup-android-arm64": {
1446 | "version": "4.44.2",
1447 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz",
1448 | "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==",
1449 | "cpu": [
1450 | "arm64"
1451 | ],
1452 | "dev": true,
1453 | "license": "MIT",
1454 | "optional": true,
1455 | "os": [
1456 | "android"
1457 | ]
1458 | },
1459 | "node_modules/@rollup/rollup-darwin-arm64": {
1460 | "version": "4.44.2",
1461 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz",
1462 | "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==",
1463 | "cpu": [
1464 | "arm64"
1465 | ],
1466 | "dev": true,
1467 | "license": "MIT",
1468 | "optional": true,
1469 | "os": [
1470 | "darwin"
1471 | ]
1472 | },
1473 | "node_modules/@rollup/rollup-darwin-x64": {
1474 | "version": "4.44.2",
1475 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz",
1476 | "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==",
1477 | "cpu": [
1478 | "x64"
1479 | ],
1480 | "dev": true,
1481 | "license": "MIT",
1482 | "optional": true,
1483 | "os": [
1484 | "darwin"
1485 | ]
1486 | },
1487 | "node_modules/@rollup/rollup-freebsd-arm64": {
1488 | "version": "4.44.2",
1489 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz",
1490 | "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==",
1491 | "cpu": [
1492 | "arm64"
1493 | ],
1494 | "dev": true,
1495 | "license": "MIT",
1496 | "optional": true,
1497 | "os": [
1498 | "freebsd"
1499 | ]
1500 | },
1501 | "node_modules/@rollup/rollup-freebsd-x64": {
1502 | "version": "4.44.2",
1503 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz",
1504 | "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==",
1505 | "cpu": [
1506 | "x64"
1507 | ],
1508 | "dev": true,
1509 | "license": "MIT",
1510 | "optional": true,
1511 | "os": [
1512 | "freebsd"
1513 | ]
1514 | },
1515 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1516 | "version": "4.44.2",
1517 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz",
1518 | "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==",
1519 | "cpu": [
1520 | "arm"
1521 | ],
1522 | "dev": true,
1523 | "license": "MIT",
1524 | "optional": true,
1525 | "os": [
1526 | "linux"
1527 | ]
1528 | },
1529 | "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1530 | "version": "4.44.2",
1531 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz",
1532 | "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==",
1533 | "cpu": [
1534 | "arm"
1535 | ],
1536 | "dev": true,
1537 | "license": "MIT",
1538 | "optional": true,
1539 | "os": [
1540 | "linux"
1541 | ]
1542 | },
1543 | "node_modules/@rollup/rollup-linux-arm64-gnu": {
1544 | "version": "4.44.2",
1545 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz",
1546 | "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==",
1547 | "cpu": [
1548 | "arm64"
1549 | ],
1550 | "dev": true,
1551 | "license": "MIT",
1552 | "optional": true,
1553 | "os": [
1554 | "linux"
1555 | ]
1556 | },
1557 | "node_modules/@rollup/rollup-linux-arm64-musl": {
1558 | "version": "4.44.2",
1559 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz",
1560 | "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==",
1561 | "cpu": [
1562 | "arm64"
1563 | ],
1564 | "dev": true,
1565 | "license": "MIT",
1566 | "optional": true,
1567 | "os": [
1568 | "linux"
1569 | ]
1570 | },
1571 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
1572 | "version": "4.44.2",
1573 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.2.tgz",
1574 | "integrity": "sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==",
1575 | "cpu": [
1576 | "loong64"
1577 | ],
1578 | "dev": true,
1579 | "license": "MIT",
1580 | "optional": true,
1581 | "os": [
1582 | "linux"
1583 | ]
1584 | },
1585 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
1586 | "version": "4.44.2",
1587 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.2.tgz",
1588 | "integrity": "sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==",
1589 | "cpu": [
1590 | "ppc64"
1591 | ],
1592 | "dev": true,
1593 | "license": "MIT",
1594 | "optional": true,
1595 | "os": [
1596 | "linux"
1597 | ]
1598 | },
1599 | "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1600 | "version": "4.44.2",
1601 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz",
1602 | "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==",
1603 | "cpu": [
1604 | "riscv64"
1605 | ],
1606 | "dev": true,
1607 | "license": "MIT",
1608 | "optional": true,
1609 | "os": [
1610 | "linux"
1611 | ]
1612 | },
1613 | "node_modules/@rollup/rollup-linux-riscv64-musl": {
1614 | "version": "4.44.2",
1615 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz",
1616 | "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==",
1617 | "cpu": [
1618 | "riscv64"
1619 | ],
1620 | "dev": true,
1621 | "license": "MIT",
1622 | "optional": true,
1623 | "os": [
1624 | "linux"
1625 | ]
1626 | },
1627 | "node_modules/@rollup/rollup-linux-s390x-gnu": {
1628 | "version": "4.44.2",
1629 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz",
1630 | "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==",
1631 | "cpu": [
1632 | "s390x"
1633 | ],
1634 | "dev": true,
1635 | "license": "MIT",
1636 | "optional": true,
1637 | "os": [
1638 | "linux"
1639 | ]
1640 | },
1641 | "node_modules/@rollup/rollup-linux-x64-gnu": {
1642 | "version": "4.44.2",
1643 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz",
1644 | "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==",
1645 | "cpu": [
1646 | "x64"
1647 | ],
1648 | "dev": true,
1649 | "license": "MIT",
1650 | "optional": true,
1651 | "os": [
1652 | "linux"
1653 | ]
1654 | },
1655 | "node_modules/@rollup/rollup-linux-x64-musl": {
1656 | "version": "4.44.2",
1657 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz",
1658 | "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==",
1659 | "cpu": [
1660 | "x64"
1661 | ],
1662 | "dev": true,
1663 | "license": "MIT",
1664 | "optional": true,
1665 | "os": [
1666 | "linux"
1667 | ]
1668 | },
1669 | "node_modules/@rollup/rollup-win32-arm64-msvc": {
1670 | "version": "4.44.2",
1671 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz",
1672 | "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==",
1673 | "cpu": [
1674 | "arm64"
1675 | ],
1676 | "dev": true,
1677 | "license": "MIT",
1678 | "optional": true,
1679 | "os": [
1680 | "win32"
1681 | ]
1682 | },
1683 | "node_modules/@rollup/rollup-win32-ia32-msvc": {
1684 | "version": "4.44.2",
1685 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz",
1686 | "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==",
1687 | "cpu": [
1688 | "ia32"
1689 | ],
1690 | "dev": true,
1691 | "license": "MIT",
1692 | "optional": true,
1693 | "os": [
1694 | "win32"
1695 | ]
1696 | },
1697 | "node_modules/@rollup/rollup-win32-x64-msvc": {
1698 | "version": "4.44.2",
1699 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz",
1700 | "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==",
1701 | "cpu": [
1702 | "x64"
1703 | ],
1704 | "dev": true,
1705 | "license": "MIT",
1706 | "optional": true,
1707 | "os": [
1708 | "win32"
1709 | ]
1710 | },
1711 | "node_modules/@types/babel__core": {
1712 | "version": "7.20.5",
1713 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1714 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1715 | "dev": true,
1716 | "license": "MIT",
1717 | "dependencies": {
1718 | "@babel/parser": "^7.20.7",
1719 | "@babel/types": "^7.20.7",
1720 | "@types/babel__generator": "*",
1721 | "@types/babel__template": "*",
1722 | "@types/babel__traverse": "*"
1723 | }
1724 | },
1725 | "node_modules/@types/babel__generator": {
1726 | "version": "7.27.0",
1727 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1728 | "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1729 | "dev": true,
1730 | "license": "MIT",
1731 | "dependencies": {
1732 | "@babel/types": "^7.0.0"
1733 | }
1734 | },
1735 | "node_modules/@types/babel__template": {
1736 | "version": "7.4.4",
1737 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1738 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1739 | "dev": true,
1740 | "license": "MIT",
1741 | "dependencies": {
1742 | "@babel/parser": "^7.1.0",
1743 | "@babel/types": "^7.0.0"
1744 | }
1745 | },
1746 | "node_modules/@types/babel__traverse": {
1747 | "version": "7.20.7",
1748 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
1749 | "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
1750 | "dev": true,
1751 | "license": "MIT",
1752 | "dependencies": {
1753 | "@babel/types": "^7.20.7"
1754 | }
1755 | },
1756 | "node_modules/@types/estree": {
1757 | "version": "1.0.8",
1758 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1759 | "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1760 | "dev": true,
1761 | "license": "MIT"
1762 | },
1763 | "node_modules/@types/json-schema": {
1764 | "version": "7.0.15",
1765 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
1766 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
1767 | "dev": true,
1768 | "license": "MIT"
1769 | },
1770 | "node_modules/@types/parse-json": {
1771 | "version": "4.0.2",
1772 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
1773 | "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
1774 | "license": "MIT"
1775 | },
1776 | "node_modules/@types/prop-types": {
1777 | "version": "15.7.15",
1778 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
1779 | "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
1780 | "license": "MIT"
1781 | },
1782 | "node_modules/@types/react": {
1783 | "version": "19.1.8",
1784 | "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz",
1785 | "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==",
1786 | "license": "MIT",
1787 | "dependencies": {
1788 | "csstype": "^3.0.2"
1789 | }
1790 | },
1791 | "node_modules/@types/react-dom": {
1792 | "version": "19.1.6",
1793 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz",
1794 | "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==",
1795 | "dev": true,
1796 | "license": "MIT",
1797 | "peerDependencies": {
1798 | "@types/react": "^19.0.0"
1799 | }
1800 | },
1801 | "node_modules/@types/react-transition-group": {
1802 | "version": "4.4.12",
1803 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
1804 | "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
1805 | "license": "MIT",
1806 | "peerDependencies": {
1807 | "@types/react": "*"
1808 | }
1809 | },
1810 | "node_modules/@vitejs/plugin-react": {
1811 | "version": "4.6.0",
1812 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz",
1813 | "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==",
1814 | "dev": true,
1815 | "license": "MIT",
1816 | "dependencies": {
1817 | "@babel/core": "^7.27.4",
1818 | "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1819 | "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1820 | "@rolldown/pluginutils": "1.0.0-beta.19",
1821 | "@types/babel__core": "^7.20.5",
1822 | "react-refresh": "^0.17.0"
1823 | },
1824 | "engines": {
1825 | "node": "^14.18.0 || >=16.0.0"
1826 | },
1827 | "peerDependencies": {
1828 | "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0"
1829 | }
1830 | },
1831 | "node_modules/acorn": {
1832 | "version": "8.15.0",
1833 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
1834 | "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
1835 | "dev": true,
1836 | "license": "MIT",
1837 | "bin": {
1838 | "acorn": "bin/acorn"
1839 | },
1840 | "engines": {
1841 | "node": ">=0.4.0"
1842 | }
1843 | },
1844 | "node_modules/acorn-jsx": {
1845 | "version": "5.3.2",
1846 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
1847 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
1848 | "dev": true,
1849 | "license": "MIT",
1850 | "peerDependencies": {
1851 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1852 | }
1853 | },
1854 | "node_modules/ajv": {
1855 | "version": "6.12.6",
1856 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1857 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1858 | "dev": true,
1859 | "license": "MIT",
1860 | "dependencies": {
1861 | "fast-deep-equal": "^3.1.1",
1862 | "fast-json-stable-stringify": "^2.0.0",
1863 | "json-schema-traverse": "^0.4.1",
1864 | "uri-js": "^4.2.2"
1865 | },
1866 | "funding": {
1867 | "type": "github",
1868 | "url": "https://github.com/sponsors/epoberezkin"
1869 | }
1870 | },
1871 | "node_modules/ansi-styles": {
1872 | "version": "4.3.0",
1873 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1874 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1875 | "dev": true,
1876 | "license": "MIT",
1877 | "dependencies": {
1878 | "color-convert": "^2.0.1"
1879 | },
1880 | "engines": {
1881 | "node": ">=8"
1882 | },
1883 | "funding": {
1884 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1885 | }
1886 | },
1887 | "node_modules/argparse": {
1888 | "version": "2.0.1",
1889 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1890 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1891 | "dev": true,
1892 | "license": "Python-2.0"
1893 | },
1894 | "node_modules/babel-plugin-macros": {
1895 | "version": "3.1.0",
1896 | "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
1897 | "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
1898 | "license": "MIT",
1899 | "dependencies": {
1900 | "@babel/runtime": "^7.12.5",
1901 | "cosmiconfig": "^7.0.0",
1902 | "resolve": "^1.19.0"
1903 | },
1904 | "engines": {
1905 | "node": ">=10",
1906 | "npm": ">=6"
1907 | }
1908 | },
1909 | "node_modules/balanced-match": {
1910 | "version": "1.0.2",
1911 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1912 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1913 | "dev": true,
1914 | "license": "MIT"
1915 | },
1916 | "node_modules/brace-expansion": {
1917 | "version": "1.1.12",
1918 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
1919 | "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
1920 | "dev": true,
1921 | "license": "MIT",
1922 | "dependencies": {
1923 | "balanced-match": "^1.0.0",
1924 | "concat-map": "0.0.1"
1925 | }
1926 | },
1927 | "node_modules/browserslist": {
1928 | "version": "4.25.1",
1929 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
1930 | "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
1931 | "dev": true,
1932 | "funding": [
1933 | {
1934 | "type": "opencollective",
1935 | "url": "https://opencollective.com/browserslist"
1936 | },
1937 | {
1938 | "type": "tidelift",
1939 | "url": "https://tidelift.com/funding/github/npm/browserslist"
1940 | },
1941 | {
1942 | "type": "github",
1943 | "url": "https://github.com/sponsors/ai"
1944 | }
1945 | ],
1946 | "license": "MIT",
1947 | "dependencies": {
1948 | "caniuse-lite": "^1.0.30001726",
1949 | "electron-to-chromium": "^1.5.173",
1950 | "node-releases": "^2.0.19",
1951 | "update-browserslist-db": "^1.1.3"
1952 | },
1953 | "bin": {
1954 | "browserslist": "cli.js"
1955 | },
1956 | "engines": {
1957 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1958 | }
1959 | },
1960 | "node_modules/callsites": {
1961 | "version": "3.1.0",
1962 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1963 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1964 | "license": "MIT",
1965 | "engines": {
1966 | "node": ">=6"
1967 | }
1968 | },
1969 | "node_modules/caniuse-lite": {
1970 | "version": "1.0.30001727",
1971 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
1972 | "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
1973 | "dev": true,
1974 | "funding": [
1975 | {
1976 | "type": "opencollective",
1977 | "url": "https://opencollective.com/browserslist"
1978 | },
1979 | {
1980 | "type": "tidelift",
1981 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1982 | },
1983 | {
1984 | "type": "github",
1985 | "url": "https://github.com/sponsors/ai"
1986 | }
1987 | ],
1988 | "license": "CC-BY-4.0"
1989 | },
1990 | "node_modules/chalk": {
1991 | "version": "4.1.2",
1992 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1993 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1994 | "dev": true,
1995 | "license": "MIT",
1996 | "dependencies": {
1997 | "ansi-styles": "^4.1.0",
1998 | "supports-color": "^7.1.0"
1999 | },
2000 | "engines": {
2001 | "node": ">=10"
2002 | },
2003 | "funding": {
2004 | "url": "https://github.com/chalk/chalk?sponsor=1"
2005 | }
2006 | },
2007 | "node_modules/clsx": {
2008 | "version": "2.1.1",
2009 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
2010 | "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
2011 | "license": "MIT",
2012 | "engines": {
2013 | "node": ">=6"
2014 | }
2015 | },
2016 | "node_modules/color-convert": {
2017 | "version": "2.0.1",
2018 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2019 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2020 | "dev": true,
2021 | "license": "MIT",
2022 | "dependencies": {
2023 | "color-name": "~1.1.4"
2024 | },
2025 | "engines": {
2026 | "node": ">=7.0.0"
2027 | }
2028 | },
2029 | "node_modules/color-name": {
2030 | "version": "1.1.4",
2031 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2032 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2033 | "dev": true,
2034 | "license": "MIT"
2035 | },
2036 | "node_modules/concat-map": {
2037 | "version": "0.0.1",
2038 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2039 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
2040 | "dev": true,
2041 | "license": "MIT"
2042 | },
2043 | "node_modules/convert-source-map": {
2044 | "version": "2.0.0",
2045 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
2046 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
2047 | "dev": true,
2048 | "license": "MIT"
2049 | },
2050 | "node_modules/cookie": {
2051 | "version": "1.0.2",
2052 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
2053 | "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
2054 | "license": "MIT",
2055 | "engines": {
2056 | "node": ">=18"
2057 | }
2058 | },
2059 | "node_modules/cosmiconfig": {
2060 | "version": "7.1.0",
2061 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
2062 | "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
2063 | "license": "MIT",
2064 | "dependencies": {
2065 | "@types/parse-json": "^4.0.0",
2066 | "import-fresh": "^3.2.1",
2067 | "parse-json": "^5.0.0",
2068 | "path-type": "^4.0.0",
2069 | "yaml": "^1.10.0"
2070 | },
2071 | "engines": {
2072 | "node": ">=10"
2073 | }
2074 | },
2075 | "node_modules/cosmiconfig/node_modules/yaml": {
2076 | "version": "1.10.2",
2077 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
2078 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
2079 | "license": "ISC",
2080 | "engines": {
2081 | "node": ">= 6"
2082 | }
2083 | },
2084 | "node_modules/cross-spawn": {
2085 | "version": "7.0.6",
2086 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
2087 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
2088 | "dev": true,
2089 | "license": "MIT",
2090 | "dependencies": {
2091 | "path-key": "^3.1.0",
2092 | "shebang-command": "^2.0.0",
2093 | "which": "^2.0.1"
2094 | },
2095 | "engines": {
2096 | "node": ">= 8"
2097 | }
2098 | },
2099 | "node_modules/csstype": {
2100 | "version": "3.1.3",
2101 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
2102 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
2103 | "license": "MIT"
2104 | },
2105 | "node_modules/debug": {
2106 | "version": "4.4.1",
2107 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
2108 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
2109 | "license": "MIT",
2110 | "dependencies": {
2111 | "ms": "^2.1.3"
2112 | },
2113 | "engines": {
2114 | "node": ">=6.0"
2115 | },
2116 | "peerDependenciesMeta": {
2117 | "supports-color": {
2118 | "optional": true
2119 | }
2120 | }
2121 | },
2122 | "node_modules/deep-is": {
2123 | "version": "0.1.4",
2124 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
2125 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
2126 | "dev": true,
2127 | "license": "MIT"
2128 | },
2129 | "node_modules/dom-helpers": {
2130 | "version": "5.2.1",
2131 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
2132 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
2133 | "license": "MIT",
2134 | "dependencies": {
2135 | "@babel/runtime": "^7.8.7",
2136 | "csstype": "^3.0.2"
2137 | }
2138 | },
2139 | "node_modules/electron-to-chromium": {
2140 | "version": "1.5.179",
2141 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz",
2142 | "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==",
2143 | "dev": true,
2144 | "license": "ISC"
2145 | },
2146 | "node_modules/error-ex": {
2147 | "version": "1.3.2",
2148 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
2149 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
2150 | "license": "MIT",
2151 | "dependencies": {
2152 | "is-arrayish": "^0.2.1"
2153 | }
2154 | },
2155 | "node_modules/esbuild": {
2156 | "version": "0.25.5",
2157 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
2158 | "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
2159 | "dev": true,
2160 | "hasInstallScript": true,
2161 | "license": "MIT",
2162 | "bin": {
2163 | "esbuild": "bin/esbuild"
2164 | },
2165 | "engines": {
2166 | "node": ">=18"
2167 | },
2168 | "optionalDependencies": {
2169 | "@esbuild/aix-ppc64": "0.25.5",
2170 | "@esbuild/android-arm": "0.25.5",
2171 | "@esbuild/android-arm64": "0.25.5",
2172 | "@esbuild/android-x64": "0.25.5",
2173 | "@esbuild/darwin-arm64": "0.25.5",
2174 | "@esbuild/darwin-x64": "0.25.5",
2175 | "@esbuild/freebsd-arm64": "0.25.5",
2176 | "@esbuild/freebsd-x64": "0.25.5",
2177 | "@esbuild/linux-arm": "0.25.5",
2178 | "@esbuild/linux-arm64": "0.25.5",
2179 | "@esbuild/linux-ia32": "0.25.5",
2180 | "@esbuild/linux-loong64": "0.25.5",
2181 | "@esbuild/linux-mips64el": "0.25.5",
2182 | "@esbuild/linux-ppc64": "0.25.5",
2183 | "@esbuild/linux-riscv64": "0.25.5",
2184 | "@esbuild/linux-s390x": "0.25.5",
2185 | "@esbuild/linux-x64": "0.25.5",
2186 | "@esbuild/netbsd-arm64": "0.25.5",
2187 | "@esbuild/netbsd-x64": "0.25.5",
2188 | "@esbuild/openbsd-arm64": "0.25.5",
2189 | "@esbuild/openbsd-x64": "0.25.5",
2190 | "@esbuild/sunos-x64": "0.25.5",
2191 | "@esbuild/win32-arm64": "0.25.5",
2192 | "@esbuild/win32-ia32": "0.25.5",
2193 | "@esbuild/win32-x64": "0.25.5"
2194 | }
2195 | },
2196 | "node_modules/escalade": {
2197 | "version": "3.2.0",
2198 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
2199 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
2200 | "dev": true,
2201 | "license": "MIT",
2202 | "engines": {
2203 | "node": ">=6"
2204 | }
2205 | },
2206 | "node_modules/escape-string-regexp": {
2207 | "version": "4.0.0",
2208 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
2209 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
2210 | "license": "MIT",
2211 | "engines": {
2212 | "node": ">=10"
2213 | },
2214 | "funding": {
2215 | "url": "https://github.com/sponsors/sindresorhus"
2216 | }
2217 | },
2218 | "node_modules/eslint": {
2219 | "version": "9.30.1",
2220 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz",
2221 | "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==",
2222 | "dev": true,
2223 | "license": "MIT",
2224 | "dependencies": {
2225 | "@eslint-community/eslint-utils": "^4.2.0",
2226 | "@eslint-community/regexpp": "^4.12.1",
2227 | "@eslint/config-array": "^0.21.0",
2228 | "@eslint/config-helpers": "^0.3.0",
2229 | "@eslint/core": "^0.14.0",
2230 | "@eslint/eslintrc": "^3.3.1",
2231 | "@eslint/js": "9.30.1",
2232 | "@eslint/plugin-kit": "^0.3.1",
2233 | "@humanfs/node": "^0.16.6",
2234 | "@humanwhocodes/module-importer": "^1.0.1",
2235 | "@humanwhocodes/retry": "^0.4.2",
2236 | "@types/estree": "^1.0.6",
2237 | "@types/json-schema": "^7.0.15",
2238 | "ajv": "^6.12.4",
2239 | "chalk": "^4.0.0",
2240 | "cross-spawn": "^7.0.6",
2241 | "debug": "^4.3.2",
2242 | "escape-string-regexp": "^4.0.0",
2243 | "eslint-scope": "^8.4.0",
2244 | "eslint-visitor-keys": "^4.2.1",
2245 | "espree": "^10.4.0",
2246 | "esquery": "^1.5.0",
2247 | "esutils": "^2.0.2",
2248 | "fast-deep-equal": "^3.1.3",
2249 | "file-entry-cache": "^8.0.0",
2250 | "find-up": "^5.0.0",
2251 | "glob-parent": "^6.0.2",
2252 | "ignore": "^5.2.0",
2253 | "imurmurhash": "^0.1.4",
2254 | "is-glob": "^4.0.0",
2255 | "json-stable-stringify-without-jsonify": "^1.0.1",
2256 | "lodash.merge": "^4.6.2",
2257 | "minimatch": "^3.1.2",
2258 | "natural-compare": "^1.4.0",
2259 | "optionator": "^0.9.3"
2260 | },
2261 | "bin": {
2262 | "eslint": "bin/eslint.js"
2263 | },
2264 | "engines": {
2265 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2266 | },
2267 | "funding": {
2268 | "url": "https://eslint.org/donate"
2269 | },
2270 | "peerDependencies": {
2271 | "jiti": "*"
2272 | },
2273 | "peerDependenciesMeta": {
2274 | "jiti": {
2275 | "optional": true
2276 | }
2277 | }
2278 | },
2279 | "node_modules/eslint-plugin-react-hooks": {
2280 | "version": "5.2.0",
2281 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
2282 | "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
2283 | "dev": true,
2284 | "license": "MIT",
2285 | "engines": {
2286 | "node": ">=10"
2287 | },
2288 | "peerDependencies": {
2289 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
2290 | }
2291 | },
2292 | "node_modules/eslint-plugin-react-refresh": {
2293 | "version": "0.4.20",
2294 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz",
2295 | "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==",
2296 | "dev": true,
2297 | "license": "MIT",
2298 | "peerDependencies": {
2299 | "eslint": ">=8.40"
2300 | }
2301 | },
2302 | "node_modules/eslint-scope": {
2303 | "version": "8.4.0",
2304 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
2305 | "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
2306 | "dev": true,
2307 | "license": "BSD-2-Clause",
2308 | "dependencies": {
2309 | "esrecurse": "^4.3.0",
2310 | "estraverse": "^5.2.0"
2311 | },
2312 | "engines": {
2313 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2314 | },
2315 | "funding": {
2316 | "url": "https://opencollective.com/eslint"
2317 | }
2318 | },
2319 | "node_modules/eslint-visitor-keys": {
2320 | "version": "4.2.1",
2321 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
2322 | "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
2323 | "dev": true,
2324 | "license": "Apache-2.0",
2325 | "engines": {
2326 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2327 | },
2328 | "funding": {
2329 | "url": "https://opencollective.com/eslint"
2330 | }
2331 | },
2332 | "node_modules/espree": {
2333 | "version": "10.4.0",
2334 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
2335 | "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
2336 | "dev": true,
2337 | "license": "BSD-2-Clause",
2338 | "dependencies": {
2339 | "acorn": "^8.15.0",
2340 | "acorn-jsx": "^5.3.2",
2341 | "eslint-visitor-keys": "^4.2.1"
2342 | },
2343 | "engines": {
2344 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2345 | },
2346 | "funding": {
2347 | "url": "https://opencollective.com/eslint"
2348 | }
2349 | },
2350 | "node_modules/esquery": {
2351 | "version": "1.6.0",
2352 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
2353 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
2354 | "dev": true,
2355 | "license": "BSD-3-Clause",
2356 | "dependencies": {
2357 | "estraverse": "^5.1.0"
2358 | },
2359 | "engines": {
2360 | "node": ">=0.10"
2361 | }
2362 | },
2363 | "node_modules/esrecurse": {
2364 | "version": "4.3.0",
2365 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
2366 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
2367 | "dev": true,
2368 | "license": "BSD-2-Clause",
2369 | "dependencies": {
2370 | "estraverse": "^5.2.0"
2371 | },
2372 | "engines": {
2373 | "node": ">=4.0"
2374 | }
2375 | },
2376 | "node_modules/estraverse": {
2377 | "version": "5.3.0",
2378 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
2379 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
2380 | "dev": true,
2381 | "license": "BSD-2-Clause",
2382 | "engines": {
2383 | "node": ">=4.0"
2384 | }
2385 | },
2386 | "node_modules/esutils": {
2387 | "version": "2.0.3",
2388 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
2389 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
2390 | "dev": true,
2391 | "license": "BSD-2-Clause",
2392 | "engines": {
2393 | "node": ">=0.10.0"
2394 | }
2395 | },
2396 | "node_modules/fast-deep-equal": {
2397 | "version": "3.1.3",
2398 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
2399 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
2400 | "dev": true,
2401 | "license": "MIT"
2402 | },
2403 | "node_modules/fast-json-stable-stringify": {
2404 | "version": "2.1.0",
2405 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
2406 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
2407 | "dev": true,
2408 | "license": "MIT"
2409 | },
2410 | "node_modules/fast-levenshtein": {
2411 | "version": "2.0.6",
2412 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
2413 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
2414 | "dev": true,
2415 | "license": "MIT"
2416 | },
2417 | "node_modules/fdir": {
2418 | "version": "6.4.6",
2419 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
2420 | "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
2421 | "dev": true,
2422 | "license": "MIT",
2423 | "peerDependencies": {
2424 | "picomatch": "^3 || ^4"
2425 | },
2426 | "peerDependenciesMeta": {
2427 | "picomatch": {
2428 | "optional": true
2429 | }
2430 | }
2431 | },
2432 | "node_modules/file-entry-cache": {
2433 | "version": "8.0.0",
2434 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
2435 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
2436 | "dev": true,
2437 | "license": "MIT",
2438 | "dependencies": {
2439 | "flat-cache": "^4.0.0"
2440 | },
2441 | "engines": {
2442 | "node": ">=16.0.0"
2443 | }
2444 | },
2445 | "node_modules/find-root": {
2446 | "version": "1.1.0",
2447 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
2448 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
2449 | "license": "MIT"
2450 | },
2451 | "node_modules/find-up": {
2452 | "version": "5.0.0",
2453 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
2454 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
2455 | "dev": true,
2456 | "license": "MIT",
2457 | "dependencies": {
2458 | "locate-path": "^6.0.0",
2459 | "path-exists": "^4.0.0"
2460 | },
2461 | "engines": {
2462 | "node": ">=10"
2463 | },
2464 | "funding": {
2465 | "url": "https://github.com/sponsors/sindresorhus"
2466 | }
2467 | },
2468 | "node_modules/flat-cache": {
2469 | "version": "4.0.1",
2470 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
2471 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
2472 | "dev": true,
2473 | "license": "MIT",
2474 | "dependencies": {
2475 | "flatted": "^3.2.9",
2476 | "keyv": "^4.5.4"
2477 | },
2478 | "engines": {
2479 | "node": ">=16"
2480 | }
2481 | },
2482 | "node_modules/flatted": {
2483 | "version": "3.3.3",
2484 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
2485 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
2486 | "dev": true,
2487 | "license": "ISC"
2488 | },
2489 | "node_modules/fsevents": {
2490 | "version": "2.3.3",
2491 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
2492 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
2493 | "dev": true,
2494 | "hasInstallScript": true,
2495 | "license": "MIT",
2496 | "optional": true,
2497 | "os": [
2498 | "darwin"
2499 | ],
2500 | "engines": {
2501 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
2502 | }
2503 | },
2504 | "node_modules/function-bind": {
2505 | "version": "1.1.2",
2506 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
2507 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
2508 | "license": "MIT",
2509 | "funding": {
2510 | "url": "https://github.com/sponsors/ljharb"
2511 | }
2512 | },
2513 | "node_modules/gensync": {
2514 | "version": "1.0.0-beta.2",
2515 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
2516 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
2517 | "dev": true,
2518 | "license": "MIT",
2519 | "engines": {
2520 | "node": ">=6.9.0"
2521 | }
2522 | },
2523 | "node_modules/glob-parent": {
2524 | "version": "6.0.2",
2525 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
2526 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
2527 | "dev": true,
2528 | "license": "ISC",
2529 | "dependencies": {
2530 | "is-glob": "^4.0.3"
2531 | },
2532 | "engines": {
2533 | "node": ">=10.13.0"
2534 | }
2535 | },
2536 | "node_modules/globals": {
2537 | "version": "16.3.0",
2538 | "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz",
2539 | "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==",
2540 | "dev": true,
2541 | "license": "MIT",
2542 | "engines": {
2543 | "node": ">=18"
2544 | },
2545 | "funding": {
2546 | "url": "https://github.com/sponsors/sindresorhus"
2547 | }
2548 | },
2549 | "node_modules/has-flag": {
2550 | "version": "4.0.0",
2551 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2552 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2553 | "dev": true,
2554 | "license": "MIT",
2555 | "engines": {
2556 | "node": ">=8"
2557 | }
2558 | },
2559 | "node_modules/hasown": {
2560 | "version": "2.0.2",
2561 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
2562 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
2563 | "license": "MIT",
2564 | "dependencies": {
2565 | "function-bind": "^1.1.2"
2566 | },
2567 | "engines": {
2568 | "node": ">= 0.4"
2569 | }
2570 | },
2571 | "node_modules/hoist-non-react-statics": {
2572 | "version": "3.3.2",
2573 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
2574 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
2575 | "license": "BSD-3-Clause",
2576 | "dependencies": {
2577 | "react-is": "^16.7.0"
2578 | }
2579 | },
2580 | "node_modules/hoist-non-react-statics/node_modules/react-is": {
2581 | "version": "16.13.1",
2582 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2583 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
2584 | "license": "MIT"
2585 | },
2586 | "node_modules/ignore": {
2587 | "version": "5.3.2",
2588 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
2589 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
2590 | "dev": true,
2591 | "license": "MIT",
2592 | "engines": {
2593 | "node": ">= 4"
2594 | }
2595 | },
2596 | "node_modules/import-fresh": {
2597 | "version": "3.3.1",
2598 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
2599 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
2600 | "license": "MIT",
2601 | "dependencies": {
2602 | "parent-module": "^1.0.0",
2603 | "resolve-from": "^4.0.0"
2604 | },
2605 | "engines": {
2606 | "node": ">=6"
2607 | },
2608 | "funding": {
2609 | "url": "https://github.com/sponsors/sindresorhus"
2610 | }
2611 | },
2612 | "node_modules/imurmurhash": {
2613 | "version": "0.1.4",
2614 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2615 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
2616 | "dev": true,
2617 | "license": "MIT",
2618 | "engines": {
2619 | "node": ">=0.8.19"
2620 | }
2621 | },
2622 | "node_modules/is-arrayish": {
2623 | "version": "0.2.1",
2624 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
2625 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
2626 | "license": "MIT"
2627 | },
2628 | "node_modules/is-core-module": {
2629 | "version": "2.16.1",
2630 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
2631 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
2632 | "license": "MIT",
2633 | "dependencies": {
2634 | "hasown": "^2.0.2"
2635 | },
2636 | "engines": {
2637 | "node": ">= 0.4"
2638 | },
2639 | "funding": {
2640 | "url": "https://github.com/sponsors/ljharb"
2641 | }
2642 | },
2643 | "node_modules/is-extglob": {
2644 | "version": "2.1.1",
2645 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2646 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
2647 | "dev": true,
2648 | "license": "MIT",
2649 | "engines": {
2650 | "node": ">=0.10.0"
2651 | }
2652 | },
2653 | "node_modules/is-glob": {
2654 | "version": "4.0.3",
2655 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
2656 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
2657 | "dev": true,
2658 | "license": "MIT",
2659 | "dependencies": {
2660 | "is-extglob": "^2.1.1"
2661 | },
2662 | "engines": {
2663 | "node": ">=0.10.0"
2664 | }
2665 | },
2666 | "node_modules/isexe": {
2667 | "version": "2.0.0",
2668 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2669 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
2670 | "dev": true,
2671 | "license": "ISC"
2672 | },
2673 | "node_modules/js-tokens": {
2674 | "version": "4.0.0",
2675 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
2676 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
2677 | "license": "MIT"
2678 | },
2679 | "node_modules/js-yaml": {
2680 | "version": "4.1.0",
2681 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2682 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2683 | "dev": true,
2684 | "license": "MIT",
2685 | "dependencies": {
2686 | "argparse": "^2.0.1"
2687 | },
2688 | "bin": {
2689 | "js-yaml": "bin/js-yaml.js"
2690 | }
2691 | },
2692 | "node_modules/jsesc": {
2693 | "version": "3.1.0",
2694 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
2695 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
2696 | "license": "MIT",
2697 | "bin": {
2698 | "jsesc": "bin/jsesc"
2699 | },
2700 | "engines": {
2701 | "node": ">=6"
2702 | }
2703 | },
2704 | "node_modules/json-buffer": {
2705 | "version": "3.0.1",
2706 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
2707 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
2708 | "dev": true,
2709 | "license": "MIT"
2710 | },
2711 | "node_modules/json-parse-even-better-errors": {
2712 | "version": "2.3.1",
2713 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
2714 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
2715 | "license": "MIT"
2716 | },
2717 | "node_modules/json-schema-traverse": {
2718 | "version": "0.4.1",
2719 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2720 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2721 | "dev": true,
2722 | "license": "MIT"
2723 | },
2724 | "node_modules/json-stable-stringify-without-jsonify": {
2725 | "version": "1.0.1",
2726 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
2727 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
2728 | "dev": true,
2729 | "license": "MIT"
2730 | },
2731 | "node_modules/json5": {
2732 | "version": "2.2.3",
2733 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
2734 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
2735 | "dev": true,
2736 | "license": "MIT",
2737 | "bin": {
2738 | "json5": "lib/cli.js"
2739 | },
2740 | "engines": {
2741 | "node": ">=6"
2742 | }
2743 | },
2744 | "node_modules/keyv": {
2745 | "version": "4.5.4",
2746 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
2747 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
2748 | "dev": true,
2749 | "license": "MIT",
2750 | "dependencies": {
2751 | "json-buffer": "3.0.1"
2752 | }
2753 | },
2754 | "node_modules/levn": {
2755 | "version": "0.4.1",
2756 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
2757 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
2758 | "dev": true,
2759 | "license": "MIT",
2760 | "dependencies": {
2761 | "prelude-ls": "^1.2.1",
2762 | "type-check": "~0.4.0"
2763 | },
2764 | "engines": {
2765 | "node": ">= 0.8.0"
2766 | }
2767 | },
2768 | "node_modules/lines-and-columns": {
2769 | "version": "1.2.4",
2770 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
2771 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
2772 | "license": "MIT"
2773 | },
2774 | "node_modules/locate-path": {
2775 | "version": "6.0.0",
2776 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2777 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2778 | "dev": true,
2779 | "license": "MIT",
2780 | "dependencies": {
2781 | "p-locate": "^5.0.0"
2782 | },
2783 | "engines": {
2784 | "node": ">=10"
2785 | },
2786 | "funding": {
2787 | "url": "https://github.com/sponsors/sindresorhus"
2788 | }
2789 | },
2790 | "node_modules/lodash.merge": {
2791 | "version": "4.6.2",
2792 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
2793 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
2794 | "dev": true,
2795 | "license": "MIT"
2796 | },
2797 | "node_modules/loose-envify": {
2798 | "version": "1.4.0",
2799 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
2800 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
2801 | "license": "MIT",
2802 | "dependencies": {
2803 | "js-tokens": "^3.0.0 || ^4.0.0"
2804 | },
2805 | "bin": {
2806 | "loose-envify": "cli.js"
2807 | }
2808 | },
2809 | "node_modules/lru-cache": {
2810 | "version": "5.1.1",
2811 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
2812 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2813 | "dev": true,
2814 | "license": "ISC",
2815 | "dependencies": {
2816 | "yallist": "^3.0.2"
2817 | }
2818 | },
2819 | "node_modules/minimatch": {
2820 | "version": "3.1.2",
2821 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2822 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2823 | "dev": true,
2824 | "license": "ISC",
2825 | "dependencies": {
2826 | "brace-expansion": "^1.1.7"
2827 | },
2828 | "engines": {
2829 | "node": "*"
2830 | }
2831 | },
2832 | "node_modules/ms": {
2833 | "version": "2.1.3",
2834 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2835 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2836 | "license": "MIT"
2837 | },
2838 | "node_modules/nanoid": {
2839 | "version": "3.3.11",
2840 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
2841 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
2842 | "dev": true,
2843 | "funding": [
2844 | {
2845 | "type": "github",
2846 | "url": "https://github.com/sponsors/ai"
2847 | }
2848 | ],
2849 | "license": "MIT",
2850 | "bin": {
2851 | "nanoid": "bin/nanoid.cjs"
2852 | },
2853 | "engines": {
2854 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2855 | }
2856 | },
2857 | "node_modules/natural-compare": {
2858 | "version": "1.4.0",
2859 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2860 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
2861 | "dev": true,
2862 | "license": "MIT"
2863 | },
2864 | "node_modules/node-releases": {
2865 | "version": "2.0.19",
2866 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
2867 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
2868 | "dev": true,
2869 | "license": "MIT"
2870 | },
2871 | "node_modules/object-assign": {
2872 | "version": "4.1.1",
2873 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2874 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
2875 | "license": "MIT",
2876 | "engines": {
2877 | "node": ">=0.10.0"
2878 | }
2879 | },
2880 | "node_modules/optionator": {
2881 | "version": "0.9.4",
2882 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
2883 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
2884 | "dev": true,
2885 | "license": "MIT",
2886 | "dependencies": {
2887 | "deep-is": "^0.1.3",
2888 | "fast-levenshtein": "^2.0.6",
2889 | "levn": "^0.4.1",
2890 | "prelude-ls": "^1.2.1",
2891 | "type-check": "^0.4.0",
2892 | "word-wrap": "^1.2.5"
2893 | },
2894 | "engines": {
2895 | "node": ">= 0.8.0"
2896 | }
2897 | },
2898 | "node_modules/p-limit": {
2899 | "version": "3.1.0",
2900 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2901 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2902 | "dev": true,
2903 | "license": "MIT",
2904 | "dependencies": {
2905 | "yocto-queue": "^0.1.0"
2906 | },
2907 | "engines": {
2908 | "node": ">=10"
2909 | },
2910 | "funding": {
2911 | "url": "https://github.com/sponsors/sindresorhus"
2912 | }
2913 | },
2914 | "node_modules/p-locate": {
2915 | "version": "5.0.0",
2916 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2917 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2918 | "dev": true,
2919 | "license": "MIT",
2920 | "dependencies": {
2921 | "p-limit": "^3.0.2"
2922 | },
2923 | "engines": {
2924 | "node": ">=10"
2925 | },
2926 | "funding": {
2927 | "url": "https://github.com/sponsors/sindresorhus"
2928 | }
2929 | },
2930 | "node_modules/parent-module": {
2931 | "version": "1.0.1",
2932 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2933 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2934 | "license": "MIT",
2935 | "dependencies": {
2936 | "callsites": "^3.0.0"
2937 | },
2938 | "engines": {
2939 | "node": ">=6"
2940 | }
2941 | },
2942 | "node_modules/parse-json": {
2943 | "version": "5.2.0",
2944 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
2945 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
2946 | "license": "MIT",
2947 | "dependencies": {
2948 | "@babel/code-frame": "^7.0.0",
2949 | "error-ex": "^1.3.1",
2950 | "json-parse-even-better-errors": "^2.3.0",
2951 | "lines-and-columns": "^1.1.6"
2952 | },
2953 | "engines": {
2954 | "node": ">=8"
2955 | },
2956 | "funding": {
2957 | "url": "https://github.com/sponsors/sindresorhus"
2958 | }
2959 | },
2960 | "node_modules/path-exists": {
2961 | "version": "4.0.0",
2962 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2963 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2964 | "dev": true,
2965 | "license": "MIT",
2966 | "engines": {
2967 | "node": ">=8"
2968 | }
2969 | },
2970 | "node_modules/path-key": {
2971 | "version": "3.1.1",
2972 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2973 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2974 | "dev": true,
2975 | "license": "MIT",
2976 | "engines": {
2977 | "node": ">=8"
2978 | }
2979 | },
2980 | "node_modules/path-parse": {
2981 | "version": "1.0.7",
2982 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2983 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
2984 | "license": "MIT"
2985 | },
2986 | "node_modules/path-type": {
2987 | "version": "4.0.0",
2988 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2989 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2990 | "license": "MIT",
2991 | "engines": {
2992 | "node": ">=8"
2993 | }
2994 | },
2995 | "node_modules/picocolors": {
2996 | "version": "1.1.1",
2997 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2998 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2999 | "license": "ISC"
3000 | },
3001 | "node_modules/picomatch": {
3002 | "version": "4.0.2",
3003 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
3004 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
3005 | "dev": true,
3006 | "license": "MIT",
3007 | "engines": {
3008 | "node": ">=12"
3009 | },
3010 | "funding": {
3011 | "url": "https://github.com/sponsors/jonschlinkert"
3012 | }
3013 | },
3014 | "node_modules/postcss": {
3015 | "version": "8.5.6",
3016 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
3017 | "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
3018 | "dev": true,
3019 | "funding": [
3020 | {
3021 | "type": "opencollective",
3022 | "url": "https://opencollective.com/postcss/"
3023 | },
3024 | {
3025 | "type": "tidelift",
3026 | "url": "https://tidelift.com/funding/github/npm/postcss"
3027 | },
3028 | {
3029 | "type": "github",
3030 | "url": "https://github.com/sponsors/ai"
3031 | }
3032 | ],
3033 | "license": "MIT",
3034 | "dependencies": {
3035 | "nanoid": "^3.3.11",
3036 | "picocolors": "^1.1.1",
3037 | "source-map-js": "^1.2.1"
3038 | },
3039 | "engines": {
3040 | "node": "^10 || ^12 || >=14"
3041 | }
3042 | },
3043 | "node_modules/prelude-ls": {
3044 | "version": "1.2.1",
3045 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
3046 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
3047 | "dev": true,
3048 | "license": "MIT",
3049 | "engines": {
3050 | "node": ">= 0.8.0"
3051 | }
3052 | },
3053 | "node_modules/prop-types": {
3054 | "version": "15.8.1",
3055 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
3056 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
3057 | "license": "MIT",
3058 | "dependencies": {
3059 | "loose-envify": "^1.4.0",
3060 | "object-assign": "^4.1.1",
3061 | "react-is": "^16.13.1"
3062 | }
3063 | },
3064 | "node_modules/prop-types/node_modules/react-is": {
3065 | "version": "16.13.1",
3066 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
3067 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
3068 | "license": "MIT"
3069 | },
3070 | "node_modules/punycode": {
3071 | "version": "2.3.1",
3072 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
3073 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
3074 | "dev": true,
3075 | "license": "MIT",
3076 | "engines": {
3077 | "node": ">=6"
3078 | }
3079 | },
3080 | "node_modules/react": {
3081 | "version": "19.1.0",
3082 | "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
3083 | "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
3084 | "license": "MIT",
3085 | "engines": {
3086 | "node": ">=0.10.0"
3087 | }
3088 | },
3089 | "node_modules/react-dom": {
3090 | "version": "19.1.0",
3091 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
3092 | "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
3093 | "license": "MIT",
3094 | "dependencies": {
3095 | "scheduler": "^0.26.0"
3096 | },
3097 | "peerDependencies": {
3098 | "react": "^19.1.0"
3099 | }
3100 | },
3101 | "node_modules/react-is": {
3102 | "version": "19.1.0",
3103 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz",
3104 | "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==",
3105 | "license": "MIT"
3106 | },
3107 | "node_modules/react-refresh": {
3108 | "version": "0.17.0",
3109 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
3110 | "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
3111 | "dev": true,
3112 | "license": "MIT",
3113 | "engines": {
3114 | "node": ">=0.10.0"
3115 | }
3116 | },
3117 | "node_modules/react-router": {
3118 | "version": "7.6.3",
3119 | "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz",
3120 | "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==",
3121 | "license": "MIT",
3122 | "dependencies": {
3123 | "cookie": "^1.0.1",
3124 | "set-cookie-parser": "^2.6.0"
3125 | },
3126 | "engines": {
3127 | "node": ">=20.0.0"
3128 | },
3129 | "peerDependencies": {
3130 | "react": ">=18",
3131 | "react-dom": ">=18"
3132 | },
3133 | "peerDependenciesMeta": {
3134 | "react-dom": {
3135 | "optional": true
3136 | }
3137 | }
3138 | },
3139 | "node_modules/react-router-dom": {
3140 | "version": "7.6.3",
3141 | "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.3.tgz",
3142 | "integrity": "sha512-DiWJm9qdUAmiJrVWaeJdu4TKu13+iB/8IEi0EW/XgaHCjW/vWGrwzup0GVvaMteuZjKnh5bEvJP/K0MDnzawHw==",
3143 | "license": "MIT",
3144 | "dependencies": {
3145 | "react-router": "7.6.3"
3146 | },
3147 | "engines": {
3148 | "node": ">=20.0.0"
3149 | },
3150 | "peerDependencies": {
3151 | "react": ">=18",
3152 | "react-dom": ">=18"
3153 | }
3154 | },
3155 | "node_modules/react-transition-group": {
3156 | "version": "4.4.5",
3157 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
3158 | "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
3159 | "license": "BSD-3-Clause",
3160 | "dependencies": {
3161 | "@babel/runtime": "^7.5.5",
3162 | "dom-helpers": "^5.0.1",
3163 | "loose-envify": "^1.4.0",
3164 | "prop-types": "^15.6.2"
3165 | },
3166 | "peerDependencies": {
3167 | "react": ">=16.6.0",
3168 | "react-dom": ">=16.6.0"
3169 | }
3170 | },
3171 | "node_modules/resolve": {
3172 | "version": "1.22.10",
3173 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
3174 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
3175 | "license": "MIT",
3176 | "dependencies": {
3177 | "is-core-module": "^2.16.0",
3178 | "path-parse": "^1.0.7",
3179 | "supports-preserve-symlinks-flag": "^1.0.0"
3180 | },
3181 | "bin": {
3182 | "resolve": "bin/resolve"
3183 | },
3184 | "engines": {
3185 | "node": ">= 0.4"
3186 | },
3187 | "funding": {
3188 | "url": "https://github.com/sponsors/ljharb"
3189 | }
3190 | },
3191 | "node_modules/resolve-from": {
3192 | "version": "4.0.0",
3193 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
3194 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
3195 | "license": "MIT",
3196 | "engines": {
3197 | "node": ">=4"
3198 | }
3199 | },
3200 | "node_modules/rollup": {
3201 | "version": "4.44.2",
3202 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz",
3203 | "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==",
3204 | "dev": true,
3205 | "license": "MIT",
3206 | "dependencies": {
3207 | "@types/estree": "1.0.8"
3208 | },
3209 | "bin": {
3210 | "rollup": "dist/bin/rollup"
3211 | },
3212 | "engines": {
3213 | "node": ">=18.0.0",
3214 | "npm": ">=8.0.0"
3215 | },
3216 | "optionalDependencies": {
3217 | "@rollup/rollup-android-arm-eabi": "4.44.2",
3218 | "@rollup/rollup-android-arm64": "4.44.2",
3219 | "@rollup/rollup-darwin-arm64": "4.44.2",
3220 | "@rollup/rollup-darwin-x64": "4.44.2",
3221 | "@rollup/rollup-freebsd-arm64": "4.44.2",
3222 | "@rollup/rollup-freebsd-x64": "4.44.2",
3223 | "@rollup/rollup-linux-arm-gnueabihf": "4.44.2",
3224 | "@rollup/rollup-linux-arm-musleabihf": "4.44.2",
3225 | "@rollup/rollup-linux-arm64-gnu": "4.44.2",
3226 | "@rollup/rollup-linux-arm64-musl": "4.44.2",
3227 | "@rollup/rollup-linux-loongarch64-gnu": "4.44.2",
3228 | "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2",
3229 | "@rollup/rollup-linux-riscv64-gnu": "4.44.2",
3230 | "@rollup/rollup-linux-riscv64-musl": "4.44.2",
3231 | "@rollup/rollup-linux-s390x-gnu": "4.44.2",
3232 | "@rollup/rollup-linux-x64-gnu": "4.44.2",
3233 | "@rollup/rollup-linux-x64-musl": "4.44.2",
3234 | "@rollup/rollup-win32-arm64-msvc": "4.44.2",
3235 | "@rollup/rollup-win32-ia32-msvc": "4.44.2",
3236 | "@rollup/rollup-win32-x64-msvc": "4.44.2",
3237 | "fsevents": "~2.3.2"
3238 | }
3239 | },
3240 | "node_modules/scheduler": {
3241 | "version": "0.26.0",
3242 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
3243 | "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
3244 | "license": "MIT"
3245 | },
3246 | "node_modules/semver": {
3247 | "version": "6.3.1",
3248 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
3249 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
3250 | "dev": true,
3251 | "license": "ISC",
3252 | "bin": {
3253 | "semver": "bin/semver.js"
3254 | }
3255 | },
3256 | "node_modules/set-cookie-parser": {
3257 | "version": "2.7.1",
3258 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
3259 | "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
3260 | "license": "MIT"
3261 | },
3262 | "node_modules/shebang-command": {
3263 | "version": "2.0.0",
3264 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
3265 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
3266 | "dev": true,
3267 | "license": "MIT",
3268 | "dependencies": {
3269 | "shebang-regex": "^3.0.0"
3270 | },
3271 | "engines": {
3272 | "node": ">=8"
3273 | }
3274 | },
3275 | "node_modules/shebang-regex": {
3276 | "version": "3.0.0",
3277 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
3278 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
3279 | "dev": true,
3280 | "license": "MIT",
3281 | "engines": {
3282 | "node": ">=8"
3283 | }
3284 | },
3285 | "node_modules/source-map": {
3286 | "version": "0.5.7",
3287 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
3288 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
3289 | "license": "BSD-3-Clause",
3290 | "engines": {
3291 | "node": ">=0.10.0"
3292 | }
3293 | },
3294 | "node_modules/source-map-js": {
3295 | "version": "1.2.1",
3296 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
3297 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
3298 | "dev": true,
3299 | "license": "BSD-3-Clause",
3300 | "engines": {
3301 | "node": ">=0.10.0"
3302 | }
3303 | },
3304 | "node_modules/strip-json-comments": {
3305 | "version": "3.1.1",
3306 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
3307 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
3308 | "dev": true,
3309 | "license": "MIT",
3310 | "engines": {
3311 | "node": ">=8"
3312 | },
3313 | "funding": {
3314 | "url": "https://github.com/sponsors/sindresorhus"
3315 | }
3316 | },
3317 | "node_modules/stylis": {
3318 | "version": "4.2.0",
3319 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
3320 | "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
3321 | "license": "MIT"
3322 | },
3323 | "node_modules/supports-color": {
3324 | "version": "7.2.0",
3325 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
3326 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
3327 | "dev": true,
3328 | "license": "MIT",
3329 | "dependencies": {
3330 | "has-flag": "^4.0.0"
3331 | },
3332 | "engines": {
3333 | "node": ">=8"
3334 | }
3335 | },
3336 | "node_modules/supports-preserve-symlinks-flag": {
3337 | "version": "1.0.0",
3338 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
3339 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
3340 | "license": "MIT",
3341 | "engines": {
3342 | "node": ">= 0.4"
3343 | },
3344 | "funding": {
3345 | "url": "https://github.com/sponsors/ljharb"
3346 | }
3347 | },
3348 | "node_modules/tinyglobby": {
3349 | "version": "0.2.14",
3350 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
3351 | "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
3352 | "dev": true,
3353 | "license": "MIT",
3354 | "dependencies": {
3355 | "fdir": "^6.4.4",
3356 | "picomatch": "^4.0.2"
3357 | },
3358 | "engines": {
3359 | "node": ">=12.0.0"
3360 | },
3361 | "funding": {
3362 | "url": "https://github.com/sponsors/SuperchupuDev"
3363 | }
3364 | },
3365 | "node_modules/type-check": {
3366 | "version": "0.4.0",
3367 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
3368 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
3369 | "dev": true,
3370 | "license": "MIT",
3371 | "dependencies": {
3372 | "prelude-ls": "^1.2.1"
3373 | },
3374 | "engines": {
3375 | "node": ">= 0.8.0"
3376 | }
3377 | },
3378 | "node_modules/update-browserslist-db": {
3379 | "version": "1.1.3",
3380 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
3381 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
3382 | "dev": true,
3383 | "funding": [
3384 | {
3385 | "type": "opencollective",
3386 | "url": "https://opencollective.com/browserslist"
3387 | },
3388 | {
3389 | "type": "tidelift",
3390 | "url": "https://tidelift.com/funding/github/npm/browserslist"
3391 | },
3392 | {
3393 | "type": "github",
3394 | "url": "https://github.com/sponsors/ai"
3395 | }
3396 | ],
3397 | "license": "MIT",
3398 | "dependencies": {
3399 | "escalade": "^3.2.0",
3400 | "picocolors": "^1.1.1"
3401 | },
3402 | "bin": {
3403 | "update-browserslist-db": "cli.js"
3404 | },
3405 | "peerDependencies": {
3406 | "browserslist": ">= 4.21.0"
3407 | }
3408 | },
3409 | "node_modules/uri-js": {
3410 | "version": "4.4.1",
3411 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
3412 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
3413 | "dev": true,
3414 | "license": "BSD-2-Clause",
3415 | "dependencies": {
3416 | "punycode": "^2.1.0"
3417 | }
3418 | },
3419 | "node_modules/vite": {
3420 | "version": "7.0.2",
3421 | "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.2.tgz",
3422 | "integrity": "sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==",
3423 | "dev": true,
3424 | "license": "MIT",
3425 | "dependencies": {
3426 | "esbuild": "^0.25.0",
3427 | "fdir": "^6.4.6",
3428 | "picomatch": "^4.0.2",
3429 | "postcss": "^8.5.6",
3430 | "rollup": "^4.40.0",
3431 | "tinyglobby": "^0.2.14"
3432 | },
3433 | "bin": {
3434 | "vite": "bin/vite.js"
3435 | },
3436 | "engines": {
3437 | "node": "^20.19.0 || >=22.12.0"
3438 | },
3439 | "funding": {
3440 | "url": "https://github.com/vitejs/vite?sponsor=1"
3441 | },
3442 | "optionalDependencies": {
3443 | "fsevents": "~2.3.3"
3444 | },
3445 | "peerDependencies": {
3446 | "@types/node": "^20.19.0 || >=22.12.0",
3447 | "jiti": ">=1.21.0",
3448 | "less": "^4.0.0",
3449 | "lightningcss": "^1.21.0",
3450 | "sass": "^1.70.0",
3451 | "sass-embedded": "^1.70.0",
3452 | "stylus": ">=0.54.8",
3453 | "sugarss": "^5.0.0",
3454 | "terser": "^5.16.0",
3455 | "tsx": "^4.8.1",
3456 | "yaml": "^2.4.2"
3457 | },
3458 | "peerDependenciesMeta": {
3459 | "@types/node": {
3460 | "optional": true
3461 | },
3462 | "jiti": {
3463 | "optional": true
3464 | },
3465 | "less": {
3466 | "optional": true
3467 | },
3468 | "lightningcss": {
3469 | "optional": true
3470 | },
3471 | "sass": {
3472 | "optional": true
3473 | },
3474 | "sass-embedded": {
3475 | "optional": true
3476 | },
3477 | "stylus": {
3478 | "optional": true
3479 | },
3480 | "sugarss": {
3481 | "optional": true
3482 | },
3483 | "terser": {
3484 | "optional": true
3485 | },
3486 | "tsx": {
3487 | "optional": true
3488 | },
3489 | "yaml": {
3490 | "optional": true
3491 | }
3492 | }
3493 | },
3494 | "node_modules/which": {
3495 | "version": "2.0.2",
3496 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3497 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3498 | "dev": true,
3499 | "license": "ISC",
3500 | "dependencies": {
3501 | "isexe": "^2.0.0"
3502 | },
3503 | "bin": {
3504 | "node-which": "bin/node-which"
3505 | },
3506 | "engines": {
3507 | "node": ">= 8"
3508 | }
3509 | },
3510 | "node_modules/word-wrap": {
3511 | "version": "1.2.5",
3512 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
3513 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
3514 | "dev": true,
3515 | "license": "MIT",
3516 | "engines": {
3517 | "node": ">=0.10.0"
3518 | }
3519 | },
3520 | "node_modules/yallist": {
3521 | "version": "3.1.1",
3522 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
3523 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
3524 | "dev": true,
3525 | "license": "ISC"
3526 | },
3527 | "node_modules/yaml": {
3528 | "version": "2.8.0",
3529 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
3530 | "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
3531 | "dev": true,
3532 | "license": "ISC",
3533 | "optional": true,
3534 | "peer": true,
3535 | "bin": {
3536 | "yaml": "bin.mjs"
3537 | },
3538 | "engines": {
3539 | "node": ">= 14.6"
3540 | }
3541 | },
3542 | "node_modules/yocto-queue": {
3543 | "version": "0.1.0",
3544 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
3545 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
3546 | "dev": true,
3547 | "license": "MIT",
3548 | "engines": {
3549 | "node": ">=10"
3550 | },
3551 | "funding": {
3552 | "url": "https://github.com/sponsors/sindresorhus"
3553 | }
3554 | }
3555 | }
3556 | }
3557 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend-web-console",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "lint": "eslint .",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@emotion/react": "^11.14.0",
14 | "@emotion/styled": "^11.14.1",
15 | "@fontsource/roboto": "^5.2.6",
16 | "@mui/icons-material": "^7.2.0",
17 | "@mui/material": "^7.2.0",
18 | "react": "^19.1.0",
19 | "react-dom": "^19.1.0",
20 | "react-router-dom": "^7.6.3"
21 | },
22 | "devDependencies": {
23 | "@eslint/js": "^9.29.0",
24 | "@types/react": "^19.1.8",
25 | "@types/react-dom": "^19.1.6",
26 | "@vitejs/plugin-react": "^4.5.2",
27 | "eslint": "^9.29.0",
28 | "eslint-plugin-react-hooks": "^5.2.0",
29 | "eslint-plugin-react-refresh": "^0.4.20",
30 | "globals": "^16.2.0",
31 | "vite": "^7.0.0"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/src/App.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Central-App-Context-Aware-Firewall/Centralized-Application-context-aware-firewall/61c24a7b9c85248b49a729b6e295a5341ec5033c/Frontend_Web_Console/src/App.css
--------------------------------------------------------------------------------
/Frontend_Web_Console/src/App.jsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useMemo } from 'react';
2 | import { Routes, Route } from 'react-router-dom';
3 | import { ThemeProvider } from '@mui/material/styles';
4 | import CssBaseline from '@mui/material/CssBaseline';
5 | import { darkTheme, ThemeContext } from './theme';
6 | import { lightTheme } from './lightTheme';
7 | import DashboardLayout from './layouts/DashboardLayout';
8 | import Dashboard from './pages/Dashboard';
9 |
10 | function App() {
11 | const [mode, setMode] = useState('dark'); // Default to dark mode
12 |
13 | const theme = useMemo(() => (mode === 'light' ? lightTheme : darkTheme), [mode]);
14 |
15 | const themeApi = useMemo(() => ({
16 | toggleTheme: () => {
17 | setMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light'));
18 | },
19 | }), []);
20 |
21 | return (
22 |
23 |
24 |
25 |
26 | }>
27 | } />
28 |
29 |
30 |
31 |
32 |
33 | );
34 | }
35 |
36 | export default App;
37 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/src/index.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Central-App-Context-Aware-Firewall/Centralized-Application-context-aware-firewall/61c24a7b9c85248b49a729b6e295a5341ec5033c/Frontend_Web_Console/src/index.css
--------------------------------------------------------------------------------
/Frontend_Web_Console/src/layouts/DashboardLayout.jsx:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import { NavLink, Outlet } from 'react-router-dom';
3 | import { ThemeContext } from '../theme';
4 | import { AppBar, Box, CssBaseline, Drawer, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Toolbar, Typography, useTheme } from '@mui/material';
5 | import Brightness4Icon from '@mui/icons-material/Brightness4';
6 | import Brightness7Icon from '@mui/icons-material/Brightness7';
7 | import DashboardIcon from '@mui/icons-material/Dashboard';
8 | import DevicesIcon from '@mui/icons-material/Devices';
9 | import RuleIcon from '@mui/icons-material/Rule';
10 | import SettingsIcon from '@mui/icons-material/Settings';
11 | import GroupIcon from '@mui/icons-material/Group';
12 | import { Group } from '../../../firewall_API/src/models/group.model';
13 |
14 | const drawerWidth = 240;
15 |
16 | const navItems = [
17 | { text: 'Dashboard', icon: , path: '/' },
18 | {text: 'Groups', icon: , path: '/groups' },
19 | { text: 'Devices', icon: , path: '/devices' },
20 | { text: 'Rules', icon: , path: '/rules' },
21 | { text: 'Settings', icon: , path: '/settings' },
22 | ];
23 |
24 | export default function DashboardLayout() {
25 | const theme = useTheme();
26 | const { toggleTheme } = useContext(ThemeContext);
27 |
28 | return (
29 |
30 |
31 | theme.zIndex.drawer + 1 }}>
32 |
33 |
34 | CACAF
35 |
36 |
37 | {theme.palette.mode === 'dark' ? : }
38 |
39 |
40 |
41 |
49 |
50 |
51 |
52 | {navItems.map((item) => (
53 |
54 |
58 | {item.icon}
59 |
60 |
61 |
62 | ))}
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 | );
72 | }
--------------------------------------------------------------------------------
/Frontend_Web_Console/src/lightTheme.js:
--------------------------------------------------------------------------------
1 | import { createTheme } from '@mui/material/styles';
2 |
3 | export const lightTheme = createTheme({
4 | palette: {
5 | mode: 'light',
6 | primary: {
7 | main: '#007bff',
8 | },
9 | background: {
10 | default: '#f4f6f8',
11 | paper: '#ffffff',
12 | },
13 | text: {
14 | primary: '#172b4d',
15 | secondary: '#6b778c',
16 | },
17 | },
18 | typography: {
19 | fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
20 | h5: {
21 | fontWeight: 700,
22 | },
23 | h6: {
24 | fontWeight: 600,
25 | },
26 | },
27 | components: {
28 | MuiAppBar: {
29 | styleOverrides: {
30 | root: {
31 | backgroundColor: '#ffffff',
32 | color: '#172b4d',
33 | boxShadow: '0 1px 4px rgba(0,0,0,0.1)',
34 | },
35 | },
36 | },
37 | MuiDrawer: {
38 | styleOverrides: {
39 | paper: {
40 | backgroundColor: '#ffffff',
41 | borderRight: '1px solid #e0e0e0',
42 | },
43 | },
44 | },
45 | },
46 | });
--------------------------------------------------------------------------------
/Frontend_Web_Console/src/main.jsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react'
2 | import { createRoot } from 'react-dom/client'
3 | import './index.css'
4 | import App from './App.jsx'
5 | import { BrowserRouter } from 'react-router-dom'
6 |
7 | createRoot(document.getElementById('root')).render(
8 |
9 |
10 |
11 |
12 | ,
13 | )
14 |
--------------------------------------------------------------------------------
/Frontend_Web_Console/src/pages/Dashboard.jsx:
--------------------------------------------------------------------------------
1 | export default function Dashboard() {
2 | return (
3 | <>>
4 | );
5 | }
--------------------------------------------------------------------------------
/Frontend_Web_Console/src/theme.js:
--------------------------------------------------------------------------------
1 | import { createContext } from 'react';
2 | import { createTheme } from '@mui/material/styles';
3 |
4 | // A professional, modern dark theme
5 | export const darkTheme = createTheme({
6 | palette: {
7 | mode: 'dark',
8 | primary: {
9 | main: '#388eff', // A modern, accessible blue
10 | },
11 | secondary: {
12 | main: '#ffc400', // A vibrant accent color for highlights
13 | },
14 | background: {
15 | default: '#0d1117', // GitHub's dark background - professional and deep
16 | paper: '#161b22', // GitHub's dark paper color - for surfaces
17 | },
18 | text: {
19 | primary: '#c9d1d9', // GitHub's primary text color
20 | secondary: '#8b949e', // GitHub's secondary text color
21 | },
22 | divider: '#30363d', // A subtle border color
23 | success: {
24 | main: '#2e7d32',
25 | },
26 | error: {
27 | main: '#d32f2f',
28 | },
29 | },
30 | typography: {
31 | fontFamily: '"Inter", "Roboto", "Helvetica", "Arial", sans-serif',
32 | h4: { fontWeight: 700 },
33 | h5: { fontWeight: 600, letterSpacing: '0.5px' },
34 | h6: { fontWeight: 600, letterSpacing: '0.3px' },
35 | button: {
36 | textTransform: 'none', // For a cleaner, more modern look
37 | fontWeight: 600,
38 | },
39 | },
40 | components: {
41 | // Add a custom scrollbar for a polished look
42 | MuiCssBaseline: {
43 | styleOverrides: {
44 | body: {
45 | '::-webkit-scrollbar': {
46 | width: '8px',
47 | },
48 | '::-webkit-scrollbar-track': {
49 | backgroundColor: '#0d1117',
50 | },
51 | '::-webkit-scrollbar-thumb': {
52 | backgroundColor: '#30363d',
53 | borderRadius: '4px',
54 | },
55 | '::-webkit-scrollbar-thumb:hover': {
56 | backgroundColor: '#484f58',
57 | },
58 | },
59 | },
60 | },
61 | // "Frosted Glass" AppBar for a fancy, modern effect
62 | MuiAppBar: {
63 | styleOverrides: {
64 | root: {
65 | backgroundColor: 'rgba(22, 27, 34, 0.8)', // Semi-transparent
66 | backdropFilter: 'blur(10px)',
67 | boxShadow: 'none',
68 | borderBottom: '1px solid #30363d',
69 | },
70 | },
71 | },
72 | MuiDrawer: {
73 | styleOverrides: {
74 | paper: {
75 | backgroundColor: '#161b22',
76 | borderRight: '1px solid #30363d',
77 | },
78 | },
79 | },
80 | // Enhanced List Item Buttons with smooth transitions
81 | MuiListItemButton: {
82 | styleOverrides: {
83 | root: {
84 | borderRadius: '8px',
85 | margin: '4px 8px',
86 | transition: 'background-color 0.2s ease-in-out',
87 | '&.Mui-selected': {
88 | backgroundColor: 'rgba(56, 142, 255, 0.12)', // Use primary color with opacity
89 | '& .MuiListItemIcon-root': {
90 | color: '#388eff',
91 | },
92 | },
93 | '&:hover': {
94 | backgroundColor: 'rgba(255, 255, 255, 0.08)',
95 | },
96 | },
97 | },
98 | },
99 | // Add a subtle glow to Paper components on hover, without movement
100 | MuiPaper: {
101 | styleOverrides: {
102 | root: {
103 | backgroundImage: 'none', // Ensure no gradients from default themes
104 | transition: 'box-shadow 0.3s ease-in-out', // Removed transform from transition
105 | '&:hover': {
106 | // transform: 'translateY(-2px)', // This line is removed
107 | boxShadow: '0 8px 30px rgba(0, 0, 0, 0.2)',
108 | }
109 | },
110 | },
111 | },
112 | MuiButton: {
113 | styleOverrides: {
114 | root: {
115 | borderRadius: '8px',
116 | }
117 | }
118 | }
119 | },
120 | });
121 |
122 |
123 | export const ThemeContext = createContext({
124 | toggleTheme: () => {},
125 | });
--------------------------------------------------------------------------------
/Frontend_Web_Console/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vite.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | })
8 |
--------------------------------------------------------------------------------
/Linux_firewall_agent/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "Linux_firewall_agent"
3 | version = "0.1.0"
4 | edition = "2024"
5 |
6 | [dependencies]
7 |
--------------------------------------------------------------------------------
/Linux_firewall_agent/src/main.rs:
--------------------------------------------------------------------------------
1 | fn main() {
2 | println!("Linux firewall agent");
3 | }
4 |
--------------------------------------------------------------------------------
/Public/architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Central-App-Context-Aware-Firewall/Centralized-Application-context-aware-firewall/61c24a7b9c85248b49a729b6e295a5341ec5033c/Public/architecture.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Centralized Application Context-Aware Firewall
2 |
3 | ## Stable version will be Available Soon
4 |
5 | #### Here is an High level Over view of Project
6 |
7 | ## System Design
8 |
9 | 
10 |
11 |
12 |
--------------------------------------------------------------------------------
/Windows_Agent/.env:
--------------------------------------------------------------------------------
1 | SERVER_URL='http://IP:5000'
2 |
--------------------------------------------------------------------------------
/Windows_Agent/Firewall_utils.py:
--------------------------------------------------------------------------------
1 | import subprocess
2 | import json
3 | import platform
4 | import psutil
5 | import socket
6 | import wmi
7 | import os
8 | import elevate
9 |
10 |
11 |
12 |
13 | def get_installed_apps():
14 | def run_powershell_command(cmd):
15 | result = subprocess.run(cmd, shell=True, capture_output=True, text=True,timeout=10)
16 | if result.returncode == 0:
17 | try:
18 | return json.loads(result.stdout)
19 | except json.JSONDecodeError:
20 | return []
21 | return []
22 |
23 | traditional_cmd_64 = 'powershell "Get-ItemProperty HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Select-Object DisplayName, InstallLocation | ConvertTo-Json"'
24 | traditional_apps_64 = run_powershell_command(traditional_cmd_64)
25 |
26 | traditional_cmd_32 = 'powershell "Get-ItemProperty HKLM:\\Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Select-Object DisplayName, InstallLocation | ConvertTo-Json"'
27 | traditional_apps_32 = run_powershell_command(traditional_cmd_32)
28 |
29 | store_cmd = 'powershell "Get-AppxPackage | ConvertTo-Json"'
30 | store_apps = run_powershell_command(store_cmd)
31 |
32 | all_apps = traditional_apps_64 + traditional_apps_32 + store_apps
33 |
34 |
35 | return all_apps
36 |
37 | def get_system_info():
38 | def get_ip_address():
39 | for interface, addrs in psutil.net_if_addrs().items():
40 | for addr in addrs:
41 | if addr.family == socket.AF_INET and not addr.address.startswith("127."):
42 | return addr.address
43 | return "127.0.0.1"
44 | def get_cpu_name():
45 | c = wmi.WMI()
46 | for cpu in c.Win32_Processor():
47 | return cpu.Name
48 | system_info = {
49 | "device_name": socket.gethostname(),
50 | "Configuration": {
51 | "CPU": get_cpu_name(),
52 | "RAM": round(psutil.virtual_memory().total / (1024.0 ** 3)), # RAM in GB
53 | },
54 | "ip": get_ip_address(),
55 | "os": platform.system(),
56 | "os_version": platform.version(),
57 | "hostname": socket.gethostname()
58 | }
59 | return system_info
60 |
61 |
62 |
63 | def set_firewall_rule(rulename,direction,action,protocol='any',localport='any',remoteport='any',localip='any',remoteip='any'):
64 | try:
65 | if not rulename:
66 | raise Exception("Rule name is required")
67 | if direction not in ["in", "out", "inout"]:
68 | raise Exception("Invalid direction. Must be 'in' or 'out' or 'inout'")
69 | if action not in ["allow", "block"]:
70 | raise Exception("Invalid action. Must be 'allow' or 'block'")
71 |
72 | if not protocol == 'any':
73 | if direction not in ["in", "out"]:
74 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + 'in', 'action=' + action,'protocol='+protocol,'localport='+localport,'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip], capture_output=True, text=True,timeout=5)
75 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + 'out', 'action=' + action,'protocol='+protocol,'localport='+localport,'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip], capture_output=True, text=True,timeout=5)
76 | else:
77 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + direction, 'action=' + action, 'protocol=' + protocol, 'localport=' + localport, 'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip], capture_output=True, text=True,timeout=5)
78 |
79 | if result.returncode != 0:
80 | raise Exception(f"Command failed with return code {result.returncode}")
81 | elif protocol == 'any':
82 | if direction not in ["in", "out"]:
83 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + 'in', 'action=' + action,'localport='+localport,'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip], capture_output=True, text=True,timeout=5)
84 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + 'out', 'action=' + action,'localport='+localport,'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip], capture_output=True, text=True,timeout=5)
85 | else:
86 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + direction, 'action=' + action, 'localport=' + localport, 'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip], capture_output=True, text=True,timeout=5)
87 |
88 | if result.returncode != 0:
89 | raise Exception(f"Command failed with return code {result.returncode}")
90 | return True
91 |
92 |
93 | except Exception as e:
94 | print(f"An error occurred: {e}")
95 | return False
96 |
97 | def set_firewall_rule_for_app(rulename,app_path,direction,action,protocol,localport='any',remoteport='any',localip='any',remoteip='any'):
98 | print(rulename,app_path,direction,action,protocol,localport,remoteport,localip,remoteip)
99 | try:
100 | if (not rulename):
101 | raise Exception("Rule name is required")
102 | if (not app_path):
103 | raise Exception("Application path is required")
104 | if (direction not in ["in", "out", "inout"]):
105 | raise Exception("Invalid direction. Must be 'in' or 'out' or 'inout'")
106 | if (action not in ["allow", "block"]):
107 | raise Exception("Invalid action. Must be 'allow' or 'block'")
108 | # $executables = Get-ChildItem -Path $path -Filter *.exe
109 | executables = [f for f in os.listdir(app_path) if f.endswith('.exe')]
110 | for executable in executables:
111 | if direction not in ["in", "out"]:
112 | print(app_path+"\\"+executable)
113 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + 'in', 'action=' + action,'protocol='+protocol,'localport='+localport,'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip, 'program=' + app_path + "\\" + executable], capture_output=True, text=True,timeout=5)
114 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + 'out', 'action=' + action,'protocol='+protocol,'localport='+localport,'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip, 'program=' + app_path + "\\" + executable], capture_output=True, text=True,timeout=5)
115 | else:
116 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rulename, 'dir=' + direction, 'action=' + action, 'protocol=' + protocol, 'localport=' + localport, 'remoteport=' + remoteport, 'localip=' + localip, 'remoteip=' + remoteip, 'program=' + app_path + "\\" + executable], capture_output=True, text=True,timeout=5)
117 | if result.returncode != 0:
118 | raise Exception(f"Command failed with return code {result.returncode}")
119 |
120 | return True
121 |
122 | except Exception as e:
123 | print(f"An error occurred: {e}")
124 | return False
125 |
126 | def get_firewall_rules():
127 | try:
128 | result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'show', 'rule', 'name=all'], capture_output=True, text=True,timeout=5)
129 |
130 | if result.returncode != 0:
131 | raise Exception(f"Command failed with return code {result.returncode}")
132 |
133 | output = result.stdout
134 | rules = parse_firewall_rules(output)
135 |
136 | return json.dumps(rules, indent=4)
137 |
138 | except Exception as e:
139 | print(f"An error occurred: {e}")
140 | return None
141 |
142 | def parse_firewall_rules(output):
143 | rules = []
144 | rule = {}
145 | for line in output.splitlines():
146 | if line.startswith("Rule Name:"):
147 | if rule:
148 | rules.append(rule)
149 | rule = {}
150 | rule['name'] = line.split(":", 1)[1].strip()
151 | elif line.startswith("Enabled:"):
152 | rule['enabled'] = line.split(":", 1)[1].strip()
153 | elif line.startswith("Direction:"):
154 | rule['direction'] = line.split(":", 1)[1].strip()
155 | elif line.startswith("Profiles:"):
156 | rule['profiles'] = line.split(":", 1)[1].strip()
157 | elif line.startswith("Grouping:"):
158 | rule['grouping'] = line.split(":", 1)[1].strip()
159 | elif line.startswith("LocalIP:"):
160 | rule['local_ip'] = line.split(":", 1)[1].strip()
161 | elif line.startswith("RemoteIP:"):
162 | rule['remote_ip'] = line.split(":", 1)[1].strip()
163 | elif line.startswith("Protocol:"):
164 | rule['protocol'] = line.split(":", 1)[1].strip()
165 | elif line.startswith("LocalPort:"):
166 | rule['local_port'] = line.split(":", 1)[1].strip()
167 | elif line.startswith("RemotePort:"):
168 | rule['remote_port'] = line.split(":", 1)[1].strip()
169 | elif line.startswith("Action:"):
170 | rule['action'] = line.split(":", 1)[1].strip()
171 | # Add more fields as needed
172 | if rule:
173 | rules.append(rule)
174 | return rules
175 |
176 | # def set_firewall_rule(rule_name, direction, action, protocol, local_port, remote_port, local_ip, remote_ip):
177 | # try:
178 | # if not rule_name:
179 | # raise Exception("Rule name is required")
180 | # if not direction:
181 | # raise Exception("Direction is required")
182 | # if not action:
183 | # raise Exception("Action is required")
184 | # if not protocol:
185 | # protocol = "Any"
186 | # if not local_port:
187 | # raise Exception("Local port is required")
188 | # if not remote_port:
189 | # raise Exception("Remote port is required")
190 | # if not local_ip:
191 | # raise Exception("Local IP is required")
192 | # if not remote_ip:
193 | # raise Exception("Remote IP is required")
194 | # if action not in ["allow", "block"]:
195 | # raise Exception("Invalid action. Must be 'allow' or 'block'")
196 | # if direction not in ["in", "out"]:
197 | # raise Exception("Invalid direction. Must be 'in' or 'out'")
198 |
199 | # result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rule_name, 'dir=' + direction, 'action=' + action, 'protocol=' + protocol, 'localport=' + local_port, 'remoteport=' + remote_port, 'localip=' + local_ip, 'remoteip=' + remote_ip], capture_output=True, text=True)
200 |
201 | # if result.returncode != 0:
202 | # raise Exception(f"Command failed with return code {result.returncode}")
203 |
204 | # return True
205 |
206 | # except Exception as e:
207 | # print(f"An error occurred: {e}")
208 | # return False
209 |
210 | # def set_firewall_rule_port(rule_name, direction, action, protocol, local_port, remote_port):
211 | # try:
212 | # if not rule_name:
213 | # raise Exception("Rule name is required")
214 | # if not direction:
215 | # raise Exception("Direction is required")
216 | # if not action:
217 | # raise Exception("Action is required")
218 | # if not protocol:
219 | # protocol = "Any"
220 | # if not local_port:
221 | # raise Exception("Local port is required")
222 | # if not remote_port:
223 | # raise Exception("Remote port is required")
224 | # if action not in ["allow", "block"]:
225 | # raise Exception("Invalid action. Must be 'allow' or 'block'")
226 | # if direction not in ["in", "out"]:
227 | # raise Exception("Invalid direction. Must be 'in' or 'out'")
228 |
229 | # result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rule_name, 'dir=' + direction, 'action=' + action, 'protocol=' + protocol, 'localport=' + local_port, 'remoteport=' + remote_port], capture_output=True, text=True)
230 |
231 | # if result.returncode != 0:
232 | # raise Exception(f"Command failed with return code {result.returncode}")
233 |
234 | # return True
235 |
236 | # except Exception as e:
237 | # print(f"An error occurred: {e}")
238 | # return False
239 |
240 | # def set_firewall_rule_ip(rule_name, direction, action, protocol, local_ip, remote_ip):
241 | # try:
242 | # if not rule_name:
243 | # raise Exception("Rule name is required")
244 | # if not direction:
245 | # raise Exception("Direction is required")
246 | # if not action:
247 | # raise Exception("Action is required")
248 | # if not protocol:
249 | # protocol = "Any"
250 | # if not local_ip:
251 | # raise Exception("Local IP is required")
252 | # if not remote_ip:
253 | # raise Exception("Remote IP is required")
254 | # if action not in ["allow", "block"]:
255 | # raise Exception("Invalid action. Must be 'allow' or 'block'")
256 | # if direction not in ["in", "out"]:
257 | # raise Exception("Invalid direction. Must be 'in' or 'out'")
258 |
259 | # result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rule_name, 'dir=' + direction, 'action=' + action, 'protocol=' + protocol, 'localip=' + local_ip, 'remoteip=' + remote_ip], capture_output=True, text=True)
260 |
261 | # if result.returncode != 0:
262 | # raise Exception(f"Command failed with return code {result.returncode}")
263 |
264 | # return True
265 |
266 | # except Exception as e:
267 | # print(f"An error occurred: {e}")
268 | # return False
269 |
270 | # def set_firewall_rule_port_app(rule_name, direction, action, protocol, local_port, remote_port, app_path):
271 | # try:
272 | # if not rule_name:
273 | # raise Exception("Rule name is required")
274 | # if not direction:
275 | # raise Exception("Direction is required")
276 | # if not action:
277 | # raise Exception("Action is required")
278 | # if not protocol:
279 | # protocol = "Any"
280 | # if not local_port:
281 | # raise Exception("Local port is required")
282 | # if not remote_port:
283 | # raise Exception("Remote port is required")
284 | # if not app_path:
285 | # raise Exception("Application path is required")
286 | # if action not in ["allow", "block"]:
287 | # raise Exception("Invalid action. Must be 'allow' or 'block'")
288 | # if direction not in ["in", "out"]:
289 | # raise Exception("Invalid direction. Must be 'in' or 'out'")
290 |
291 | # result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rule_name, 'dir=' + direction, 'action=' + action, 'protocol=' + protocol, 'localport=' + local_port, 'remoteport=' + remote_port, 'program=' + app_path], capture_output=True, text=True)
292 |
293 | # if result.returncode != 0:
294 | # raise Exception(f"Command failed with return code {result.returncode}")
295 |
296 | # return True
297 |
298 | # except Exception as e:
299 | # print(f"An error occurred: {e}")
300 | # return False
301 |
302 | # def set_firewall_rule_ip_app(rule_name, direction, action, protocol, local_ip, remote_ip, app_path):
303 | # try:
304 | # if not rule_name:
305 | # raise Exception("Rule name is required")
306 | # if not direction:
307 | # raise Exception("Direction is required")
308 | # if not action:
309 | # raise Exception("Action is required")
310 | # if not protocol:
311 | # protocol = "Any"
312 | # if not local_ip:
313 | # raise Exception("Local IP is required")
314 | # if not remote_ip:
315 | # raise Exception("Remote IP is required")
316 | # if not app_path:
317 | # raise Exception("Application path is required")
318 | # if action not in ["allow", "block"]:
319 | # raise Exception("Invalid action. Must be 'allow' or 'block'")
320 | # if direction not in ["in", "out"]:
321 | # raise Exception("Invalid direction. Must be 'in' or 'out'")
322 |
323 | # result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rule_name, 'dir=' + direction, 'action=' + action, 'protocol=' + protocol, 'localip=' + local_ip, 'remoteip=' + remote_ip, 'program=' + app_path], capture_output=True, text=True)
324 |
325 | # if result.returncode != 0:
326 | # raise Exception(f"Command failed with return code {result.returncode}")
327 |
328 | # return True
329 |
330 | # except Exception as e:
331 | # print(f"An error occurred: {e}")
332 | # return False
333 |
334 | # def set_firewall_rule_app(rule_name, app_path, direction, action, protocol, local_port, remote_port, local_ip, remote_ip):
335 | # try:
336 | # if not rule_name:
337 | # raise Exception("Rule name is required")
338 | # if not app_path:
339 | # raise Exception("Application path is required")
340 | # if not direction:
341 | # raise Exception("Direction is required")
342 | # if not action:
343 | # raise Exception("Action is required")
344 | # if not protocol:
345 | # protocol = "Any"
346 | # if not local_port:
347 | # raise Exception("Local port is required")
348 | # if not remote_port:
349 | # raise Exception("Remote port is required")
350 | # if not local_ip:
351 | # raise Exception("Local IP is required")
352 | # if not remote_ip:
353 | # raise Exception("Remote IP is required")
354 | # if action not in ["allow", "block"]:
355 | # raise Exception("Invalid action. Must be 'allow' or 'block'")
356 | # if direction not in ["in", "out"]:
357 | # raise Exception("Invalid direction. Must be 'in' or 'out'")
358 |
359 | # result = subprocess.run(['netsh', 'advfirewall', 'firewall', 'add', 'rule', 'name=' + rule_name, 'dir=' + direction, 'action=' + action, 'protocol=' + protocol, 'localport=' + local_port, 'remoteport=' + remote_port, 'localip=' + local_ip, 'remoteip=' + remote_ip, 'program=' + app_path], capture_output=True, text=True)
360 |
361 | # if result.returncode != 0:
362 | # raise Exception(f"Command failed with return code {result.returncode}")
363 |
364 | # return True
--------------------------------------------------------------------------------
/Windows_Agent/__pycache__/Firewall_utils.cpython-312.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Central-App-Context-Aware-Firewall/Centralized-Application-context-aware-firewall/61c24a7b9c85248b49a729b6e295a5341ec5033c/Windows_Agent/__pycache__/Firewall_utils.cpython-312.pyc
--------------------------------------------------------------------------------
/Windows_Agent/__pycache__/main.cpython-312.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Central-App-Context-Aware-Firewall/Centralized-Application-context-aware-firewall/61c24a7b9c85248b49a729b6e295a5341ec5033c/Windows_Agent/__pycache__/main.cpython-312.pyc
--------------------------------------------------------------------------------
/Windows_Agent/main.py:
--------------------------------------------------------------------------------
1 | import Firewall_utils
2 | import socketio
3 | import os
4 | import elevate
5 | from dotenv import load_dotenv
6 | load_dotenv()
7 | print("Please wait Connecting to Server...")
8 | elevate.elevate()
9 |
10 | System_info = Firewall_utils.get_system_info()
11 |
12 |
13 | sio = socketio.Client()
14 |
15 | @sio.event
16 | def connect():
17 | print("Connected to Server")
18 | sio.emit('System_info', System_info)
19 | sio.emit('programs_list', Firewall_utils.get_installed_apps())
20 |
21 | @sio.event
22 | def disconnect():
23 | print("Disconnected from Server")
24 |
25 | @sio.event
26 | def error(data):
27 | print("Received error:", data)
28 |
29 | @sio.event
30 | def success(data):
31 | print(data)
32 |
33 |
34 | @sio.event
35 | def set_firewall_rule(data):
36 | rulename = data.get('rulename')
37 | direction = data.get('direction')
38 | action = data.get('action')
39 | protocol = data.get('protocol')
40 | localport = data.get('localport')
41 | remoteport = data.get('remoteport')
42 | localip = data.get('localip')
43 | remoteip = data.get('remoteip')
44 | app_path = data.get('app_path')
45 | print("data")
46 | if app_path == "any":
47 | Firewall_utils.set_firewall_rule(rulename,direction,action,protocol,localport,remoteport,localip,remoteip)
48 | sio.emit('firewall_rule_set', 'Firewall Rule Set Successfully')
49 | else:
50 | Firewall_utils.set_firewall_rule_for_app(rulename,app_path,direction,action,protocol,localport,remoteport,localip,remoteip)
51 | sio.emit('firewall_rule_set', 'Firewall Rule Set Successfully')
52 |
53 | @sio.event
54 | def get_firewall_rules():
55 | sio.emit('firewall_rules', Firewall_utils.get_firewall_rules())
56 |
57 | try:
58 | sio.connect(os.getenv('SERVER_URL'))
59 | sio.wait()
60 | except Exception as e:
61 | print('Failed to connect to server')
62 | print(e)
63 |
--------------------------------------------------------------------------------
/Windows_Agent/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Central-App-Context-Aware-Firewall/Centralized-Application-context-aware-firewall/61c24a7b9c85248b49a729b6e295a5341ec5033c/Windows_Agent/requirements.txt
--------------------------------------------------------------------------------
/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: "3.8"
2 | services:
3 | mongodb:
4 | image: mongo:latest
5 | container_name: mongodb
6 |
7 | volumes:
8 | - mongo-data:/data/db
9 | networks:
10 | - app-network
11 |
12 | firewall-api:
13 | build:
14 | context: ./firewall_API
15 | dockerfile: dockerfile
16 | container_name: firewall-api
17 | ports:
18 | - "5000:5000"
19 | environment:
20 | - DB_URI=mongodb://mongodb:27017
21 | - CORS_ORIGIN=http://localhost:8080
22 | - PORT=5000
23 | depends_on:
24 | - mongodb
25 | networks:
26 | - app-network
27 |
28 | web-console:
29 | build:
30 | context: ./Frontend/Centarlized Firewall Web Console
31 | dockerfile: dockerfile
32 | container_name: web-console
33 | ports:
34 | - "8080:80"
35 | depends_on:
36 | - firewall-api
37 | networks:
38 | - app-network
39 |
40 | networks:
41 | app-network:
42 | driver: bridge
43 |
44 | volumes:
45 | mongo-data:
46 | driver: local
--------------------------------------------------------------------------------
/firewall_API/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/firewall_API/.env.sample:
--------------------------------------------------------------------------------
1 | # DB url is mandatory
2 | PORT=5000
3 | CORS_ORIGIN=*
4 | AGENT_URL=
5 | DB_URI=
6 |
--------------------------------------------------------------------------------
/firewall_API/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .env
3 | README.md
--------------------------------------------------------------------------------
/firewall_API/dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:20-alpine
2 |
3 | WORKDIR /app
4 |
5 | COPY package.json package-lock.json ./
6 | COPY .env ./
7 | COPY src/ ./src/
8 |
9 | RUN npm install
10 |
11 | EXPOSE 5000
12 |
13 | CMD [ "npm", "run", "dev" ]
14 |
--------------------------------------------------------------------------------
/firewall_API/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "scripts": {
3 | "dev": "nodemon -r dotenv/config --experimental-json-modules src/index.js"
4 | },
5 | "type": "module",
6 | "dependencies": {
7 | "axios": "^1.7.7",
8 | "bcrypt": "^5.1.1",
9 | "cookie-parser": "^1.4.6",
10 | "cors": "^2.8.5",
11 | "dotenv": "^16.4.5",
12 | "express": "^4.19.2",
13 | "mongoose": "^8.6.0",
14 | "multer": "^1.4.5-lts.1",
15 | "socket.io": "^4.8.0"
16 | },
17 | "devDependencies": {
18 | "nodemon": "^3.1.4"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/firewall_API/src/DB/index.db.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 | import { DB_NAME } from "../constants.js"
3 |
4 | const DB_connect = async()=>{
5 | try {
6 | const connectioninstance = await mongoose.connect(process.env.DB_URI+'/'+DB_NAME)
7 | console.log('DB Connected Successfully',connectioninstance.connection.host);
8 | }
9 | catch (error) {
10 | console.log("An error occured Connecting to DB",error);
11 | }
12 | }
13 |
14 | export {DB_connect}
15 |
--------------------------------------------------------------------------------
/firewall_API/src/app.js:
--------------------------------------------------------------------------------
1 | import express from 'express'
2 | import cookieParser from 'cookie-parser'
3 | import cors from 'cors'
4 | import WebConsoleRoutes from './routes/webConsole/WebConsole.routes.js'
5 | const app = express()
6 |
7 |
8 | app.use(cors({
9 | origin:process.env.CORS_ORIGIN
10 | }))
11 | app.use(express.json({limit:'160kb'}))
12 | app.use(express.urlencoded({extended:true,limit:'16kb'}))
13 | app.use(express.static('public'))
14 | app.use(cookieParser())
15 |
16 |
17 | app.use('/api/web-console',WebConsoleRoutes)
18 |
19 |
20 | export {app }
--------------------------------------------------------------------------------
/firewall_API/src/constants.js:
--------------------------------------------------------------------------------
1 | const DB_NAME="firewallServer"
2 | export {DB_NAME}
--------------------------------------------------------------------------------
/firewall_API/src/controllers/Agent.controller.js:
--------------------------------------------------------------------------------
1 | import {Device} from "../models/device.model.js";
2 |
3 | const sendProgramList = async (socket,data) => {
4 | try {
5 | const all_apps = data
6 | const device = await Device.findOne({socket_id: socket.id})
7 | device.all_apps = data
8 | await device.save()
9 | return socket.emit('success',"apps sent to server")
10 | } catch (error) {
11 | console.log(error);
12 | }
13 | }
14 |
15 | const sendSystemInfo = async (socket, info) => {
16 | try {
17 | console.log(socket.id);
18 |
19 | const system_info = info;
20 | if (!system_info) {
21 | console.log("No data received");
22 | return socket.emit('error', { message: "No data received" });
23 | }
24 |
25 | const already_exists = await Device.findOne({ device_name: system_info.device_name });
26 | if (already_exists) {
27 | already_exists.socket_id = socket.id;
28 | await already_exists.save();
29 | return socket.emit('error', { message: "Welcome back !!" });
30 | }
31 | const deviceData = await Device.create({
32 | socket_id: socket.id,
33 | device_name: system_info.device_name,
34 | Configuration: {
35 | CPU: system_info.Configuration.CPU,
36 | RAM: system_info.Configuration.RAM,
37 | },
38 | ip: socket.handshake.address,
39 | os: system_info.os,
40 | os_version: system_info.os_version,
41 | hostname: system_info.hostname
42 | });
43 |
44 | return socket.emit('success', deviceData);
45 | } catch (error) {
46 | return socket.emit('error', { message: error.message });
47 | }
48 | };
49 |
50 | // const registerDevice = async (req,res) = {
51 |
52 | // }
53 |
54 |
55 |
56 | export {
57 | sendProgramList,
58 | sendSystemInfo,
59 |
60 | }
61 |
--------------------------------------------------------------------------------
/firewall_API/src/controllers/webconsole.controller.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios'
2 | import {Device} from '../models/device.model.js'
3 | import { io } from '../sockets.js'
4 | const get_programs_list = async (req, res) => {
5 | try {
6 | const { _id } = req.params
7 | if(!_id || _id === 'undefined'){
8 | return res.status(400).json(
9 | {
10 | message: 'id required'
11 | }
12 | )
13 | }
14 | const device_Details = await Device.findById(_id)
15 | if (!device_Details) {
16 | return res.status(400).json({
17 | message: "device not found"
18 | })
19 | }
20 | let programs = device_Details.all_apps
21 | if(!programs){
22 | return res.status(400).json(
23 | {
24 | message: "no programs found for the device "+_id
25 | }
26 | )
27 | }
28 | return res.status(200).json(programs)
29 | } catch (error) {
30 | res.status(500).json({message:"Something went wrong"})
31 | console.log(error)
32 | }
33 | }
34 |
35 | const get_devices_list = async (req, res) => {
36 | const devices = await Device.find()
37 | return res.status(200).json(devices)
38 | }
39 |
40 | const get_device_info = async (req, res) => {
41 | try {
42 | const { _id } = req.params
43 |
44 |
45 | if(!_id || _id === 'undefined'){
46 | return res.status(400).json({message:"ID needed to get device info"})
47 | }
48 | const device = await Device.findById(_id)
49 | if(!device){
50 | return res.status(404).send({message:"Device not found"})
51 | }
52 | return res.status(200).json(device.toJSON())
53 | } catch (error) {
54 | res.status(500).json({message:"Something went wrong"})
55 | console.log(error)
56 | }
57 | }
58 |
59 | const get_firewall_rules = async (req, res) => {
60 | try {
61 | const { _id } = req.params
62 | if(!_id || _id === 'undefined'){
63 | return res.status(400).json({
64 | message: 'id need to get firerules'
65 | })
66 | }
67 | const device = await Device.findById(_id)
68 | if(!device.socket_id){
69 | return res.status(500).send("Invalid device id")
70 | }
71 | const device_socket_id = device.socket_id
72 |
73 | return res.status(200).json(rules.data)
74 | } catch (error) {
75 | return res.status(500).json({message:"Something went wrong"})
76 | console.log(error)
77 | }
78 | }
79 |
80 | const set_firewall_rules = async (req, res) => {
81 |
82 | try {
83 | const { _id } = req.params
84 | if (!_id || _id === 'undefined') {
85 | return res.status(400).json({
86 | message: 'id needed to set firewall rule'
87 | })
88 | }
89 | const { rulename,app_path,direction,localip,remoteip,protocol,localport,remoteport,action } = req.body
90 | const rule = {
91 | rulename,
92 | app_path,
93 | direction,
94 | localip,
95 | remoteip,
96 | protocol,
97 | localport,
98 | remoteport,
99 | action
100 |
101 | }
102 |
103 | if(!rule){
104 | return res.status(400).json({message:"Rules needed"})
105 | }
106 | const device = await Device.findById(_id)
107 | if(!device.socket_id){
108 | return res.status(500).send("Invalid device id")
109 | }
110 | const device_socket_id = device.socket_id
111 | // const response = await axios.post(`http://localhost:8000/agent/set-firewall-rule`,{rules})
112 | try {
113 |
114 | await io.to(device_socket_id).emit('set_firewall_rule',rule)
115 | return res.status(200).send(true)
116 | } catch (error) {
117 | console.log(error);
118 |
119 | }
120 | } catch (error) {
121 | return res.status(500).json({message:"Something went wrong"})
122 | console.log(error)
123 | }
124 | }
125 |
126 | export { get_programs_list, get_devices_list, get_device_info, set_firewall_rules,get_firewall_rules }
--------------------------------------------------------------------------------
/firewall_API/src/index.js:
--------------------------------------------------------------------------------
1 | import { DB_connect } from "./DB/index.db.js"
2 | import { server } from "./sockets.js"
3 | import {} from 'dotenv/config'
4 |
5 | DB_connect().then(()=>{
6 | server.listen(process.env.PORT, () => {
7 | console.log(`Firewall Server listening on port ${process.env.PORT}`)
8 | })
9 | })
10 | .catch(()=>{
11 | console.log("Lisening failed, Something went Wrong");
12 | })
13 |
14 |
--------------------------------------------------------------------------------
/firewall_API/src/models/device.model.js:
--------------------------------------------------------------------------------
1 | import mongoose from 'mongoose';
2 |
3 | const deviceSchema = new mongoose.Schema({
4 | device_name: { type: String, required: true, unique: true },
5 | device_type: { type: String, required: true, enum: ['phone', 'laptop', 'desktop', 'server'] },
6 | device_os: { type: String, required: true },
7 | device_ip: { type: String, required: true, unique: true },
8 | device_location: { type: String, },
9 | device_mac: { type: String, required: true, unique: true },
10 | device_status: {
11 | type: String,
12 | enum: ['online', 'offline'],
13 | default: 'offline'
14 | },
15 |
16 | group: { type: mongoose.Schema.Types.ObjectId, ref: 'Group' },
17 | rules: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Rule' }],
18 | deviceHistory: [{ type: mongoose.Schema.Types.ObjectId, ref: 'DeviceHistory' }],
19 | }, { timestamps: true });
20 |
21 | // Middleware to automatically save device history on updates
22 | deviceSchema.pre('save', async function (next) {
23 | if (this.isModified()) {
24 | const modifiedFields = Object.keys(this._doc).filter(key => this.isModified(key));
25 |
26 | for (const fieldName of modifiedFields) {
27 | const historyEntry = new DeviceHistory({
28 | device: this._id,
29 | field_name: fieldName,
30 | old_value: this.get(fieldName, null, { getters: false }), // Get previous value
31 | new_value: this[fieldName]
32 | });
33 | await historyEntry.save();
34 | }
35 | }
36 | next();
37 | });
38 |
39 | export const Device = mongoose.model('Device', deviceSchema);
40 |
--------------------------------------------------------------------------------
/firewall_API/src/models/deviceHistory.model.js:
--------------------------------------------------------------------------------
1 | import mongoose from 'mongoose';
2 |
3 | const deviceHistorySchema = new mongoose.Schema({
4 | field : { type: String, required: true },
5 | oldValue: { type: mongoose.Schema.Types.Mixed },
6 | newValue: { type: mongoose.Schema.Types.Mixed },
7 |
8 | device: { type: mongoose.Schema.Types.ObjectId, ref: 'Device', required: true },
9 | })
10 |
11 | export const DeviceHistory = mongoose.model('DeviceHistory', deviceHistorySchema);
--------------------------------------------------------------------------------
/firewall_API/src/models/group.model.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 |
3 | const groupSchema = new mongoose.Schema({
4 | group_name: { type: String, required: true, unique: true },
5 | group_status: {
6 | type: String,
7 | enum: ['active', 'inactive'],
8 | default: 'active'
9 | },
10 | devices: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Device' }],
11 | }, { timestamps: true });
12 |
13 | export const Group = mongoose.model('Group', groupSchema);
--------------------------------------------------------------------------------
/firewall_API/src/models/rule.model.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 |
3 | const ruleSchema = new mongoose.Schema({
4 | rule_name: {
5 | type: String,
6 | required: true,
7 | }
8 | });
9 |
10 | export const Rule = mongoose.model('Rule', ruleSchema);
--------------------------------------------------------------------------------
/firewall_API/src/routes/agent/Agent.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import multer from "multer";
3 |
4 | const agentRouter = Router();
5 |
6 | const upload = multer();
7 |
8 |
9 |
10 | export default agentRouter
--------------------------------------------------------------------------------
/firewall_API/src/routes/webConsole/WebConsole.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import { get_programs_list,get_devices_list,get_device_info,get_firewall_rules,set_firewall_rules } from "../../controllers/webconsole.controller.js";
3 | import multer from "multer";
4 |
5 | const upload = multer();
6 |
7 | const webConsoleRouter = Router()
8 |
9 | webConsoleRouter.route('/get-devices-list').get(get_devices_list)
10 | webConsoleRouter.route('/get-device-info/:_id').get(upload.none(),get_device_info)
11 | webConsoleRouter.route('/get-programs-list/:_id').get(upload.none(),get_programs_list)
12 |
13 | webConsoleRouter.route('/get-firewall-rules/:_id').get(upload.none(),get_firewall_rules)
14 |
15 | webConsoleRouter.route('/set-firewall-rules/:_id').post(upload.none(),set_firewall_rules)
16 |
17 | export default webConsoleRouter
--------------------------------------------------------------------------------
/firewall_API/src/sockets.js:
--------------------------------------------------------------------------------
1 | import { createServer } from 'http'
2 | import { Server } from 'socket.io'
3 | import { app } from './app.js'
4 | import {} from 'dotenv/config'
5 | import { sendSystemInfo,sendProgramList } from './controllers/Agent.controller.js'
6 |
7 | const server = createServer(app)
8 | const io = new Server(server,{
9 | cors:{
10 | origin:process.env.CORS_ORIGIN,
11 | methods:['GET','POST']
12 | }
13 | })
14 |
15 |
16 | io.on('connection',(socket)=>{
17 |
18 | socket.on('System_info',(data)=>{
19 | sendSystemInfo(socket,data)
20 | })
21 |
22 | socket.on('disconnect',()=>{
23 | console.log('Socket disconnected')
24 | })
25 |
26 | socket.on('programs_list',(data)=>{
27 | sendProgramList(socket,data)
28 | })
29 |
30 | })
31 |
32 |
33 | export { io, server }
--------------------------------------------------------------------------------
/firewall_API/src/utils/asyncHandler.js:
--------------------------------------------------------------------------------
1 | const asyncHandler = (requestHandler) => {
2 | return (req, res, next) => {
3 | Promise.resolve(requestHandler(req, res, next)).catch((err) => next(err))
4 | }
5 | }
6 |
7 |
8 | export { asyncHandler }
--------------------------------------------------------------------------------