├── .gitignore ├── LICENSE ├── README.md ├── jsconfig.json ├── package.json ├── pnpm-lock.yaml ├── public └── icon │ ├── 128.png │ ├── 16.png │ ├── 32.png │ ├── 48.png │ └── 96.png ├── src ├── content.js ├── isolated-content.js ├── manifest.json ├── mcp-connection.js ├── pages │ └── Popup.svelte ├── popup.css ├── popup.html ├── popup.js ├── utils.js └── vite.env.d.ts ├── svelte.config.js └── vite.config.js /.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 | 26 | # Config files 27 | .webextrc 28 | .webextrc.* 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Daniel Nakov 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 | # MCP for Claude.ai 2 | 3 | A browser extension that enables MCP (Model Control Protocol) capabilities in Claude.ai, allowing you to connect Claude to external tools and services directly from the browser. This enables functionality that's already existing in claude.ai but not enabled. 4 | 5 | Screenshot 2025-04-12 at 3 53 10 PM 6 | Screenshot 2025-04-12 at 3 53 33 PM 7 | 8 | ## Features 9 | 10 | - Connect Claude.ai to MCP-compatible servers 11 | - Manage multiple server connections 12 | - Configure environment variables and command-line arguments 13 | - Debug logging options 14 | - Dark mode support 15 | 16 | ## Installation 17 | 18 | ### From Source 19 | 20 | 1. Clone this repository 21 | ```bash 22 | git clone https://github.com/dnakov/claude-mcp.git 23 | cd claude-mcp 24 | ``` 25 | 26 | 2. Install dependencies 27 | ```bash 28 | npm install 29 | # or 30 | pnpm install 31 | ``` 32 | 33 | 3. Build the extension 34 | ```bash 35 | npm run build 36 | # or 37 | pnpm build 38 | ``` 39 | 40 | 4. Load the extension in your browser: 41 | 42 | **Chrome/Edge**: 43 | - Go to `chrome://extensions/` 44 | - Enable "Developer mode" 45 | - Click "Load unpacked" 46 | - Select the `dist` folder from this repository 47 | 48 | **Firefox**: 49 | - Go to `about:debugging#/runtime/this-firefox` 50 | - Click "Load Temporary Add-on" 51 | - Select the `manifest.json` file from the `dist` folder 52 | 53 | ## Usage 54 | 55 | 1. Click on the extension icon in your browser toolbar when on claude.ai 56 | 2. Add a new MCP server connection with the following details: 57 | - Name: A friendly name for the server 58 | - URL: The endpoint URL for the MCP server 59 | - Command (optional): The command to execute on the server 60 | - Arguments (optional): Command-line arguments 61 | - Environment Variables (optional): Key-value pairs for environment configuration 62 | 63 | 3. Once configured, the extension will establish connections to your MCP servers when you visit Claude.ai 64 | 4. Claude will be able to use the tools provided by your MCP servers during conversations 65 | 66 | ## Development 67 | 68 | - Run in development mode with hot reloading: 69 | ```bash 70 | npm run dev 71 | # or 72 | pnpm dev 73 | ``` 74 | 75 | ## Technical Details 76 | 77 | The extension uses a Server-Sent Events (SSE) connection to communicate with MCP servers. It consists of: 78 | 79 | - A background script that manages storage and extension state 80 | - Content scripts that inject MCP capabilities into Claude.ai 81 | - An isolated content script for secure communication between contexts 82 | - A popup UI for server management 83 | 84 | ## License 85 | 86 | [MIT License](LICENSE) 87 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "moduleResolution": "Node", 4 | "target": "ESNext", 5 | "module": "ESNext", 6 | /** 7 | * svelte-preprocess cannot figure out whether you have 8 | * a value or a type, so tell TypeScript to enforce using 9 | * `import type` instead of `import` for Types. 10 | */ 11 | "importsNotUsedAsValues": "error", 12 | "isolatedModules": true, 13 | "resolveJsonModule": true, 14 | /** 15 | * To have warnings / errors of the Svelte compiler at the 16 | * correct position, enable source maps by default. 17 | */ 18 | "sourceMap": true, 19 | "esModuleInterop": true, 20 | "skipLibCheck": true, 21 | "forceConsistentCasingInFileNames": true, 22 | /** 23 | * Typecheck JS in `.svelte` and `.js` files by default. 24 | * Disable this if you'd like to use dynamic types. 25 | */ 26 | "checkJs": true 27 | }, 28 | /** 29 | * Use global.d.ts instead of compilerOptions.types 30 | * to avoid limiting type declarations. 31 | */ 32 | "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] 33 | } 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "claude-tools", 3 | "private": true, 4 | "version": "1.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build" 9 | }, 10 | "devDependencies": { 11 | "@sveltejs/vite-plugin-svelte": "^4.0.0", 12 | "@types/chrome": "^0.0.315", 13 | "svelte": "^5.0.0", 14 | "vite": "^5.4.4", 15 | "vite-plugin-web-extension": "^4.1.6", 16 | "webextension-polyfill": "^0.10.0" 17 | }, 18 | "dependencies": { 19 | "@tailwindcss/vite": "^4.1.3", 20 | "tailwindcss": "^4.1.3" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@tailwindcss/vite': 12 | specifier: ^4.1.3 13 | version: 4.1.3(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2)) 14 | tailwindcss: 15 | specifier: ^4.1.3 16 | version: 4.1.3 17 | devDependencies: 18 | '@sveltejs/vite-plugin-svelte': 19 | specifier: ^4.0.0 20 | version: 4.0.4(svelte@5.25.12)(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2)) 21 | '@types/chrome': 22 | specifier: ^0.0.315 23 | version: 0.0.315 24 | svelte: 25 | specifier: ^5.0.0 26 | version: 5.25.12 27 | vite: 28 | specifier: ^5.4.4 29 | version: 5.4.18(@types/node@22.14.0)(lightningcss@1.29.2) 30 | vite-plugin-web-extension: 31 | specifier: ^4.1.6 32 | version: 4.4.3(@types/node@22.14.0)(lightningcss@1.29.2) 33 | webextension-polyfill: 34 | specifier: ^0.10.0 35 | version: 0.10.0 36 | 37 | packages: 38 | 39 | '@ampproject/remapping@2.3.0': 40 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 41 | engines: {node: '>=6.0.0'} 42 | 43 | '@babel/code-frame@7.26.2': 44 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 45 | engines: {node: '>=6.9.0'} 46 | 47 | '@babel/helper-validator-identifier@7.25.9': 48 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 49 | engines: {node: '>=6.9.0'} 50 | 51 | '@babel/runtime@7.24.7': 52 | resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} 53 | engines: {node: '>=6.9.0'} 54 | 55 | '@devicefarmer/adbkit-logcat@2.1.3': 56 | resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==} 57 | engines: {node: '>= 4'} 58 | 59 | '@devicefarmer/adbkit-monkey@1.2.1': 60 | resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==} 61 | engines: {node: '>= 0.10.4'} 62 | 63 | '@devicefarmer/adbkit@3.2.6': 64 | resolution: {integrity: sha512-8lO1hSeTgtxcOHhp4tTWq/JaOysp5KNbbyFoxNEBnwkCDZu/Bji3ZfOaG++Riv9jN6c9bgdLBOZqJTC5VJPRKQ==} 65 | engines: {node: '>= 0.10.4'} 66 | hasBin: true 67 | 68 | '@esbuild/aix-ppc64@0.21.5': 69 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 70 | engines: {node: '>=12'} 71 | cpu: [ppc64] 72 | os: [aix] 73 | 74 | '@esbuild/android-arm64@0.21.5': 75 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 76 | engines: {node: '>=12'} 77 | cpu: [arm64] 78 | os: [android] 79 | 80 | '@esbuild/android-arm@0.21.5': 81 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 82 | engines: {node: '>=12'} 83 | cpu: [arm] 84 | os: [android] 85 | 86 | '@esbuild/android-x64@0.21.5': 87 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 88 | engines: {node: '>=12'} 89 | cpu: [x64] 90 | os: [android] 91 | 92 | '@esbuild/darwin-arm64@0.21.5': 93 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 94 | engines: {node: '>=12'} 95 | cpu: [arm64] 96 | os: [darwin] 97 | 98 | '@esbuild/darwin-x64@0.21.5': 99 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 100 | engines: {node: '>=12'} 101 | cpu: [x64] 102 | os: [darwin] 103 | 104 | '@esbuild/freebsd-arm64@0.21.5': 105 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 106 | engines: {node: '>=12'} 107 | cpu: [arm64] 108 | os: [freebsd] 109 | 110 | '@esbuild/freebsd-x64@0.21.5': 111 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 112 | engines: {node: '>=12'} 113 | cpu: [x64] 114 | os: [freebsd] 115 | 116 | '@esbuild/linux-arm64@0.21.5': 117 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 118 | engines: {node: '>=12'} 119 | cpu: [arm64] 120 | os: [linux] 121 | 122 | '@esbuild/linux-arm@0.21.5': 123 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 124 | engines: {node: '>=12'} 125 | cpu: [arm] 126 | os: [linux] 127 | 128 | '@esbuild/linux-ia32@0.21.5': 129 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 130 | engines: {node: '>=12'} 131 | cpu: [ia32] 132 | os: [linux] 133 | 134 | '@esbuild/linux-loong64@0.21.5': 135 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 136 | engines: {node: '>=12'} 137 | cpu: [loong64] 138 | os: [linux] 139 | 140 | '@esbuild/linux-mips64el@0.21.5': 141 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 142 | engines: {node: '>=12'} 143 | cpu: [mips64el] 144 | os: [linux] 145 | 146 | '@esbuild/linux-ppc64@0.21.5': 147 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 148 | engines: {node: '>=12'} 149 | cpu: [ppc64] 150 | os: [linux] 151 | 152 | '@esbuild/linux-riscv64@0.21.5': 153 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 154 | engines: {node: '>=12'} 155 | cpu: [riscv64] 156 | os: [linux] 157 | 158 | '@esbuild/linux-s390x@0.21.5': 159 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 160 | engines: {node: '>=12'} 161 | cpu: [s390x] 162 | os: [linux] 163 | 164 | '@esbuild/linux-x64@0.21.5': 165 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 166 | engines: {node: '>=12'} 167 | cpu: [x64] 168 | os: [linux] 169 | 170 | '@esbuild/netbsd-x64@0.21.5': 171 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 172 | engines: {node: '>=12'} 173 | cpu: [x64] 174 | os: [netbsd] 175 | 176 | '@esbuild/openbsd-x64@0.21.5': 177 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 178 | engines: {node: '>=12'} 179 | cpu: [x64] 180 | os: [openbsd] 181 | 182 | '@esbuild/sunos-x64@0.21.5': 183 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 184 | engines: {node: '>=12'} 185 | cpu: [x64] 186 | os: [sunos] 187 | 188 | '@esbuild/win32-arm64@0.21.5': 189 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 190 | engines: {node: '>=12'} 191 | cpu: [arm64] 192 | os: [win32] 193 | 194 | '@esbuild/win32-ia32@0.21.5': 195 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 196 | engines: {node: '>=12'} 197 | cpu: [ia32] 198 | os: [win32] 199 | 200 | '@esbuild/win32-x64@0.21.5': 201 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 202 | engines: {node: '>=12'} 203 | cpu: [x64] 204 | os: [win32] 205 | 206 | '@jridgewell/gen-mapping@0.3.8': 207 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 208 | engines: {node: '>=6.0.0'} 209 | 210 | '@jridgewell/resolve-uri@3.1.2': 211 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 212 | engines: {node: '>=6.0.0'} 213 | 214 | '@jridgewell/set-array@1.2.1': 215 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 216 | engines: {node: '>=6.0.0'} 217 | 218 | '@jridgewell/sourcemap-codec@1.5.0': 219 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 220 | 221 | '@jridgewell/trace-mapping@0.3.25': 222 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 223 | 224 | '@pnpm/config.env-replace@1.1.0': 225 | resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} 226 | engines: {node: '>=12.22.0'} 227 | 228 | '@pnpm/network.ca-file@1.0.2': 229 | resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} 230 | engines: {node: '>=12.22.0'} 231 | 232 | '@pnpm/npm-conf@2.3.1': 233 | resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} 234 | engines: {node: '>=12'} 235 | 236 | '@rollup/rollup-android-arm-eabi@4.39.0': 237 | resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} 238 | cpu: [arm] 239 | os: [android] 240 | 241 | '@rollup/rollup-android-arm64@4.39.0': 242 | resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} 243 | cpu: [arm64] 244 | os: [android] 245 | 246 | '@rollup/rollup-darwin-arm64@4.39.0': 247 | resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} 248 | cpu: [arm64] 249 | os: [darwin] 250 | 251 | '@rollup/rollup-darwin-x64@4.39.0': 252 | resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} 253 | cpu: [x64] 254 | os: [darwin] 255 | 256 | '@rollup/rollup-freebsd-arm64@4.39.0': 257 | resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} 258 | cpu: [arm64] 259 | os: [freebsd] 260 | 261 | '@rollup/rollup-freebsd-x64@4.39.0': 262 | resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} 263 | cpu: [x64] 264 | os: [freebsd] 265 | 266 | '@rollup/rollup-linux-arm-gnueabihf@4.39.0': 267 | resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} 268 | cpu: [arm] 269 | os: [linux] 270 | 271 | '@rollup/rollup-linux-arm-musleabihf@4.39.0': 272 | resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} 273 | cpu: [arm] 274 | os: [linux] 275 | 276 | '@rollup/rollup-linux-arm64-gnu@4.39.0': 277 | resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} 278 | cpu: [arm64] 279 | os: [linux] 280 | 281 | '@rollup/rollup-linux-arm64-musl@4.39.0': 282 | resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} 283 | cpu: [arm64] 284 | os: [linux] 285 | 286 | '@rollup/rollup-linux-loongarch64-gnu@4.39.0': 287 | resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} 288 | cpu: [loong64] 289 | os: [linux] 290 | 291 | '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': 292 | resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} 293 | cpu: [ppc64] 294 | os: [linux] 295 | 296 | '@rollup/rollup-linux-riscv64-gnu@4.39.0': 297 | resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} 298 | cpu: [riscv64] 299 | os: [linux] 300 | 301 | '@rollup/rollup-linux-riscv64-musl@4.39.0': 302 | resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} 303 | cpu: [riscv64] 304 | os: [linux] 305 | 306 | '@rollup/rollup-linux-s390x-gnu@4.39.0': 307 | resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} 308 | cpu: [s390x] 309 | os: [linux] 310 | 311 | '@rollup/rollup-linux-x64-gnu@4.39.0': 312 | resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} 313 | cpu: [x64] 314 | os: [linux] 315 | 316 | '@rollup/rollup-linux-x64-musl@4.39.0': 317 | resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} 318 | cpu: [x64] 319 | os: [linux] 320 | 321 | '@rollup/rollup-win32-arm64-msvc@4.39.0': 322 | resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} 323 | cpu: [arm64] 324 | os: [win32] 325 | 326 | '@rollup/rollup-win32-ia32-msvc@4.39.0': 327 | resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} 328 | cpu: [ia32] 329 | os: [win32] 330 | 331 | '@rollup/rollup-win32-x64-msvc@4.39.0': 332 | resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} 333 | cpu: [x64] 334 | os: [win32] 335 | 336 | '@sindresorhus/is@5.6.0': 337 | resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} 338 | engines: {node: '>=14.16'} 339 | 340 | '@sveltejs/acorn-typescript@1.0.5': 341 | resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} 342 | peerDependencies: 343 | acorn: ^8.9.0 344 | 345 | '@sveltejs/vite-plugin-svelte-inspector@3.0.1': 346 | resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==} 347 | engines: {node: ^18.0.0 || ^20.0.0 || >=22} 348 | peerDependencies: 349 | '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 350 | svelte: ^5.0.0-next.96 || ^5.0.0 351 | vite: ^5.0.0 352 | 353 | '@sveltejs/vite-plugin-svelte@4.0.4': 354 | resolution: {integrity: sha512-0ba1RQ/PHen5FGpdSrW7Y3fAMQjrXantECALeOiOdBdzR5+5vPP6HVZRLmZaQL+W8m++o+haIAKq5qT+MiZ7VA==} 355 | engines: {node: ^18.0.0 || ^20.0.0 || >=22} 356 | peerDependencies: 357 | svelte: ^5.0.0-next.96 || ^5.0.0 358 | vite: ^5.0.0 359 | 360 | '@szmarczak/http-timer@5.0.1': 361 | resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} 362 | engines: {node: '>=14.16'} 363 | 364 | '@tailwindcss/node@4.1.3': 365 | resolution: {integrity: sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==} 366 | 367 | '@tailwindcss/oxide-android-arm64@4.1.3': 368 | resolution: {integrity: sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==} 369 | engines: {node: '>= 10'} 370 | cpu: [arm64] 371 | os: [android] 372 | 373 | '@tailwindcss/oxide-darwin-arm64@4.1.3': 374 | resolution: {integrity: sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==} 375 | engines: {node: '>= 10'} 376 | cpu: [arm64] 377 | os: [darwin] 378 | 379 | '@tailwindcss/oxide-darwin-x64@4.1.3': 380 | resolution: {integrity: sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==} 381 | engines: {node: '>= 10'} 382 | cpu: [x64] 383 | os: [darwin] 384 | 385 | '@tailwindcss/oxide-freebsd-x64@4.1.3': 386 | resolution: {integrity: sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==} 387 | engines: {node: '>= 10'} 388 | cpu: [x64] 389 | os: [freebsd] 390 | 391 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.3': 392 | resolution: {integrity: sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==} 393 | engines: {node: '>= 10'} 394 | cpu: [arm] 395 | os: [linux] 396 | 397 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.3': 398 | resolution: {integrity: sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==} 399 | engines: {node: '>= 10'} 400 | cpu: [arm64] 401 | os: [linux] 402 | 403 | '@tailwindcss/oxide-linux-arm64-musl@4.1.3': 404 | resolution: {integrity: sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==} 405 | engines: {node: '>= 10'} 406 | cpu: [arm64] 407 | os: [linux] 408 | 409 | '@tailwindcss/oxide-linux-x64-gnu@4.1.3': 410 | resolution: {integrity: sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==} 411 | engines: {node: '>= 10'} 412 | cpu: [x64] 413 | os: [linux] 414 | 415 | '@tailwindcss/oxide-linux-x64-musl@4.1.3': 416 | resolution: {integrity: sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==} 417 | engines: {node: '>= 10'} 418 | cpu: [x64] 419 | os: [linux] 420 | 421 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.3': 422 | resolution: {integrity: sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==} 423 | engines: {node: '>= 10'} 424 | cpu: [arm64] 425 | os: [win32] 426 | 427 | '@tailwindcss/oxide-win32-x64-msvc@4.1.3': 428 | resolution: {integrity: sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==} 429 | engines: {node: '>= 10'} 430 | cpu: [x64] 431 | os: [win32] 432 | 433 | '@tailwindcss/oxide@4.1.3': 434 | resolution: {integrity: sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==} 435 | engines: {node: '>= 10'} 436 | 437 | '@tailwindcss/vite@4.1.3': 438 | resolution: {integrity: sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ==} 439 | peerDependencies: 440 | vite: ^5.2.0 || ^6 441 | 442 | '@types/chrome@0.0.315': 443 | resolution: {integrity: sha512-Oy1dYWkr6BCmgwBtOngLByCHstQ3whltZg7/7lubgIZEYvKobDneqplgc6LKERNRBwckFviV4UU5AZZNUFrJ4A==} 444 | 445 | '@types/estree@1.0.7': 446 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 447 | 448 | '@types/filesystem@0.0.36': 449 | resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} 450 | 451 | '@types/filewriter@0.0.33': 452 | resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} 453 | 454 | '@types/har-format@1.2.16': 455 | resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} 456 | 457 | '@types/http-cache-semantics@4.0.4': 458 | resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} 459 | 460 | '@types/minimatch@3.0.5': 461 | resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} 462 | 463 | '@types/node@22.14.0': 464 | resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} 465 | 466 | acorn@8.14.1: 467 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 468 | engines: {node: '>=0.4.0'} 469 | hasBin: true 470 | 471 | adm-zip@0.5.16: 472 | resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} 473 | engines: {node: '>=12.0'} 474 | 475 | ajv@8.17.1: 476 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 477 | 478 | ansi-align@3.0.1: 479 | resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 480 | 481 | ansi-regex@5.0.1: 482 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 483 | engines: {node: '>=8'} 484 | 485 | ansi-regex@6.1.0: 486 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 487 | engines: {node: '>=12'} 488 | 489 | ansi-styles@6.2.1: 490 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 491 | engines: {node: '>=12'} 492 | 493 | any-promise@1.3.0: 494 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 495 | 496 | aria-query@5.3.2: 497 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 498 | engines: {node: '>= 0.4'} 499 | 500 | array-differ@4.0.0: 501 | resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} 502 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 503 | 504 | array-union@3.0.1: 505 | resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} 506 | engines: {node: '>=12'} 507 | 508 | async-lock@1.4.1: 509 | resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} 510 | 511 | async@3.2.6: 512 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 513 | 514 | at-least-node@1.0.0: 515 | resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} 516 | engines: {node: '>= 4.0.0'} 517 | 518 | axobject-query@4.1.0: 519 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 520 | engines: {node: '>= 0.4'} 521 | 522 | balanced-match@1.0.2: 523 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 524 | 525 | bluebird@3.7.2: 526 | resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} 527 | 528 | boolbase@1.0.0: 529 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 530 | 531 | boxen@7.1.1: 532 | resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} 533 | engines: {node: '>=14.16'} 534 | 535 | brace-expansion@1.1.11: 536 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 537 | 538 | buffer-from@1.1.2: 539 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 540 | 541 | bunyan@1.8.15: 542 | resolution: {integrity: sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==} 543 | engines: {'0': node >=0.10.0} 544 | hasBin: true 545 | 546 | cacheable-lookup@7.0.0: 547 | resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} 548 | engines: {node: '>=14.16'} 549 | 550 | cacheable-request@10.2.14: 551 | resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} 552 | engines: {node: '>=14.16'} 553 | 554 | camelcase@7.0.1: 555 | resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} 556 | engines: {node: '>=14.16'} 557 | 558 | chalk@5.4.1: 559 | resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 560 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 561 | 562 | charenc@0.0.2: 563 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 564 | 565 | chrome-launcher@1.1.0: 566 | resolution: {integrity: sha512-rJYWeEAERwWIr3c3mEVXwNiODPEdMRlRxHc47B1qHPOolHZnkj7rMv1QSUfPoG6MgatWj5AxSpnKKR4QEwEQIQ==} 567 | engines: {node: '>=12.13.0'} 568 | hasBin: true 569 | 570 | ci-info@3.9.0: 571 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 572 | engines: {node: '>=8'} 573 | 574 | cli-boxes@3.0.0: 575 | resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 576 | engines: {node: '>=10'} 577 | 578 | clsx@2.1.1: 579 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 580 | engines: {node: '>=6'} 581 | 582 | commander@2.9.0: 583 | resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} 584 | engines: {node: '>= 0.6.x'} 585 | 586 | commander@9.5.0: 587 | resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 588 | engines: {node: ^12.20.0 || >=14} 589 | 590 | concat-map@0.0.1: 591 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 592 | 593 | concat-stream@1.6.2: 594 | resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} 595 | engines: {'0': node >= 0.8} 596 | 597 | config-chain@1.1.13: 598 | resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} 599 | 600 | configstore@6.0.0: 601 | resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} 602 | engines: {node: '>=12'} 603 | 604 | core-util-is@1.0.3: 605 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 606 | 607 | crypt@0.0.2: 608 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 609 | 610 | crypto-random-string@4.0.0: 611 | resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} 612 | engines: {node: '>=12'} 613 | 614 | css-select@5.1.0: 615 | resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} 616 | 617 | css-what@6.1.0: 618 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 619 | engines: {node: '>= 6'} 620 | 621 | cssom@0.5.0: 622 | resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} 623 | 624 | debounce@1.2.1: 625 | resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} 626 | 627 | debug@2.6.9: 628 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 629 | peerDependencies: 630 | supports-color: '*' 631 | peerDependenciesMeta: 632 | supports-color: 633 | optional: true 634 | 635 | debug@4.3.7: 636 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 637 | engines: {node: '>=6.0'} 638 | peerDependencies: 639 | supports-color: '*' 640 | peerDependenciesMeta: 641 | supports-color: 642 | optional: true 643 | 644 | debug@4.4.0: 645 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 646 | engines: {node: '>=6.0'} 647 | peerDependencies: 648 | supports-color: '*' 649 | peerDependenciesMeta: 650 | supports-color: 651 | optional: true 652 | 653 | decompress-response@6.0.0: 654 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 655 | engines: {node: '>=10'} 656 | 657 | deep-extend@0.6.0: 658 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 659 | engines: {node: '>=4.0.0'} 660 | 661 | deepmerge@4.3.1: 662 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 663 | engines: {node: '>=0.10.0'} 664 | 665 | defer-to-connect@2.0.1: 666 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} 667 | engines: {node: '>=10'} 668 | 669 | detect-libc@2.0.3: 670 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 671 | engines: {node: '>=8'} 672 | 673 | dom-serializer@2.0.0: 674 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 675 | 676 | domelementtype@2.3.0: 677 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 678 | 679 | domhandler@5.0.3: 680 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 681 | engines: {node: '>= 4'} 682 | 683 | domutils@3.2.2: 684 | resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 685 | 686 | dot-prop@6.0.1: 687 | resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} 688 | engines: {node: '>=10'} 689 | 690 | dtrace-provider@0.8.8: 691 | resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} 692 | engines: {node: '>=0.10'} 693 | 694 | eastasianwidth@0.2.0: 695 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 696 | 697 | emoji-regex@8.0.0: 698 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 699 | 700 | emoji-regex@9.2.2: 701 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 702 | 703 | enhanced-resolve@5.18.1: 704 | resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 705 | engines: {node: '>=10.13.0'} 706 | 707 | entities@4.5.0: 708 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 709 | engines: {node: '>=0.12'} 710 | 711 | error-ex@1.3.2: 712 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 713 | 714 | es6-error@4.1.1: 715 | resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} 716 | 717 | esbuild@0.21.5: 718 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 719 | engines: {node: '>=12'} 720 | hasBin: true 721 | 722 | escape-goat@4.0.0: 723 | resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} 724 | engines: {node: '>=12'} 725 | 726 | escape-string-regexp@4.0.0: 727 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 728 | engines: {node: '>=10'} 729 | 730 | esm-env@1.2.2: 731 | resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 732 | 733 | esrap@1.4.6: 734 | resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} 735 | 736 | fast-deep-equal@3.1.3: 737 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 738 | 739 | fast-uri@3.0.6: 740 | resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} 741 | 742 | firefox-profile@4.6.0: 743 | resolution: {integrity: sha512-I9rAm1w8U3CdhgO4EzTJsCvgcbvynZn9lOySkZf78wUdUIQH2w9QOKf3pAX+THt2XMSSR3kJSuM8P7bYux9j8g==} 744 | hasBin: true 745 | 746 | form-data-encoder@2.1.4: 747 | resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} 748 | engines: {node: '>= 14.17'} 749 | 750 | fs-extra@10.1.0: 751 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 752 | engines: {node: '>=12'} 753 | 754 | fs-extra@11.2.0: 755 | resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} 756 | engines: {node: '>=14.14'} 757 | 758 | fs-extra@9.0.1: 759 | resolution: {integrity: sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==} 760 | engines: {node: '>=10'} 761 | 762 | fsevents@2.3.3: 763 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 764 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 765 | os: [darwin] 766 | 767 | fx-runner@1.4.0: 768 | resolution: {integrity: sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg==} 769 | hasBin: true 770 | 771 | get-stream@6.0.1: 772 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 773 | engines: {node: '>=10'} 774 | 775 | glob-to-regexp@0.4.1: 776 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 777 | 778 | glob@6.0.4: 779 | resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} 780 | deprecated: Glob versions prior to v9 are no longer supported 781 | 782 | global-dirs@3.0.1: 783 | resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} 784 | engines: {node: '>=10'} 785 | 786 | got@12.6.1: 787 | resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} 788 | engines: {node: '>=14.16'} 789 | 790 | graceful-fs@4.2.10: 791 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 792 | 793 | graceful-fs@4.2.11: 794 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 795 | 796 | graceful-readlink@1.0.1: 797 | resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} 798 | 799 | growly@1.3.0: 800 | resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} 801 | 802 | has-yarn@3.0.0: 803 | resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} 804 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 805 | 806 | html-escaper@3.0.3: 807 | resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} 808 | 809 | htmlparser2@8.0.2: 810 | resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} 811 | 812 | http-cache-semantics@4.1.1: 813 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} 814 | 815 | http2-wrapper@2.2.1: 816 | resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} 817 | engines: {node: '>=10.19.0'} 818 | 819 | immediate@3.0.6: 820 | resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} 821 | 822 | import-lazy@4.0.0: 823 | resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} 824 | engines: {node: '>=8'} 825 | 826 | imurmurhash@0.1.4: 827 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 828 | engines: {node: '>=0.8.19'} 829 | 830 | inflight@1.0.6: 831 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 832 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 833 | 834 | inherits@2.0.4: 835 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 836 | 837 | ini@1.3.8: 838 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 839 | 840 | ini@2.0.0: 841 | resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} 842 | engines: {node: '>=10'} 843 | 844 | is-absolute@0.1.7: 845 | resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==} 846 | engines: {node: '>=0.10.0'} 847 | 848 | is-arrayish@0.2.1: 849 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 850 | 851 | is-buffer@1.1.6: 852 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 853 | 854 | is-ci@3.0.1: 855 | resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} 856 | hasBin: true 857 | 858 | is-docker@2.2.1: 859 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 860 | engines: {node: '>=8'} 861 | hasBin: true 862 | 863 | is-fullwidth-code-point@3.0.0: 864 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 865 | engines: {node: '>=8'} 866 | 867 | is-installed-globally@0.4.0: 868 | resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} 869 | engines: {node: '>=10'} 870 | 871 | is-npm@6.0.0: 872 | resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} 873 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 874 | 875 | is-obj@2.0.0: 876 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 877 | engines: {node: '>=8'} 878 | 879 | is-path-inside@3.0.3: 880 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 881 | engines: {node: '>=8'} 882 | 883 | is-plain-object@2.0.4: 884 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 885 | engines: {node: '>=0.10.0'} 886 | 887 | is-primitive@3.0.1: 888 | resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} 889 | engines: {node: '>=0.10.0'} 890 | 891 | is-reference@3.0.3: 892 | resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 893 | 894 | is-relative@0.1.3: 895 | resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==} 896 | engines: {node: '>=0.10.0'} 897 | 898 | is-typedarray@1.0.0: 899 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 900 | 901 | is-wsl@2.2.0: 902 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 903 | engines: {node: '>=8'} 904 | 905 | is-yarn-global@0.4.1: 906 | resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} 907 | engines: {node: '>=12'} 908 | 909 | isarray@1.0.0: 910 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 911 | 912 | isexe@1.1.2: 913 | resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==} 914 | 915 | isexe@2.0.0: 916 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 917 | 918 | isobject@3.0.1: 919 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 920 | engines: {node: '>=0.10.0'} 921 | 922 | jiti@2.4.2: 923 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 924 | hasBin: true 925 | 926 | js-tokens@4.0.0: 927 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 928 | 929 | json-buffer@3.0.1: 930 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 931 | 932 | json-parse-even-better-errors@3.0.2: 933 | resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} 934 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 935 | 936 | json-schema-traverse@1.0.0: 937 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 938 | 939 | json5@2.2.3: 940 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 941 | engines: {node: '>=6'} 942 | hasBin: true 943 | 944 | jsonfile@6.1.0: 945 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 946 | 947 | jszip@3.10.1: 948 | resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} 949 | 950 | keyv@4.5.4: 951 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 952 | 953 | kleur@4.1.5: 954 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 955 | engines: {node: '>=6'} 956 | 957 | latest-version@7.0.0: 958 | resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} 959 | engines: {node: '>=14.16'} 960 | 961 | lie@3.3.0: 962 | resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} 963 | 964 | lighthouse-logger@2.0.1: 965 | resolution: {integrity: sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==} 966 | 967 | lightningcss-darwin-arm64@1.29.2: 968 | resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} 969 | engines: {node: '>= 12.0.0'} 970 | cpu: [arm64] 971 | os: [darwin] 972 | 973 | lightningcss-darwin-x64@1.29.2: 974 | resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} 975 | engines: {node: '>= 12.0.0'} 976 | cpu: [x64] 977 | os: [darwin] 978 | 979 | lightningcss-freebsd-x64@1.29.2: 980 | resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} 981 | engines: {node: '>= 12.0.0'} 982 | cpu: [x64] 983 | os: [freebsd] 984 | 985 | lightningcss-linux-arm-gnueabihf@1.29.2: 986 | resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} 987 | engines: {node: '>= 12.0.0'} 988 | cpu: [arm] 989 | os: [linux] 990 | 991 | lightningcss-linux-arm64-gnu@1.29.2: 992 | resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} 993 | engines: {node: '>= 12.0.0'} 994 | cpu: [arm64] 995 | os: [linux] 996 | 997 | lightningcss-linux-arm64-musl@1.29.2: 998 | resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} 999 | engines: {node: '>= 12.0.0'} 1000 | cpu: [arm64] 1001 | os: [linux] 1002 | 1003 | lightningcss-linux-x64-gnu@1.29.2: 1004 | resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} 1005 | engines: {node: '>= 12.0.0'} 1006 | cpu: [x64] 1007 | os: [linux] 1008 | 1009 | lightningcss-linux-x64-musl@1.29.2: 1010 | resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} 1011 | engines: {node: '>= 12.0.0'} 1012 | cpu: [x64] 1013 | os: [linux] 1014 | 1015 | lightningcss-win32-arm64-msvc@1.29.2: 1016 | resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} 1017 | engines: {node: '>= 12.0.0'} 1018 | cpu: [arm64] 1019 | os: [win32] 1020 | 1021 | lightningcss-win32-x64-msvc@1.29.2: 1022 | resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} 1023 | engines: {node: '>= 12.0.0'} 1024 | cpu: [x64] 1025 | os: [win32] 1026 | 1027 | lightningcss@1.29.2: 1028 | resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} 1029 | engines: {node: '>= 12.0.0'} 1030 | 1031 | lines-and-columns@2.0.4: 1032 | resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} 1033 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1034 | 1035 | linkedom@0.14.26: 1036 | resolution: {integrity: sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==} 1037 | 1038 | locate-character@3.0.0: 1039 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 1040 | 1041 | lodash.uniq@4.5.0: 1042 | resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} 1043 | 1044 | lodash.uniqby@4.7.0: 1045 | resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} 1046 | 1047 | lowercase-keys@3.0.0: 1048 | resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} 1049 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1050 | 1051 | magic-string@0.30.17: 1052 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1053 | 1054 | make-error@1.3.6: 1055 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1056 | 1057 | marky@1.2.5: 1058 | resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} 1059 | 1060 | md5@2.3.0: 1061 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 1062 | 1063 | mimic-response@3.1.0: 1064 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1065 | engines: {node: '>=10'} 1066 | 1067 | mimic-response@4.0.0: 1068 | resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} 1069 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1070 | 1071 | minimatch@3.1.2: 1072 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1073 | 1074 | minimist@1.2.8: 1075 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1076 | 1077 | mkdirp@0.5.6: 1078 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1079 | hasBin: true 1080 | 1081 | mkdirp@3.0.1: 1082 | resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} 1083 | engines: {node: '>=10'} 1084 | hasBin: true 1085 | 1086 | moment@2.30.1: 1087 | resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} 1088 | 1089 | ms@2.0.0: 1090 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1091 | 1092 | ms@2.1.3: 1093 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1094 | 1095 | multimatch@6.0.0: 1096 | resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==} 1097 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1098 | 1099 | mv@2.1.1: 1100 | resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} 1101 | engines: {node: '>=0.8.0'} 1102 | 1103 | mz@2.7.0: 1104 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1105 | 1106 | nan@2.22.2: 1107 | resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} 1108 | 1109 | nanoid@3.3.11: 1110 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1111 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1112 | hasBin: true 1113 | 1114 | ncp@2.0.0: 1115 | resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} 1116 | hasBin: true 1117 | 1118 | node-forge@1.3.1: 1119 | resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} 1120 | engines: {node: '>= 6.13.0'} 1121 | 1122 | node-notifier@10.0.1: 1123 | resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} 1124 | 1125 | normalize-url@8.0.1: 1126 | resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} 1127 | engines: {node: '>=14.16'} 1128 | 1129 | nth-check@2.1.1: 1130 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 1131 | 1132 | object-assign@4.1.1: 1133 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1134 | engines: {node: '>=0.10.0'} 1135 | 1136 | once@1.4.0: 1137 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1138 | 1139 | os-shim@0.1.3: 1140 | resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} 1141 | engines: {node: '>= 0.4.0'} 1142 | 1143 | p-cancelable@3.0.0: 1144 | resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} 1145 | engines: {node: '>=12.20'} 1146 | 1147 | package-json@8.1.1: 1148 | resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} 1149 | engines: {node: '>=14.16'} 1150 | 1151 | pako@1.0.11: 1152 | resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} 1153 | 1154 | parse-json@7.1.1: 1155 | resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} 1156 | engines: {node: '>=16'} 1157 | 1158 | path-is-absolute@1.0.1: 1159 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1160 | engines: {node: '>=0.10.0'} 1161 | 1162 | picocolors@1.1.1: 1163 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1164 | 1165 | postcss@8.5.3: 1166 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1167 | engines: {node: ^10 || ^12 || >=14} 1168 | 1169 | process-nextick-args@2.0.1: 1170 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1171 | 1172 | promise-toolbox@0.21.0: 1173 | resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==} 1174 | engines: {node: '>=6'} 1175 | 1176 | proto-list@1.2.4: 1177 | resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 1178 | 1179 | pupa@3.1.0: 1180 | resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} 1181 | engines: {node: '>=12.20'} 1182 | 1183 | quick-lru@5.1.1: 1184 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1185 | engines: {node: '>=10'} 1186 | 1187 | rc@1.2.8: 1188 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1189 | hasBin: true 1190 | 1191 | readable-stream@2.3.8: 1192 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 1193 | 1194 | regenerator-runtime@0.14.1: 1195 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1196 | 1197 | registry-auth-token@5.1.0: 1198 | resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} 1199 | engines: {node: '>=14'} 1200 | 1201 | registry-url@6.0.1: 1202 | resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} 1203 | engines: {node: '>=12'} 1204 | 1205 | require-from-string@2.0.2: 1206 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1207 | engines: {node: '>=0.10.0'} 1208 | 1209 | resolve-alpn@1.2.1: 1210 | resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} 1211 | 1212 | responselike@3.0.0: 1213 | resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} 1214 | engines: {node: '>=14.16'} 1215 | 1216 | rimraf@2.4.5: 1217 | resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} 1218 | deprecated: Rimraf versions prior to v4 are no longer supported 1219 | hasBin: true 1220 | 1221 | rollup@4.39.0: 1222 | resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} 1223 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1224 | hasBin: true 1225 | 1226 | safe-buffer@5.1.2: 1227 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1228 | 1229 | safe-json-stringify@1.2.0: 1230 | resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} 1231 | 1232 | sax@1.4.1: 1233 | resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} 1234 | 1235 | semver-diff@4.0.0: 1236 | resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} 1237 | engines: {node: '>=12'} 1238 | 1239 | semver@7.7.1: 1240 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1241 | engines: {node: '>=10'} 1242 | hasBin: true 1243 | 1244 | set-value@4.1.0: 1245 | resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} 1246 | engines: {node: '>=11.0'} 1247 | 1248 | setimmediate@1.0.5: 1249 | resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} 1250 | 1251 | shell-quote@1.7.3: 1252 | resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} 1253 | 1254 | shellwords@0.1.1: 1255 | resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} 1256 | 1257 | signal-exit@3.0.7: 1258 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1259 | 1260 | source-map-js@1.2.1: 1261 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1262 | engines: {node: '>=0.10.0'} 1263 | 1264 | source-map-support@0.5.21: 1265 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1266 | 1267 | source-map@0.6.1: 1268 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1269 | engines: {node: '>=0.10.0'} 1270 | 1271 | spawn-sync@1.0.15: 1272 | resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} 1273 | 1274 | split@1.0.1: 1275 | resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} 1276 | 1277 | string-width@4.2.3: 1278 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1279 | engines: {node: '>=8'} 1280 | 1281 | string-width@5.1.2: 1282 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1283 | engines: {node: '>=12'} 1284 | 1285 | string_decoder@1.1.1: 1286 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1287 | 1288 | strip-ansi@6.0.1: 1289 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1290 | engines: {node: '>=8'} 1291 | 1292 | strip-ansi@7.1.0: 1293 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1294 | engines: {node: '>=12'} 1295 | 1296 | strip-bom@5.0.0: 1297 | resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} 1298 | engines: {node: '>=12'} 1299 | 1300 | strip-json-comments@2.0.1: 1301 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 1302 | engines: {node: '>=0.10.0'} 1303 | 1304 | strip-json-comments@5.0.1: 1305 | resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} 1306 | engines: {node: '>=14.16'} 1307 | 1308 | svelte@5.25.12: 1309 | resolution: {integrity: sha512-4Y3mRN4fuZicNwBeb7sPPEUmiNIoN4lwf2NWD6CJdtYM3xVoOvjXhHQayIRbE0pTHG0mgk88n8WZvuOiNbtD8Q==} 1310 | engines: {node: '>=18'} 1311 | 1312 | tailwindcss@4.1.3: 1313 | resolution: {integrity: sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==} 1314 | 1315 | tapable@2.2.1: 1316 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1317 | engines: {node: '>=6'} 1318 | 1319 | thenify-all@1.6.0: 1320 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1321 | engines: {node: '>=0.8'} 1322 | 1323 | thenify@3.3.1: 1324 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1325 | 1326 | through@2.3.8: 1327 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1328 | 1329 | tmp@0.2.3: 1330 | resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} 1331 | engines: {node: '>=14.14'} 1332 | 1333 | type-fest@1.4.0: 1334 | resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} 1335 | engines: {node: '>=10'} 1336 | 1337 | type-fest@2.19.0: 1338 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 1339 | engines: {node: '>=12.20'} 1340 | 1341 | type-fest@3.13.1: 1342 | resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} 1343 | engines: {node: '>=14.16'} 1344 | 1345 | typedarray-to-buffer@3.1.5: 1346 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 1347 | 1348 | typedarray@0.0.6: 1349 | resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 1350 | 1351 | uhyphen@0.2.0: 1352 | resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} 1353 | 1354 | undici-types@6.21.0: 1355 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1356 | 1357 | unique-string@3.0.0: 1358 | resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} 1359 | engines: {node: '>=12'} 1360 | 1361 | universalify@1.0.0: 1362 | resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} 1363 | engines: {node: '>= 10.0.0'} 1364 | 1365 | universalify@2.0.1: 1366 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1367 | engines: {node: '>= 10.0.0'} 1368 | 1369 | update-notifier@6.0.2: 1370 | resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} 1371 | engines: {node: '>=14.16'} 1372 | 1373 | util-deprecate@1.0.2: 1374 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1375 | 1376 | uuid@8.3.2: 1377 | resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} 1378 | hasBin: true 1379 | 1380 | vite-plugin-web-extension@4.4.3: 1381 | resolution: {integrity: sha512-xOQR4o5bfxnZDlVxDYoK/aZO9Tt92CItaGybrKC41rl218Of5fsLDQDYR95rQd2wg8DnT8R9CEheQ++lmP+Euw==} 1382 | engines: {node: '>=16'} 1383 | 1384 | vite@5.4.18: 1385 | resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} 1386 | engines: {node: ^18.0.0 || >=20.0.0} 1387 | hasBin: true 1388 | peerDependencies: 1389 | '@types/node': ^18.0.0 || >=20.0.0 1390 | less: '*' 1391 | lightningcss: ^1.21.0 1392 | sass: '*' 1393 | sass-embedded: '*' 1394 | stylus: '*' 1395 | sugarss: '*' 1396 | terser: ^5.4.0 1397 | peerDependenciesMeta: 1398 | '@types/node': 1399 | optional: true 1400 | less: 1401 | optional: true 1402 | lightningcss: 1403 | optional: true 1404 | sass: 1405 | optional: true 1406 | sass-embedded: 1407 | optional: true 1408 | stylus: 1409 | optional: true 1410 | sugarss: 1411 | optional: true 1412 | terser: 1413 | optional: true 1414 | 1415 | vitefu@1.0.6: 1416 | resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} 1417 | peerDependencies: 1418 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 1419 | peerDependenciesMeta: 1420 | vite: 1421 | optional: true 1422 | 1423 | watchpack@2.4.1: 1424 | resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} 1425 | engines: {node: '>=10.13.0'} 1426 | 1427 | web-ext-option-types@8.3.1: 1428 | resolution: {integrity: sha512-mKG1fplVXMKYaEeSs35v/x9YIx7FJJDCBQNoLoMvUXeFck0rNC2qnHsYaRnVXXd1XL7o/hz+5+T7YqpTVyEK3w==} 1429 | 1430 | web-ext-run@0.2.2: 1431 | resolution: {integrity: sha512-GD59q5/1wYQJXTHrljMZaBa3cCz+Jj3FMDLYgKyAa34TPcHSuMaGqp7TcLJ66PCe43C3hmbEAZd8QCpAB34eiw==} 1432 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1433 | 1434 | webextension-polyfill@0.10.0: 1435 | resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} 1436 | 1437 | when@3.7.7: 1438 | resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} 1439 | 1440 | which@1.2.4: 1441 | resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==} 1442 | hasBin: true 1443 | 1444 | which@2.0.2: 1445 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1446 | engines: {node: '>= 8'} 1447 | hasBin: true 1448 | 1449 | widest-line@4.0.1: 1450 | resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} 1451 | engines: {node: '>=12'} 1452 | 1453 | winreg@0.0.12: 1454 | resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==} 1455 | 1456 | wrap-ansi@8.1.0: 1457 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1458 | engines: {node: '>=12'} 1459 | 1460 | wrappy@1.0.2: 1461 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1462 | 1463 | write-file-atomic@3.0.3: 1464 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 1465 | 1466 | ws@8.18.0: 1467 | resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} 1468 | engines: {node: '>=10.0.0'} 1469 | peerDependencies: 1470 | bufferutil: ^4.0.1 1471 | utf-8-validate: '>=5.0.2' 1472 | peerDependenciesMeta: 1473 | bufferutil: 1474 | optional: true 1475 | utf-8-validate: 1476 | optional: true 1477 | 1478 | xdg-basedir@5.1.0: 1479 | resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} 1480 | engines: {node: '>=12'} 1481 | 1482 | xml2js@0.5.0: 1483 | resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} 1484 | engines: {node: '>=4.0.0'} 1485 | 1486 | xmlbuilder@11.0.1: 1487 | resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} 1488 | engines: {node: '>=4.0'} 1489 | 1490 | yaml@2.7.1: 1491 | resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} 1492 | engines: {node: '>= 14'} 1493 | hasBin: true 1494 | 1495 | zimmerframe@1.1.2: 1496 | resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} 1497 | 1498 | zip-dir@2.0.0: 1499 | resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} 1500 | 1501 | snapshots: 1502 | 1503 | '@ampproject/remapping@2.3.0': 1504 | dependencies: 1505 | '@jridgewell/gen-mapping': 0.3.8 1506 | '@jridgewell/trace-mapping': 0.3.25 1507 | 1508 | '@babel/code-frame@7.26.2': 1509 | dependencies: 1510 | '@babel/helper-validator-identifier': 7.25.9 1511 | js-tokens: 4.0.0 1512 | picocolors: 1.1.1 1513 | 1514 | '@babel/helper-validator-identifier@7.25.9': {} 1515 | 1516 | '@babel/runtime@7.24.7': 1517 | dependencies: 1518 | regenerator-runtime: 0.14.1 1519 | 1520 | '@devicefarmer/adbkit-logcat@2.1.3': {} 1521 | 1522 | '@devicefarmer/adbkit-monkey@1.2.1': {} 1523 | 1524 | '@devicefarmer/adbkit@3.2.6': 1525 | dependencies: 1526 | '@devicefarmer/adbkit-logcat': 2.1.3 1527 | '@devicefarmer/adbkit-monkey': 1.2.1 1528 | bluebird: 3.7.2 1529 | commander: 9.5.0 1530 | debug: 4.3.7 1531 | node-forge: 1.3.1 1532 | split: 1.0.1 1533 | transitivePeerDependencies: 1534 | - supports-color 1535 | 1536 | '@esbuild/aix-ppc64@0.21.5': 1537 | optional: true 1538 | 1539 | '@esbuild/android-arm64@0.21.5': 1540 | optional: true 1541 | 1542 | '@esbuild/android-arm@0.21.5': 1543 | optional: true 1544 | 1545 | '@esbuild/android-x64@0.21.5': 1546 | optional: true 1547 | 1548 | '@esbuild/darwin-arm64@0.21.5': 1549 | optional: true 1550 | 1551 | '@esbuild/darwin-x64@0.21.5': 1552 | optional: true 1553 | 1554 | '@esbuild/freebsd-arm64@0.21.5': 1555 | optional: true 1556 | 1557 | '@esbuild/freebsd-x64@0.21.5': 1558 | optional: true 1559 | 1560 | '@esbuild/linux-arm64@0.21.5': 1561 | optional: true 1562 | 1563 | '@esbuild/linux-arm@0.21.5': 1564 | optional: true 1565 | 1566 | '@esbuild/linux-ia32@0.21.5': 1567 | optional: true 1568 | 1569 | '@esbuild/linux-loong64@0.21.5': 1570 | optional: true 1571 | 1572 | '@esbuild/linux-mips64el@0.21.5': 1573 | optional: true 1574 | 1575 | '@esbuild/linux-ppc64@0.21.5': 1576 | optional: true 1577 | 1578 | '@esbuild/linux-riscv64@0.21.5': 1579 | optional: true 1580 | 1581 | '@esbuild/linux-s390x@0.21.5': 1582 | optional: true 1583 | 1584 | '@esbuild/linux-x64@0.21.5': 1585 | optional: true 1586 | 1587 | '@esbuild/netbsd-x64@0.21.5': 1588 | optional: true 1589 | 1590 | '@esbuild/openbsd-x64@0.21.5': 1591 | optional: true 1592 | 1593 | '@esbuild/sunos-x64@0.21.5': 1594 | optional: true 1595 | 1596 | '@esbuild/win32-arm64@0.21.5': 1597 | optional: true 1598 | 1599 | '@esbuild/win32-ia32@0.21.5': 1600 | optional: true 1601 | 1602 | '@esbuild/win32-x64@0.21.5': 1603 | optional: true 1604 | 1605 | '@jridgewell/gen-mapping@0.3.8': 1606 | dependencies: 1607 | '@jridgewell/set-array': 1.2.1 1608 | '@jridgewell/sourcemap-codec': 1.5.0 1609 | '@jridgewell/trace-mapping': 0.3.25 1610 | 1611 | '@jridgewell/resolve-uri@3.1.2': {} 1612 | 1613 | '@jridgewell/set-array@1.2.1': {} 1614 | 1615 | '@jridgewell/sourcemap-codec@1.5.0': {} 1616 | 1617 | '@jridgewell/trace-mapping@0.3.25': 1618 | dependencies: 1619 | '@jridgewell/resolve-uri': 3.1.2 1620 | '@jridgewell/sourcemap-codec': 1.5.0 1621 | 1622 | '@pnpm/config.env-replace@1.1.0': {} 1623 | 1624 | '@pnpm/network.ca-file@1.0.2': 1625 | dependencies: 1626 | graceful-fs: 4.2.10 1627 | 1628 | '@pnpm/npm-conf@2.3.1': 1629 | dependencies: 1630 | '@pnpm/config.env-replace': 1.1.0 1631 | '@pnpm/network.ca-file': 1.0.2 1632 | config-chain: 1.1.13 1633 | 1634 | '@rollup/rollup-android-arm-eabi@4.39.0': 1635 | optional: true 1636 | 1637 | '@rollup/rollup-android-arm64@4.39.0': 1638 | optional: true 1639 | 1640 | '@rollup/rollup-darwin-arm64@4.39.0': 1641 | optional: true 1642 | 1643 | '@rollup/rollup-darwin-x64@4.39.0': 1644 | optional: true 1645 | 1646 | '@rollup/rollup-freebsd-arm64@4.39.0': 1647 | optional: true 1648 | 1649 | '@rollup/rollup-freebsd-x64@4.39.0': 1650 | optional: true 1651 | 1652 | '@rollup/rollup-linux-arm-gnueabihf@4.39.0': 1653 | optional: true 1654 | 1655 | '@rollup/rollup-linux-arm-musleabihf@4.39.0': 1656 | optional: true 1657 | 1658 | '@rollup/rollup-linux-arm64-gnu@4.39.0': 1659 | optional: true 1660 | 1661 | '@rollup/rollup-linux-arm64-musl@4.39.0': 1662 | optional: true 1663 | 1664 | '@rollup/rollup-linux-loongarch64-gnu@4.39.0': 1665 | optional: true 1666 | 1667 | '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': 1668 | optional: true 1669 | 1670 | '@rollup/rollup-linux-riscv64-gnu@4.39.0': 1671 | optional: true 1672 | 1673 | '@rollup/rollup-linux-riscv64-musl@4.39.0': 1674 | optional: true 1675 | 1676 | '@rollup/rollup-linux-s390x-gnu@4.39.0': 1677 | optional: true 1678 | 1679 | '@rollup/rollup-linux-x64-gnu@4.39.0': 1680 | optional: true 1681 | 1682 | '@rollup/rollup-linux-x64-musl@4.39.0': 1683 | optional: true 1684 | 1685 | '@rollup/rollup-win32-arm64-msvc@4.39.0': 1686 | optional: true 1687 | 1688 | '@rollup/rollup-win32-ia32-msvc@4.39.0': 1689 | optional: true 1690 | 1691 | '@rollup/rollup-win32-x64-msvc@4.39.0': 1692 | optional: true 1693 | 1694 | '@sindresorhus/is@5.6.0': {} 1695 | 1696 | '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': 1697 | dependencies: 1698 | acorn: 8.14.1 1699 | 1700 | '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.25.12)(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2)))(svelte@5.25.12)(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2))': 1701 | dependencies: 1702 | '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.25.12)(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2)) 1703 | debug: 4.4.0 1704 | svelte: 5.25.12 1705 | vite: 5.4.18(@types/node@22.14.0)(lightningcss@1.29.2) 1706 | transitivePeerDependencies: 1707 | - supports-color 1708 | 1709 | '@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.25.12)(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2))': 1710 | dependencies: 1711 | '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.25.12)(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2)))(svelte@5.25.12)(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2)) 1712 | debug: 4.4.0 1713 | deepmerge: 4.3.1 1714 | kleur: 4.1.5 1715 | magic-string: 0.30.17 1716 | svelte: 5.25.12 1717 | vite: 5.4.18(@types/node@22.14.0)(lightningcss@1.29.2) 1718 | vitefu: 1.0.6(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2)) 1719 | transitivePeerDependencies: 1720 | - supports-color 1721 | 1722 | '@szmarczak/http-timer@5.0.1': 1723 | dependencies: 1724 | defer-to-connect: 2.0.1 1725 | 1726 | '@tailwindcss/node@4.1.3': 1727 | dependencies: 1728 | enhanced-resolve: 5.18.1 1729 | jiti: 2.4.2 1730 | lightningcss: 1.29.2 1731 | tailwindcss: 4.1.3 1732 | 1733 | '@tailwindcss/oxide-android-arm64@4.1.3': 1734 | optional: true 1735 | 1736 | '@tailwindcss/oxide-darwin-arm64@4.1.3': 1737 | optional: true 1738 | 1739 | '@tailwindcss/oxide-darwin-x64@4.1.3': 1740 | optional: true 1741 | 1742 | '@tailwindcss/oxide-freebsd-x64@4.1.3': 1743 | optional: true 1744 | 1745 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.3': 1746 | optional: true 1747 | 1748 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.3': 1749 | optional: true 1750 | 1751 | '@tailwindcss/oxide-linux-arm64-musl@4.1.3': 1752 | optional: true 1753 | 1754 | '@tailwindcss/oxide-linux-x64-gnu@4.1.3': 1755 | optional: true 1756 | 1757 | '@tailwindcss/oxide-linux-x64-musl@4.1.3': 1758 | optional: true 1759 | 1760 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.3': 1761 | optional: true 1762 | 1763 | '@tailwindcss/oxide-win32-x64-msvc@4.1.3': 1764 | optional: true 1765 | 1766 | '@tailwindcss/oxide@4.1.3': 1767 | optionalDependencies: 1768 | '@tailwindcss/oxide-android-arm64': 4.1.3 1769 | '@tailwindcss/oxide-darwin-arm64': 4.1.3 1770 | '@tailwindcss/oxide-darwin-x64': 4.1.3 1771 | '@tailwindcss/oxide-freebsd-x64': 4.1.3 1772 | '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.3 1773 | '@tailwindcss/oxide-linux-arm64-gnu': 4.1.3 1774 | '@tailwindcss/oxide-linux-arm64-musl': 4.1.3 1775 | '@tailwindcss/oxide-linux-x64-gnu': 4.1.3 1776 | '@tailwindcss/oxide-linux-x64-musl': 4.1.3 1777 | '@tailwindcss/oxide-win32-arm64-msvc': 4.1.3 1778 | '@tailwindcss/oxide-win32-x64-msvc': 4.1.3 1779 | 1780 | '@tailwindcss/vite@4.1.3(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2))': 1781 | dependencies: 1782 | '@tailwindcss/node': 4.1.3 1783 | '@tailwindcss/oxide': 4.1.3 1784 | tailwindcss: 4.1.3 1785 | vite: 5.4.18(@types/node@22.14.0)(lightningcss@1.29.2) 1786 | 1787 | '@types/chrome@0.0.315': 1788 | dependencies: 1789 | '@types/filesystem': 0.0.36 1790 | '@types/har-format': 1.2.16 1791 | 1792 | '@types/estree@1.0.7': {} 1793 | 1794 | '@types/filesystem@0.0.36': 1795 | dependencies: 1796 | '@types/filewriter': 0.0.33 1797 | 1798 | '@types/filewriter@0.0.33': {} 1799 | 1800 | '@types/har-format@1.2.16': {} 1801 | 1802 | '@types/http-cache-semantics@4.0.4': {} 1803 | 1804 | '@types/minimatch@3.0.5': {} 1805 | 1806 | '@types/node@22.14.0': 1807 | dependencies: 1808 | undici-types: 6.21.0 1809 | 1810 | acorn@8.14.1: {} 1811 | 1812 | adm-zip@0.5.16: {} 1813 | 1814 | ajv@8.17.1: 1815 | dependencies: 1816 | fast-deep-equal: 3.1.3 1817 | fast-uri: 3.0.6 1818 | json-schema-traverse: 1.0.0 1819 | require-from-string: 2.0.2 1820 | 1821 | ansi-align@3.0.1: 1822 | dependencies: 1823 | string-width: 4.2.3 1824 | 1825 | ansi-regex@5.0.1: {} 1826 | 1827 | ansi-regex@6.1.0: {} 1828 | 1829 | ansi-styles@6.2.1: {} 1830 | 1831 | any-promise@1.3.0: {} 1832 | 1833 | aria-query@5.3.2: {} 1834 | 1835 | array-differ@4.0.0: {} 1836 | 1837 | array-union@3.0.1: {} 1838 | 1839 | async-lock@1.4.1: {} 1840 | 1841 | async@3.2.6: {} 1842 | 1843 | at-least-node@1.0.0: {} 1844 | 1845 | axobject-query@4.1.0: {} 1846 | 1847 | balanced-match@1.0.2: {} 1848 | 1849 | bluebird@3.7.2: {} 1850 | 1851 | boolbase@1.0.0: {} 1852 | 1853 | boxen@7.1.1: 1854 | dependencies: 1855 | ansi-align: 3.0.1 1856 | camelcase: 7.0.1 1857 | chalk: 5.4.1 1858 | cli-boxes: 3.0.0 1859 | string-width: 5.1.2 1860 | type-fest: 2.19.0 1861 | widest-line: 4.0.1 1862 | wrap-ansi: 8.1.0 1863 | 1864 | brace-expansion@1.1.11: 1865 | dependencies: 1866 | balanced-match: 1.0.2 1867 | concat-map: 0.0.1 1868 | 1869 | buffer-from@1.1.2: {} 1870 | 1871 | bunyan@1.8.15: 1872 | optionalDependencies: 1873 | dtrace-provider: 0.8.8 1874 | moment: 2.30.1 1875 | mv: 2.1.1 1876 | safe-json-stringify: 1.2.0 1877 | 1878 | cacheable-lookup@7.0.0: {} 1879 | 1880 | cacheable-request@10.2.14: 1881 | dependencies: 1882 | '@types/http-cache-semantics': 4.0.4 1883 | get-stream: 6.0.1 1884 | http-cache-semantics: 4.1.1 1885 | keyv: 4.5.4 1886 | mimic-response: 4.0.0 1887 | normalize-url: 8.0.1 1888 | responselike: 3.0.0 1889 | 1890 | camelcase@7.0.1: {} 1891 | 1892 | chalk@5.4.1: {} 1893 | 1894 | charenc@0.0.2: {} 1895 | 1896 | chrome-launcher@1.1.0: 1897 | dependencies: 1898 | '@types/node': 22.14.0 1899 | escape-string-regexp: 4.0.0 1900 | is-wsl: 2.2.0 1901 | lighthouse-logger: 2.0.1 1902 | transitivePeerDependencies: 1903 | - supports-color 1904 | 1905 | ci-info@3.9.0: {} 1906 | 1907 | cli-boxes@3.0.0: {} 1908 | 1909 | clsx@2.1.1: {} 1910 | 1911 | commander@2.9.0: 1912 | dependencies: 1913 | graceful-readlink: 1.0.1 1914 | 1915 | commander@9.5.0: {} 1916 | 1917 | concat-map@0.0.1: {} 1918 | 1919 | concat-stream@1.6.2: 1920 | dependencies: 1921 | buffer-from: 1.1.2 1922 | inherits: 2.0.4 1923 | readable-stream: 2.3.8 1924 | typedarray: 0.0.6 1925 | 1926 | config-chain@1.1.13: 1927 | dependencies: 1928 | ini: 1.3.8 1929 | proto-list: 1.2.4 1930 | 1931 | configstore@6.0.0: 1932 | dependencies: 1933 | dot-prop: 6.0.1 1934 | graceful-fs: 4.2.11 1935 | unique-string: 3.0.0 1936 | write-file-atomic: 3.0.3 1937 | xdg-basedir: 5.1.0 1938 | 1939 | core-util-is@1.0.3: {} 1940 | 1941 | crypt@0.0.2: {} 1942 | 1943 | crypto-random-string@4.0.0: 1944 | dependencies: 1945 | type-fest: 1.4.0 1946 | 1947 | css-select@5.1.0: 1948 | dependencies: 1949 | boolbase: 1.0.0 1950 | css-what: 6.1.0 1951 | domhandler: 5.0.3 1952 | domutils: 3.2.2 1953 | nth-check: 2.1.1 1954 | 1955 | css-what@6.1.0: {} 1956 | 1957 | cssom@0.5.0: {} 1958 | 1959 | debounce@1.2.1: {} 1960 | 1961 | debug@2.6.9: 1962 | dependencies: 1963 | ms: 2.0.0 1964 | 1965 | debug@4.3.7: 1966 | dependencies: 1967 | ms: 2.1.3 1968 | 1969 | debug@4.4.0: 1970 | dependencies: 1971 | ms: 2.1.3 1972 | 1973 | decompress-response@6.0.0: 1974 | dependencies: 1975 | mimic-response: 3.1.0 1976 | 1977 | deep-extend@0.6.0: {} 1978 | 1979 | deepmerge@4.3.1: {} 1980 | 1981 | defer-to-connect@2.0.1: {} 1982 | 1983 | detect-libc@2.0.3: {} 1984 | 1985 | dom-serializer@2.0.0: 1986 | dependencies: 1987 | domelementtype: 2.3.0 1988 | domhandler: 5.0.3 1989 | entities: 4.5.0 1990 | 1991 | domelementtype@2.3.0: {} 1992 | 1993 | domhandler@5.0.3: 1994 | dependencies: 1995 | domelementtype: 2.3.0 1996 | 1997 | domutils@3.2.2: 1998 | dependencies: 1999 | dom-serializer: 2.0.0 2000 | domelementtype: 2.3.0 2001 | domhandler: 5.0.3 2002 | 2003 | dot-prop@6.0.1: 2004 | dependencies: 2005 | is-obj: 2.0.0 2006 | 2007 | dtrace-provider@0.8.8: 2008 | dependencies: 2009 | nan: 2.22.2 2010 | optional: true 2011 | 2012 | eastasianwidth@0.2.0: {} 2013 | 2014 | emoji-regex@8.0.0: {} 2015 | 2016 | emoji-regex@9.2.2: {} 2017 | 2018 | enhanced-resolve@5.18.1: 2019 | dependencies: 2020 | graceful-fs: 4.2.11 2021 | tapable: 2.2.1 2022 | 2023 | entities@4.5.0: {} 2024 | 2025 | error-ex@1.3.2: 2026 | dependencies: 2027 | is-arrayish: 0.2.1 2028 | 2029 | es6-error@4.1.1: {} 2030 | 2031 | esbuild@0.21.5: 2032 | optionalDependencies: 2033 | '@esbuild/aix-ppc64': 0.21.5 2034 | '@esbuild/android-arm': 0.21.5 2035 | '@esbuild/android-arm64': 0.21.5 2036 | '@esbuild/android-x64': 0.21.5 2037 | '@esbuild/darwin-arm64': 0.21.5 2038 | '@esbuild/darwin-x64': 0.21.5 2039 | '@esbuild/freebsd-arm64': 0.21.5 2040 | '@esbuild/freebsd-x64': 0.21.5 2041 | '@esbuild/linux-arm': 0.21.5 2042 | '@esbuild/linux-arm64': 0.21.5 2043 | '@esbuild/linux-ia32': 0.21.5 2044 | '@esbuild/linux-loong64': 0.21.5 2045 | '@esbuild/linux-mips64el': 0.21.5 2046 | '@esbuild/linux-ppc64': 0.21.5 2047 | '@esbuild/linux-riscv64': 0.21.5 2048 | '@esbuild/linux-s390x': 0.21.5 2049 | '@esbuild/linux-x64': 0.21.5 2050 | '@esbuild/netbsd-x64': 0.21.5 2051 | '@esbuild/openbsd-x64': 0.21.5 2052 | '@esbuild/sunos-x64': 0.21.5 2053 | '@esbuild/win32-arm64': 0.21.5 2054 | '@esbuild/win32-ia32': 0.21.5 2055 | '@esbuild/win32-x64': 0.21.5 2056 | 2057 | escape-goat@4.0.0: {} 2058 | 2059 | escape-string-regexp@4.0.0: {} 2060 | 2061 | esm-env@1.2.2: {} 2062 | 2063 | esrap@1.4.6: 2064 | dependencies: 2065 | '@jridgewell/sourcemap-codec': 1.5.0 2066 | 2067 | fast-deep-equal@3.1.3: {} 2068 | 2069 | fast-uri@3.0.6: {} 2070 | 2071 | firefox-profile@4.6.0: 2072 | dependencies: 2073 | adm-zip: 0.5.16 2074 | fs-extra: 9.0.1 2075 | ini: 2.0.0 2076 | minimist: 1.2.8 2077 | xml2js: 0.5.0 2078 | 2079 | form-data-encoder@2.1.4: {} 2080 | 2081 | fs-extra@10.1.0: 2082 | dependencies: 2083 | graceful-fs: 4.2.11 2084 | jsonfile: 6.1.0 2085 | universalify: 2.0.1 2086 | 2087 | fs-extra@11.2.0: 2088 | dependencies: 2089 | graceful-fs: 4.2.11 2090 | jsonfile: 6.1.0 2091 | universalify: 2.0.1 2092 | 2093 | fs-extra@9.0.1: 2094 | dependencies: 2095 | at-least-node: 1.0.0 2096 | graceful-fs: 4.2.11 2097 | jsonfile: 6.1.0 2098 | universalify: 1.0.0 2099 | 2100 | fsevents@2.3.3: 2101 | optional: true 2102 | 2103 | fx-runner@1.4.0: 2104 | dependencies: 2105 | commander: 2.9.0 2106 | shell-quote: 1.7.3 2107 | spawn-sync: 1.0.15 2108 | when: 3.7.7 2109 | which: 1.2.4 2110 | winreg: 0.0.12 2111 | 2112 | get-stream@6.0.1: {} 2113 | 2114 | glob-to-regexp@0.4.1: {} 2115 | 2116 | glob@6.0.4: 2117 | dependencies: 2118 | inflight: 1.0.6 2119 | inherits: 2.0.4 2120 | minimatch: 3.1.2 2121 | once: 1.4.0 2122 | path-is-absolute: 1.0.1 2123 | optional: true 2124 | 2125 | global-dirs@3.0.1: 2126 | dependencies: 2127 | ini: 2.0.0 2128 | 2129 | got@12.6.1: 2130 | dependencies: 2131 | '@sindresorhus/is': 5.6.0 2132 | '@szmarczak/http-timer': 5.0.1 2133 | cacheable-lookup: 7.0.0 2134 | cacheable-request: 10.2.14 2135 | decompress-response: 6.0.0 2136 | form-data-encoder: 2.1.4 2137 | get-stream: 6.0.1 2138 | http2-wrapper: 2.2.1 2139 | lowercase-keys: 3.0.0 2140 | p-cancelable: 3.0.0 2141 | responselike: 3.0.0 2142 | 2143 | graceful-fs@4.2.10: {} 2144 | 2145 | graceful-fs@4.2.11: {} 2146 | 2147 | graceful-readlink@1.0.1: {} 2148 | 2149 | growly@1.3.0: {} 2150 | 2151 | has-yarn@3.0.0: {} 2152 | 2153 | html-escaper@3.0.3: {} 2154 | 2155 | htmlparser2@8.0.2: 2156 | dependencies: 2157 | domelementtype: 2.3.0 2158 | domhandler: 5.0.3 2159 | domutils: 3.2.2 2160 | entities: 4.5.0 2161 | 2162 | http-cache-semantics@4.1.1: {} 2163 | 2164 | http2-wrapper@2.2.1: 2165 | dependencies: 2166 | quick-lru: 5.1.1 2167 | resolve-alpn: 1.2.1 2168 | 2169 | immediate@3.0.6: {} 2170 | 2171 | import-lazy@4.0.0: {} 2172 | 2173 | imurmurhash@0.1.4: {} 2174 | 2175 | inflight@1.0.6: 2176 | dependencies: 2177 | once: 1.4.0 2178 | wrappy: 1.0.2 2179 | optional: true 2180 | 2181 | inherits@2.0.4: {} 2182 | 2183 | ini@1.3.8: {} 2184 | 2185 | ini@2.0.0: {} 2186 | 2187 | is-absolute@0.1.7: 2188 | dependencies: 2189 | is-relative: 0.1.3 2190 | 2191 | is-arrayish@0.2.1: {} 2192 | 2193 | is-buffer@1.1.6: {} 2194 | 2195 | is-ci@3.0.1: 2196 | dependencies: 2197 | ci-info: 3.9.0 2198 | 2199 | is-docker@2.2.1: {} 2200 | 2201 | is-fullwidth-code-point@3.0.0: {} 2202 | 2203 | is-installed-globally@0.4.0: 2204 | dependencies: 2205 | global-dirs: 3.0.1 2206 | is-path-inside: 3.0.3 2207 | 2208 | is-npm@6.0.0: {} 2209 | 2210 | is-obj@2.0.0: {} 2211 | 2212 | is-path-inside@3.0.3: {} 2213 | 2214 | is-plain-object@2.0.4: 2215 | dependencies: 2216 | isobject: 3.0.1 2217 | 2218 | is-primitive@3.0.1: {} 2219 | 2220 | is-reference@3.0.3: 2221 | dependencies: 2222 | '@types/estree': 1.0.7 2223 | 2224 | is-relative@0.1.3: {} 2225 | 2226 | is-typedarray@1.0.0: {} 2227 | 2228 | is-wsl@2.2.0: 2229 | dependencies: 2230 | is-docker: 2.2.1 2231 | 2232 | is-yarn-global@0.4.1: {} 2233 | 2234 | isarray@1.0.0: {} 2235 | 2236 | isexe@1.1.2: {} 2237 | 2238 | isexe@2.0.0: {} 2239 | 2240 | isobject@3.0.1: {} 2241 | 2242 | jiti@2.4.2: {} 2243 | 2244 | js-tokens@4.0.0: {} 2245 | 2246 | json-buffer@3.0.1: {} 2247 | 2248 | json-parse-even-better-errors@3.0.2: {} 2249 | 2250 | json-schema-traverse@1.0.0: {} 2251 | 2252 | json5@2.2.3: {} 2253 | 2254 | jsonfile@6.1.0: 2255 | dependencies: 2256 | universalify: 2.0.1 2257 | optionalDependencies: 2258 | graceful-fs: 4.2.11 2259 | 2260 | jszip@3.10.1: 2261 | dependencies: 2262 | lie: 3.3.0 2263 | pako: 1.0.11 2264 | readable-stream: 2.3.8 2265 | setimmediate: 1.0.5 2266 | 2267 | keyv@4.5.4: 2268 | dependencies: 2269 | json-buffer: 3.0.1 2270 | 2271 | kleur@4.1.5: {} 2272 | 2273 | latest-version@7.0.0: 2274 | dependencies: 2275 | package-json: 8.1.1 2276 | 2277 | lie@3.3.0: 2278 | dependencies: 2279 | immediate: 3.0.6 2280 | 2281 | lighthouse-logger@2.0.1: 2282 | dependencies: 2283 | debug: 2.6.9 2284 | marky: 1.2.5 2285 | transitivePeerDependencies: 2286 | - supports-color 2287 | 2288 | lightningcss-darwin-arm64@1.29.2: 2289 | optional: true 2290 | 2291 | lightningcss-darwin-x64@1.29.2: 2292 | optional: true 2293 | 2294 | lightningcss-freebsd-x64@1.29.2: 2295 | optional: true 2296 | 2297 | lightningcss-linux-arm-gnueabihf@1.29.2: 2298 | optional: true 2299 | 2300 | lightningcss-linux-arm64-gnu@1.29.2: 2301 | optional: true 2302 | 2303 | lightningcss-linux-arm64-musl@1.29.2: 2304 | optional: true 2305 | 2306 | lightningcss-linux-x64-gnu@1.29.2: 2307 | optional: true 2308 | 2309 | lightningcss-linux-x64-musl@1.29.2: 2310 | optional: true 2311 | 2312 | lightningcss-win32-arm64-msvc@1.29.2: 2313 | optional: true 2314 | 2315 | lightningcss-win32-x64-msvc@1.29.2: 2316 | optional: true 2317 | 2318 | lightningcss@1.29.2: 2319 | dependencies: 2320 | detect-libc: 2.0.3 2321 | optionalDependencies: 2322 | lightningcss-darwin-arm64: 1.29.2 2323 | lightningcss-darwin-x64: 1.29.2 2324 | lightningcss-freebsd-x64: 1.29.2 2325 | lightningcss-linux-arm-gnueabihf: 1.29.2 2326 | lightningcss-linux-arm64-gnu: 1.29.2 2327 | lightningcss-linux-arm64-musl: 1.29.2 2328 | lightningcss-linux-x64-gnu: 1.29.2 2329 | lightningcss-linux-x64-musl: 1.29.2 2330 | lightningcss-win32-arm64-msvc: 1.29.2 2331 | lightningcss-win32-x64-msvc: 1.29.2 2332 | 2333 | lines-and-columns@2.0.4: {} 2334 | 2335 | linkedom@0.14.26: 2336 | dependencies: 2337 | css-select: 5.1.0 2338 | cssom: 0.5.0 2339 | html-escaper: 3.0.3 2340 | htmlparser2: 8.0.2 2341 | uhyphen: 0.2.0 2342 | 2343 | locate-character@3.0.0: {} 2344 | 2345 | lodash.uniq@4.5.0: {} 2346 | 2347 | lodash.uniqby@4.7.0: {} 2348 | 2349 | lowercase-keys@3.0.0: {} 2350 | 2351 | magic-string@0.30.17: 2352 | dependencies: 2353 | '@jridgewell/sourcemap-codec': 1.5.0 2354 | 2355 | make-error@1.3.6: {} 2356 | 2357 | marky@1.2.5: {} 2358 | 2359 | md5@2.3.0: 2360 | dependencies: 2361 | charenc: 0.0.2 2362 | crypt: 0.0.2 2363 | is-buffer: 1.1.6 2364 | 2365 | mimic-response@3.1.0: {} 2366 | 2367 | mimic-response@4.0.0: {} 2368 | 2369 | minimatch@3.1.2: 2370 | dependencies: 2371 | brace-expansion: 1.1.11 2372 | 2373 | minimist@1.2.8: {} 2374 | 2375 | mkdirp@0.5.6: 2376 | dependencies: 2377 | minimist: 1.2.8 2378 | optional: true 2379 | 2380 | mkdirp@3.0.1: {} 2381 | 2382 | moment@2.30.1: 2383 | optional: true 2384 | 2385 | ms@2.0.0: {} 2386 | 2387 | ms@2.1.3: {} 2388 | 2389 | multimatch@6.0.0: 2390 | dependencies: 2391 | '@types/minimatch': 3.0.5 2392 | array-differ: 4.0.0 2393 | array-union: 3.0.1 2394 | minimatch: 3.1.2 2395 | 2396 | mv@2.1.1: 2397 | dependencies: 2398 | mkdirp: 0.5.6 2399 | ncp: 2.0.0 2400 | rimraf: 2.4.5 2401 | optional: true 2402 | 2403 | mz@2.7.0: 2404 | dependencies: 2405 | any-promise: 1.3.0 2406 | object-assign: 4.1.1 2407 | thenify-all: 1.6.0 2408 | 2409 | nan@2.22.2: 2410 | optional: true 2411 | 2412 | nanoid@3.3.11: {} 2413 | 2414 | ncp@2.0.0: 2415 | optional: true 2416 | 2417 | node-forge@1.3.1: {} 2418 | 2419 | node-notifier@10.0.1: 2420 | dependencies: 2421 | growly: 1.3.0 2422 | is-wsl: 2.2.0 2423 | semver: 7.7.1 2424 | shellwords: 0.1.1 2425 | uuid: 8.3.2 2426 | which: 2.0.2 2427 | 2428 | normalize-url@8.0.1: {} 2429 | 2430 | nth-check@2.1.1: 2431 | dependencies: 2432 | boolbase: 1.0.0 2433 | 2434 | object-assign@4.1.1: {} 2435 | 2436 | once@1.4.0: 2437 | dependencies: 2438 | wrappy: 1.0.2 2439 | optional: true 2440 | 2441 | os-shim@0.1.3: {} 2442 | 2443 | p-cancelable@3.0.0: {} 2444 | 2445 | package-json@8.1.1: 2446 | dependencies: 2447 | got: 12.6.1 2448 | registry-auth-token: 5.1.0 2449 | registry-url: 6.0.1 2450 | semver: 7.7.1 2451 | 2452 | pako@1.0.11: {} 2453 | 2454 | parse-json@7.1.1: 2455 | dependencies: 2456 | '@babel/code-frame': 7.26.2 2457 | error-ex: 1.3.2 2458 | json-parse-even-better-errors: 3.0.2 2459 | lines-and-columns: 2.0.4 2460 | type-fest: 3.13.1 2461 | 2462 | path-is-absolute@1.0.1: 2463 | optional: true 2464 | 2465 | picocolors@1.1.1: {} 2466 | 2467 | postcss@8.5.3: 2468 | dependencies: 2469 | nanoid: 3.3.11 2470 | picocolors: 1.1.1 2471 | source-map-js: 1.2.1 2472 | 2473 | process-nextick-args@2.0.1: {} 2474 | 2475 | promise-toolbox@0.21.0: 2476 | dependencies: 2477 | make-error: 1.3.6 2478 | 2479 | proto-list@1.2.4: {} 2480 | 2481 | pupa@3.1.0: 2482 | dependencies: 2483 | escape-goat: 4.0.0 2484 | 2485 | quick-lru@5.1.1: {} 2486 | 2487 | rc@1.2.8: 2488 | dependencies: 2489 | deep-extend: 0.6.0 2490 | ini: 1.3.8 2491 | minimist: 1.2.8 2492 | strip-json-comments: 2.0.1 2493 | 2494 | readable-stream@2.3.8: 2495 | dependencies: 2496 | core-util-is: 1.0.3 2497 | inherits: 2.0.4 2498 | isarray: 1.0.0 2499 | process-nextick-args: 2.0.1 2500 | safe-buffer: 5.1.2 2501 | string_decoder: 1.1.1 2502 | util-deprecate: 1.0.2 2503 | 2504 | regenerator-runtime@0.14.1: {} 2505 | 2506 | registry-auth-token@5.1.0: 2507 | dependencies: 2508 | '@pnpm/npm-conf': 2.3.1 2509 | 2510 | registry-url@6.0.1: 2511 | dependencies: 2512 | rc: 1.2.8 2513 | 2514 | require-from-string@2.0.2: {} 2515 | 2516 | resolve-alpn@1.2.1: {} 2517 | 2518 | responselike@3.0.0: 2519 | dependencies: 2520 | lowercase-keys: 3.0.0 2521 | 2522 | rimraf@2.4.5: 2523 | dependencies: 2524 | glob: 6.0.4 2525 | optional: true 2526 | 2527 | rollup@4.39.0: 2528 | dependencies: 2529 | '@types/estree': 1.0.7 2530 | optionalDependencies: 2531 | '@rollup/rollup-android-arm-eabi': 4.39.0 2532 | '@rollup/rollup-android-arm64': 4.39.0 2533 | '@rollup/rollup-darwin-arm64': 4.39.0 2534 | '@rollup/rollup-darwin-x64': 4.39.0 2535 | '@rollup/rollup-freebsd-arm64': 4.39.0 2536 | '@rollup/rollup-freebsd-x64': 4.39.0 2537 | '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 2538 | '@rollup/rollup-linux-arm-musleabihf': 4.39.0 2539 | '@rollup/rollup-linux-arm64-gnu': 4.39.0 2540 | '@rollup/rollup-linux-arm64-musl': 4.39.0 2541 | '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 2542 | '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 2543 | '@rollup/rollup-linux-riscv64-gnu': 4.39.0 2544 | '@rollup/rollup-linux-riscv64-musl': 4.39.0 2545 | '@rollup/rollup-linux-s390x-gnu': 4.39.0 2546 | '@rollup/rollup-linux-x64-gnu': 4.39.0 2547 | '@rollup/rollup-linux-x64-musl': 4.39.0 2548 | '@rollup/rollup-win32-arm64-msvc': 4.39.0 2549 | '@rollup/rollup-win32-ia32-msvc': 4.39.0 2550 | '@rollup/rollup-win32-x64-msvc': 4.39.0 2551 | fsevents: 2.3.3 2552 | 2553 | safe-buffer@5.1.2: {} 2554 | 2555 | safe-json-stringify@1.2.0: 2556 | optional: true 2557 | 2558 | sax@1.4.1: {} 2559 | 2560 | semver-diff@4.0.0: 2561 | dependencies: 2562 | semver: 7.7.1 2563 | 2564 | semver@7.7.1: {} 2565 | 2566 | set-value@4.1.0: 2567 | dependencies: 2568 | is-plain-object: 2.0.4 2569 | is-primitive: 3.0.1 2570 | 2571 | setimmediate@1.0.5: {} 2572 | 2573 | shell-quote@1.7.3: {} 2574 | 2575 | shellwords@0.1.1: {} 2576 | 2577 | signal-exit@3.0.7: {} 2578 | 2579 | source-map-js@1.2.1: {} 2580 | 2581 | source-map-support@0.5.21: 2582 | dependencies: 2583 | buffer-from: 1.1.2 2584 | source-map: 0.6.1 2585 | 2586 | source-map@0.6.1: {} 2587 | 2588 | spawn-sync@1.0.15: 2589 | dependencies: 2590 | concat-stream: 1.6.2 2591 | os-shim: 0.1.3 2592 | 2593 | split@1.0.1: 2594 | dependencies: 2595 | through: 2.3.8 2596 | 2597 | string-width@4.2.3: 2598 | dependencies: 2599 | emoji-regex: 8.0.0 2600 | is-fullwidth-code-point: 3.0.0 2601 | strip-ansi: 6.0.1 2602 | 2603 | string-width@5.1.2: 2604 | dependencies: 2605 | eastasianwidth: 0.2.0 2606 | emoji-regex: 9.2.2 2607 | strip-ansi: 7.1.0 2608 | 2609 | string_decoder@1.1.1: 2610 | dependencies: 2611 | safe-buffer: 5.1.2 2612 | 2613 | strip-ansi@6.0.1: 2614 | dependencies: 2615 | ansi-regex: 5.0.1 2616 | 2617 | strip-ansi@7.1.0: 2618 | dependencies: 2619 | ansi-regex: 6.1.0 2620 | 2621 | strip-bom@5.0.0: {} 2622 | 2623 | strip-json-comments@2.0.1: {} 2624 | 2625 | strip-json-comments@5.0.1: {} 2626 | 2627 | svelte@5.25.12: 2628 | dependencies: 2629 | '@ampproject/remapping': 2.3.0 2630 | '@jridgewell/sourcemap-codec': 1.5.0 2631 | '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) 2632 | '@types/estree': 1.0.7 2633 | acorn: 8.14.1 2634 | aria-query: 5.3.2 2635 | axobject-query: 4.1.0 2636 | clsx: 2.1.1 2637 | esm-env: 1.2.2 2638 | esrap: 1.4.6 2639 | is-reference: 3.0.3 2640 | locate-character: 3.0.0 2641 | magic-string: 0.30.17 2642 | zimmerframe: 1.1.2 2643 | 2644 | tailwindcss@4.1.3: {} 2645 | 2646 | tapable@2.2.1: {} 2647 | 2648 | thenify-all@1.6.0: 2649 | dependencies: 2650 | thenify: 3.3.1 2651 | 2652 | thenify@3.3.1: 2653 | dependencies: 2654 | any-promise: 1.3.0 2655 | 2656 | through@2.3.8: {} 2657 | 2658 | tmp@0.2.3: {} 2659 | 2660 | type-fest@1.4.0: {} 2661 | 2662 | type-fest@2.19.0: {} 2663 | 2664 | type-fest@3.13.1: {} 2665 | 2666 | typedarray-to-buffer@3.1.5: 2667 | dependencies: 2668 | is-typedarray: 1.0.0 2669 | 2670 | typedarray@0.0.6: {} 2671 | 2672 | uhyphen@0.2.0: {} 2673 | 2674 | undici-types@6.21.0: {} 2675 | 2676 | unique-string@3.0.0: 2677 | dependencies: 2678 | crypto-random-string: 4.0.0 2679 | 2680 | universalify@1.0.0: {} 2681 | 2682 | universalify@2.0.1: {} 2683 | 2684 | update-notifier@6.0.2: 2685 | dependencies: 2686 | boxen: 7.1.1 2687 | chalk: 5.4.1 2688 | configstore: 6.0.0 2689 | has-yarn: 3.0.0 2690 | import-lazy: 4.0.0 2691 | is-ci: 3.0.1 2692 | is-installed-globally: 0.4.0 2693 | is-npm: 6.0.0 2694 | is-yarn-global: 0.4.1 2695 | latest-version: 7.0.0 2696 | pupa: 3.1.0 2697 | semver: 7.7.1 2698 | semver-diff: 4.0.0 2699 | xdg-basedir: 5.1.0 2700 | 2701 | util-deprecate@1.0.2: {} 2702 | 2703 | uuid@8.3.2: {} 2704 | 2705 | vite-plugin-web-extension@4.4.3(@types/node@22.14.0)(lightningcss@1.29.2): 2706 | dependencies: 2707 | ajv: 8.17.1 2708 | async-lock: 1.4.1 2709 | fs-extra: 10.1.0 2710 | json5: 2.2.3 2711 | linkedom: 0.14.26 2712 | lodash.uniq: 4.5.0 2713 | lodash.uniqby: 4.7.0 2714 | md5: 2.3.0 2715 | vite: 5.4.18(@types/node@22.14.0)(lightningcss@1.29.2) 2716 | web-ext-option-types: 8.3.1 2717 | web-ext-run: 0.2.2 2718 | webextension-polyfill: 0.10.0 2719 | yaml: 2.7.1 2720 | transitivePeerDependencies: 2721 | - '@types/node' 2722 | - bufferutil 2723 | - less 2724 | - lightningcss 2725 | - sass 2726 | - sass-embedded 2727 | - stylus 2728 | - sugarss 2729 | - supports-color 2730 | - terser 2731 | - utf-8-validate 2732 | 2733 | vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2): 2734 | dependencies: 2735 | esbuild: 0.21.5 2736 | postcss: 8.5.3 2737 | rollup: 4.39.0 2738 | optionalDependencies: 2739 | '@types/node': 22.14.0 2740 | fsevents: 2.3.3 2741 | lightningcss: 1.29.2 2742 | 2743 | vitefu@1.0.6(vite@5.4.18(@types/node@22.14.0)(lightningcss@1.29.2)): 2744 | optionalDependencies: 2745 | vite: 5.4.18(@types/node@22.14.0)(lightningcss@1.29.2) 2746 | 2747 | watchpack@2.4.1: 2748 | dependencies: 2749 | glob-to-regexp: 0.4.1 2750 | graceful-fs: 4.2.11 2751 | 2752 | web-ext-option-types@8.3.1: {} 2753 | 2754 | web-ext-run@0.2.2: 2755 | dependencies: 2756 | '@babel/runtime': 7.24.7 2757 | '@devicefarmer/adbkit': 3.2.6 2758 | bunyan: 1.8.15 2759 | chrome-launcher: 1.1.0 2760 | debounce: 1.2.1 2761 | es6-error: 4.1.1 2762 | firefox-profile: 4.6.0 2763 | fs-extra: 11.2.0 2764 | fx-runner: 1.4.0 2765 | mkdirp: 3.0.1 2766 | multimatch: 6.0.0 2767 | mz: 2.7.0 2768 | node-notifier: 10.0.1 2769 | parse-json: 7.1.1 2770 | promise-toolbox: 0.21.0 2771 | set-value: 4.1.0 2772 | source-map-support: 0.5.21 2773 | strip-bom: 5.0.0 2774 | strip-json-comments: 5.0.1 2775 | tmp: 0.2.3 2776 | update-notifier: 6.0.2 2777 | watchpack: 2.4.1 2778 | ws: 8.18.0 2779 | zip-dir: 2.0.0 2780 | transitivePeerDependencies: 2781 | - bufferutil 2782 | - supports-color 2783 | - utf-8-validate 2784 | 2785 | webextension-polyfill@0.10.0: {} 2786 | 2787 | when@3.7.7: {} 2788 | 2789 | which@1.2.4: 2790 | dependencies: 2791 | is-absolute: 0.1.7 2792 | isexe: 1.1.2 2793 | 2794 | which@2.0.2: 2795 | dependencies: 2796 | isexe: 2.0.0 2797 | 2798 | widest-line@4.0.1: 2799 | dependencies: 2800 | string-width: 5.1.2 2801 | 2802 | winreg@0.0.12: {} 2803 | 2804 | wrap-ansi@8.1.0: 2805 | dependencies: 2806 | ansi-styles: 6.2.1 2807 | string-width: 5.1.2 2808 | strip-ansi: 7.1.0 2809 | 2810 | wrappy@1.0.2: 2811 | optional: true 2812 | 2813 | write-file-atomic@3.0.3: 2814 | dependencies: 2815 | imurmurhash: 0.1.4 2816 | is-typedarray: 1.0.0 2817 | signal-exit: 3.0.7 2818 | typedarray-to-buffer: 3.1.5 2819 | 2820 | ws@8.18.0: {} 2821 | 2822 | xdg-basedir@5.1.0: {} 2823 | 2824 | xml2js@0.5.0: 2825 | dependencies: 2826 | sax: 1.4.1 2827 | xmlbuilder: 11.0.1 2828 | 2829 | xmlbuilder@11.0.1: {} 2830 | 2831 | yaml@2.7.1: {} 2832 | 2833 | zimmerframe@1.1.2: {} 2834 | 2835 | zip-dir@2.0.0: 2836 | dependencies: 2837 | async: 3.2.6 2838 | jszip: 3.10.1 2839 | -------------------------------------------------------------------------------- /public/icon/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dnakov/claude-mcp/39264c0e2ebcbd8195d58c7a088bd4a8d762c5ef/public/icon/128.png -------------------------------------------------------------------------------- /public/icon/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dnakov/claude-mcp/39264c0e2ebcbd8195d58c7a088bd4a8d762c5ef/public/icon/16.png -------------------------------------------------------------------------------- /public/icon/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dnakov/claude-mcp/39264c0e2ebcbd8195d58c7a088bd4a8d762c5ef/public/icon/32.png -------------------------------------------------------------------------------- /public/icon/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dnakov/claude-mcp/39264c0e2ebcbd8195d58c7a088bd4a8d762c5ef/public/icon/48.png -------------------------------------------------------------------------------- /public/icon/96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dnakov/claude-mcp/39264c0e2ebcbd8195d58c7a088bd4a8d762c5ef/public/icon/96.png -------------------------------------------------------------------------------- /src/content.js: -------------------------------------------------------------------------------- 1 | // Content script running in world: MAIN on claude.ai 2 | // This means we're running in the page's JavaScript context, not the extension context 3 | // We can access Claude's React components but NOT extension APIs 4 | 5 | // import 'bippy'; 6 | import { MCPConnection } from './mcp-connection'; 7 | import { log, setStorage } from './utils'; 8 | 9 | let mcpServers = []; 10 | 11 | // Set up a connection to a server 12 | function createServerConnection(server, handler) { 13 | log(`[MCP Client] Creating connection to ${server.name}`); 14 | 15 | try { 16 | // Create configuration for the MCPConnection 17 | const connectionConfig = { 18 | connectionType: 'sse', 19 | transportType: 'stdio', 20 | url: server.url, 21 | command: server.command, 22 | args: server.args, 23 | env: server.env 24 | }; 25 | 26 | // Create the MCPConnection 27 | const connection = new MCPConnection(server.name, connectionConfig); 28 | 29 | // Start connecting in the background 30 | connection.connect(handler) 31 | .then(result => { 32 | log(`[MCP Client] Successfully connected to ${server.name}:`, result); 33 | // Trigger an update of the injected clients to refresh with the new connection 34 | // updateInjectedClients(); 35 | }) 36 | .catch(error => { 37 | console.error(`[MCP Client] Failed to connect to ${server.name}:`, error); 38 | }); 39 | 40 | return connection; 41 | } catch (e) { 42 | console.error(`[MCP Client] Error creating connection to ${server.name}:`, e); 43 | return null; 44 | } 45 | } 46 | 47 | // Listen for messages from other scripts 48 | window.addEventListener('message', (event) => { 49 | // Log messages for debugging 50 | log('[MCP Client] Received window message:', event.data); 51 | 52 | // Only accept messages from the same frame 53 | if (event.source !== window) { 54 | return; 55 | } 56 | 57 | // Special case: filter out our own messages 58 | if (event.data && event.data.source === 'main-content') { 59 | log('[MCP Client] Ignoring our own message'); 60 | return; 61 | } 62 | 63 | // Process messages by type 64 | if (event.data && event.data.type) { 65 | switch (event.data.type) { 66 | case 'mcp-ext-storage-updated': 67 | log('[MCP Client] Received storage from extension:', event.data.data); 68 | setStorage(event.data.data); 69 | break; 70 | 71 | case 'mcp-servers-updated': 72 | if (Array.isArray(event.data?.data?.servers)) { 73 | log('[MCP Client] Received servers from extension:', event.data.data.servers); 74 | mcpServers = event.data.data.servers; 75 | for(let server of mcpServers) { 76 | const channel = new MessageChannel(); 77 | const port1 = channel.port1; 78 | const port2 = channel.port2; 79 | port1.onmessage = (event) => { 80 | log('[MCP Client] Received message from port1:', event); 81 | connection.sendRequest(event.data); 82 | }; 83 | const handler = (message) => { 84 | log('[MCP Client] Received message from server:', message); 85 | port1.postMessage(message); 86 | }; 87 | port1.start(); 88 | const connection = createServerConnection(server, handler); 89 | log(server, connection) 90 | setTimeout(() => { 91 | window.postMessage({ 92 | source: 'main-content', 93 | type: 'mcp-server-connected', 94 | serverName: server.name 95 | }, '*', [port2]); 96 | }, 1000); 97 | } 98 | 99 | } else { 100 | console.warn('[MCP Client] Received malformed servers data:', event.data); 101 | } 102 | break; 103 | } 104 | } 105 | }); -------------------------------------------------------------------------------- /src/isolated-content.js: -------------------------------------------------------------------------------- 1 | const extensionAPI = globalThis.chrome || globalThis.browser; 2 | 3 | let initialLoad = true; 4 | 5 | async function getAndSendStorage() { 6 | try { 7 | const data = await extensionAPI.storage.local.get(); 8 | 9 | // Send to MAIN world 10 | window.postMessage({ 11 | type: 'mcp-ext-storage-updated', 12 | source: 'isolated-content', 13 | data: data 14 | }, '*'); 15 | if(initialLoad) { 16 | initialLoad = false; 17 | window.postMessage({ 18 | type: 'mcp-servers-updated', 19 | source: 'isolated-content', 20 | data: { 21 | servers: Object.values(data.mcpServers || {}) 22 | } 23 | }, '*'); 24 | } 25 | } catch (error) { 26 | console.error('[Claude MCP Manager] Error getting storage:', error); 27 | } 28 | } 29 | 30 | // Listen for requests from MAIN world 31 | window.addEventListener('message', (event) => { 32 | // console.log('[Claude MCP Manager] Got message in ISOLATED world:', event.data); 33 | 34 | // if (event.source !== window) return; 35 | 36 | // if (event.data && event.data.type === 'mcp-ext-storage-updated') { 37 | // console.log('[Claude MCP Manager] Got request for storage, sending from storage'); 38 | // getAndSendStorage(); 39 | // } 40 | }); 41 | 42 | extensionAPI.storage.onChanged.addListener((changes, area) => { 43 | if (area === 'local') { 44 | getAndSendStorage(); 45 | } 46 | for(let key in changes) { 47 | if(key === 'mcpServers') { 48 | window.postMessage({ 49 | type: 'mcp-servers-updated', 50 | source: 'isolated-content', 51 | data: { 52 | servers: Object.values(changes[key].newValue || {}) 53 | } 54 | }, '*'); 55 | } 56 | } 57 | }); 58 | 59 | getAndSendStorage(); 60 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "{{chrome}}.manifest_version": 3, 3 | "{{firefox}}.manifest_version": 2, 4 | "name": "MCP for claude.ai", 5 | "description": "Enable MCP on claude.ai", 6 | "version": "1.0.0", 7 | "icons": { 8 | "16": "icon/16.png", 9 | "32": "icon/32.png", 10 | "48": "icon/48.png", 11 | "96": "icon/96.png", 12 | "128": "icon/128.png" 13 | }, 14 | "{{chrome}}.action": { 15 | "default_popup": "src/popup.html" 16 | }, 17 | "{{firefox}}.browser_action": { 18 | "default_popup": "src/popup.html" 19 | }, 20 | "content_scripts": [ 21 | { 22 | "matches": ["*://claude.ai/*"], 23 | "js": ["src/content.js"], 24 | "{{chrome}}.world": "MAIN", 25 | "run_at": "document_start" 26 | }, 27 | { 28 | "matches": ["*://claude.ai/*"], 29 | "js": ["src/isolated-content.js"], 30 | "{{chrome}}.world": "ISOLATED", 31 | "run_at": "document_start" 32 | } 33 | ], 34 | "{{chrome}}.web_accessible_resources": [ 35 | { 36 | "resources": ["src/content.js", "src/isolated-content.js"], 37 | "matches": ["*://claude.ai/*"] 38 | } 39 | ], 40 | "{{firefox}}.web_accessible_resources": ["src/content.js", "src/isolated-content.js"], 41 | "permissions": [ 42 | "storage" 43 | ], 44 | "host_permissions": [ 45 | "*://claude.ai/*" 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /src/mcp-connection.js: -------------------------------------------------------------------------------- 1 | import { log } from './utils'; 2 | export class MCPConnection { 3 | constructor(name, config) { 4 | this.name = name; 5 | this.config = { 6 | // Default configuration 7 | connectionType: 'sse', 8 | transportType: 'stdio', 9 | ...config 10 | }; 11 | this.eventSource = null; 12 | this.messageEndpoint = null; 13 | this.initialized = false; 14 | this.capabilities = null; 15 | this.serverInfo = null; 16 | this.resources = new Map(); 17 | this.tools = new Map(); 18 | this.subscriptions = new Map(); 19 | this.messageHandler = null; 20 | this.reconnectAttempts = 0; 21 | this.maxReconnectAttempts = 5; 22 | this.reconnectDelay = 1000; // Start with 1 second delay 23 | this.sessionId = null; 24 | 25 | // Log configuration 26 | log(`[MCP ${this.name}] Initialized with config:`, { 27 | connectionType: this.config.connectionType, 28 | transportType: this.config.transportType, 29 | command: this.config.command, 30 | args: this.config.args, 31 | env: this.config.env ? '(env data present)' : undefined, 32 | url: this.config.url 33 | }); 34 | } 35 | 36 | // Initialize connection and handle lifecycle 37 | async connect(handler) { 38 | this.messageHandler = handler; // Store handler for reconnection 39 | log(`[MCP ${this.name}] Connecting with config:`, this.config); 40 | log(`[MCP ${this.name}] Connection type:`, this.config.connectionType || 'default (ws)'); 41 | 42 | if (this.config.connectionType === 'sse') { 43 | log(`[MCP ${this.name}] Using SSE connection`); 44 | return this.connectSSE(handler); 45 | } else { 46 | console.error(`[MCP ${this.name}] Unsupported connection type:`, this.config.connectionType); 47 | return null; 48 | } 49 | } 50 | 51 | async connectSSE(handler) { 52 | try { 53 | // Parse and validate URL 54 | const sseUrl = new URL(this.config.url); 55 | 56 | if(this.config.command?.trim()?.length > 0) { 57 | // Add transportType parameter (required for SSE) 58 | if (!sseUrl.searchParams.has('transportType')) { 59 | sseUrl.searchParams.set('transportType', this.config.transportType || 'stdio'); 60 | } 61 | 62 | // Add command parameter if specified and not empty 63 | if (this.config.command && this.config.command.trim()) { 64 | sseUrl.searchParams.set('command', this.config.command); 65 | } 66 | 67 | // Add args parameter if specified and not empty 68 | if (this.config.args) { 69 | let argsValue = ''; 70 | if (Array.isArray(this.config.args)) { 71 | argsValue = this.config.args.filter(arg => arg).join(' '); 72 | } else if (typeof this.config.args === 'string') { 73 | argsValue = this.config.args.trim(); 74 | } 75 | 76 | if (argsValue) { 77 | sseUrl.searchParams.set('args', argsValue); 78 | } 79 | } 80 | } 81 | 82 | // Add environment variables as query parameters if specified 83 | if (this.config.env) { 84 | let envData = this.config.env; 85 | 86 | // If env is already a string and looks like JSON, parse it 87 | if (typeof envData === 'string') { 88 | try { 89 | envData = JSON.parse(envData); 90 | } catch (e) { 91 | console.error(`[MCP ${this.name}] Invalid JSON in env string:`, e); 92 | envData = {}; 93 | } 94 | } 95 | 96 | // Only add env parameter if it's not an empty object 97 | if (typeof envData === 'object' && Object.keys(envData).length > 0) { 98 | sseUrl.searchParams.set('env', encodeURIComponent(JSON.stringify(envData))); 99 | } 100 | } 101 | 102 | // If we have a session ID from previous connection, reuse it 103 | if (this.sessionId) { 104 | sseUrl.searchParams.set('session_id', this.sessionId); 105 | } 106 | 107 | log(`[MCP ${this.name}] Connecting to SSE URL:`, sseUrl.toString()); 108 | log(`[MCP ${this.name}] Query parameters:`, Object.fromEntries(sseUrl.searchParams)); 109 | 110 | return new Promise((resolve, reject) => { 111 | // Create EventSource - don't try to add auth headers here 112 | this.eventSource = new EventSource(sseUrl.toString()); 113 | let reconnectAttempt = this.reconnectAttempts > 0; 114 | 115 | this.eventSource.onopen = () => { 116 | log(`[MCP ${this.name}] SSE connection opened`); 117 | // Reset reconnect attempts on successful connection 118 | this.reconnectAttempts = 0; 119 | this.reconnectDelay = 1000; 120 | }; 121 | 122 | // Handle endpoint event 123 | this.eventSource.addEventListener('endpoint', (event) => { 124 | try { 125 | this.messageEndpoint = new URL(event.data, sseUrl.origin); 126 | log(`[MCP ${this.name}] Got message endpoint:`, this.messageEndpoint); 127 | 128 | // Extract session_id from the URL if present 129 | const urlParams = new URLSearchParams(this.messageEndpoint.search); 130 | if (urlParams.has('session_id')) { 131 | this.sessionId = urlParams.get('session_id'); 132 | log(`[MCP ${this.name}] Got session ID:`, this.sessionId); 133 | } 134 | 135 | // If this is a reconnect, we need to reinitialize 136 | if (reconnectAttempt) { 137 | this._sendInitializeRequest() 138 | .then(() => { 139 | log(`[MCP ${this.name}] Successfully reinitialized after reconnect`); 140 | this.initialized = true; 141 | resolve(this); 142 | }) 143 | .catch(err => { 144 | console.error(`[MCP ${this.name}] Failed to reinitialize after reconnect:`, err); 145 | this.disconnect(); 146 | reject(err); 147 | }); 148 | } else { 149 | // For initial connection, just send initialize request 150 | this._sendInitializeRequest() 151 | .then(() => { 152 | this.initialized = true; 153 | resolve(this); 154 | }) 155 | .catch(err => { 156 | console.error(`[MCP ${this.name}] Failed to initialize:`, err); 157 | this.disconnect(); 158 | reject(err); 159 | }); 160 | } 161 | } catch (e) { 162 | console.error(`[MCP ${this.name}] Failed to parse endpoint:`, e); 163 | this.disconnect(); 164 | reject(e); 165 | } 166 | }); 167 | 168 | // Handle regular messages 169 | this.eventSource.addEventListener('message', (event) => { 170 | try { 171 | const message = JSON.parse(event.data); 172 | log(`[MCP ${this.name}] SSE message:`, message); 173 | handler(message); 174 | } catch (e) { 175 | console.error(`[MCP ${this.name}] Failed to parse message:`, e); 176 | } 177 | }); 178 | 179 | this.eventSource.onerror = (error) => { 180 | console.error(`[MCP ${this.name}] SSE error:`, error); 181 | 182 | // If we're already initialized, try to reconnect 183 | if (this.initialized) { 184 | this.initialized = false; // Mark as not initialized during reconnection 185 | 186 | // Close the current connection 187 | if (this.eventSource) { 188 | this.eventSource.close(); 189 | this.eventSource = null; 190 | } 191 | 192 | // If we haven't exceeded max reconnect attempts, try to reconnect 193 | if (this.reconnectAttempts < this.maxReconnectAttempts) { 194 | this.reconnectAttempts++; 195 | log(`[MCP ${this.name}] Attempting SSE reconnection (Attempt ${this.reconnectAttempts})`); 196 | 197 | // Use exponential backoff for reconnect delay 198 | setTimeout(() => { 199 | this.connectSSE(handler) 200 | .then(conn => { 201 | log(`[MCP ${this.name}] Successfully reconnected`); 202 | }) 203 | .catch(err => { 204 | console.error(`[MCP ${this.name}] Failed to reconnect:`, err); 205 | }); 206 | }, this.reconnectDelay); 207 | 208 | // Increase delay for next attempt (exponential backoff with max of 30 seconds) 209 | this.reconnectDelay = Math.min(this.reconnectDelay * 2, 30000); 210 | } else { 211 | console.error(`[MCP ${this.name}] Max reconnect attempts reached`); 212 | this.disconnect(); 213 | } 214 | } else { 215 | // Initial connection failed 216 | console.error(`[MCP ${this.name}] Initial SSE connection failed`); 217 | this.disconnect(); 218 | reject(new Error('SSE connection failed')); 219 | } 220 | }; 221 | 222 | // Set connection timeout 223 | setTimeout(() => { 224 | if (!this.initialized) { 225 | log(`[MCP ${this.name}] Connection timeout`); 226 | this.disconnect(); 227 | reject(new Error('Connection timeout')); 228 | } 229 | }, 10000); 230 | }); 231 | } catch (error) { 232 | console.error(`[MCP ${this.name}] SSE connection error:`, error); 233 | throw error; 234 | } 235 | } 236 | 237 | // Send MCP initialize request according to the protocol 238 | async _sendInitializeRequest() { 239 | log(`[MCP ${this.name}] Entering _sendInitializeRequest.`); 240 | 241 | // Create initialize request according to MCP protocol 242 | const initializeRequest = { 243 | jsonrpc: "2.0", 244 | id: this.getNextId(), 245 | method: "initialize", 246 | params: { 247 | protocolVersion: "2024-11-05", 248 | capabilities: { 249 | roots: { 250 | listChanged: true 251 | }, 252 | sampling: {} 253 | }, 254 | clientInfo: { 255 | name: "MCPClient", 256 | version: "1.0.0" 257 | } 258 | } 259 | }; 260 | 261 | // Send the initialize request 262 | log(`[MCP ${this.name}] Sending initialize POST to ${this.messageEndpoint} with payload:`, initializeRequest); 263 | 264 | try { 265 | const response = await fetch(this.messageEndpoint, { 266 | method: 'POST', 267 | headers: { 268 | 'Content-Type': 'application/json', 269 | ...(this.config.authHeader ? { 'Authorization': this.config.authHeader } : {}) 270 | }, 271 | body: JSON.stringify(initializeRequest) 272 | }); 273 | 274 | if (response.ok) { 275 | log(`[MCP ${this.name}] Initialize request sent successfully (Status: ${response.status}). Waiting for initialize event via SSE.`); 276 | 277 | // After successful initialize request, send initialized notification 278 | await this._sendInitializedNotification(); 279 | return true; 280 | } else { 281 | const errorText = await response.text(); 282 | throw new Error(`Initialize request failed: ${response.status} ${errorText}`); 283 | } 284 | } catch (error) { 285 | console.error(`[MCP ${this.name}] Initialize request failed:`, error); 286 | throw error; 287 | } 288 | } 289 | 290 | // Send MCP initialized notification according to the protocol 291 | async _sendInitializedNotification() { 292 | // Create initialized notification according to MCP protocol 293 | const initializedNotification = { 294 | jsonrpc: "2.0", 295 | method: "notifications/initialized" 296 | }; 297 | 298 | // Send the initialized notification 299 | try { 300 | const response = await fetch(this.messageEndpoint, { 301 | method: 'POST', 302 | headers: { 303 | 'Content-Type': 'application/json', 304 | ...(this.config.authHeader ? { 'Authorization': this.config.authHeader } : {}) 305 | }, 306 | body: JSON.stringify(initializedNotification) 307 | }); 308 | 309 | if (response.ok) { 310 | log(`[MCP ${this.name}] Initialized notification sent successfully (Status: ${response.status}).`); 311 | return true; 312 | } else { 313 | const errorText = await response.text(); 314 | throw new Error(`Initialized notification failed: ${response.status} ${errorText}`); 315 | } 316 | } catch (error) { 317 | console.error(`[MCP ${this.name}] Initialized notification failed:`, error); 318 | throw error; 319 | } 320 | } 321 | 322 | // Handle incoming messages 323 | async handleMessage(message, resolve, reject) { 324 | log('Received message:', message); 325 | if(this.onMessage) { 326 | return this.onMessage(message); 327 | } 328 | return; 329 | } 330 | 331 | async sendRequest(request) { 332 | // If we're not initialized, try to reconnect first 333 | if (!this.initialized && this.messageHandler) { 334 | try { 335 | log(`[MCP ${this.name}] Connection not initialized, attempting to reconnect before sending request`); 336 | await this.connectSSE(this.messageHandler); 337 | } catch (error) { 338 | console.error(`[MCP ${this.name}] Failed to reconnect:`, error); 339 | return { 340 | error: { 341 | code: -1, 342 | message: "Connection not initialized and reconnect failed" 343 | } 344 | }; 345 | } 346 | } 347 | 348 | if (this.config.connectionType === 'sse') { 349 | log(`[MCP ${this.name}] Sending SSE request to ${this.messageEndpoint}:`, request); 350 | try { 351 | const response = await fetch(this.messageEndpoint, { 352 | method: 'POST', 353 | headers: { 354 | 'Content-Type': 'application/json', 355 | ...(this.config.authHeader ? { 'Authorization': this.config.authHeader } : {}) 356 | }, 357 | body: JSON.stringify(request) 358 | }); 359 | 360 | // Check if response is JSON 361 | const contentType = response.headers.get('content-type'); 362 | log(`[MCP ${this.name}] Response content type:`, contentType); 363 | 364 | if (contentType && contentType.includes('application/json')) { 365 | const json = await response.json(); 366 | log(`[MCP ${this.name}] JSON response:`, json); 367 | return json; 368 | } 369 | 370 | // If not JSON, just return success object 371 | if (response.ok) { 372 | log(`[MCP ${this.name}] Non-JSON success response`); 373 | return { result: { success: true } }; 374 | } 375 | 376 | // If error, return error object 377 | const errorText = await response.text(); 378 | console.error(`[MCP ${this.name}] Request error:`, response.status, errorText); 379 | return { 380 | error: { 381 | code: response.status, 382 | message: errorText 383 | } 384 | }; 385 | } catch (error) { 386 | console.error(`[MCP ${this.name}] Request failed:`, error); 387 | return { 388 | error: { 389 | code: -1, 390 | message: error.message 391 | } 392 | }; 393 | } 394 | } else { 395 | return new Promise((resolve, reject) => { 396 | const id = request.id; 397 | const handler = (event) => { 398 | try { 399 | const response = JSON.parse(event.data); 400 | if (response.id === id) { 401 | this.ws.removeEventListener('message', handler); 402 | resolve(response); 403 | } 404 | } catch (e) { 405 | reject(e); 406 | } 407 | }; 408 | this.ws.addEventListener('message', handler); 409 | this.ws.send(JSON.stringify(request)); 410 | }); 411 | } 412 | } 413 | 414 | // Get next request ID 415 | getNextId() { 416 | return Math.floor(Math.random() * 1000000); 417 | } 418 | 419 | // Notify about resource changes 420 | notifyResourcesChanged() { 421 | // This method would trigger any listeners or callbacks for resource changes 422 | log(`[MCP ${this.name}] Resources changed, now have ${this.resources.size} resources`); 423 | } 424 | 425 | // Notify about tool changes 426 | notifyToolsChanged() { 427 | // This method would trigger any listeners or callbacks for tool changes 428 | log(`[MCP ${this.name}] Tools changed, now have ${this.tools.size} tools`); 429 | } 430 | 431 | // Disconnect and cleanup 432 | disconnect() { 433 | if (this.eventSource) { 434 | this.eventSource.close(); 435 | this.eventSource = null; 436 | } 437 | if (this.ws) { 438 | this.ws.close(); 439 | this.ws = null; 440 | } 441 | this.initialized = false; 442 | this.capabilities = null; 443 | this.serverInfo = null; 444 | this.resources.clear(); 445 | this.tools.clear(); 446 | this.subscriptions.clear(); 447 | 448 | log(`[MCP ${this.name}] Disconnected`); 449 | } 450 | } -------------------------------------------------------------------------------- /src/pages/Popup.svelte: -------------------------------------------------------------------------------- 1 | 208 | 209 |
210 |

MCP Server Manager

211 | 212 |
{status}
213 | 214 | 215 |
216 |

{isEditing ? 'Edit Server' : 'Add Server'}

217 | 218 |
219 |
220 | 221 | 227 |
228 | 229 |
230 | 231 | 237 |
238 | 239 |
240 | 241 | 247 |
248 |
249 | 250 |
251 | 252 |
253 |
254 |

Environment Variables

255 | 261 |
262 | 263 | {#if showEnvEditor} 264 |
265 |
266 | 271 | 276 | 280 |
281 | 282 |
283 | {#each Object.entries(currentServer.env || {}) as [key, value]} 284 |
285 |
{key}:
286 |
{value}
287 | 291 |
292 | {/each} 293 |
294 |
295 | {/if} 296 |
297 | 298 | 299 |
300 |

Arguments

301 | 302 |
303 | 308 | 312 |
313 | 314 |
315 | {#each currentServer.args || [] as arg, i} 316 |
317 |
{arg}
318 | 322 |
323 | {/each} 324 |
325 |
326 |
327 | 328 |
329 | 333 | 337 |
338 |
339 | 340 | 341 |
342 |

Servers ({Array.isArray(servers) ? servers.length : 0})

343 | 344 | {#if !Array.isArray(servers) || servers.length === 0} 345 |
346 | No servers configured 347 |
348 | {:else} 349 |
350 | {#each servers as server, i} 351 |
352 |
353 |
354 |
{server.name}
355 |
{server.url}
356 |
357 |
358 | 362 | 366 |
367 |
368 |
369 | {/each} 370 |
371 | {/if} 372 |
373 | 374 | 375 |
376 | 385 | 386 | 392 |
393 |
394 | -------------------------------------------------------------------------------- /src/popup.css: -------------------------------------------------------------------------------- 1 | @import 'tailwindcss'; 2 | 3 | html, 4 | body { 5 | width: 600px; 6 | min-height: 400px; 7 | max-height: 600px; 8 | padding: 0; 9 | margin: 0; 10 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 11 | background-color: hsl(var(--bg-000, 0 0% 100%)); 12 | color: hsl(var(--text-000, 0 0% 0%)); 13 | transition: background-color 0.3s ease, color 0.3s ease; 14 | } 15 | 16 | /* Claude theme definitions */ 17 | [data-theme=claude],[data-theme=claude][data-mode=light] { 18 | --accent-brand: 15 63.1% 59.6%; 19 | --accent-main-000: 15 55.6% 52.4%; 20 | --accent-main-100: 15 55.6% 52.4%; 21 | --accent-main-200: 15 63.1% 59.6%; 22 | --accent-main-900: 0 0% 0%; 23 | --accent-pro-000: 251 34.2% 33.3%; 24 | --accent-pro-100: 251 40% 45.1%; 25 | --accent-pro-200: 251 61% 72.2%; 26 | --accent-pro-900: 253 33.3% 91.8%; 27 | --accent-secondary-000: 210 73.7% 40.2%; 28 | --accent-secondary-100: 210 70.9% 51.6%; 29 | --accent-secondary-200: 210 70.9% 51.6%; 30 | --accent-secondary-900: 211 72% 90%; 31 | --bg-000: 0 0% 100%; 32 | --bg-100: 48 33.3% 97.1%; 33 | --bg-200: 53 28.6% 94.5%; 34 | --bg-300: 48 25% 92.2%; 35 | --bg-400: 50 20.7% 88.6%; 36 | --bg-500: 50 20.7% 88.6%; 37 | --border-100: 30 3.3% 11.8%; 38 | --border-200: 30 3.3% 11.8%; 39 | --border-300: 30 3.3% 11.8%; 40 | --border-400: 30 3.3% 11.8%; 41 | --danger-000: 0 61.4% 22.4%; 42 | --danger-100: 0 58.6% 34.1%; 43 | --danger-200: 0 58.6% 34.1%; 44 | --danger-900: 0 50% 95%; 45 | --oncolor-100: 0 0% 100%; 46 | --oncolor-200: 60 6.7% 97.1%; 47 | --oncolor-300: 60 6.7% 97.1%; 48 | --text-000: 60 2.6% 7.6%; 49 | --text-100: 60 2.6% 7.6%; 50 | --text-200: 60 2.5% 23.3%; 51 | --text-300: 60 2.5% 23.3%; 52 | --text-400: 51 3.1% 43.7%; 53 | --text-500: 51 3.1% 43.7% 54 | } 55 | 56 | [data-theme=claude][data-mode=dark] { 57 | --accent-brand: 15 63.1% 59.6%; 58 | --accent-main-000: 15 55.6% 52.4%; 59 | --accent-main-100: 15 63.1% 59.6%; 60 | --accent-main-200: 15 63.1% 59.6%; 61 | --accent-main-900: 0 0% 0%; 62 | --accent-pro-000: 251 84.6% 74.5%; 63 | --accent-pro-100: 251 40.2% 54.1%; 64 | --accent-pro-200: 251 40% 45.1%; 65 | --accent-pro-900: 250 25.3% 19.4%; 66 | --accent-secondary-000: 210 71.1% 62%; 67 | --accent-secondary-100: 210 70.9% 51.6%; 68 | --accent-secondary-200: 210 70.9% 51.6%; 69 | --accent-secondary-900: 210 55.9% 24.6%; 70 | --bg-000: 60 2.1% 18.4%; 71 | --bg-100: 60 2.7% 14.5%; 72 | --bg-200: 30 3.3% 11.8%; 73 | --bg-300: 60 2.6% 7.6%; 74 | --bg-400: 60 3.4% 5.7%; 75 | --bg-500: 60 3.4% 5.7%; 76 | --border-100: 51 16.5% 84.5%; 77 | --border-200: 51 16.5% 84.5%; 78 | --border-300: 51 16.5% 84.5%; 79 | --border-400: 51 16.5% 84.5%; 80 | --danger-000: 0 73.1% 66.5%; 81 | --danger-100: 0 58.6% 34.1%; 82 | --danger-200: 0 58.6% 34.1%; 83 | --danger-900: 0 23% 15.6%; 84 | --oncolor-100: 0 0% 100%; 85 | --oncolor-200: 60 6.7% 97.1%; 86 | --oncolor-300: 60 6.7% 97.1%; 87 | --text-000: 48 33.3% 97.1%; 88 | --text-100: 48 33.3% 97.1%; 89 | --text-200: 50 9% 73.7%; 90 | --text-300: 50 9% 73.7%; 91 | --text-400: 48 4.8% 59.2%; 92 | --text-500: 48 4.8% 59.2% 93 | } 94 | 95 | @media (prefers-color-scheme: dark) { 96 | [data-theme=claude] { 97 | --accent-brand:15 63.1% 59.6%; 98 | --accent-main-000: 15 55.6% 52.4%; 99 | --accent-main-100: 15 63.1% 59.6%; 100 | --accent-main-200: 15 63.1% 59.6%; 101 | --accent-main-900: 0 0% 0%; 102 | --accent-pro-000: 251 84.6% 74.5%; 103 | --accent-pro-100: 251 40.2% 54.1%; 104 | --accent-pro-200: 251 40% 45.1%; 105 | --accent-pro-900: 250 25.3% 19.4%; 106 | --accent-secondary-000: 210 71.1% 62%; 107 | --accent-secondary-100: 210 70.9% 51.6%; 108 | --accent-secondary-200: 210 70.9% 51.6%; 109 | --accent-secondary-900: 210 55.9% 24.6%; 110 | --bg-000: 60 2.1% 18.4%; 111 | --bg-100: 60 2.7% 14.5%; 112 | --bg-200: 30 3.3% 11.8%; 113 | --bg-300: 60 2.6% 7.6%; 114 | --bg-400: 60 3.4% 5.7%; 115 | --bg-500: 60 3.4% 5.7%; 116 | --border-100: 51 16.5% 84.5%; 117 | --border-200: 51 16.5% 84.5%; 118 | --border-300: 51 16.5% 84.5%; 119 | --border-400: 51 16.5% 84.5%; 120 | --danger-000: 0 73.1% 66.5%; 121 | --danger-100: 0 58.6% 34.1%; 122 | --danger-200: 0 58.6% 34.1%; 123 | --danger-900: 0 23% 15.6%; 124 | --oncolor-100: 0 0% 100%; 125 | --oncolor-200: 60 6.7% 97.1%; 126 | --oncolor-300: 60 6.7% 97.1%; 127 | --text-000: 48 33.3% 97.1%; 128 | --text-100: 48 33.3% 97.1%; 129 | --text-200: 50 9% 73.7%; 130 | --text-300: 50 9% 73.7%; 131 | --text-400: 48 4.8% 59.2%; 132 | --text-500: 48 4.8% 59.2% 133 | } 134 | } 135 | 136 | [data-theme=console],[data-theme=console][data-mode=dark] { 137 | --accent-brand: 15 63.1% 59.6%; 138 | --accent-main-000: 18 50.4% 47.5%; 139 | --accent-main-100: 18 56.8% 43.5%; 140 | --accent-main-200: 19 58.3% 40.4%; 141 | --accent-main-900: 16 21.6% 20%; 142 | --accent-pro-000: 251 40.2% 54.1%; 143 | --accent-pro-100: 251 40% 45.1%; 144 | --accent-pro-200: 251 34.2% 33.3%; 145 | --accent-pro-900: 249 25% 19.4%; 146 | --accent-secondary-000: 158 68% 32%; 147 | --accent-secondary-100: 158 80.4% 28%; 148 | --accent-secondary-200: 158 79.2% 24.5%; 149 | --accent-secondary-900: 160 18.1% 16.3%; 150 | --bg-000: 0 0% 6%; 151 | --bg-100: 0 0% 10%; 152 | --bg-200: 0 0% 14%; 153 | --bg-300: 0 0% 17%; 154 | --bg-400: 0 0% 19%; 155 | --bg-500: 0 0% 23%; 156 | --border-100: 51 16.5% 84.5%; 157 | --border-200: 51 16.5% 84.5%; 158 | --border-300: 51 16.5% 84.5%; 159 | --border-400: 51 16.5% 84.5%; 160 | --danger-000: 4 90.4% 79.5%; 161 | --danger-100: 5 91.7% 72.5%; 162 | --danger-200: 5 58.4% 33.9%; 163 | --danger-900: 0 48.2% 16.5%; 164 | --oncolor-100: 0 0% 100%; 165 | --oncolor-200: 60 6.7% 97.1%; 166 | --oncolor-300: 60 6.7% 97.1%; 167 | --text-000: 0 0% 100%; 168 | --text-100: 60 3.7% 94.7%; 169 | --text-200: 60 1.5% 86.9%; 170 | --text-300: 30 1.4% 71.8%; 171 | --text-400: 50 0.8% 65.1%; 172 | --text-500: 45 0.6% 48% 173 | } 174 | 175 | /* Custom component styles */ 176 | @layer components { 177 | .btn-primary { 178 | @apply px-3 py-1.5 bg-[hsl(var(--accent-main-100))] hover:bg-[hsl(var(--accent-main-000))] rounded-md text-white font-medium text-sm; 179 | } 180 | 181 | .btn-secondary { 182 | @apply px-3 py-1.5 bg-[hsl(var(--bg-200))] hover:bg-[hsl(var(--bg-300))] rounded-md text-[hsl(var(--text-100))] font-medium text-sm; 183 | } 184 | 185 | .btn-danger { 186 | @apply px-2 py-0.5 text-xs bg-[hsl(var(--danger-100))] hover:bg-[hsl(var(--danger-000))] rounded-md text-white; 187 | } 188 | 189 | .input-field { 190 | @apply w-full p-1.5 bg-[hsl(var(--bg-200))] border border-[hsl(var(--border-100))] rounded-md text-[hsl(var(--text-100))] text-sm focus:outline-none focus:ring-1 focus:ring-[hsl(var(--accent-main-100))] focus:border-[hsl(var(--accent-main-100))]; 191 | } 192 | 193 | .panel { 194 | @apply p-2 bg-[hsl(var(--bg-200))] border border-[hsl(var(--border-100))] rounded-lg; 195 | } 196 | 197 | .status-bar { 198 | @apply p-2 mb-2 bg-[hsl(var(--bg-100))] border-l-4 border-[hsl(var(--accent-main-100))] rounded text-xs; 199 | } 200 | } 201 | -------------------------------------------------------------------------------- /src/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Claude MCP Manager 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/popup.js: -------------------------------------------------------------------------------- 1 | import Popup from './pages/Popup.svelte' 2 | import { mount } from "svelte"; 3 | 4 | mount(Popup, { target: document.body }); 5 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | const STORAGE = {} 2 | 3 | export const log = (...args) => { 4 | if(STORAGE.mcpDebugLog) { 5 | console.log(...args) 6 | } 7 | } 8 | 9 | export const setStorage = (value) => { 10 | for (const key in value) { 11 | STORAGE[key] = value[key]; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/vite.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' 2 | 3 | export default { 4 | // Consult https://svelte.dev/docs#compile-time-svelte-preprocess 5 | // for more information about preprocessors 6 | preprocess: vitePreprocess(), 7 | compilerOptions: { 8 | runes: true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import { svelte } from "@sveltejs/vite-plugin-svelte"; 3 | import webExtension, { readJsonFile } from "vite-plugin-web-extension"; 4 | import tailwindcss from '@tailwindcss/vite'; 5 | 6 | function generateManifest() { 7 | const manifest = readJsonFile("src/manifest.json"); 8 | const pkg = readJsonFile("package.json"); 9 | return { 10 | name: pkg.name, 11 | description: pkg.description, 12 | version: pkg.version, 13 | ...manifest, 14 | }; 15 | } 16 | 17 | // https://vitejs.dev/config/ 18 | export default defineConfig({ 19 | plugins: [ 20 | svelte(), 21 | tailwindcss(), 22 | webExtension({ 23 | manifest: generateManifest, 24 | watchFilePaths: ["package.json", "manifest.json"], 25 | webExtConfig: { 26 | chromiumBinary: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" 27 | }, 28 | }), 29 | ], 30 | build: { 31 | minify: false 32 | } 33 | }); 34 | --------------------------------------------------------------------------------