├── .editorconfig ├── .gitignore ├── .npmignore ├── .prettierignore ├── .prettierrc ├── LICENSE ├── README.md ├── jsconfig.json ├── landing-page ├── .gitignore ├── chrome-installer.zip ├── chrome.svg ├── chromium.svg ├── edge.svg ├── favicon.ico ├── firefox-installer.zip ├── firefox.svg ├── icon.png ├── index.html ├── installer.html ├── opera.svg └── sitemap.xml ├── package-lock.json ├── package.json ├── popup.html ├── public └── img │ ├── android-chrome-192x192.png │ ├── android-chrome-384x384.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── mstile-150x150.png │ ├── safari-pinned-tab.svg │ └── site.webmanifest ├── src ├── assets │ ├── demo.gif │ ├── how-to-install.gif │ ├── icon.png │ └── small-demo.gif ├── background │ └── index.js ├── contentScript │ └── index.js ├── manifest.js └── popup │ ├── index.css │ └── index.js └── vite.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | 11 | # Matches multiple files with brace expansion notation 12 | # Set default charset 13 | [*.{js,jsx,ts,tsx,md}] 14 | charset = utf-8 15 | indent_style = space 16 | indent_size = 2 17 | tab_width = 2 18 | end_of_line = lf 19 | insert_final_newline = true 20 | trim_trailing_whitespace = true 21 | 22 | 23 | # Matches the exact files either package.json or .travis.yml 24 | [{package.json,.travis.yml}] 25 | indent_style = space 26 | indent_size = 2 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | /package 12 | 13 | # misc 14 | .DS_Store 15 | .env.local 16 | .env.development.local 17 | .env.test.local 18 | .env.production.local 19 | .history 20 | *.log 21 | 22 | # secrets 23 | secrets.*.js -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # OS 2 | .DS_Store 3 | 4 | # ignore node dependency directories & lock 5 | node_modules 6 | yarn.lock 7 | pnpm-lock.yaml 8 | package-lock.json 9 | 10 | # ignore log files and local 11 | *.log 12 | *.local 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | .history 18 | 19 | # ignore compiled files 20 | build 21 | types 22 | coverage 23 | 24 | # ignore ide settings 25 | .idea 26 | .vscode 27 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Ignore artifacts: 2 | build 3 | coverage 4 | node_modules 5 | pnpm-lock.yaml 6 | pnpm-workspace.yaml 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "jsxSingleQuote": false, 3 | "singleQuote": true, 4 | "trailingComma": "all", 5 | "endOfLine": "lf", 6 | "printWidth": 100, 7 | "semi": false, 8 | "tabWidth": 2, 9 | "useTabs": false 10 | } 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2024-present, no one 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 13 | all 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 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AdBlitz (Not an Ad Blocker) 2 | 3 | ## Description 4 | AdBlitz is your ultimate tool for turbocharging your YouTube viewing experience. Designed to effortlessly enhance your browsing sessions, it automatically skips skippable ads and accelerates non-skippable ones, ensuring you enjoy uninterrupted content seamlessly. Remember, it's not an *ad blocker*; 5 | 6 | ## Features 7 | - **Automatic Skips:** Say goodbye to interruptions as AdBlitz automatically skips skippable ads on YouTube videos. 8 | - **Ad Skimming:** For non skippable ads, AdBlitz automatically speeds up ads to maximum speed and mute them. 9 | - **Multi-Ad Skipping:** Handles multiple ads with ease, keeping your viewing flow uninterrupted. 10 | - **Background Magic:** Works seamlessly in the background, providing a smooth and hassle-free viewing experience. 11 | - **Lightweight & User-Friendly:** Easy to install and use, without any unnecessary bloat. 12 | 13 | 14 | ## Installation (on Chromium-based browsers) 15 | 1. [Download](https://ad-blitz.vercel.app/) the extension by clicking on your browser icon. 16 | 2. Open Chrome and navigate to `chrome://extensions/`. 17 | 3. Enable Developer Mode by toggling the switch in the upper-right corner. 18 | 4. Click on the "Load unpacked" button located at the top-left corner of the extensions page. 19 | 5. Select the directory where you cloned or downloaded the extension repository. 20 | 6. Confirm the installation when prompted. 21 | 22 | ## Installation (on Firefox) 23 | 1. [Download](https://addons.mozilla.org/en-US/firefox/addon/adblitz/) the extension. 24 | 6. Confirm the installation when prompted. 25 | 6. Give permissions by right clicking on extension. 26 | 27 | ## How to Run Locally 28 | 1. **Clone the Repository**: 29 | ```sh 30 | git clone https://github.com/dikshantrajput/adBlitz 31 | ``` 32 | 2. **Run the server**: 33 | ```sh 34 | npm run dev 35 | ``` 36 | 3. **Make any change and just save. Your extension should refresh**. 37 | 4. **Build the project**: 38 | ```sh 39 | npm run build 40 | ``` 41 | 42 | ## Usage 43 | 1. Once installed, the extension will automatically start working whenever you watch a YouTube video with a skippable ad. 44 | 2. Sit back and enjoy your uninterrupted YouTube experience as the extension takes care of skipping the ads for you. 45 | 46 | ## Compatibility 47 | This extension is compatible with Google Chrome (Chromium-based browsers) and Firefox. 48 | 49 | ## Contributing 50 | Contributions from the community are welcome. If you'd like to contribute to the development of this extension, please fork the repository, make your changes, and submit a pull request. If you encounter any issues, please raise them in the repository's issue tracker. 51 | 52 | ## Disclaimer 53 | This extension is not endorsed by or affiliated with YouTube. It is an independent project developed solely for the purpose of improving user experience on the platform. 54 | 55 | Enjoy ad-free YouTube viewing with AdBlitz! 56 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { "typeAcquisition": { "include": ["chrome"] } } 2 | -------------------------------------------------------------------------------- /landing-page/.gitignore: -------------------------------------------------------------------------------- 1 | .vercel 2 | -------------------------------------------------------------------------------- /landing-page/chrome-installer.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/landing-page/chrome-installer.zip -------------------------------------------------------------------------------- /landing-page/chrome.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 21 | 23 | 24 | 25 | 26 | 27 | 31 | 32 | -------------------------------------------------------------------------------- /landing-page/chromium.svg: -------------------------------------------------------------------------------- 1 | chromium -------------------------------------------------------------------------------- /landing-page/edge.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /landing-page/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/landing-page/favicon.ico -------------------------------------------------------------------------------- /landing-page/firefox-installer.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/landing-page/firefox-installer.zip -------------------------------------------------------------------------------- /landing-page/firefox.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /landing-page/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/landing-page/icon.png -------------------------------------------------------------------------------- /landing-page/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | AdBlitz - Turbocharge Your YouTube Experience 8 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 344 | 345 | 346 | 347 |
348 |
349 |
350 |
351 | 352 | 353 | 354 | 362 |
363 |
364 |
365 |
366 |
367 |

AdBlitz - Your Shortcut to Ad-Free Streaming

368 | AdBlitz - Shortcut to Ad-Free Streaming | Product Hunt 369 |
370 |

Not an ad blocker

371 | 408 |

download for Chromium if your browser is Chromium based but not 409 | one of above

410 |
411 |
412 | 413 |
414 |

Features

415 |
416 |
417 |

418 | 419 | Automatic Skips 420 |

421 |

Say goodbye to interruptions as AdBlitz automatically skips skippable ads on YouTube videos. 422 |

423 | 424 | 425 | 426 | 427 |
428 |
429 |

430 | 431 | Ad Skimming 432 |

433 |

For non-skippable ads, AdBlitz skims through them at an accelerated speed (e.g., 16x), saving 434 | you valuable time.

435 | 436 | 437 | 438 | 439 |
440 |
441 |

442 | 443 | Multi-Ad Skipping 444 |

445 |

Handles multiple ads with ease, keeping your viewing flow uninterrupted.

446 | 447 | 448 | 449 | 450 |
451 |
452 |

453 | 454 | Background Magic 455 |

456 |

Works seamlessly in the background, providing a smooth and hassle-free viewing experience. 457 |

458 | 459 | 460 | 461 | 462 |
463 |
464 |

465 | 466 | Lightweight 467 |

468 |

Easy to install and use, without any unnecessary bloat.

469 | 470 | 471 | 472 | 473 |
474 | 475 |
476 |
477 |
478 |
479 |

See AdBlitz in Action

480 |
481 |
482 | 483 |
484 |

Experience the smooth, ad-free streaming with AdBlitz

485 |
486 |
487 |
488 |
489 | 495 |
496 | 497 | 498 | 499 | 517 | 518 | 521 | 522 | 523 | -------------------------------------------------------------------------------- /landing-page/installer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Download adBlitz 7 | 8 | 9 | Downloading... 10 | 11 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /landing-page/opera.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /landing-page/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://ad-blitz.vercel.app/ 5 | 2024-04-24 6 | daily 7 | 1.0 8 | 9 | 10 | https://ad-blitz.vercel.app/installer.html 11 | 2024-04-24 12 | weekly 13 | 0.8 14 | 15 | 16 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-crx", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "my-crx", 9 | "version": "0.0.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@crxjs/vite-plugin": "^2.0.0-beta.19", 13 | "prettier": "^3.0.3", 14 | "vite": "^4.4.11" 15 | }, 16 | "engines": { 17 | "node": ">=14.18.0" 18 | } 19 | }, 20 | "node_modules/@crxjs/vite-plugin": { 21 | "version": "2.0.0-beta.23", 22 | "resolved": "https://registry.npmjs.org/@crxjs/vite-plugin/-/vite-plugin-2.0.0-beta.23.tgz", 23 | "integrity": "sha512-AO+VYhtNZ1fITq/sc54FZpTtFvHR+gJwFGiWTGKs07bwYzzZFdF0sYeiFgZiEjaNkddkAzuM4F4lgOmCm69YUw==", 24 | "dev": true, 25 | "dependencies": { 26 | "@rollup/pluginutils": "^4.1.2", 27 | "@webcomponents/custom-elements": "^1.5.0", 28 | "acorn-walk": "^8.2.0", 29 | "cheerio": "^1.0.0-rc.10", 30 | "connect-injector": "^0.4.4", 31 | "convert-source-map": "^1.7.0", 32 | "debug": "^4.3.3", 33 | "es-module-lexer": "^0.10.0", 34 | "fast-glob": "^3.2.11", 35 | "fs-extra": "^10.0.1", 36 | "jsesc": "^3.0.2", 37 | "magic-string": "^0.26.0", 38 | "picocolors": "^1.0.0", 39 | "react-refresh": "^0.13.0", 40 | "rollup": "2.78.1", 41 | "rxjs": "7.5.7" 42 | } 43 | }, 44 | "node_modules/@esbuild/android-arm": { 45 | "version": "0.18.20", 46 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", 47 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 48 | "cpu": [ 49 | "arm" 50 | ], 51 | "dev": true, 52 | "optional": true, 53 | "os": [ 54 | "android" 55 | ], 56 | "engines": { 57 | "node": ">=12" 58 | } 59 | }, 60 | "node_modules/@esbuild/android-arm64": { 61 | "version": "0.18.20", 62 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", 63 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 64 | "cpu": [ 65 | "arm64" 66 | ], 67 | "dev": true, 68 | "optional": true, 69 | "os": [ 70 | "android" 71 | ], 72 | "engines": { 73 | "node": ">=12" 74 | } 75 | }, 76 | "node_modules/@esbuild/android-x64": { 77 | "version": "0.18.20", 78 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", 79 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 80 | "cpu": [ 81 | "x64" 82 | ], 83 | "dev": true, 84 | "optional": true, 85 | "os": [ 86 | "android" 87 | ], 88 | "engines": { 89 | "node": ">=12" 90 | } 91 | }, 92 | "node_modules/@esbuild/darwin-arm64": { 93 | "version": "0.18.20", 94 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", 95 | "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", 96 | "cpu": [ 97 | "arm64" 98 | ], 99 | "dev": true, 100 | "optional": true, 101 | "os": [ 102 | "darwin" 103 | ], 104 | "engines": { 105 | "node": ">=12" 106 | } 107 | }, 108 | "node_modules/@esbuild/darwin-x64": { 109 | "version": "0.18.20", 110 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", 111 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 112 | "cpu": [ 113 | "x64" 114 | ], 115 | "dev": true, 116 | "optional": true, 117 | "os": [ 118 | "darwin" 119 | ], 120 | "engines": { 121 | "node": ">=12" 122 | } 123 | }, 124 | "node_modules/@esbuild/freebsd-arm64": { 125 | "version": "0.18.20", 126 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", 127 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 128 | "cpu": [ 129 | "arm64" 130 | ], 131 | "dev": true, 132 | "optional": true, 133 | "os": [ 134 | "freebsd" 135 | ], 136 | "engines": { 137 | "node": ">=12" 138 | } 139 | }, 140 | "node_modules/@esbuild/freebsd-x64": { 141 | "version": "0.18.20", 142 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", 143 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 144 | "cpu": [ 145 | "x64" 146 | ], 147 | "dev": true, 148 | "optional": true, 149 | "os": [ 150 | "freebsd" 151 | ], 152 | "engines": { 153 | "node": ">=12" 154 | } 155 | }, 156 | "node_modules/@esbuild/linux-arm": { 157 | "version": "0.18.20", 158 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", 159 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 160 | "cpu": [ 161 | "arm" 162 | ], 163 | "dev": true, 164 | "optional": true, 165 | "os": [ 166 | "linux" 167 | ], 168 | "engines": { 169 | "node": ">=12" 170 | } 171 | }, 172 | "node_modules/@esbuild/linux-arm64": { 173 | "version": "0.18.20", 174 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", 175 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 176 | "cpu": [ 177 | "arm64" 178 | ], 179 | "dev": true, 180 | "optional": true, 181 | "os": [ 182 | "linux" 183 | ], 184 | "engines": { 185 | "node": ">=12" 186 | } 187 | }, 188 | "node_modules/@esbuild/linux-ia32": { 189 | "version": "0.18.20", 190 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", 191 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 192 | "cpu": [ 193 | "ia32" 194 | ], 195 | "dev": true, 196 | "optional": true, 197 | "os": [ 198 | "linux" 199 | ], 200 | "engines": { 201 | "node": ">=12" 202 | } 203 | }, 204 | "node_modules/@esbuild/linux-loong64": { 205 | "version": "0.18.20", 206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", 207 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 208 | "cpu": [ 209 | "loong64" 210 | ], 211 | "dev": true, 212 | "optional": true, 213 | "os": [ 214 | "linux" 215 | ], 216 | "engines": { 217 | "node": ">=12" 218 | } 219 | }, 220 | "node_modules/@esbuild/linux-mips64el": { 221 | "version": "0.18.20", 222 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", 223 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 224 | "cpu": [ 225 | "mips64el" 226 | ], 227 | "dev": true, 228 | "optional": true, 229 | "os": [ 230 | "linux" 231 | ], 232 | "engines": { 233 | "node": ">=12" 234 | } 235 | }, 236 | "node_modules/@esbuild/linux-ppc64": { 237 | "version": "0.18.20", 238 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", 239 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 240 | "cpu": [ 241 | "ppc64" 242 | ], 243 | "dev": true, 244 | "optional": true, 245 | "os": [ 246 | "linux" 247 | ], 248 | "engines": { 249 | "node": ">=12" 250 | } 251 | }, 252 | "node_modules/@esbuild/linux-riscv64": { 253 | "version": "0.18.20", 254 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", 255 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 256 | "cpu": [ 257 | "riscv64" 258 | ], 259 | "dev": true, 260 | "optional": true, 261 | "os": [ 262 | "linux" 263 | ], 264 | "engines": { 265 | "node": ">=12" 266 | } 267 | }, 268 | "node_modules/@esbuild/linux-s390x": { 269 | "version": "0.18.20", 270 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", 271 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 272 | "cpu": [ 273 | "s390x" 274 | ], 275 | "dev": true, 276 | "optional": true, 277 | "os": [ 278 | "linux" 279 | ], 280 | "engines": { 281 | "node": ">=12" 282 | } 283 | }, 284 | "node_modules/@esbuild/linux-x64": { 285 | "version": "0.18.20", 286 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", 287 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 288 | "cpu": [ 289 | "x64" 290 | ], 291 | "dev": true, 292 | "optional": true, 293 | "os": [ 294 | "linux" 295 | ], 296 | "engines": { 297 | "node": ">=12" 298 | } 299 | }, 300 | "node_modules/@esbuild/netbsd-x64": { 301 | "version": "0.18.20", 302 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", 303 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 304 | "cpu": [ 305 | "x64" 306 | ], 307 | "dev": true, 308 | "optional": true, 309 | "os": [ 310 | "netbsd" 311 | ], 312 | "engines": { 313 | "node": ">=12" 314 | } 315 | }, 316 | "node_modules/@esbuild/openbsd-x64": { 317 | "version": "0.18.20", 318 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", 319 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 320 | "cpu": [ 321 | "x64" 322 | ], 323 | "dev": true, 324 | "optional": true, 325 | "os": [ 326 | "openbsd" 327 | ], 328 | "engines": { 329 | "node": ">=12" 330 | } 331 | }, 332 | "node_modules/@esbuild/sunos-x64": { 333 | "version": "0.18.20", 334 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", 335 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 336 | "cpu": [ 337 | "x64" 338 | ], 339 | "dev": true, 340 | "optional": true, 341 | "os": [ 342 | "sunos" 343 | ], 344 | "engines": { 345 | "node": ">=12" 346 | } 347 | }, 348 | "node_modules/@esbuild/win32-arm64": { 349 | "version": "0.18.20", 350 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", 351 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 352 | "cpu": [ 353 | "arm64" 354 | ], 355 | "dev": true, 356 | "optional": true, 357 | "os": [ 358 | "win32" 359 | ], 360 | "engines": { 361 | "node": ">=12" 362 | } 363 | }, 364 | "node_modules/@esbuild/win32-ia32": { 365 | "version": "0.18.20", 366 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", 367 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 368 | "cpu": [ 369 | "ia32" 370 | ], 371 | "dev": true, 372 | "optional": true, 373 | "os": [ 374 | "win32" 375 | ], 376 | "engines": { 377 | "node": ">=12" 378 | } 379 | }, 380 | "node_modules/@esbuild/win32-x64": { 381 | "version": "0.18.20", 382 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", 383 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 384 | "cpu": [ 385 | "x64" 386 | ], 387 | "dev": true, 388 | "optional": true, 389 | "os": [ 390 | "win32" 391 | ], 392 | "engines": { 393 | "node": ">=12" 394 | } 395 | }, 396 | "node_modules/@nodelib/fs.scandir": { 397 | "version": "2.1.5", 398 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 399 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 400 | "dev": true, 401 | "dependencies": { 402 | "@nodelib/fs.stat": "2.0.5", 403 | "run-parallel": "^1.1.9" 404 | }, 405 | "engines": { 406 | "node": ">= 8" 407 | } 408 | }, 409 | "node_modules/@nodelib/fs.stat": { 410 | "version": "2.0.5", 411 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 412 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 413 | "dev": true, 414 | "engines": { 415 | "node": ">= 8" 416 | } 417 | }, 418 | "node_modules/@nodelib/fs.walk": { 419 | "version": "1.2.8", 420 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 421 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 422 | "dev": true, 423 | "dependencies": { 424 | "@nodelib/fs.scandir": "2.1.5", 425 | "fastq": "^1.6.0" 426 | }, 427 | "engines": { 428 | "node": ">= 8" 429 | } 430 | }, 431 | "node_modules/@rollup/pluginutils": { 432 | "version": "4.2.1", 433 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 434 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 435 | "dev": true, 436 | "dependencies": { 437 | "estree-walker": "^2.0.1", 438 | "picomatch": "^2.2.2" 439 | }, 440 | "engines": { 441 | "node": ">= 8.0.0" 442 | } 443 | }, 444 | "node_modules/@webcomponents/custom-elements": { 445 | "version": "1.6.0", 446 | "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.6.0.tgz", 447 | "integrity": "sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==", 448 | "dev": true 449 | }, 450 | "node_modules/acorn-walk": { 451 | "version": "8.3.2", 452 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 453 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 454 | "dev": true, 455 | "engines": { 456 | "node": ">=0.4.0" 457 | } 458 | }, 459 | "node_modules/boolbase": { 460 | "version": "1.0.0", 461 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 462 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 463 | "dev": true 464 | }, 465 | "node_modules/braces": { 466 | "version": "3.0.2", 467 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 468 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 469 | "dev": true, 470 | "dependencies": { 471 | "fill-range": "^7.0.1" 472 | }, 473 | "engines": { 474 | "node": ">=8" 475 | } 476 | }, 477 | "node_modules/cheerio": { 478 | "version": "1.0.0-rc.12", 479 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", 480 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", 481 | "dev": true, 482 | "dependencies": { 483 | "cheerio-select": "^2.1.0", 484 | "dom-serializer": "^2.0.0", 485 | "domhandler": "^5.0.3", 486 | "domutils": "^3.0.1", 487 | "htmlparser2": "^8.0.1", 488 | "parse5": "^7.0.0", 489 | "parse5-htmlparser2-tree-adapter": "^7.0.0" 490 | }, 491 | "engines": { 492 | "node": ">= 6" 493 | }, 494 | "funding": { 495 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1" 496 | } 497 | }, 498 | "node_modules/cheerio-select": { 499 | "version": "2.1.0", 500 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 501 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 502 | "dev": true, 503 | "dependencies": { 504 | "boolbase": "^1.0.0", 505 | "css-select": "^5.1.0", 506 | "css-what": "^6.1.0", 507 | "domelementtype": "^2.3.0", 508 | "domhandler": "^5.0.3", 509 | "domutils": "^3.0.1" 510 | }, 511 | "funding": { 512 | "url": "https://github.com/sponsors/fb55" 513 | } 514 | }, 515 | "node_modules/connect-injector": { 516 | "version": "0.4.4", 517 | "resolved": "https://registry.npmjs.org/connect-injector/-/connect-injector-0.4.4.tgz", 518 | "integrity": "sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==", 519 | "dev": true, 520 | "dependencies": { 521 | "debug": "^2.0.0", 522 | "q": "^1.0.1", 523 | "stream-buffers": "^0.2.3", 524 | "uberproto": "^1.1.0" 525 | }, 526 | "engines": { 527 | "node": ">= 0.8.0" 528 | } 529 | }, 530 | "node_modules/connect-injector/node_modules/debug": { 531 | "version": "2.6.9", 532 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 533 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 534 | "dev": true, 535 | "dependencies": { 536 | "ms": "2.0.0" 537 | } 538 | }, 539 | "node_modules/connect-injector/node_modules/ms": { 540 | "version": "2.0.0", 541 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 542 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 543 | "dev": true 544 | }, 545 | "node_modules/convert-source-map": { 546 | "version": "1.9.0", 547 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 548 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 549 | "dev": true 550 | }, 551 | "node_modules/css-select": { 552 | "version": "5.1.0", 553 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 554 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 555 | "dev": true, 556 | "dependencies": { 557 | "boolbase": "^1.0.0", 558 | "css-what": "^6.1.0", 559 | "domhandler": "^5.0.2", 560 | "domutils": "^3.0.1", 561 | "nth-check": "^2.0.1" 562 | }, 563 | "funding": { 564 | "url": "https://github.com/sponsors/fb55" 565 | } 566 | }, 567 | "node_modules/css-what": { 568 | "version": "6.1.0", 569 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 570 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 571 | "dev": true, 572 | "engines": { 573 | "node": ">= 6" 574 | }, 575 | "funding": { 576 | "url": "https://github.com/sponsors/fb55" 577 | } 578 | }, 579 | "node_modules/debug": { 580 | "version": "4.3.4", 581 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 582 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 583 | "dev": true, 584 | "dependencies": { 585 | "ms": "2.1.2" 586 | }, 587 | "engines": { 588 | "node": ">=6.0" 589 | }, 590 | "peerDependenciesMeta": { 591 | "supports-color": { 592 | "optional": true 593 | } 594 | } 595 | }, 596 | "node_modules/dom-serializer": { 597 | "version": "2.0.0", 598 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 599 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 600 | "dev": true, 601 | "dependencies": { 602 | "domelementtype": "^2.3.0", 603 | "domhandler": "^5.0.2", 604 | "entities": "^4.2.0" 605 | }, 606 | "funding": { 607 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 608 | } 609 | }, 610 | "node_modules/domelementtype": { 611 | "version": "2.3.0", 612 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 613 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 614 | "dev": true, 615 | "funding": [ 616 | { 617 | "type": "github", 618 | "url": "https://github.com/sponsors/fb55" 619 | } 620 | ] 621 | }, 622 | "node_modules/domhandler": { 623 | "version": "5.0.3", 624 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 625 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 626 | "dev": true, 627 | "dependencies": { 628 | "domelementtype": "^2.3.0" 629 | }, 630 | "engines": { 631 | "node": ">= 4" 632 | }, 633 | "funding": { 634 | "url": "https://github.com/fb55/domhandler?sponsor=1" 635 | } 636 | }, 637 | "node_modules/domutils": { 638 | "version": "3.1.0", 639 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", 640 | "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", 641 | "dev": true, 642 | "dependencies": { 643 | "dom-serializer": "^2.0.0", 644 | "domelementtype": "^2.3.0", 645 | "domhandler": "^5.0.3" 646 | }, 647 | "funding": { 648 | "url": "https://github.com/fb55/domutils?sponsor=1" 649 | } 650 | }, 651 | "node_modules/entities": { 652 | "version": "4.5.0", 653 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 654 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 655 | "dev": true, 656 | "engines": { 657 | "node": ">=0.12" 658 | }, 659 | "funding": { 660 | "url": "https://github.com/fb55/entities?sponsor=1" 661 | } 662 | }, 663 | "node_modules/es-module-lexer": { 664 | "version": "0.10.5", 665 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", 666 | "integrity": "sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==", 667 | "dev": true 668 | }, 669 | "node_modules/esbuild": { 670 | "version": "0.18.20", 671 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", 672 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 673 | "dev": true, 674 | "hasInstallScript": true, 675 | "bin": { 676 | "esbuild": "bin/esbuild" 677 | }, 678 | "engines": { 679 | "node": ">=12" 680 | }, 681 | "optionalDependencies": { 682 | "@esbuild/android-arm": "0.18.20", 683 | "@esbuild/android-arm64": "0.18.20", 684 | "@esbuild/android-x64": "0.18.20", 685 | "@esbuild/darwin-arm64": "0.18.20", 686 | "@esbuild/darwin-x64": "0.18.20", 687 | "@esbuild/freebsd-arm64": "0.18.20", 688 | "@esbuild/freebsd-x64": "0.18.20", 689 | "@esbuild/linux-arm": "0.18.20", 690 | "@esbuild/linux-arm64": "0.18.20", 691 | "@esbuild/linux-ia32": "0.18.20", 692 | "@esbuild/linux-loong64": "0.18.20", 693 | "@esbuild/linux-mips64el": "0.18.20", 694 | "@esbuild/linux-ppc64": "0.18.20", 695 | "@esbuild/linux-riscv64": "0.18.20", 696 | "@esbuild/linux-s390x": "0.18.20", 697 | "@esbuild/linux-x64": "0.18.20", 698 | "@esbuild/netbsd-x64": "0.18.20", 699 | "@esbuild/openbsd-x64": "0.18.20", 700 | "@esbuild/sunos-x64": "0.18.20", 701 | "@esbuild/win32-arm64": "0.18.20", 702 | "@esbuild/win32-ia32": "0.18.20", 703 | "@esbuild/win32-x64": "0.18.20" 704 | } 705 | }, 706 | "node_modules/estree-walker": { 707 | "version": "2.0.2", 708 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 709 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 710 | "dev": true 711 | }, 712 | "node_modules/fast-glob": { 713 | "version": "3.3.2", 714 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 715 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 716 | "dev": true, 717 | "dependencies": { 718 | "@nodelib/fs.stat": "^2.0.2", 719 | "@nodelib/fs.walk": "^1.2.3", 720 | "glob-parent": "^5.1.2", 721 | "merge2": "^1.3.0", 722 | "micromatch": "^4.0.4" 723 | }, 724 | "engines": { 725 | "node": ">=8.6.0" 726 | } 727 | }, 728 | "node_modules/fastq": { 729 | "version": "1.16.0", 730 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", 731 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 732 | "dev": true, 733 | "dependencies": { 734 | "reusify": "^1.0.4" 735 | } 736 | }, 737 | "node_modules/fill-range": { 738 | "version": "7.0.1", 739 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 740 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 741 | "dev": true, 742 | "dependencies": { 743 | "to-regex-range": "^5.0.1" 744 | }, 745 | "engines": { 746 | "node": ">=8" 747 | } 748 | }, 749 | "node_modules/fs-extra": { 750 | "version": "10.1.0", 751 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 752 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 753 | "dev": true, 754 | "dependencies": { 755 | "graceful-fs": "^4.2.0", 756 | "jsonfile": "^6.0.1", 757 | "universalify": "^2.0.0" 758 | }, 759 | "engines": { 760 | "node": ">=12" 761 | } 762 | }, 763 | "node_modules/fsevents": { 764 | "version": "2.3.3", 765 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 766 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 767 | "dev": true, 768 | "hasInstallScript": true, 769 | "optional": true, 770 | "os": [ 771 | "darwin" 772 | ], 773 | "engines": { 774 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 775 | } 776 | }, 777 | "node_modules/glob-parent": { 778 | "version": "5.1.2", 779 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 780 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 781 | "dev": true, 782 | "dependencies": { 783 | "is-glob": "^4.0.1" 784 | }, 785 | "engines": { 786 | "node": ">= 6" 787 | } 788 | }, 789 | "node_modules/graceful-fs": { 790 | "version": "4.2.11", 791 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 792 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 793 | "dev": true 794 | }, 795 | "node_modules/htmlparser2": { 796 | "version": "8.0.2", 797 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", 798 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 799 | "dev": true, 800 | "funding": [ 801 | "https://github.com/fb55/htmlparser2?sponsor=1", 802 | { 803 | "type": "github", 804 | "url": "https://github.com/sponsors/fb55" 805 | } 806 | ], 807 | "dependencies": { 808 | "domelementtype": "^2.3.0", 809 | "domhandler": "^5.0.3", 810 | "domutils": "^3.0.1", 811 | "entities": "^4.4.0" 812 | } 813 | }, 814 | "node_modules/is-extglob": { 815 | "version": "2.1.1", 816 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 817 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 818 | "dev": true, 819 | "engines": { 820 | "node": ">=0.10.0" 821 | } 822 | }, 823 | "node_modules/is-glob": { 824 | "version": "4.0.3", 825 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 826 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 827 | "dev": true, 828 | "dependencies": { 829 | "is-extglob": "^2.1.1" 830 | }, 831 | "engines": { 832 | "node": ">=0.10.0" 833 | } 834 | }, 835 | "node_modules/is-number": { 836 | "version": "7.0.0", 837 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 838 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 839 | "dev": true, 840 | "engines": { 841 | "node": ">=0.12.0" 842 | } 843 | }, 844 | "node_modules/jsesc": { 845 | "version": "3.0.2", 846 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", 847 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", 848 | "dev": true, 849 | "bin": { 850 | "jsesc": "bin/jsesc" 851 | }, 852 | "engines": { 853 | "node": ">=6" 854 | } 855 | }, 856 | "node_modules/jsonfile": { 857 | "version": "6.1.0", 858 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 859 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 860 | "dev": true, 861 | "dependencies": { 862 | "universalify": "^2.0.0" 863 | }, 864 | "optionalDependencies": { 865 | "graceful-fs": "^4.1.6" 866 | } 867 | }, 868 | "node_modules/magic-string": { 869 | "version": "0.26.7", 870 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", 871 | "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", 872 | "dev": true, 873 | "dependencies": { 874 | "sourcemap-codec": "^1.4.8" 875 | }, 876 | "engines": { 877 | "node": ">=12" 878 | } 879 | }, 880 | "node_modules/merge2": { 881 | "version": "1.4.1", 882 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 883 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 884 | "dev": true, 885 | "engines": { 886 | "node": ">= 8" 887 | } 888 | }, 889 | "node_modules/micromatch": { 890 | "version": "4.0.5", 891 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 892 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 893 | "dev": true, 894 | "dependencies": { 895 | "braces": "^3.0.2", 896 | "picomatch": "^2.3.1" 897 | }, 898 | "engines": { 899 | "node": ">=8.6" 900 | } 901 | }, 902 | "node_modules/ms": { 903 | "version": "2.1.2", 904 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 905 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 906 | "dev": true 907 | }, 908 | "node_modules/nanoid": { 909 | "version": "3.3.7", 910 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 911 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 912 | "dev": true, 913 | "funding": [ 914 | { 915 | "type": "github", 916 | "url": "https://github.com/sponsors/ai" 917 | } 918 | ], 919 | "bin": { 920 | "nanoid": "bin/nanoid.cjs" 921 | }, 922 | "engines": { 923 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 924 | } 925 | }, 926 | "node_modules/nth-check": { 927 | "version": "2.1.1", 928 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 929 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 930 | "dev": true, 931 | "dependencies": { 932 | "boolbase": "^1.0.0" 933 | }, 934 | "funding": { 935 | "url": "https://github.com/fb55/nth-check?sponsor=1" 936 | } 937 | }, 938 | "node_modules/parse5": { 939 | "version": "7.1.2", 940 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", 941 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", 942 | "dev": true, 943 | "dependencies": { 944 | "entities": "^4.4.0" 945 | }, 946 | "funding": { 947 | "url": "https://github.com/inikulin/parse5?sponsor=1" 948 | } 949 | }, 950 | "node_modules/parse5-htmlparser2-tree-adapter": { 951 | "version": "7.0.0", 952 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", 953 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", 954 | "dev": true, 955 | "dependencies": { 956 | "domhandler": "^5.0.2", 957 | "parse5": "^7.0.0" 958 | }, 959 | "funding": { 960 | "url": "https://github.com/inikulin/parse5?sponsor=1" 961 | } 962 | }, 963 | "node_modules/picocolors": { 964 | "version": "1.0.0", 965 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 966 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 967 | "dev": true 968 | }, 969 | "node_modules/picomatch": { 970 | "version": "2.3.1", 971 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 972 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 973 | "dev": true, 974 | "engines": { 975 | "node": ">=8.6" 976 | }, 977 | "funding": { 978 | "url": "https://github.com/sponsors/jonschlinkert" 979 | } 980 | }, 981 | "node_modules/postcss": { 982 | "version": "8.4.33", 983 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", 984 | "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", 985 | "dev": true, 986 | "funding": [ 987 | { 988 | "type": "opencollective", 989 | "url": "https://opencollective.com/postcss/" 990 | }, 991 | { 992 | "type": "tidelift", 993 | "url": "https://tidelift.com/funding/github/npm/postcss" 994 | }, 995 | { 996 | "type": "github", 997 | "url": "https://github.com/sponsors/ai" 998 | } 999 | ], 1000 | "dependencies": { 1001 | "nanoid": "^3.3.7", 1002 | "picocolors": "^1.0.0", 1003 | "source-map-js": "^1.0.2" 1004 | }, 1005 | "engines": { 1006 | "node": "^10 || ^12 || >=14" 1007 | } 1008 | }, 1009 | "node_modules/prettier": { 1010 | "version": "3.2.4", 1011 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", 1012 | "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", 1013 | "dev": true, 1014 | "bin": { 1015 | "prettier": "bin/prettier.cjs" 1016 | }, 1017 | "engines": { 1018 | "node": ">=14" 1019 | }, 1020 | "funding": { 1021 | "url": "https://github.com/prettier/prettier?sponsor=1" 1022 | } 1023 | }, 1024 | "node_modules/q": { 1025 | "version": "1.5.1", 1026 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1027 | "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", 1028 | "dev": true, 1029 | "engines": { 1030 | "node": ">=0.6.0", 1031 | "teleport": ">=0.2.0" 1032 | } 1033 | }, 1034 | "node_modules/queue-microtask": { 1035 | "version": "1.2.3", 1036 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1037 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1038 | "dev": true, 1039 | "funding": [ 1040 | { 1041 | "type": "github", 1042 | "url": "https://github.com/sponsors/feross" 1043 | }, 1044 | { 1045 | "type": "patreon", 1046 | "url": "https://www.patreon.com/feross" 1047 | }, 1048 | { 1049 | "type": "consulting", 1050 | "url": "https://feross.org/support" 1051 | } 1052 | ] 1053 | }, 1054 | "node_modules/react-refresh": { 1055 | "version": "0.13.0", 1056 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz", 1057 | "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==", 1058 | "dev": true, 1059 | "engines": { 1060 | "node": ">=0.10.0" 1061 | } 1062 | }, 1063 | "node_modules/reusify": { 1064 | "version": "1.0.4", 1065 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1066 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1067 | "dev": true, 1068 | "engines": { 1069 | "iojs": ">=1.0.0", 1070 | "node": ">=0.10.0" 1071 | } 1072 | }, 1073 | "node_modules/rollup": { 1074 | "version": "2.78.1", 1075 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 1076 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 1077 | "dev": true, 1078 | "bin": { 1079 | "rollup": "dist/bin/rollup" 1080 | }, 1081 | "engines": { 1082 | "node": ">=10.0.0" 1083 | }, 1084 | "optionalDependencies": { 1085 | "fsevents": "~2.3.2" 1086 | } 1087 | }, 1088 | "node_modules/run-parallel": { 1089 | "version": "1.2.0", 1090 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1091 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1092 | "dev": true, 1093 | "funding": [ 1094 | { 1095 | "type": "github", 1096 | "url": "https://github.com/sponsors/feross" 1097 | }, 1098 | { 1099 | "type": "patreon", 1100 | "url": "https://www.patreon.com/feross" 1101 | }, 1102 | { 1103 | "type": "consulting", 1104 | "url": "https://feross.org/support" 1105 | } 1106 | ], 1107 | "dependencies": { 1108 | "queue-microtask": "^1.2.2" 1109 | } 1110 | }, 1111 | "node_modules/rxjs": { 1112 | "version": "7.5.7", 1113 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", 1114 | "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", 1115 | "dev": true, 1116 | "dependencies": { 1117 | "tslib": "^2.1.0" 1118 | } 1119 | }, 1120 | "node_modules/source-map-js": { 1121 | "version": "1.0.2", 1122 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1123 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1124 | "dev": true, 1125 | "engines": { 1126 | "node": ">=0.10.0" 1127 | } 1128 | }, 1129 | "node_modules/sourcemap-codec": { 1130 | "version": "1.4.8", 1131 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1132 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1133 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 1134 | "dev": true 1135 | }, 1136 | "node_modules/stream-buffers": { 1137 | "version": "0.2.6", 1138 | "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-0.2.6.tgz", 1139 | "integrity": "sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==", 1140 | "dev": true, 1141 | "engines": { 1142 | "node": ">= 0.3.0" 1143 | } 1144 | }, 1145 | "node_modules/to-regex-range": { 1146 | "version": "5.0.1", 1147 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1148 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1149 | "dev": true, 1150 | "dependencies": { 1151 | "is-number": "^7.0.0" 1152 | }, 1153 | "engines": { 1154 | "node": ">=8.0" 1155 | } 1156 | }, 1157 | "node_modules/tslib": { 1158 | "version": "2.6.2", 1159 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 1160 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 1161 | "dev": true 1162 | }, 1163 | "node_modules/uberproto": { 1164 | "version": "1.2.0", 1165 | "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-1.2.0.tgz", 1166 | "integrity": "sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==", 1167 | "dev": true, 1168 | "engines": { 1169 | "node": "*" 1170 | } 1171 | }, 1172 | "node_modules/universalify": { 1173 | "version": "2.0.1", 1174 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1175 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 1176 | "dev": true, 1177 | "engines": { 1178 | "node": ">= 10.0.0" 1179 | } 1180 | }, 1181 | "node_modules/vite": { 1182 | "version": "4.5.2", 1183 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", 1184 | "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", 1185 | "dev": true, 1186 | "dependencies": { 1187 | "esbuild": "^0.18.10", 1188 | "postcss": "^8.4.27", 1189 | "rollup": "^3.27.1" 1190 | }, 1191 | "bin": { 1192 | "vite": "bin/vite.js" 1193 | }, 1194 | "engines": { 1195 | "node": "^14.18.0 || >=16.0.0" 1196 | }, 1197 | "funding": { 1198 | "url": "https://github.com/vitejs/vite?sponsor=1" 1199 | }, 1200 | "optionalDependencies": { 1201 | "fsevents": "~2.3.2" 1202 | }, 1203 | "peerDependencies": { 1204 | "@types/node": ">= 14", 1205 | "less": "*", 1206 | "lightningcss": "^1.21.0", 1207 | "sass": "*", 1208 | "stylus": "*", 1209 | "sugarss": "*", 1210 | "terser": "^5.4.0" 1211 | }, 1212 | "peerDependenciesMeta": { 1213 | "@types/node": { 1214 | "optional": true 1215 | }, 1216 | "less": { 1217 | "optional": true 1218 | }, 1219 | "lightningcss": { 1220 | "optional": true 1221 | }, 1222 | "sass": { 1223 | "optional": true 1224 | }, 1225 | "stylus": { 1226 | "optional": true 1227 | }, 1228 | "sugarss": { 1229 | "optional": true 1230 | }, 1231 | "terser": { 1232 | "optional": true 1233 | } 1234 | } 1235 | }, 1236 | "node_modules/vite/node_modules/rollup": { 1237 | "version": "3.29.4", 1238 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", 1239 | "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", 1240 | "dev": true, 1241 | "bin": { 1242 | "rollup": "dist/bin/rollup" 1243 | }, 1244 | "engines": { 1245 | "node": ">=14.18.0", 1246 | "npm": ">=8.0.0" 1247 | }, 1248 | "optionalDependencies": { 1249 | "fsevents": "~2.3.2" 1250 | } 1251 | } 1252 | } 1253 | } 1254 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "AdBlitz", 3 | "version": "0.1.0", 4 | "author": "Dikshant Rajput", 5 | "description": "AdBlitz: Your Shortcut to Ad-Free Streaming", 6 | "type": "module", 7 | "license": "MIT", 8 | "keywords": [ 9 | "chrome-extension", 10 | "vanilla", 11 | "vite", 12 | "create-chrome-ext" 13 | ], 14 | "engines": { 15 | "node": ">=14.18.0" 16 | }, 17 | "scripts": { 18 | "dev": "vite", 19 | "build": "vite build", 20 | "preview": "vite preview", 21 | "fmt": "prettier --write '**/*.{js,json,css,scss,md}'" 22 | }, 23 | "dependencies": {}, 24 | "devDependencies": { 25 | "@crxjs/vite-plugin": "^2.0.0-beta.19", 26 | "prettier": "^3.0.3", 27 | "vite": "^4.4.11" 28 | } 29 | } -------------------------------------------------------------------------------- /popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | AdBlitz 7 | 46 | 47 | 48 |
49 |

AdBlitz

50 |

Total ads skipped: 0

51 |

Total ads speeded: 0

52 | 53 |
54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /public/img/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/img/android-chrome-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/android-chrome-384x384.png -------------------------------------------------------------------------------- /public/img/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/apple-touch-icon.png -------------------------------------------------------------------------------- /public/img/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/img/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/favicon-16x16.png -------------------------------------------------------------------------------- /public/img/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/favicon-32x32.png -------------------------------------------------------------------------------- /public/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/favicon.ico -------------------------------------------------------------------------------- /public/img/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/mstile-150x150.png -------------------------------------------------------------------------------- /public/img/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.14, written by Peter Selinger 2001-2017 9 | 10 | 12 | 25 | 27 | 29 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /public/img/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-384x384.png", 12 | "sizes": "384x384", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /src/assets/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/src/assets/demo.gif -------------------------------------------------------------------------------- /src/assets/how-to-install.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/src/assets/how-to-install.gif -------------------------------------------------------------------------------- /src/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/src/assets/icon.png -------------------------------------------------------------------------------- /src/assets/small-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/src/assets/small-demo.gif -------------------------------------------------------------------------------- /src/background/index.js: -------------------------------------------------------------------------------- 1 | chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 2 | switch(message.action){ 3 | case "adSkipped": 4 | chrome.storage.local.get('adCount', function(data) { 5 | const adCount = data.adCount || 0; 6 | chrome.storage.local.set({ 'adCount': adCount + 1 }); 7 | }); 8 | case "adSpeeded": 9 | chrome.storage.local.get('adSpeed', function(data) { 10 | const adSpeed = data.adSpeed || 0; 11 | chrome.storage.local.set({ 'adSpeed': adSpeed + 1 }); 12 | }); 13 | default: 14 | console.log("Action not defined"); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /src/contentScript/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Initializes the ad skipping functionality and observes changes in the target node. 3 | * @param {Node} targetNode - The node to observe for changes. 4 | */ 5 | // variable to store the MutationObserver instance 6 | let observer; 7 | 8 | // Function to handle ad skipping logic 9 | const execute = (targetNode) => { 10 | const increaseAdPlaybackSpeed = () => { 11 | const videoElement = document.querySelector("video") 12 | if (videoElement) { 13 | videoElement.playbackRate = 16 14 | videoElement.volume = 0 15 | chrome.runtime.sendMessage({ action: 'adSpeeded' }); 16 | } 17 | } 18 | 19 | const skipAdFallback = () => { 20 | let isSkipped = false; 21 | const skipAddButtons = document.getElementsByClassName("ytp-ad-skip-button-text"); 22 | if (skipAddButtons.length === 1) { 23 | const button = skipAddButtons[0]; 24 | const skipButtonCta = button.parentElement.classList.contains("ytp-ad-skip-button-modern"); 25 | if (skipButtonCta) { 26 | button.parentElement.click(); 27 | chrome.runtime.sendMessage({ action: 'adSkipped' }); 28 | isSkipped = true 29 | } 30 | } 31 | 32 | return isSkipped 33 | } 34 | 35 | // Function to skip the ad 36 | const skipAd = () => { 37 | const skipAddButtons = document.getElementsByClassName("ytp-skip-ad-button"); 38 | if (skipAddButtons.length) { 39 | const skipButtonCta = skipAddButtons[0]; 40 | if (skipButtonCta) { 41 | skipButtonCta.click(); 42 | chrome.runtime.sendMessage({ action: 'adSkipped' }); 43 | } 44 | } else if(! skipAdFallback()){ 45 | increaseAdPlaybackSpeed() 46 | } 47 | }; 48 | 49 | // Function to check if a node has child elements 50 | const checkChildElements = (node) => { 51 | return node?.children?.length > 0 52 | } 53 | 54 | // Function to check for child elements and skip ad 55 | const checkForChildElementAndSkipAd = (node) => { 56 | checkChildElements(node) && skipAd() 57 | } 58 | 59 | // Callback function for MutationObserver 60 | const observerCallback = (mutationsList, observer) => { 61 | for (let mutation of mutationsList) { 62 | if (mutation.type === 'childList') { 63 | checkForChildElementAndSkipAd(targetNode) 64 | } 65 | } 66 | } 67 | 68 | // Disconnect existing observer if any 69 | if (observer && observer.disconnect) { 70 | observer.disconnect() 71 | } 72 | 73 | // Create a new MutationObserver to observe targetNode 74 | observer = new MutationObserver(observerCallback); 75 | observer.observe(targetNode, { childList: true }); 76 | // Check for child elements and skip ad initially 77 | checkForChildElementAndSkipAd(targetNode) 78 | } 79 | 80 | /** 81 | * Handles changes in the URL and triggers ad skipping logic accordingly. 82 | */ 83 | 84 | // Variable to store the previous URL 85 | let previousTitle = '' 86 | 87 | // Function to handle URL changes 88 | const handleUrlChange = () => { 89 | // Check if URL has changed 90 | if (document.title !== previousTitle) { 91 | // Update previousUrl with current URL 92 | previousTitle = document.title; 93 | 94 | // Find the targetNode containing video ads 95 | const targetNode = document.querySelector(".video-ads.ytp-ad-module"); 96 | // Execute ad skipping logic if targetNode exists 97 | targetNode && execute(targetNode) 98 | 99 | } 100 | } 101 | /** 102 | * Observes changes in the element to detect URL changes. 103 | */ 104 | // MutationObserver to observe changes to the element for URL changes 105 | const observerForUrlChange = new MutationObserver(handleUrlChange); 106 | observerForUrlChange.observe(document.querySelector('title'), { childList: true }); -------------------------------------------------------------------------------- /src/manifest.js: -------------------------------------------------------------------------------- 1 | import { defineManifest } from '@crxjs/vite-plugin' 2 | import packageData from '../package.json' 3 | 4 | export default defineManifest({ 5 | name: packageData.name, 6 | description: packageData.description, 7 | version: packageData.version, 8 | manifest_version: 3, 9 | icons: { 10 | 16: 'img/favicon-16x16.png', 11 | 32: 'img/favicon-32x32.png', 12 | 192: 'img/android-chrome-192x192.png', 13 | }, 14 | action: { 15 | default_popup: 'popup.html', 16 | default_icon: 'img/apple-touch-icon.png', 17 | }, 18 | background: { 19 | service_worker: 'src/background/index.js', 20 | type: 'module', 21 | }, 22 | content_scripts: [ 23 | { 24 | "matches": ["*://*.youtube.com/*"], 25 | "js": ["src/contentScript/index.js"] 26 | } 27 | ], 28 | web_accessible_resources: [ 29 | { 30 | resources: ['img/favicon-16x16.png', 'img/favicon-32x32.png', 'img/android-chrome-192x192.png'], 31 | matches: [], 32 | }, 33 | ], 34 | permissions: ['activeTab', 'storage'], 35 | }) 36 | -------------------------------------------------------------------------------- /src/popup/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: 3 | system-ui, 4 | -apple-system, 5 | BlinkMacSystemFont, 6 | 'Segoe UI', 7 | Roboto, 8 | Oxygen, 9 | Ubuntu, 10 | Cantarell, 11 | 'Open Sans', 12 | 'Helvetica Neue', 13 | sans-serif; 14 | 15 | color-scheme: light dark; 16 | background-color: #242424; 17 | } 18 | 19 | @media (prefers-color-scheme: light) { 20 | :root { 21 | background-color: #fafafa; 22 | } 23 | 24 | a:hover { 25 | color: #f3e5ab; 26 | } 27 | } 28 | 29 | body { 30 | min-width: 20rem; 31 | margin: 0; 32 | } 33 | 34 | main { 35 | text-align: center; 36 | padding: 1em; 37 | margin: 0 auto; 38 | } 39 | 40 | h3 { 41 | color: #f3e5ab; 42 | text-transform: uppercase; 43 | font-size: 1.5rem; 44 | font-weight: 200; 45 | line-height: 1.2rem; 46 | margin: 2rem auto; 47 | } 48 | 49 | .calc { 50 | display: flex; 51 | justify-content: center; 52 | align-items: center; 53 | margin: 2rem; 54 | } 55 | 56 | button { 57 | font-size: 1rem; 58 | padding: 0.5rem 1rem; 59 | border: 1px solid #f3e5ab; 60 | border-radius: 0.25rem; 61 | background-color: transparent; 62 | color: #f3e5ab; 63 | cursor: pointer; 64 | outline: none; 65 | 66 | width: 3rem; 67 | margin: 0 a; 68 | } 69 | 70 | label { 71 | font-size: 1.5rem; 72 | margin: 0 1rem; 73 | } 74 | 75 | a { 76 | font-size: 0.5rem; 77 | margin: 0.5rem; 78 | color: #cccccc; 79 | text-decoration: none; 80 | } 81 | -------------------------------------------------------------------------------- /src/popup/index.js: -------------------------------------------------------------------------------- 1 | // Retrieve ad count from local storage and update popup 2 | chrome.storage.local.get('adCount', function(data) { 3 | const adCount = data.adCount || 0; 4 | document.getElementById('adCount').textContent = adCount; 5 | }); 6 | 7 | chrome.storage.local.get('adSpeed', function(data) { 8 | const adSpeed = data.adSpeed || 0; 9 | document.getElementById('adSpeed').textContent = adSpeed; 10 | }); -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { crx } from '@crxjs/vite-plugin' 3 | import manifest from './src/manifest.js' 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig(({ mode }) => { 7 | return { 8 | build: { 9 | emptyOutDir: true, 10 | outDir: 'build', 11 | rollupOptions: { 12 | output: { 13 | chunkFileNames: 'assets/chunk-[hash].js', 14 | }, 15 | }, 16 | }, 17 | 18 | plugins: [crx({ manifest })], 19 | } 20 | }) 21 | --------------------------------------------------------------------------------