├── .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 | ![](./app2.png) 7 | 8 | ## supported browser version 9 | 10 | ![](./support.png) -------------------------------------------------------------------------------- /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 | error 48 |
49 | error 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 |
12 |
16 |
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 |
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 |
36 | 37 |
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 | --------------------------------------------------------------------------------