From 5243ff0850bb604ef50ce71af9a47ee5e357e9a1 Mon Sep 17 00:00:00 2001 From: mskian <10300271+mskian@users.noreply.github.com> Date: Thu, 26 Dec 2024 11:42:49 +0530 Subject: [PATCH] first commit --- .github/actions/prepare/action.yml | 16 + .github/workflows/build.yml | 17 + .gitignore | 95 +++ LICENSE | 21 + README.md | 69 ++ copy.js | 33 + index.ts | 106 +++ package.json | 23 + pnpm-lock.yaml | 1262 ++++++++++++++++++++++++++++ public/192.png | Bin 0 -> 18663 bytes public/favicon.ico | Bin 0 -> 5238 bytes public/index.html | 388 +++++++++ renovate.json | 17 + tmux.sh | 3 + tsconfig.json | 13 + utils/error.ts | 7 + utils/secureHeaders.ts | 10 + 17 files changed, 2080 insertions(+) create mode 100644 .github/actions/prepare/action.yml create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 copy.js create mode 100644 index.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/192.png create mode 100644 public/favicon.ico create mode 100644 public/index.html create mode 100644 renovate.json create mode 100644 tmux.sh create mode 100644 tsconfig.json create mode 100644 utils/error.ts create mode 100644 utils/secureHeaders.ts diff --git a/.github/actions/prepare/action.yml b/.github/actions/prepare/action.yml new file mode 100644 index 0000000..8737fe1 --- /dev/null +++ b/.github/actions/prepare/action.yml @@ -0,0 +1,16 @@ +description: Prepares the repo for a typical CI job + +name: Prepare + +runs: + steps: + - uses: pnpm/action-setup@v4.0.0 + with: + version: 9 + - uses: actions/setup-node@v4 + with: + node-version: '20.x' + cache: pnpm + - run: pnpm install + shell: bash + using: composite \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..1042ec9 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,17 @@ +name: build-test + +on: + pull_request: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/prepare + - name: use pnpm to build API Server + run: | + pnpm build \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5564068 --- /dev/null +++ b/.gitignore @@ -0,0 +1,95 @@ +### Node template +# Logs +/logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.vercel +/public/sitemap.xml +/public/robots.txt +data +/data +data/status.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# Nuxt generate +dist + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# IDE / Editor +.idea + +# Service worker +sw.* + +# macOS +.DS_Store + +# Vim swap files +*.swp \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0a004c0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2025 sanweb.info + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ba33eea --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# 🌐 Live Cricket Score 🏏 + +![build-test](https://github.com/sanwebinfo/ts-cricket-score/workflows/build-test/badge.svg) + +🌍 Free Live Cricket Score JSON API (Typescript Version) - Get data from Cricbuzz - Live Cricket Score API ⚡ + +Typescript Version - Get Live Cricket Score data from Cricbuzz.com + +This is an unofficial API and not Linked or Partnered with Any Brands/Company. + +**Note** + +I primarily built this tool for personal use, and I mostly run it on my home server or localhost.This tool is not recommended for production use, this is for educational purpose , you are welcome to fork the project and make any changes as needed. + +## Setup + +- Download or Clone the repo +- install dependencies + +```sh +pnpm install +``` + +- Development + +```sh +pnpm dev +``` + +- Build a Project + +```sh +pnpm build +``` + +- Start the server + +```sh +pnpm start +``` + +## Routes + +- `/` - Static Home Page for Fetch Live Cricket Score +- `/score` - Score API + +## API Usage + +- Get Live Cricket Score + +```sh +curl http://localhost:6020/score?id=12345 +``` + +## Disclaimer 🗃 + +- This is not an Offical API from Cricbuzz - it's an Unofficial API +- This is for Education Purpose only - use at your own risk on Production Site +- All Credits Goes to + +The score data retrieved from CricBuzz is collected strictly for personal use only. This data is scraped using custom scripts and stored locally on my Android device, which functions as a personal server. The data is accessed and displayed via Termux, and the network traffic is securely proxied through a Cloudflare Argo Tunnel. + +This setup is fully contained within my personal environment and is not accessible to the outside world. The data is not served externally or used for any commercial purposes. I do not claim ownership of any data or content provided by CricBuzz. The scraping process is solely for personal use and complies with CricBuzz’s terms of service, ensuring no infringement on their intellectual property rights. + +Please note that any use, redistribution, or public display beyond personal use may violate CricBuzz’s terms and may be subject to legal or ethical consequences. I take no responsibility for any actions outside of personal, non-commercial use. + +## LICENSE + +MIT diff --git a/copy.js b/copy.js new file mode 100644 index 0000000..5f634c1 --- /dev/null +++ b/copy.js @@ -0,0 +1,33 @@ +const fs = require('fs'); +const path = require('path'); + +const publicSrcDir = path.join(__dirname, 'public'); +const distDir = path.join(__dirname, 'dist'); + +if (!fs.existsSync(path.join(distDir, 'public'))) { + fs.mkdirSync(path.join(distDir, 'public'), { recursive: true }); +} + +function copyFiles(src, dest) { + const stats = fs.statSync(src); + if (stats.isDirectory()) { + if (!fs.existsSync(dest)) { + fs.mkdirSync(dest, { recursive: true }); + } + fs.readdirSync(src).forEach((file) => { + const srcFile = path.join(src, file); + const destFile = path.join(dest, file); + copyFiles(srcFile, destFile); + }); + } else { + fs.copyFileSync(src, dest); + } +} + +fs.readdirSync(publicSrcDir).forEach(file => { + const srcFile = path.join(publicSrcDir, file); + const destFile = path.join(distDir, 'public', file); + copyFiles(srcFile, destFile); +}); + +console.log('Public folders copied successfully!'); diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..72fbea1 --- /dev/null +++ b/index.ts @@ -0,0 +1,106 @@ +import express, { Application, Request, Response, NextFunction } from "express"; +import axios from "axios"; +import * as cheerio from "cheerio"; +import path from 'path'; +import errorHandler from './utils/error'; +import { setSecureHeaders } from "./utils/secureHeaders"; + +const app: Application = express(); +const PORT = process.env.PORT || 6020; + +app.use(express.json()); +app.use( + express.urlencoded({ + extended: true, + }) +); +app.use(setSecureHeaders); +app.disable("x-powered-by"); + +app.use(express.static(path.join(__dirname, '.', 'public'))); +app.get('/', (req: Request, res: Response) => { + res.sendFile(path.join(__dirname, '.', 'public', 'index.html')); +}); + +const fetchHTML = async (url: string): Promise => { + try { + const response = await axios.get(url, { + headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" }, + }); + return response.data; + } catch (error) { + throw new Error("Failed to fetch the HTML content"); + } +}; + +const parseCricketScore = ($: cheerio.CheerioAPI): Record => { + const getText = (selector: string): string => + $(selector).first().text().trim() || "Match Stats will Update Soon"; + + const matchStatuses: string[] = [ + ".cb-col.cb-col-100.cb-min-stts.cb-text-complete", + ".cb-text-inprogress", + ".cb-col.cb-col-100.cb-font-18.cb-toss-sts.cb-text-abandon", + ".cb-text-stumps", + ".cb-text-lunch", + ".cb-text-inningsbreak", + ".cb-text-tea", + ".cb-text-rain", + ".cb-text-wetoutfield", + ".cb-text-delay", + ".cb-col.cb-col-100.cb-font-18.cb-toss-sts.cb-text-", + ]; + + const matchUpdate = matchStatuses + .map((selector) => $(selector).first().text().trim()) + .find((status) => status) || "Match Stats will Update Soon"; + + const matchDateElement = $('span[itemprop="startDate"]').attr("content"); + const matchDate = + matchDateElement && + new Date(matchDateElement).toLocaleString("en-IN", { + timeZone: "Asia/Kolkata", + hour12: true, + }); + + return { + title: getText("h1.cb-nav-hdr").replace(" - Live Cricket Score, Commentary", "").trim(), + update: matchUpdate, + matchDate: matchDate ? `Date: ${matchDate}` : "Match Stats will Update Soon", + livescore: getText(".cb-font-20.text-bold"), + runrate: `${getText(".cb-font-12.cb-text-gray")}`, + }; + }; + +const asyncHandler = + (fn: (req: Request, res: Response, next: NextFunction) => Promise) => + (req: Request, res: Response, next: NextFunction): void => { + Promise.resolve(fn(req, res, next)).catch(next); + }; + +app.get( + "/score", + asyncHandler(async (req: Request, res: Response) => { + const id = req.query.id as string; + if (!id) { + res.status(400).json({ error: "Match ID is required" }); + return; + } + + const url = `https://www.cricbuzz.com/live-cricket-scores/${id}`; + const html = await fetchHTML(url); + const $ = cheerio.load(html); + const matchData = parseCricketScore($); + res.json(matchData); + }) +); + +app.use((req: Request, res: Response) => { + res.status(404).json({ error: 'Resource not found' }); +}); + +app.use(errorHandler); + +app.listen(PORT, () => { + console.log(`Server PORT: ${PORT}`); +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..a9dc8b1 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "ts-cricket-score", + "version": "0.0.1", + "private": true, + "main": "./dist/index.js", + "scripts": { + "dev": "nodemon index.ts", + "build": "tsc && node copy.js", + "start": "node dist/index.js" + }, + "dependencies": { + "axios": "^1.7.9", + "cheerio": "^1.0.0", + "express": "^4.21.2" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "@types/node": "^22.10.2", + "nodemon": "^3.1.9", + "ts-node": "^10.9.2", + "typescript": "^5.7.2" + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..dbf980f --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1262 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + axios: + specifier: ^1.7.9 + version: 1.7.9 + cheerio: + specifier: ^1.0.0 + version: 1.0.0 + express: + specifier: ^4.21.2 + version: 4.21.2 + devDependencies: + '@types/express': + specifier: ^5.0.0 + version: 5.0.0 + '@types/node': + specifier: ^22.10.2 + version: 22.10.2 + nodemon: + specifier: ^3.1.9 + version: 3.1.9 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) + typescript: + specifier: ^5.7.2 + version: 5.7.2 + +packages: + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/express-serve-static-core@5.0.2': + resolution: {integrity: sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==} + + '@types/express@5.0.0': + resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + + '@types/qs@6.9.17': + resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0: + resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} + engines: {node: '>=18.17'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.1: + resolution: {integrity: sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding-sniffer@0.2.0: + resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + nodemon@3.1.9: + resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} + engines: {node: '>=10'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + undici@6.21.0: + resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} + engines: {node: '>=18.17'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + +snapshots: + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.10.2 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.10.2 + + '@types/express-serve-static-core@5.0.2': + dependencies: + '@types/node': 22.10.2 + '@types/qs': 6.9.17 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@5.0.0': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 5.0.2 + '@types/qs': 6.9.17 + '@types/serve-static': 1.15.7 + + '@types/http-errors@2.0.4': {} + + '@types/mime@1.3.5': {} + + '@types/node@22.10.2': + dependencies: + undici-types: 6.20.0 + + '@types/qs@6.9.17': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.10.2 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.10.2 + '@types/send': 0.17.4 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + array-flatten@1.1.1: {} + + asynckit@0.4.0: {} + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.1 + + cheerio@1.0.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.1 + encoding-sniffer: 0.2.0 + htmlparser2: 9.1.0 + parse5: 7.2.1 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 6.21.0 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + concat-map@0.0.1: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + create-require@1.1.1: {} + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.2.1 + nth-check: 2.1.1 + + css-what@6.1.0: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + diff@4.0.2: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.1: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + encoding-sniffer@0.2.0: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + entities@4.5.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + escape-html@1.0.3: {} + + etag@1.8.1: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + follow-redirects@1.15.9: {} + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.2.6: + dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + gopd@1.2.0: {} + + has-flag@3.0.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.1 + entities: 4.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore-by-default@1.0.1: {} + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + make-error@1.3.6: {} + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + methods@1.1.2: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + ms@2.0.0: {} + + ms@2.1.3: {} + + negotiator@0.6.3: {} + + nodemon@3.1.9: + dependencies: + chokidar: 3.6.0 + debug: 4.4.0(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.6.3 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-inspect@1.13.3: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.2.1 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.2.1 + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + parseurl@1.3.3: {} + + path-to-regexp@0.1.12: {} + + picomatch@2.3.1: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + pstree.remy@1.1.8: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@7.6.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.6.3 + + statuses@2.0.1: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + touch@3.1.1: {} + + ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.10.2 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typescript@5.7.2: {} + + undefsafe@2.0.5: {} + + undici-types@6.20.0: {} + + undici@6.21.0: {} + + unpipe@1.0.0: {} + + utils-merge@1.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + + vary@1.1.2: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + yn@3.1.1: {} diff --git a/public/192.png b/public/192.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd043e6e470819dc18205f6db9529395ab4d66e GIT binary patch literal 18663 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 KMNUMnLSTYUFn6E; literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc6240c430a0b2fb71cf85886ace486495f137f1 GIT binary patch literal 5238 zcmb7IX>3&26&^@K(jN(ll2-lE9|#YNqK3_YH*CfW-p3F%25&Tk#T%uRt=QwSJs!64 zHYQX}XS@mwG@!H!6^hWj880&?btr_UiQ1%8#SoerZz4rWj6{0+oqOMV^TvTnebSwK z=e>8&`R;elJ?GqKGR-p0Ha+*83BAd*_&X-kLiF?IssC|55BC=19)>2|#(VsW3-@PU zEJFxVyMD{zSbw6!qa-+kzW75EMP}bb;e21PI7;yrFHmBQ^YytHY_aq|U1avV{A=qT z2G%;rx5h!rng%M2QmA0QBKs)c!@G%;p6+h$Fms$%M^%Q^%#v$+f^nN_Kl*U;` zV#UvS^7~f%g27DNgMoBA^{3e>kXBFKn>*-Y#xV+5>Zy5o7d0(ITiPw!cv>lqrIZ6l z`TeovN^>yV<{Hedp@FO#8qBcMxy`?(1D*e*8vB62(X_mint49As%_bbn4ivkg<@D%K4gm_L=hjV7}o131Rg%0}IB z-g{`|j%_D*OgrA~ppuQ(sCv^yvLF64ZE=1?m1UPOzXS6-sQ?@oM1fCf(@}S8Z>DZTonzG->i@+MGQu~~@)7BB1*EHWz-LwQwb)xltn%`;@JiItdn7h~^W z4#$akXcn|tVuS$)j{o;!{kU#qop>s+rork@aP%ti4cC0}&Rdt_oL^#1U!mPDG%Ftz zn*F^cW?x=uG_ONK=l*|Ps(8E-9?AD*3>eC5e8z8SaQTxQ_Z7qqjy>Fb3FzaUs^4gF zNcQ09UJ-1+bEQ=-2lrD8V{(-|mvk~{U1uTwH5x0^Y6kz>{Qoq9b(S%Lm7vWxu zNeaPUcSjQ|caX_3Ti0h8L|{_?aQBnN{uc_Pe3w}!$0~0ABpLSv2aG|*A@mBL3hNDH zQ4mur2(ekYle+T-gX+f)3m5s9fWI#^863Ao++_@E{6-!L>sS3*dw*tsHyQfZmNSm= zF-xUcS8QCoIxaT%{}B1&GouWne!+tp|Ct9rI558Zs4?f2abOTUBvsz{+*10Y!~msY zgUNrz=J%fk=O1z$G|K5u#rjhW9L(TBysL9yv;oH*MdXyRWX>zhgUE4zxE;6WyE+f* zpeV|JT#dbAp2Xl2d9P2!(8u{t^9Ms73}cr1!~a=7@(JfPU_f3HJd7sobQ$&c=QsQS zvGD7G48$VDvVP8)h>4=5)rK)J4#uG3V1MA;!+B88g(9CKM{vKSo5t6b(RixFVBq2F z(fEq*v)Q=~X4^c2oM+Jn(q~|Ret%jWc{h8hZtn%Uka<+s&s=EvPvl`OA1{+Ry=iF= z@@c8e%fK)$^Sj{TZc@32Ik=jCaPDAs^|Z(bjDd54kq78MwZ%*O-uyf5_S~ZC+5tLm zZ4?;%;Gr2gL*pO<1J=$QOr)bOS%-$a9>K%fiU%LR^y(bs_zj5R$R)_}BA;N)JQy$> zcMed^*-6^h{V&?xeuwruhUh}p5n_L6UV;3-LdBrfGzK0-U6Kyn%mZw}{vdb|{!p12 zvf4bsT;!r`&S#86+Ck<9&gmSBgwOq(NaIK?bF!;m8^~b2*`w7{9Go|yer}2-}ka9}J5ayvt z<$-ZbW^Jb_wJw@eZ80HgEastNIJCZc1Qd7G0)xf_W6*dQOD!J>{E2u`WDr8jnM92-J(}^U8chQ{p4E3deKmiYCPz=^cWox-$zhm4x@=0Rp{3+aNVrd z&Wxda*-481kwTkd-lkU6uH25~o}>DX5!&InPS&mOQd!1Ha;=p5#hwHfQBxapiU9}C zH^XgQC$oNT8V4$dHt25?JaFACYxtH`7{eZ{pKIu&*=NbQ?i7_}ouQ0_SLoH(d@?41 z1NH~xw1|AB^C9m0J#C5J4Wh>8S{)cfoellEO=j?*)!rHg4F}i1Tg%?1=*}rhDetGF zDi4wRjNCIW{|0ZGcP{ik5ExiL^T6vjU|=4kKS&<<{2-g;p%t7k7p~Qv^xEDK#kgTY&%Vfl2$7gIlYr{`(1J76Z4)7(u1KfiCYeQCBZz#9MdbQO1B+t>B M&>=;I)v2TZ0<_%Qvj6}9 literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..db787dd --- /dev/null +++ b/public/index.html @@ -0,0 +1,388 @@ + + + + + + + + + Live Cricket Score 🏏 + + + + + + + + + +
+
+
+
+

Live Cricket Score

+
+

Change Theme:

+
+ +
+
+
+ +
+ +
+
+
+ + +
+
+ +
+ +

Disclaimer

+

+ The score data retrieved from CricBuzz is collected strictly for personal use only. This data is scraped using custom scripts and stored locally on my Android device, which functions as a personal server. The data is accessed and displayed via Termux, and the network traffic is securely proxied through a Cloudflare Argo Tunnel.
+
+ This setup is fully contained within my personal environment and is not accessible to the outside world. The data is not served externally or used for any commercial purposes. I do not claim ownership of any data or content provided by CricBuzz. The scraping process is solely for personal use and complies with CricBuzz’s terms of service, ensuring no infringement on their intellectual property rights.
+
+ Please note that any use, redistribution, or public display beyond personal use may violate CricBuzz’s terms and may be subject to legal or ethical consequences. I take no responsibility for any actions outside of personal, non-commercial use.

+
+
+
+ +
+ + + \ No newline at end of file diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..3d3b1bf --- /dev/null +++ b/renovate.json @@ -0,0 +1,17 @@ +{ + "extends": ["config:base"], + "automerge": true, + "major": { + "automerge": false + }, + "lockFileMaintenance": { + "enabled": false, + "automerge": false + }, + "labels": ["renovate"], + "rangeStrategy": "bump", + "bumpVersion": null, + "semanticCommits": true, + "timezone": "Asia/Kolkata", + "schedule": "on wednesday" +} \ No newline at end of file diff --git a/tmux.sh b/tmux.sh new file mode 100644 index 0000000..5dc865d --- /dev/null +++ b/tmux.sh @@ -0,0 +1,3 @@ +if ! tmux has-session -t score 2>/dev/null; then + tmux new-session -d -s score 'node $HOME/ts-cricket-score/dist/index.js' +fi \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d7fa631 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM"], + "module": "CommonJS", + "strict": true, + "esModuleInterop": true, + "outDir": "./dist", + "rootDir": "./", + "resolveJsonModule": true, + "skipLibCheck": true + } + } \ No newline at end of file diff --git a/utils/error.ts b/utils/error.ts new file mode 100644 index 0000000..8bf1096 --- /dev/null +++ b/utils/error.ts @@ -0,0 +1,7 @@ +import { Request, Response, NextFunction } from 'express'; + +export default (error: any, req: Request, res: Response, next: NextFunction) => { + console.error(error.message); + console.error(error.stack); + res.status(500).json({ error: 'Internal Server Error' }); +}; \ No newline at end of file diff --git a/utils/secureHeaders.ts b/utils/secureHeaders.ts new file mode 100644 index 0000000..7e7e713 --- /dev/null +++ b/utils/secureHeaders.ts @@ -0,0 +1,10 @@ +import { Request, Response, NextFunction } from "express"; + +export const setSecureHeaders = (req: Request, res: Response, next: NextFunction) => { + res.setHeader("X-Content-Type-Options", "nosniff"); + res.setHeader("X-Frame-Options", "DENY"); + res.setHeader("X-XSS-Protection", "1; mode=block"); + res.setHeader("Referrer-Policy", "no-referrer-when-downgrade"); + res.setHeader("X-Robots-Tag", "noindex, nofollow"); + next(); +}; \ No newline at end of file