├── .eslintrc.cjs
├── .github
└── workflows
│ └── main.yml
├── .gitignore
├── LICENSE
├── README.md
├── app.png
├── app2.png
├── index.html
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── public
└── enable-threads.js
├── src
├── App.css
├── App.jsx
├── assets
│ ├── m3u8.svg
│ └── react.svg
├── components
│ ├── Header.jsx
│ ├── Image.jsx
│ ├── ImageUpload.jsx
│ ├── MultipleFilesInput.jsx
│ ├── Progress.jsx
│ ├── Sidebar.jsx
│ ├── TextFileInput.jsx
│ ├── TopBar.jsx
│ ├── TopBarMenu.jsx
│ └── VideoUpload.jsx
├── index.css
├── main.jsx
├── pages
│ ├── Chat.jsx
│ ├── Dashboard.jsx
│ ├── Error.jsx
│ ├── M3U8ToMP4.jsx
│ └── WaterMark.jsx
└── util
│ └── M3u8Utils.js
├── support.png
├── tailwind.config.js
└── vite.config.js
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: { browser: true, es2020: true },
3 | extends: [
4 | 'eslint:recommended',
5 | 'plugin:react/recommended',
6 | 'plugin:react/jsx-runtime',
7 | 'plugin:react-hooks/recommended',
8 | ],
9 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
10 | settings: { react: { version: '18.2' } },
11 | plugins: ['react-refresh'],
12 | rules: {
13 | 'react-refresh/only-export-components': 'warn',
14 | },
15 | }
16 |
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | on:
2 | push:
3 | branches:
4 | - main
5 |
6 | jobs:
7 | deploy:
8 | environment:
9 | name: github-pages
10 | url: ${{ steps.deployment.outputs.page_url }}
11 | runs-on: ubuntu-latest
12 | steps:
13 | - name: Checkout
14 | uses: actions/checkout@v3
15 |
16 | - name: Setup pnpm
17 | uses: pnpm/action-setup@v2.2.4
18 | with:
19 | version: 7.15.0
20 | - name: Build
21 | run: |
22 | pnpm install
23 | pnpm build
24 |
25 | - name: Deploy
26 | uses: peaceiris/actions-gh-pages@v3
27 | if: github.ref == 'refs/heads/main'
28 | with:
29 | github_token: ${{ secrets.TOKEN }}
30 | publish_dir: ./dist
31 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 ooooooh灰灰
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # VidConvert
2 | video convert with wasm
3 |
4 | online: https://blog.greycode.top/VidConvert/
5 |
6 | 
7 |
8 | ## supported browser version
9 |
10 | 
--------------------------------------------------------------------------------
/app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/greycodee/VidConvert/69e09277ead82abc3afb479cd1bb52e57880335f/app.png
--------------------------------------------------------------------------------
/app2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/greycodee/VidConvert/69e09277ead82abc3afb479cd1bb52e57880335f/app2.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | m3u8 TO mp4
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "m3u8-download",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "lint": "eslint src --ext js,jsx --report-unused-disable-directives --max-warnings 0",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@ffmpeg/core": "^0.11.0",
14 | "@ffmpeg/ffmpeg": "^0.11.6",
15 | "buffer": "^6.0.3",
16 | "csstype": "^3.0.10",
17 | "prop-types": "^15.8.1",
18 | "react": "^18.2.0",
19 | "react-dom": "^18.2.0",
20 | "react-icons": "^4.10.1",
21 | "react-router-dom": "^6.14.0"
22 | },
23 | "devDependencies": {
24 | "@types/react": "^18.2.14",
25 | "@types/react-dom": "^18.2.6",
26 | "@vitejs/plugin-react-swc": "^3.3.2",
27 | "autoprefixer": "^10.4.14",
28 | "eslint": "^8.43.0",
29 | "eslint-plugin-react": "^7.32.2",
30 | "eslint-plugin-react-hooks": "^4.6.0",
31 | "eslint-plugin-react-refresh": "^0.3.5",
32 | "postcss": "^8.4.24",
33 | "tailwindcss": "^3.3.2",
34 | "vite": "^4.3.9"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: 5.4
2 |
3 | specifiers:
4 | '@ffmpeg/core': ^0.11.0
5 | '@ffmpeg/ffmpeg': ^0.11.6
6 | '@types/react': ^18.2.14
7 | '@types/react-dom': ^18.2.6
8 | '@vitejs/plugin-react-swc': ^3.3.2
9 | autoprefixer: ^10.4.14
10 | buffer: ^6.0.3
11 | csstype: ^3.0.10
12 | eslint: ^8.43.0
13 | eslint-plugin-react: ^7.32.2
14 | eslint-plugin-react-hooks: ^4.6.0
15 | eslint-plugin-react-refresh: ^0.3.5
16 | postcss: ^8.4.24
17 | prop-types: ^15.8.1
18 | react: ^18.2.0
19 | react-dom: ^18.2.0
20 | react-icons: ^4.10.1
21 | react-router-dom: ^6.14.0
22 | tailwindcss: ^3.3.2
23 | vite: ^4.3.9
24 |
25 | dependencies:
26 | '@ffmpeg/core': 0.11.0
27 | '@ffmpeg/ffmpeg': 0.11.6
28 | buffer: 6.0.3
29 | csstype: 3.1.2
30 | prop-types: 15.8.1
31 | react: 18.2.0
32 | react-dom: 18.2.0_react@18.2.0
33 | react-icons: 4.10.1_react@18.2.0
34 | react-router-dom: 6.14.0_biqbaboplfbrettd7655fr4n2y
35 |
36 | devDependencies:
37 | '@types/react': 18.2.14
38 | '@types/react-dom': 18.2.6
39 | '@vitejs/plugin-react-swc': 3.3.2_vite@4.3.9
40 | autoprefixer: 10.4.14_postcss@8.4.24
41 | eslint: 8.43.0
42 | eslint-plugin-react: 7.32.2_eslint@8.43.0
43 | eslint-plugin-react-hooks: 4.6.0_eslint@8.43.0
44 | eslint-plugin-react-refresh: 0.3.5_eslint@8.43.0
45 | postcss: 8.4.24
46 | tailwindcss: 3.3.2
47 | vite: 4.3.9
48 |
49 | packages:
50 |
51 | /@alloc/quick-lru/5.2.0:
52 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
53 | engines: {node: '>=10'}
54 | dev: true
55 |
56 | /@esbuild/android-arm/0.17.19:
57 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
58 | engines: {node: '>=12'}
59 | cpu: [arm]
60 | os: [android]
61 | requiresBuild: true
62 | dev: true
63 | optional: true
64 |
65 | /@esbuild/android-arm64/0.17.19:
66 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
67 | engines: {node: '>=12'}
68 | cpu: [arm64]
69 | os: [android]
70 | requiresBuild: true
71 | dev: true
72 | optional: true
73 |
74 | /@esbuild/android-x64/0.17.19:
75 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
76 | engines: {node: '>=12'}
77 | cpu: [x64]
78 | os: [android]
79 | requiresBuild: true
80 | dev: true
81 | optional: true
82 |
83 | /@esbuild/darwin-arm64/0.17.19:
84 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
85 | engines: {node: '>=12'}
86 | cpu: [arm64]
87 | os: [darwin]
88 | requiresBuild: true
89 | dev: true
90 | optional: true
91 |
92 | /@esbuild/darwin-x64/0.17.19:
93 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
94 | engines: {node: '>=12'}
95 | cpu: [x64]
96 | os: [darwin]
97 | requiresBuild: true
98 | dev: true
99 | optional: true
100 |
101 | /@esbuild/freebsd-arm64/0.17.19:
102 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
103 | engines: {node: '>=12'}
104 | cpu: [arm64]
105 | os: [freebsd]
106 | requiresBuild: true
107 | dev: true
108 | optional: true
109 |
110 | /@esbuild/freebsd-x64/0.17.19:
111 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
112 | engines: {node: '>=12'}
113 | cpu: [x64]
114 | os: [freebsd]
115 | requiresBuild: true
116 | dev: true
117 | optional: true
118 |
119 | /@esbuild/linux-arm/0.17.19:
120 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
121 | engines: {node: '>=12'}
122 | cpu: [arm]
123 | os: [linux]
124 | requiresBuild: true
125 | dev: true
126 | optional: true
127 |
128 | /@esbuild/linux-arm64/0.17.19:
129 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
130 | engines: {node: '>=12'}
131 | cpu: [arm64]
132 | os: [linux]
133 | requiresBuild: true
134 | dev: true
135 | optional: true
136 |
137 | /@esbuild/linux-ia32/0.17.19:
138 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
139 | engines: {node: '>=12'}
140 | cpu: [ia32]
141 | os: [linux]
142 | requiresBuild: true
143 | dev: true
144 | optional: true
145 |
146 | /@esbuild/linux-loong64/0.17.19:
147 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
148 | engines: {node: '>=12'}
149 | cpu: [loong64]
150 | os: [linux]
151 | requiresBuild: true
152 | dev: true
153 | optional: true
154 |
155 | /@esbuild/linux-mips64el/0.17.19:
156 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
157 | engines: {node: '>=12'}
158 | cpu: [mips64el]
159 | os: [linux]
160 | requiresBuild: true
161 | dev: true
162 | optional: true
163 |
164 | /@esbuild/linux-ppc64/0.17.19:
165 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
166 | engines: {node: '>=12'}
167 | cpu: [ppc64]
168 | os: [linux]
169 | requiresBuild: true
170 | dev: true
171 | optional: true
172 |
173 | /@esbuild/linux-riscv64/0.17.19:
174 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
175 | engines: {node: '>=12'}
176 | cpu: [riscv64]
177 | os: [linux]
178 | requiresBuild: true
179 | dev: true
180 | optional: true
181 |
182 | /@esbuild/linux-s390x/0.17.19:
183 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
184 | engines: {node: '>=12'}
185 | cpu: [s390x]
186 | os: [linux]
187 | requiresBuild: true
188 | dev: true
189 | optional: true
190 |
191 | /@esbuild/linux-x64/0.17.19:
192 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
193 | engines: {node: '>=12'}
194 | cpu: [x64]
195 | os: [linux]
196 | requiresBuild: true
197 | dev: true
198 | optional: true
199 |
200 | /@esbuild/netbsd-x64/0.17.19:
201 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
202 | engines: {node: '>=12'}
203 | cpu: [x64]
204 | os: [netbsd]
205 | requiresBuild: true
206 | dev: true
207 | optional: true
208 |
209 | /@esbuild/openbsd-x64/0.17.19:
210 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
211 | engines: {node: '>=12'}
212 | cpu: [x64]
213 | os: [openbsd]
214 | requiresBuild: true
215 | dev: true
216 | optional: true
217 |
218 | /@esbuild/sunos-x64/0.17.19:
219 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
220 | engines: {node: '>=12'}
221 | cpu: [x64]
222 | os: [sunos]
223 | requiresBuild: true
224 | dev: true
225 | optional: true
226 |
227 | /@esbuild/win32-arm64/0.17.19:
228 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
229 | engines: {node: '>=12'}
230 | cpu: [arm64]
231 | os: [win32]
232 | requiresBuild: true
233 | dev: true
234 | optional: true
235 |
236 | /@esbuild/win32-ia32/0.17.19:
237 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
238 | engines: {node: '>=12'}
239 | cpu: [ia32]
240 | os: [win32]
241 | requiresBuild: true
242 | dev: true
243 | optional: true
244 |
245 | /@esbuild/win32-x64/0.17.19:
246 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
247 | engines: {node: '>=12'}
248 | cpu: [x64]
249 | os: [win32]
250 | requiresBuild: true
251 | dev: true
252 | optional: true
253 |
254 | /@eslint-community/eslint-utils/4.4.0_eslint@8.43.0:
255 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
256 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
257 | peerDependencies:
258 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
259 | dependencies:
260 | eslint: 8.43.0
261 | eslint-visitor-keys: 3.4.1
262 | dev: true
263 |
264 | /@eslint-community/regexpp/4.5.1:
265 | resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==}
266 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
267 | dev: true
268 |
269 | /@eslint/eslintrc/2.0.3:
270 | resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==}
271 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
272 | dependencies:
273 | ajv: 6.12.6
274 | debug: 4.3.4
275 | espree: 9.5.2
276 | globals: 13.20.0
277 | ignore: 5.2.4
278 | import-fresh: 3.3.0
279 | js-yaml: 4.1.0
280 | minimatch: 3.1.2
281 | strip-json-comments: 3.1.1
282 | transitivePeerDependencies:
283 | - supports-color
284 | dev: true
285 |
286 | /@eslint/js/8.43.0:
287 | resolution: {integrity: sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==}
288 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
289 | dev: true
290 |
291 | /@ffmpeg/core/0.11.0:
292 | resolution: {integrity: sha512-9Tt/+2PMpkGPXUK8n6He9G8Y+qR6qmCPSCw9iEKZxHHOvJ9BE/r0Fccj+YgDZTlyu6rXxc9x6EqCaFBIt7qzjA==}
293 | dev: false
294 |
295 | /@ffmpeg/ffmpeg/0.11.6:
296 | resolution: {integrity: sha512-uN8J8KDjADEavPhNva6tYO9Fj0lWs9z82swF3YXnTxWMBoFLGq3LZ6FLlIldRKEzhOBKnkVfA8UnFJuvGvNxcA==}
297 | engines: {node: '>=12.16.1'}
298 | dependencies:
299 | is-url: 1.2.4
300 | node-fetch: 2.6.11
301 | regenerator-runtime: 0.13.11
302 | resolve-url: 0.2.1
303 | transitivePeerDependencies:
304 | - encoding
305 | dev: false
306 |
307 | /@humanwhocodes/config-array/0.11.10:
308 | resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==}
309 | engines: {node: '>=10.10.0'}
310 | dependencies:
311 | '@humanwhocodes/object-schema': 1.2.1
312 | debug: 4.3.4
313 | minimatch: 3.1.2
314 | transitivePeerDependencies:
315 | - supports-color
316 | dev: true
317 |
318 | /@humanwhocodes/module-importer/1.0.1:
319 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
320 | engines: {node: '>=12.22'}
321 | dev: true
322 |
323 | /@humanwhocodes/object-schema/1.2.1:
324 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
325 | dev: true
326 |
327 | /@jridgewell/gen-mapping/0.3.3:
328 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
329 | engines: {node: '>=6.0.0'}
330 | dependencies:
331 | '@jridgewell/set-array': 1.1.2
332 | '@jridgewell/sourcemap-codec': 1.4.15
333 | '@jridgewell/trace-mapping': 0.3.18
334 | dev: true
335 |
336 | /@jridgewell/resolve-uri/3.1.0:
337 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
338 | engines: {node: '>=6.0.0'}
339 | dev: true
340 |
341 | /@jridgewell/set-array/1.1.2:
342 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
343 | engines: {node: '>=6.0.0'}
344 | dev: true
345 |
346 | /@jridgewell/sourcemap-codec/1.4.14:
347 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
348 | dev: true
349 |
350 | /@jridgewell/sourcemap-codec/1.4.15:
351 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
352 | dev: true
353 |
354 | /@jridgewell/trace-mapping/0.3.18:
355 | resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
356 | dependencies:
357 | '@jridgewell/resolve-uri': 3.1.0
358 | '@jridgewell/sourcemap-codec': 1.4.14
359 | dev: true
360 |
361 | /@nodelib/fs.scandir/2.1.5:
362 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
363 | engines: {node: '>= 8'}
364 | dependencies:
365 | '@nodelib/fs.stat': 2.0.5
366 | run-parallel: 1.2.0
367 | dev: true
368 |
369 | /@nodelib/fs.stat/2.0.5:
370 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
371 | engines: {node: '>= 8'}
372 | dev: true
373 |
374 | /@nodelib/fs.walk/1.2.8:
375 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
376 | engines: {node: '>= 8'}
377 | dependencies:
378 | '@nodelib/fs.scandir': 2.1.5
379 | fastq: 1.15.0
380 | dev: true
381 |
382 | /@remix-run/router/1.7.0:
383 | resolution: {integrity: sha512-Eu1V3kz3mV0wUpVTiFHuaT8UD1gj/0VnoFHQYX35xlslQUpe8CuYoKFn9d4WZFHm3yDywz6ALZuGdnUPKrNeAw==}
384 | engines: {node: '>=14'}
385 | dev: false
386 |
387 | /@swc/core-darwin-arm64/1.3.66:
388 | resolution: {integrity: sha512-UijJsvuLy73vxeVYEy7urIHksXS+3BdvJ9s9AY+bRMSQW483NO7RLp8g4FdTyJbRaN0BH15SQnY0dcjQBkVuHw==}
389 | engines: {node: '>=10'}
390 | cpu: [arm64]
391 | os: [darwin]
392 | requiresBuild: true
393 | dev: true
394 | optional: true
395 |
396 | /@swc/core-darwin-x64/1.3.66:
397 | resolution: {integrity: sha512-xGsHKvViQnwTNLF30Y/5OqWdnN6RsiyUI8awZXfz1sHcXCEaLe+v+WLQ+/E8sgw0YUkYVHzzfV/sAN2CezJK5Q==}
398 | engines: {node: '>=10'}
399 | cpu: [x64]
400 | os: [darwin]
401 | requiresBuild: true
402 | dev: true
403 | optional: true
404 |
405 | /@swc/core-linux-arm-gnueabihf/1.3.66:
406 | resolution: {integrity: sha512-gNbLcSIV2pq90BkMSpzvK4xPXOl8GEF3YR4NaqF0CYSzQsVXXTTqMuX/r26xNYudBKzH0345S1MpoRk2qricnA==}
407 | engines: {node: '>=10'}
408 | cpu: [arm]
409 | os: [linux]
410 | requiresBuild: true
411 | dev: true
412 | optional: true
413 |
414 | /@swc/core-linux-arm64-gnu/1.3.66:
415 | resolution: {integrity: sha512-cJSQ0oplyWbJqy4rzVcnBYLAi6z1QT3QCcR7iAey0aAmCvfRBZJfXlyjggMjn4iosuadkauwCZR1xYNhBDRn7w==}
416 | engines: {node: '>=10'}
417 | cpu: [arm64]
418 | os: [linux]
419 | requiresBuild: true
420 | dev: true
421 | optional: true
422 |
423 | /@swc/core-linux-arm64-musl/1.3.66:
424 | resolution: {integrity: sha512-GDQZpcB9aGxG9PTA2shdIkoMZlGK5omJ8NR49uoBTtLBVYiGeXAwV0U1Uaw8kXEZj9i7wZDkvjzjSaNH3evRsg==}
425 | engines: {node: '>=10'}
426 | cpu: [arm64]
427 | os: [linux]
428 | requiresBuild: true
429 | dev: true
430 | optional: true
431 |
432 | /@swc/core-linux-x64-gnu/1.3.66:
433 | resolution: {integrity: sha512-lg8E4O/Pd9KfK0lajdinVMuGME8dSv7V9arhEpmlfGE2eXSDCWqDn5Htk5QVBstt9lt1lsRhWHJ/YYc2eQY30Q==}
434 | engines: {node: '>=10'}
435 | cpu: [x64]
436 | os: [linux]
437 | requiresBuild: true
438 | dev: true
439 | optional: true
440 |
441 | /@swc/core-linux-x64-musl/1.3.66:
442 | resolution: {integrity: sha512-lo8ZcAO/zL2pZWH+LZIyge8u2MklaeuT6+FpVVpBFktMVdYXbaVtzpvWbgRFBZHvL3SRDF+u8jxjtkXhvGUpTw==}
443 | engines: {node: '>=10'}
444 | cpu: [x64]
445 | os: [linux]
446 | requiresBuild: true
447 | dev: true
448 | optional: true
449 |
450 | /@swc/core-win32-arm64-msvc/1.3.66:
451 | resolution: {integrity: sha512-cQoVwBuJY5WkHbfpCOlndNwYr1ZThatRjQQvKy540NUIeAEk9Fa6ozlDBtU75UdaWKtUG6YQ/bWz+KTemheVxw==}
452 | engines: {node: '>=10'}
453 | cpu: [arm64]
454 | os: [win32]
455 | requiresBuild: true
456 | dev: true
457 | optional: true
458 |
459 | /@swc/core-win32-ia32-msvc/1.3.66:
460 | resolution: {integrity: sha512-y/FrAIINK4UBeUQQknGlWXEyjo+MBvjF7WkUf2KP7sNr9EHHy8+dXohAGd5Anz0eJrqOM1ZXR/GEjxRp7bGQ1Q==}
461 | engines: {node: '>=10'}
462 | cpu: [ia32]
463 | os: [win32]
464 | requiresBuild: true
465 | dev: true
466 | optional: true
467 |
468 | /@swc/core-win32-x64-msvc/1.3.66:
469 | resolution: {integrity: sha512-yI64ACzS14qFLrfyO12qW+f/UROTotzDeEbuyJAaPD2IZexoT1cICznI3sBmIfrSt33mVuW8eF5m3AG/NUImzw==}
470 | engines: {node: '>=10'}
471 | cpu: [x64]
472 | os: [win32]
473 | requiresBuild: true
474 | dev: true
475 | optional: true
476 |
477 | /@swc/core/1.3.66:
478 | resolution: {integrity: sha512-Hpf91kH5ly7fHkWnApwryTQryT+TO4kMMPH3WyciUSQOWLE3UuQz1PtETHQQk7PZ/b1QF0qQurJrgfBr5bSKUA==}
479 | engines: {node: '>=10'}
480 | requiresBuild: true
481 | peerDependencies:
482 | '@swc/helpers': ^0.5.0
483 | peerDependenciesMeta:
484 | '@swc/helpers':
485 | optional: true
486 | optionalDependencies:
487 | '@swc/core-darwin-arm64': 1.3.66
488 | '@swc/core-darwin-x64': 1.3.66
489 | '@swc/core-linux-arm-gnueabihf': 1.3.66
490 | '@swc/core-linux-arm64-gnu': 1.3.66
491 | '@swc/core-linux-arm64-musl': 1.3.66
492 | '@swc/core-linux-x64-gnu': 1.3.66
493 | '@swc/core-linux-x64-musl': 1.3.66
494 | '@swc/core-win32-arm64-msvc': 1.3.66
495 | '@swc/core-win32-ia32-msvc': 1.3.66
496 | '@swc/core-win32-x64-msvc': 1.3.66
497 | dev: true
498 |
499 | /@types/prop-types/15.7.5:
500 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
501 | dev: true
502 |
503 | /@types/react-dom/18.2.6:
504 | resolution: {integrity: sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==}
505 | dependencies:
506 | '@types/react': 18.2.14
507 | dev: true
508 |
509 | /@types/react/18.2.14:
510 | resolution: {integrity: sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==}
511 | dependencies:
512 | '@types/prop-types': 15.7.5
513 | '@types/scheduler': 0.16.3
514 | csstype: 3.1.2
515 | dev: true
516 |
517 | /@types/scheduler/0.16.3:
518 | resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
519 | dev: true
520 |
521 | /@vitejs/plugin-react-swc/3.3.2_vite@4.3.9:
522 | resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==}
523 | peerDependencies:
524 | vite: ^4
525 | dependencies:
526 | '@swc/core': 1.3.66
527 | vite: 4.3.9
528 | transitivePeerDependencies:
529 | - '@swc/helpers'
530 | dev: true
531 |
532 | /acorn-jsx/5.3.2_acorn@8.9.0:
533 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
534 | peerDependencies:
535 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
536 | dependencies:
537 | acorn: 8.9.0
538 | dev: true
539 |
540 | /acorn/8.9.0:
541 | resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==}
542 | engines: {node: '>=0.4.0'}
543 | hasBin: true
544 | dev: true
545 |
546 | /ajv/6.12.6:
547 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
548 | dependencies:
549 | fast-deep-equal: 3.1.3
550 | fast-json-stable-stringify: 2.1.0
551 | json-schema-traverse: 0.4.1
552 | uri-js: 4.4.1
553 | dev: true
554 |
555 | /ansi-regex/5.0.1:
556 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
557 | engines: {node: '>=8'}
558 | dev: true
559 |
560 | /ansi-styles/4.3.0:
561 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
562 | engines: {node: '>=8'}
563 | dependencies:
564 | color-convert: 2.0.1
565 | dev: true
566 |
567 | /any-promise/1.3.0:
568 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
569 | dev: true
570 |
571 | /anymatch/3.1.3:
572 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
573 | engines: {node: '>= 8'}
574 | dependencies:
575 | normalize-path: 3.0.0
576 | picomatch: 2.3.1
577 | dev: true
578 |
579 | /arg/5.0.2:
580 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
581 | dev: true
582 |
583 | /argparse/2.0.1:
584 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
585 | dev: true
586 |
587 | /array-buffer-byte-length/1.0.0:
588 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
589 | dependencies:
590 | call-bind: 1.0.2
591 | is-array-buffer: 3.0.2
592 | dev: true
593 |
594 | /array-includes/3.1.6:
595 | resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
596 | engines: {node: '>= 0.4'}
597 | dependencies:
598 | call-bind: 1.0.2
599 | define-properties: 1.2.0
600 | es-abstract: 1.21.2
601 | get-intrinsic: 1.2.1
602 | is-string: 1.0.7
603 | dev: true
604 |
605 | /array.prototype.flatmap/1.3.1:
606 | resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
607 | engines: {node: '>= 0.4'}
608 | dependencies:
609 | call-bind: 1.0.2
610 | define-properties: 1.2.0
611 | es-abstract: 1.21.2
612 | es-shim-unscopables: 1.0.0
613 | dev: true
614 |
615 | /array.prototype.tosorted/1.1.1:
616 | resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
617 | dependencies:
618 | call-bind: 1.0.2
619 | define-properties: 1.2.0
620 | es-abstract: 1.21.2
621 | es-shim-unscopables: 1.0.0
622 | get-intrinsic: 1.2.1
623 | dev: true
624 |
625 | /autoprefixer/10.4.14_postcss@8.4.24:
626 | resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
627 | engines: {node: ^10 || ^12 || >=14}
628 | hasBin: true
629 | peerDependencies:
630 | postcss: ^8.1.0
631 | dependencies:
632 | browserslist: 4.21.9
633 | caniuse-lite: 1.0.30001508
634 | fraction.js: 4.2.0
635 | normalize-range: 0.1.2
636 | picocolors: 1.0.0
637 | postcss: 8.4.24
638 | postcss-value-parser: 4.2.0
639 | dev: true
640 |
641 | /available-typed-arrays/1.0.5:
642 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
643 | engines: {node: '>= 0.4'}
644 | dev: true
645 |
646 | /balanced-match/1.0.2:
647 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
648 | dev: true
649 |
650 | /base64-js/1.5.1:
651 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
652 | dev: false
653 |
654 | /binary-extensions/2.2.0:
655 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
656 | engines: {node: '>=8'}
657 | dev: true
658 |
659 | /brace-expansion/1.1.11:
660 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
661 | dependencies:
662 | balanced-match: 1.0.2
663 | concat-map: 0.0.1
664 | dev: true
665 |
666 | /braces/3.0.2:
667 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
668 | engines: {node: '>=8'}
669 | dependencies:
670 | fill-range: 7.0.1
671 | dev: true
672 |
673 | /browserslist/4.21.9:
674 | resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==}
675 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
676 | hasBin: true
677 | dependencies:
678 | caniuse-lite: 1.0.30001508
679 | electron-to-chromium: 1.4.440
680 | node-releases: 2.0.12
681 | update-browserslist-db: 1.0.11_browserslist@4.21.9
682 | dev: true
683 |
684 | /buffer/6.0.3:
685 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
686 | dependencies:
687 | base64-js: 1.5.1
688 | ieee754: 1.2.1
689 | dev: false
690 |
691 | /call-bind/1.0.2:
692 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
693 | dependencies:
694 | function-bind: 1.1.1
695 | get-intrinsic: 1.2.1
696 | dev: true
697 |
698 | /callsites/3.1.0:
699 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
700 | engines: {node: '>=6'}
701 | dev: true
702 |
703 | /camelcase-css/2.0.1:
704 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
705 | engines: {node: '>= 6'}
706 | dev: true
707 |
708 | /caniuse-lite/1.0.30001508:
709 | resolution: {integrity: sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==}
710 | dev: true
711 |
712 | /chalk/4.1.2:
713 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
714 | engines: {node: '>=10'}
715 | dependencies:
716 | ansi-styles: 4.3.0
717 | supports-color: 7.2.0
718 | dev: true
719 |
720 | /chokidar/3.5.3:
721 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
722 | engines: {node: '>= 8.10.0'}
723 | requiresBuild: true
724 | dependencies:
725 | anymatch: 3.1.3
726 | braces: 3.0.2
727 | glob-parent: 5.1.2
728 | is-binary-path: 2.1.0
729 | is-glob: 4.0.3
730 | normalize-path: 3.0.0
731 | readdirp: 3.6.0
732 | optionalDependencies:
733 | fsevents: 2.3.2
734 | dev: true
735 |
736 | /color-convert/2.0.1:
737 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
738 | engines: {node: '>=7.0.0'}
739 | dependencies:
740 | color-name: 1.1.4
741 | dev: true
742 |
743 | /color-name/1.1.4:
744 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
745 | dev: true
746 |
747 | /commander/4.1.1:
748 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
749 | engines: {node: '>= 6'}
750 | dev: true
751 |
752 | /concat-map/0.0.1:
753 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
754 | dev: true
755 |
756 | /cross-spawn/7.0.3:
757 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
758 | engines: {node: '>= 8'}
759 | dependencies:
760 | path-key: 3.1.1
761 | shebang-command: 2.0.0
762 | which: 2.0.2
763 | dev: true
764 |
765 | /cssesc/3.0.0:
766 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
767 | engines: {node: '>=4'}
768 | hasBin: true
769 | dev: true
770 |
771 | /csstype/3.1.2:
772 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
773 |
774 | /debug/4.3.4:
775 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
776 | engines: {node: '>=6.0'}
777 | peerDependencies:
778 | supports-color: '*'
779 | peerDependenciesMeta:
780 | supports-color:
781 | optional: true
782 | dependencies:
783 | ms: 2.1.2
784 | dev: true
785 |
786 | /deep-is/0.1.4:
787 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
788 | dev: true
789 |
790 | /define-properties/1.2.0:
791 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
792 | engines: {node: '>= 0.4'}
793 | dependencies:
794 | has-property-descriptors: 1.0.0
795 | object-keys: 1.1.1
796 | dev: true
797 |
798 | /didyoumean/1.2.2:
799 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
800 | dev: true
801 |
802 | /dlv/1.1.3:
803 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
804 | dev: true
805 |
806 | /doctrine/2.1.0:
807 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
808 | engines: {node: '>=0.10.0'}
809 | dependencies:
810 | esutils: 2.0.3
811 | dev: true
812 |
813 | /doctrine/3.0.0:
814 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
815 | engines: {node: '>=6.0.0'}
816 | dependencies:
817 | esutils: 2.0.3
818 | dev: true
819 |
820 | /electron-to-chromium/1.4.440:
821 | resolution: {integrity: sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==}
822 | dev: true
823 |
824 | /es-abstract/1.21.2:
825 | resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
826 | engines: {node: '>= 0.4'}
827 | dependencies:
828 | array-buffer-byte-length: 1.0.0
829 | available-typed-arrays: 1.0.5
830 | call-bind: 1.0.2
831 | es-set-tostringtag: 2.0.1
832 | es-to-primitive: 1.2.1
833 | function.prototype.name: 1.1.5
834 | get-intrinsic: 1.2.1
835 | get-symbol-description: 1.0.0
836 | globalthis: 1.0.3
837 | gopd: 1.0.1
838 | has: 1.0.3
839 | has-property-descriptors: 1.0.0
840 | has-proto: 1.0.1
841 | has-symbols: 1.0.3
842 | internal-slot: 1.0.5
843 | is-array-buffer: 3.0.2
844 | is-callable: 1.2.7
845 | is-negative-zero: 2.0.2
846 | is-regex: 1.1.4
847 | is-shared-array-buffer: 1.0.2
848 | is-string: 1.0.7
849 | is-typed-array: 1.1.10
850 | is-weakref: 1.0.2
851 | object-inspect: 1.12.3
852 | object-keys: 1.1.1
853 | object.assign: 4.1.4
854 | regexp.prototype.flags: 1.5.0
855 | safe-regex-test: 1.0.0
856 | string.prototype.trim: 1.2.7
857 | string.prototype.trimend: 1.0.6
858 | string.prototype.trimstart: 1.0.6
859 | typed-array-length: 1.0.4
860 | unbox-primitive: 1.0.2
861 | which-typed-array: 1.1.9
862 | dev: true
863 |
864 | /es-set-tostringtag/2.0.1:
865 | resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
866 | engines: {node: '>= 0.4'}
867 | dependencies:
868 | get-intrinsic: 1.2.1
869 | has: 1.0.3
870 | has-tostringtag: 1.0.0
871 | dev: true
872 |
873 | /es-shim-unscopables/1.0.0:
874 | resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
875 | dependencies:
876 | has: 1.0.3
877 | dev: true
878 |
879 | /es-to-primitive/1.2.1:
880 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
881 | engines: {node: '>= 0.4'}
882 | dependencies:
883 | is-callable: 1.2.7
884 | is-date-object: 1.0.5
885 | is-symbol: 1.0.4
886 | dev: true
887 |
888 | /esbuild/0.17.19:
889 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
890 | engines: {node: '>=12'}
891 | hasBin: true
892 | requiresBuild: true
893 | optionalDependencies:
894 | '@esbuild/android-arm': 0.17.19
895 | '@esbuild/android-arm64': 0.17.19
896 | '@esbuild/android-x64': 0.17.19
897 | '@esbuild/darwin-arm64': 0.17.19
898 | '@esbuild/darwin-x64': 0.17.19
899 | '@esbuild/freebsd-arm64': 0.17.19
900 | '@esbuild/freebsd-x64': 0.17.19
901 | '@esbuild/linux-arm': 0.17.19
902 | '@esbuild/linux-arm64': 0.17.19
903 | '@esbuild/linux-ia32': 0.17.19
904 | '@esbuild/linux-loong64': 0.17.19
905 | '@esbuild/linux-mips64el': 0.17.19
906 | '@esbuild/linux-ppc64': 0.17.19
907 | '@esbuild/linux-riscv64': 0.17.19
908 | '@esbuild/linux-s390x': 0.17.19
909 | '@esbuild/linux-x64': 0.17.19
910 | '@esbuild/netbsd-x64': 0.17.19
911 | '@esbuild/openbsd-x64': 0.17.19
912 | '@esbuild/sunos-x64': 0.17.19
913 | '@esbuild/win32-arm64': 0.17.19
914 | '@esbuild/win32-ia32': 0.17.19
915 | '@esbuild/win32-x64': 0.17.19
916 | dev: true
917 |
918 | /escalade/3.1.1:
919 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
920 | engines: {node: '>=6'}
921 | dev: true
922 |
923 | /escape-string-regexp/4.0.0:
924 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
925 | engines: {node: '>=10'}
926 | dev: true
927 |
928 | /eslint-plugin-react-hooks/4.6.0_eslint@8.43.0:
929 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
930 | engines: {node: '>=10'}
931 | peerDependencies:
932 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
933 | dependencies:
934 | eslint: 8.43.0
935 | dev: true
936 |
937 | /eslint-plugin-react-refresh/0.3.5_eslint@8.43.0:
938 | resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==}
939 | peerDependencies:
940 | eslint: '>=7'
941 | dependencies:
942 | eslint: 8.43.0
943 | dev: true
944 |
945 | /eslint-plugin-react/7.32.2_eslint@8.43.0:
946 | resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==}
947 | engines: {node: '>=4'}
948 | peerDependencies:
949 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
950 | dependencies:
951 | array-includes: 3.1.6
952 | array.prototype.flatmap: 1.3.1
953 | array.prototype.tosorted: 1.1.1
954 | doctrine: 2.1.0
955 | eslint: 8.43.0
956 | estraverse: 5.3.0
957 | jsx-ast-utils: 3.3.3
958 | minimatch: 3.1.2
959 | object.entries: 1.1.6
960 | object.fromentries: 2.0.6
961 | object.hasown: 1.1.2
962 | object.values: 1.1.6
963 | prop-types: 15.8.1
964 | resolve: 2.0.0-next.4
965 | semver: 6.3.0
966 | string.prototype.matchall: 4.0.8
967 | dev: true
968 |
969 | /eslint-scope/7.2.0:
970 | resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==}
971 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
972 | dependencies:
973 | esrecurse: 4.3.0
974 | estraverse: 5.3.0
975 | dev: true
976 |
977 | /eslint-visitor-keys/3.4.1:
978 | resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==}
979 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
980 | dev: true
981 |
982 | /eslint/8.43.0:
983 | resolution: {integrity: sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==}
984 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
985 | hasBin: true
986 | dependencies:
987 | '@eslint-community/eslint-utils': 4.4.0_eslint@8.43.0
988 | '@eslint-community/regexpp': 4.5.1
989 | '@eslint/eslintrc': 2.0.3
990 | '@eslint/js': 8.43.0
991 | '@humanwhocodes/config-array': 0.11.10
992 | '@humanwhocodes/module-importer': 1.0.1
993 | '@nodelib/fs.walk': 1.2.8
994 | ajv: 6.12.6
995 | chalk: 4.1.2
996 | cross-spawn: 7.0.3
997 | debug: 4.3.4
998 | doctrine: 3.0.0
999 | escape-string-regexp: 4.0.0
1000 | eslint-scope: 7.2.0
1001 | eslint-visitor-keys: 3.4.1
1002 | espree: 9.5.2
1003 | esquery: 1.5.0
1004 | esutils: 2.0.3
1005 | fast-deep-equal: 3.1.3
1006 | file-entry-cache: 6.0.1
1007 | find-up: 5.0.0
1008 | glob-parent: 6.0.2
1009 | globals: 13.20.0
1010 | graphemer: 1.4.0
1011 | ignore: 5.2.4
1012 | import-fresh: 3.3.0
1013 | imurmurhash: 0.1.4
1014 | is-glob: 4.0.3
1015 | is-path-inside: 3.0.3
1016 | js-yaml: 4.1.0
1017 | json-stable-stringify-without-jsonify: 1.0.1
1018 | levn: 0.4.1
1019 | lodash.merge: 4.6.2
1020 | minimatch: 3.1.2
1021 | natural-compare: 1.4.0
1022 | optionator: 0.9.1
1023 | strip-ansi: 6.0.1
1024 | strip-json-comments: 3.1.1
1025 | text-table: 0.2.0
1026 | transitivePeerDependencies:
1027 | - supports-color
1028 | dev: true
1029 |
1030 | /espree/9.5.2:
1031 | resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==}
1032 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1033 | dependencies:
1034 | acorn: 8.9.0
1035 | acorn-jsx: 5.3.2_acorn@8.9.0
1036 | eslint-visitor-keys: 3.4.1
1037 | dev: true
1038 |
1039 | /esquery/1.5.0:
1040 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
1041 | engines: {node: '>=0.10'}
1042 | dependencies:
1043 | estraverse: 5.3.0
1044 | dev: true
1045 |
1046 | /esrecurse/4.3.0:
1047 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
1048 | engines: {node: '>=4.0'}
1049 | dependencies:
1050 | estraverse: 5.3.0
1051 | dev: true
1052 |
1053 | /estraverse/5.3.0:
1054 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
1055 | engines: {node: '>=4.0'}
1056 | dev: true
1057 |
1058 | /esutils/2.0.3:
1059 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1060 | engines: {node: '>=0.10.0'}
1061 | dev: true
1062 |
1063 | /fast-deep-equal/3.1.3:
1064 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1065 | dev: true
1066 |
1067 | /fast-glob/3.2.12:
1068 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
1069 | engines: {node: '>=8.6.0'}
1070 | dependencies:
1071 | '@nodelib/fs.stat': 2.0.5
1072 | '@nodelib/fs.walk': 1.2.8
1073 | glob-parent: 5.1.2
1074 | merge2: 1.4.1
1075 | micromatch: 4.0.5
1076 | dev: true
1077 |
1078 | /fast-json-stable-stringify/2.1.0:
1079 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
1080 | dev: true
1081 |
1082 | /fast-levenshtein/2.0.6:
1083 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1084 | dev: true
1085 |
1086 | /fastq/1.15.0:
1087 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
1088 | dependencies:
1089 | reusify: 1.0.4
1090 | dev: true
1091 |
1092 | /file-entry-cache/6.0.1:
1093 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
1094 | engines: {node: ^10.12.0 || >=12.0.0}
1095 | dependencies:
1096 | flat-cache: 3.0.4
1097 | dev: true
1098 |
1099 | /fill-range/7.0.1:
1100 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
1101 | engines: {node: '>=8'}
1102 | dependencies:
1103 | to-regex-range: 5.0.1
1104 | dev: true
1105 |
1106 | /find-up/5.0.0:
1107 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
1108 | engines: {node: '>=10'}
1109 | dependencies:
1110 | locate-path: 6.0.0
1111 | path-exists: 4.0.0
1112 | dev: true
1113 |
1114 | /flat-cache/3.0.4:
1115 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
1116 | engines: {node: ^10.12.0 || >=12.0.0}
1117 | dependencies:
1118 | flatted: 3.2.7
1119 | rimraf: 3.0.2
1120 | dev: true
1121 |
1122 | /flatted/3.2.7:
1123 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
1124 | dev: true
1125 |
1126 | /for-each/0.3.3:
1127 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
1128 | dependencies:
1129 | is-callable: 1.2.7
1130 | dev: true
1131 |
1132 | /fraction.js/4.2.0:
1133 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
1134 | dev: true
1135 |
1136 | /fs.realpath/1.0.0:
1137 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
1138 | dev: true
1139 |
1140 | /fsevents/2.3.2:
1141 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
1142 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1143 | os: [darwin]
1144 | requiresBuild: true
1145 | dev: true
1146 | optional: true
1147 |
1148 | /function-bind/1.1.1:
1149 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
1150 | dev: true
1151 |
1152 | /function.prototype.name/1.1.5:
1153 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
1154 | engines: {node: '>= 0.4'}
1155 | dependencies:
1156 | call-bind: 1.0.2
1157 | define-properties: 1.2.0
1158 | es-abstract: 1.21.2
1159 | functions-have-names: 1.2.3
1160 | dev: true
1161 |
1162 | /functions-have-names/1.2.3:
1163 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
1164 | dev: true
1165 |
1166 | /get-intrinsic/1.2.1:
1167 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
1168 | dependencies:
1169 | function-bind: 1.1.1
1170 | has: 1.0.3
1171 | has-proto: 1.0.1
1172 | has-symbols: 1.0.3
1173 | dev: true
1174 |
1175 | /get-symbol-description/1.0.0:
1176 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
1177 | engines: {node: '>= 0.4'}
1178 | dependencies:
1179 | call-bind: 1.0.2
1180 | get-intrinsic: 1.2.1
1181 | dev: true
1182 |
1183 | /glob-parent/5.1.2:
1184 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1185 | engines: {node: '>= 6'}
1186 | dependencies:
1187 | is-glob: 4.0.3
1188 | dev: true
1189 |
1190 | /glob-parent/6.0.2:
1191 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1192 | engines: {node: '>=10.13.0'}
1193 | dependencies:
1194 | is-glob: 4.0.3
1195 | dev: true
1196 |
1197 | /glob/7.1.6:
1198 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
1199 | dependencies:
1200 | fs.realpath: 1.0.0
1201 | inflight: 1.0.6
1202 | inherits: 2.0.4
1203 | minimatch: 3.1.2
1204 | once: 1.4.0
1205 | path-is-absolute: 1.0.1
1206 | dev: true
1207 |
1208 | /glob/7.2.3:
1209 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
1210 | dependencies:
1211 | fs.realpath: 1.0.0
1212 | inflight: 1.0.6
1213 | inherits: 2.0.4
1214 | minimatch: 3.1.2
1215 | once: 1.4.0
1216 | path-is-absolute: 1.0.1
1217 | dev: true
1218 |
1219 | /globals/13.20.0:
1220 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
1221 | engines: {node: '>=8'}
1222 | dependencies:
1223 | type-fest: 0.20.2
1224 | dev: true
1225 |
1226 | /globalthis/1.0.3:
1227 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
1228 | engines: {node: '>= 0.4'}
1229 | dependencies:
1230 | define-properties: 1.2.0
1231 | dev: true
1232 |
1233 | /gopd/1.0.1:
1234 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
1235 | dependencies:
1236 | get-intrinsic: 1.2.1
1237 | dev: true
1238 |
1239 | /graphemer/1.4.0:
1240 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
1241 | dev: true
1242 |
1243 | /has-bigints/1.0.2:
1244 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
1245 | dev: true
1246 |
1247 | /has-flag/4.0.0:
1248 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1249 | engines: {node: '>=8'}
1250 | dev: true
1251 |
1252 | /has-property-descriptors/1.0.0:
1253 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
1254 | dependencies:
1255 | get-intrinsic: 1.2.1
1256 | dev: true
1257 |
1258 | /has-proto/1.0.1:
1259 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
1260 | engines: {node: '>= 0.4'}
1261 | dev: true
1262 |
1263 | /has-symbols/1.0.3:
1264 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
1265 | engines: {node: '>= 0.4'}
1266 | dev: true
1267 |
1268 | /has-tostringtag/1.0.0:
1269 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
1270 | engines: {node: '>= 0.4'}
1271 | dependencies:
1272 | has-symbols: 1.0.3
1273 | dev: true
1274 |
1275 | /has/1.0.3:
1276 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
1277 | engines: {node: '>= 0.4.0'}
1278 | dependencies:
1279 | function-bind: 1.1.1
1280 | dev: true
1281 |
1282 | /ieee754/1.2.1:
1283 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
1284 | dev: false
1285 |
1286 | /ignore/5.2.4:
1287 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
1288 | engines: {node: '>= 4'}
1289 | dev: true
1290 |
1291 | /import-fresh/3.3.0:
1292 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
1293 | engines: {node: '>=6'}
1294 | dependencies:
1295 | parent-module: 1.0.1
1296 | resolve-from: 4.0.0
1297 | dev: true
1298 |
1299 | /imurmurhash/0.1.4:
1300 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1301 | engines: {node: '>=0.8.19'}
1302 | dev: true
1303 |
1304 | /inflight/1.0.6:
1305 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
1306 | dependencies:
1307 | once: 1.4.0
1308 | wrappy: 1.0.2
1309 | dev: true
1310 |
1311 | /inherits/2.0.4:
1312 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1313 | dev: true
1314 |
1315 | /internal-slot/1.0.5:
1316 | resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
1317 | engines: {node: '>= 0.4'}
1318 | dependencies:
1319 | get-intrinsic: 1.2.1
1320 | has: 1.0.3
1321 | side-channel: 1.0.4
1322 | dev: true
1323 |
1324 | /is-array-buffer/3.0.2:
1325 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
1326 | dependencies:
1327 | call-bind: 1.0.2
1328 | get-intrinsic: 1.2.1
1329 | is-typed-array: 1.1.10
1330 | dev: true
1331 |
1332 | /is-bigint/1.0.4:
1333 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
1334 | dependencies:
1335 | has-bigints: 1.0.2
1336 | dev: true
1337 |
1338 | /is-binary-path/2.1.0:
1339 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
1340 | engines: {node: '>=8'}
1341 | dependencies:
1342 | binary-extensions: 2.2.0
1343 | dev: true
1344 |
1345 | /is-boolean-object/1.1.2:
1346 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
1347 | engines: {node: '>= 0.4'}
1348 | dependencies:
1349 | call-bind: 1.0.2
1350 | has-tostringtag: 1.0.0
1351 | dev: true
1352 |
1353 | /is-callable/1.2.7:
1354 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
1355 | engines: {node: '>= 0.4'}
1356 | dev: true
1357 |
1358 | /is-core-module/2.12.1:
1359 | resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
1360 | dependencies:
1361 | has: 1.0.3
1362 | dev: true
1363 |
1364 | /is-date-object/1.0.5:
1365 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
1366 | engines: {node: '>= 0.4'}
1367 | dependencies:
1368 | has-tostringtag: 1.0.0
1369 | dev: true
1370 |
1371 | /is-extglob/2.1.1:
1372 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1373 | engines: {node: '>=0.10.0'}
1374 | dev: true
1375 |
1376 | /is-glob/4.0.3:
1377 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1378 | engines: {node: '>=0.10.0'}
1379 | dependencies:
1380 | is-extglob: 2.1.1
1381 | dev: true
1382 |
1383 | /is-negative-zero/2.0.2:
1384 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
1385 | engines: {node: '>= 0.4'}
1386 | dev: true
1387 |
1388 | /is-number-object/1.0.7:
1389 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
1390 | engines: {node: '>= 0.4'}
1391 | dependencies:
1392 | has-tostringtag: 1.0.0
1393 | dev: true
1394 |
1395 | /is-number/7.0.0:
1396 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1397 | engines: {node: '>=0.12.0'}
1398 | dev: true
1399 |
1400 | /is-path-inside/3.0.3:
1401 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
1402 | engines: {node: '>=8'}
1403 | dev: true
1404 |
1405 | /is-regex/1.1.4:
1406 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
1407 | engines: {node: '>= 0.4'}
1408 | dependencies:
1409 | call-bind: 1.0.2
1410 | has-tostringtag: 1.0.0
1411 | dev: true
1412 |
1413 | /is-shared-array-buffer/1.0.2:
1414 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
1415 | dependencies:
1416 | call-bind: 1.0.2
1417 | dev: true
1418 |
1419 | /is-string/1.0.7:
1420 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
1421 | engines: {node: '>= 0.4'}
1422 | dependencies:
1423 | has-tostringtag: 1.0.0
1424 | dev: true
1425 |
1426 | /is-symbol/1.0.4:
1427 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
1428 | engines: {node: '>= 0.4'}
1429 | dependencies:
1430 | has-symbols: 1.0.3
1431 | dev: true
1432 |
1433 | /is-typed-array/1.1.10:
1434 | resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
1435 | engines: {node: '>= 0.4'}
1436 | dependencies:
1437 | available-typed-arrays: 1.0.5
1438 | call-bind: 1.0.2
1439 | for-each: 0.3.3
1440 | gopd: 1.0.1
1441 | has-tostringtag: 1.0.0
1442 | dev: true
1443 |
1444 | /is-url/1.2.4:
1445 | resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
1446 | dev: false
1447 |
1448 | /is-weakref/1.0.2:
1449 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
1450 | dependencies:
1451 | call-bind: 1.0.2
1452 | dev: true
1453 |
1454 | /isexe/2.0.0:
1455 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1456 | dev: true
1457 |
1458 | /jiti/1.18.2:
1459 | resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==}
1460 | hasBin: true
1461 | dev: true
1462 |
1463 | /js-tokens/4.0.0:
1464 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1465 |
1466 | /js-yaml/4.1.0:
1467 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1468 | hasBin: true
1469 | dependencies:
1470 | argparse: 2.0.1
1471 | dev: true
1472 |
1473 | /json-schema-traverse/0.4.1:
1474 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1475 | dev: true
1476 |
1477 | /json-stable-stringify-without-jsonify/1.0.1:
1478 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1479 | dev: true
1480 |
1481 | /jsx-ast-utils/3.3.3:
1482 | resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
1483 | engines: {node: '>=4.0'}
1484 | dependencies:
1485 | array-includes: 3.1.6
1486 | object.assign: 4.1.4
1487 | dev: true
1488 |
1489 | /levn/0.4.1:
1490 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1491 | engines: {node: '>= 0.8.0'}
1492 | dependencies:
1493 | prelude-ls: 1.2.1
1494 | type-check: 0.4.0
1495 | dev: true
1496 |
1497 | /lilconfig/2.1.0:
1498 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
1499 | engines: {node: '>=10'}
1500 | dev: true
1501 |
1502 | /lines-and-columns/1.2.4:
1503 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1504 | dev: true
1505 |
1506 | /locate-path/6.0.0:
1507 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1508 | engines: {node: '>=10'}
1509 | dependencies:
1510 | p-locate: 5.0.0
1511 | dev: true
1512 |
1513 | /lodash.merge/4.6.2:
1514 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1515 | dev: true
1516 |
1517 | /loose-envify/1.4.0:
1518 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
1519 | hasBin: true
1520 | dependencies:
1521 | js-tokens: 4.0.0
1522 |
1523 | /merge2/1.4.1:
1524 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1525 | engines: {node: '>= 8'}
1526 | dev: true
1527 |
1528 | /micromatch/4.0.5:
1529 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
1530 | engines: {node: '>=8.6'}
1531 | dependencies:
1532 | braces: 3.0.2
1533 | picomatch: 2.3.1
1534 | dev: true
1535 |
1536 | /minimatch/3.1.2:
1537 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1538 | dependencies:
1539 | brace-expansion: 1.1.11
1540 | dev: true
1541 |
1542 | /ms/2.1.2:
1543 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1544 | dev: true
1545 |
1546 | /mz/2.7.0:
1547 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
1548 | dependencies:
1549 | any-promise: 1.3.0
1550 | object-assign: 4.1.1
1551 | thenify-all: 1.6.0
1552 | dev: true
1553 |
1554 | /nanoid/3.3.6:
1555 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
1556 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1557 | hasBin: true
1558 | dev: true
1559 |
1560 | /natural-compare/1.4.0:
1561 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1562 | dev: true
1563 |
1564 | /node-fetch/2.6.11:
1565 | resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==}
1566 | engines: {node: 4.x || >=6.0.0}
1567 | peerDependencies:
1568 | encoding: ^0.1.0
1569 | peerDependenciesMeta:
1570 | encoding:
1571 | optional: true
1572 | dependencies:
1573 | whatwg-url: 5.0.0
1574 | dev: false
1575 |
1576 | /node-releases/2.0.12:
1577 | resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==}
1578 | dev: true
1579 |
1580 | /normalize-path/3.0.0:
1581 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1582 | engines: {node: '>=0.10.0'}
1583 | dev: true
1584 |
1585 | /normalize-range/0.1.2:
1586 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
1587 | engines: {node: '>=0.10.0'}
1588 | dev: true
1589 |
1590 | /object-assign/4.1.1:
1591 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1592 | engines: {node: '>=0.10.0'}
1593 |
1594 | /object-hash/3.0.0:
1595 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1596 | engines: {node: '>= 6'}
1597 | dev: true
1598 |
1599 | /object-inspect/1.12.3:
1600 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
1601 | dev: true
1602 |
1603 | /object-keys/1.1.1:
1604 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
1605 | engines: {node: '>= 0.4'}
1606 | dev: true
1607 |
1608 | /object.assign/4.1.4:
1609 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
1610 | engines: {node: '>= 0.4'}
1611 | dependencies:
1612 | call-bind: 1.0.2
1613 | define-properties: 1.2.0
1614 | has-symbols: 1.0.3
1615 | object-keys: 1.1.1
1616 | dev: true
1617 |
1618 | /object.entries/1.1.6:
1619 | resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
1620 | engines: {node: '>= 0.4'}
1621 | dependencies:
1622 | call-bind: 1.0.2
1623 | define-properties: 1.2.0
1624 | es-abstract: 1.21.2
1625 | dev: true
1626 |
1627 | /object.fromentries/2.0.6:
1628 | resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
1629 | engines: {node: '>= 0.4'}
1630 | dependencies:
1631 | call-bind: 1.0.2
1632 | define-properties: 1.2.0
1633 | es-abstract: 1.21.2
1634 | dev: true
1635 |
1636 | /object.hasown/1.1.2:
1637 | resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==}
1638 | dependencies:
1639 | define-properties: 1.2.0
1640 | es-abstract: 1.21.2
1641 | dev: true
1642 |
1643 | /object.values/1.1.6:
1644 | resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
1645 | engines: {node: '>= 0.4'}
1646 | dependencies:
1647 | call-bind: 1.0.2
1648 | define-properties: 1.2.0
1649 | es-abstract: 1.21.2
1650 | dev: true
1651 |
1652 | /once/1.4.0:
1653 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1654 | dependencies:
1655 | wrappy: 1.0.2
1656 | dev: true
1657 |
1658 | /optionator/0.9.1:
1659 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
1660 | engines: {node: '>= 0.8.0'}
1661 | dependencies:
1662 | deep-is: 0.1.4
1663 | fast-levenshtein: 2.0.6
1664 | levn: 0.4.1
1665 | prelude-ls: 1.2.1
1666 | type-check: 0.4.0
1667 | word-wrap: 1.2.3
1668 | dev: true
1669 |
1670 | /p-limit/3.1.0:
1671 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1672 | engines: {node: '>=10'}
1673 | dependencies:
1674 | yocto-queue: 0.1.0
1675 | dev: true
1676 |
1677 | /p-locate/5.0.0:
1678 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1679 | engines: {node: '>=10'}
1680 | dependencies:
1681 | p-limit: 3.1.0
1682 | dev: true
1683 |
1684 | /parent-module/1.0.1:
1685 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1686 | engines: {node: '>=6'}
1687 | dependencies:
1688 | callsites: 3.1.0
1689 | dev: true
1690 |
1691 | /path-exists/4.0.0:
1692 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1693 | engines: {node: '>=8'}
1694 | dev: true
1695 |
1696 | /path-is-absolute/1.0.1:
1697 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1698 | engines: {node: '>=0.10.0'}
1699 | dev: true
1700 |
1701 | /path-key/3.1.1:
1702 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1703 | engines: {node: '>=8'}
1704 | dev: true
1705 |
1706 | /path-parse/1.0.7:
1707 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1708 | dev: true
1709 |
1710 | /picocolors/1.0.0:
1711 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
1712 | dev: true
1713 |
1714 | /picomatch/2.3.1:
1715 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1716 | engines: {node: '>=8.6'}
1717 | dev: true
1718 |
1719 | /pify/2.3.0:
1720 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1721 | engines: {node: '>=0.10.0'}
1722 | dev: true
1723 |
1724 | /pirates/4.0.6:
1725 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
1726 | engines: {node: '>= 6'}
1727 | dev: true
1728 |
1729 | /postcss-import/15.1.0_postcss@8.4.24:
1730 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
1731 | engines: {node: '>=14.0.0'}
1732 | peerDependencies:
1733 | postcss: ^8.0.0
1734 | dependencies:
1735 | postcss: 8.4.24
1736 | postcss-value-parser: 4.2.0
1737 | read-cache: 1.0.0
1738 | resolve: 1.22.2
1739 | dev: true
1740 |
1741 | /postcss-js/4.0.1_postcss@8.4.24:
1742 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
1743 | engines: {node: ^12 || ^14 || >= 16}
1744 | peerDependencies:
1745 | postcss: ^8.4.21
1746 | dependencies:
1747 | camelcase-css: 2.0.1
1748 | postcss: 8.4.24
1749 | dev: true
1750 |
1751 | /postcss-load-config/4.0.1_postcss@8.4.24:
1752 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
1753 | engines: {node: '>= 14'}
1754 | peerDependencies:
1755 | postcss: '>=8.0.9'
1756 | ts-node: '>=9.0.0'
1757 | peerDependenciesMeta:
1758 | postcss:
1759 | optional: true
1760 | ts-node:
1761 | optional: true
1762 | dependencies:
1763 | lilconfig: 2.1.0
1764 | postcss: 8.4.24
1765 | yaml: 2.3.1
1766 | dev: true
1767 |
1768 | /postcss-nested/6.0.1_postcss@8.4.24:
1769 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
1770 | engines: {node: '>=12.0'}
1771 | peerDependencies:
1772 | postcss: ^8.2.14
1773 | dependencies:
1774 | postcss: 8.4.24
1775 | postcss-selector-parser: 6.0.13
1776 | dev: true
1777 |
1778 | /postcss-selector-parser/6.0.13:
1779 | resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
1780 | engines: {node: '>=4'}
1781 | dependencies:
1782 | cssesc: 3.0.0
1783 | util-deprecate: 1.0.2
1784 | dev: true
1785 |
1786 | /postcss-value-parser/4.2.0:
1787 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1788 | dev: true
1789 |
1790 | /postcss/8.4.24:
1791 | resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
1792 | engines: {node: ^10 || ^12 || >=14}
1793 | dependencies:
1794 | nanoid: 3.3.6
1795 | picocolors: 1.0.0
1796 | source-map-js: 1.0.2
1797 | dev: true
1798 |
1799 | /prelude-ls/1.2.1:
1800 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1801 | engines: {node: '>= 0.8.0'}
1802 | dev: true
1803 |
1804 | /prop-types/15.8.1:
1805 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
1806 | dependencies:
1807 | loose-envify: 1.4.0
1808 | object-assign: 4.1.1
1809 | react-is: 16.13.1
1810 |
1811 | /punycode/2.3.0:
1812 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
1813 | engines: {node: '>=6'}
1814 | dev: true
1815 |
1816 | /queue-microtask/1.2.3:
1817 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1818 | dev: true
1819 |
1820 | /react-dom/18.2.0_react@18.2.0:
1821 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
1822 | peerDependencies:
1823 | react: ^18.2.0
1824 | dependencies:
1825 | loose-envify: 1.4.0
1826 | react: 18.2.0
1827 | scheduler: 0.23.0
1828 | dev: false
1829 |
1830 | /react-icons/4.10.1_react@18.2.0:
1831 | resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==}
1832 | peerDependencies:
1833 | react: '*'
1834 | dependencies:
1835 | react: 18.2.0
1836 | dev: false
1837 |
1838 | /react-is/16.13.1:
1839 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
1840 |
1841 | /react-router-dom/6.14.0_biqbaboplfbrettd7655fr4n2y:
1842 | resolution: {integrity: sha512-YEwlApKwzMMMbGbhh+Q7MsloTldcwMgHxUY/1g0uA62+B1hZo2jsybCWIDCL8zvIDB1FA0pBKY9chHbZHt+2dQ==}
1843 | engines: {node: '>=14'}
1844 | peerDependencies:
1845 | react: '>=16.8'
1846 | react-dom: '>=16.8'
1847 | dependencies:
1848 | '@remix-run/router': 1.7.0
1849 | react: 18.2.0
1850 | react-dom: 18.2.0_react@18.2.0
1851 | react-router: 6.14.0_react@18.2.0
1852 | dev: false
1853 |
1854 | /react-router/6.14.0_react@18.2.0:
1855 | resolution: {integrity: sha512-OD+vkrcGbvlwkspUFDgMzsu1RXwdjNh83YgG/28lBnDzgslhCgxIqoExLlxsfTpIygp7fc+Hd3esloNwzkm2xA==}
1856 | engines: {node: '>=14'}
1857 | peerDependencies:
1858 | react: '>=16.8'
1859 | dependencies:
1860 | '@remix-run/router': 1.7.0
1861 | react: 18.2.0
1862 | dev: false
1863 |
1864 | /react/18.2.0:
1865 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
1866 | engines: {node: '>=0.10.0'}
1867 | dependencies:
1868 | loose-envify: 1.4.0
1869 | dev: false
1870 |
1871 | /read-cache/1.0.0:
1872 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1873 | dependencies:
1874 | pify: 2.3.0
1875 | dev: true
1876 |
1877 | /readdirp/3.6.0:
1878 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1879 | engines: {node: '>=8.10.0'}
1880 | dependencies:
1881 | picomatch: 2.3.1
1882 | dev: true
1883 |
1884 | /regenerator-runtime/0.13.11:
1885 | resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
1886 | dev: false
1887 |
1888 | /regexp.prototype.flags/1.5.0:
1889 | resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==}
1890 | engines: {node: '>= 0.4'}
1891 | dependencies:
1892 | call-bind: 1.0.2
1893 | define-properties: 1.2.0
1894 | functions-have-names: 1.2.3
1895 | dev: true
1896 |
1897 | /resolve-from/4.0.0:
1898 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1899 | engines: {node: '>=4'}
1900 | dev: true
1901 |
1902 | /resolve-url/0.2.1:
1903 | resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
1904 | deprecated: https://github.com/lydell/resolve-url#deprecated
1905 | dev: false
1906 |
1907 | /resolve/1.22.2:
1908 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
1909 | hasBin: true
1910 | dependencies:
1911 | is-core-module: 2.12.1
1912 | path-parse: 1.0.7
1913 | supports-preserve-symlinks-flag: 1.0.0
1914 | dev: true
1915 |
1916 | /resolve/2.0.0-next.4:
1917 | resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
1918 | hasBin: true
1919 | dependencies:
1920 | is-core-module: 2.12.1
1921 | path-parse: 1.0.7
1922 | supports-preserve-symlinks-flag: 1.0.0
1923 | dev: true
1924 |
1925 | /reusify/1.0.4:
1926 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1927 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1928 | dev: true
1929 |
1930 | /rimraf/3.0.2:
1931 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
1932 | hasBin: true
1933 | dependencies:
1934 | glob: 7.2.3
1935 | dev: true
1936 |
1937 | /rollup/3.25.1:
1938 | resolution: {integrity: sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==}
1939 | engines: {node: '>=14.18.0', npm: '>=8.0.0'}
1940 | hasBin: true
1941 | optionalDependencies:
1942 | fsevents: 2.3.2
1943 | dev: true
1944 |
1945 | /run-parallel/1.2.0:
1946 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1947 | dependencies:
1948 | queue-microtask: 1.2.3
1949 | dev: true
1950 |
1951 | /safe-regex-test/1.0.0:
1952 | resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
1953 | dependencies:
1954 | call-bind: 1.0.2
1955 | get-intrinsic: 1.2.1
1956 | is-regex: 1.1.4
1957 | dev: true
1958 |
1959 | /scheduler/0.23.0:
1960 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
1961 | dependencies:
1962 | loose-envify: 1.4.0
1963 | dev: false
1964 |
1965 | /semver/6.3.0:
1966 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
1967 | hasBin: true
1968 | dev: true
1969 |
1970 | /shebang-command/2.0.0:
1971 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1972 | engines: {node: '>=8'}
1973 | dependencies:
1974 | shebang-regex: 3.0.0
1975 | dev: true
1976 |
1977 | /shebang-regex/3.0.0:
1978 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1979 | engines: {node: '>=8'}
1980 | dev: true
1981 |
1982 | /side-channel/1.0.4:
1983 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
1984 | dependencies:
1985 | call-bind: 1.0.2
1986 | get-intrinsic: 1.2.1
1987 | object-inspect: 1.12.3
1988 | dev: true
1989 |
1990 | /source-map-js/1.0.2:
1991 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
1992 | engines: {node: '>=0.10.0'}
1993 | dev: true
1994 |
1995 | /string.prototype.matchall/4.0.8:
1996 | resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
1997 | dependencies:
1998 | call-bind: 1.0.2
1999 | define-properties: 1.2.0
2000 | es-abstract: 1.21.2
2001 | get-intrinsic: 1.2.1
2002 | has-symbols: 1.0.3
2003 | internal-slot: 1.0.5
2004 | regexp.prototype.flags: 1.5.0
2005 | side-channel: 1.0.4
2006 | dev: true
2007 |
2008 | /string.prototype.trim/1.2.7:
2009 | resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
2010 | engines: {node: '>= 0.4'}
2011 | dependencies:
2012 | call-bind: 1.0.2
2013 | define-properties: 1.2.0
2014 | es-abstract: 1.21.2
2015 | dev: true
2016 |
2017 | /string.prototype.trimend/1.0.6:
2018 | resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
2019 | dependencies:
2020 | call-bind: 1.0.2
2021 | define-properties: 1.2.0
2022 | es-abstract: 1.21.2
2023 | dev: true
2024 |
2025 | /string.prototype.trimstart/1.0.6:
2026 | resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
2027 | dependencies:
2028 | call-bind: 1.0.2
2029 | define-properties: 1.2.0
2030 | es-abstract: 1.21.2
2031 | dev: true
2032 |
2033 | /strip-ansi/6.0.1:
2034 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
2035 | engines: {node: '>=8'}
2036 | dependencies:
2037 | ansi-regex: 5.0.1
2038 | dev: true
2039 |
2040 | /strip-json-comments/3.1.1:
2041 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
2042 | engines: {node: '>=8'}
2043 | dev: true
2044 |
2045 | /sucrase/3.32.0:
2046 | resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==}
2047 | engines: {node: '>=8'}
2048 | hasBin: true
2049 | dependencies:
2050 | '@jridgewell/gen-mapping': 0.3.3
2051 | commander: 4.1.1
2052 | glob: 7.1.6
2053 | lines-and-columns: 1.2.4
2054 | mz: 2.7.0
2055 | pirates: 4.0.6
2056 | ts-interface-checker: 0.1.13
2057 | dev: true
2058 |
2059 | /supports-color/7.2.0:
2060 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
2061 | engines: {node: '>=8'}
2062 | dependencies:
2063 | has-flag: 4.0.0
2064 | dev: true
2065 |
2066 | /supports-preserve-symlinks-flag/1.0.0:
2067 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
2068 | engines: {node: '>= 0.4'}
2069 | dev: true
2070 |
2071 | /tailwindcss/3.3.2:
2072 | resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==}
2073 | engines: {node: '>=14.0.0'}
2074 | hasBin: true
2075 | dependencies:
2076 | '@alloc/quick-lru': 5.2.0
2077 | arg: 5.0.2
2078 | chokidar: 3.5.3
2079 | didyoumean: 1.2.2
2080 | dlv: 1.1.3
2081 | fast-glob: 3.2.12
2082 | glob-parent: 6.0.2
2083 | is-glob: 4.0.3
2084 | jiti: 1.18.2
2085 | lilconfig: 2.1.0
2086 | micromatch: 4.0.5
2087 | normalize-path: 3.0.0
2088 | object-hash: 3.0.0
2089 | picocolors: 1.0.0
2090 | postcss: 8.4.24
2091 | postcss-import: 15.1.0_postcss@8.4.24
2092 | postcss-js: 4.0.1_postcss@8.4.24
2093 | postcss-load-config: 4.0.1_postcss@8.4.24
2094 | postcss-nested: 6.0.1_postcss@8.4.24
2095 | postcss-selector-parser: 6.0.13
2096 | postcss-value-parser: 4.2.0
2097 | resolve: 1.22.2
2098 | sucrase: 3.32.0
2099 | transitivePeerDependencies:
2100 | - ts-node
2101 | dev: true
2102 |
2103 | /text-table/0.2.0:
2104 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
2105 | dev: true
2106 |
2107 | /thenify-all/1.6.0:
2108 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
2109 | engines: {node: '>=0.8'}
2110 | dependencies:
2111 | thenify: 3.3.1
2112 | dev: true
2113 |
2114 | /thenify/3.3.1:
2115 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
2116 | dependencies:
2117 | any-promise: 1.3.0
2118 | dev: true
2119 |
2120 | /to-regex-range/5.0.1:
2121 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
2122 | engines: {node: '>=8.0'}
2123 | dependencies:
2124 | is-number: 7.0.0
2125 | dev: true
2126 |
2127 | /tr46/0.0.3:
2128 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
2129 | dev: false
2130 |
2131 | /ts-interface-checker/0.1.13:
2132 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
2133 | dev: true
2134 |
2135 | /type-check/0.4.0:
2136 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
2137 | engines: {node: '>= 0.8.0'}
2138 | dependencies:
2139 | prelude-ls: 1.2.1
2140 | dev: true
2141 |
2142 | /type-fest/0.20.2:
2143 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
2144 | engines: {node: '>=10'}
2145 | dev: true
2146 |
2147 | /typed-array-length/1.0.4:
2148 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
2149 | dependencies:
2150 | call-bind: 1.0.2
2151 | for-each: 0.3.3
2152 | is-typed-array: 1.1.10
2153 | dev: true
2154 |
2155 | /unbox-primitive/1.0.2:
2156 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
2157 | dependencies:
2158 | call-bind: 1.0.2
2159 | has-bigints: 1.0.2
2160 | has-symbols: 1.0.3
2161 | which-boxed-primitive: 1.0.2
2162 | dev: true
2163 |
2164 | /update-browserslist-db/1.0.11_browserslist@4.21.9:
2165 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
2166 | hasBin: true
2167 | peerDependencies:
2168 | browserslist: '>= 4.21.0'
2169 | dependencies:
2170 | browserslist: 4.21.9
2171 | escalade: 3.1.1
2172 | picocolors: 1.0.0
2173 | dev: true
2174 |
2175 | /uri-js/4.4.1:
2176 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
2177 | dependencies:
2178 | punycode: 2.3.0
2179 | dev: true
2180 |
2181 | /util-deprecate/1.0.2:
2182 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
2183 | dev: true
2184 |
2185 | /vite/4.3.9:
2186 | resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==}
2187 | engines: {node: ^14.18.0 || >=16.0.0}
2188 | hasBin: true
2189 | peerDependencies:
2190 | '@types/node': '>= 14'
2191 | less: '*'
2192 | sass: '*'
2193 | stylus: '*'
2194 | sugarss: '*'
2195 | terser: ^5.4.0
2196 | peerDependenciesMeta:
2197 | '@types/node':
2198 | optional: true
2199 | less:
2200 | optional: true
2201 | sass:
2202 | optional: true
2203 | stylus:
2204 | optional: true
2205 | sugarss:
2206 | optional: true
2207 | terser:
2208 | optional: true
2209 | dependencies:
2210 | esbuild: 0.17.19
2211 | postcss: 8.4.24
2212 | rollup: 3.25.1
2213 | optionalDependencies:
2214 | fsevents: 2.3.2
2215 | dev: true
2216 |
2217 | /webidl-conversions/3.0.1:
2218 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
2219 | dev: false
2220 |
2221 | /whatwg-url/5.0.0:
2222 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
2223 | dependencies:
2224 | tr46: 0.0.3
2225 | webidl-conversions: 3.0.1
2226 | dev: false
2227 |
2228 | /which-boxed-primitive/1.0.2:
2229 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
2230 | dependencies:
2231 | is-bigint: 1.0.4
2232 | is-boolean-object: 1.1.2
2233 | is-number-object: 1.0.7
2234 | is-string: 1.0.7
2235 | is-symbol: 1.0.4
2236 | dev: true
2237 |
2238 | /which-typed-array/1.1.9:
2239 | resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
2240 | engines: {node: '>= 0.4'}
2241 | dependencies:
2242 | available-typed-arrays: 1.0.5
2243 | call-bind: 1.0.2
2244 | for-each: 0.3.3
2245 | gopd: 1.0.1
2246 | has-tostringtag: 1.0.0
2247 | is-typed-array: 1.1.10
2248 | dev: true
2249 |
2250 | /which/2.0.2:
2251 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
2252 | engines: {node: '>= 8'}
2253 | hasBin: true
2254 | dependencies:
2255 | isexe: 2.0.0
2256 | dev: true
2257 |
2258 | /word-wrap/1.2.3:
2259 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
2260 | engines: {node: '>=0.10.0'}
2261 | dev: true
2262 |
2263 | /wrappy/1.0.2:
2264 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
2265 | dev: true
2266 |
2267 | /yaml/2.3.1:
2268 | resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
2269 | engines: {node: '>= 14'}
2270 | dev: true
2271 |
2272 | /yocto-queue/0.1.0:
2273 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
2274 | engines: {node: '>=10'}
2275 | dev: true
2276 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/enable-threads.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-inner-declarations */
2 | // NOTE: This file creates a service worker that cross-origin-isolates the page (read more here: https://web.dev/coop-coep/) which allows us to use wasm threads.
3 | // Normally you would set the COOP and COEP headers on the server to do this, but Github Pages doesn't allow this, so this is a hack to do that.
4 |
5 | /* Edited version of: coi-serviceworker v0.1.6 - Guido Zuidhof, licensed under MIT */
6 | // From here: https://github.com/gzuidhof/coi-serviceworker
7 | if(typeof window === 'undefined') {
8 | self.addEventListener("install", () => self.skipWaiting());
9 | self.addEventListener("activate", e => e.waitUntil(self.clients.claim()));
10 |
11 | async function handleFetch(request) {
12 | if(request.cache === "only-if-cached" && request.mode !== "same-origin") {
13 | return;
14 | }
15 |
16 | if(request.mode === "no-cors") { // We need to set `credentials` to "omit" for no-cors requests, per this comment: https://bugs.chromium.org/p/chromium/issues/detail?id=1309901#c7
17 | request = new Request(request.url, {
18 | cache: request.cache,
19 | credentials: "omit",
20 | headers: request.headers,
21 | integrity: request.integrity,
22 | destination: request.destination,
23 | keepalive: request.keepalive,
24 | method: request.method,
25 | mode: request.mode,
26 | redirect: request.redirect,
27 | referrer: request.referrer,
28 | referrerPolicy: request.referrerPolicy,
29 | signal: request.signal,
30 | });
31 | }
32 |
33 | let r = await fetch(request).catch(e => console.error(e));
34 |
35 | if(r.status === 0) {
36 | return r;
37 | }
38 |
39 | const headers = new Headers(r.headers);
40 | headers.set("Cross-Origin-Embedder-Policy", "require-corp"); // or: require-corp
41 | headers.set("Cross-Origin-Opener-Policy", "same-origin");
42 |
43 | return new Response(r.body, { status: r.status, statusText: r.statusText, headers });
44 | }
45 |
46 | self.addEventListener("fetch", function(e) {
47 | e.respondWith(handleFetch(e.request)); // respondWith must be executed synchonously (but can be passed a Promise)
48 | });
49 |
50 | } else {
51 | (async function() {
52 | if(window.crossOriginIsolated !== false) return;
53 |
54 | let registration = await navigator.serviceWorker.register(window.document.currentScript.src).catch(e => console.error("COOP/COEP Service Worker failed to register:", e));
55 | if(registration) {
56 | console.log("COOP/COEP Service Worker registered", registration.scope);
57 |
58 | registration.addEventListener("updatefound", () => {
59 | console.log("Reloading page to make use of updated COOP/COEP Service Worker.");
60 | window.location.reload();
61 | });
62 |
63 | // If the registration is active, but it's not controlling the page
64 | if(registration.active && !navigator.serviceWorker.controller) {
65 | console.log("Reloading page to make use of COOP/COEP Service Worker.");
66 | window.location.reload();
67 | }
68 | }
69 | })();
70 | }
71 |
72 | // Code to deregister:
73 | // let registrations = await navigator.serviceWorker.getRegistrations();
74 | // for(let registration of registrations) {
75 | // await registration.unregister();
76 | // }
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | #root {
2 | max-width: 1280px;
3 | margin: 0 auto;
4 | padding: 2rem;
5 | text-align: left;
6 | }
7 | .title{
8 | font-size: 2rem;
9 | font-weight: bold;
10 | margin-bottom: 1rem;
11 | text-align: center;
12 | }
13 |
14 | .m3u8ConvertBox{
15 | border: 1px solid #ccc;
16 | height: 100%;
17 | width: 70vw;
18 | }
19 |
20 | .m3u8ConvertBox div{
21 | margin: 10px;
22 | }
23 |
24 | .btn{
25 | display: flex;
26 | flex-direction: row;
27 | justify-content: left;
28 |
29 | }
30 |
31 | /**
32 | * + * 选择器用于选择 .btn 容器中的除第一个子元素以外的所有子元素。
33 | */
34 | .btn > * + * {
35 | margin-left: 10px;
36 | }
37 |
--------------------------------------------------------------------------------
/src/App.jsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-undef */
2 |
3 | import { useState, useEffect } from "react";
4 | import { createFFmpeg } from "@ffmpeg/ffmpeg";
5 | import Sidebar from "./components/Sidebar";
6 | import TopBarMenu from "./components/TopBarMenu";
7 | import Header from "./components/Header";
8 | import { Outlet } from "react-router-dom";
9 | import { DiStackoverflow, DiApple } from "react-icons/di";
10 | import {BsFillChatDotsFill} from "react-icons/bs";
11 | import { MdSpaceDashboard } from "react-icons/md";
12 |
13 | const ffmpeg = createFFmpeg({ log: true });
14 |
15 | function App() {
16 | const [ffmpegLoading, setFFmepgLoading] = useState(true);
17 | // let location = useLocation();
18 | // console.log(location);
19 |
20 | useEffect(() => {
21 | if (crossOriginIsolated) {
22 | if (!ffmpeg.isLoaded()) {
23 | ffmpeg.load();
24 | setFFmepgLoading(false);
25 | }
26 | } else {
27 | console.log("not crossOriginIsolated");
28 | }
29 | }, []);
30 |
31 | const itemData = [
32 | {
33 | key: 1,
34 | icon: ,
35 | title: "Dashboard",
36 | content: "dashboard",
37 | link: "dashboard",
38 | },
39 | {
40 | key: 2,
41 | icon: ,
42 | title: "M3U8 to MP4",
43 | content: "content123",
44 | link: "m3u8tomp4",
45 | },
46 | {
47 | key: 3,
48 | icon: ,
49 | title: "Add watermark",
50 | content: "watermark",
51 | link: "watermark",
52 | },
53 | {
54 | key: 4,
55 | icon: ,
56 | title: "Chat",
57 | content: "chat",
58 | link: "chat",
59 | },
60 | ];
61 |
62 | const [isOpen, setIsOpen] = useState(false);
63 |
64 | const toggleSidebar = () => {
65 | setIsOpen(!isOpen);
66 | };
67 | return (
68 |
69 |
77 |
Your browser not support
78 |
79 |
80 |
85 |
86 |
92 |
93 |
94 |
98 |
99 |
100 |
101 |
102 |
103 | );
104 | }
105 |
106 | export default App;
107 |
--------------------------------------------------------------------------------
/src/assets/m3u8.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/Header.jsx:
--------------------------------------------------------------------------------
1 | import { BiMenu } from "react-icons/bi";
2 | import PropTypes from 'prop-types';
3 |
4 | Header.propTypes = {
5 | className: PropTypes.string,
6 | toggleSidebar: PropTypes.func.isRequired,
7 | isOpen: PropTypes.bool.isRequired,
8 | };
9 |
10 | function Header(props) {
11 | const {
12 | className ,
13 | toggleSidebar,
14 | isOpen
15 | } = props;
16 |
17 | return (
18 |
19 |
25 |
26 |
34 |
35 |
36 |
37 |
38 |
39 | );
40 | }
41 |
42 |
43 |
44 | export default Header;
45 |
--------------------------------------------------------------------------------
/src/components/Image.jsx:
--------------------------------------------------------------------------------
1 | import PropTypes from "prop-types";
2 | import { useRef, useState } from "react";
3 | import {GrView} from "react-icons/gr";
4 | Image.propTypes = {
5 | // onChange: PropTypes.func.isRequired,
6 | src: PropTypes.string.isRequired,
7 | fallback: PropTypes.string,
8 | };
9 |
10 | function Image(props) {
11 | const { src="", fallback } = props;
12 | const imgRef = useRef(null);
13 | const [view, setView] = useState(false);
14 |
15 | const handleImageError = () => {
16 | console.log(fallback);
17 | if (fallback === "" || fallback === undefined || fallback === null) {
18 | imgRef.current.src =
19 | "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==";
20 | } else {
21 | imgRef.current.src = fallback;
22 | }
23 | };
24 |
25 | const viewBoxClick = () => {
26 | setView(!view);
27 | }
28 |
29 | return (
30 |
31 |
34 |
35 |
36 | view
37 |
38 |
39 |
40 |
41 |

48 |
49 |

56 |
57 | );
58 | }
59 | export default Image;
60 |
--------------------------------------------------------------------------------
/src/components/ImageUpload.jsx:
--------------------------------------------------------------------------------
1 | import { BsCardImage } from "react-icons/bs";
2 | import { useRef } from "react";
3 | import PropTypes from "prop-types";
4 |
5 | ImageUpload.propTypes = {
6 | onChange: PropTypes.func.isRequired,
7 | file: PropTypes.object,
8 | };
9 |
10 | function ImageUpload(props) {
11 | const { onChange, file } = props;
12 | const inputRef = useRef(null);
13 |
14 | function onClick() {
15 | inputRef.current.click();
16 | }
17 |
18 | return (
19 |
29 |
36 |
41 |
42 |
Click to upload or drag and drop
43 |
44 |
45 |

49 |
50 | );
51 | }
52 | export default ImageUpload;
53 |
--------------------------------------------------------------------------------
/src/components/MultipleFilesInput.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useRef } from "react";
2 | import PropTypes from 'prop-types';
3 |
4 | MultipleFilesInput.propTypes = {
5 | onChange: PropTypes.func.isRequired,
6 | };
7 |
8 | function MultipleFilesInput(props) {
9 | const {onChange} = props;
10 | const [fileCount, setFileCount] = useState(0);
11 | const fileInputRef = useRef(null);
12 | const handleUploadButtonClick = () => {
13 | fileInputRef.current.click();
14 | };
15 |
16 | const handleFileInputChange = (event) => {
17 | const file = event.target.files;
18 | setFileCount(file.length);
19 | console.log(file);
20 | onChange(file);
21 | };
22 |
23 | return (
24 |
25 |
26 |
33 |
36 |
37 |
已选择{fileCount}个文件
38 |
39 | );
40 | }
41 |
42 | export default MultipleFilesInput;
43 |
--------------------------------------------------------------------------------
/src/components/Progress.jsx:
--------------------------------------------------------------------------------
1 | import PropType from "prop-types";
2 |
3 | Progress.propTypes = {
4 | className: PropType.string,
5 | progress: PropType.number.isRequired,
6 | };
7 |
8 | function Progress(props) {
9 | const { progress = 20 } = props;
10 | return (
11 |
17 | );
18 | }
19 |
20 | export default Progress;
21 |
--------------------------------------------------------------------------------
/src/components/Sidebar.jsx:
--------------------------------------------------------------------------------
1 |
2 | import { cloneElement, useEffect, useState } from "react";
3 | import { useNavigate, useLocation } from "react-router-dom";
4 | import PropTypes from 'prop-types';
5 |
6 | Sidebar.propTypes = {
7 | className: PropTypes.string,
8 | isOpen: PropTypes.bool.isRequired,
9 | itemData: PropTypes.arrayOf(PropTypes.shape({
10 | key: PropTypes.number.isRequired,
11 | icon: PropTypes.element.isRequired,
12 | title: PropTypes.string.isRequired,
13 | content: PropTypes.string.isRequired,
14 | link: PropTypes.string.isRequired,
15 | })).isRequired,
16 | };
17 |
18 | function Sidebar(props) {
19 | const {
20 | className,
21 | isOpen,
22 | itemData
23 | } = props;
24 | const iconStyle = {
25 | width: "24px",
26 | height: "24px",
27 | };
28 | const mergedIcon = (itemIcon) => {
29 | return cloneElement(itemIcon, {
30 | style: { ...itemIcon.props.style, ...iconStyle },
31 | });
32 | };
33 |
34 | const [currRootPath, setCurrRootPath] = useState("");
35 | const navigate = useNavigate();
36 |
37 | let location = useLocation();
38 |
39 | useEffect(() => {
40 | setCurrRootPath(location.pathname.split("/")[1]);
41 | }, [location]);
42 |
43 | console.log();
44 |
45 | return (
46 |
52 |
53 | {itemData.map((item) => (
54 | - {
57 | navigate(item.link);
58 | }}
59 | className={`px-2 py-2 mt-1
60 | w-full h-8 rounded-xl flex flex-row cursor-pointer
61 | ${
62 | currRootPath === item.link
63 | ? "bg-white text-slate-800"
64 | : " hover:bg-white hover:text-slate-800"
65 | }
66 | `}
67 | >
68 |
69 | {mergedIcon(item.icon)}
70 |
71 |
72 |
83 | {item.title}
84 |
85 |
86 | ))}
87 |
88 |
89 | );
90 | }
91 |
92 | export default Sidebar;
93 |
--------------------------------------------------------------------------------
/src/components/TextFileInput.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useRef } from "react";
2 | import PropTypes from 'prop-types';
3 |
4 | TextFileInput.propTypes = {
5 | onChange: PropTypes.func.isRequired,
6 | };
7 |
8 | function TextFileInput(props) {
9 | const { onChange } = props;
10 | // const [file, setFile] = useState(null);
11 | const [fileName, setFileName] = useState("");
12 | const [textContent, setTextContent] = useState("");
13 |
14 | const fileInputRef = useRef(null);
15 |
16 | const handleFileInputChange = (event) => {
17 | const file = event.target.files[0];
18 | setFileName(file.name);
19 | // setFile(file);
20 | const reader = new FileReader();
21 | reader.onload = (event) => {
22 | setTextContent(event.target.result);
23 | };
24 | reader.readAsText(file);
25 | onChange(file);
26 | };
27 |
28 | const handleUploadButtonClick = () => {
29 | fileInputRef.current.click();
30 | };
31 |
32 | return (
33 |
34 |
35 |
41 |
44 |
45 |
选择的文件:{fileName}
46 |
47 | {textContent}
48 |
49 |
50 | );
51 | }
52 |
53 | export default TextFileInput;
54 |
--------------------------------------------------------------------------------
/src/components/TopBar.jsx:
--------------------------------------------------------------------------------
1 | import PropTypes from 'prop-types';
2 |
3 | TopBar.propTypes = {
4 | className: PropTypes.string,
5 | isOpen: PropTypes.bool.isRequired,
6 | toggleSidebar: PropTypes.func.isRequired,
7 | };
8 |
9 | function TopBar(props) {
10 | const { className, isOpen, toggleSidebar } = props;
11 | return (
12 |
13 |
14 |
48 |
VidConvert
49 |
50 |
51 | );
52 | }
53 |
54 | export default TopBar;
55 |
--------------------------------------------------------------------------------
/src/components/TopBarMenu.jsx:
--------------------------------------------------------------------------------
1 | import {useState} from "react";
2 | import TopBar from "./TopBar";
3 | import { Link } from "react-router-dom";
4 | import PropTypes from 'prop-types';
5 |
6 | TopBarMenu.propTypes = {
7 | className: PropTypes.string,
8 | menuData: PropTypes.arrayOf(PropTypes.shape({
9 | key: PropTypes.number.isRequired,
10 | title: PropTypes.string.isRequired,
11 | link: PropTypes.string.isRequired,
12 | })).isRequired,
13 | };
14 |
15 | function TopBarMenu(props) {
16 | const { className, menuData } = props;
17 | const [isOpen, setIsOpen] = useState(false);
18 |
19 | const toggleSidebar = () => {
20 | setIsOpen(!isOpen);
21 | };
22 |
23 | return (
24 |
25 |
26 |
30 | {menuData.map((item) => (
31 | -
36 |
37 |
38 | {item.title}
39 |
40 |
41 |
42 | ))}
43 |
44 |
45 | );
46 |
47 | }
48 |
49 | export default TopBarMenu;
--------------------------------------------------------------------------------
/src/components/VideoUpload.jsx:
--------------------------------------------------------------------------------
1 | import { BsCameraVideo } from "react-icons/bs";
2 | import { useRef } from "react";
3 | import PropTypes from "prop-types";
4 |
5 | VideoUpload.propTypes = {
6 | onChange: PropTypes.func.isRequired,
7 | file: PropTypes.object,
8 | };
9 |
10 | function VideoUpload(props) {
11 |
12 | const { onChange, file } = props;
13 | const inputRef = useRef(null);
14 |
15 | function onClick() {
16 | inputRef.current.click();
17 | }
18 |
19 | return (
20 |
30 |
37 |
42 |
43 |
Click to upload or drag and drop
44 |
45 |
46 |
51 |
52 | );
53 | }
54 |
55 | export default VideoUpload;
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | @layer components {
6 | .btn {
7 | @apply bg-blue-500 text-white font-bold rounded-lg w-20 h-10 text-xs text-center;
8 | }
9 | }
--------------------------------------------------------------------------------
/src/main.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom/client";
3 | import App from "./App.jsx";
4 | import M3U8ToMP4 from "./pages/M3U8ToMP4.jsx";
5 | import WaterMark from "./pages/WaterMark.jsx";
6 | import Dashboard from "./pages/Dashboard.jsx";
7 | import Error from "./pages/Error.jsx";
8 | import Chat from "./pages/Chat.jsx";
9 | import "./index.css";
10 | import { BrowserRouter, useRoutes } from "react-router-dom";
11 |
12 |
13 | const routeData = [
14 | {
15 | path: "/",
16 | element: ,
17 | children: [
18 | {
19 | path: "dashboard",
20 | element: ,
21 |
22 | },
23 | {
24 | path: "m3u8tomp4",
25 | element:
26 | }
27 | ,
28 | {
29 | path: "watermark",
30 | element:
31 | },
32 | {
33 | path: "chat",
34 | element:
35 | },
36 | {
37 | path: "*",
38 | element: ,
39 | }
40 |
41 | ]
42 | }
43 |
44 | ]
45 |
46 | const Routes = () =>{
47 | let r = useRoutes(routeData);
48 | return r;
49 | }
50 |
51 |
52 | ReactDOM.createRoot(
53 | document.getElementById("root")).render(
54 |
55 |
56 |
57 |
58 | {/* */}
59 |
60 | );
61 |
--------------------------------------------------------------------------------
/src/pages/Chat.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useRef, useEffect } from "react";
2 | function Chat() {
3 | const ulRef = useRef(null);
4 | const liEndRef = useRef(null);
5 | const [messages, setMessages] = useState([]);
6 |
7 | const addMessage = (position) => {
8 | const newMessage = {
9 | id: messages.length,
10 | name: "name",
11 | message: "messageasdmessageasdmessageasdmessageasdmessageasdmessageasdmessageasd" + messages.length,
12 | position: position,
13 | };
14 | setMessages([...messages, newMessage]);
15 | // ulRef.current.scrollTop = ulRef.current.scrollHeight;
16 | };
17 |
18 | useEffect(() => {
19 | liEndRef.current.scrollIntoView({ behavior: "smooth" });
20 | // ulRef.current.scrollTop = ulRef.current.scrollHeight;
21 | // console.log("ulRef.current.scrollTop:"+ulRef.current.scrollTop);
22 | // console.log("ulRef.current.scrollHeight:"+ulRef.current.scrollHeight);
23 | }, [messages]);
24 |
25 | return (
26 |
27 |
Chat
28 |
31 |
34 |
40 |
41 | {messages.map((message) => (
42 | -
43 |
48 |
49 |
50 |
58 |
59 |
60 |
63 |
70 | {message.message}
71 |
72 |
73 |
74 |
75 |
76 |
77 | ))}
78 |
79 | {/* 保持自动滚动底部关键行 */}
80 |
81 |
82 |
83 |
84 | );
85 | }
86 |
87 | export default Chat;
88 |
--------------------------------------------------------------------------------
/src/pages/Dashboard.jsx:
--------------------------------------------------------------------------------
1 | import { useOutletContext } from "react-router-dom";
2 | import { useState, useEffect } from "react";
3 | import { useRef } from "react";
4 |
5 | import Progress from "../components/Progress";
6 | // import ImageUpload from "../components/ImageUpload";
7 | import VideoUpload from "../components/VideoUpload";
8 |
9 | function Dashboard(){
10 | const [ffmpeg] = useOutletContext();
11 | const [log, setLog] = useState("");
12 | const logRef = useRef(null);
13 |
14 | const [img, setImg] = useState(null);
15 |
16 | const handlerUploadImage = (event) => {
17 | const file = event.target.files[0];
18 | setImg(file);
19 | }
20 |
21 | // const list = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n"];
22 | const onClick = () => {
23 | ffmpeg.run("-version");
24 | }
25 | useEffect(() => {
26 | ffmpeg.setLogger(({ type, message }) => {
27 | setLog((prevLog) => prevLog + `[${type}] ${message}\n`);
28 | logRef.current.scrollTop = logRef.current.scrollHeight;
29 | });
30 | }, []);
31 |
32 | return(
33 |
34 |
Dashboard
35 |
38 | {/*
39 |
40 |
*/}
41 |
42 |
43 |
44 |
45 |
{log}
46 |
47 | );
48 | }
49 | export default Dashboard;
--------------------------------------------------------------------------------
/src/pages/Error.jsx:
--------------------------------------------------------------------------------
1 |
2 | function Error(){
3 | return(
4 |
5 |
404
6 |
7 | );
8 | }
9 |
10 | export default Error;
--------------------------------------------------------------------------------
/src/pages/M3U8ToMP4.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useRef, useEffect } from "react";
2 | import { fetchFile } from "@ffmpeg/ffmpeg";
3 | import { parseM3u8File } from "../util/M3u8Utils";
4 | import { useOutletContext } from "react-router-dom";
5 |
6 | import TextFileInput from "../components/TextFileInput";
7 | import MultipleFilesInput from "../components/MultipleFilesInput";
8 |
9 | function M3U8ToMP4() {
10 | const [ffmpeg] = useOutletContext();
11 | const [m3u8File, setM3u8File] = useState(null);
12 | const [tsFiles, setTsFiles] = useState([]);
13 | const [convertedFile, setConvertedFile] = useState(null);
14 | const [convertBtnDisEnable, setConvertDisBtnEnable] = useState(false);
15 | const [downLoadBtnDisEnable, setDownLoadBtnDisEnable] = useState(true);
16 | const [log, setLog] = useState("");
17 | const logRef = useRef(null);
18 |
19 | useEffect(() => {
20 | ffmpeg.setLogger(({ type, message }) => {
21 | setLog((prevLog) => prevLog + `[${type}] ${message}\n`);
22 | logRef.current.scrollTop = logRef.current.scrollHeight;
23 | });
24 | }, []);
25 |
26 | const handleM3u8FileUpload = async (file) => {
27 | const m3u8Data = await fetchFile(file);
28 | const m3u8String = new TextDecoder("utf-8").decode(m3u8Data); // 将 m3u8Data 转换为字符串类型
29 | const updatedM3u8Data = parseM3u8File(m3u8String);
30 | ffmpeg.FS("writeFile", "input.m3u8", updatedM3u8Data);
31 | };
32 |
33 | const handleTSFileUpload = async (file) => {
34 | for (let i = 0; i < file.length; i++) {
35 | console.log("ts file length:" + file.length);
36 | const fileName = file[i].name;
37 | const tsData = await fetchFile(file[i]);
38 | if (fileName.includes("key")) {
39 | ffmpeg.FS("writeFile", `key`, tsData);
40 | } else {
41 | ffmpeg.FS("writeFile", `input${i}.ts`, tsData);
42 | }
43 | }
44 | };
45 |
46 | const convertFile = async () => {
47 | try {
48 | setLog((prevLog) => prevLog + "[info] read the input files...\n");
49 | setConvertDisBtnEnable(true);
50 |
51 | // Read the input ts files
52 | for (let i = 0; i < tsFiles.length; i++) {
53 | console.log("ts file length:" + tsFiles.length);
54 | const fileName = tsFiles[i].name;
55 | const tsData = await fetchFile(tsFiles[i]);
56 | if (fileName.includes("key")) {
57 | ffmpeg.FS("writeFile", `key`, tsData);
58 | } else {
59 | ffmpeg.FS("writeFile", `input${i}.ts`, tsData);
60 | }
61 | }
62 |
63 | // Run FFmpeg to convert the files
64 | await ffmpeg.run(
65 | "-allowed_extensions",
66 | "ALL",
67 | "-i",
68 | "input.m3u8",
69 | "-c",
70 | "copy",
71 | "output.mp4"
72 | );
73 |
74 | // Read the output file
75 | const outputData = ffmpeg.FS("readFile", "output.mp4");
76 | const outputBlob = new Blob([outputData.buffer], { type: "video/mp4" });
77 |
78 | // Set the converted file for download
79 | setConvertedFile(outputBlob);
80 | setDownLoadBtnDisEnable(false);
81 |
82 | // Cleanup
83 | ffmpeg.FS("unlink", "input.m3u8");
84 | for (let i = 0; i < tsFiles.length; i++) {
85 | ffmpeg.FS("unlink", `input${i}.ts`);
86 | }
87 | ffmpeg.FS("unlink", "output.mp4");
88 | } catch (error) {
89 | setDownLoadBtnDisEnable(true);
90 | }
91 | };
92 |
93 | const handleM3u8FileChange = (event) => {
94 | setM3u8File(event.target.files[0]);
95 | };
96 |
97 | const handleTsFilesChange = (event) => {
98 | setTsFiles(Array.from(event.target.files));
99 | };
100 |
101 | const handleDownload = () => {
102 | const url = URL.createObjectURL(convertedFile);
103 | const a = document.createElement("a");
104 | a.href = url;
105 | a.download = "output.mp4";
106 | a.click();
107 | URL.revokeObjectURL(url);
108 | };
109 |
110 | return (
111 |
112 |
113 |
M3U8 to MP4
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
131 |
138 |
139 |
140 | {log}
141 |
142 |
143 |
144 |
145 |
146 |
147 | );
148 | }
149 |
150 | export default M3U8ToMP4;
151 |
--------------------------------------------------------------------------------
/src/pages/WaterMark.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect, useRef } from "react";
2 | import { fetchFile } from "@ffmpeg/ffmpeg";
3 | import { useOutletContext } from "react-router-dom";
4 | import ImageUpload from "../components/ImageUpload";
5 | import VideoUpload from "../components/VideoUpload";
6 | import Image from "../components/Image";
7 |
8 |
9 | function WaterMark() {
10 | const [ffmpeg] = useOutletContext();
11 | const [videoFile, setVideoFile] = useState(null);
12 | const [videoName, setVideoName] = useState("");
13 | const [watermarkFile, setWatermarkFile] = useState(null);
14 | const [watermarkName, setWatermarkName] = useState("");
15 | const [viderFirstFrame, setVideoFirstFrame] = useState(null);
16 | const [previewImage,setPreviewImage] = useState(null);
17 |
18 |
19 |
20 | const [log, setLog] = useState("");
21 | const logRef = useRef(null);
22 |
23 | useEffect(() => {
24 |
25 | ffmpeg.setLogger(({ type, message }) => {
26 | setLog((prevLog) => prevLog + `[${type}] ${message}\n`);
27 | logRef.current.scrollTop = logRef.current.scrollHeight;
28 | });
29 |
30 | }, []);
31 |
32 | async function videoFileChangeHandler(event) {
33 | console.log(event.target.files[0].name);
34 | setVideoFile(event.target.files[0]);
35 | setVideoName(event.target.files[0].name);
36 | const videoData = await fetchFile(event.target.files[0]);
37 | ffmpeg.FS("writeFile", event.target.files[0].name, videoData);
38 | await ffmpeg.run("-i", event.target.files[0].name,"-vframes","1",event.target.files[0].name+".jpg");
39 | const firstFeameData = ffmpeg.FS("readFile", event.target.files[0].name+".jpg");
40 | const firstFeameBlob = new Blob([firstFeameData.buffer], { type: "image/jpg" });
41 | setVideoFirstFrame(firstFeameBlob);
42 | }
43 |
44 | async function convertHandler() {
45 | console.log("videoName:" + videoName);
46 | await ffmpeg.run("-i", videoName);
47 | }
48 |
49 | async function watermarkFileChangeHandler(event) {
50 | console.log(event.target.files[0].name);
51 | setWatermarkFile(event.target.files[0]);
52 | setWatermarkName(event.target.files[0].name);
53 | const watermarkData = await fetchFile(event.target.files[0]);
54 | ffmpeg.FS("writeFile", event.target.files[0].name, watermarkData);
55 | }
56 |
57 | async function watermarkPreviewHandler() {
58 | console.log("watermarkPreviewHandler");
59 | await ffmpeg.run("-i", videoName+".jpg", "-i", watermarkName, "-filter_complex", "[1:v] scale=200:200 [logo];[0:v] [logo]overlay=x=W-w:y=10", videoName+watermarkName+".jpg");
60 | const previewData = ffmpeg.FS("readFile", videoName+watermarkName+".jpg");
61 | const previewDataBlob = new Blob([previewData.buffer], { type: "image/jpg" });
62 | setPreviewImage(previewDataBlob);
63 | }
64 |
65 | return (
66 |
67 |
Add watermark
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
83 |
84 |
102 |
103 |
104 |
105 |
106 |
112 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
131 |
134 |
135 |
139 | ffmpeg -hide_banner -i VID_20230626_095923.mp4 -i kbs-logo.svg
140 | -filter_complex "[1:v] scale=176:40
141 | [logo];[0:v][logo]overlay=x=W-w:y=10" out.mp4"
142 |
143 | ffmpeg -i .\first.jpg -i .\22.png -filter_complex "[1:v] scale=200:200
144 | [logo];[0:v] [logo]overlay=x=W-w:y=10" out1.jpg
145 | {log}
146 |
147 |
148 | );
149 | }
150 |
151 | export default WaterMark;
152 |
--------------------------------------------------------------------------------
/src/util/M3u8Utils.js:
--------------------------------------------------------------------------------
1 |
2 | function parseM3u8File(m3u8StringData) {
3 | const lines = m3u8StringData.split('\n');
4 | let tsCount = -1;
5 | const updatedLines = lines.map((line) => {
6 | if (line.startsWith('#')) {
7 | if (line.startsWith('#EXTINF')){
8 | tsCount ++;
9 | return line+"\n"+`input${tsCount}.ts`;
10 | }else if (line.startsWith('#EXT-X-KEY')){
11 | const keys = line.split(',');
12 | const updateKeyLine = keys.map((key) => {
13 | if (key.startsWith('URI')){
14 | return `URI="key"`;
15 | }
16 | return key;
17 | });
18 | return updateKeyLine;
19 | }
20 | return line;
21 | }
22 | });
23 | return updatedLines.join('\n');
24 | }
25 |
26 | export {parseM3u8File}
--------------------------------------------------------------------------------
/support.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/greycodee/VidConvert/69e09277ead82abc3afb479cd1bb52e57880335f/support.png
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: [
4 | "./index.html",
5 | "./src/**/*.{js,ts,jsx,tsx}",
6 | "./src/*.{js,ts,jsx,tsx}",
7 | ],
8 | theme: {
9 | extend: {
10 | spacing: {
11 | '128': '32rem',
12 | }
13 | },
14 | },
15 | plugins: [],
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react-swc'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | base: '/VidConvert',
7 | plugins: [
8 | react()
9 | ]
10 | })
11 |
--------------------------------------------------------------------------------