From c08223bd57e9a619b77d0b8e274b4e8204e7f056 Mon Sep 17 00:00:00 2001 From: alwaysmesmerizingyou Date: Fri, 14 Aug 2026 14:02:51 -0700 Subject: [PATCH] Sync Home --- .gitignore | 46 + .gitlab-ci.yml | 176 + README.md | 29 + build-pipeline.js | 400 +++ build/icon.ico | Bin 0 -> 370070 bytes build/logo.txt | 6 + config/credentials-template.json | 16 + config/env.json | 22 + config/replacements.json | 54 + credential-manager.js | 109 + crypto-utils.js | 144 + github-client.js | 179 + last-shas.json | 7 + main.js | 664 ++++ package-lock.json | 5281 ++++++++++++++++++++++++++++++ package.json | 56 + patcher.js | 144 + preload.js | 5 + service-manager.js | 170 + source.png | Bin 0 -> 27557 bytes update-client.js | 222 ++ 21 files changed, 7730 insertions(+) create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 README.md create mode 100644 build-pipeline.js create mode 100644 build/icon.ico create mode 100644 build/logo.txt create mode 100644 config/credentials-template.json create mode 100644 config/env.json create mode 100644 config/replacements.json create mode 100644 credential-manager.js create mode 100644 crypto-utils.js create mode 100644 github-client.js create mode 100644 last-shas.json create mode 100644 main.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 patcher.js create mode 100644 preload.js create mode 100644 service-manager.js create mode 100644 source.png create mode 100644 update-client.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4459ec9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Dependencies +node_modules/ + +# Build outputs +dist/ +dist-build/ +temp-validation-extract/ +update-payload.zip +manifest.json +integrity-report.json +validation-report.json + +# Encrypted files (build-time only) +config/encrypted-credentials.json + +# Sensitive files +credentials.json +.env +*.key +*.pem + +# OS files +.DS_Store +Thumbs.db +desktop.ini + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Electron +out/ + +# Temporary files +*.tmp +*.temp +download-temp.zip \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..2e55f30 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,176 @@ +stages: + - build + - release + +build: + stage: build + tags: + - saas-windows-medium-amd64 + rules: + - if: '$CI_PIPELINE_SOURCE == "schedule"' + - if: '$CI_PIPELINE_SOURCE == "web"' + - if: '$CI_COMMIT_BRANCH == "main"' + changes: + - build-pipeline.js + - package.json + - config/**/* + - main.js + - service-manager.js + - patcher.js + - credential-manager.js + - crypto-utils.js + - update-client.js + - .gitlab-ci.yml + variables: + GITLAB_TOKEN: $VYLA_GITLAB_TOKEN + PLAYER_TMDB_KEY: $TMDB_KEY + PLAYER_API_KEY: $API_KEY + STREAM_API_TMDB_API_KEY: $TMDB_API_KEY + STREAM_API_GA_API_SECRET: $GA_API_SECRET + STREAM_API_GA_MEASUREMENT_ID: $GA_MEASUREMENT_ID + STREAM_API_TOKEN_SECRET: $TOKEN_SECRET + PLAYER_BASE_URL: $BASE_URL + STREAM_API_PROXY_URL: $PROXY_URL + STREAM_API_PROXY_STREAMS: $PROXY_STREAMS + STREAM_API_ENABLE_DEBUG_ROUTE: $ENABLE_DEBUG_ROUTE + PLAYER_BYPASS_AUTH: $BYPASS_AUTH + STREAM_API_BYPASS_AUTH: $BYPASS_AUTH + AUTH_PROXY_VITE_BASE_URL: $AUTH_PROXY_BASE_URL + AUTH_PROXY_VITE_API_KEY: $AUTH_PROXY_API_KEY + AUTH_PROXY_DEV_BYPASS_AUTH: $DEV_BYPASS_AUTH + AUTH_PROXY_PROXY_VITE_API_KEY: $PROXY_VITE_API_KEY + cache: + key: + files: + - package-lock.json + paths: + - node_modules/ + script: + - npm ci + + - | + $repos = @('frontend', 'player', 'stream-api', 'live-api-streampk', 'auth-proxy') + $last = @{} + if (Test-Path "last-shas.json") { + $last = Get-Content last-shas.json | ConvertFrom-Json -AsHashtable + } + + $current = @{} + $changed = $false + + foreach ($repo in $repos) { + $headers = @{ + "PRIVATE-TOKEN" = "$env:GITLAB_TOKEN" + } + + $uri = "https://gitlab.com/api/v4/projects/vyla-entertainment%2F$repo/repository/commits/main" + + try { + $resp = Invoke-RestMethod -Uri $uri -Headers $headers + $sha = $resp.id + $current[$repo] = $sha + + if (-not $last.ContainsKey($repo) -or $last[$repo] -ne $sha) { + Write-Host "Change detected in $repo (main): $sha" + $changed = $true + } else { + Write-Host "No change in $repo (main)" + } + } catch { + Write-Warning "Failed to fetch commit info for $repo. (Ensure token has api/read_repository scopes)." + } + } + + $current | ConvertTo-Json | Set-Content last-shas.json + + if ($env:CI_PIPELINE_SOURCE -ne "schedule") { + $changed = $true + } + + if (-not $changed) { + Write-Host "No changes detected. Skipping build." + echo "CHANGED=false" >> build.env + exit 0 + } + + echo "CHANGED=true" >> build.env + + - | + git config user.name "gitlab-ci[bot]" + git config user.email "gitlab-ci[bot]@gitlab.com" + git add last-shas.json + + $gitStatus = git status --porcelain + if ($gitStatus) { + git remote set-url origin "https://oauth2:$env:GITLAB_TOKEN@gitlab.com/$env:CI_PROJECT_PATH.git" + git commit -m "chore: update last-known repo SHAs [skip ci]" + git push origin "HEAD:$env:CI_COMMIT_BRANCH" + } + + - Write-Host "Starting secure build process..." + - node build-pipeline.js + + - | + if (Test-Path "update-payload.zip") { + Write-Host "✓ Build artifact verified: update-payload.zip exists" + $size = (Get-Item update-payload.zip).Length + Write-Host " Size: $size bytes" + } else { + Write-Error "✗ Build artifact missing: update-payload.zip" + exit 1 + } + + if (Test-Path "manifest.json") { + Write-Host "✓ Manifest file verified" + Get-Content manifest.json | ConvertFrom-Json | ConvertTo-Json -Depth 10 + } else { + Write-Error "✗ Manifest file missing" + exit 1 + } + + if (Test-Path "validation-report.json") { + Write-Host "✓ Validation report verified" + } else { + Write-Warning "⚠ Validation report missing (non-critical)" + } + + - Write-Host "Packaging Electron application..." + - npm run dist + + - echo "BUILD_VERSION=v$env:CI_PIPELINE_IID" >> build.env + + artifacts: + reports: + dotenv: build.env + paths: + - update-payload.zip + - manifest.json + - validation-report.json + - dist/*.exe + - dist/*.exe.blockmap + expire_in: 30 days + +release: + stage: release + image: registry.gitlab.com/gitlab-org/release-cli:latest + tags: + - saas-linux-small-amd64 + needs: + - job: build + artifacts: true + rules: + - if: '$CHANGED == "true" && $CI_COMMIT_BRANCH == "main"' + script: + - echo "Creating GitLab Release $BUILD_VERSION" + release: + name: 'Vyla Home Release $BUILD_VERSION' + tag_name: '$BUILD_VERSION' + description: 'Automated release for build $BUILD_VERSION' + assets: + links: + - name: 'update-payload.zip' + url: '$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_BRANCH/raw/update-payload.zip?job=build' + - name: 'manifest.json' + url: '$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_BRANCH/raw/manifest.json?job=build' + - name: 'Download All Build Artifacts (including Windows Installer)' + url: '$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_BRANCH/download?job=build' \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..57a1571 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Vyla Home + +Vyla Home is a desktop version of Vyla, built to run entirely on your own computer instead of on [vyla.cc](https://vyla.cc). + +## Why this exists + +Running Vyla as a hosted website has been a constant source of stress. Hosting providers routinely block or throttle traffic coming from data centers, which is exactly where most affordable hosting lives. Every workaround for that involves paid infrastructure — residential proxies, dedicated IPs, premium tiers — that isn't realistic to keep funding long-term. + +On top of that, there's the standing fear that comes with depending on someone else's infrastructure: a provider changes their policy, a server gets flagged, an account gets suspended, and everything just stops working with no warning. That uncertainty has genuinely cost some sleep. Waking up wondering if the whole project got wiped overnight isn't a sustainable way to build something. + +Vyla Home is the answer to that. Instead of fighting hosting providers forever, the app runs locally on your own machine. No data center traffic to block. No hosting bills. No one else's finger on the switch. + +## What it actually is + +Vyla Home packages up the same player, streaming, and live-sports features as the website, wrapped in a small desktop app. When you open it: + +- It grabs the latest version automatically +- It starts everything up locally on your computer +- The interface opens in its own window, just like the website did + +Everything runs for you, on your machine, for your own personal use. + +## What this is not + +This isn't a public service or a way to redistribute anything. It's a personal media player for personal use — think of it as watching things you already have access to, through your own local player, instead of a public streaming platform. Nothing here is intended to be shared, resold, or run as a service for other people. + +## Status + +Might not be actively worked on. Expect various bugs — this is a solo project built to solve a real problem, not a polished commercial product. \ No newline at end of file diff --git a/build-pipeline.js b/build-pipeline.js new file mode 100644 index 0000000..8bca97f --- /dev/null +++ b/build-pipeline.js @@ -0,0 +1,400 @@ +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); +const JavaScriptObfuscator = require('javascript-obfuscator'); +const AdmZip = require('adm-zip'); +const { execSync } = require('child_process'); + +const BUILD_DIR = path.join(__dirname, 'dist-build'); +const REPOS = ['frontend', 'player', 'auth-proxy', 'stream-api', 'live-api-streampk']; + +const TEMP_EXTRACT_DIR = path.join(__dirname, 'temp-validation-extract'); + +const GITLAB_GROUP = 'vyla-entertainment'; + +const REPO_CONFIG = { + 'frontend': { name: 'frontend', branch: 'main' }, + 'player': { name: 'player', branch: 'main' }, + 'auth-proxy': { name: 'auth-proxy', branch: 'main' }, + 'stream-api': { name: 'stream-api', branch: 'main' }, + 'live-api-streampk': { name: 'live-api-streampk', branch: 'main' } +}; + +function getGitLabToken() { + const token = process.env.GITLAB_TOKEN || process.env.VYLA_GITLAB_TOKEN; + if (!token) { + throw new Error('GitLab token not found. Set GITLAB_TOKEN or VYLA_GITLAB_TOKEN environment variable.'); + } + return token; +} + +function clonePrivateRepo(repoConfig, targetDir) { + const token = getGitLabToken(); + const repoUrl = `https://oauth2:${token}@gitlab.com/${GITLAB_GROUP}/${repoConfig.name}.git`; + + try { + if (fs.existsSync(targetDir)) { + fs.rmSync(targetDir, { recursive: true, force: true }); + } + + execSync(`git clone --depth 1 --branch ${repoConfig.branch} ${repoUrl} ${targetDir}`, { + stdio: 'inherit', + env: { ...process.env, GIT_TERMINAL_PROMPT: '0' } + }); + + } catch (error) { + throw new Error(`Failed to clone ${repoConfig.name}: ${error.message}`); + } +} + +function cloneAllRepos() { + for (const [key, config] of Object.entries(REPO_CONFIG)) { + const targetDir = path.join(__dirname, key); + clonePrivateRepo(config, targetDir); + } +} + +async function installDependencies() { + await Promise.all(REPOS.map(repo => installOneRepo(repo))); +} + +function installOneRepo(repo) { + const repoDir = path.join(__dirname, repo); + const pkgJsonPath = path.join(repoDir, 'package.json'); + + if (!fs.existsSync(pkgJsonPath)) { + return; + } + try { + execSync('npm install --omit=dev', { + cwd: repoDir, + stdio: 'inherit' + }); + + const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8')); + const hasNativeDeps = pkg.dependencies && Object.keys(pkg.dependencies).some(dep => + ['bcrypt', 'sharp', 'sqlite3'].includes(dep) + ); + + if (hasNativeDeps) { + const electronVersion = JSON.parse( + fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8') + ).devDependencies.electron.replace(/^[\^~]/, ''); + + if (!/^\d+\.\d+\.\d+$/.test(electronVersion)) { + throw new Error(`Cannot resolve exact Electron version from "${electronVersion}"; pin an exact version in package.json devDependencies before building.`); + } + + const rebuildBin = path.join(__dirname, 'node_modules', '.bin', process.platform === 'win32' ? 'electron-rebuild.cmd' : 'electron-rebuild'); + + execSync(`"${rebuildBin}" -f -v ${electronVersion} -m "${repoDir}"`, { + cwd: __dirname, + stdio: 'inherit' + }); + } + } catch (error) { + throw new Error(`npm install failed for ${repo}: ${error.message}`); + } +} + +function cleanBuildDir() { + if (fs.existsSync(BUILD_DIR)) { + fs.rmSync(BUILD_DIR, { recursive: true, force: true }); + } + fs.mkdirSync(BUILD_DIR, { recursive: true }); +} + +function obfuscateFile(filePath, isEsm = false) { + const content = fs.readFileSync(filePath, 'utf8'); + const result = JavaScriptObfuscator.obfuscate(content, { + compact: true, + controlFlowFlattening: false, + deadCodeInjection: false, + debugProtection: false, + numbersToExpressions: false, + simplify: true, + stringArray: true, + stringArrayThreshold: 0.4, + stringArrayEncoding: [], + module: isEsm + }); + fs.writeFileSync(filePath, result.getObfuscatedCode(), 'utf8'); +} + +function encryptCredentialsFile() { + const CryptoUtils = require('./crypto-utils'); + + const credentialsTemplate = path.join(__dirname, 'config/credentials-template.json'); + const encryptedOutput = path.join(__dirname, 'config/encrypted-credentials.json'); + + if (!fs.existsSync(credentialsTemplate)) { + return null; + } + + try { + const credentials = JSON.parse(fs.readFileSync(credentialsTemplate, 'utf8')); + + const hasPlaceholders = Object.values(credentials).some(service => + Object.values(service).some(value => + value && value.includes('YOUR_') && value.includes('_HERE') + ) + ); + + if (hasPlaceholders) { + const envCredentials = {}; + for (const [service, keys] of Object.entries(credentials)) { + envCredentials[service] = {}; + for (const key of Object.keys(keys)) { + const envVarName = `${service.toUpperCase().replace(/-/g, '_')}_${key.toUpperCase()}`; + if (process.env[envVarName]) { + envCredentials[service][key] = process.env[envVarName]; + } + } + } + + if (Object.values(envCredentials).some(s => Object.keys(s).length > 0)) { + Object.assign(credentials, envCredentials); + } + } + + const buildKey = CryptoUtils.deriveKey('vyla-home-build-key', 'vyla-home-payload-salt-v1'); + const encryptedData = CryptoUtils.encryptObject(credentials, buildKey); + + fs.writeFileSync(encryptedOutput, encryptedData, 'utf8'); + + return encryptedOutput; + } catch (error) { + throw error; + } +} + +function collectJsFiles(src, dest, out) { + const files = fs.readdirSync(src); + fs.mkdirSync(dest, { recursive: true }); + + for (const file of files) { + const srcPath = path.join(src, file); + const destPath = path.join(dest, file); + const stat = fs.statSync(srcPath); + + if (stat.isDirectory()) { + if (file === 'node_modules' || file === '.git' || file === '.github') continue; + collectJsFiles(srcPath, destPath, out); + } else if (stat.isFile()) { + fs.copyFileSync(srcPath, destPath); + if (path.extname(srcPath).toLowerCase() === '.js') { + out.push(destPath); + } + } + } +} + +function processFolder(src, dest) { + const jsFiles = []; + collectJsFiles(src, dest, jsFiles); + + let isEsm = false; + const pkgPath = path.join(src, 'package.json'); + if (fs.existsSync(pkgPath)) { + try { + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); + if (pkg.type === 'module') isEsm = true; + } catch (e) { } + } + + for (const filePath of jsFiles) { + try { + obfuscateFile(filePath, isEsm); + } catch (e) { + } + } +} + +function getFileChecksum(filePath) { + const hash = crypto.createHash('sha256'); + const data = fs.readFileSync(filePath); + hash.update(data); + return hash.digest('hex'); +} + +function validatePayload(zipPath) { + if (fs.existsSync(TEMP_EXTRACT_DIR)) { + fs.rmSync(TEMP_EXTRACT_DIR, { recursive: true, force: true }); + } + fs.mkdirSync(TEMP_EXTRACT_DIR, { recursive: true }); + + const zip = new AdmZip(zipPath); + zip.extractAllTo(TEMP_EXTRACT_DIR, true); + + const requiredFiles = [ + 'player/index.html', + 'auth-proxy/server.js', + 'stream-api/server.js', + 'live-api-streampk/server.js', + 'frontend/index.html' + ]; + + const validationResults = { + valid: true, + errors: [], + checksum: getFileChecksum(zipPath), + timestamp: new Date().toISOString() + }; + + for (const file of requiredFiles) { + const fullPath = path.join(TEMP_EXTRACT_DIR, file); + if (!fs.existsSync(fullPath)) { + validationResults.valid = false; + validationResults.errors.push(`Missing critical file: ${file}`); + } + } + + const envPath = path.join(__dirname, 'config/env.json'); + const replacementsPath = path.join(__dirname, 'config/replacements.json'); + + if (!fs.existsSync(envPath)) { + validationResults.valid = false; + validationResults.errors.push('Missing environment configuration: config/env.json'); + } else { + try { + JSON.parse(fs.readFileSync(envPath, 'utf8')); + } catch (e) { + validationResults.valid = false; + validationResults.errors.push(`Invalid JSON format in config/env.json: ${e.message}`); + } + } + + if (!fs.existsSync(replacementsPath)) { + validationResults.valid = false; + validationResults.errors.push('Missing replacements configuration: config/replacements.json'); + } else { + try { + JSON.parse(fs.readFileSync(replacementsPath, 'utf8')); + } catch (e) { + validationResults.valid = false; + validationResults.errors.push(`Invalid JSON format in config/replacements.json: ${e.message}`); + } + } + + fs.rmSync(TEMP_EXTRACT_DIR, { recursive: true, force: true }); + + fs.writeFileSync(path.join(__dirname, 'validation-report.json'), JSON.stringify(validationResults, null, 2), 'utf8'); + + if (!validationResults.valid) { + console.error("Payload validation failed with errors:", validationResults.errors); + process.exit(1); + } + + return validationResults.checksum; +} + +async function build() { + try { + cloneAllRepos(); + } catch (error) { + console.error("Cloning failed:", error); + process.exit(1); + } + + for (const repo of REPOS) { + const srcRepo = path.join(__dirname, repo); + if (!fs.existsSync(srcRepo)) { + console.error(`Repository directory missing: ${srcRepo}`); + process.exit(1); + } + } + + try { + await installDependencies(); + } catch (error) { + console.error("Dependency installation failed:", error); + process.exit(1); + } + + let encryptedCredentialsPath = null; + try { + encryptedCredentialsPath = encryptCredentialsFile(); + } catch (error) { + console.error("Credential encryption warning (non-fatal):", error); + } + + cleanBuildDir(); + + for (const repo of REPOS) { + const srcRepo = path.join(__dirname, repo); + const destRepo = path.join(BUILD_DIR, repo); + processFolder(srcRepo, destRepo); + + const srcModules = path.join(srcRepo, 'node_modules'); + const destModules = path.join(destRepo, 'node_modules'); + if (fs.existsSync(srcModules)) { + fs.cpSync(srcModules, destModules, { + recursive: true, + filter: (src) => !/[\\/](test|tests|docs|\.github|\.git)([\\/]|$)/.test(src) && !/\.(md|markdown|map|ts)$/i.test(src) + }); + } + } + + if (encryptedCredentialsPath && fs.existsSync(encryptedCredentialsPath)) { + const credentialsDest = path.join(BUILD_DIR, 'encrypted-credentials.json'); + fs.copyFileSync(encryptedCredentialsPath, credentialsDest); + } + + const configDir = path.join(BUILD_DIR, 'config'); + fs.mkdirSync(configDir, { recursive: true }); + + const envConfig = path.join(__dirname, 'config/env.json'); + const replacementsConfig = path.join(__dirname, 'config/replacements.json'); + + if (fs.existsSync(envConfig)) { + fs.copyFileSync(envConfig, path.join(configDir, 'env.json')); + } + if (fs.existsSync(replacementsConfig)) { + fs.copyFileSync(replacementsConfig, path.join(configDir, 'replacements.json')); + } + + const zip = new AdmZip(); + for (const repo of REPOS) { + const destRepo = path.join(BUILD_DIR, repo); + zip.addLocalFolder(destRepo, repo); + } + + zip.addLocalFolder(configDir, 'config'); + + if (fs.existsSync(path.join(BUILD_DIR, 'encrypted-credentials.json'))) { + zip.addFile('encrypted-credentials.json', fs.readFileSync(path.join(BUILD_DIR, 'encrypted-credentials.json'))); + } + + const zipPath = path.join(__dirname, 'update-payload.zip'); + zip.writeZip(zipPath); + + const checksum = validatePayload(zipPath); + + let wrapperVersion = '2.0.0'; + try { + const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8')); + wrapperVersion = pkg.version || '2.0.0'; + } catch (e) { } + + const manifest = { + version: wrapperVersion, + sha256: checksum, + timestamp: new Date().toISOString(), + hasEncryptedCredentials: !!encryptedCredentialsPath + }; + + fs.writeFileSync(path.join(__dirname, 'manifest.json'), JSON.stringify(manifest, null, 2), 'utf8'); + + for (const repo of REPOS) { + const repoPath = path.join(__dirname, repo); + if (fs.existsSync(repoPath)) { + fs.rmSync(repoPath, { recursive: true, force: true }); + } + } + +} + +build().catch((error) => { + console.error("Build process encountered an unhandled exception:", error); + process.exit(1); +}); \ No newline at end of file diff --git a/build/icon.ico b/build/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..25fe2adaee8cc7c1e81b8f9de982de9ff02180de GIT binary patch literal 370070 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 0; + } + + deleteServiceCredentials(service) { + delete this.credentials[service]; + this.saveCredentials(); + } + + initializeFromConfig(config) { + let initialized = false; + for (const [service, keys] of Object.entries(config)) { + if (!this.hasServiceCredentials(service)) { + this.setServiceCredentials(service, keys); + initialized = true; + } + } + return initialized; + } + + getAllEnvVars() { + const envVars = {}; + for (const [service, credentials] of Object.entries(this.credentials)) { + envVars[service] = { ...credentials }; + } + return envVars; + } + + verifyIntegrity() { + try { + if (!fs.existsSync(this.credentialsPath)) { + return false; + } + const encryptedData = fs.readFileSync(this.credentialsPath, 'utf8'); + CryptoUtils.decryptObject(encryptedData, this.encryptionKey); + return true; + } catch (error) { + return false; + } + } + + resetCredentials() { + this.credentials = {}; + if (fs.existsSync(this.credentialsPath)) { + fs.unlinkSync(this.credentialsPath); + } + } +} + +module.exports = CredentialManager; \ No newline at end of file diff --git a/crypto-utils.js b/crypto-utils.js new file mode 100644 index 0000000..7e5a360 --- /dev/null +++ b/crypto-utils.js @@ -0,0 +1,144 @@ +const crypto = require('crypto'); +const os = require('os'); +const { execSync } = require('child_process'); + +class CryptoUtils { + static getMachineKey(cacheDir) { + const path = require('path'); + const fs = require('fs'); + const cachePath = cacheDir ? path.join(cacheDir, '.machine-key-cache') : null; + + if (cachePath && fs.existsSync(cachePath)) { + try { + const cached = fs.readFileSync(cachePath, 'utf8').trim(); + if (cached) return cached; + } catch (e) { + } + } + + let key; + try { + const machineId = [ + os.hostname(), + os.platform(), + os.arch(), + os.cpus()[0].model, + this.getMachineId(), + process.env.COMPUTERNAME || '', + process.env.USERNAME || '' + ].join('|'); + + const hash = crypto.createHash('sha256'); + hash.update(machineId); + key = hash.digest('hex'); + } catch (error) { + const fallback = crypto.createHash('sha256'); + fallback.update(os.hostname() + Date.now()); + key = fallback.digest('hex'); + } + + if (cachePath) { + try { + fs.writeFileSync(cachePath, key, 'utf8'); + } catch (e) { + } + } + return key; + } + + static getMachineId() { + if (os.platform() === 'win32') { + try { + return execSync('wmic csproduct get uuid').toString().split('\n')[1].trim(); + } catch (e) { + } + try { + const out = execSync('reg query "HKLM\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid').toString(); + const match = out.match(/MachineGuid\s+REG_SZ\s+([^\r\n]+)/); + if (match) return match[1].trim(); + } catch (e) { + } + return 'unknown-machine'; + } else if (os.platform() === 'darwin') { + try { + return execSync('ioreg -rd1 -c IOPlatformExpertDevice | awk -F\'"\' \'/IOPlatformUUID/{print $4}\'').toString().trim(); + } catch (e) { + return 'unknown-machine'; + } + } else { + try { + return execSync('cat /etc/machine-id 2>/dev/null || cat /var/lib/dbus/machine-id 2>/dev/null').toString().trim(); + } catch (e) { + return 'unknown-machine'; + } + } + } + + static deriveKey(machineKey, salt = 'vyla-home-salt') { + const hash = crypto.createHash('sha256'); + hash.update(machineKey + salt); + return hash.digest(); + } + + static encrypt(plaintext, key) { + try { + const iv = crypto.randomBytes(16); + const cipher = crypto.createCipheriv('aes-256-gcm', key, iv); + + let encrypted = cipher.update(plaintext, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + + const authTag = cipher.getAuthTag(); + + return `${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted}`; + } catch (error) { + throw new Error(`Encryption failed: ${error.message}`); + } + } + + static decrypt(encryptedData, key) { + try { + const parts = encryptedData.split(':'); + if (parts.length !== 3) { + throw new Error('Invalid encrypted data format'); + } + + const iv = Buffer.from(parts[0], 'hex'); + const authTag = Buffer.from(parts[1], 'hex'); + const encrypted = parts[2]; + + const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv); + decipher.setAuthTag(authTag); + + let decrypted = decipher.update(encrypted, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + + return decrypted; + } catch (error) { + throw new Error(`Decryption failed: ${error.message}`); + } + } + + static encryptObject(obj, key) { + const json = JSON.stringify(obj); + return this.encrypt(json, key); + } + + static decryptObject(encryptedData, key) { + const json = this.decrypt(encryptedData, key); + return JSON.parse(json); + } + + static hashData(data) { + const hash = crypto.createHash('sha256'); + hash.update(data); + return hash.digest('hex'); + } + + static verifyHash(data, expectedHash) { + const actualHash = this.hashData(data); + return actualHash === expectedHash; + } +} + +module.exports = CryptoUtils; \ No newline at end of file diff --git a/github-client.js b/github-client.js new file mode 100644 index 0000000..ae596ae --- /dev/null +++ b/github-client.js @@ -0,0 +1,179 @@ +const { execSync, spawnSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +const REPOS = { + frontend: { branch: 'main' }, + player: { branch: 'main' }, + 'stream-api': { branch: 'main' }, + 'live-api-streampk': { branch: 'main' }, + 'auth-proxy': { branch: 'main' } +}; + +const GITLAB_GROUP = 'vyla-entertainment'; + +class GitlabClient { + constructor(appDataPath, credentialManager) { + this.appDataPath = appDataPath; + this.credentialManager = credentialManager; + } + + getToken() { + return this.credentialManager.getCredential('gitlab', 'TOKEN') || null; + } + + setToken(token) { + this.credentialManager.setCredential('gitlab', 'TOKEN', token); + } + + hasToken() { + return !!this.getToken(); + } + + buildRepoUrl(repoName) { + const token = this.getToken(); + if (token) { + return `https://oauth2:${token}@gitlab.com/${GITLAB_GROUP}/${repoName}.git`; + } + return `https://gitlab.com/${GITLAB_GROUP}/${repoName}.git`; + } + + repoDir(repoName) { + return path.join(this.appDataPath, repoName); + } + + isRepoCloned(repoName) { + const gitDir = path.join(this.repoDir(repoName), '.git'); + return fs.existsSync(gitDir); + } + + allReposCloned() { + return Object.keys(REPOS).every((name) => this.isRepoCloned(name)); + } + + cloneRepo(repoName, onLog) { + const { branch } = REPOS[repoName]; + const targetDir = this.repoDir(repoName); + const url = this.buildRepoUrl(repoName); + + if (fs.existsSync(targetDir)) { + fs.rmSync(targetDir, { recursive: true, force: true }); + } + + if (onLog) onLog(`Cloning ${repoName}...`); + + const result = spawnSync('git', ['clone', '--depth', '1', '--branch', branch, url, targetDir], { + stdio: 'pipe', + env: { ...process.env, GIT_TERMINAL_PROMPT: '0' } + }); + + if (result.status !== 0) { + const stderr = result.stderr ? result.stderr.toString() : 'unknown error'; + throw new Error(`Failed to clone ${repoName}: ${stderr}`); + } + } + + cloneAll(onLog) { + for (const repoName of Object.keys(REPOS)) { + this.cloneRepo(repoName, onLog); + } + } + + installDependencies(repoName, onLog) { + const repoDir = this.repoDir(repoName); + const pkgJsonPath = path.join(repoDir, 'package.json'); + + if (!fs.existsSync(pkgJsonPath)) { + return; + } + + if (onLog) onLog(`Installing dependencies for ${repoName}...`); + + const result = spawnSync('npm', ['install', '--omit=dev'], { + cwd: repoDir, + stdio: 'pipe', + shell: process.platform === 'win32' + }); + + if (result.status !== 0) { + const stderr = result.stderr ? result.stderr.toString() : 'unknown error'; + throw new Error(`npm install failed for ${repoName}: ${stderr}`); + } + } + + installAllDependencies(onLog) { + for (const repoName of Object.keys(REPOS)) { + this.installDependencies(repoName, onLog); + } + } + + getLocalHead(repoName) { + const repoDir = this.repoDir(repoName); + try { + return execSync('git rev-parse HEAD', { cwd: repoDir }).toString().trim(); + } catch (e) { + return null; + } + } + + getRemoteHead(repoName) { + const { branch } = REPOS[repoName]; + const repoDir = this.repoDir(repoName); + const url = this.buildRepoUrl(repoName); + try { + const output = execSync(`git ls-remote "${url}" refs/heads/${branch}`, { cwd: repoDir }).toString().trim(); + return output.split('\t')[0] || null; + } catch (e) { + return null; + } + } + + checkForUpdates() { + const outdated = []; + for (const repoName of Object.keys(REPOS)) { + const local = this.getLocalHead(repoName); + const remote = this.getRemoteHead(repoName); + if (local && remote && local !== remote) { + outdated.push(repoName); + } + } + return outdated; + } + + updateRepo(repoName, onLog) { + const { branch } = REPOS[repoName]; + const repoDir = this.repoDir(repoName); + + if (onLog) onLog(`Updating ${repoName}...`); + + const fetchResult = spawnSync('git', ['fetch', 'origin', branch], { + cwd: repoDir, + stdio: 'pipe', + env: { ...process.env, GIT_TERMINAL_PROMPT: '0' } + }); + + if (fetchResult.status !== 0) { + const stderr = fetchResult.stderr ? fetchResult.stderr.toString() : 'unknown error'; + throw new Error(`Failed to fetch ${repoName}: ${stderr}`); + } + + const resetResult = spawnSync('git', ['reset', '--hard', `origin/${branch}`], { + cwd: repoDir, + stdio: 'pipe' + }); + + if (resetResult.status !== 0) { + const stderr = resetResult.stderr ? resetResult.stderr.toString() : 'unknown error'; + throw new Error(`Failed to reset ${repoName}: ${stderr}`); + } + } + + updateAll(repoNames, onLog) { + for (const repoName of repoNames) { + this.updateRepo(repoName, onLog); + this.installDependencies(repoName, onLog); + } + } +} + +module.exports = GitlabClient \ No newline at end of file diff --git a/last-shas.json b/last-shas.json new file mode 100644 index 0000000..ac4a426 --- /dev/null +++ b/last-shas.json @@ -0,0 +1,7 @@ +{ + "stream-api": "5eb845865e6633511b2f68a0e1615b2391ddca6e", + "live-api-streampk": "6f2f3932360624b473c55becb7a5354b9a0fa804", + "auth-proxy": "7660a5a252554af55bf84da219b63a76322d8b85", + "player": "4b3a4a6523dbf019abe8f9ec02e689e5d4e3b672", + "frontend": "ecab7ccd9fc2011bb78ac37f5b2a478ff25d162d" +} diff --git a/main.js b/main.js new file mode 100644 index 0000000..0ee549f --- /dev/null +++ b/main.js @@ -0,0 +1,664 @@ +const { app, BrowserWindow, ipcMain, Menu } = require('electron'); +const path = require('path'); +const fs = require('fs'); +const express = require('express'); +const ServiceManager = require('./service-manager'); +const Patcher = require('./patcher'); +const UpdateClient = require('./update-client'); + +let mainWindow; +let serviceManager; +let expressApp; +let expressServer; +let playerExpressApp; +let playerExpressServer; + +const gotLock = app.requestSingleInstanceLock(); + +if (!gotLock) { + app.quit(); +} else { + app.on('second-instance', () => { + if (mainWindow) { + if (mainWindow.isMinimized()) mainWindow.restore(); + mainWindow.focus(); + } + }); +} + +const APPDATA_DIR = path.join(app.getPath('userData'), 'vyla-home-files'); +fs.mkdirSync(APPDATA_DIR, { recursive: true }); + +const envConfig = JSON.parse(fs.readFileSync(path.join(__dirname, 'config/env.json'), 'utf8')); +const replacementsConfig = JSON.parse(fs.readFileSync(path.join(__dirname, 'config/replacements.json'), 'utf8')); + +const updateClient = new UpdateClient(APPDATA_DIR); + +process.on('unhandledRejection', (reason) => { + const message = reason && reason.message ? reason.message : String(reason); + fs.appendFileSync(path.join(APPDATA_DIR, 'crash.log'), `[${new Date().toISOString()}] UNHANDLED REJECTION: ${message}\n`, 'utf8'); +}); + +process.on('uncaughtException', (err) => { + fs.appendFileSync(path.join(APPDATA_DIR, 'crash.log'), `[${new Date().toISOString()}] UNCAUGHT EXCEPTION: ${err.message}\n`, 'utf8'); +}); + +async function createWindow() { + const asciiLogo = fs.readFileSync(path.join(__dirname, 'build', 'logo.txt'), 'utf8'); + + mainWindow = new BrowserWindow({ + width: 1280, + height: 800, + title: 'Vyla Home', + icon: path.join(__dirname, 'build', 'icon.ico'), + titleBarStyle: 'hidden', + titleBarOverlay: { + color: '#00000000', + symbolColor: '#ffffff', + height: 40 + }, + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + preload: path.join(__dirname, 'preload.js') + } + }); + + Menu.setApplicationMenu(null); + + mainWindow.webContents.setWindowOpenHandler(({ url }) => { + mainWindow.loadURL(url); + return { action: 'deny' }; + }); + + mainWindow.loadURL('data:text/html;charset=utf-8,' + encodeURIComponent(` + + + + +Vyla Home + + + + +
+ + +
+ +
+ + + + + +`)); + + const patcher = new Patcher(APPDATA_DIR); + serviceManager = new ServiceManager(APPDATA_DIR, envConfig); + + const showUpdatePrompt = (currentVersion, newVersion) => { + return new Promise((resolve) => { + ipcMain.removeAllListeners('update-choice'); + ipcMain.once('update-choice', (event, choice) => { + resolve(choice); + }); + + mainWindow.loadURL('data:text/html;charset=utf-8,' + encodeURIComponent(` + + + + +Update Available + + + + +
+ + + + + + +

Update Available

+ +

You're running version ${currentVersion}. Version ${newVersion} is available.\nInstalling will fetch the latest build.

+ +
+ + +
+ + + + + +`)); + }); + }; + + const handleFatalError = (errMessage) => { + mainWindow.loadURL('data:text/html;charset=utf-8,' + encodeURIComponent(` + + + + +Startup Error + + + + +
+ + + + + + +

Couldn't start Vyla Home

+ +

${errMessage}

+ + +
+ + + +`)); + }; + + const installBuild = async (release) => { + const tempZipPath = path.join(APPDATA_DIR, 'download-temp.zip'); + let attempts = 0; + let downloadSuccess = false; + + while (attempts < 3 && !downloadSuccess) { + attempts++; + try { + await updateClient.downloadUpdate(release, tempZipPath, (downloaded, total) => { + const percent = Math.round((downloaded / total) * 100); + }); + + if (!patcher.verifyChecksum(tempZipPath, release.sha256)) { + throw new Error('SHA-256 checksum verification failed.'); + } + + patcher.purgeOldCode(); + patcher.extractZipPayload(tempZipPath); + + if (!patcher.verifyExtraction()) { + throw new Error('Extraction verification failed: critical startup files missing.'); + } + + patcher.applyPatches(replacementsConfig); + patcher.bridgeCredentials(serviceManager.credentialManager); + patcher.saveCurrentVersion(release.version); + + fs.unlinkSync(tempZipPath); + downloadSuccess = true; + } catch (err) { + if (fs.existsSync(tempZipPath)) fs.unlinkSync(tempZipPath); + if (attempts >= 3) { + throw new Error(`Failed to download and verify build after 3 attempts: ${err.message}`); + } + await new Promise(r => setTimeout(r, 2000)); + } + } + }; + + try { + const isFirstRun = !patcher.verifyExtraction(); + const localVersion = patcher.getCurrentVersion(); + + const release = await updateClient.checkForUpdates(); + + if (isFirstRun) { + await installBuild(release); + } else if (release.version !== localVersion) { + const choice = await showUpdatePrompt(localVersion, release.version); + if (choice === 'install') { + await installBuild(release); + } + } + + if (!patcher.verifyExtraction()) { + throw new Error('No application files found. Check your internet connection and try again.'); + } + + serviceManager.credentialManager.loadCredentials(); + + await serviceManager.startServices([ + { name: 'auth-proxy', relativeDir: 'auth-proxy' }, + { name: 'stream-api', relativeDir: 'stream-api' }, + { name: 'live-api-streampk', relativeDir: 'live-api-streampk' } + ]); + + const playerDir = path.join(APPDATA_DIR, 'player'); + playerExpressApp = express(); + playerExpressApp.use(express.static(playerDir, { maxAge: '1d', etag: true })); + playerExpressApp.get('*', (req, res) => { + res.sendFile(path.join(playerDir, 'index.html')); + }); + playerExpressServer = playerExpressApp.listen(3001); + + await serviceManager.waitForPorts([3000, 3001, 7860, 5000]); + + const healthChecks = [ + { port: 3001, name: 'player' }, + { port: 3000, name: 'auth-proxy' }, + { port: 7860, name: 'stream-api' }, + { port: 5000, name: 'live-api-streampk' } + ]; + for (const { port, name } of healthChecks) { + try { + await serviceManager.checkHealth(port, '/'); + } catch (e) { + serviceManager.logToFile(name, `Health check on / did not pass, continuing anyway: ${e.message}`); + } + } + + const frontendDir = path.join(APPDATA_DIR, 'frontend'); + expressApp = express(); + expressApp.use(express.static(frontendDir, { maxAge: '1d', etag: true })); + expressApp.get('*', (req, res) => { + res.sendFile(path.join(frontendDir, 'index.html')); + }); + + const FRONTEND_PORT = 4890; + expressServer = expressApp.listen(FRONTEND_PORT, () => { + mainWindow.loadURL(`http://localhost:${FRONTEND_PORT}`); + }); + + } catch (error) { + if (serviceManager) { + await serviceManager.stopAll().catch(() => { }); + } + handleFatalError(error.message); + } +} + +if (gotLock) { + app.whenReady().then(createWindow); +} + +app.on('window-all-closed', async () => { + if (expressServer) expressServer.close(); + if (playerExpressServer) playerExpressServer.close(); + if (serviceManager) { + await serviceManager.stopAll(); + } + if (process.platform !== 'darwin') { + app.quit(); + } +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2554071 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5281 @@ +{ + "name": "vyla-home", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vyla-home", + "version": "1.0.0", + "dependencies": { + "@vyla-entertainment/sdk": "^1.5.0", + "adm-zip": "^0.6.0", + "audit": "^0.0.6", + "express": "^4.19.2" + }, + "devDependencies": { + "@electron/rebuild": "^4.2.0", + "electron": "^42.7.0", + "electron-builder": "^26.15.3", + "javascript-obfuscator": "^4.1.0" + } + }, + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.5.tgz", + "integrity": "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/get": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz", + "integrity": "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.0.tgz", + "integrity": "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@inversifyjs/common": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.3.3.tgz", + "integrity": "sha512-ZH0wrgaJwIo3s9gMCDM2wZoxqrJ6gB97jWXncROfYdqZJv8f3EkqT57faZqN5OTeHWgtziQ6F6g3L8rCvGceCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inversifyjs/core": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@inversifyjs/core/-/core-1.3.4.tgz", + "integrity": "sha512-gCCmA4BdbHEFwvVZ2elWgHuXZWk6AOu/1frxsS+2fWhjEk2c/IhtypLo5ytSUie1BCiT6i9qnEo4bruBomQsAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.3.3", + "@inversifyjs/reflect-metadata-utils": "0.2.3" + } + }, + "node_modules/@inversifyjs/reflect-metadata-utils": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@inversifyjs/reflect-metadata-utils/-/reflect-metadata-utils-0.2.3.tgz", + "integrity": "sha512-d3D0o9TeSlvaGM2I24wcNw/Aj3rc4OYvHXOKDC09YEph5fMMiKd6fq1VTQd9tOkDNWvVbw+cnt45Wy9P/t5Lvw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "reflect-metadata": "0.2.2" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@javascript-obfuscator/escodegen": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.1.tgz", + "integrity": "sha512-Z0HEAVwwafOume+6LFXirAVZeuEMKWuPzpFbQhCEU9++BMz0IwEa9bmedJ+rMn/IlXRBID9j3gQ0XYAa6jM10g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@javascript-obfuscator/estraverse": "^5.3.0", + "esprima": "^4.0.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/@javascript-obfuscator/estraverse": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", + "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@noble/hashes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.3.0.tgz", + "integrity": "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.9.0.tgz", + "integrity": "sha512-AKvPMOM7LfK0uFe1m7o7+veOa8xQGPqsqOrKi3QKgCElzwjGp39mbhr2g7mt/v/mXQHiIvJmDj5cJS173x8Q9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vyla-entertainment/sdk": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@vyla-entertainment/sdk/-/sdk-1.9.0.tgz", + "integrity": "sha512-jhUP1naksNdH0BJSrmUIfBaujsDRBPsnwToZZFgOnhwk40+kbs3M+JlDrUIlncp9Zic3yVkjkY/ajfU2ZQkeXg==", + "license": "CC-BY-NC-4.0" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.14.tgz", + "integrity": "sha512-T4EDRUBVZYRldYApjEJiU0e1stYWaRAX7CuSnKzrpwdZKo53zGV8/pqfzV6FfwNl9YThD2OumQYvqtvjvgG7aQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.6.0.tgz", + "integrity": "sha512-XleryMhbuksdKtofnWZ9Sk+4CUTbms4Mb/EU32SZwToAyZ5RgVos/ki8n+yr0LWHOGKuakbXTuuYNHLQjhddgg==", + "license": "MIT", + "engines": { + "node": ">=14.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-lib": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz", + "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.4", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^2.2.0", + "@peculiar/webcrypto": "^1.7.1", + "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", + "async-exit-hook": "^2.0.1", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.15.3", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", + "which": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.15.3", + "electron-builder-squirrel-windows": "26.15.3" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/app-builder-lib/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/app-builder-lib/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomically": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.1.1.tgz", + "integrity": "sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stubborn-fs": "^2.0.0", + "when-exit": "^2.1.4" + } + }, + "node_modules/audit": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/audit/-/audit-0.0.6.tgz", + "integrity": "sha512-xgv3Y3RIYE00N2/xk10VLlwFd1kjc7FRaX1vC8+CsOfDRe53a06vOSkp91BOSNijZfddYum47a1Fvju/2+JPcw==", + "engines": { + "node": ">= 0.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "license": "MIT", + "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.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz", + "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chance": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.13.tgz", + "integrity": "sha512-V6lQCljcLznE7tUYUM9EOAnnKXbctE6j/rdQkYOHIWbfGQbrzTsAXNW9CdU5XCo4ArXQCj/rb6HgxPlmGJcaUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/class-validator": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", + "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/conf": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/conf/-/conf-15.0.2.tgz", + "integrity": "sha512-JBSrutapCafTrddF9dH3lc7+T2tBycGF4uPkI4Js+g4vLLEhG6RZcFi3aJd5zntdf5tQxAejJt8dihkoQ/eSJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "atomically": "^2.0.3", + "debounce-fn": "^6.0.0", + "dot-prop": "^10.0.0", + "env-paths": "^3.0.0", + "json-schema-typed": "^8.0.1", + "semver": "^7.7.2", + "uint8array-extras": "^1.5.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/debounce-fn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-6.0.0.tgz", + "integrity": "sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz", + "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0" + } + }, + "node_modules/dot-prop": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-10.2.0.tgz", + "integrity": "sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^5.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "42.9.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-42.9.0.tgz", + "integrity": "sha512-xyKfPbHP43Jx22Z1hItLR4KB5h3/avb5BIX4xaQZ6uPPRY4cQxuHnRVrKCGbSsMa/9zd0bBT4TAVNVuVjYcYtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-internal/extract-zip": "^1.0.1", + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz", + "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.15.3", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz", + "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-publish": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", + "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "aws4": "^1.13.2", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "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.15.1", + "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" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "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.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inversify": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.1.4.tgz", + "integrity": "sha512-PbxrZH/gTa1fpPEEGAjJQzK8tKMIp5gRg6EFNJlCtzUcycuNdmhv3uk5P8Itm/RIjgHJO16oQRLo9IHzQN51bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.3.3", + "@inversifyjs/core": "1.3.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/javascript-obfuscator": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.2.2.tgz", + "integrity": "sha512-+7oXAUnFCA6vS0omIGHcWpSr67dUBIF7FKGYSXyzxShSLqM6LBgdugWKFl0XrYtGWyJMGfQR5F4LL85iCefkRA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@javascript-obfuscator/escodegen": "2.3.1", + "@javascript-obfuscator/estraverse": "5.4.0", + "acorn": "8.15.0", + "assert": "2.1.0", + "chalk": "4.1.2", + "chance": "1.1.13", + "class-validator": "0.14.3", + "commander": "12.1.0", + "conf": "15.0.2", + "eslint-scope": "8.4.0", + "eslint-visitor-keys": "4.2.1", + "fast-deep-equal": "3.1.3", + "inversify": "6.1.4", + "js-string-escape": "1.0.1", + "md5": "2.3.0", + "mkdirp": "3.0.1", + "multimatch": "5.0.0", + "process": "0.11.10", + "reflect-metadata": "0.2.2", + "source-map-support": "0.5.21", + "string-template": "1.0.0", + "stringz": "2.1.0", + "tslib": "2.8.1" + }, + "bin": { + "javascript-obfuscator": "bin/javascript-obfuscator" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/javascript-obfuscator/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.13.11", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.13.11.tgz", + "integrity": "sha512-ETER2kMaIFTI/Nh1a8Gk03dUF/SL0VZqtI+CcVHZxp5WIHYwNS7S+uiYZDYCvLy3lOR4/DAD5jf0h5WkePPpqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/multimatch/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.33.0.tgz", + "integrity": "sha512-vLBWCKb+7LWsX+TbfzWOkw0W81m377tyx3hOweBTjO43CXZnRGS1/JPWs20fr0PgZyDXk6ROYrylsEycK8raDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringz": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stringz/-/stringz-2.1.0.tgz", + "integrity": "sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stubborn-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-2.0.0.tgz", + "integrity": "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "stubborn-utils": "^1.0.1" + } + }, + "node_modules/stubborn-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stubborn-utils/-/stubborn-utils-1.0.2.tgz", + "integrity": "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", + "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unzipper": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", + "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "11.3.1", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/validator": { + "version": "13.15.35", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", + "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/when-exit": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.5.tgz", + "integrity": "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..19ee767 --- /dev/null +++ b/package.json @@ -0,0 +1,56 @@ +{ + "name": "vyla-home", + "version": "1.0.0", + "description": "Vyla Home Desktop App Launcher", + "main": "main.js", + "scripts": { + "start": "electron .", + "pack": "electron-builder --dir", + "dist": "electron-builder", + "build": "node build-pipeline.js" + }, + "dependencies": { + "@vyla-entertainment/sdk": "^1.5.0", + "adm-zip": "^0.6.0", + "audit": "^0.0.6", + "express": "^4.19.2" + }, + "devDependencies": { + "@electron/rebuild": "^4.2.0", + "electron": "^42.7.0", + "electron-builder": "^26.15.3", + "javascript-obfuscator": "^4.1.0" + }, + "build": { + "appId": "com.vyla.home", + "productName": "Vyla Home", + "directories": { + "output": "dist" + }, + "files": [ + "main.js", + "preload.js", + "service-manager.js", + "patcher.js", + "crypto-utils.js", + "credential-manager.js", + "update-client.js", + "gitlab-client.js", + "config/**/*", + "build/icon.ico", + "build/logo.txt", + "package.json" + ], + "win": { + "target": "nsis", + "icon": "build/icon.ico" + }, + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true, + "installerIcon": "build/icon.ico", + "uninstallerIcon": "build/icon.ico", + "installerHeaderIcon": "build/icon.ico" + } + } +} diff --git a/patcher.js b/patcher.js new file mode 100644 index 0000000..1f40d6c --- /dev/null +++ b/patcher.js @@ -0,0 +1,144 @@ +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); +const AdmZip = require('adm-zip'); +const CryptoUtils = require('./crypto-utils'); + +class Patcher { + constructor(appDataPath) { + this.appDataPath = appDataPath; + } + + getCurrentVersion() { + const versionFile = path.join(this.appDataPath, 'version.json'); + if (fs.existsSync(versionFile)) { + try { + return JSON.parse(fs.readFileSync(versionFile, 'utf8')).version; + } catch (e) { + return '0.0.0'; + } + } + return '0.0.0'; + } + + bridgeCredentials(credentialManager) { + const encryptedPath = path.join(this.appDataPath, 'encrypted-credentials.json'); + if (!fs.existsSync(encryptedPath)) { + return false; + } + + const buildKey = CryptoUtils.deriveKey('vyla-home-build-key', 'vyla-home-payload-salt-v1'); + const encryptedData = fs.readFileSync(encryptedPath, 'utf8'); + const credentials = CryptoUtils.decryptObject(encryptedData, buildKey); + + for (const [service, keys] of Object.entries(credentials)) { + credentialManager.setServiceCredentials(service, keys); + } + + fs.unlinkSync(encryptedPath); + return true; + } + + saveCurrentVersion(version) { + const versionFile = path.join(this.appDataPath, 'version.json'); + fs.mkdirSync(this.appDataPath, { recursive: true }); + fs.writeFileSync(versionFile, JSON.stringify({ version }, null, 2), 'utf8'); + } + + purgeOldCode() { + const dirs = ['frontend', 'player', 'stream-api', 'live-api-streampk']; + for (const dir of dirs) { + const fullPath = path.join(this.appDataPath, dir); + if (fs.existsSync(fullPath)) { + fs.rmSync(fullPath, { recursive: true, force: true }); + } + } + } + + extractZipPayload(zipPath) { + const zip = new AdmZip(zipPath); + zip.extractAllTo(this.appDataPath, true); + } + + verifyChecksum(zipPath, expectedSha256) { + if (!expectedSha256) return true; + const hash = crypto.createHash('sha256'); + const data = fs.readFileSync(zipPath); + hash.update(data); + const calculated = hash.digest('hex'); + return calculated === expectedSha256; + } + + verifyExtraction() { + const requiredFiles = [ + 'player/index.html', + 'auth-proxy/server.js', + 'stream-api/server.js', + 'live-api-streampk/server.js', + 'frontend/index.html' + ]; + + for (const file of requiredFiles) { + const fullPath = path.join(this.appDataPath, file); + if (!fs.existsSync(fullPath)) { + return false; + } + const stat = fs.statSync(fullPath); + if (stat.size === 0) { + return false; + } + const sampleSize = Math.min(stat.size, 4096); + const fd = fs.openSync(fullPath, 'r'); + const buffer = Buffer.alloc(sampleSize); + fs.readSync(fd, buffer, 0, sampleSize, 0); + fs.closeSync(fd); + if (buffer.every(byte => byte === 0)) { + return false; + } + } + return true; + } + + processDirectory(dir, replacementList) { + const files = fs.readdirSync(dir); + for (const file of files) { + const fullPath = path.join(dir, file); + const stat = fs.statSync(fullPath); + + if (stat.isDirectory()) { + if (file === 'node_modules' || file === '.git') continue; + this.processDirectory(fullPath, replacementList); + } else if (stat.isFile()) { + const ext = path.extname(fullPath).toLowerCase(); + if (['.js', '.html', '.css', '.json', '.xml', '.txt'].includes(ext)) { + let content = fs.readFileSync(fullPath, 'utf8'); + let modified = false; + + for (const rep of replacementList) { + if (content.includes(rep.find)) { + content = content.split(rep.find).join(rep.replace); + modified = true; + } + } + + if (modified) { + fs.writeFileSync(fullPath, content, 'utf8'); + } + } + } + } + } + + applyPatches(replacements) { + for (const [componentName, replacementList] of Object.entries(replacements)) { + if (!replacementList || replacementList.length === 0) continue; + + const componentDir = path.join(this.appDataPath, componentName); + if (!fs.existsSync(componentDir)) continue; + + this.processDirectory(componentDir, replacementList); + } + } +} + +module.exports = Patcher; \ No newline at end of file diff --git a/preload.js b/preload.js new file mode 100644 index 0000000..181ac5f --- /dev/null +++ b/preload.js @@ -0,0 +1,5 @@ +const { contextBridge, ipcRenderer } = require('electron'); + +contextBridge.exposeInMainWorld('vylaHome', { + sendUpdateChoice: (choice) => ipcRenderer.send('update-choice', choice) +}); \ No newline at end of file diff --git a/service-manager.js b/service-manager.js new file mode 100644 index 0000000..7f7e9f1 --- /dev/null +++ b/service-manager.js @@ -0,0 +1,170 @@ +const { spawn } = require('child_process'); +const path = require('path'); +const fs = require('fs'); +const http = require('http'); +const CredentialManager = require('./credential-manager'); + +class ServiceManager { + constructor(appDataPath, envConfig) { + this.appDataPath = appDataPath; + this.envConfig = envConfig; + this.credentialManager = new CredentialManager(appDataPath); + this.processes = {}; + this.restartCounts = {}; + this.stableTimers = {}; + this.isStopping = false; + + this.logsDir = path.join(appDataPath, 'logs'); + fs.mkdirSync(this.logsDir, { recursive: true }); + } + + logToFile(name, line) { + try { + const logPath = path.join(this.logsDir, `${name}.log`); + const timestamp = new Date().toISOString(); + fs.appendFileSync(logPath, `[${timestamp}] ${line}\n`, 'utf8'); + } catch (e) { + } + } + + async startService(name, relativeDir, startScript = 'server.js') { + if (this.processes[name]) { + return; + } + + const serviceDir = path.join(this.appDataPath, relativeDir); + const scriptPath = path.join(serviceDir, startScript); + + if (!fs.existsSync(scriptPath)) { + throw new Error(`Service script not found: ${scriptPath}`); + } + + const env = { + ...process.env, + ...(this.envConfig[name] || {}), + ...(this.credentialManager.getServiceCredentials(name) || {}), + ELECTRON_RUN_AS_NODE: '1' + }; + + this.logToFile(name, `--- Starting ${name} in ${serviceDir} ---`); + + const child = spawn(process.execPath, [scriptPath], { + cwd: serviceDir, + env, + stdio: ['ignore', 'pipe', 'pipe'] + }); + + this.processes[name] = { + child, + relativeDir, + startScript, + status: 'starting' + }; + + if (this.stableTimers[name]) { + clearTimeout(this.stableTimers[name]); + } + this.stableTimers[name] = setTimeout(() => { + this.restartCounts[name] = 0; + }, 60000); + + child.stdout.on('data', (data) => { + const text = data.toString().trim(); + this.logToFile(name, `STDOUT: ${text}`); + }); + + child.stderr.on('data', (data) => { + const text = data.toString().trim(); + this.logToFile(name, `STDERR: ${text}`); + }); + + child.on('exit', (code, signal) => { + this.logToFile(name, `EXITED: code=${code} signal=${signal}`); + this.processes[name] = null; + + if (this.stableTimers[name]) { + clearTimeout(this.stableTimers[name]); + this.stableTimers[name] = null; + } + + if (!this.isStopping) { + this.restartCounts[name] = (this.restartCounts[name] || 0) + 1; + if (this.restartCounts[name] > 5) { + this.logToFile(name, `Crashed too many times, giving up.`); + return; + } + setTimeout(() => { + this.startService(name, relativeDir, startScript).catch(err => { + this.logToFile(name, `Failed to restart: ${err.message}`); + }); + }, 3000); + } + }); + } + + async startServices(services) { + await Promise.all(services.map(({ name, relativeDir, startScript }) => + this.startService(name, relativeDir, startScript) + )); + } + + async waitForPorts(ports, timeoutMs = 30000) { + await Promise.all(ports.map((port) => this.waitForPort(port, timeoutMs))); + } + + async stopAll() { + this.isStopping = true; + for (const name of Object.keys(this.stableTimers)) { + if (this.stableTimers[name]) { + clearTimeout(this.stableTimers[name]); + } + } + this.stableTimers = {}; + const killPromises = Object.keys(this.processes).map((name) => { + const procInfo = this.processes[name]; + if (procInfo && procInfo.child) { + this.logToFile(name, `Killing service`); + return new Promise((resolve) => { + procInfo.child.removeAllListeners('exit'); + procInfo.child.on('exit', () => resolve()); + procInfo.child.kill(); + }); + } + return Promise.resolve(); + }); + + await Promise.all(killPromises); + this.processes = {}; + } + + async waitForPort(port, timeoutMs = 30000) { + const start = Date.now(); + const net = require('net'); + + while (Date.now() - start < timeoutMs) { + if (this.isStopping) return false; + const connected = await new Promise((resolve) => { + const socket = new net.Socket(); + socket.setTimeout(1000); + socket.on('connect', () => { + socket.destroy(); + resolve(true); + }); + socket.on('error', () => { + resolve(false); + }); + socket.on('timeout', () => { + socket.destroy(); + resolve(false); + }); + socket.connect(port, '127.0.0.1'); + }); + + if (connected) return true; + await new Promise(r => setTimeout(r, 500)); + } + throw new Error(`Timeout waiting for port ${port}`); + } +} + +module.exports = ServiceManager; \ No newline at end of file diff --git a/source.png b/source.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdbb8205965d3c4c4dd0726794419698d82462b GIT binary patch literal 27557 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ΝY@TCG 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 F{y*cuqg?<1 literal 0 HcmV?d00001 diff --git a/update-client.js b/update-client.js new file mode 100644 index 0000000..e61bdd7 --- /dev/null +++ b/update-client.js @@ -0,0 +1,222 @@ +const https = require('https'); +const fs = require('fs'); + +const GITLAB_GROUP = 'vyla-entertainment'; +const GITLAB_REPO = 'home'; +const RELEASES_API = `https://gitlab.com/api/v4/projects/${GITLAB_GROUP}%2F${GITLAB_REPO}/releases`; +const ALLOWED_REDIRECT_HOSTS = ['gitlab.com']; + +function isAllowedHost(url) { + try { + return ALLOWED_REDIRECT_HOSTS.includes(new URL(url).hostname); + } catch (e) { + return false; + } +} + +class UpdateClient { + constructor(appDataPath) { + this.appDataPath = appDataPath; + } + + fetchJson(url) { + return new Promise((resolve, reject) => { + const urlObj = new URL(url); + const requestOptions = { + hostname: urlObj.hostname, + port: 443, + path: urlObj.pathname + urlObj.search, + method: 'GET', + headers: { + 'User-Agent': 'VylaHome-Client', + 'Accept': 'application/json' + } + }; + + const req = https.request(requestOptions, (res) => { + let data = ''; + res.on('data', (chunk) => { data += chunk; }); + res.on('end', () => { + if (res.statusCode !== 200) { + reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`)); + return; + } + try { + resolve(JSON.parse(data)); + } catch (e) { + reject(new Error('Invalid JSON response')); + } + }); + }); + + req.on('error', reject); + req.setTimeout(30000, () => { + req.destroy(); + reject(new Error('Request timeout')); + }); + + req.end(); + }); + } + + downloadFile(url, destPath, onProgress) { + return new Promise((resolve, reject) => { + const doRequest = (requestUrl, redirectCount) => { + if (redirectCount > 5) { + reject(new Error('Too many redirects')); + return; + } + + const urlObj = new URL(requestUrl); + const requestOptions = { + hostname: urlObj.hostname, + port: 443, + path: urlObj.pathname + urlObj.search, + headers: { + 'User-Agent': 'VylaHome-Client', + 'Accept': 'application/octet-stream' + } + }; + + const req = https.get(requestOptions, (res) => { + if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { + res.resume(); + if (!isAllowedHost(res.headers.location)) { + reject(new Error(`Redirect to disallowed host: ${res.headers.location}`)); + return; + } + doRequest(res.headers.location, redirectCount + 1); + return; + } + + if (res.statusCode !== 200) { + reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`)); + return; + } + + const totalSize = parseInt(res.headers['content-length'], 10); + let downloadedSize = 0; + + const file = fs.createWriteStream(destPath); + res.pipe(file); + + res.on('data', (chunk) => { + downloadedSize += chunk.length; + if (onProgress && totalSize) { + onProgress(downloadedSize, totalSize); + } + }); + + file.on('finish', () => { + file.close(resolve); + }); + + file.on('error', (err) => { + fs.unlink(destPath, () => { }); + reject(err); + }); + }); + + req.on('error', (err) => { + fs.unlink(destPath, () => { }); + reject(err); + }); + + req.setTimeout(120000, () => { + req.destroy(); + fs.unlink(destPath, () => { }); + reject(new Error('Download timeout')); + }); + }; + + doRequest(url, 0); + }); + } + + async fetchAssetJson(url) { + return new Promise((resolve, reject) => { + const doRequest = (requestUrl, redirectCount) => { + if (redirectCount > 5) { + reject(new Error('Too many redirects')); + return; + } + + const urlObj = new URL(requestUrl); + const requestOptions = { + hostname: urlObj.hostname, + port: 443, + path: urlObj.pathname + urlObj.search, + headers: { + 'User-Agent': 'VylaHome-Client', + 'Accept': 'application/octet-stream' + } + }; + + const req = https.get(requestOptions, (res) => { + if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { + res.resume(); + doRequest(res.headers.location, redirectCount + 1); + return; + } + + if (res.statusCode !== 200) { + reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`)); + return; + } + + let data = ''; + res.on('data', (chunk) => { data += chunk; }); + res.on('end', () => { + try { + resolve(JSON.parse(data)); + } catch (e) { + reject(new Error('Invalid JSON in manifest asset')); + } + }); + }); + + req.on('error', reject); + req.setTimeout(30000, () => { + req.destroy(); + reject(new Error('Request timeout')); + }); + }; + + doRequest(url, 0); + }); + } + + async checkForUpdates() { + const releases = await this.fetchJson(RELEASES_API); + if (!releases || releases.length === 0) { + throw new Error('No releases found.'); + } + const release = releases[0]; + + const payloadAsset = (release.assets.links || []).find(a => a.name === 'update-payload.zip'); + const manifestAsset = (release.assets.links || []).find(a => a.name === 'manifest.json'); + + if (!payloadAsset) { + throw new Error('No update-payload.zip asset found on latest release.'); + } + + let sha256 = null; + if (manifestAsset) { + const manifest = await this.fetchAssetJson(manifestAsset.url); + sha256 = manifest.sha256 || null; + } + + return { + version: release.tag_name, + url: payloadAsset.url, + sha256 + }; + } + + async downloadUpdate(release, destPath, onProgress) { + await this.downloadFile(release.url, destPath, onProgress); + return destPath; + } +} + +module.exports = UpdateClient; \ No newline at end of file