diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..c9aae9638 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,89 @@ +{ + "extends": "zardoy", + "ignorePatterns": [ + "!*.js" + ], + "rules": { + "object-curly-spacing": [ + "error", + "always" + ], + "semi": [ + "error", + "never" + ], + "comma-dangle": [ + "error", + // todo maybe "always-multiline"? + "only-multiline" + ], + "indent": [ + "error", + 2, + { + "SwitchCase": 1, + "ignoredNodes": [ + "TemplateLiteral" + ] + } + ], + "quotes": [ + "error", + "single", + { + "allowTemplateLiterals": true + } + ], + // perf + "import/no-deprecated": "off", + // --- + "@typescript-eslint/prefer-nullish-coalescing": "off", + "@typescript-eslint/naming-convention": "off", + "prefer-template": "off", + // intentional: improve readability in some cases + "no-else-return": "off", + "@typescript-eslint/padding-line-between-statements": "off", + "arrow-body-style": "off", + "unicorn/prefer-ternary": "off", + "unicorn/switch-case-braces": "off", + "@typescript-eslint/consistent-type-definitions": "off", + "unicorn/explicit-length-check": "off", + "unicorn/prefer-dom-node-append": "off", + "typescript-eslint/no-confusing-void-expression": "off", + "unicorn/no-lonely-if": "off", + "no-multi-assign": "off", + "sonarjs/no-duplicate-string": "off", + "new-cap": "off", + "unicorn/consistent-destructuring": "off", + "unicorn/no-await-expression-member": "off", + "unicorn/prefer-add-event-listener": "off", + "unicorn/prefer-top-level-await": "off", + "default-case": "off", + // I guess it would better to fix + "node/prefer-global/buffer": "off", + "unicorn/prefer-optional-catch-binding": "off", // still useful for debugging + "no-alert": "off", // todo once replaced with ui, enable + "@typescript-eslint/restrict-plus-operands": "off", + // --- + "@typescript-eslint/no-throw-literal": "off", // disabling because of "rule expansion" + "no-empty-function": "off", + "@typescript-eslint/no-explicit-any": "off", + "import/no-extraneous-dependencies": "off", + "@typescript-eslint/ban-types": "off", + "unicorn/prefer-query-selector": "off", + "@typescript-eslint/dot-notation": "off", // trick prop type-checking + "@typescript-eslint/consistent-type-imports": "off", + "no-negated-condition": "off", + "@typescript-eslint/no-require-imports": "off", + "unicorn/prefer-number-properties": "off", + "@typescript-eslint/no-confusing-void-expression": "off", + "unicorn/no-empty-file": "off", + "unicorn/prefer-event-target": "off", + // needs to be fixed actually + "@typescript-eslint/no-floating-promises": "warn", + "no-async-promise-executor": "off", + "no-bitwise": "off", + "unicorn/filename-case": "off", + "max-depth": "off" + } +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c46e06266..c53d6061e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,61 +1,25 @@ name: CI - on: - push: - branches: [ master ] pull_request: - branches: [ master ] - jobs: - build: - + build-and-deploy: runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [18.x] - + permissions: write-all steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - run: npm run build - - run: npm test - DeployPages: - runs-on: ubuntu-latest - if: ${{ github.event_name == 'push' }} - steps: - - name: Checkout 🛎️ - uses: actions/checkout@v2.3.1 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly. + - name: Checkout repository + uses: actions/checkout@master + - name: Install pnpm + run: npm i -g pnpm + - run: pnpm install + - run: pnpm lint + - run: pnpm check-build + - run: nohup pnpm prod-start & + - run: nohup node cypress/minecraft-server.mjs & + - uses: cypress-io/github-action@v5 with: - persist-credentials: false - fetch-depth: 0 - - name: Edit config - run: | - sed -i -E 's/^ "defaultProxy": ""/ "defaultProxy": "pproxy.rom1504.fr"/g' config.json - sed -i -E 's/^ "defaultProxyPort": 0/ "defaultProxyPort": 443/g' config.json - - name: Build - run: | - npm install - npm run build - cp -R public/ ../ - rm -Rf ./* - git checkout gh-pages - rm -Rf ./* - rm -Rf .github .gitignore .gitpod .gitpod.DockerFile .npmignore .npmrc - cp -R ../public/* ./ - - name: Create commits - run: | - git config user.name 'rom1504bot' - git config user.email 'rom1504bot@users.noreply.github.com' - git add --all - git commit --amend -m "Update gh-pages" - - name: Deploy 🚀 - uses: ad-m/github-push-action@master + install: false + - uses: actions/upload-artifact@v3 + if: failure() with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: gh-pages - force: true + name: cypress-images + path: cypress/integration/__image_snapshots__/ diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml new file mode 100644 index 000000000..c51df9b31 --- /dev/null +++ b/.github/workflows/preview.yml @@ -0,0 +1,29 @@ +name: Vercel Deploy Preview +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} +on: + pull_request: +jobs: + deploy: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install Global Dependencies + run: npm install --global vercel pnpm + - name: Pull Vercel Environment Information + run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} + - name: Build Project Artifacts + run: vercel build --token=${{ secrets.VERCEL_TOKEN }} + - name: Deploy Project Artifacts to Vercel + uses: mathiasvr/command-output@v2.0.0 + with: + run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} + id: deploy + - uses: mshick/add-pr-comment@v2 + with: + message: | + Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 061457c86..0a6378a93 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,33 +1,36 @@ -name: npm-publish +name: Deploy to GitHub pages +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} on: push: - branches: - - master # Change this to your default branch + branches: [main] jobs: - npm-publish: - name: npm-publish + build-and-deploy: runs-on: ubuntu-latest + permissions: write-all steps: - - name: Checkout repository - uses: actions/checkout@master - - name: Set up Node.js - uses: actions/setup-node@master - with: - node-version: 18.0.0 - - run: npm install - - id: publish - uses: JS-DevTools/npm-publish@v1 - with: - token: ${{ secrets.NPM_AUTH_TOKEN }} - - name: Create Release - if: steps.publish.outputs.type != 'none' - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ steps.publish.outputs.version }} - release_name: Release ${{ steps.publish.outputs.version }} - body: ${{ steps.publish.outputs.version }} - draft: false - prerelease: false + - name: Checkout repository + uses: actions/checkout@master + - name: Install pnpm + run: npm i -g vercel pnpm + # - run: pnpm install + # - run: pnpm build + - run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + # will install + build to .vercel/output/static + - run: vercel build --token=${{ secrets.VERCEL_TOKEN }} --prod + - name: Deploy Project to Vercel + uses: mathiasvr/command-output@v2.0.0 + with: + run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} --prod + id: deploy + - run: | + pnpx zardoy-release node --footer "This release URL: ${{ steps.deploy.outputs.stdout }}" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - run: cp vercel.json .vercel/output/static/vercel.json + - uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: .vercel/output/static + force_orphan: true diff --git a/.gitignore b/.gitignore index 5678b4a23..131dc688c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,17 @@ node_modules/ package-lock.json .vscode -public +**/public +*.log +.env.local +Thumbs.db +build +localSettings.mjs +dist .DS_Store .idea/ -*.iml \ No newline at end of file +world +out +*.iml +.vercel +generated diff --git a/.gitpod b/.gitpod deleted file mode 100644 index 38fc373b5..000000000 --- a/.gitpod +++ /dev/null @@ -1,2 +0,0 @@ -tasks: -- command: npm install diff --git a/.npmrc b/.npmrc index 43c97e719..b602bc2e8 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,3 @@ -package-lock=false +public-hoist-pattern=* +ignore-workspace-root-check=true +shell-emulator=true diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..87e66901e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,61 @@ +{ + "configurations": [ + // UPDATED: all configs below are misconfigured and will crash vscode, open dist/index.html and use live preview debug instead + // recommended as much faster + { + // to launch "C:\Program Files\Google\Chrome Beta\Application\chrome.exe" --remote-debugging-port=9222 + "type": "chrome", + "address": "localhost", + "name": "Attach Chrome", + "request": "attach", + // comment if using webpack + "pathMapping": { + "/": "${workspaceFolder}/dist" + }, + "outFiles": [ + "${workspaceFolder}/dist/**/*.js", + // "!${workspaceFolder}/dist/**/*vendors*", + "!${workspaceFolder}/dist/**/*minecraftData*", + "!**/node_modules/**" + ], + "skipFiles": [ + // "/**/*vendors*" + "/**/*minecraftData*" + ], + "port": 9222, + }, + { + // not recommended as in most cases it will slower as it launches from extension host so it slows down extension host, not sure why + "type": "chrome", + "name": "Launch Chrome", + "request": "launch", + "url": "http://localhost:8080/", + "pathMapping": { + "/": "${workspaceFolder}/dist" + }, + "outFiles": [ + "${workspaceFolder}/dist/**/*.js", + // "!${workspaceFolder}/dist/**/*vendors*", + "!${workspaceFolder}/dist/**/*minecraftData*", + "!**/node_modules/**" + ], + "skipFiles": [ + // "/**/*vendors*" + "/**/*minecraftData*" + ], + }, + { + // to launch "C:\Program Files\Mozilla Firefox\firefox.exe" -start-debugger-server + "type": "firefox", + "name": "Attach Firefox", + "request": "attach", + // comment if using webpack + "url": "http://localhost:8080/", + "webRoot": "${workspaceFolder}/", + "skipFiles": [ + // "/**/*vendors*" + "/**/*minecraftData*" + ], + }, + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..407fd03fe --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# Contributing Guide + +After forking the repository, run the following commands to get started: + +0. Ensure you have [Node.js](https://nodejs.org) and `pnpm` installed. To install pnpm run `npm i -g pnpm`. +1. Install dependencies: `pnpm i` +2. Start the project in development mode: `pnpm start` + +A few notes: + +- It's recommended to use debugger for debugging. VSCode has a great debugger built-in. If debugger is slow, you can use `--no-sources` flag that would allow browser to speedup .map file parsing. +- Some data are cached between restarts. If you see something doesn't work after upgrading dependencies, try to clear the by simply removing the `dist` folder. +- The same folder `dist` is used for both development and production builds, so be careful when deploying the project. +- Use `start-prod` script to start the project in production mode after running `build` script to build the project. diff --git a/assets/button_click.mp3 b/assets/button_click.mp3 new file mode 100644 index 000000000..e60582fd0 Binary files /dev/null and b/assets/button_click.mp3 differ diff --git a/assets/click_stereo.ogg b/assets/click_stereo.ogg deleted file mode 100644 index b4889da63..000000000 Binary files a/assets/click_stereo.ogg and /dev/null differ diff --git a/extra-textures/background/panorama_0.png b/assets/extra-textures/background/panorama_0.png similarity index 100% rename from extra-textures/background/panorama_0.png rename to assets/extra-textures/background/panorama_0.png diff --git a/extra-textures/background/panorama_1.png b/assets/extra-textures/background/panorama_1.png similarity index 100% rename from extra-textures/background/panorama_1.png rename to assets/extra-textures/background/panorama_1.png diff --git a/extra-textures/background/panorama_2.png b/assets/extra-textures/background/panorama_2.png similarity index 100% rename from extra-textures/background/panorama_2.png rename to assets/extra-textures/background/panorama_2.png diff --git a/extra-textures/background/panorama_3.png b/assets/extra-textures/background/panorama_3.png similarity index 100% rename from extra-textures/background/panorama_3.png rename to assets/extra-textures/background/panorama_3.png diff --git a/extra-textures/background/panorama_4.png b/assets/extra-textures/background/panorama_4.png similarity index 100% rename from extra-textures/background/panorama_4.png rename to assets/extra-textures/background/panorama_4.png diff --git a/extra-textures/background/panorama_5.png b/assets/extra-textures/background/panorama_5.png similarity index 100% rename from extra-textures/background/panorama_5.png rename to assets/extra-textures/background/panorama_5.png diff --git a/extra-textures/edition.png b/assets/extra-textures/edition.png similarity index 100% rename from extra-textures/edition.png rename to assets/extra-textures/edition.png diff --git a/extra-textures/gui.png b/assets/extra-textures/gui.png similarity index 100% rename from extra-textures/gui.png rename to assets/extra-textures/gui.png diff --git a/extra-textures/loading.png b/assets/extra-textures/loading.png similarity index 100% rename from extra-textures/loading.png rename to assets/extra-textures/loading.png diff --git a/assets/manifest.json b/assets/manifest.json index ec18d3f57..e6e2068e0 100644 --- a/assets/manifest.json +++ b/assets/manifest.json @@ -1,13 +1,17 @@ { "name": "Prismarine Web Client", "short_name": "Prismarine Web Client", - "scope": "/", - "start_url": "/", - "icons": [{ - "src": "favicon.png", - "sizes": "512x512" - }], + "scope": "./", + "start_url": "./", + "icons": [ + { + "src": "favicon.png", + "sizes": "512x512" + } + ], "background_color": "#349474", "theme_color": "#349474", + "lang": "en-US", + "orientation": "landscape", "display": "standalone" -} \ No newline at end of file +} diff --git a/cypress.json b/cypress.json new file mode 100644 index 000000000..63bfb3510 --- /dev/null +++ b/cypress.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://raw.githubusercontent.com/cypress-io/cypress/188b9a742ee2ef51102167bfd84b3696a3f72a26/cli/schema/cypress.schema.json", + "baseUrl": "http://localhost:8080", + "testFiles": "**/*.spec.ts", + "video": false, + "chromeWebSecurity": false, + "ignoreTestFiles": [ + "**/__snapshots__/*", + "**/__image_snapshots__/*" + ] +} diff --git a/cypress/.gitignore b/cypress/.gitignore new file mode 100644 index 000000000..3451417e2 --- /dev/null +++ b/cypress/.gitignore @@ -0,0 +1,2 @@ +screenshots +fixtures diff --git a/cypress/integration/__image_snapshots__/superflat-world #0.png b/cypress/integration/__image_snapshots__/superflat-world #0.png new file mode 100644 index 000000000..58f2bd21d Binary files /dev/null and b/cypress/integration/__image_snapshots__/superflat-world #0.png differ diff --git a/cypress/integration/index.spec.ts b/cypress/integration/index.spec.ts new file mode 100644 index 000000000..ad285954d --- /dev/null +++ b/cypress/integration/index.spec.ts @@ -0,0 +1,79 @@ +/// +import type { AppOptions } from '../../src/optionsStorage' + +const cleanVisit = () => { + window.localStorage.clear() + visit() +} + +const visit = (url = '/') => { + window.localStorage.cypress = 'true' + cy.visit(url) +} + +// todo use ssl + +const compareRenderedFlatWorld = () => { + // wait for render + // cy.wait(6000) + // cy.get('body').toMatchImageSnapshot({ + // name: 'superflat-world', + // }) +} + +const testWorldLoad = () => { + cy.document().then({ timeout: 20_000 }, doc => { + return new Cypress.Promise(resolve => { + doc.addEventListener('cypress-world-ready', resolve) + }) + }).then(() => { + compareRenderedFlatWorld() + }) +} + +const setOptions = (options: Partial) => { + cy.window().then(win => { + Object.assign(win['options'], options) + }) +} + +it('Loads & renders singleplayer', () => { + cleanVisit() + setOptions({ + localServerOptions: { + generation: { + name: 'superflat', + // eslint-disable-next-line unicorn/numeric-separators-style + options: { seed: 250869072 } + }, + }, + renderDistance: 2 + }) + cy.get('#title-screen').find('[data-test-id="singleplayer-button"]', { includeShadowDom: true }).click() + testWorldLoad() +}) + +it('Joins to server', () => { + // visit('/?version=1.16.1') + window.localStorage.version = '' + visit() + // todo replace with data-test + cy.get('#title-screen').find('[data-test-id="connect-screen-button"]', { includeShadowDom: true }).click() + cy.get('input#serverip', { includeShadowDom: true }).clear().focus().type('localhost') + cy.get('[data-test-id="connect-to-server"]', { includeShadowDom: true }).click() + testWorldLoad() +}) + +it('Loads & renders zip world', () => { + cleanVisit() + cy.get('#title-screen').find('[data-test-id="select-file-folder"]', { includeShadowDom: true }).click({ shiftKey: true }) + cy.get('input[type="file"]').selectFile('cypress/superflat.zip', { force: true }) + testWorldLoad() +}) + +it.skip('Performance test', () => { + // select that world + // from -2 85 24 + // await bot.loadPlugin(pathfinder.pathfinder) + // bot.pathfinder.goto(new pathfinder.goals.GoalXZ(28, -28)) +}) diff --git a/cypress/minecraft-server.mjs b/cypress/minecraft-server.mjs new file mode 100644 index 000000000..972469c03 --- /dev/null +++ b/cypress/minecraft-server.mjs @@ -0,0 +1,26 @@ +//@ts-check +import mcServer from 'flying-squid' +import defaultOptions from 'flying-squid/config/default-settings.json' assert { type: 'json' } + +/** @type {import('minecraft-protocol').ServerOptions & Record} */ +const serverOptions = { + ...defaultOptions, + 'online-mode': false, + 'logging': false, + 'gameMode': 0, + 'difficulty': 0, + 'worldFolder': undefined, + // todo set sid, disable entities auto-spawn + 'generation': { + 'name': 'superflat', + options: {} + // 'options': { + // 'worldHeight': 80 + // } + }, + 'modpe': false, + 'view-distance': 4, + 'everybody-op': true, + 'version': '1.16.1' +} +const server = mcServer.createMCServer(serverOptions) diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 000000000..35dc29891 --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,26 @@ +//@ts-check +const { cypressEsbuildPreprocessor } = require('cypress-esbuild-preprocessor') +const { initPlugin } = require('cypress-plugin-snapshots/plugin') +const polyfill = require('esbuild-plugin-polyfill-node') + +module.exports = (on, config) => { + initPlugin(on, config) + on('file:preprocessor', cypressEsbuildPreprocessor({ + esbuildOptions: { + plugins: [ + polyfill.polyfillNode({ + polyfills: { + crypto: true, + }, + }) + ], + }, + })) + on('task', { + log (message) { + console.log(message) + return null + }, + }) + return config +} diff --git a/cypress/superflat.zip b/cypress/superflat.zip new file mode 100644 index 000000000..10fc9f464 Binary files /dev/null and b/cypress/superflat.zip differ diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 000000000..bef856f54 --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,2 @@ +import 'cypress-plugin-snapshots/commands' +Cypress.Commands.overwrite('log', (_subject, message) => cy.task('log', message)) diff --git a/esbuild.mjs b/esbuild.mjs new file mode 100644 index 000000000..5ca3a3d9b --- /dev/null +++ b/esbuild.mjs @@ -0,0 +1,123 @@ +//@ts-check +import * as esbuild from 'esbuild' +import fs from 'fs' +// import htmlPlugin from '@chialab/esbuild-plugin-html' +import server from './server.js' +import { clients, plugins } from './scripts/esbuildPlugins.mjs' +import { generateSW } from 'workbox-build' +import { getSwAdditionalEntries } from './scripts/build.js' + +//@ts-ignore +try { await import('./localSettings.mjs') } catch { } + +fs.writeFileSync('dist/index.html', fs.readFileSync('index.html', 'utf8').replace('', ''), 'utf8') + +const watch = process.argv.includes('--watch') || process.argv.includes('-w') +const prod = process.argv.includes('--prod') +const dev = !prod + +const banner = [ + 'window.global = globalThis;', + // report reload time + dev && 'if (sessionStorage.lastReload) { const [rebuild, reloadStart] = sessionStorage.lastReload.split(","); const now = Date.now(); console.log(`rebuild + reload:`, +rebuild, "+", now - reloadStart, "=", ((+rebuild + (now - reloadStart)) / 1000).toFixed(1) + "s");sessionStorage.lastReload = ""; }', + // auto-reload + dev && ';(() => new EventSource("/esbuild").onmessage = ({ data: _data }) => { if (!_data) return; const data = JSON.parse(_data); if (!data.update) return; sessionStorage.lastReload = `${data.update.time},${Date.now()}`; location.reload() })();' +].filter(Boolean) + +const buildingVersion = new Date().toISOString().split(':')[0] + +const ctx = await esbuild.context({ + bundle: true, + entryPoints: ['src/index.ts'], + target: ['es2020'], + jsx: 'automatic', + jsxDev: dev, + // logLevel: 'debug', + logLevel: 'info', + platform: 'browser', + sourcemap: true, + outdir: 'dist', + mainFields: [ + 'browser', 'module', 'main' + ], + keepNames: true, + banner: { + js: banner.join('\n'), + }, + alias: { + events: 'events', // make explicit + buffer: 'buffer', + 'fs': 'browserfs/dist/shims/fs.js', + http: 'http-browserify', + perf_hooks: './src/perf_hooks_replacement.js', + crypto: './src/crypto.js', + stream: 'stream-browserify', + net: 'net-browserify', + assert: 'assert', + dns: './src/dns.js' + }, + inject: [ + './src/shims.js' + ], + metafile: true, + plugins, + sourcesContent: !process.argv.includes('--no-sources'), + minify: process.argv.includes('--minify'), + define: { + 'process.env.NODE_ENV': JSON.stringify(dev ? 'development' : 'production'), + 'process.env.BUILD_VERSION': JSON.stringify(!dev ? buildingVersion : 'undefined'), + 'process.env.GITHUB_URL': + JSON.stringify(`https://github.com/${process.env.GITHUB_REPOSITORY || `${process.env.VERCEL_GIT_REPO_OWNER}/${process.env.VERCEL_GIT_REPO_SLUG}`}`) + }, + loader: { + // todo use external or resolve issues with duplicating + '.png': 'dataurl' + }, + write: false, + // todo would be better to enable? + // preserveSymlinks: true, +}) + +if (watch) { + await ctx.watch() + server.app.get('/esbuild', (req, res, next) => { + res.writeHead(200, { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + Connection: 'keep-alive', + }) + + // Send a comment to keep the connection alive + res.write(': ping\n\n') + + // Add the client response to the clients array + clients.push(res) + + // Handle any client disconnection logic + res.on('close', () => { + const index = clients.indexOf(res) + if (index !== -1) { + clients.splice(index, 1) + } + }) + }) +} else { + const result = await ctx.rebuild() + // console.log(await esbuild.analyzeMetafile(result.metafile)) + + if (prod) { + fs.writeFileSync('dist/version.txt', buildingVersion, 'utf-8') + + const { count, size, warnings } = await generateSW({ + // dontCacheBustURLsMatching: [new RegExp('...')], + globDirectory: 'dist', + skipWaiting: true, + clientsClaim: true, + additionalManifestEntries: getSwAdditionalEntries(), + globPatterns: [], + swDest: 'dist/service-worker.js', + }) + } + + await ctx.dispose() +} diff --git a/extra-textures/loading.psd b/extra-textures/loading.psd deleted file mode 100644 index 8ff105a99..000000000 Binary files a/extra-textures/loading.psd and /dev/null differ diff --git a/index.html b/index.html index b25c870a2..b1e108c95 100644 --- a/index.html +++ b/index.html @@ -1,30 +1,55 @@ + + Prismarine Web Client - + - + + + - + - +
- + + + +
+ diff --git a/index.js b/index.js deleted file mode 100644 index 027ce4dde..000000000 --- a/index.js +++ /dev/null @@ -1,470 +0,0 @@ -/* global THREE */ -require('./lib/chat') - -require('./lib/menus/components/button') -require('./lib/menus/components/edit_box') -require('./lib/menus/components/slider') -require('./lib/menus/components/hotbar') -require('./lib/menus/components/health_bar') -require('./lib/menus/components/food_bar') -require('./lib/menus/components/breath_bar') -require('./lib/menus/components/debug_overlay') -require('./lib/menus/components/playerlist_overlay') -require('./lib/menus/components/bossbars_overlay') -require('./lib/menus/hud') -require('./lib/menus/play_screen') -require('./lib/menus/pause_screen') -require('./lib/menus/loading_screen') -require('./lib/menus/keybinds_screen') -require('./lib/menus/options_screen') -require('./lib/menus/title_screen') - -const net = require('net') -const Cursor = require('./lib/cursor') - -// Workaround for process.versions.node not existing in the browser -process.versions.node = '14.0.0' - -const mineflayer = require('mineflayer') -const { WorldView, Viewer } = require('prismarine-viewer/viewer') -const pathfinder = require('mineflayer-pathfinder') -const { Vec3 } = require('vec3') -global.THREE = require('three') -const { initVR } = require('./lib/vr') - -if ('serviceWorker' in navigator) { - window.addEventListener('load', () => { - navigator.serviceWorker.register('/service-worker.js').then(registration => { - console.log('SW registered: ', registration) - }).catch(registrationError => { - console.log('SW registration failed: ', registrationError) - }) - }) -} - -const maxPitch = 0.5 * Math.PI -const minPitch = -0.5 * Math.PI - -// Create three.js context, add to page -const renderer = new THREE.WebGLRenderer() -renderer.setPixelRatio(window.devicePixelRatio || 1) -renderer.setSize(window.innerWidth, window.innerHeight) -document.body.appendChild(renderer.domElement) - -// Create viewer -const viewer = new Viewer(renderer) - -// Menu panorama background -function addPanoramaCubeMap () { - let time = 0 - viewer.camera = new THREE.PerspectiveCamera(85, window.innerWidth / window.innerHeight, 0.05, 1000) - viewer.camera.updateProjectionMatrix() - viewer.camera.position.set(0, 0, 0) - viewer.camera.rotation.set(0, 0, 0) - const panorGeo = new THREE.BoxGeometry(1000, 1000, 1000) - - const loader = new THREE.TextureLoader() - const panorMaterials = [ - new THREE.MeshBasicMaterial({ map: loader.load('extra-textures/background/panorama_1.png'), transparent: true, side: THREE.DoubleSide }), // WS - new THREE.MeshBasicMaterial({ map: loader.load('extra-textures/background/panorama_3.png'), transparent: true, side: THREE.DoubleSide }), // ES - new THREE.MeshBasicMaterial({ map: loader.load('extra-textures/background/panorama_4.png'), transparent: true, side: THREE.DoubleSide }), // Up - new THREE.MeshBasicMaterial({ map: loader.load('extra-textures/background/panorama_5.png'), transparent: true, side: THREE.DoubleSide }), // Down - new THREE.MeshBasicMaterial({ map: loader.load('extra-textures/background/panorama_0.png'), transparent: true, side: THREE.DoubleSide }), // NS - new THREE.MeshBasicMaterial({ map: loader.load('extra-textures/background/panorama_2.png'), transparent: true, side: THREE.DoubleSide }) // SS - ] - - const panoramaBox = new THREE.Mesh(panorGeo, panorMaterials) - - panoramaBox.onBeforeRender = () => { - time += 0.01 - panoramaBox.rotation.y = Math.PI + time * 0.01 - panoramaBox.rotation.z = Math.sin(-time * 0.001) * 0.001 - } - - const group = new THREE.Object3D() - group.add(panoramaBox) - - const Entity = require('prismarine-viewer/viewer/lib/entity/Entity') - for (let i = 0; i < 42; i++) { - const m = new Entity('1.16.4', 'squid').mesh - m.position.set(Math.random() * 30 - 15, Math.random() * 20 - 10, Math.random() * 10 - 17) - m.rotation.set(0, Math.PI + Math.random(), -Math.PI / 4, 'ZYX') - const v = Math.random() * 0.01 - m.children[0].onBeforeRender = () => { - m.rotation.y += v - m.rotation.z = Math.cos(panoramaBox.rotation.y * 3) * Math.PI / 4 - Math.PI / 2 - } - group.add(m) - } - - viewer.scene.add(group) - return group -} - -const panoramaCubeMap = addPanoramaCubeMap() - -function removePanorama () { - viewer.camera = new THREE.PerspectiveCamera(document.getElementById('options-screen').fov, window.innerWidth / window.innerHeight, 0.1, 1000) - viewer.camera.updateProjectionMatrix() - viewer.scene.remove(panoramaCubeMap) -} - -let animate = () => { - window.requestAnimationFrame(animate) - viewer.update() - renderer.render(viewer.scene, viewer.camera) -} -animate() - -window.addEventListener('resize', () => { - viewer.camera.aspect = window.innerWidth / window.innerHeight - viewer.camera.updateProjectionMatrix() - renderer.setSize(window.innerWidth, window.innerHeight) -}) - -const showEl = (str) => { document.getElementById(str).style = 'display:block' } -async function main () { - const menu = document.getElementById('play-screen') - - menu.addEventListener('connect', e => { - const options = e.detail - menu.style = 'display: none;' - showEl('loading-screen') - removePanorama() - connect(options) - }) -} - -async function connect (options) { - const loadingScreen = document.getElementById('loading-screen') - - const hud = document.getElementById('hud') - const chat = hud.shadowRoot.querySelector('#chat') - const debugMenu = hud.shadowRoot.querySelector('#debug-overlay') - const optionsScrn = document.getElementById('options-screen') - const keyBindScrn = document.getElementById('keybinds-screen') - const gameMenu = document.getElementById('pause-screen') - - const viewDistance = optionsScrn.renderDistance - const hostprompt = options.server - const proxyprompt = options.proxy - const username = options.username - const password = options.password - - let host, port, proxy, proxyport - if (!hostprompt.includes(':')) { - host = hostprompt - port = 25565 - } else { - [host, port] = hostprompt.split(':') - port = parseInt(port, 10) - } - - if (!proxyprompt.includes(':')) { - proxy = proxyprompt - proxyport = undefined - } else { - [proxy, proxyport] = proxyprompt.split(':') - proxyport = parseInt(proxyport, 10) - } - console.log(`connecting to ${host} ${port} with ${username}`) - - if (proxy) { - console.log(`using proxy ${proxy} ${proxyport}`) - net.setProxy({ hostname: proxy, port: proxyport }) - } - - loadingScreen.status = 'Logging in' - - const errorAbortController = new AbortController() - window.addEventListener('unhandledrejection', (e) => { - handleError(e.reason) - }, { - signal: errorAbortController - }) - window.addEventListener('error', (e) => { - handleError(e.message) - }, { - signal: errorAbortController.signal - }) - const bot = mineflayer.createBot({ - host, - port, - version: options.botVersion === '' ? false : options.botVersion, - username, - password, - viewDistance: 'tiny', - checkTimeoutInterval: 240 * 1000, - noPongTimeout: 240 * 1000, - closeTimeout: 240 * 1000 - }) - hud.preload(bot) - - const handleError = (err) => { - console.log('Encountered error!', err) - loadingScreen.status = `Error encountered. Error message: ${err}. Please reload the page` - loadingScreen.style = 'display: block;' - loadingScreen.hasError = true - } - bot.on('error', handleError) - - bot.on('kicked', (kickReason) => { - console.log('User was kicked!', kickReason) - loadingScreen.status = `The Minecraft server kicked you. Kick reason: ${kickReason}. Please reload the page to rejoin` - loadingScreen.style = 'display: block;' - loadingScreen.hasError = true - }) - - bot.on('end', (endReason) => { - console.log('disconnected for', endReason) - loadingScreen.status = `You have been disconnected from the server. End reason: ${endReason}. Please reload the page to rejoin` - loadingScreen.style = 'display: block;' - loadingScreen.hasError = true - }) - - bot.once('login', () => { - loadingScreen.status = 'Loading world' - }) - - bot.once('spawn', () => { - const mcData = require('minecraft-data')(bot.version) - - loadingScreen.status = 'Placing blocks (starting viewer)' - - console.log('bot spawned - starting viewer') - - const version = bot.version - - const center = bot.entity.position - - console.log(viewDistance) - const worldView = new WorldView(bot.world, viewDistance, center) - - gameMenu.init(renderer) - optionsScrn.isInsideWorld = true - optionsScrn.addEventListener('fov_changed', (e) => { - viewer.camera.fov = e.detail.fov - viewer.camera.updateProjectionMatrix() - }) - - viewer.setVersion(version) - - window.worldView = worldView - window.bot = bot - window.mcData = mcData - window.viewer = viewer - window.Vec3 = Vec3 - window.pathfinder = pathfinder - window.debugMenu = debugMenu - window.settings = optionsScrn - window.renderer = renderer - - initVR(bot, renderer, viewer) - - const cursor = new Cursor(viewer, renderer, bot) - animate = () => { - window.requestAnimationFrame(animate) - viewer.update() - cursor.update(bot) - debugMenu.cursorBlock = cursor.cursorBlock - renderer.render(viewer.scene, viewer.camera) - } - - // Link WorldView and Viewer - viewer.listen(worldView) - worldView.listenToBot(bot) - worldView.init(bot.entity.position) - - // Bot position callback - function botPosition () { - viewer.setFirstPersonCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch) - worldView.updatePosition(bot.entity.position) - } - bot.on('move', botPosition) - botPosition() - - loadingScreen.status = 'Setting callbacks' - - function moveCallback (e) { - bot.entity.pitch -= e.movementY * optionsScrn.mouseSensitivityY * 0.0001 - bot.entity.pitch = Math.max(minPitch, Math.min(maxPitch, bot.entity.pitch)) - bot.entity.yaw -= e.movementX * optionsScrn.mouseSensitivityX * 0.0001 - - viewer.setFirstPersonCamera(null, bot.entity.yaw, bot.entity.pitch) - } - - function changeCallback () { - if (document.pointerLockElement === renderer.domElement || - document.mozPointerLockElement === renderer.domElement || - document.webkitPointerLockElement === renderer.domElement) { - document.addEventListener('mousemove', moveCallback, false) - } else { - document.removeEventListener('mousemove', moveCallback, false) - } - } - - document.addEventListener('pointerlockchange', changeCallback, false) - document.addEventListener('mozpointerlockchange', changeCallback, false) - document.addEventListener('webkitpointerlockchange', changeCallback, false) - - let lastTouch - document.addEventListener('touchmove', (e) => { - window.scrollTo(0, 0) - e.preventDefault() - e.stopPropagation() - if (lastTouch !== undefined) { - moveCallback({ movementX: e.touches[0].pageX - lastTouch.pageX, movementY: e.touches[0].pageY - lastTouch.pageY }) - } - lastTouch = e.touches[0] - }, { passive: false }) - - document.addEventListener('touchend', (e) => { - lastTouch = undefined - }, { passive: false }) - - renderer.domElement.requestPointerLock = renderer.domElement.requestPointerLock || - renderer.domElement.mozRequestPointerLock || - renderer.domElement.webkitRequestPointerLock - document.addEventListener('mousedown', (e) => { - if (!chat.inChat && !gameMenu.inMenu) { - renderer.domElement.requestPointerLock() - } - }) - - document.addEventListener('contextmenu', (e) => e.preventDefault(), false) - - window.addEventListener('blur', (e) => { - bot.clearControlStates() - }, false) - - document.addEventListener('keydown', (e) => { - if (chat.inChat) return - if (gameMenu.inMenu) return - - keyBindScrn.keymaps.forEach(km => { - if (e.code === km.key) { - switch (km.defaultKey) { - case 'KeyQ': - if (bot.heldItem) bot.tossStack(bot.heldItem) - break - case 'ControlLeft': - bot.setControlState('sprint', true) - break - case 'ShiftLeft': - bot.setControlState('sneak', true) - break - case 'Space': - bot.setControlState('jump', true) - break - case 'KeyD': - bot.setControlState('left', true) - break - case 'KeyA': - bot.setControlState('right', true) - break - case 'KeyS': - bot.setControlState('back', true) - break - case 'KeyW': - bot.setControlState('forward', true) - break - } - } - }) - }, false) - - document.addEventListener('keyup', (e) => { - keyBindScrn.keymaps.forEach(km => { - if (e.code === km.key) { - switch (km.defaultKey) { - case 'ControlLeft': - bot.setControlState('sprint', false) - break - case 'ShiftLeft': - bot.setControlState('sneak', false) - break - case 'Space': - bot.setControlState('jump', false) - break - case 'KeyD': - bot.setControlState('left', false) - break - case 'KeyA': - bot.setControlState('right', false) - break - case 'KeyS': - bot.setControlState('back', false) - break - case 'KeyW': - bot.setControlState('forward', false) - break - } - } - }) - }, false) - - loadingScreen.status = 'Done!' - console.log(loadingScreen.status) // only do that because it's read in index.html and npm run fix complains. - - hud.init(renderer, bot, host) - hud.style.display = 'block' - - setTimeout(function () { - // game in playable state show errors in console instead - errorAbortController.abort() - if (loadingScreen.hasError) return - // remove loading screen, wait a second to make sure a frame has properly rendered - loadingScreen.style = 'display: none;' - }, 2500) - }) -} - -/** - * @param {URLSearchParams} params - */ -async function fromTheOutside (params, addr) { - const opts = {} - const dfltConfig = await (await window.fetch('config.json')).json() - - let server, port, proxy, proxyPort - - if (address.includes(':')) { - const s = address.split(':') - server = s[0] - port = Number(s[1]) || 25565 - } else { - server = address - port = Number(params.get('port')) || 25565 - } - - const proxyAddr = params.get('proxy') - if (proxyAddr) { - const s = proxyAddr.split(':') - proxy = s[0] - proxyPort = Number(s[1] ?? 'NaN') || 22 - } else { - proxy = dfltConfig.defaultProxy - proxyPort = !dfltConfig.defaultProxy && !dfltConfig.defaultProxyPort ? '' : dfltConfig.defaultProxyPort ?? 443 - } - - opts.server = `${server}:${port}` - opts.proxy = `${proxy}:${proxyPort}` - opts.username = params.get('username') ?? `pviewer${Math.floor(Math.random() * 1000)}` - opts.password = params.get('password') ?? '' - opts.botVersion = params.get('version') ?? false - - console.log(opts) - - showEl('loading-screen') - removePanorama() - connect(opts) -} - -const params = new URLSearchParams(window.location.search) -let address -if ((address = params.get('address'))) { - fromTheOutside(params, address) -} else { - showEl('title-screen') - main() -} diff --git a/lib/chat.js b/lib/chat.js deleted file mode 100644 index fb4bc562c..000000000 --- a/lib/chat.js +++ /dev/null @@ -1,361 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { isMobile } = require('./menus/components/common') - -const styles = { - black: 'color:#000000', - dark_blue: 'color:#0000AA', - dark_green: 'color:#00AA00', - dark_aqua: 'color:#00AAAA', - dark_red: 'color:#AA0000', - dark_purple: 'color:#AA00AA', - gold: 'color:#FFAA00', - gray: 'color:#AAAAAA', - dark_gray: 'color:#555555', - blue: 'color:#5555FF', - green: 'color:#55FF55', - aqua: 'color:#55FFFF', - red: 'color:#FF5555', - light_purple: 'color:#FF55FF', - yellow: 'color:#FFFF55', - white: 'color:#FFFFFF', - bold: 'font-weight:900', - strikethrough: 'text-decoration:line-through', - underlined: 'text-decoration:underline', - italic: 'font-style:italic' -} - -function colorShadow (hex, dim = 0.25) { - const color = parseInt(hex.replace('#', ''), 16) - - const r = (color >> 16 & 0xFF) * dim | 0 - const g = (color >> 8 & 0xFF) * dim | 0 - const b = (color & 0xFF) * dim | 0 - - const f = (c) => ('00' + c.toString(16)).substr(-2) - return `#${f(r)}${f(g)}${f(b)}` -} - -class ChatBox extends LitElement { - static get styles () { - return css` - .chat-wrapper { - position: fixed; - z-index: 10; - } - - .chat-display-wrapper { - bottom: 40px; - padding: 4px; - padding-left: 0; - max-height: var(--chatHeight); - width: var(--chatWidth); - transform-origin: bottom left; - transform: scale(var(--chatScale)); - } - - .chat-input-wrapper { - bottom: 1px; - width: calc(100% - 3px); - position: absolute; - left: 1px; - box-sizing: border-box; - overflow: hidden; - background-color: rgba(0, 0, 0, 0); - } - - .input-mobile { - top: 1px; - } - - .display-mobile { - top: 40px; - } - - .chat { - overflow: hidden; - color: white; - font-size: 10px; - margin: 0px; - line-height: 100%; - text-shadow: 1px 1px 0px #3f3f3f; - font-family: mojangles, minecraft, monospace; - width: 100%; - max-height: var(--chatHeight); - } - - input[type=text], #chatinput { - background-color: rgba(0, 0, 0, 0.5); - border: 1px solid rgba(0, 0, 0, 0); - display: none; - outline: none; - } - - #chatinput:focus { - border-color: white; - } - - .chat-message { - display: block; - padding-left: 4px; - background-color: rgba(0, 0, 0, 0.5); - } - - .chat-message-fadeout { - opacity: 1; - transition: all 3s; - } - - .chat-message-fade { - opacity: 0; - } - - .chat-message-faded { - transition: none !important; - } - - .chat-message-chat-opened { - opacity: 1 !important; - transition: none !important; - } - ` - } - - render () { - return html` -
-
-
  • Welcome to prismarine-web-client! Chat appears here.
  • -
    -
    -
    -
    - -
    -
    - ` - } - - constructor () { - super() - this.chatHistoryPos = 0 - this.chatHistory = [] - } - - enableChat (isCommand) { - const chat = this.shadowRoot.querySelector('#chat') - const chatInput = this.shadowRoot.querySelector('#chatinput') - - this.shadowRoot.querySelector('#chat-wrapper2').classList.toggle('input-mobile', isMobile()) - this.shadowRoot.querySelector('#chat-wrapper').classList.toggle('display-mobile', isMobile()) - - // Set inChat value - this.inChat = true - // Exit the pointer lock - document.exitPointerLock() - // Show chat input - chatInput.style.display = 'block' - // Show extended chat history - chat.style.maxHeight = 'var(--chatHeight)' - chat.scrollTop = chat.scrollHeight // Stay bottom of the list - if (isCommand) { // handle commands - chatInput.value = '/' - } - // Focus element - chatInput.focus() - this.chatHistoryPos = this.chatHistory.length - document.querySelector('#hud').shadowRoot.querySelector('#chat').shadowRoot.querySelectorAll('.chat-message').forEach(e => e.classList.add('chat-message-chat-opened')) - } - - /** - * @param {globalThis.THREE.Renderer} client - * @param {import('minecraft-protocol').Client} renderer - */ - init (client, renderer) { - this.inChat = false - const chat = this.shadowRoot.querySelector('#chat') - const gameMenu = document.getElementById('pause-screen') - const chatInput = this.shadowRoot.querySelector('#chatinput') - - renderer.domElement.requestPointerLock = renderer.domElement.requestPointerLock || - renderer.domElement.mozRequestPointerLock || - renderer.domElement.webkitRequestPointerLock - - // Show chat - chat.style.display = 'block' - - // Esc event - Doesnt work with onkeypress?! - keypressed is deprecated uk - document.addEventListener('keydown', e => { - if (gameMenu.inMenu) return - if (!this.inChat) return - e = e || window.event - if (e.code === 'Escape') { - disableChat() - } else if (e.code === 'ArrowUp') { - if (this.chatHistoryPos === 0) return - chatInput.value = this.chatHistory[--this.chatHistoryPos] !== undefined ? this.chatHistory[this.chatHistoryPos] : '' - setTimeout(() => { chatInput.setSelectionRange(-1, -1) }, 0) - } else if (e.code === 'ArrowDown') { - if (this.chatHistoryPos === this.chatHistory.length) return - chatInput.value = this.chatHistory[++this.chatHistoryPos] !== undefined ? this.chatHistory[this.chatHistoryPos] : '' - setTimeout(() => { chatInput.setSelectionRange(-1, -1) }, 0) - } - }) - - const keyBindScrn = document.getElementById('keybinds-screen') - - // Chat events - document.addEventListener('keypress', e => { - if (gameMenu.inMenu) return - e = e || window.event - if (this.inChat === false) { - keyBindScrn.keymaps.forEach(km => { - if (e.code === km.key) { - switch (km.defaultKey) { - case 'KeyT': - setTimeout(() => this.enableChat(false), 0) - break - case 'Slash': - setTimeout(() => this.enableChat(true), 0) - break - } - } - }) - - return false - } - - if (!this.inChat) return - - e.stopPropagation() - - if (e.code === 'Enter') { - this.chatHistory.push(chatInput.value) - client.write('chat', { message: chatInput.value }) - disableChat() - } - }) - - const disableChat = () => { - this.inChat = false - hideChat() - renderer.domElement.requestPointerLock() - } - - const hideChat = () => { - // Clear chat input - chatInput.value = '' - // Unfocus it - chatInput.blur() - // Hide it - chatInput.style.display = 'none' - // Hide extended chat history - chat.style.maxHeight = 'var(--chatHeight)' - chat.scrollTop = chat.scrollHeight // Stay bottom of the list - document.querySelector('#hud').shadowRoot.querySelector('#chat').shadowRoot.querySelectorAll('.chat-message').forEach(e => e.classList.remove('chat-message-chat-opened')) - } - - client.on('chat', (packet) => { - // Reading of chat message - const fullmessage = JSON.parse(packet.message.toString()) - const msglist = [] - - const colorF = (color) => { - return color.trim().startsWith('#') ? `color:${color}` : styles[color] ?? undefined - } - - const readMsg = (msglist, msg) => { - const styles = { - color: msg.color, - bold: !!msg.bold, - italic: !!msg.italic, - underlined: !!msg.underlined, - strikethrough: !!msg.strikethrough, - obfuscated: !!msg.obfuscated - } - - if (msg.text) { - msglist.push({ - text: msg.text, - ...styles - }) - } - - if (msg.translate) { - const tText = window.mcData.language[msg.translate] ?? msg.translate - - if (msg.with) { - const splited = tText.split(/%s|%\d+\$s/g) - - let i = 0 - splited.forEach((spl, j, arr) => { - msglist.push({ text: spl, ...styles }) - - if (j + 1 < arr.length) { - if (msg.with[i]) { - if (typeof msg.with[i] === 'string') { - readMsg(msglist, { - ...styles, - text: msg.with[i] - }) - } else { - readMsg(msglist, { - ...styles, - ...msg.with[i] - }) - } - } - i++ - } - }) - } else { - msglist.push({ - text: tText, - ...styles - }) - } - } - - if (msg.extra) { - msg.extra.forEach(ex => { - readMsg(msglist, { ...styles, ...ex }) - }) - } - } - - readMsg(msglist, fullmessage) - - const li = document.createElement('li') - msglist.forEach(msg => { - const span = document.createElement('span') - span.appendChild(document.createTextNode(msg.text)) - span.setAttribute( - 'style', - `${msg.color ? colorF(msg.color.toLowerCase()) + `; text-shadow: 1px 1px 0px ${colorShadow(colorF(msg.color.toLowerCase()).replace('color:', ''))}` : styles.white}; ${ - msg.bold ? styles.bold + ';' : '' - }${msg.italic ? styles.italic + ';' : ''}${ - msg.strikethrough ? styles.strikethrough + ';' : '' - }${msg.underlined ? styles.underlined + ';' : ''}` - ) - li.appendChild(span) - }) - chat.appendChild(li) - chat.scrollTop = chat.scrollHeight // Stay bottom of the list - // fading - li.classList.add('chat-message') - if (this.inChat) { - li.classList.add('chat-message-chat-opened') - } - setTimeout(() => { - li.classList.add('chat-message-fadeout') - li.classList.add('chat-message-fade') - setTimeout(() => { - li.classList.add('chat-message-faded') - }, 3000) - }, 5000) - }) - - hideChat() - } -} - -window.customElements.define('chat-box', ChatBox) diff --git a/lib/cursor.js b/lib/cursor.js deleted file mode 100644 index c5db2e5a4..000000000 --- a/lib/cursor.js +++ /dev/null @@ -1,143 +0,0 @@ -/* global THREE performance */ - -const { Vec3 } = require('vec3') - -function getViewDirection (pitch, yaw) { - const csPitch = Math.cos(pitch) - const snPitch = Math.sin(pitch) - const csYaw = Math.cos(yaw) - const snYaw = Math.sin(yaw) - return new Vec3(-snYaw * csPitch, snPitch, -csYaw * csPitch) -} - -class Cursor { - constructor (viewer, renderer, bot) { - // Init state - this.buttons = [false, false, false] - this.lastButtons = [false, false, false] - this.breakStartTime = 0 - this.cursorBlock = null - - // Setup graphics - const blockGeometry = new THREE.BoxGeometry(1.001, 1.001, 1.001) - this.cursorMesh = new THREE.LineSegments(new THREE.EdgesGeometry(blockGeometry), new THREE.LineBasicMaterial({ color: 0 })) - this.cursorMesh.visible = false - viewer.scene.add(this.cursorMesh) - - const loader = new THREE.TextureLoader() - this.breakTextures = [] - for (let i = 0; i < 10; i++) { - const texture = loader.load('textures/' + viewer.version + '/blocks/destroy_stage_' + i + '.png') - texture.magFilter = THREE.NearestFilter - texture.minFilter = THREE.NearestFilter - this.breakTextures.push(texture) - } - const breakMaterial = new THREE.MeshBasicMaterial({ - transparent: true, - blending: THREE.MultiplyBlending - }) - this.blockBreakMesh = new THREE.Mesh(blockGeometry, breakMaterial) - this.blockBreakMesh.visible = false - this.blockBreakMesh.renderOrder = 999 - viewer.scene.add(this.blockBreakMesh) - - // Setup events - document.addEventListener('mouseup', (e) => { - this.buttons[e.button] = false - }) - - document.addEventListener('mousedown', (e) => { - if (document.pointerLockElement !== renderer.domElement) return - this.buttons[e.button] = true - - const entity = bot.nearestEntity((e) => { - if (e.position.distanceTo(bot.entity.position) <= (bot.player.gamemode === 1 ? 5 : 3)) { - const dir = getViewDirection(bot.entity.pitch, bot.entity.yaw) - const { width, height } = e - const { x: eX, y: eY, z: eZ } = e.position - const { x: bX, y: bY, z: bZ } = bot.entity.position - const box = new THREE.Box3( - new THREE.Vector3(eX - width / 2, eY, eZ - width / 2), - new THREE.Vector3(eX + width / 2, eY + height, eZ + width / 2) - ) - - const r = new THREE.Raycaster( - new THREE.Vector3(bX, bY + 1.52, bZ), - new THREE.Vector3(dir.x, dir.y, dir.z) - ) - const int = r.ray.intersectBox(box, new THREE.Vector3(eX, eY, eZ)) - return int !== null - } - - return false - }) - - if (entity) { - bot.attack(entity) - } - }) - this.lastPlaced = 4 // ticks since last placed - bot.on('physicsTick', () => { if (this.lastPlaced < 4) this.lastPlaced++ }) - } - - update (bot) { - let cursorBlock = bot.blockAtCursor(6) - if (!bot.canDigBlock(cursorBlock)) cursorBlock = null - - let cursorChanged = !cursorBlock !== !this.cursorBlock - if (cursorBlock && this.cursorBlock) { - cursorChanged = !cursorBlock.position.equals(this.cursorBlock.position) - } - - // Place - if (cursorBlock && this.buttons[2] && (!this.lastButtons[2] || cursorChanged) && this.lastPlaced >= 4) { - const vecArray = [new Vec3(0, -1, 0), new Vec3(0, 1, 0), new Vec3(0, 0, -1), new Vec3(0, 0, 1), new Vec3(-1, 0, 0), new Vec3(1, 0, 0)] - const delta = cursorBlock.intersect.minus(cursorBlock.position) - bot._placeBlockWithOptions(cursorBlock, vecArray[cursorBlock.face], { delta, forceLook: 'ignore' }) - bot.lastPlaced = 0 - } - - // Start break - if (cursorBlock && this.buttons[0] && (!this.lastButtons[0] || cursorChanged)) { - this.breakStartTime = performance.now() - try { - bot.dig(cursorBlock, 'ignore') - } catch (e) {} // we don't care if its aborted - } - - // Stop break - if (!this.buttons[0] && this.lastButtons[0]) { - try { - bot.stopDigging() // this shouldnt throw anything... - } catch (e) {} // to be reworked in mineflayer, then remove the try here - } - - // Show break animation - if (cursorBlock && this.buttons[0]) { - const elapsed = performance.now() - this.breakStartTime - const time = bot.digTime(cursorBlock) - const state = Math.floor((elapsed / time) * 10) - this.blockBreakMesh.position.set(cursorBlock.position.x + 0.5, cursorBlock.position.y + 0.5, cursorBlock.position.z + 0.5) - this.blockBreakMesh.material.map = this.breakTextures[state] - this.blockBreakMesh.visible = true - } else { - this.blockBreakMesh.visible = false - } - - // Show cursor - if (!cursorBlock) { - this.cursorMesh.visible = false - } else { - this.cursorMesh.visible = true - this.cursorMesh.position.set(cursorBlock.position.x + 0.5, cursorBlock.position.y + 0.5, cursorBlock.position.z + 0.5) - } - - // Update state - this.cursorBlock = cursorBlock - this.lastButtons[0] = this.buttons[0] - this.lastButtons[1] = this.buttons[1] - this.lastButtons[2] = this.buttons[2] - } -} - -module.exports = Cursor diff --git a/lib/menus/components/button.js b/lib/menus/components/button.js deleted file mode 100644 index 12b0b8ec9..000000000 --- a/lib/menus/components/button.js +++ /dev/null @@ -1,140 +0,0 @@ -const { LitElement, html, css } = require('lit') - -const audioContext = new window.AudioContext() -const sounds = {} - -async function playSound (path) { - let volume = 1 - const options = document.getElementById('options-screen') - if (options) { - volume = options.sound / 100 - } - - let soundBuffer = sounds[path] - - if (!soundBuffer) { - const res = await window.fetch(path) - const data = await res.arrayBuffer() - - soundBuffer = await audioContext.decodeAudioData(data) - sounds[path] = soundBuffer - } - - const gainNode = audioContext.createGain() - const source = audioContext.createBufferSource() - source.buffer = soundBuffer - source.connect(gainNode) - gainNode.connect(audioContext.destination) - gainNode.gain.value = volume - source.start(0) -} - -class Button extends LitElement { - static get styles () { - return css` - .button { - --txrV: 66px; - position: relative; - width: 200px; - height: 20px; - font-family: minecraft, mojangles, monospace; - font-size: 10px; - color: white; - text-shadow: 1px 1px #222; - border: none; - z-index: 1; - outline: none; - } - - .button:hover, - .button:focus-visible { - --txrV: 86px; - } - - .button:disabled { - --txrV: 46px; - color: #A0A0A0; - text-shadow: 1px 1px #111; - } - - .button::after { - content: ''; - display: block; - position: absolute; - top: 0; - left: 0; - width: 50%; - height: 20px; - background: url('textures/1.17.1/gui/widgets.png'); - background-size: 256px; - background-position-y: calc(var(--txrV) * -1); - z-index: -1; - } - - .button::before { - content: ''; - display: block; - position: absolute; - top: 0; - left: 50%; - width: 50%; - height: 20px; - background: url('textures/1.17.1/gui/widgets.png'); - background-size: 256px; - background-position-x: calc(-200px + 100%); - background-position-y: calc(var(--txrV) * -1); - z-index: -1; - } - ` - } - - static get properties () { - return { - label: { - type: String, - attribute: 'pmui-label' - }, - width: { - type: String, - attribute: 'pmui-width' - }, - disabled: { - type: Boolean, - attribute: 'pmui-disabled' - }, - onPress: { - type: Function, - attribute: 'pmui-click' - } - } - } - - constructor () { - super() - this.label = '' - this.disabled = false - this.width = '200px' - this.onPress = () => {} - } - - render () { - return html` - ` - } - - onBtnClick () { - playSound('click_stereo.ogg') - this.dispatchEvent(new window.CustomEvent('pmui-click')) - } -} - -window.customElements.define('pmui-button', Button) -const _playSound = playSound -export { _playSound as playSound } diff --git a/lib/menus/loading_screen.js b/lib/menus/loading_screen.js deleted file mode 100644 index 845111b65..000000000 --- a/lib/menus/loading_screen.js +++ /dev/null @@ -1,67 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { commonCss } = require('./components/common') - -class LoadingScreen extends LitElement { - static get styles () { - return css` - ${commonCss} - .title { - top: 30px; - } - - #cancel-btn { - position: absolute; - top: calc(20% + 50px); - left: 50%; - transform: translate(-50%); - } - ` - } - - static get properties () { - return { - status: { type: String }, - loadingText: { type: String }, - hasError: { type: Number } - } - } - - constructor () { - super() - this.hasError = false - this.status = 'Waiting for JS load' - } - - firstUpdated () { - this.statusRunner() - } - - async statusRunner () { - const array = ['.', '..', '...', ''] - const timer = ms => new Promise((resolve) => setTimeout(resolve, ms)) - - const load = async () => { - for (let i = 0; true; i = ((i + 1) % array.length)) { - this.loadingText = this.status + array[i] - await timer(500) - } - } - - load() - } - - render () { - return html` -
    - -

    ${this.hasError ? this.status : this.loadingText}

    - - ${this.hasError - ? html` window.location.reload()}>` - : '' - } - ` - } -} - -window.customElements.define('pmui-loadingscreen', LoadingScreen) diff --git a/lib/menus/options_screen.js b/lib/menus/options_screen.js deleted file mode 100644 index a6664d247..000000000 --- a/lib/menus/options_screen.js +++ /dev/null @@ -1,158 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { commonCss, displayScreen, isMobile } = require('./components/common') - -class OptionsScreen extends LitElement { - static get styles () { - return css` - ${commonCss} - .title { - top: 4px; - } - - main { - display: flex; - flex-direction: column; - position: absolute; - top: calc(100% / 6 - 6px); - left: 50%; - width: 310px; - gap: 4px 0; - place-items: center; - place-content: center; - transform: translate(-50%); - } - - .wrapper { - display: flex; - flex-direction: row; - width: 100%; - gap: 0 10px; - height: 20px; - } - ` - } - - static get properties () { - return { - isInsideWorld: { type: Boolean }, - mouseSensitivityX: { type: Number }, - mouseSensitivityY: { type: Number }, - chatWidth: { type: Number }, - chatHeight: { type: Number }, - chatScale: { type: Number }, - sound: { type: Number }, - renderDistance: { type: Number }, - fov: { type: Number }, - guiScale: { type: Number } - } - } - - constructor () { - super() - this.isInsideWorld = false - - const getValue = (item, defaultValue, convertFn) => window.localStorage.getItem(item) ? convertFn(window.localStorage.getItem(item)) : defaultValue - - this.mouseSensitivityX = getValue('mouseSensX', 50, (v) => Math.floor(Number(v) * 10000)) - this.mouseSensitivityY = getValue('mouseSensY', 50, (v) => Math.floor(Number(v) * 10000)) - this.chatWidth = getValue('chatWidth', 320, (v) => Number(v)) - this.chatHeight = getValue('chatHeight', 180, (v) => Number(v)) - this.chatScale = getValue('chatScale', 100, (v) => Number(v)) - this.sound = getValue('sound', 50, (v) => Number(v)) - this.renderDistance = getValue('renderDistance', 6, (v) => Number(v)) - this.fov = getValue('fov', 75, (v) => Number(v)) - this.guiScale = getValue('guiScale', 3, (v) => Number(v)) - this.forceMobileControls = getValue('forceMobileControls', false, (v) => v === 'true') - - document.documentElement.style.setProperty('--chatScale', `${this.chatScale / 100}`) - document.documentElement.style.setProperty('--chatWidth', `${this.chatWidth}px`) - document.documentElement.style.setProperty('--chatHeight', `${this.chatHeight}px`) - document.documentElement.style.setProperty('--guiScale', `${this.guiScale}`) - } - - render () { - return html` -
    - -

    Options

    - -
    -
    - { - this.mouseSensitivityX = Number(e.target.value) - window.localStorage.setItem('mouseSensX', this.mouseSensitivityX * 0.0001) - }}> - { - this.mouseSensitivityY = Number(e.target.value) - window.localStorage.setItem('mouseSensY', this.mouseSensitivityY * 0.0001) - }}> -
    -
    - { - this.chatWidth = Number(e.target.value) - window.localStorage.setItem('chatWidth', `${this.chatWidth}`) - document.documentElement.style.setProperty('--chatWidth', `${this.chatWidth}px`) - }}> - { - this.chatHeight = Number(e.target.value) - window.localStorage.setItem('chatHeight', `${this.chatHeight}`) - document.documentElement.style.setProperty('--chatHeight', `${this.chatHeight}px`) - }}> -
    -
    - { - this.chatScale = Number(e.target.value) - window.localStorage.setItem('chatScale', `${this.chatScale}`) - document.documentElement.style.setProperty('--chatScale', `${this.chatScale / 100}`) - }}> - { - this.sound = Number(e.target.value) - window.localStorage.setItem('sound', `${this.sound}`) - }}> -
    -
    - displayScreen(this, document.getElementById('keybinds-screen'))}> - { - this.guiScale = Number(e.target.value) - window.localStorage.setItem('guiScale', `${this.guiScale}`) - document.documentElement.style.setProperty('--guiScale', `${this.guiScale}`) - }}> -
    - ${this.isInsideWorld -? '' -: html` -
    - { - this.renderDistance = Number(e.target.value) - window.localStorage.setItem('renderDistance', `${this.renderDistance}`) - }}> - { - this.fov = Number(e.target.value) - window.localStorage.setItem('fov', `${this.fov}`) - - this.dispatchEvent(new window.CustomEvent('fov_changed', { fov: this.fov })) - }}> -
    - `} - -
    - { - this.forceMobileControls = !this.forceMobileControls - window.localStorage.setItem('forceMobileControls', `${this.forceMobileControls}`) - if (this.forceMobileControls || isMobile()) { - document.getElementById('hud').showMobileControls(true) - } else { - document.getElementById('hud').showMobileControls(false) - } - this.requestUpdate() - } - }> -
    - - displayScreen(this, document.getElementById(this.isInsideWorld ? 'pause-screen' : 'title-screen'))}> -
    - ` - } -} - -window.customElements.define('pmui-optionsscreen', OptionsScreen) diff --git a/lib/menus/pause_screen.js b/lib/menus/pause_screen.js deleted file mode 100644 index 07ad849ab..000000000 --- a/lib/menus/pause_screen.js +++ /dev/null @@ -1,110 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { openURL, displayScreen } = require('./components/common') - -class PauseScreen extends LitElement { - static get styles () { - return css` - .bg { - position: absolute; - top: 0; - left: 0; - background: rgba(0, 0, 0, 0.75); - width: 100%; - height: 100%; - } - - .title { - position: absolute; - top: 40px; - left: 50%; - transform: translate(-50%); - font-size: 10px; - color: white; - text-shadow: 1px 1px #222; - } - - main { - display: flex; - flex-direction: column; - gap: 4px 0; - position: absolute; - left: 50%; - width: 204px; - top: calc(25% + 48px - 16px); - transform: translate(-50%); - } - - .row { - display: flex; - flex-direction: row; - justify-content: space-between; - width: 100%; - } - ` - } - - constructor () { - super() - this.inMenu = false - } - - init (renderer) { - const chat = document.getElementById('hud').shadowRoot.querySelector('#chat') - const self = this - - document.addEventListener('keydown', e => { - if (chat.inChat) return - e = e || window.event - if (e.keyCode === 27 || e.key === 'Escape' || e.key === 'Esc') { - if (self.inMenu) { - self.disableGameMenu(renderer) - } else { - self.enableGameMenu() - } - } - }) - } - - render () { - return html` -
    - -

    Game Menu

    - -
    - -
    - openURL('https://github.com/PrismarineJS/prismarine-web-client')}> - openURL('https://discord.gg/4Ucm684Fq3')}> -
    - displayScreen(this, document.getElementById('options-screen'))}> - window.location.reload()}> -
    - ` - } - - disableGameMenu (renderer = false) { - this.inMenu = false - this.style.display = 'none' - if (renderer) { - renderer.domElement.requestPointerLock() - } - } - - enableGameMenu () { - this.inMenu = true - document.exitPointerLock() - this.style.display = 'block' - this.focus() - } - - onReturnPress (renderer = false) { - this.inMenu = false - this.style.display = 'none' - if (renderer) { - renderer.domElement.requestPointerLock() - } - } -} - -window.customElements.define('pmui-pausescreen', PauseScreen) diff --git a/lib/menus/title_screen.js b/lib/menus/title_screen.js deleted file mode 100644 index 611d5dce4..000000000 --- a/lib/menus/title_screen.js +++ /dev/null @@ -1,124 +0,0 @@ -const { openURL, displayScreen } = require('./components/common') -const { LitElement, html, css } = require('lit') - -class TitleScreen extends LitElement { - static get styles () { - return css` - .minecraft { - position: absolute; - top: 30px; - left: calc(50% - 137px); - } - - .minecraft .minec { - display: block; - position: absolute; - top: 0; - left: 0; - background-image: url('textures/1.17.1/gui/title/minecraft.png'); - background-size: 256px; - width: 155px; - height: 44px; - } - - .minecraft .raft { - display: block; - position: absolute; - top: 0; - left: 155px; - background-image: url('textures/1.17.1/gui/title/minecraft.png'); - background-size: 256px; - width: 155px; - height: 44px; - background-position-y: -45px; - } - - .minecraft .edition { - display: block; - position: absolute; - top: 37px; - left: calc(88px + 5px); - background-image: url('extra-textures/edition.png'); - background-size: 128px; - width: 88px; - height: 14px; - } - - .splash { - position: absolute; - top: 32px; - left: 227px; - color: #ff0; - transform: translate(-50%, -50%) rotateZ(-20deg) scale(1); - width: max-content; - text-shadow: 1px 1px #220; - font-size: 10px; - animation: splashAnim 400ms infinite alternate linear; - } - - @keyframes splashAnim { - to { - transform: translate(-50%, -50%) rotateZ(-20deg) scale(1.07); - } - } - - .menu { - display: flex; - flex-direction: column; - gap: 4px 0; - position: absolute; - top: calc(25% + 48px); - left: 50%; - width: 200px; - transform: translate(-50%); - } - - .menu-row { - display: flex; - flex-direction: row; - gap: 0 4px; - width: 100%; - } - - .bottom-info { - display: flex; - flex-direction: row; - justify-content: space-between; - position: absolute; - bottom: -1px; - left: 1px; - width: calc(100% - 2px); - color: white; - text-shadow: 1px 1px #222; - font-size: 10px; - } - ` - } - - render () { - return html` -
    -
    -
    -
    - Prismarine is a beautiful block -
    - - - -
    - Prismarine Web Client - A Minecraft client in the browser! -
    - ` - } -} - -window.customElements.define('pmui-titlescreen', TitleScreen) diff --git a/package.json b/package.json index 3628f9a40..c5dea3be7 100644 --- a/package.json +++ b/package.json @@ -1,79 +1,102 @@ { "name": "prismarine-web-client", - "version": "1.5.0", + "version": "0.0.0-dev", "description": "A minecraft client running in a browser", - "main": "index.js", "scripts": { - "postinstall": "node scripts/patchPackages.js", - "build": "webpack --config webpack.prod.js", - "build-dev": "webpack --config webpack.dev.js", - "start": "node --max-old-space-size=8192 server.js 8080 dev", + "start": "node scripts/build.js copyFilesDev && node scripts/prepareData.mjs && node esbuild.mjs --watch", + "start-watch-script": "nodemon -w esbuild.mjs esbuild.mjs", + "build": "node scripts/build.js copyFiles && node scripts/prepareData.mjs -f && node esbuild.mjs --minify --prod", + "check-build": "tsc && pnpm build", + "test:cypress": "cypress run", + "test:e2e": "start-test http-get://localhost:8080 test:cypress", "prod-start": "node server.js", - "build-dev-start": "npm run build-dev && npm run prod-start", - "build-start": "npm run build && npm run prod-start", - "prepublishOnly": "npm run build", - "lint": "standard", - "fix": "standard --fix", - "test": "npm run lint && mocha" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/PrismarineJS/prismarine-web-client.git" + "postinstall": "node scripts/gen-texturepack-files.mjs", + "lint": "eslint \"{src,cypress}/**/*.{ts,js,jsx,tsx}\"" }, "keywords": [ "prismarine", "web", "client" ], + "bin": "./server.js", "author": "PrismarineJS", "license": "MIT", - "bin": { - "prismarine-web-client": "./server.js" - }, - "bugs": { - "url": "https://github.com/PrismarineJS/prismarine-web-client/issues" - }, - "homepage": "https://github.com/PrismarineJS/prismarine-web-client#readme", "dependencies": { + "@dimaka/interface": "0.0.3-alpha.0", + "@types/react": "^18.2.20", + "@types/react-dom": "^18.2.7", + "@types/wicg-file-system-access": "^2020.9.6", + "@zardoy/react-util": "^0.2.0", + "@zardoy/utils": "^0.0.11", + "browserfs": "github:zardoy/browserfs#build", "compression": "^1.7.4", - "express": "^4.17.1", - "ismobilejs": "^1.1.1", - "lit": "^2.0.2", - "net-browserify": "PrismarineJS/net-browserify", - "querystring": "^0.2.1", - "url": "^0.11.0" + "cypress-plugin-snapshots": "^1.4.4", + "debug": "^4.3.4", + "eruda": "^3.0.1", + "esbuild": "^0.19.3", + "esbuild-plugin-polyfill-node": "^0.3.0", + "express": "^4.18.2", + "flying-squid": "github:zardoy/space-squid#everything", + "fs-extra": "^11.1.1", + "iconify-icon": "^1.0.8", + "jszip": "^3.10.1", + "lit": "^2.8.0", + "lodash-es": "^4.17.21", + "minecraft-data": "^3.0.0", + "net-browserify": "github:zardoy/prismarinejs-net-browserify", + "peerjs": "^1.5.0", + "pretty-bytes": "^6.1.1", + "qrcode.react": "^3.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "stats-gl": "^1.0.5", + "stats.js": "^0.17.0", + "valtio": "^1.11.1", + "minecraft-assets": "^1.9.1", + "workbox-build": "^7.0.0" }, "devDependencies": { + "@types/lodash-es": "^4.17.9", + "@types/stats.js": "^0.17.1", + "@types/three": "0.128.0", "assert": "^2.0.0", "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", - "clean-webpack-plugin": "^4.0.0", "constants-browserify": "^1.0.0", - "copy-webpack-plugin": "^11.0.0", + "contro-max": "^0.1.1", "crypto-browserify": "^3.12.0", - "events": "^3.2.0", - "html-webpack-plugin": "^5.3.1", + "cypress": "^9.5.4", + "cypress-esbuild-preprocessor": "^1.0.2", + "eslint": "^8.50.0", + "eslint-config-zardoy": "^0.2.17", + "events": "^3.3.0", + "filesize": "^10.0.12", "http-browserify": "^1.7.0", - "http-server": "^14.1.0", + "http-server": "^14.1.1", "https-browserify": "^1.0.0", - "lodash-webpack-plugin": "^0.11.6", - "memfs": "^3.2.0", - "mineflayer": "^4.1.0", - "mineflayer-pathfinder": "^2.0.0", - "mocha": "^10.0.0", + "minecraft-inventory-gui": "github:zardoy/minecraft-inventory-gui#next", + "mineflayer": "github:zardoy/mineflayer#custom", + "mineflayer-pathfinder": "^2.4.4", + "npm-run-all": "^4.1.5", "os-browserify": "^0.3.0", "path-browserify": "^1.0.1", - "prismarine-viewer": "^1.22.0", - "process": "PrismarineJS/node-process", - "standard": "^17.0.0", + "prismarine-viewer": "github:zardoy/prismarine-viewer#world-improvements", + "process": "github:PrismarineJS/node-process", + "rimraf": "^5.0.1", "stream-browserify": "^3.0.0", - "three": "0.127.0", + "three": "0.128.0", "timers-browserify": "^2.0.12", - "webpack": "^5.11.0", - "webpack-cli": "^5.0.0", - "webpack-dev-middleware": "^6.0.0", - "webpack-dev-server": "^4.0.0", - "webpack-merge": "^5.7.3", - "workbox-webpack-plugin": "^6.1.2" + "typescript": "^5.2.2", + "use-typed-event-listener": "^4.0.2", + "yaml": "^2.3.2" + }, + "pnpm": { + "overrides": { + "prismarine-block": "github:zardoy/prismarine-block#next-era", + "prismarine-world": "github:zardoy/prismarine-world#next-era", + "minecraft-data": "3.45.0", + "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", + "minecraft-protocol": "github:zardoy/minecraft-protocol#custom-client-extra" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..30351b627 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,12387 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + prismarine-block: github:zardoy/prismarine-block#next-era + prismarine-world: github:zardoy/prismarine-world#next-era + minecraft-data: 3.45.0 + prismarine-provider-anvil: github:zardoy/prismarine-provider-anvil#everything + minecraft-protocol: github:zardoy/minecraft-protocol#custom-client-extra + +importers: + + .: + dependencies: + '@dimaka/interface': + specifier: 0.0.3-alpha.0 + version: 0.0.3-alpha.0(@babel/core@7.22.11)(@popperjs/core@2.11.8)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@types/react': + specifier: ^18.2.20 + version: 18.2.20 + '@types/react-dom': + specifier: ^18.2.7 + version: 18.2.7 + '@types/wicg-file-system-access': + specifier: ^2020.9.6 + version: 2020.9.6 + '@zardoy/react-util': + specifier: ^0.2.0 + version: 0.2.0(react-dom@18.2.0)(react@18.2.0) + '@zardoy/utils': + specifier: ^0.0.11 + version: 0.0.11 + browserfs: + specifier: github:zardoy/browserfs#build + version: github.com/zardoy/browserfs/0ff5df5c4e67f54b5f032b87dc650e8b78626bc7 + compression: + specifier: ^1.7.4 + version: 1.7.4 + cypress-plugin-snapshots: + specifier: ^1.4.4 + version: 1.4.4(cypress@9.5.4) + debug: + specifier: ^4.3.4 + version: 4.3.4(supports-color@8.1.1) + eruda: + specifier: ^3.0.1 + version: 3.0.1 + esbuild: + specifier: ^0.19.3 + version: 0.19.3 + esbuild-plugin-polyfill-node: + specifier: ^0.3.0 + version: 0.3.0(esbuild@0.19.3) + express: + specifier: ^4.18.2 + version: 4.18.2 + flying-squid: + specifier: github:zardoy/space-squid#everything + version: github.com/zardoy/space-squid/eec886b7a881eb40dd8efc6d48fa52e638e07693 + fs-extra: + specifier: ^11.1.1 + version: 11.1.1 + iconify-icon: + specifier: ^1.0.8 + version: 1.0.8 + jszip: + specifier: ^3.10.1 + version: 3.10.1 + lit: + specifier: ^2.8.0 + version: 2.8.0 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + minecraft-assets: + specifier: ^1.9.1 + version: 1.9.1 + minecraft-data: + specifier: 3.45.0 + version: 3.45.0 + net-browserify: + specifier: github:zardoy/prismarinejs-net-browserify + version: github.com/zardoy/prismarinejs-net-browserify/51262fe139a6a4856ffd4a6dc7b9145c3d6d8039 + peerjs: + specifier: ^1.5.0 + version: 1.5.0 + pretty-bytes: + specifier: ^6.1.1 + version: 6.1.1 + qrcode.react: + specifier: ^3.1.0 + version: 3.1.0(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + stats-gl: + specifier: ^1.0.5 + version: 1.0.5 + stats.js: + specifier: ^0.17.0 + version: 0.17.0 + valtio: + specifier: ^1.11.1 + version: 1.11.1(react@18.2.0) + workbox-build: + specifier: ^7.0.0 + version: 7.0.0 + devDependencies: + '@types/lodash-es': + specifier: ^4.17.9 + version: 4.17.9 + '@types/stats.js': + specifier: ^0.17.1 + version: 0.17.1 + '@types/three': + specifier: 0.128.0 + version: 0.128.0 + assert: + specifier: ^2.0.0 + version: 2.0.0 + browserify-zlib: + specifier: ^0.2.0 + version: 0.2.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + constants-browserify: + specifier: ^1.0.0 + version: 1.0.0 + contro-max: + specifier: ^0.1.1 + version: 0.1.1(typescript@5.2.2) + crypto-browserify: + specifier: ^3.12.0 + version: 3.12.0 + cypress: + specifier: ^9.5.4 + version: 9.5.4 + cypress-esbuild-preprocessor: + specifier: ^1.0.2 + version: 1.0.2 + eslint: + specifier: ^8.50.0 + version: 8.50.0 + eslint-config-zardoy: + specifier: ^0.2.17 + version: 0.2.17(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.50.0)(typescript@5.2.2) + events: + specifier: ^3.3.0 + version: 3.3.0 + filesize: + specifier: ^10.0.12 + version: 10.0.12 + http-browserify: + specifier: ^1.7.0 + version: 1.7.0 + http-server: + specifier: ^14.1.1 + version: 14.1.1(debug@4.3.4) + https-browserify: + specifier: ^1.0.0 + version: 1.0.0 + minecraft-inventory-gui: + specifier: github:zardoy/minecraft-inventory-gui#next + version: github.com/zardoy/minecraft-inventory-gui/c1331c91fb39bd562dc48eeb33321240d4870edd(@types/react@18.2.20)(react@18.2.0) + mineflayer: + specifier: github:zardoy/mineflayer#custom + version: github.com/zardoy/mineflayer/08a79e7affa1ce82e1ac7aad177745665ed54572 + mineflayer-pathfinder: + specifier: ^2.4.4 + version: 2.4.4 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + os-browserify: + specifier: ^0.3.0 + version: 0.3.0 + path-browserify: + specifier: ^1.0.1 + version: 1.0.1 + prismarine-viewer: + specifier: github:zardoy/prismarine-viewer#world-improvements + version: github.com/zardoy/prismarine-viewer/cfb88434c576b17cb270e04d2024f2ca24d6543e + process: + specifier: github:PrismarineJS/node-process + version: github.com/PrismarineJS/node-process/380d0b4f4c86f1b65b216c311bf00431f314e88e + rimraf: + specifier: ^5.0.1 + version: 5.0.1 + stream-browserify: + specifier: ^3.0.0 + version: 3.0.0 + three: + specifier: 0.128.0 + version: 0.128.0 + timers-browserify: + specifier: ^2.0.12 + version: 2.0.12 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + use-typed-event-listener: + specifier: ^4.0.2 + version: 4.0.2(react@18.2.0)(typescript@5.2.2) + yaml: + specifier: ^2.3.2 + version: 2.3.2 + + prismarine-viewer: + dependencies: + '@tweenjs/tween.js': + specifier: ^20.0.3 + version: 20.0.3 + compression: + specifier: ^1.7.4 + version: 1.7.4 + express: + specifier: ^4.17.1 + version: 4.18.2 + minecraft-data: + specifier: 3.45.0 + version: 3.45.0 + prismarine-block: + specifier: github:zardoy/prismarine-block#next-era + version: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-chunk: + specifier: ^1.22.0 + version: 1.35.0(minecraft-data@3.45.0) + prismarine-world: + specifier: github:zardoy/prismarine-world#next-era + version: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + socket.io: + specifier: ^4.0.0 + version: 4.7.2 + socket.io-client: + specifier: ^4.0.0 + version: 4.7.2 + three: + specifier: 0.128.0 + version: 0.128.0 + three.meshline: + specifier: ^1.3.0 + version: 1.4.0 + vec3: + specifier: ^0.1.7 + version: 0.1.8 + devDependencies: + assert: + specifier: ^2.0.0 + version: 2.0.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + canvas: + specifier: ^2.11.2 + version: 2.11.2 + filesize: + specifier: ^10.0.12 + version: 10.0.12 + fs-extra: + specifier: ^11.0.0 + version: 11.1.1 + jest: + specifier: ^27.0.4 + version: 27.0.4(canvas@2.11.2) + jest-puppeteer: + specifier: ^6.0.0 + version: 6.0.0(debug@4.3.4)(puppeteer@16.0.0) + minecraft-assets: + specifier: ^1.9.0 + version: 1.9.0 + minecraft-wrap: + specifier: ^1.3.0 + version: 1.3.0 + minecrafthawkeye: + specifier: ^1.2.5 + version: 1.2.5(prismarine-registry@1.7.0) + mineflayer: + specifier: ^4.0.0 + version: 4.0.0(prismarine-registry@1.7.0) + mineflayer-pathfinder: + specifier: ^2.0.0 + version: 2.4.4 + prismarine-schematic: + specifier: ^1.2.0 + version: 1.2.0 + prismarine-viewer: + specifier: file:./ + version: file:prismarine-viewer + process: + specifier: ^0.11.10 + version: 0.11.10 + puppeteer: + specifier: ^16.0.0 + version: 16.0.0 + standard: + specifier: ^17.0.0 + version: 17.0.0(@typescript-eslint/parser@6.7.3) + webpack: + specifier: ^5.10.2 + version: 5.88.2(esbuild@0.19.3)(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.1 + version: 5.1.4(webpack@5.88.2) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: false + + /@azure/msal-common@13.3.0: + resolution: {integrity: sha512-/VFWTicjcJbrGp3yQP7A24xU95NiDMe23vxIU1U6qdRPFsprMDNUohMudclnd+WSHE4/McqkZs/nUU3sAKkVjg==} + engines: {node: '>=0.8.0'} + + /@azure/msal-node@1.18.3: + resolution: {integrity: sha512-lI1OsxNbS/gxRD4548Wyj22Dk8kS7eGMwD9GlBZvQmFV8FJUXoXySL1BiNzDsHUE96/DS/DHmA+F73p1Dkcktg==} + engines: {node: 10 || 12 || 14 || 16 || 18} + dependencies: + '@azure/msal-common': 13.3.0 + jsonwebtoken: 9.0.2 + uuid: 8.3.2 + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.13 + chalk: 2.4.2 + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.22.11: + resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helpers': 7.22.11 + '@babel/parser': 7.22.13 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: false + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10: + resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: false + + /@babel/helper-compilation-targets@7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: false + + /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: false + + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.11): + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.11 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + + /@babel/helper-member-expression-to-functions@7.22.5: + resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: false + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-wrap-function': 7.22.10 + dev: false + + /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: false + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.22.10: + resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.22.5 + '@babel/template': 7.22.5 + '@babel/types': 7.22.11 + dev: false + + /@babel/helpers@7.22.11: + resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.22.13: + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.22.13: + resolution: {integrity: sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.11 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.22.12(@babel/core@7.22.11) + dev: false + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + dev: false + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.11): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.11): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.11): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-async-generator-functions@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.11): + resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: false + + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.5 + dev: false + + /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-commonjs@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + dev: false + + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-object-rest-spread@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.11 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-optional-chaining@7.22.12(@babel/core@7.22.11): + resolution: {integrity: sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) + dev: false + + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: false + + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: false + + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/preset-env@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.11 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.11) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-async-generator-functions': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-block-scoping': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.11) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-destructuring': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-modules-commonjs': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-object-rest-spread': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-optional-chaining': 7.22.12(@babel/core@7.22.11) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.11) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.11) + '@babel/types': 7.22.11 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.11) + babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.11) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.11) + core-js-compat: 3.32.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.11): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.22.11 + esutils: 2.0.3 + dev: false + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: false + + /@babel/runtime@7.22.11: + resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + + /@babel/traverse@7.22.11: + resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.22.11: + resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@cbor-extract/cbor-extract-darwin-arm64@2.1.1: + resolution: {integrity: sha512-blVBy5MXz6m36Vx0DfLd7PChOQKEs8lK2bD1WJn/vVgG4FXZiZmZb2GECHFvVPA5T7OnODd9xZiL3nMCv6QUhA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-darwin-x64@2.1.1: + resolution: {integrity: sha512-h6KFOzqk8jXTvkOftyRIWGrd7sKQzQv2jVdTL9nKSf3D2drCvQB/LHUxAOpPXo3pv2clDtKs3xnHalpEh3rDsw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-linux-arm64@2.1.1: + resolution: {integrity: sha512-SxAaRcYf8S0QHaMc7gvRSiTSr7nUYMqbUdErBEu+HYA4Q6UNydx1VwFE68hGcp1qvxcy9yT5U7gA+a5XikfwSQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-linux-arm@2.1.1: + resolution: {integrity: sha512-ds0uikdcIGUjPyraV4oJqyVE5gl/qYBpa/Wnh6l6xLE2lj/hwnjT2XcZCChdXwW/YFZ1LUHs6waoYN8PmK0nKQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-linux-x64@2.1.1: + resolution: {integrity: sha512-GVK+8fNIE9lJQHAlhOROYiI0Yd4bAZ4u++C2ZjlkS3YmO6hi+FUxe6Dqm+OKWTcMpL/l71N6CQAmaRcb4zyJuA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@cbor-extract/cbor-extract-win32-x64@2.1.1: + resolution: {integrity: sha512-2Niq1C41dCRIDeD8LddiH+mxGlO7HJ612Ll3D/E73ZWBmycued+8ghTr/Ho3CMOWPUEr08XtyBMVXAjqF+TcKw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + optional: true + + /@cypress/request@2.88.12: + resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==} + engines: {node: '>= 6'} + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + http-signature: 1.3.6 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + performance-now: 2.1.0 + qs: 6.10.4 + safe-buffer: 5.2.1 + tough-cookie: 4.1.3 + tunnel-agent: 0.6.0 + uuid: 8.3.2 + + /@cypress/xvfb@1.2.4(supports-color@8.1.1): + resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} + dependencies: + debug: 3.2.7(supports-color@8.1.1) + lodash.once: 4.1.1 + transitivePeerDependencies: + - supports-color + + /@dimaka/interface@0.0.3-alpha.0(@babel/core@7.22.11)(@popperjs/core@2.11.8)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BzRUaLk+jhC1uvcix4SXRGhw7k39pldlvwtRT0NGFsuQt1uMV9vOhGMzm3rLorVXQ7vAmqcZk3Hy8oYlXKQoDw==} + peerDependencies: + react: ^17.0.2 + dependencies: + '@emotion/css': 11.5.0(@babel/core@7.22.11) + '@juggle/resize-observer': 3.3.1 + animejs: 3.2.1 + clsx: 1.1.1 + react: 18.2.0 + react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.2.0)(react@18.2.0) + react-portal: 4.2.1(react-dom@18.2.0)(react@18.2.0) + react-use: 17.3.1(react-dom@18.2.0)(react@18.2.0) + react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) + valtio: 1.11.2(@types/react@18.2.20)(react@18.2.0) + zustand: 3.6.5(react@18.2.0) + transitivePeerDependencies: + - '@babel/core' + - '@popperjs/core' + - '@types/react' + - react-dom + dev: false + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.5 + '@babel/runtime': 7.22.11 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/css@11.5.0(@babel/core@7.22.11): + resolution: {integrity: sha512-mqjz/3aqR9rp40M+pvwdKYWxlQK4Nj3cnNjo3Tx6SM14dSsEn7q/4W2/I7PlgG+mb27iITHugXuBIHH/QwUBVQ==} + peerDependencies: + '@babel/core': ^7.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/core': 7.22.11 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.2 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + dev: false + + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/serialize@1.1.2: + resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.2 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild/android-arm64@0.19.3: + resolution: {integrity: sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.19.3: + resolution: {integrity: sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.19.3: + resolution: {integrity: sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.19.3: + resolution: {integrity: sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.19.3: + resolution: {integrity: sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.19.3: + resolution: {integrity: sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.19.3: + resolution: {integrity: sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.19.3: + resolution: {integrity: sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.19.3: + resolution: {integrity: sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.19.3: + resolution: {integrity: sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.19.3: + resolution: {integrity: sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.19.3: + resolution: {integrity: sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.19.3: + resolution: {integrity: sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.19.3: + resolution: {integrity: sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.19.3: + resolution: {integrity: sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.19.3: + resolution: {integrity: sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.19.3: + resolution: {integrity: sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.19.3: + resolution: {integrity: sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.19.3: + resolution: {integrity: sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.19.3: + resolution: {integrity: sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.19.3: + resolution: {integrity: sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.19.3: + resolution: {integrity: sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.48.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.50.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.8.0: + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.48.0: + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@eslint/js@8.50.0: + resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@hapi/hoek@9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + dev: true + + /@hapi/topo@5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.5.7 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: true + + /@jest/core@27.5.1(canvas@2.11.2): + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.5.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(canvas@2.11.2) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1(canvas@2.11.2) + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/environment@27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.6.2 + jest-mock: 27.5.1 + dev: true + + /@jest/fake-timers@27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 20.6.2 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /@jest/globals@27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: true + + /@jest/reporters@27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.5.7 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/source-map@27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/test-result@27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/transform@27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.22.11 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 20.5.7 + '@types/yargs': 16.0.5 + chalk: 4.1.2 + dev: true + + /@jimp/bmp@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + bmp-js: 0.1.0 + core-js: 3.32.1 + dev: false + + /@jimp/core@0.10.3: + resolution: {integrity: sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==} + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/utils': 0.10.3 + any-base: 1.1.0 + buffer: 5.7.1 + core-js: 3.32.1 + exif-parser: 0.1.12 + file-type: 9.0.0 + load-bmfont: 1.4.1 + mkdirp: 0.5.6 + phin: 2.9.3 + pixelmatch: 4.0.2 + tinycolor2: 1.6.0 + dev: false + + /@jimp/custom@0.10.3: + resolution: {integrity: sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==} + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/core': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/gif@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + omggif: 1.0.10 + dev: false + + /@jimp/jpeg@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + jpeg-js: 0.3.7 + dev: false + + /@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-circle@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + tinycolor2: 1.6.0 + dev: false + + /@jimp/plugin-contain@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-resize@0.10.3)(@jimp/plugin-scale@0.10.3): + resolution: {integrity: sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-cover@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3)(@jimp/plugin-scale@0.10.3): + resolution: {integrity: sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-displace@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-dither@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-fisheye@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-flip@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-rotate@0.10.3): + resolution: {integrity: sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-rotate': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-gaussian@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-invert@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-mask@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-normalize@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-print@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3): + resolution: {integrity: sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3) + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + load-bmfont: 1.4.1 + dev: false + + /@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3): + resolution: {integrity: sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3): + resolution: {integrity: sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-shadow@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blur@0.10.3)(@jimp/plugin-resize@0.10.3): + resolution: {integrity: sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blur': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-blur': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugin-threshold@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-color@0.10.3)(@jimp/plugin-resize@0.10.3): + resolution: {integrity: sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-color': '>=0.8.0' + '@jimp/plugin-resize': '>=0.8.0' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-color': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + dev: false + + /@jimp/plugins@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-blur': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-circle': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-color': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-contain': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-resize@0.10.3)(@jimp/plugin-scale@0.10.3) + '@jimp/plugin-cover': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3)(@jimp/plugin-scale@0.10.3) + '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-displace': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-dither': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-fisheye': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-flip': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-rotate@0.10.3) + '@jimp/plugin-gaussian': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-invert': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-mask': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-normalize': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-print': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3) + '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) + '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/plugin-shadow': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blur@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/plugin-threshold': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-color@0.10.3)(@jimp/plugin-resize@0.10.3) + core-js: 3.32.1 + timm: 1.7.1 + dev: false + + /@jimp/png@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/utils': 0.10.3 + core-js: 3.32.1 + pngjs: 3.4.0 + dev: false + + /@jimp/tiff@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + core-js: 3.32.1 + utif: 2.0.1 + dev: false + + /@jimp/types@0.10.3(@jimp/custom@0.10.3): + resolution: {integrity: sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/bmp': 0.10.3(@jimp/custom@0.10.3) + '@jimp/custom': 0.10.3 + '@jimp/gif': 0.10.3(@jimp/custom@0.10.3) + '@jimp/jpeg': 0.10.3(@jimp/custom@0.10.3) + '@jimp/png': 0.10.3(@jimp/custom@0.10.3) + '@jimp/tiff': 0.10.3(@jimp/custom@0.10.3) + core-js: 3.32.1 + timm: 1.7.1 + dev: false + + /@jimp/utils@0.10.3: + resolution: {integrity: sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==} + dependencies: + '@babel/runtime': 7.22.11 + core-js: 3.32.1 + regenerator-runtime: 0.13.11 + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@jspm/core@2.0.1: + resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} + dev: false + + /@juggle/resize-observer@3.3.1: + resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==} + dev: false + + /@lit-labs/ssr-dom-shim@1.1.1: + resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} + dev: false + + /@lit/reactive-element@1.6.3: + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.1 + dev: false + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.1.15 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@msgpack/msgpack@2.8.0: + resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} + engines: {node: '>= 10'} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(rollup@2.79.1): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-imports': 7.22.5 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + dev: false + + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.4 + rollup: 2.79.1 + dev: false + + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + magic-string: 0.25.9 + rollup: 2.79.1 + dev: false + + /@rollup/pluginutils@3.1.0(rollup@2.79.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: false + + /@rushstack/eslint-patch@1.4.0: + resolution: {integrity: sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==} + dev: true + + /@sideway/address@4.1.4: + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true + + /@sideway/formula@3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + dev: true + + /@sideway/pinpoint@2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + dev: true + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@socket.io/component-emitter@3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.9 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.8 + dev: false + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@tweenjs/tween.js@20.0.3: + resolution: {integrity: sha512-SYUe1UgY5HM05EB4+0B4arq2IPjvyzKXoklXKxSYrc2IFxGm1cBrqg5XbiB5uwbs0xY5j+rj986NAJMM0KZaUw==} + + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + dependencies: + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + dev: true + + /@types/babel__traverse@7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + /@types/cors@2.8.13: + resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + dependencies: + '@types/node': 20.6.4 + + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.44.2 + '@types/estree': 1.0.1 + dev: true + + /@types/eslint@8.44.2: + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: false + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/graceful-fs@4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 20.6.2 + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/js-cookie@2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: false + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/lodash-es@4.17.9: + resolution: {integrity: sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==} + dependencies: + '@types/lodash': 4.14.199 + dev: true + + /@types/lodash@4.14.199: + resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==} + dev: true + + /@types/node@14.18.56: + resolution: {integrity: sha512-+k+57NVS9opgrEn5l9c0gvD1r6C+PtyhVE4BTnMMRwiEA8ZO8uFcs6Yy2sXIy0eC95ZurBtRSvhZiHXBysbl6w==} + + /@types/node@20.5.7: + resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} + requiresBuild: true + + /@types/node@20.6.2: + resolution: {integrity: sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==} + dev: true + + /@types/node@20.6.4: + resolution: {integrity: sha512-nU6d9MPY0NBUMiE/nXd2IIoC4OLvsLpwAjheoAeuzgvDZA1Cb10QYg+91AF6zQiKWRN5i1m07x6sMe0niBznoQ==} + + /@types/normalize-package-data@2.4.2: + resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==} + dev: true + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + + /@types/react-dom@18.2.7: + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + dependencies: + '@types/react': 18.2.20 + dev: false + + /@types/react@18.2.20: + resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + + /@types/readable-stream@4.0.2: + resolution: {integrity: sha512-hhzOsMEISZ+mX1l+01F0duYt9wHEbCGmjARed0PcQoVS5zAdu7u5YbWYuNGhw09M1MgGr3kfsto+ut/MnAdKqA==} + dependencies: + '@types/node': 20.6.4 + safe-buffer: 5.1.2 + + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 20.6.4 + dev: false + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + + /@types/semver@7.5.3: + resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + dev: true + + /@types/sinonjs__fake-timers@8.1.1: + resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} + + /@types/sizzle@2.3.3: + resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==} + + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/stats.js@0.17.1: + resolution: {integrity: sha512-OgfYE1x2w1jRUXzzKABX+kOdwz2y9PE0uSwnZabkWfJTWOzm7Pvfm4JI2xqRE0q2nwUe2jZLWcrcnhd9lQU63w==} + dev: true + + /@types/three@0.128.0: + resolution: {integrity: sha512-Jwq5XYUkzAcPTo34hlGAQGUyAI0b2F3aCCFWG/v7ZhJBEG5HGcusMSr70GhDlT8Gs0f02QnSPZ2RCA1MrCOa/w==} + dev: true + + /@types/trusted-types@2.0.3: + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + dev: false + + /@types/wicg-file-system-access@2020.9.6: + resolution: {integrity: sha512-6hogE75Hl2Ov/jgp8ZhDaGmIF/q3J07GtXf8nCJCwKTHq7971po5+DId7grft09zG7plBwpF6ZU0yx9Du4/e1A==} + dev: false + + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs@16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@types/yauzl@2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + requiresBuild: true + dependencies: + '@types/node': 20.5.7 + optional: true + + /@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.8.0 + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.1.0 + '@typescript-eslint/type-utils': 6.1.0(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.1.0(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.1.0 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.50.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.7.3 + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.3 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.50.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.1.0: + resolution: {integrity: sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.1.0 + '@typescript-eslint/visitor-keys': 6.1.0 + dev: true + + /@typescript-eslint/scope-manager@6.7.3: + resolution: {integrity: sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/visitor-keys': 6.7.3 + dev: true + + /@typescript-eslint/type-utils@6.1.0(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.1.0(eslint@8.50.0)(typescript@5.2.2) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.50.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.1.0: + resolution: {integrity: sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/types@6.7.3: + resolution: {integrity: sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.1.0(typescript@5.2.2): + resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.1.0 + '@typescript-eslint/visitor-keys': 6.1.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@6.7.3(typescript@5.2.2): + resolution: {integrity: sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/visitor-keys': 6.7.3 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.1.0(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.3 + '@typescript-eslint/scope-manager': 6.1.0 + '@typescript-eslint/types': 6.1.0 + '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.2.2) + eslint: 8.50.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.1.0: + resolution: {integrity: sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.1.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@6.7.3: + resolution: {integrity: sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.7.3 + eslint-visitor-keys: 3.4.3 + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.88.2(esbuild@0.19.3)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) + dev: true + + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.88.2(esbuild@0.19.3)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) + dev: true + + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + dependencies: + webpack: 5.88.2(esbuild@0.19.3)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) + dev: true + + /@xboxreplay/errors@0.1.0: + resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} + + /@xboxreplay/xboxlive-auth@3.3.3(debug@4.3.4): + resolution: {integrity: sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==} + dependencies: + '@xboxreplay/errors': 0.1.0 + axios: 0.21.4(debug@4.3.4) + transitivePeerDependencies: + - debug + + /@xobotyi/scrollbar-width@1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + dev: false + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /@zardoy/react-util@0.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-glABtx54mh4XSaK6BNALWE3mlshPjcPwPsRj/GnOXEA7WJY/6n43iJoukbaYF3758mGZRU5Fq6gklyFjBg0yHQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + classnames: 2.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@zardoy/utils@0.0.11: + resolution: {integrity: sha512-d6xBnSFCOa98HcL52xSBflJKjKpxfRhtr1eVexy89YujeCHSQhUMmSz9h07xyrulfW60k9tSeYH5reuqoh4l4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + escape-string-regexp: 4.0.0 + lodash.compact: 3.0.1 + rambda: 6.9.0 + type-fest: 2.19.0 + dev: false + + /Base64@0.2.1: + resolution: {integrity: sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==} + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /aes-js@3.1.2: + resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + + /after@0.8.2: + resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /animejs@3.2.1: + resolution: {integrity: sha512-sWno3ugFryK5nhiDm/2BKeFCpZv7vzerWUcUPyAZLDhMek3+S/p418ldZJbJXo5ZUOpfm2kP2XRO4NJcULMy9A==} + dev: false + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-base@1.1.0: + resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.2: + resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + + /arraybuffer.slice@0.0.7: + resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==} + dev: false + + /asap@1.0.0: + resolution: {integrity: sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==} + dev: false + + /asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: true + + /asn1@0.2.3: + resolution: {integrity: sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==} + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + /assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + dependencies: + es6-object-assign: 1.1.0 + is-nan: 1.3.2 + object-is: 1.1.5 + util: 0.12.5 + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + /async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + dev: false + + /async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + /aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + + /axios@0.21.4(debug@4.3.4): + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.3(debug@4.3.4) + transitivePeerDependencies: + - debug + + /axios@0.25.0(debug@4.3.4): + resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} + dependencies: + follow-redirects: 1.15.2(debug@4.3.4) + transitivePeerDependencies: + - debug + dev: true + + /babel-jest@27.5.1(@babel/core@7.22.11): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.22.11 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.22.11) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.11 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.22.11 + cosmiconfig: 7.1.0 + resolve: 1.22.4 + dev: false + + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.11): + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.11 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) + core-js-compat: 3.32.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.11): + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) + transitivePeerDependencies: + - supports-color + dev: false + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.11): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11) + dev: true + + /babel-preset-jest@27.5.1(@babel/core@7.22.11): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) + dev: true + + /backo2@1.0.2: + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-arraybuffer@0.1.4: + resolution: {integrity: sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /blob-util@2.0.2: + resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} + + /blob@0.0.5: + resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==} + dev: false + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + /bmp-js@0.1.0: + resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} + dev: false + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: true + + /browserify-sign@4.2.1: + resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001524 + electron-to-chromium: 1.4.504 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + /buffer-equal@0.0.1: + resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} + engines: {node: '>=0.4.0'} + dev: false + + /buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: true + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + /cachedir@2.4.0: + resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} + engines: {node: '>=6'} + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001524: + resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} + + /canvas@2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + nan: 2.17.0 + simple-get: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + dev: false + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + /cbor-extract@2.1.1: + resolution: {integrity: sha512-1UX977+L+zOJHsp0mWFG13GLwO6ucKgSmSW6JTl8B9GUvACvHeIVpFqhU92299Z6PfD09aTXDell5p+lp1rUFA==} + hasBin: true + requiresBuild: true + dependencies: + node-gyp-build-optional-packages: 5.0.3 + optionalDependencies: + '@cbor-extract/cbor-extract-darwin-arm64': 2.1.1 + '@cbor-extract/cbor-extract-darwin-x64': 2.1.1 + '@cbor-extract/cbor-extract-linux-arm': 2.1.1 + '@cbor-extract/cbor-extract-linux-arm64': 2.1.1 + '@cbor-extract/cbor-extract-linux-x64': 2.1.1 + '@cbor-extract/cbor-extract-win32-x64': 2.1.1 + dev: false + optional: true + + /cbor-x@1.5.4: + resolution: {integrity: sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==} + optionalDependencies: + cbor-extract: 2.1.1 + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /check-more-types@2.24.0: + resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} + engines: {node: '>= 0.8.0'} + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + dev: false + + /clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /clone-deep@0.2.4: + resolution: {integrity: sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 0.1.5 + is-plain-object: 2.0.4 + kind-of: 3.2.2 + lazy-cache: 1.0.4 + shallow-clone: 0.1.2 + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clsx@1.1.1: + resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} + engines: {node: '>=6'} + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + /colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + /component-bind@1.0.0: + resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} + dev: false + + /component-emitter@1.2.1: + resolution: {integrity: sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==} + dev: false + + /component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: false + + /component-inherit@0.0.3: + resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==} + dev: false + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case: 2.0.2 + dev: false + + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /contro-max@0.1.1(typescript@5.2.2): + resolution: {integrity: sha512-H+bzJWxiuxu98Tz8iGs1occMkRlr9fOzfOKeflVU8bD5teAEiJu8zjVnNSbweLQIR+Vhdynygv18N69t97rVAw==} + dependencies: + emittery: 0.10.2 + lodash-es: 4.17.21 + optionalDependencies: + react: 17.0.2 + use-typed-event-listener: 4.0.2(react@17.0.2)(typescript@5.2.2) + transitivePeerDependencies: + - typescript + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /core-js-compat@3.32.1: + resolution: {integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==} + dependencies: + browserslist: 4.21.10 + dev: false + + /core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + requiresBuild: true + dev: false + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + /corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + dev: true + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /cross-fetch@3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: true + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.1 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: false + + /css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + dependencies: + hyphenate-style-name: 1.0.4 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /cwd@0.10.0: + resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} + engines: {node: '>=0.8'} + dependencies: + find-pkg: 0.1.2 + fs-exists-sync: 0.1.0 + dev: true + + /cypress-esbuild-preprocessor@1.0.2: + resolution: {integrity: sha512-JsFnm6fBQt/OEzstknJ1KLMTuUERUaG0ZB9fk0KdNUlZqxaVEoQ9/pFvKmqRfzUe2y00cWD++ptccQA4tNAAlQ==} + dev: true + + /cypress-plugin-snapshots@1.4.4(cypress@9.5.4): + resolution: {integrity: sha512-rijq3RTEZNtxQA4KCUwjXinmE1Ww+z6cQW0B14iodFM/HlX5LN16XT/2QS3X1nUXRKt0QdTrAC5MQfMUrjBkSQ==} + engines: {node: '>=8.2.1'} + peerDependencies: + cypress: ^4.5.0 + dependencies: + cypress: 9.5.4 + diff2html: 2.12.2 + fs-extra: 7.0.1 + image-size: 0.7.5 + jimp: 0.10.3 + js-base64: 2.6.4 + lodash: 4.17.21 + pixelmatch: 4.0.2 + pngjs: 3.4.0 + prettier: 1.19.1 + rimraf: 2.7.1 + sanitize-filename: 1.6.3 + socket.io: 2.5.0 + socket.io-client: 2.5.0 + source-map-support: 0.5.21 + unidiff: 1.0.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /cypress@9.5.4: + resolution: {integrity: sha512-6AyJAD8phe7IMvOL4oBsI9puRNOWxZjl8z1lgixJMcgJ85JJmyKeP6uqNA0dI1z14lmJ7Qklf2MOgP/xdAqJ/Q==} + engines: {node: '>=12.0.0'} + hasBin: true + requiresBuild: true + dependencies: + '@cypress/request': 2.88.12 + '@cypress/xvfb': 1.2.4(supports-color@8.1.1) + '@types/node': 14.18.56 + '@types/sinonjs__fake-timers': 8.1.1 + '@types/sizzle': 2.3.3 + arch: 2.2.0 + blob-util: 2.0.2 + bluebird: 3.7.2 + buffer: 5.7.1 + cachedir: 2.4.0 + chalk: 4.1.2 + check-more-types: 2.24.0 + cli-cursor: 3.1.0 + cli-table3: 0.6.3 + commander: 5.1.0 + common-tags: 1.8.2 + dayjs: 1.11.9 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + eventemitter2: 6.4.9 + execa: 4.1.0 + executable: 4.1.1 + extract-zip: 2.0.1(supports-color@8.1.1) + figures: 3.2.0 + fs-extra: 9.1.0 + getos: 3.2.1 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + lazy-ass: 1.6.0 + listr2: 3.14.0(enquirer@2.4.1) + lodash: 4.17.21 + log-symbols: 4.1.0 + minimist: 1.2.8 + ospath: 1.2.2 + pretty-bytes: 5.6.0 + proxy-from-env: 1.0.0 + request-progress: 3.0.0 + semver: 7.5.4 + supports-color: 8.1.1 + tmp: 0.2.1 + untildify: 4.0.0 + yauzl: 2.10.0 + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + + /dayjs@1.11.9: + resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} + + /debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@3.2.7(supports-color@8.1.1): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 8.1.1 + + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + dependencies: + mimic-response: 2.1.0 + dev: true + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /dequal@1.0.0: + resolution: {integrity: sha512-/Nd1EQbQbI9UbSHrMiKZjFLrXSnU328iQdZKPQf78XQI6C+gutkFUeoHpG5J08Ioa6HeRbRNFpSIclh1xyG0mw==} + engines: {node: '>=6'} + dev: true + + /des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /devtools-protocol@0.0.1019158: + resolution: {integrity: sha512-wvq+KscQ7/6spEV7czhnZc9RM/woz1AY+/Vpd8/h2HFMwJSdTliu7f/yr1A6vDdJfKICZsShqsYpEQbdhg8AFQ==} + dev: true + + /diamond-square@1.2.0: + resolution: {integrity: sha512-8WKLWV8Bey1UWaDHDocry7JDzpTRBOx/iOktkCoCjmKYcpVFOihIoeeg9CG+n2WIIenRxtyne/DxzsR25bQwpQ==} + dependencies: + minecraft-data: 3.45.0 + prismarine-chunk: 1.35.0(minecraft-data@3.45.0) + random-seed: 0.3.0 + vec3: 0.1.8 + dev: false + + /diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /diff2html@2.12.2: + resolution: {integrity: sha512-G/Zn1KyG/OeC+67N/P26WHsQpjrjUiRyWGvg29ypy3MxSsBmF0bzsU/Irq70i2UAg+f/MzmLx4v/Nkt01TOU3g==} + engines: {node: '>=4'} + dependencies: + diff: 4.0.2 + hogan.js: 3.0.2 + merge: 1.2.1 + whatwg-fetch: 3.6.18 + dev: false + + /diff@2.2.3: + resolution: {integrity: sha512-9wfm3RLzMp/PyTFWuw9liEzdlxsdGixCW0ZTU1XDmtlAkvpVXTPGF8KnfSs0hm3BPbg19OrUPPsRkHXoREpP1g==} + engines: {node: '>=0.3.1'} + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /discontinuous-range@1.0.0: + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: false + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + dev: false + + /electron-to-chromium@1.4.504: + resolution: {integrity: sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==} + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /emit-then@2.0.0: + resolution: {integrity: sha512-y5JHnrygHnCndtqVHHDhCr0ZzzWHK5RBTczWRlGSIR5UnGHBXuxpoaE0UB5E82qym8ma2dI799wDSSJN2e4VSg==} + engines: {node: '>=5'} + dev: false + + /emittery@0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + dev: true + + /emittery@0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /endian-toggle@0.0.0: + resolution: {integrity: sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ==} + + /engine.io-client@3.5.3: + resolution: {integrity: sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==} + dependencies: + component-emitter: 1.3.0 + component-inherit: 0.0.3 + debug: 3.1.0 + engine.io-parser: 2.2.1 + has-cors: 1.1.0 + indexof: 0.0.1 + parseqs: 0.0.6 + parseuri: 0.0.6 + ws: 7.4.6 + xmlhttprequest-ssl: 1.6.3 + yeast: 0.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-client@6.5.2: + resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@8.1.1) + engine.io-parser: 5.2.1 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /engine.io-parser@2.2.1: + resolution: {integrity: sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==} + dependencies: + after: 0.8.2 + arraybuffer.slice: 0.0.7 + base64-arraybuffer: 0.1.4 + blob: 0.0.5 + has-binary2: 1.0.3 + dev: false + + /engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + + /engine.io@3.6.1: + resolution: {integrity: sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==} + engines: {node: '>=8.0.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + debug: 4.1.1 + engine.io-parser: 2.2.1 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io@6.5.2: + resolution: {integrity: sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==} + engines: {node: '>=10.2.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.13 + '@types/node': 20.6.4 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4(supports-color@8.1.1) + engine.io-parser: 5.2.1 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + /envinfo@7.10.0: + resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + dev: false + + /eruda@3.0.1: + resolution: {integrity: sha512-6q1Xdwga4JTr1mKSW4mzuWSSbmXgqpm/8Wa1QGFGfCWRjC0bCQjbS4u06M1te1moucIS3hBLlbSTPWYH2W0qbQ==} + dev: false + + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + + /es-iterator-helpers@1.0.14: + resolution: {integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.0 + safe-array-concat: 1.0.0 + dev: true + + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + /es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: true + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: true + + /esbuild-plugin-polyfill-node@0.3.0(esbuild@0.19.3): + resolution: {integrity: sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==} + peerDependencies: + esbuild: '*' + dependencies: + '@jspm/core': 2.0.1 + esbuild: 0.19.3 + import-meta-resolve: 3.0.0 + dev: false + + /esbuild@0.19.3: + resolution: {integrity: sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.3 + '@esbuild/android-arm64': 0.19.3 + '@esbuild/android-x64': 0.19.3 + '@esbuild/darwin-arm64': 0.19.3 + '@esbuild/darwin-x64': 0.19.3 + '@esbuild/freebsd-arm64': 0.19.3 + '@esbuild/freebsd-x64': 0.19.3 + '@esbuild/linux-arm': 0.19.3 + '@esbuild/linux-arm64': 0.19.3 + '@esbuild/linux-ia32': 0.19.3 + '@esbuild/linux-loong64': 0.19.3 + '@esbuild/linux-mips64el': 0.19.3 + '@esbuild/linux-ppc64': 0.19.3 + '@esbuild/linux-riscv64': 0.19.3 + '@esbuild/linux-s390x': 0.19.3 + '@esbuild/linux-x64': 0.19.3 + '@esbuild/netbsd-x64': 0.19.3 + '@esbuild/openbsd-x64': 0.19.3 + '@esbuild/sunos-x64': 0.19.3 + '@esbuild/win32-arm64': 0.19.3 + '@esbuild/win32-ia32': 0.19.3 + '@esbuild/win32-x64': 0.19.3 + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@8.10.0(eslint@8.50.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.50.0 + dev: true + + /eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.33.2)(eslint@8.48.0): + resolution: {integrity: sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==} + peerDependencies: + eslint: ^8.8.0 + eslint-plugin-react: ^7.28.0 + dependencies: + eslint: 8.48.0 + eslint-plugin-react: 7.33.2(eslint@8.48.0) + dev: true + + /eslint-config-standard@17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.48.0): + resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: ^15.0.0 + eslint-plugin-promise: ^6.0.0 + dependencies: + eslint: 8.48.0 + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.3)(eslint@8.48.0) + eslint-plugin-n: 15.7.0(eslint@8.48.0) + eslint-plugin-promise: 6.1.1(eslint@8.48.0) + dev: true + + /eslint-config-xo-react@0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.50.0): + resolution: {integrity: sha512-wiV215xQIn71XZyyVfaOXHaFpR1B14IJttwOjMi/eqUK1s+ojJdHr7eHqTLaGUfh6FKgWha1QNwePlIXx7mBUg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=8.6.0' + eslint-plugin-react: '>=7.29.0' + eslint-plugin-react-hooks: '>=4.3.0' + dependencies: + eslint: 8.50.0 + eslint-plugin-react: 7.33.2(eslint@8.50.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.50.0) + dev: true + + /eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-vPQssnRSUgBFOEfB/KY12CXwltwFSn4RSCfa+w7gjBC2PFQ7Yfgmyei+1XUZ3K+8LRGef2NMJUcxts7PldhDjg==} + engines: {node: '>=16'} + peerDependencies: + '@typescript-eslint/eslint-plugin': '>=6.0.0' + '@typescript-eslint/parser': '>=6.0.0' + eslint: '>=8.0.0' + typescript: '>=4.7' + dependencies: + '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + eslint: 8.50.0 + typescript: 5.2.2 + dev: true + + /eslint-config-xo@0.43.1(eslint@8.50.0): + resolution: {integrity: sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=8.27.0' + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.50.0 + dev: true + + /eslint-config-zardoy@0.2.17(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-d31WsjyVSQqHbzTpBSmH96+nw5gwY2yhDbZatU89gr+U8ou1FRUkJSApYJUgmcINt8AQocj1RDDAVYmVSILZgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + eslint: ^8.5.0 + eslint-plugin-vue: ^8.4.1 + typescript: ^4.5.2 + vue-eslint-parser: ^8.2.0 + peerDependenciesMeta: + eslint-plugin-vue: + optional: true + vue-eslint-parser: + optional: true + dependencies: + '@rushstack/eslint-patch': 1.4.0 + '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + eslint: 8.50.0 + eslint-config-prettier: 8.10.0(eslint@8.50.0) + eslint-config-xo: 0.43.1(eslint@8.50.0) + eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.50.0) + eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.50.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.7.3)(eslint@8.50.0) + eslint-plugin-node: 11.1.0(eslint@8.50.0) + eslint-plugin-sonarjs: 0.19.0(eslint@8.50.0) + eslint-plugin-unicorn: 48.0.0(eslint@8.50.0) + typescript: 5.2.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - eslint-plugin-react + - eslint-plugin-react-hooks + - supports-color + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7(supports-color@8.1.1) + is-core-module: 2.13.0 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + debug: 3.2.7(supports-color@8.1.1) + eslint: 8.48.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + debug: 3.2.7(supports-color@8.1.1) + eslint: 8.50.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es@3.0.1(eslint@8.50.0): + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.50.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-es@4.1.0(eslint@8.48.0): + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.48.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-eslint-comments@3.2.0(eslint@8.50.0): + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.50.0 + ignore: 5.2.4 + dev: true + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.7.3)(eslint@8.50.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7(supports-color@8.1.1) + doctrine: 2.1.0 + eslint: 8.50.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.7 + resolve: 1.22.4 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.3)(eslint@8.48.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + array-includes: 3.1.6 + array.prototype.findlastindex: 1.2.2 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7(supports-color@8.1.1) + doctrine: 2.1.0 + eslint: 8.48.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.6 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-n@15.7.0(eslint@8.48.0): + resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + builtins: 5.0.1 + eslint: 8.48.0 + eslint-plugin-es: 4.1.0(eslint@8.48.0) + eslint-utils: 3.0.0(eslint@8.48.0) + ignore: 5.2.4 + is-core-module: 2.13.0 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 7.5.4 + dev: true + + /eslint-plugin-node@11.1.0(eslint@8.50.0): + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.50.0 + eslint-plugin-es: 3.0.1(eslint@8.50.0) + eslint-utils: 2.1.0 + ignore: 5.2.4 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 6.3.1 + dev: true + + /eslint-plugin-promise@6.1.1(eslint@8.48.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.48.0 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.50.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.50.0 + dev: true + + /eslint-plugin-react@7.33.2(eslint@8.48.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.14 + eslint: 8.48.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.6 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-plugin-react@7.33.2(eslint@8.50.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.14 + eslint: 8.50.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.6 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-plugin-sonarjs@0.19.0(eslint@8.50.0): + resolution: {integrity: sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==} + engines: {node: '>=14'} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.50.0 + dev: true + + /eslint-plugin-unicorn@48.0.0(eslint@8.50.0): + resolution: {integrity: sha512-8fk/v3p1ro34JSVDBEmtOq6EEQRpMR0iTir79q69KnXFZ6DJyPkT3RAi+ZoTqhQMdDSpGh8BGR68ne1sP5cnAA==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.44.0' + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + ci-info: 3.8.0 + clean-regexp: 1.0.0 + eslint: 8.50.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.5.4 + strip-indent: 3.0.0 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.48.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.48.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint@8.50.0: + resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.50.0 + '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /event-promise@0.0.1: + resolution: {integrity: sha512-ouEmk2N0BalybPM0zmj3RHE93AX4p9hAIHZfbbqxolLChqCB6pcLDbYH6zZ8TaiFWImPHfs5kFnNpA0u9RdEaQ==} + dependencies: + promise: 5.0.0 + dev: false + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + /eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + dependencies: + pify: 2.3.0 + + /exif-parser@0.1.12: + resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} + dev: false + + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + dev: false + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-tilde@1.2.2: + resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} + engines: {node: '>=0.10.0'} + dependencies: + os-homedir: 1.0.2 + dev: true + + /expect-puppeteer@6.1.1: + resolution: {integrity: sha512-cnQF96qdoEcOD63j5NQMc0RtW9WRMW/WHKXEKsuDQ2tszhVH3qC7zkXXS4D0LTt9qCB3DEExioqylsQXvqPrUw==} + dev: true + + /expect@27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: true + + /express-ws@4.0.0(express@4.18.2): + resolution: {integrity: sha512-KEyUw8AwRET2iFjFsI1EJQrJ/fHeGiJtgpYgEWG3yDv4l/To/m3a2GaYfeGyB3lsWdvbesjF5XCMx+SVBgAAYw==} + engines: {node: '>=4.5.0'} + peerDependencies: + express: ^4.0.0 || ^5.0.0-alpha.1 + dependencies: + express: 4.18.2 + ws: 5.2.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + /extract-zip@2.0.1(supports-color@8.1.1): + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.0 + transitivePeerDependencies: + - supports-color + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-loops@1.1.3: + resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + dev: false + + /fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + dev: false + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.0 + dev: true + + /file-type@9.0.0: + resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==} + engines: {node: '>=6'} + dev: false + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: false + + /filesize@10.0.12: + resolution: {integrity: sha512-6RS9gDchbn+qWmtV2uSjo5vmKizgfCQeb5jKmqx8HyzA3MoLqqyQxN+QcjkGBJt7FjJ9qFce67Auyya5rRRbpw==} + engines: {node: '>= 10.4.0'} + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /find-file-up@0.1.3: + resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} + engines: {node: '>=0.10.0'} + dependencies: + fs-exists-sync: 0.1.0 + resolve-dir: 0.1.1 + dev: true + + /find-pkg@0.1.2: + resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} + engines: {node: '>=0.10.0'} + dependencies: + find-file-up: 0.1.3 + dev: true + + /find-process@1.4.7: + resolution: {integrity: sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==} + hasBin: true + dependencies: + chalk: 4.1.2 + commander: 5.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.7 + keyv: 4.5.3 + rimraf: 3.0.2 + dev: true + + /flatmap@0.0.3: + resolution: {integrity: sha512-OuR+o7kHVe+x9RtIujPay7Uw3bvDZBZFSBXClEphZuSDLmZTqMdclasf4vFSsogC8baDz0eaC2NdO/2dlXHBKQ==} + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /follow-redirects@1.15.2(debug@4.3.4): + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) + dev: true + + /follow-redirects@1.15.3(debug@4.3.4): + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /for-in@0.1.8: + resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==} + engines: {node: '>=0.10.0'} + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /for-own@0.1.5: + resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-exists-sync@0.1.0: + resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} + engines: {node: '>=0.10.0'} + dev: true + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: false + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + + /getos@3.2.1: + resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} + dependencies: + async: 3.2.4 + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.0 + minimatch: 9.0.3 + minipass: 7.0.3 + path-scurry: 1.10.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + + /global-modules@0.2.3: + resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 0.1.5 + is-windows: 0.2.0 + dev: true + + /global-prefix@0.1.5: + resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 0.2.0 + which: 1.3.1 + dev: true + + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + /has-binary2@1.0.3: + resolution: {integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==} + dependencies: + isarray: 2.0.1 + dev: false + + /has-cors@1.1.0: + resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + dependencies: + capital-case: 1.0.4 + tslib: 2.6.2 + dev: false + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /hogan.js@3.0.2: + resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} + hasBin: true + dependencies: + mkdirp: 0.3.0 + nopt: 1.0.10 + dev: false + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-browserify@1.7.0: + resolution: {integrity: sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==} + dependencies: + Base64: 0.2.1 + inherits: 2.0.4 + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy@1.18.1(debug@4.3.4): + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.2(debug@4.3.4) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /http-server@14.1.1(debug@4.3.4): + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} + engines: {node: '>=12'} + hasBin: true + dependencies: + basic-auth: 2.0.1 + chalk: 4.1.2 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1(debug@4.3.4) + mime: 1.6.0 + minimist: 1.2.8 + opener: 1.5.2 + portfinder: 1.0.32 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.17.0 + dev: true + + /http-signature@1.3.6: + resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + jsprim: 2.0.2 + sshpk: 1.17.0 + + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + dev: false + + /iconify-icon@1.0.8: + resolution: {integrity: sha512-jvbUKHXf8EnGGArmhlP2IG8VqQLFFyTvTqb9LVL2TKTh7/eCCD1o2HHE9thpbJJb6B8hzhcFb6rOKhvo7reNKA==} + dependencies: + '@iconify/types': 2.0.0 + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /image-size@0.7.5: + resolution: {integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==} + engines: {node: '>=6.9.0'} + hasBin: true + dev: false + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /import-meta-resolve@3.0.0: + resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} + dev: false + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + /indexof@0.0.1: + resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + /inline-style-prefixer@6.0.4: + resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} + dependencies: + css-in-js-utils: 3.1.0 + fast-loops: 1.1.3 + dev: false + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + + /interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: false + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: false + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + + /is-windows@0.2.0: + resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} + engines: {node: '>=0.10.0'} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isarray@2.0.1: + resolution: {integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==} + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.22.11 + '@babel/parser': 7.22.13 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /iterator.prototype@1.1.0: + resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} + dependencies: + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + has-tostringtag: 1.0.0 + reflect.getprototypeof: 1.0.3 + dev: true + + /jackspeak@2.3.0: + resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: false + + /jest-changed-files@27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.2 + dev: true + + /jest-circus@27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.6.2 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@27.5.1(canvas@2.11.2): + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(canvas@2.11.2) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 27.5.1(canvas@2.11.2) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-config@27.5.1(canvas@2.11.2): + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.22.11 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.22.11) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1(canvas@2.11.2) + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1(canvas@2.11.2) + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-dev-server@6.2.0(debug@4.3.4): + resolution: {integrity: sha512-ZWh8CuvxwjhYfvw4tGeftziqIvw/26R6AG3OTgNTQeXul8aZz48RQjDpnlDwnWX53jxJJl9fcigqIdSU5lYZuw==} + dependencies: + chalk: 4.1.2 + cwd: 0.10.0 + find-process: 1.4.7 + prompts: 2.4.2 + spawnd: 6.2.0 + tree-kill: 1.2.2 + wait-on: 6.0.1(debug@4.3.4) + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /jest-diff@27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-docblock@27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-environment-jsdom@27.5.1(canvas@2.11.2): + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.6.2 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0(canvas@2.11.2) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node@27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.5.7 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /jest-environment-puppeteer@6.2.0(debug@4.3.4): + resolution: {integrity: sha512-a/oSu6dO9D+XoDDe3ZY/0Sk79Jl2FcJl7Q0D+3x22l1eWNOYe4ikXnPGhtmNZ3mJIpuAVIX6LytA8EraOk/aqQ==} + dependencies: + chalk: 4.1.2 + cwd: 0.10.0 + jest-dev-server: 6.2.0(debug@4.3.4) + jest-environment-node: 27.5.1 + merge-deep: 3.0.3 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /jest-get-type@27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-haste-map@27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 20.5.7 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-jasmine2@27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.6.2 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-leak-detector@27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-matcher-utils@27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-message-util@27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.22.13 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.6.2 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: true + + /jest-puppeteer@6.0.0(debug@4.3.4)(puppeteer@16.0.0): + resolution: {integrity: sha512-dgZJdBxRafMRqHFRxnsqLDbuJcOcdgaJlg2PLoMxgPy9nQZTrtG9ezwQsRf1poSaLbZGMAL2JVS907MBCYPEJw==} + peerDependencies: + puppeteer: '>= 1.5.0' + dependencies: + expect-puppeteer: 6.1.1 + jest-environment-puppeteer: 6.2.0(debug@4.3.4) + puppeteer: 16.0.0 + transitivePeerDependencies: + - debug + - supports-color + dev: true + + /jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-resolve-dependencies@27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.4 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: true + + /jest-runner@27.5.1(canvas@2.11.2): + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.5.7 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.11 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1(canvas@2.11.2) + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime@27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-serializer@27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 20.6.2 + graceful-fs: 4.2.11 + dev: true + + /jest-snapshot@27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.22.11 + '@babel/generator': 7.22.10 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11) + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.20.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.11 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.5.7 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: true + + /jest-watcher@27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.5.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: true + + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.6.4 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.5.7 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@27.0.4(canvas@2.11.2): + resolution: {integrity: sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(canvas@2.11.2) + import-local: 3.1.0 + jest-cli: 27.5.1(canvas@2.11.2) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jimp@0.10.3: + resolution: {integrity: sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==} + dependencies: + '@babel/runtime': 7.22.11 + '@jimp/custom': 0.10.3 + '@jimp/plugins': 0.10.3(@jimp/custom@0.10.3) + '@jimp/types': 0.10.3(@jimp/custom@0.10.3) + core-js: 3.32.1 + regenerator-runtime: 0.13.11 + dev: false + + /joi@17.10.0: + resolution: {integrity: sha512-hrazgRSlhzacZ69LdcKfhi3Vu13z2yFfoAzmEov3yFIJlatTdVGUW6vle1zjH8qkzdCn/qGw8rapjqsObbYXAg==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + dev: true + + /jose@4.14.6: + resolution: {integrity: sha512-EqJPEUlZD0/CSUMubKtMaYUOtWe91tZXTWMJZoKSbLk+KtdhNdcvppH8lA9XwVu2V4Ailvsj0GBZJ2ZwDjfesQ==} + + /jpeg-js@0.3.7: + resolution: {integrity: sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==} + dev: false + + /js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: false + + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + /jsdom@16.7.0(canvas@2.11.2): + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.10.0 + acorn-globals: 6.0.0 + canvas: 2.11.2 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false + + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.5.4 + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /jsprim@2.0.2: + resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + object.assign: 4.1.4 + object.values: 1.1.7 + dev: true + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@2.0.1: + resolution: {integrity: sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /lazy-ass@1.6.0: + resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} + engines: {node: '> 0.8'} + + /lazy-cache@0.2.7: + resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==} + engines: {node: '>=0.10.0'} + dev: true + + /lazy-cache@1.0.4: + resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} + engines: {node: '>=0.10.0'} + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /listr2@3.14.0(enquirer@2.4.1): + resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} + engines: {node: '>=10.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + enquirer: 2.4.1 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + + /lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.1 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + dev: false + + /lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + dependencies: + '@types/trusted-types': 2.0.3 + dev: false + + /lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + dev: false + + /load-bmfont@1.4.1: + resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} + dependencies: + buffer-equal: 0.0.1 + mime: 1.6.0 + parse-bmfont-ascii: 1.0.6 + parse-bmfont-binary: 1.0.6 + parse-bmfont-xml: 1.1.4 + phin: 2.9.3 + xhr: 2.6.0 + xtend: 4.0.2 + dev: false + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /load-json-file@5.3.0: + resolution: {integrity: sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 4.0.1 + strip-bom: 3.0.0 + type-fest: 0.3.1 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + /lodash.compact@3.0.1: + resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} + dev: false + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + /lodash.reduce@4.6.0: + resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: false + + /lru-cache@10.0.1: + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /macaddress@0.5.3: + resolution: {integrity: sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==} + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /md5-file@4.0.0: + resolution: {integrity: sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==} + engines: {node: '>=6.0'} + hasBin: true + dev: true + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /merge-deep@3.0.3: + resolution: {integrity: sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + clone-deep: 0.2.4 + kind-of: 3.2.2 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /merge@1.2.1: + resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} + dev: false + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + dev: true + + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: false + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minecraft-assets@1.9.0: + resolution: {integrity: sha512-KtvIRd9gcKlxbvrswGv1Ap9k7tVs//QW2ukp+8vJ28miYwkhUmYfjTZyElIG8KUXV/46wL2kDzLH8SJbXQ56Mg==} + dev: true + + /minecraft-assets@1.9.1: + resolution: {integrity: sha512-vYKN5fhMilPafH0CnmYQBCP8zW0Fn3FVvPM25w7HC2PiXZQsP/p3Yl5QdCKjgqTk1LddNdmrw4notNoE6exVRQ==} + dev: false + + /minecraft-data@3.45.0: + resolution: {integrity: sha512-LJMKveMXNjQKk48mDEhFgjDQGBAGa0xKDXjsJ865eB2qdFei73vgu1YXQbyK3Zlg5a0cIgfvyHKG8Pf5s6XFqg==} + + /minecraft-folder-path@1.2.0: + resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} + + /minecraft-wrap@1.3.0: + resolution: {integrity: sha512-DTEG6j4IkUHCRl/Ad8aw5ku35X5xYCxWslQG74k7ESN4g4ZLg81HGGGpZYhB7KvcL/V5H7EofUoQ+eah76BoHQ==} + hasBin: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) + es6-promisify: 5.0.0 + extract-zip: 2.0.1(supports-color@8.1.1) + flatmap: 0.0.3 + md5-file: 4.0.0 + minecraft-folder-path: 1.2.0 + mkdirp: 0.5.6 + mz: 2.7.0 + promise-queue: 2.2.5 + request: 2.88.2 + request-promise: 4.2.6(request@2.88.2) + rimraf: 3.0.2 + yggdrasil: 1.7.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /minecrafthawkeye@1.2.5(prismarine-registry@1.7.0): + resolution: {integrity: sha512-s6YJrpahvzVEKelAv6Tjp2we7VataThAlTH+O2SoaSgIqGDg+ocxwb1+5Yh11CyQ2llMTcnplbaI2xOtyr39Pw==} + dependencies: + mineflayer: 3.18.0(prismarine-registry@1.7.0) + transitivePeerDependencies: + - encoding + - prismarine-registry + - supports-color + dev: true + + /mineflayer-pathfinder@2.4.4: + resolution: {integrity: sha512-HAXakZrJRb1UC+5dv8EaDrqjW3ZnBnBk3nkb6x/YWyhHCUKn/E7VU0FO+UN9whuqPlkSaVumEdXJdydE6lSYxQ==} + dependencies: + minecraft-data: 3.45.0 + prismarine-block: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.2.1 + prismarine-physics: 1.7.0 + vec3: 0.1.8 + dev: true + + /mineflayer@3.18.0(prismarine-registry@1.7.0): + resolution: {integrity: sha512-eHLr3rPqGtZuoAWrocMY+WBGxZ1ao8OHAxBr3L8XFT4cZVybjLbEqs/NAa2RFTKTzhO23kzxt+qsmxkLL7Oxiw==} + engines: {node: '>=14'} + dependencies: + minecraft-data: 3.45.0 + minecraft-protocol: github.com/zardoy/minecraft-protocol/320088fcc115b4c500f8de66d0e3ae87efadcc15 + prismarine-biome: 1.3.0(minecraft-data@3.45.0)(prismarine-registry@1.7.0) + prismarine-block: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-chat: 1.9.1 + prismarine-chunk: 1.35.0(minecraft-data@3.45.0) + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.2.1 + prismarine-physics: 1.8.0 + prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) + prismarine-windows: 2.8.0 + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + protodef: 1.15.0 + typed-emitter: 1.4.0 + vec3: 0.1.8 + transitivePeerDependencies: + - encoding + - prismarine-registry + - supports-color + dev: true + + /mineflayer@4.0.0(prismarine-registry@1.7.0): + resolution: {integrity: sha512-Yg/r/DC2Ski0ys+tyfE0d7VRJvamtfoCCEICf+q/3XyiSw36+Dt0guPpglQ2h2wZQrRaUqe9przZe+gdWgusug==} + engines: {node: '>=14'} + dependencies: + minecraft-data: 3.45.0 + minecraft-protocol: github.com/zardoy/minecraft-protocol/320088fcc115b4c500f8de66d0e3ae87efadcc15 + prismarine-biome: 1.3.0(minecraft-data@3.45.0)(prismarine-registry@1.7.0) + prismarine-block: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-chat: 1.9.1 + prismarine-chunk: 1.35.0(minecraft-data@3.45.0) + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.2.1 + prismarine-physics: 1.7.0 + prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) + prismarine-windows: 2.8.0 + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + protodef: 1.15.0 + typed-emitter: 1.4.0 + vec3: 0.1.8 + transitivePeerDependencies: + - encoding + - prismarine-registry + - supports-color + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minipass@7.0.3: + resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mixin-object@2.0.1: + resolution: {integrity: sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 0.1.8 + is-extendable: 0.1.1 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@0.3.0: + resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==} + deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mojangson@2.0.4: + resolution: {integrity: sha512-HYmhgDjr1gzF7trGgvcC/huIg2L8FsVbi/KacRe6r1AswbboGVZDS47SOZlomPuMWvZLas8m9vuHHucdZMwTmQ==} + dependencies: + nearley: 2.20.1 + + /moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + dev: false + + /moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nan@2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + dev: true + + /nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + css-tree: 1.1.3 + csstype: 3.1.2 + fastest-stable-stringify: 2.0.2 + inline-style-prefixer: 6.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rtl-css-js: 1.16.1 + sourcemap-codec: 1.4.8 + stacktrace-js: 2.0.2 + stylis: 4.2.0 + dev: false + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /nearley@2.20.1: + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} + hasBin: true + dependencies: + commander: 2.20.3 + moo: 0.5.2 + railroad-diagrams: 1.0.0 + randexp: 0.4.6 + + /needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + dependencies: + debug: 3.2.7(supports-color@8.1.1) + iconv-lite: 0.4.24 + sax: 1.2.4 + transitivePeerDependencies: + - supports-color + dev: false + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + dev: false + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-gyp-build-optional-packages@5.0.3: + resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /node-gzip@1.1.2: + resolution: {integrity: sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==} + dev: false + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /node-rsa@0.4.2: + resolution: {integrity: sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==} + dependencies: + asn1: 0.2.3 + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.4 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.4 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + dev: true + + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /omggif@1.0.10: + resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + dev: true + + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: true + + /ospath@1.2.2: + resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + + /parse-bmfont-ascii@1.0.6: + resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} + dev: false + + /parse-bmfont-binary@1.0.6: + resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} + dev: false + + /parse-bmfont-xml@1.1.4: + resolution: {integrity: sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==} + dependencies: + xml-parse-from-string: 1.0.1 + xml2js: 0.4.23 + dev: false + + /parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + dev: false + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /parseqs@0.0.6: + resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} + dev: false + + /parseuri@0.0.6: + resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.1 + minipass: 7.0.3 + dev: true + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /peerjs-js-binarypack@2.0.0: + resolution: {integrity: sha512-wu+L0Qeg4IH2DXm3B6xKP5ODeCIovwEEO/Fu3MVqApPQeVLzSdZpFzQzPobh+sdhUWMQGEO7YxHeiwpPngLjqQ==} + engines: {node: '>= 14.0.0'} + dev: false + + /peerjs@1.5.0: + resolution: {integrity: sha512-NLZ73jRNE4aLq2pmVTiSkWmwf6cvt9cH72qJHnzaLH+I2CtoWVvY42U9/O0/tYE6UYwRYJ1ktKRs2DdZ1Jrgcg==} + engines: {node: '>= 14'} + dependencies: + '@msgpack/msgpack': 2.8.0 + cbor-x: 1.5.4 + eventemitter3: 4.0.7 + peerjs-js-binarypack: 2.0.0 + webrtc-adapter: 8.2.3 + dev: false + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + /phin@2.9.3: + resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pixelmatch@4.0.2: + resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} + hasBin: true + dependencies: + pngjs: 3.4.0 + dev: false + + /pkg-conf@3.1.0: + resolution: {integrity: sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + load-json-file: 5.3.0 + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + dev: false + + /portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7(supports-color@8.1.1) + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@1.19.1: + resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + /pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: false + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prismarine-auth@2.2.0: + resolution: {integrity: sha512-3XfR3bqrd7nrTVyEqMwuYRr+/Vy+hkfBplubSDuoRAcRCs90lDx7R4EG3fjMSoKY53RLTXjeFnsB6m1krhL/2A==} + dependencies: + '@azure/msal-node': 1.18.3 + '@xboxreplay/xboxlive-auth': 3.3.3(debug@4.3.4) + debug: 4.3.4(supports-color@8.1.1) + jose: 4.14.6 + node-fetch: 2.7.0 + smart-buffer: 4.2.0 + uuid-1345: 1.0.2 + transitivePeerDependencies: + - encoding + - supports-color + + /prismarine-biome@1.3.0(minecraft-data@3.45.0)(prismarine-registry@1.7.0): + resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} + peerDependencies: + minecraft-data: 3.45.0 + prismarine-registry: ^1.1.0 + dependencies: + minecraft-data: 3.45.0 + prismarine-registry: 1.7.0 + + /prismarine-chat@1.9.1: + resolution: {integrity: sha512-x7WWa5MNhiLZSO6tw+YyKpzquFZ+DNISVgiV6K3SU0GsishMXe+nto02WhF/4AuFerKdugm9u1d/r4C4zSkJOg==} + dependencies: + mojangson: 2.0.4 + prismarine-item: 1.14.0 + prismarine-nbt: 2.2.1 + prismarine-registry: 1.7.0 + + /prismarine-chunk@1.35.0(minecraft-data@3.45.0): + resolution: {integrity: sha512-Q1lElMUle7wWxWdQjbZo3j2/dLNG325j90IcbbMmBTnHdQSWIjWFe792XOz3RVBlvrhRJEiZk38S6/eQTQ9esw==} + engines: {node: '>=14'} + dependencies: + prismarine-biome: 1.3.0(minecraft-data@3.45.0)(prismarine-registry@1.7.0) + prismarine-block: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-nbt: 2.2.1 + prismarine-registry: 1.7.0 + smart-buffer: 4.2.0 + uint4: 0.1.2 + vec3: 0.1.8 + xxhash-wasm: 0.4.2 + transitivePeerDependencies: + - minecraft-data + + /prismarine-entity@2.3.1: + resolution: {integrity: sha512-HOv8l7IetHNf4hwZ7V/W4vM3GNl+e6VCtKDkH9h02TRq7jWngsggKtJV+VanCce/sNwtJUhJDjORGs728ep4MA==} + dependencies: + prismarine-chat: 1.9.1 + prismarine-item: 1.14.0 + prismarine-registry: 1.7.0 + vec3: 0.1.8 + + /prismarine-item@1.14.0: + resolution: {integrity: sha512-udQHYGJ05klFe8Kkc0TOmwoXj5Xl1ZPgHVoMbGUAFB9exN4TFxEa1A39vkSYhxP5Et9PNufQQvFBFVom0nXikA==} + dependencies: + prismarine-nbt: 2.2.1 + prismarine-registry: 1.7.0 + + /prismarine-nbt@1.6.0: + resolution: {integrity: sha512-h0ECvIjjwjMOtsmHxHc8hNY7kzktnKqKXmOHF0AkmH7OjkcHNAFsWRiZNvfc76rOhNonRutHvTVAlh/eLtK0oA==} + dependencies: + protodef: 1.15.0 + dev: true + + /prismarine-nbt@2.2.1: + resolution: {integrity: sha512-Mb50c58CPnuZ+qvM31DBa08tf9UumlTq1LkvpMoUpKfCuN05GZHTqCUwER3lxTSHLL0GZKghIPbYR/JQkINijQ==} + dependencies: + protodef: 1.15.0 + + /prismarine-physics@1.7.0: + resolution: {integrity: sha512-NIm13HYQU6gzWyzb64eSS2civSbnn4cmqZgX+o27TWZMdqJEqmwPZaHSo9rHhPT96c3ZodelRE4qGIEE7q4gow==} + dependencies: + minecraft-data: 3.45.0 + prismarine-nbt: 2.2.1 + vec3: 0.1.8 + dev: true + + /prismarine-physics@1.8.0: + resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} + dependencies: + minecraft-data: 3.45.0 + prismarine-nbt: 2.2.1 + vec3: 0.1.8 + dev: true + + /prismarine-realms@1.3.2: + resolution: {integrity: sha512-5apl9Ru8veTj5q2OozRc4GZOuSIcs3yY4UEtALiLKHstBe8bRw8vNlaz4Zla3jsQ8yP/ul1b1IJINTRbocuA6g==} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + - supports-color + + /prismarine-recipe@1.3.1(prismarine-registry@1.7.0): + resolution: {integrity: sha512-xfa9E9ACoaDi+YzNQ+nk8kWSIqt5vSZOOCHIT+dTXscf/dng2HaJ/59uwe1D/jvOkAd2OvM6RRJM6fFe0q/LDA==} + peerDependencies: + prismarine-registry: ^1.4.0 + dependencies: + prismarine-registry: 1.7.0 + dev: true + + /prismarine-registry@1.7.0: + resolution: {integrity: sha512-yyva0FpWI078nNeMhx8ekVza5uUTYhEv+C+ADu3wUQXiG8qhXkvrf0uzsnhTgZL8BLdsi2axgCEiKw9qSKIuxQ==} + dependencies: + minecraft-data: 3.45.0 + prismarine-nbt: 2.2.1 + + /prismarine-schematic@1.2.0: + resolution: {integrity: sha512-iMam8wsUIYoqty3PSfAbbSLIWto/EnXs+zv7lHiZxwaiSR8GgFyN71H4Lp3g5ly4yuiLK8ROF4AINjrKx+vmUA==} + dependencies: + minecraft-data: 3.45.0 + prismarine-block: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-nbt: 1.6.0 + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + vec3: 0.1.8 + dev: true + + /prismarine-windows@2.8.0: + resolution: {integrity: sha512-9HVhJ8tfCeRubYwQzgz8oiHNAebMJ5hDdjm45PZwrOgewaislnR2HDsbPMWiCcyWkYL7J8bVLVoSzEzv5pH98g==} + dependencies: + prismarine-item: 1.14.0 + prismarine-registry: 1.7.0 + typed-emitter: 2.1.0 + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /promise-queue@2.2.5: + resolution: {integrity: sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /promise@5.0.0: + resolution: {integrity: sha512-N2BfLz0Sigf7rsm5NnItRwTNqEDUF2ephwEXTcOAf2cO9NwZ9TnIjOmnQNtC0r70CV0S1+uc9mSMmFH7gxk87Q==} + dependencies: + asap: 1.0.0 + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /protodef-validator@1.3.1: + resolution: {integrity: sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==} + hasBin: true + dependencies: + ajv: 6.12.6 + + /protodef@1.15.0: + resolution: {integrity: sha512-bZ2Omw8dT+DACjJHLrBWZlqN4MlT9g9oSpJDdkUAJOStUzgJp+Zn42FJfPUdwutUxjaxA0PftN0PDlNa2XbneA==} + engines: {node: '>=14'} + dependencies: + lodash.get: 4.4.2 + lodash.reduce: 4.6.0 + protodef-validator: 1.3.1 + readable-stream: 3.6.2 + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + /proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + + /proxy-from-env@1.0.0: + resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /puppeteer@16.0.0: + resolution: {integrity: sha512-FgSe21IHNHkqv1SiJiob4ANsxVujcINa4p3MaDEMyoZsocbgSgwYE0c9lnF8eoinw4id3vx4DOXwhFdOOwVlDg==} + engines: {node: '>=14.1.0'} + deprecated: < 18.1.0 is no longer supported + requiresBuild: true + dependencies: + cross-fetch: 3.1.5 + debug: 4.3.4(supports-color@8.1.1) + devtools-protocol: 0.0.1019158 + extract-zip: 2.0.1(supports-color@8.1.1) + https-proxy-agent: 5.0.1 + pkg-dir: 4.2.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 8.8.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /qrcode.react@3.1.0(react@18.2.0): + resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /qs@6.10.4: + resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + + /rambda@6.9.0: + resolution: {integrity: sha512-yosVdGg1hNGkXPzqGiOYNEpXKjEOxzUCg2rB0l+NKdyCaSf4z+i5ojbN0IqDSezMMf71YEglI+ZUTgTffn5afw==} + dev: false + + /randexp@0.4.6: + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} + dependencies: + discontinuous-range: 1.0.0 + ret: 0.1.15 + + /random-seed@0.3.0: + resolution: {integrity: sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==} + engines: {node: '>= 0.6.0'} + dependencies: + json-stringify-safe: 5.0.1 + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + /range@0.0.3: + resolution: {integrity: sha512-OxK2nY2bmeEB4NxoBraQIBOOeOIxoBvm6yt8MA1kLappgkG3SyLf173iOtT5woWycrtESDD2g0Nl2yt8YPoUnw==} + engines: {node: '>=0.8'} + dev: false + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} + peerDependencies: + '@popperjs/core': ^2.0.0 + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 + dependencies: + '@popperjs/core': 2.11.8 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-fast-compare: 3.2.2 + warning: 4.0.3 + dev: false + + /react-portal@4.2.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fE9kOBagwmTXZ3YGRYb4gcMy+kSA+yLO0xnPankjRlfBv4uCpFXqKPfkpsGQQR15wkZ9EssnvTOl1yMzbkxhPQ==} + peerDependencies: + react: ^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0 + react-dom: ^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0 + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + peerDependencies: + react: '*' + tslib: '*' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + dependencies: + debounce: 1.2.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-use@17.3.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hs7+tS4rRm1QLHPfanLCqXIi632tP4V7Sai1ENUP2WTufU6am++tU9uSw9YrNCFqbABiEv0ndKU1XCUcfu2tXA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@types/js-cookie': 2.2.7 + '@xobotyi/scrollbar-width': 1.9.5 + copy-to-clipboard: 3.3.3 + fast-deep-equal: 3.1.3 + fast-shallow-equal: 1.0.0 + js-cookie: 2.2.1 + nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + set-harmonic-interval: 1.0.1 + throttle-debounce: 3.0.1 + ts-easing: 0.2.0 + tslib: 2.6.2 + dev: false + + /react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + optional: true + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.2 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + /readline@1.3.0: + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + dev: false + + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.4 + dev: true + + /reflect.getprototypeof@1.0.3: + resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /regenerate-unicode-properties@10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: false + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: false + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.22.11 + dev: false + + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + dev: true + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: false + + /regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: false + + /request-progress@3.0.0: + resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} + dependencies: + throttleit: 1.0.0 + + /request-promise-core@1.1.4(request@2.88.2): + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + dependencies: + lodash: 4.17.21 + request: 2.88.2 + dev: true + + /request-promise@4.2.6(request@2.88.2): + resolution: {integrity: sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==} + engines: {node: '>=0.10.0'} + deprecated: request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + dependencies: + bluebird: 3.7.2 + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + dev: true + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-dir@0.1.1: + resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 1.2.2 + global-modules: 0.2.3 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@5.0.1: + resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.3 + dev: true + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + + /rollup-plugin-terser@7.0.2(rollup@2.79.1): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.22.13 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.19.2 + dev: false + + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + dependencies: + '@babel/runtime': 7.22.11 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + dependencies: + truncate-utf8-bytes: 1.0.2 + dev: false + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: false + + /sdp@3.2.0: + resolution: {integrity: sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==} + dev: false + + /secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + dev: false + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: false + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + dev: false + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /shallow-clone@0.1.2: + resolution: {integrity: sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + kind-of: 2.0.1 + lazy-cache: 0.2.7 + mixin-object: 2.0.1 + dev: true + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + dependencies: + decompress-response: 4.2.1 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /socket.io-adapter@1.1.2: + resolution: {integrity: sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==} + dev: false + + /socket.io-adapter@2.5.2: + resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + dependencies: + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /socket.io-client@2.5.0: + resolution: {integrity: sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==} + dependencies: + backo2: 1.0.2 + component-bind: 1.0.0 + component-emitter: 1.3.0 + debug: 3.1.0 + engine.io-client: 3.5.3 + has-binary2: 1.0.3 + indexof: 0.0.1 + parseqs: 0.0.6 + parseuri: 0.0.6 + socket.io-parser: 3.3.3 + to-array: 0.1.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-client@4.7.2: + resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@8.1.1) + engine.io-client: 6.5.2 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /socket.io-parser@3.3.3: + resolution: {integrity: sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==} + dependencies: + component-emitter: 1.3.0 + debug: 3.1.0 + isarray: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io-parser@3.4.3: + resolution: {integrity: sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==} + engines: {node: '>=10.0.0'} + dependencies: + component-emitter: 1.2.1 + debug: 4.1.1 + isarray: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + /socket.io@2.5.0: + resolution: {integrity: sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==} + dependencies: + debug: 4.1.1 + engine.io: 3.6.1 + has-binary2: 1.0.3 + socket.io-adapter: 1.1.2 + socket.io-client: 2.5.0 + socket.io-parser: 3.4.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io@4.7.2: + resolution: {integrity: sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==} + engines: {node: '>=10.2.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.4(supports-color@8.1.1) + engine.io: 6.5.2 + socket.io-adapter: 2.5.2 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: false + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false + + /spawnd@6.2.0: + resolution: {integrity: sha512-qX/I4lQy4KgVEcNle0kuc4FxFWHISzBhZW1YemPfwmrmQjyZmfTK/OhBKkhrD2ooAaFZEm1maEBLE6/6enwt+g==} + dependencies: + exit: 0.1.2 + signal-exit: 3.0.7 + tree-kill: 1.2.2 + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /spiralloop@1.0.2: + resolution: {integrity: sha512-arrGOnli7tXoLWMqK8xXdV0qXLj3zd0OtgeME5SL/Nub0ssSYD27m9SlEsYcJGNi+VvEzVQIoBnAHOOhdZqc5Q==} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sshpk@1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + /stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + dependencies: + stackframe: 1.3.4 + dev: false + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: false + + /stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + dependencies: + source-map: 0.5.6 + stackframe: 1.3.4 + dev: false + + /stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + dependencies: + error-stack-parser: 2.1.4 + stack-generator: 2.0.10 + stacktrace-gps: 3.1.2 + dev: false + + /standard-engine@15.1.0: + resolution: {integrity: sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + get-stdin: 8.0.0 + minimist: 1.2.8 + pkg-conf: 3.1.0 + xdg-basedir: 4.0.0 + dev: true + + /standard@17.0.0(@typescript-eslint/parser@6.7.3): + resolution: {integrity: sha512-GlCM9nzbLUkr+TYR5I2WQoIah4wHA2lMauqbyPLV/oI5gJxqhHzhjl9EG2N0lr/nRqI3KCbCvm/W3smxvLaChA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + eslint: 8.48.0 + eslint-config-standard: 17.0.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.48.0) + eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.33.2)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.3)(eslint@8.48.0) + eslint-plugin-n: 15.7.0(eslint@8.48.0) + eslint-plugin-promise: 6.1.1(eslint@8.48.0) + eslint-plugin-react: 7.33.2(eslint@8.48.0) + standard-engine: 15.1.0 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /stats-gl@1.0.5: + resolution: {integrity: sha512-XimMxvwnf1Qf5KwebhcoA34kcX+fWEkIl0QjNkCbu4IpoyDMMsOajExn7FIq5w569k45+LhmsuRlGSrsvmGdNw==} + dev: false + + /stats.js@0.17.0: + resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + /stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + dev: true + + /stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + + /string.prototype.padend@3.1.4: + resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: false + + /tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: false + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /terser-webpack-plugin@5.3.9(esbuild@0.19.3)(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + esbuild: 0.19.3 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2(esbuild@0.19.3)(webpack-cli@5.1.4) + dev: true + + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /three.meshline@1.4.0: + resolution: {integrity: sha512-A8IsiMrWP8zmHisGDAJ76ZD7t/dOF/oCe/FUKNE6Bu01ZYEx8N6IlU/1Plb2aOZtAuWM2A8s8qS3hvY0OFuvOw==} + + /three@0.128.0: + resolution: {integrity: sha512-i0ap/E+OaSfzw7bD1TtYnPo3VEplkl70WX5fZqZnfZsE3k3aSFudqrrC9ldFZfYFkn1zwDmBcdGfiIm/hnbyZA==} + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: true + + /throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: false + + /throttleit@1.0.0: + resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + + /timm@1.7.1: + resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} + dev: false + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: false + + /tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-array@0.1.4: + resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==} + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + dev: true + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.0 + dev: false + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.0 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + dependencies: + utf8-byte-length: 1.0.4 + dev: false + + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + dev: true + + /ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + dev: false + + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + /type-fest@0.3.1: + resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} + engines: {node: '>=6'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + + /typed-emitter@1.4.0: + resolution: {integrity: sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==} + dev: true + + /typed-emitter@2.1.0: + resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} + optionalDependencies: + rxjs: 7.8.1 + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uint4@0.1.2: + resolution: {integrity: sha512-lhEx78gdTwFWG+mt6cWAZD/R6qrIj0TTBeH5xwyuDJyswLNlGe+KVlUPQ6+mx5Ld332pS0AMUTo9hIly7YsWxQ==} + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: false + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: false + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: false + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: false + + /unidiff@1.0.2: + resolution: {integrity: sha512-2sbEzki5fBmjgAqoafwxRenfMcumMlmVAoJDwYJa3CI4ZVugkdR6qjTw5sVsl29/4JfBBXhWEAd5ars8nRdqXg==} + dependencies: + diff: 2.2.3 + dev: false + + /union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + dependencies: + qs: 6.11.2 + dev: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: false + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: false + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.6.2 + dev: false + + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + dependencies: + tslib: 2.6.2 + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + /use-deep-compare@1.1.0(react@17.0.2): + resolution: {integrity: sha512-6yY3zmKNCJ1jjIivfZMZMReZjr8e6iC6Uqtp701jvWJ6ejC/usXD+JjmslZDPJQgX8P4B1Oi5XSLHkOLeYSJsA==} + peerDependencies: + react: '>=16.8.0' + dependencies: + dequal: 1.0.0 + react: 17.0.2 + dev: true + optional: true + + /use-deep-compare@1.1.0(react@18.2.0): + resolution: {integrity: sha512-6yY3zmKNCJ1jjIivfZMZMReZjr8e6iC6Uqtp701jvWJ6ejC/usXD+JjmslZDPJQgX8P4B1Oi5XSLHkOLeYSJsA==} + peerDependencies: + react: '>=16.8.0' + dependencies: + dequal: 1.0.0 + react: 18.2.0 + dev: true + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + + /use-typed-event-listener@4.0.2(react@17.0.2)(typescript@5.2.2): + resolution: {integrity: sha512-AhjRw+qg5t7OWg7en2Q4XDCdi2iyhALFl71tITL3FeZqt/jD1Qa6KnbH/UolARtID1Gd0IElizbCgolv3ZbUFA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + peerDependencies: + react: '>=16.14.0' + typescript: '>=4.1.2' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/runtime': 7.22.11 + react: 17.0.2 + typescript: 5.2.2 + use-deep-compare: 1.1.0(react@17.0.2) + dev: true + optional: true + + /use-typed-event-listener@4.0.2(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-AhjRw+qg5t7OWg7en2Q4XDCdi2iyhALFl71tITL3FeZqt/jD1Qa6KnbH/UolARtID1Gd0IElizbCgolv3ZbUFA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + peerDependencies: + react: '>=16.14.0' + typescript: '>=4.1.2' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/runtime': 7.22.11 + react: 18.2.0 + typescript: 5.2.2 + use-deep-compare: 1.1.0(react@18.2.0) + dev: true + + /utf8-byte-length@1.0.4: + resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} + dev: false + + /utif@2.0.1: + resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} + dependencies: + pako: 1.0.11 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + /uuid-1345@1.0.2: + resolution: {integrity: sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==} + dependencies: + macaddress: 0.5.3 + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /v8-to-istanbul@8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /valtio@1.11.1(react@18.2.0): + resolution: {integrity: sha512-sTKWY1e1AVUu4sY9CimoSZpufAsAXO+fzZrw0X5xtijEmDDQaPPLHZxlpONUpTLtvxPjpQURCSdUuUyBszoEOg==} + engines: {node: '>=12.20.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + dependencies: + proxy-compare: 2.5.1 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /valtio@1.11.2(@types/react@18.2.20)(react@18.2.0): + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.20 + proxy-compare: 2.5.1 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /vec3@0.1.8: + resolution: {integrity: sha512-LfKrP625Bsg/Tj52YdYPsHmpsJuo+tc6fLxZxXjEo9k2xSspKlPvoYTHehykKhp1FvV9nm+XU3Ehej5/9tpDCg==} + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + + /wait-on@6.0.1(debug@4.3.4): + resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + axios: 0.25.0(debug@4.3.4) + joi: 17.10.0 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: false + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /webpack-cli@5.1.4(webpack@5.88.2): + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.88.2) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.3 + envinfo: 7.10.0 + fastest-levenshtein: 1.0.16 + import-local: 3.1.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.88.2(esbuild@0.19.3)(webpack-cli@5.1.4) + webpack-merge: 5.9.0 + dev: true + + /webpack-merge@5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.1 + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@5.88.2(esbuild@0.19.3)(webpack-cli@5.1.4): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.10 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(esbuild@0.19.3)(webpack@5.88.2) + watchpack: 2.4.0 + webpack-cli: 5.1.4(webpack@5.88.2) + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /webrtc-adapter@8.2.3: + resolution: {integrity: sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==} + engines: {node: '>=6.0.0', npm: '>=3.10.0'} + dependencies: + sdp: 3.2.0 + dev: false + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-fetch@3.6.18: + resolution: {integrity: sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q==} + dev: false + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: false + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.11 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + dev: true + + /workbox-background-sync@7.0.0: + resolution: {integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==} + dependencies: + idb: 7.1.1 + workbox-core: 7.0.0 + dev: false + + /workbox-broadcast-update@7.0.0: + resolution: {integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-build@7.0.0: + resolution: {integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==} + engines: {node: '>=16.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@babel/core': 7.22.11 + '@babel/preset-env': 7.22.10(@babel/core@7.22.11) + '@babel/runtime': 7.22.11 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.11)(rollup@2.79.1) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.12.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2(rollup@2.79.1) + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.0.0 + workbox-broadcast-update: 7.0.0 + workbox-cacheable-response: 7.0.0 + workbox-core: 7.0.0 + workbox-expiration: 7.0.0 + workbox-google-analytics: 7.0.0 + workbox-navigation-preload: 7.0.0 + workbox-precaching: 7.0.0 + workbox-range-requests: 7.0.0 + workbox-recipes: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + workbox-streams: 7.0.0 + workbox-sw: 7.0.0 + workbox-window: 7.0.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: false + + /workbox-cacheable-response@7.0.0: + resolution: {integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-core@7.0.0: + resolution: {integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==} + dev: false + + /workbox-expiration@7.0.0: + resolution: {integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==} + dependencies: + idb: 7.1.1 + workbox-core: 7.0.0 + dev: false + + /workbox-google-analytics@7.0.0: + resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} + dependencies: + workbox-background-sync: 7.0.0 + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: false + + /workbox-navigation-preload@7.0.0: + resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-precaching@7.0.0: + resolution: {integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==} + dependencies: + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: false + + /workbox-range-requests@7.0.0: + resolution: {integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-recipes@7.0.0: + resolution: {integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==} + dependencies: + workbox-cacheable-response: 7.0.0 + workbox-core: 7.0.0 + workbox-expiration: 7.0.0 + workbox-precaching: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: false + + /workbox-routing@7.0.0: + resolution: {integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-strategies@7.0.0: + resolution: {integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==} + dependencies: + workbox-core: 7.0.0 + dev: false + + /workbox-streams@7.0.0: + resolution: {integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==} + dependencies: + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + dev: false + + /workbox-sw@7.0.0: + resolution: {integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==} + dev: false + + /workbox-window@7.0.0: + resolution: {integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==} + dependencies: + '@types/trusted-types': 2.0.3 + workbox-core: 7.0.0 + dev: false + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /ws@5.2.3: + resolution: {integrity: sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + dev: false + + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.8.1: + resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + dev: true + + /xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + dev: false + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xml-parse-from-string@1.0.1: + resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} + dev: false + + /xml2js@0.4.23: + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xmlhttprequest-ssl@1.6.3: + resolution: {integrity: sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==} + engines: {node: '>=0.4.0'} + dev: false + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + + /xxhash-wasm@0.4.2: + resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml@2.3.2: + resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + 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.8 + yargs-parser: 21.1.1 + dev: false + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + /yeast@0.1.2: + resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} + dev: false + + /yggdrasil@1.7.0: + resolution: {integrity: sha512-QBIo5fiNd7688G3FqXXYGr36uyrYzczlNuzpWFy2zL3+R+3KT2lF+wFxm51synfA3l3z6IBiGOc1/EVXWCYY1Q==} + dependencies: + node-fetch: 2.7.0 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zustand@3.6.5(react@18.2.0): + resolution: {integrity: sha512-/WfLJuXiEJimt61KGMHebrFBwckkCHGhAgVXTgPQHl6IMzjqm6MREb1OnDSnCRiSmRdhgdFCctceg6tSm79hiw==} + engines: {node: '>=12.7.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + dependencies: + react: 18.2.0 + dev: false + + file:prismarine-viewer: + resolution: {directory: prismarine-viewer, type: directory} + name: prismarine-viewer + requiresBuild: true + dependencies: + '@tweenjs/tween.js': 20.0.3 + compression: 1.7.4 + express: 4.18.2 + minecraft-data: 3.45.0 + prismarine-block: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-chunk: 1.35.0(minecraft-data@3.45.0) + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + socket.io: 4.7.2 + socket.io-client: 4.7.2 + three: 0.128.0 + three.meshline: 1.4.0 + vec3: 0.1.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + github.com/PrismarineJS/node-process/380d0b4f4c86f1b65b216c311bf00431f314e88e: + resolution: {tarball: https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e} + name: process + version: 0.11.10 + engines: {node: '>= 0.6.0'} + dev: true + + github.com/zardoy/browserfs/0ff5df5c4e67f54b5f032b87dc650e8b78626bc7: + resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/0ff5df5c4e67f54b5f032b87dc650e8b78626bc7} + name: browserfs + version: 2.0.0-zardoy + dependencies: + async: 2.6.4 + dev: false + + github.com/zardoy/minecraft-inventory-gui/c1331c91fb39bd562dc48eeb33321240d4870edd(@types/react@18.2.20)(react@18.2.0): + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/c1331c91fb39bd562dc48eeb33321240d4870edd} + id: github.com/zardoy/minecraft-inventory-gui/c1331c91fb39bd562dc48eeb33321240d4870edd + name: minecraft-inventory-gui + version: 1.0.1 + dependencies: + valtio: 1.11.2(@types/react@18.2.20)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + dev: true + + github.com/zardoy/minecraft-protocol/320088fcc115b4c500f8de66d0e3ae87efadcc15: + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/320088fcc115b4c500f8de66d0e3ae87efadcc15} + name: minecraft-protocol + version: 1.44.0 + engines: {node: '>=14'} + dependencies: + '@types/readable-stream': 4.0.2 + aes-js: 3.1.2 + buffer-equal: 1.0.1 + debug: 4.3.4(supports-color@8.1.1) + endian-toggle: 0.0.0 + lodash.get: 4.4.2 + lodash.merge: 4.6.2 + minecraft-data: 3.45.0 + minecraft-folder-path: 1.2.0 + node-fetch: 2.7.0 + node-rsa: 0.4.2 + prismarine-auth: 2.2.0 + prismarine-nbt: 2.2.1 + prismarine-realms: 1.3.2 + protodef: 1.15.0 + readable-stream: 4.4.2 + uuid-1345: 1.0.2 + yggdrasil: 1.7.0 + transitivePeerDependencies: + - encoding + - supports-color + + github.com/zardoy/mineflayer/08a79e7affa1ce82e1ac7aad177745665ed54572: + resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/08a79e7affa1ce82e1ac7aad177745665ed54572} + name: mineflayer + version: 4.13.0 + engines: {node: '>=14'} + dependencies: + minecraft-data: 3.45.0 + minecraft-protocol: github.com/zardoy/minecraft-protocol/320088fcc115b4c500f8de66d0e3ae87efadcc15 + prismarine-biome: 1.3.0(minecraft-data@3.45.0)(prismarine-registry@1.7.0) + prismarine-block: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-chat: 1.9.1 + prismarine-chunk: 1.35.0(minecraft-data@3.45.0) + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.2.1 + prismarine-physics: 1.8.0 + prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) + prismarine-registry: 1.7.0 + prismarine-windows: 2.8.0 + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + protodef: 1.15.0 + typed-emitter: 1.4.0 + vec3: 0.1.8 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-block/tar.gz/753cf1fe507f7647063c69d5c124d40f85b29cc2} + name: prismarine-block + version: 1.17.1 + dependencies: + minecraft-data: 3.45.0 + prismarine-biome: 1.3.0(minecraft-data@3.45.0)(prismarine-registry@1.7.0) + prismarine-chat: 1.9.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.2.1 + prismarine-registry: 1.7.0 + + github.com/zardoy/prismarine-provider-anvil/49bf8150422301565b386110aaf3dec69e31c4cf(minecraft-data@3.45.0): + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/49bf8150422301565b386110aaf3dec69e31c4cf} + id: github.com/zardoy/prismarine-provider-anvil/49bf8150422301565b386110aaf3dec69e31c4cf + name: prismarine-provider-anvil + version: 2.7.0 + dependencies: + prismarine-chunk: 1.35.0(minecraft-data@3.45.0) + prismarine-nbt: 2.2.1 + uint4: 0.1.2 + vec3: 0.1.8 + transitivePeerDependencies: + - minecraft-data + dev: false + + github.com/zardoy/prismarine-viewer/cfb88434c576b17cb270e04d2024f2ca24d6543e: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-viewer/tar.gz/cfb88434c576b17cb270e04d2024f2ca24d6543e} + name: prismarine-viewer + version: 1.25.0 + prepare: true + requiresBuild: true + dependencies: + '@tweenjs/tween.js': 20.0.3 + compression: 1.7.4 + express: 4.18.2 + minecraft-data: 3.45.0 + prismarine-block: github.com/zardoy/prismarine-block/753cf1fe507f7647063c69d5c124d40f85b29cc2 + prismarine-chunk: 1.35.0(minecraft-data@3.45.0) + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + socket.io: 4.7.2 + socket.io-client: 4.7.2 + three: 0.128.0 + three.meshline: 1.4.0 + vec3: 0.1.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-world/tar.gz/c358222204d21fe7d45379fbfcefb047f926c786} + name: prismarine-world + version: 3.6.2 + engines: {node: '>=8.0.0'} + dependencies: + vec3: 0.1.8 + + github.com/zardoy/prismarinejs-net-browserify/51262fe139a6a4856ffd4a6dc7b9145c3d6d8039: + resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/51262fe139a6a4856ffd4a6dc7b9145c3d6d8039} + name: net-browserify + version: 0.2.4 + dependencies: + body-parser: 1.20.2 + express: 4.18.2 + express-ws: 4.0.0(express@4.18.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + github.com/zardoy/space-squid/eec886b7a881eb40dd8efc6d48fa52e638e07693: + resolution: {tarball: https://codeload.github.com/zardoy/space-squid/tar.gz/eec886b7a881eb40dd8efc6d48fa52e638e07693} + name: flying-squid + version: 1.5.0 + engines: {node: '>=8'} + hasBin: true + dependencies: + change-case: 4.1.2 + colors: 1.4.0 + diamond-square: 1.2.0 + emit-then: 2.0.0 + event-promise: 0.0.1 + exit-hook: 2.2.1 + flatmap: 0.0.3 + long: 5.2.3 + minecraft-data: 3.45.0 + minecraft-protocol: github.com/zardoy/minecraft-protocol/320088fcc115b4c500f8de66d0e3ae87efadcc15 + moment: 2.29.4 + needle: 2.9.1 + node-gzip: 1.1.2 + prismarine-chunk: 1.35.0(minecraft-data@3.45.0) + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.2.1 + prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/49bf8150422301565b386110aaf3dec69e31c4cf(minecraft-data@3.45.0) + prismarine-windows: 2.8.0 + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + random-seed: 0.3.0 + range: 0.0.3 + readline: 1.3.0 + spiralloop: 1.0.2 + uuid-1345: 1.0.2 + vec3: 0.1.8 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 000000000..90cc36c4f --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,95 @@ +//@ts-check +const fsExtra = require('fs-extra') +const defaultLocalServerOptions = require('../src/defaultLocalServerOptions') +const glob = require('glob') +const fs = require('fs') +const crypto = require('crypto') +const path = require('path') + +const prismarineViewerBase = "./node_modules/prismarine-viewer" + +// these files could be copied at build time eg with copy plugin, but copy plugin slows down the config so we copy them there, alternative we could inline it in esbuild config +const filesToCopy = [ + { from: `${prismarineViewerBase}/public/blocksStates/`, to: 'dist/blocksStates/' }, + { from: `${prismarineViewerBase}/public/worker.js`, to: 'dist/worker.js' }, + { from: './assets/', to: './dist/' }, + { from: './config.json', to: 'dist/config.json' }, + { from: `${prismarineViewerBase}/public/textures/1.16.4/entity`, to: 'dist/textures/1.16.4/entity' }, +] +exports.filesToCopy = filesToCopy +exports.copyFiles = () => { + console.time('copy files') + // copy glob + const cwd = `${prismarineViewerBase}/public/textures/` + const files = glob.sync('*.png', { cwd: cwd, nodir: true, }) + for (const file of files) { + const copyDest = path.join('dist/textures/', file) + fs.mkdirSync(path.dirname(copyDest), { recursive: true, }) + fs.copyFileSync(path.join(cwd, file), copyDest) + } + + filesToCopy.forEach(file => { + fsExtra.copySync(file.from, file.to) + }) + + console.timeEnd('copy files') +} + +exports.copyFilesDev = () => { + if (fsExtra.existsSync('dist/config.json')) return + exports.copyFiles() +} + +exports.getSwAdditionalEntries = () => { + // need to be careful with this + const singlePlayerVersion = defaultLocalServerOptions.version + const filesToCachePatterns = [ + 'index.html', + 'index.js', + 'index.css', + 'favicon.ico', + `mc-data/${defaultLocalServerOptions.versionMajor}.js`, + `blocksStates/${singlePlayerVersion}.json`, + 'extra-textures/**', + // todo-low copy from assets + '*.mp3', + '*.ttf', + '*.png', + '*.woff', + 'worker.js', + // todo-low preload entity atlas? + `textures/${singlePlayerVersion}.png`, + `textures/1.16.4/entity/squid.png`, + ] + const filesNeedsCacheKey = [ + 'index.js', + 'index.css', + 'worker.js', + ] + const output = [] + console.log('Generating sw additional entries...') + for (const pattern of filesToCachePatterns) { + const files = glob.sync(pattern, { cwd: 'dist' }) + for (const file of files) { + const fullPath = path.join('dist', file) + if (!fs.lstatSync(fullPath).isFile()) continue + let revision = null + const url = './' + file.replace(/\\/g, '/') + if (filesNeedsCacheKey.includes(file)) { + const fileContents = fs.readFileSync(fullPath, 'utf-8') + const md5Hash = crypto.createHash('md5').update(fileContents).digest('hex') + revision = md5Hash + } + output.push({ url, revision }) + } + } + console.log(`Got ${output.length} additional sw entries to cache`) + return output +} + +const fn = require.main === module && exports[process.argv[2]] + +if (fn) { + const result = fn() + if (result) console.log(result) +} diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs new file mode 100644 index 000000000..d12c0a243 --- /dev/null +++ b/scripts/esbuildPlugins.mjs @@ -0,0 +1,260 @@ +//@ts-check + +import { polyfillNode } from 'esbuild-plugin-polyfill-node' +import { join, dirname } from 'path' +import * as fs from 'fs' +import { filesize } from 'filesize' + +const prod = process.argv.includes('--prod') +let connectedClients = [] + +/** @type {import('esbuild').Plugin[]} */ +const plugins = [ + { + name: 'strict-aliases', + setup (build) { + build.onResolve({ + filter: /^minecraft-protocol$/, + }, async ({ kind, resolveDir }) => { + return { + path: (await build.resolve('minecraft-protocol/src/index.js', { kind, resolveDir })).path, + } + }) + build.onResolve({ + filter: /^\.\/data.js$/, + }, ({ resolveDir, path }) => { + if (!resolveDir.endsWith('minecraft-data')) return + return { + namespace: 'load-global-minecraft-data', + path, + pluginData: { + resolveDir + }, + } + }) + build.onLoad({ + filter: /.+/, + namespace: 'load-global-minecraft-data', + }, ({ pluginData: { resolveDir } }) => { + const defaultVersionsObj = { + // default protocol data, needed for auto-select + "1.20.1": { + version: { + "minecraftVersion": "1.20.1", + "version": 763, + "majorVersion": "1.20" + }, + protocol: JSON.parse(fs.readFileSync(join(resolveDir, 'minecraft-data/data/pc/1.20/protocol.json'), 'utf8')), + } + } + return { + contents: `window.mcData ??= ${JSON.stringify(defaultVersionsObj)};module.exports = { pc: window.mcData }`, + loader: 'js', + } + }) + build.onResolve({ + filter: /^minecraft-assets$/, + }, () => { + throw new Error('hit banned package') + }) + } + }, + { + name: 'data-assets', + setup (build) { + const customMcDataNs = 'custom-mc-data' + + build.onResolve({ + filter: /.*/, + }, async ({ path, ...rest }) => { + if (join(rest.resolveDir, path).replaceAll('\\', '/').endsWith('minecraft-data/data.js')) { + throw new Error('Should not hit') + } + if (['.woff', '.woff2', '.ttf'].some(ext => path.endsWith(ext))) { + return { + path, + namespace: 'assets', + external: true, + } + } + }) + + build.onEnd(async ({ metafile, outputFiles }) => { + // write outputFiles + for (const file of outputFiles) { + // if (file.path.endsWith('index.js.map')) { + // const map = JSON.parse(file.text) + // map.sourcesContent = map.sourcesContent.map((c, index) => { + // if (map.sources[index].endsWith('.json')) return '' + // return c + // }) + // // data.sources = data.sources.filter(source => !source.endsWith('.json')) + // await fs.promises.writeFile(file.path, JSON.stringify(map), 'utf8') + // } else { + await fs.promises.writeFile(file.path, file.contents) + // } + } + if (!prod) return + // const deps = Object.entries(metafile.inputs).sort(([, a], [, b]) => b.bytes - a.bytes).map(([x, { bytes }]) => [x, filesize(bytes)]).slice(0, 5) + //@ts-ignore + const sizeByExt = {} + //@ts-ignore + Object.entries(metafile.inputs).sort(([, a], [, b]) => b.bytes - a.bytes).forEach(([x, { bytes }]) => { + const ext = x.slice(x.lastIndexOf('.')) + sizeByExt[ext] ??= 0 + sizeByExt[ext] += bytes + }) + console.log('Input size by ext:') + console.log(Object.fromEntries(Object.entries(sizeByExt).map(x => [x[0], filesize(x[1])]))) + }) + }, + }, + { + name: 'prevent-incorrect-linking', + setup (build) { + build.onResolve({ + filter: /.+/, + }, ({ resolveDir }) => { + // disallow imports from outside the root directory to ensure modules are resolved from node_modules of this workspace + if (!resolveDir.startsWith(process.cwd())) { + throw new Error(`Restricted import from outside the root directory: ${resolveDir}`) + } + return undefined + }) + } + }, + { + name: 'watch-notify', + setup (build) { + let count = 0 + let time + build.onStart(() => { + time = Date.now() + }) + build.onEnd(({ errors, outputFiles, metafile, warnings }) => { + const elapsed = Date.now() - time + // write metafile to disk if needed + // fs.writeFileSync('dist/meta.json', JSON.stringify(metafile, null, 2)) + console.log(`Done in ${elapsed}ms`) + if (count++ === 0) { + return + } + if (errors.length) { + connectedClients.forEach((res) => { + res.write(`data: ${JSON.stringify({ errors: errors.map(error => error.text) })}\n\n`) + res.flush() + }) + return + } + connectedClients.forEach((res) => { + res.write(`data: ${JSON.stringify({ update: { time: elapsed } })}\n\n`) + res.flush() + }) + connectedClients.length = 0 + }) + } + }, + { + name: 'esbuild-readdir', + setup (build) { + build.onResolve({ + filter: /^esbuild-readdir:.+$/, + }, ({ resolveDir, path }) => { + return { + namespace: 'esbuild-readdir', + path, + pluginData: { + resolveDir: join(resolveDir, path.replace(/^esbuild-readdir:/, '')) + }, + } + }) + build.onLoad({ + filter: /.+/, + namespace: 'esbuild-readdir', + }, async ({ pluginData }) => { + const { resolveDir } = pluginData + const files = await fs.promises.readdir(resolveDir) + return { + contents: `module.exports = ${JSON.stringify(files)}`, + resolveDir, + loader: 'js', + } + }) + } + }, + { + name: 'esbuild-import-glob', + setup (build) { + build.onResolve({ + filter: /^esbuild-import-glob\(path:(.+),skipFiles:(.+)\)+$/, + }, ({ resolveDir, path }) => { + return { + namespace: 'esbuild-import-glob', + path, + pluginData: { + resolveDir + }, + } + }) + build.onLoad({ + filter: /.+/, + namespace: 'esbuild-import-glob', + }, async ({ pluginData, path }) => { + const { resolveDir } = pluginData + //@ts-ignore + const [, userPath, skipFiles] = /^esbuild-import-glob\(path:(.+),skipFiles:(.+)\)+$/g.exec(path) + const files = (await fs.promises.readdir(join(resolveDir, userPath))).filter(f => !skipFiles.includes(f)) + return { + contents: `module.exports = { ${files.map(f => `'${f}': require('./${join(userPath, f)}')`).join(',')} }`, + resolveDir, + loader: 'js', + } + }) + } + }, + { + name: 'fix-dynamic-require', + setup (build) { + build.onResolve({ + filter: /1\.14\/chunk/, + }, async ({ resolveDir, path }) => { + if (!resolveDir.includes('prismarine-provider-anvil')) return + return { + namespace: 'fix-dynamic-require', + path, + pluginData: { + resolvedPath: `${join(resolveDir, path)}.js`, + resolveDir + }, + } + }) + build.onLoad({ + filter: /.+/, + namespace: 'fix-dynamic-require', + }, async ({ pluginData: { resolvedPath, resolveDir } }) => { + const resolvedFile = await fs.promises.readFile(resolvedPath, 'utf8') + return { + contents: resolvedFile.replace("require(`prismarine-chunk/src/pc/common/BitArray${noSpan ? 'NoSpan' : ''}`)", "noSpan ? require(`prismarine-chunk/src/pc/common/BitArray`) : require(`prismarine-chunk/src/pc/common/BitArrayNoSpan`)"), + resolveDir, + loader: 'js', + } + }) + } + }, + polyfillNode({ + polyfills: { + fs: false, + dns: false, + crypto: false, + events: false, + http: false, + stream: false, + buffer: false, + perf_hooks: false, + net: false, + assert: false, + }, + }) +] + +export { plugins, connectedClients as clients } diff --git a/scripts/gen-texturepack-files.mjs b/scripts/gen-texturepack-files.mjs new file mode 100644 index 000000000..d996236e3 --- /dev/null +++ b/scripts/gen-texturepack-files.mjs @@ -0,0 +1,52 @@ +//@ts-check +import fs from 'fs' +import minecraftAssets from 'minecraft-assets' + +// why store another data? +// 1. want to make it compatible (at least for now) +// 2. don't want to read generated blockStates as it might change in future, and the current way was faster to implement + +const blockNames = [] +const indexesPerVersion = {} +/** @type {Map} */ +const allBlocksMap = new Map() +const getBlockIndex = (block) => { + if (allBlocksMap.has(block)) { + return allBlocksMap.get(block) + } + + const index = blockNames.length + allBlocksMap.set(block, index) + blockNames.push(block) + return index +} + +// const blocksFull = [] +// const allBlocks = [] +// // we can even optimize it even futher by doing prev-step resolving +// const blocksDiff = {} + +for (const [i, version] of minecraftAssets.versions.reverse().entries()) { + const assets = minecraftAssets(version) + const blocksDir = assets.directory + '/blocks' + const blocks = fs.readdirSync(blocksDir) + indexesPerVersion[version] = blocks.map(block => { + if (!block.endsWith('.png')) return undefined + return getBlockIndex(block) + }).filter(i => i !== undefined) + + // if (!blocksFull.length) { + // // first iter + // blocksFull.push(...blocks) + // } else { + // const missing = blocksFull.map((b, i) => !blocks.includes(b) ? i : -1).filter(i => i !== -1) + // const added = blocks.filter(b => !blocksFull.includes(b)) + // blocksDiff[version] = { + // missing, + // added + // } + // } +} + +fs.mkdirSync('./generated', { recursive: true, }) +fs.writeFileSync('./generated/blocks.json', JSON.stringify({ blockNames: blockNames, indexes: indexesPerVersion })) diff --git a/scripts/patchPackages.js b/scripts/patchPackages.js deleted file mode 100644 index d75753f62..000000000 --- a/scripts/patchPackages.js +++ /dev/null @@ -1,25 +0,0 @@ -// @ts-check -const path = require('path') -const dataPath = path.join(require.resolve('minecraft-data'), '../data.js') - -const fs = require('fs') - -const lines = fs.readFileSync(dataPath, 'utf8').split('\n') -if (lines[0] === '//patched') { - console.log('Already patched') - process.exit(0) -} - -function removeLinesBetween (start, end) { - const startIndex = lines.findIndex(line => line === start) - if (startIndex === -1) return - const endIndex = startIndex + lines.slice(startIndex).findIndex(line => line === end) - // insert block comments - lines.splice(startIndex, 0, '/*') - lines.splice(endIndex + 2, 0, '*/') -} - -removeLinesBetween(" 'bedrock': {", ' }') - -lines.unshift('//patched') -fs.writeFileSync(dataPath, lines.join('\n'), 'utf8') diff --git a/scripts/prepareData.mjs b/scripts/prepareData.mjs new file mode 100644 index 000000000..1c5d62401 --- /dev/null +++ b/scripts/prepareData.mjs @@ -0,0 +1,61 @@ +//@ts-check +import { build } from 'esbuild' +import { existsSync } from 'node:fs' +import Module from "node:module" +import { dirname } from 'node:path' + +if (existsSync('dist/mc-data') && !process.argv.includes('-f')) { + console.log('using cached prepared data') + process.exit(0) +} + +const require = Module.createRequire(import.meta.url) + +const dataPaths = require('minecraft-data/minecraft-data/data/dataPaths.json') + +function toMajor (version) { + const [a, b] = (version + '').split('.') + return `${a}.${b}` +} + +const ignoredVersionsRegex = /(^0\.30c$)|w|-pre|-rc/ + +const grouped = {} + +for (const [version, data] of Object.entries(dataPaths.pc)) { + if (ignoredVersionsRegex.test(version)) continue + const major = toMajor(version) + grouped[major] ??= {} + grouped[major][version] = data +} + +console.log('preparing data') +console.time('data prepared') +let builds = [] +for (const [major, versions] of Object.entries(grouped)) { + let contents = 'Object.assign(window.mcData, {\n' + for (const [version, dataSet] of Object.entries(versions)) { + contents += ` '${version}': {\n` + for (const [dataType, dataPath] of Object.entries(dataSet)) { + const loc = `minecraft-data/data/${dataPath}/` + contents += ` get ${dataType} () { return require("./${loc}${dataType}.json") },\n` + } + contents += ' },\n' + } + contents += '})' + + const promise = build({ + bundle: true, + outfile: `dist/mc-data/${major}.js`, + stdin: { + contents, + + resolveDir: dirname(require.resolve('minecraft-data')), + sourcefile: `mcData${major}.js`, + loader: 'js', + }, + }) + builds.push(promise) +} +await Promise.all(builds) +console.timeEnd('data prepared') diff --git a/scripts/test-texturepack-files.mjs b/scripts/test-texturepack-files.mjs new file mode 100644 index 000000000..0446a2fe8 --- /dev/null +++ b/scripts/test-texturepack-files.mjs @@ -0,0 +1,16 @@ +import fs from 'fs' +import minecraftAssets from 'minecraft-assets' + +const gen = JSON.parse(fs.readFileSync('./blocks.json', 'utf8')) + +const version = '1.8.8' +const { blockNames, indexes } = gen + +const blocksActual = indexes[version].map((i) => blockNames[i]) + +const blocksExpected = fs.readdirSync(minecraftAssets(version).directory + '/blocks') +for (const [i, item] of blocksActual.entries()) { + if (item !== blocksExpected[i]) { + console.log('not equal at', i) + } +} diff --git a/scripts/updateGitPackages.mjs b/scripts/updateGitPackages.mjs new file mode 100644 index 000000000..14524587e --- /dev/null +++ b/scripts/updateGitPackages.mjs @@ -0,0 +1,26 @@ +// pnpm bug workaround +import fs from 'fs' +import { parse } from 'yaml' + +const lockfile = parse(fs.readFileSync('./pnpm-lock.yaml', 'utf8')) + +const depsKeys = ['dependencies', 'devDependencies'] + +for (const importer of Object.values(lockfile.importers)) { + for (const depsKey of depsKeys) { + for (const [depName, { specifier, version }] of Object.entries(importer[depsKey])) { + if (!specifier.startsWith('github:')) continue + let branch = specifier.match(/#(.*)$/)?.[1] ?? '' + if (branch) branch = `/${branch}` + const sha = version.split('/').slice(3).join('/').replace(/\(.+/, '') + const repo = version.split('/').slice(1, 3).join('/') + const lastCommitJson = await fetch(`https://api.github.com/repos/${repo}/commits${branch}?per_page=1`).then(res => res.json()) + const lastCommitActual = lastCommitJson ?? lastCommitJson[0] + const lastCommitActualSha = lastCommitActual?.sha + if (lastCommitActualSha === undefined) debugger + if (sha !== lastCommitActualSha) { + console.log(`Outdated ${depName} github.com/${repo} : ${sha} -> ${lastCommitActualSha} (${lastCommitActual.commit.message})`) + } + } + } +} diff --git a/server.js b/server.js index 6581a6b34..d89018c9d 100644 --- a/server.js +++ b/server.js @@ -4,12 +4,13 @@ const express = require('express') const netApi = require('net-browserify') const compression = require('compression') const path = require('path') +const cors = require('cors') +const https = require('https') +const fs = require('fs') // Create our app const app = express() -app.get('/config.json', (_, res) => res.sendFile(path.join(__dirname, 'config.json'))) - app.use(compression()) app.use(netApi({ allowOrigin: '*' })) if (process.argv[3] === 'dev') { @@ -25,10 +26,17 @@ if (process.argv[3] === 'dev') { }) ) } else { - app.use(express.static(path.join(__dirname, './public'))) + app.use(express.static(path.join(__dirname, './dist'))) } +const portArg = process.argv.indexOf('--port') +const port = (require.main === module ? process.argv[2] : portArg !== -1 ? process.argv[portArg + 1] : undefined) || 8080 + // Start the server -const server = app.listen(process.argv[2] === undefined ? 8080 : process.argv[2], function () { - console.log('Server listening on port ' + server.address().port) -}) +const server = process.argv.includes('--prod') ? + undefined : + app.listen(port, function () { + console.log('Server listening on port ' + server.address().port) + }) + +module.exports = { app } diff --git a/src/blockInteraction.js b/src/blockInteraction.js new file mode 100644 index 000000000..d8aa0dc82 --- /dev/null +++ b/src/blockInteraction.js @@ -0,0 +1,232 @@ +//@ts-check + +// wouldn't better to create atlas instead? +import destroyStage0 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_0.png' +import destroyStage1 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_1.png' +import destroyStage2 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_2.png' +import destroyStage3 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_3.png' +import destroyStage4 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_4.png' +import destroyStage5 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_5.png' +import destroyStage6 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_6.png' +import destroyStage7 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_7.png' +import destroyStage8 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_8.png' +import destroyStage9 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/destroy_stage_9.png' + +import { Vec3 } from 'vec3' +import { isGameActive } from './globalState' + +function getViewDirection (pitch, yaw) { + const csPitch = Math.cos(pitch) + const snPitch = Math.sin(pitch) + const csYaw = Math.cos(yaw) + const snYaw = Math.sin(yaw) + return new Vec3(-snYaw * csPitch, snPitch, -csYaw * csPitch) +} + +class BlockInteraction { + static instance = null + /** @type {null | {blockPos,mesh}} */ + interactionLines = null + + init () { + bot.on('physicsTick', () => { if (this.lastBlockPlaced < 4) this.lastBlockPlaced++ }) + + // Init state + this.buttons = [false, false, false] + this.lastButtons = [false, false, false] + this.breakStartTime = 0 + this.cursorBlock = null + + const loader = new THREE.TextureLoader() + this.breakTextures = [] + const destroyStagesImages = [ + destroyStage0, + destroyStage1, + destroyStage2, + destroyStage3, + destroyStage4, + destroyStage5, + destroyStage6, + destroyStage7, + destroyStage8, + destroyStage9 + ] + for (let i = 0; i < 10; i++) { + const texture = loader.load(destroyStagesImages[i]) + texture.magFilter = THREE.NearestFilter + texture.minFilter = THREE.NearestFilter + this.breakTextures.push(texture) + } + const breakMaterial = new THREE.MeshBasicMaterial({ + transparent: true, + blending: THREE.MultiplyBlending + }) + this.blockBreakMesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), breakMaterial) + this.blockBreakMesh.visible = false + this.blockBreakMesh.renderOrder = 999 + viewer.scene.add(this.blockBreakMesh) + + // Setup events + document.addEventListener('mouseup', (e) => { + this.buttons[e.button] = false + }) + + this.lastBlockPlaced = 4 // ticks since last placed + document.addEventListener('mousedown', (e) => { + if (e.isTrusted && !document.pointerLockElement) return + if (!isGameActive(true)) return + this.buttons[e.button] = true + + const entity = bot.nearestEntity((e) => { + if (e.position.distanceTo(bot.entity.position) <= (bot.game.gameMode === 'creative' ? 5 : 3)) { + const dir = getViewDirection(bot.entity.pitch, bot.entity.yaw) + const { width, height } = e + const { x: eX, y: eY, z: eZ } = e.position + const { x: bX, y: bY, z: bZ } = bot.entity.position + const box = new THREE.Box3( + new THREE.Vector3(eX - width / 2, eY, eZ - width / 2), + new THREE.Vector3(eX + width / 2, eY + height, eZ + width / 2) + ) + + const r = new THREE.Raycaster( + new THREE.Vector3(bX, bY + 1.52, bZ), + new THREE.Vector3(dir.x, dir.y, dir.z) + ) + const int = r.ray.intersectBox(box, new THREE.Vector3(eX, eY, eZ)) + return int !== null + } + + return false + }) + + if (entity) { + bot.attack(entity) + } + }) + } + + updateBlockInteractionLines (/** @type {Vec3 | null} */blockPos, /** @type {{position, width, height, depth}[]} */shapePositions = undefined) { + if (this.interactionLines !== null) { + viewer.scene.remove(this.interactionLines.mesh) + this.interactionLines = null + } + if (blockPos === null || (this.interactionLines && blockPos.equals(this.interactionLines.blockPos))) { + return + } + + const group = new THREE.Group() + for (const { position, width, height, depth } of shapePositions) { + const geometry = new THREE.BoxGeometry(1.001 * width, 1.001 * height, 1.001 * depth) + const mesh = new THREE.LineSegments(new THREE.EdgesGeometry(geometry), new THREE.LineBasicMaterial({ color: 0 })) + const pos = blockPos.plus(position) + mesh.position.set(pos.x, pos.y, pos.z) + group.add(mesh) + } + viewer.scene.add(group) + this.interactionLines = { blockPos, mesh: group } + } + + // todo this shouldnt be done in the render loop, migrate the code to dom events to avoid delays on lags + // eslint-disable-next-line complexity + update () { + const cursorBlock = bot.blockAtCursor(5) + let cursorBlockDiggable = cursorBlock + if (!bot.canDigBlock(cursorBlock) && bot.game.gameMode !== 'creative') cursorBlockDiggable = null + + let cursorChanged = !cursorBlock !== !this.cursorBlock + if (cursorBlock && this.cursorBlock) { + cursorChanged = !cursorBlock.position.equals(this.cursorBlock.position) + } + + // Place / interact + if (cursorBlock && this.buttons[2] && this.lastBlockPlaced >= 4) { + const vecArray = [new Vec3(0, -1, 0), new Vec3(0, 1, 0), new Vec3(0, 0, -1), new Vec3(0, 0, 1), new Vec3(-1, 0, 0), new Vec3(1, 0, 0)] + //@ts-expect-error + const delta = cursorBlock.intersect.minus(cursorBlock.position) + + // workaround so blocks can be activated with empty hand + const oldHeldItem = bot.heldItem + //@ts-expect-error + bot.heldItem = true + //@ts-expect-error + bot._placeBlockWithOptions(cursorBlock, vecArray[cursorBlock.face], { delta, forceLook: 'ignore' }).catch(console.warn) + bot.heldItem = oldHeldItem + this.lastBlockPlaced = 0 + } + + // Start break + // todo last check doesnt work as cursorChanged happens once (after that check is false) + if (cursorBlockDiggable && this.buttons[0] && (!this.lastButtons[0] || (cursorChanged && Date.now() - (this.lastDigged ?? 0) > 100))) { + this.breakStartTime = performance.now() + bot.dig(cursorBlock, 'ignore').catch((err) => { + if (err.message === 'Digging aborted') return + throw err + }) + this.lastDigged = Date.now() + } + + // Stop break + if (!this.buttons[0] && this.lastButtons[0]) { + try { + bot.stopDigging() // this shouldnt throw anything... + } catch (e) { } // to be reworked in mineflayer, then remove the try here + } + + // Show cursor + if (cursorBlock) { + const allShapes = [...cursorBlock.shapes, ...cursorBlock['interactionShapes'] ?? []] + this.updateBlockInteractionLines(cursorBlock.position, allShapes.map(shape => { + return getDataFromShape(shape) + })) + { + // union of all values + const breakShape = allShapes.reduce((acc, cur) => { + return [ + Math.min(acc[0], cur[0]), + Math.min(acc[1], cur[1]), + Math.min(acc[2], cur[2]), + Math.max(acc[3], cur[3]), + Math.max(acc[4], cur[4]), + Math.max(acc[5], cur[5]) + ] + }) + const { position, width, height, depth } = getDataFromShape(breakShape) + this.blockBreakMesh.scale.set(width * 1.001, height * 1.001, depth * 1.001) + position.add(cursorBlock.position) + this.blockBreakMesh.position.set(position.x, position.y, position.z) + } + } else { + this.updateBlockInteractionLines(null) + } + + // Show break animation + if (cursorBlockDiggable && this.buttons[0]) { + const elapsed = performance.now() - this.breakStartTime + const time = bot.digTime(cursorBlock) + const state = Math.floor((elapsed / time) * 10) + this.blockBreakMesh.material.map = this.breakTextures[state] + this.blockBreakMesh.visible = true + } else { + this.blockBreakMesh.visible = false + } + + // Update state + this.cursorBlock = cursorBlock + this.lastButtons[0] = this.buttons[0] + this.lastButtons[1] = this.buttons[1] + this.lastButtons[2] = this.buttons[2] + } +} + +const getDataFromShape = (shape) => { + const width = shape[3] - shape[0] + const height = shape[4] - shape[1] + const depth = shape[5] - shape[2] + const centerX = (shape[3] + shape[0]) / 2 + const centerY = (shape[4] + shape[1]) / 2 + const centerZ = (shape[5] + shape[2]) / 2 + const position = new Vec3(centerX, centerY, centerZ) + return { position, width, height, depth } +} + +export default new BlockInteraction() diff --git a/src/browserfs.ts b/src/browserfs.ts new file mode 100644 index 000000000..26316b58f --- /dev/null +++ b/src/browserfs.ts @@ -0,0 +1,289 @@ +//@ts-check +import { join } from 'path' +import { promisify } from 'util' +import fs from 'fs' +import { oneOf } from '@zardoy/utils' +import JSZip from 'jszip' +import * as browserfs from 'browserfs' +import { options } from './optionsStorage' + +import { fsState, loadSave } from './loadSave' +import { installTexturePack, updateTexturePackInstalledState } from './texturePack' + +browserfs.install(window) +// todo migrate to StorageManager API for localsave as localstorage has only 5mb limit, when localstorage is fallback test limit warning on 4mb +const deafultMountablePoints = { + '/world': { fs: 'LocalStorage' }, + '/userData': { fs: 'IndexedDB' }, +} +browserfs.configure({ + fs: 'MountableFileSystem', + options: deafultMountablePoints, +}, (e) => { + if (e) throw e + updateTexturePackInstalledState() +}) + +export const forceCachedDataPaths = {} + +//@ts-expect-error +fs.promises = new Proxy(Object.fromEntries(['readFile', 'writeFile', 'stat', 'mkdir', 'rmdir', 'unlink', 'rename', /* 'copyFile', */'readdir'].map(key => [key, promisify(fs[key])])), { + get(target, p: string, receiver) { + if (!target[p]) throw new Error(`Not implemented fs.promises.${p}`) + return (...args) => { + // browser fs bug: if path doesn't start with / dirname will return . which would cause infinite loop, so we need to normalize paths + if (typeof args[0] === 'string' && !args[0].startsWith('/')) args[0] = '/' + args[0] + // Write methods + // todo issue one-time warning (in chat I guess) + if (fsState.isReadonly) { + if (oneOf(p, 'readFile', 'writeFile') && forceCachedDataPaths[args[0]]) { + if (p === 'readFile') { + return Promise.resolve(forceCachedDataPaths[args[0]]) + } else if (p === 'writeFile') { + forceCachedDataPaths[args[0]] = args[1] + return Promise.resolve() + } + } + if (oneOf(p, 'writeFile', 'mkdir', 'rename')) return + } + if (p === 'open' && fsState.isReadonly) { + args[1] = 'r' // read-only, zipfs throw otherwise + } + return target[p](...args) + } + } +}) +//@ts-expect-error +fs.promises.open = async (...args) => { + const fd = await promisify(fs.open)(...args) + return { + ...Object.fromEntries(['read', 'write', 'close'].map(x => [x, async (...args) => { + return new Promise(resolve => { + // todo it results in world corruption on interactions eg block placements + if (x === 'write' && fsState.isReadonly) { + resolve({ buffer: Buffer.from([]), bytesRead: 0 }) + return + } + + fs[x](fd, ...args, (err, bytesRead, buffer) => { + if (err) throw err + // todo if readonly probably there is no need to open at all (return some mocked version - check reload)? + if (x === 'write' && !fsState.isReadonly && fsState.syncFs) { + // flush data, though alternatively we can rely on close in unload + fs.fsync(fd, () => { }) + } + resolve({ buffer, bytesRead }) + }) + }) + }])), + // for debugging + fd, + filename: args[0], + async close() { + return new Promise(resolve => { + fs.close(fd, (err) => { + if (err) { + throw err + } else { + resolve() + } + }) + }) + } + } +} + +// for testing purposes, todo move it to core patch +const removeFileRecursiveSync = (path) => { + for (const file of fs.readdirSync(path)) { + const curPath = join(path, file) + if (fs.lstatSync(curPath).isDirectory()) { + // recurse + removeFileRecursiveSync(curPath) + fs.rmdirSync(curPath) + } else { + // delete file + fs.unlinkSync(curPath) + } + } +} + +window.removeFileRecursiveSync = removeFileRecursiveSync + +// todo it still doesnt clean the storage, need to debug +export async function removeFileRecursiveAsync(path) { + const files = await fs.promises.readdir(path) + for (const file of files) { + const curPath = join(path, file) + const stats = await fs.promises.stat(curPath) + if (stats.isDirectory()) { + // Recurse + await removeFileRecursiveAsync(curPath) + } else { + // Delete file + await fs.promises.unlink(curPath) + } + } + await fs.promises.rmdir(path) +} + + +const SUPPORT_WRITE = true + +export const openWorldDirectory = async (dragndropHandle?: FileSystemDirectoryHandle) => { + let _directoryHandle: FileSystemDirectoryHandle + if (dragndropHandle) { + _directoryHandle = dragndropHandle + } else { + try { + _directoryHandle = await window.showDirectoryPicker() + } catch (err) { + if (err instanceof DOMException && err.name === 'AbortError') return + throw err + } + } + const directoryHandle = _directoryHandle + + const requestResult = SUPPORT_WRITE && !options.preferLoadReadonly ? await directoryHandle.requestPermission?.({ mode: 'readwrite' }) : undefined + const writeAccess = requestResult === 'granted' + + const doContinue = writeAccess || !SUPPORT_WRITE || options.disableLoadPrompts || confirm('Continue in readonly mode?') + if (!doContinue) return + await new Promise(resolve => { + browserfs.configure({ + // todo + fs: 'MountableFileSystem', + options: { + '/world': { + fs: 'FileSystemAccess', + options: { + handle: directoryHandle + } + } + }, + }, (e) => { + if (e) throw e + resolve() + }) + }) + + fsState.isReadonly = !writeAccess + fsState.syncFs = false + fsState.inMemorySave = false + loadSave() +} + +const tryToDetectResourcePack = async (file: File | ArrayBuffer) => { + const askInstall = async () => { + return alert('ATM You can install texturepacks only via options menu. WIll be fixed') + // if (confirm('Resource pack detected, do you want to install it?')) { + // await installTexturePack(file) + // } + } + + if (fs.existsSync('/world/pack.mcmeta')) { + askInstall() + return true + } + // const jszip = new JSZip() + // let loaded = await jszip.loadAsync(file) + // if (loaded.file('pack.mcmeta')) { + // loaded = null + // askInstall() + // return true + // } + // loaded = null +} + +export const possiblyCleanHandle = () => { + if (!fsState.saveLoaded) { + // todo clean handle + browserfs.configure({ + fs: 'MountableFileSystem', + options: deafultMountablePoints, + }, (e) => { + if (e) throw e + }) + } +} + +// todo rename method +const openWorldZipInner = async (file: File | ArrayBuffer, name = file['name']) => { + await new Promise(async resolve => { + browserfs.configure({ + // todo + fs: 'MountableFileSystem', + options: { + ...deafultMountablePoints, + '/world': { + fs: 'ZipFS', + options: { + zipData: Buffer.from(file instanceof File ? (await file.arrayBuffer()) : file), + name + } + } + }, + }, (e) => { + if (e) throw e + resolve() + }) + }) + + fsState.saveLoaded = false + fsState.isReadonly = true + fsState.syncFs = true + fsState.inMemorySave = false + + if (fs.existsSync('/world/level.dat')) { + await loadSave() + } else { + const dirs = fs.readdirSync('/world') + const availableWorlds: string[] = [] + for (const dir of dirs) { + if (fs.existsSync(`/world/${dir}/level.dat`)) { + availableWorlds.push(dir) + } + } + + if (availableWorlds.length === 0) { + if (await tryToDetectResourcePack(file)) return + alert('No worlds found in the zip') + return + } + + if (availableWorlds.length === 1) { + await loadSave(`/world/${availableWorlds[0]}`) + return + } + + alert(`Many (${availableWorlds.length}) worlds found in the zip!`) + // todo prompt picker + // const selectWorld + } +} + +export const openWorldZip = async (...args: Parameters) => { + try { + return await openWorldZipInner(...args) + } finally { + possiblyCleanHandle() + } +} + +export async function generateAndDownloadWorldZip() { + const zip = new JSZip() + + zip.folder('world') + + // Generate the ZIP archive content + const zipContent = await zip.generateAsync({ type: 'blob' }) + + // Create a download link and trigger the download + const downloadLink = document.createElement('a') + downloadLink.href = URL.createObjectURL(zipContent) + downloadLink.download = 'prismarine-world.zip' + downloadLink.click() + + // Clean up the URL object after download + URL.revokeObjectURL(downloadLink.href) +} diff --git a/src/builtinCommands.ts b/src/builtinCommands.ts new file mode 100644 index 000000000..4de46bd44 --- /dev/null +++ b/src/builtinCommands.ts @@ -0,0 +1,120 @@ +import fs from 'fs' +import { join } from 'path' +import JSZip from 'jszip' +import { fsState } from './loadSave' +import { closeWan, openToWanAndCopyJoinLink } from './localServerMultiplayer' + +const notImplemented = () => { + return 'Not implemented yet' +} + +async function addFolderToZip(folderPath, zip, relativePath) { + const entries = await fs.promises.readdir(folderPath) + + for (const entry of entries) { + const entryPath = join(folderPath, entry) + const stats = await fs.promises.stat(entryPath) + + const zipEntryPath = join(relativePath, entry) + + if (stats.isDirectory()) { + const subZip = zip.folder(zipEntryPath) + await addFolderToZip(entryPath, subZip, zipEntryPath) + } else { + const fileData = await fs.promises.readFile(entryPath) + zip.file(entry, fileData) + } + } +} + + +// todo include in help +const exportWorld = async () => { + // todo issue into chat warning if fs is writable! + const zip = new JSZip() + let { worldFolder } = localServer.options + if (!worldFolder.startsWith('/')) worldFolder = `/${worldFolder}` + await addFolderToZip(worldFolder, zip, '') + + // Generate the ZIP archive content + const zipContent = await zip.generateAsync({ type: 'blob' }) + + // Create a download link and trigger the download + const downloadLink = document.createElement('a') + downloadLink.href = URL.createObjectURL(zipContent) + downloadLink.download = 'world-exported.zip' + downloadLink.click() + + // Clean up the URL object after download + URL.revokeObjectURL(downloadLink.href) +} + +window.exportWorld = exportWorld + +const writeText = (text) => { + bot._client.emit('chat', { + message: JSON.stringify({ text }) + }) +} + +const commands = [ + { + command: ['/download', '/export'], + invoke: exportWorld + }, + { + command: ['/publish', '/share'], + async invoke() { + const text = await openToWanAndCopyJoinLink(writeText) + if (text) writeText(text) + } + }, + { + command: ['/close'], + invoke() { + const text = closeWan() + if (text) writeText(text) + } + }, + { + command: '/reset-world -y', + async invoke() { + if (fsState.inMemorySave) return + // todo for testing purposes + sessionStorage.oldData = localStorage + console.log('World removed. Old data saved to sessionStorage.oldData') + localServer.quit() + // todo browserfs bug + fs.rmdirSync(localServer.options.worldFolder, { recursive: true }) + } + }, + { + command: ['/save'], + invoke() { + saveWorld() + } + } +] + +export const getBuiltinCommandsList = () => commands.flatMap(command => command.command) + +export const tryHandleBuiltinCommand = (message) => { + if (!localServer) return + + for (const command of commands) { + if (command.command.includes(message)) { + command.invoke() + return true + } + } +} + +export const saveWorld = async () => { + for (const player of localServer.players) { + await player.save() + } + const worlds = [localServer.overworld] + for (const world of worlds) { + await world.storageProvider.close() + } +} diff --git a/src/chat.js b/src/chat.js new file mode 100644 index 000000000..d62332487 --- /dev/null +++ b/src/chat.js @@ -0,0 +1,597 @@ +//@ts-check +import { repeat } from 'lit/directives/repeat.js' +import { classMap } from 'lit/directives/class-map.js' +import { LitElement, html, css } from 'lit' +import { isCypress } from './utils' +import { getBuiltinCommandsList, tryHandleBuiltinCommand } from './builtinCommands' +import { notification } from './menus/notification' +import { options } from './optionsStorage' +import { activeModalStack, hideCurrentModal, showModal, miscUiState } from './globalState' + +const styles = { + black: 'color:#000000', + dark_blue: 'color:#0000AA', + dark_green: 'color:#00AA00', + dark_aqua: 'color:#00AAAA', + dark_red: 'color:#AA0000', + dark_purple: 'color:#AA00AA', + gold: 'color:#FFAA00', + gray: 'color:#AAAAAA', + dark_gray: 'color:#555555', + blue: 'color:#5555FF', + green: 'color:#55FF55', + aqua: 'color:#55FFFF', + red: 'color:#FF5555', + light_purple: 'color:#FF55FF', + yellow: 'color:#FFFF55', + white: 'color:#FFFFFF', + bold: 'font-weight:900', + strikethrough: 'text-decoration:line-through', + underlined: 'text-decoration:underline', + italic: 'font-style:italic' +} + +function colorShadow (hex, dim = 0.25) { + const color = parseInt(hex.replace('#', ''), 16) + + const r = Math.trunc((color >> 16 & 0xFF) * dim) + const g = Math.trunc((color >> 8 & 0xFF) * dim) + const b = Math.trunc((color & 0xFF) * dim) + + const f = (c) => ('00' + c.toString(16)).slice(-2) + return `#${f(r)}${f(g)}${f(b)}` +} + +/** + * @typedef {{text;color?;italic?;underlined?;strikethrough?;bold?}} MessagePart + * @typedef {{parts: MessagePart[], id, fading?, faded}} Message + */ + +class ChatBox extends LitElement { + static get styles () { + return css` + .chat-wrapper { + position: fixed; + z-index: 10; + } + + .chat-messages-wrapper { + bottom: 40px; + padding: 4px; + padding-left: 0; + max-height: var(--chatHeight); + width: var(--chatWidth); + transform-origin: bottom left; + transform: scale(var(--chatScale)); + pointer-events: none; + } + + .chat-input-wrapper { + bottom: 1px; + width: calc(100% - 3px); + position: fixed; + left: 1px; + box-sizing: border-box; + background-color: rgba(0, 0, 0, 0); + } + .chat-input { + box-sizing: border-box; + width: 100%; + } + .chat-completions { + position: absolute; + /* position this bottom on top of parent */ + top: 0; + left: 0; + transform: translateY(-100%); + /* width: 150px; */ + display: flex; + padding: 0 2px; // input padding + width: 100%; + } + .input-mobile .chat-completions { + transform: none; + top: 15px; // input height + } + .chat-completions-pad-text { + pointer-events: none; + white-space: pre; + opacity: 0; + overflow: hidden; + } + .chat-completions-items { + background-color: rgba(0, 0, 0, 0.5); + display: flex; + flex-direction: column; + /* justify-content: flex-end; */ + /* probably would be better to replace with margin, not sure */ + padding: 2px; + max-height: 100px; + overflow: auto; + } + .chat-completions-items::-webkit-scrollbar { + width: 5px; + background-color: rgb(24, 24, 24); + } + .chat-completions-items::-webkit-scrollbar-thumb { + background-color: rgb(50, 50, 50); + } + .chat-completions-items > div { + cursor: pointer; + } + .chat-completions-items > div:hover { + text-shadow: 0px 0px 6px white; + } + .input-mobile .chat-completions-items { + justify-content: flex-start; + } + + .input-mobile { + top: 1px; + } + + .display-mobile { + top: 40px; + } + + .chat, .chat-input { + color: white; + font-size: 10px; + margin: 0px; + line-height: 100%; + text-shadow: 1px 1px 0px #3f3f3f; + font-family: mojangles, minecraft, monospace; + max-height: var(--chatHeight); + } + .chat { + pointer-events: none; + overflow: hidden; + width: 100%; + } + .chat.opened { + pointer-events: auto; + } + + input[type=text], #chatinput { + background-color: rgba(0, 0, 0, 0.5); + border: 1px solid rgba(0, 0, 0, 0); + outline: none; + pointer-events: auto; + /* styles reset */ + padding-top: 1px; + padding-bottom: 1px; + padding-left: 2px; + padding-right: 2px; + height: 15px; + } + + .chat-mobile-hidden { + width: 8px; + height: 0; + position: absolute; + display: block !important; + opacity: 0; + pointer-events: none; + } + .chat-mobile-hidden:nth-last-child(1) { + height: 8px; + } + + #chatinput:focus { + border-color: white; + } + + .chat-message { + display: flex; + padding-left: 4px; + background-color: rgba(0, 0, 0, 0.5); + } + + .chat-message-fadeout { + opacity: 1; + transition: all 3s; + } + + .chat-message-fade { + opacity: 0; + } + + .chat-message-faded { + transition: none !important; + } + + .chat.opened .chat-message { + opacity: 1 !important; + transition: none !important; + } + + .chat-message-part { + white-space: pre-wrap; + } + ` + } + + static get properties () { + return { + messages: { + type: Array + }, + completionItems: { + type: Array + }, + completePadText: { + type: String + } + } + } + + constructor () { + super() + this.chatHistoryPos = 0 + this.chatHistory = JSON.parse(window.sessionStorage.chatHistory || '[]') + this.completePadText = '' + this.messagesLimit = 200 + /** @type {string[]} */ + this.completionItemsSource = [] + /** @type {string[]} */ + this.completionItems = [] + this.completeRequestValue = '' + /** @type {Message[]} */ + this.messages = [{ + parts: [ + { + text: 'Welcome to prismarine-web-client! Chat appears here.', + } + ], + id: 0, + fading: true, + faded: true, + }] + } + + enableChat (initialText = '') { + if (this.inChat) { + hideCurrentModal() + return + } + + notification.show = false + const chat = this.shadowRoot.getElementById('chat-messages') + /** @type {HTMLInputElement} */ + // @ts-expect-error + const chatInput = this.shadowRoot.getElementById('chatinput') + + showModal(this) + + // Exit the pointer lock + document.exitPointerLock?.() + // Show extended chat history + chat.style.maxHeight = 'var(--chatHeight)' + chat.scrollTop = chat.scrollHeight // Stay bottom of the list + // handle / and other snippets + this.updateInputValue(initialText) + this.chatHistoryPos = this.chatHistory.length + // to show + this.requestUpdate() + setTimeout(() => { + // after component update display + chatInput.focus() + }) + } + + get inChat () { + return activeModalStack.some(m => m.elem === this) + } + + /** + * @param {import('minecraft-protocol').Client} client + */ + init (client) { + const chat = this.shadowRoot.getElementById('chat-messages') + /** @type {HTMLInputElement} */ + // @ts-expect-error + const chatInput = this.shadowRoot.getElementById('chatinput') + this.chatInput = chatInput + + // Show chat + chat.style.display = 'block' + + let savedCurrentValue + // Chat events + document.addEventListener('keydown', e => { + if (activeModalStack.at(-1)?.elem !== this) return + if (e.code === 'ArrowUp') { + if (this.chatHistoryPos === 0) return + if (this.chatHistoryPos === this.chatHistory.length) { + savedCurrentValue = chatInput.value + } + this.updateInputValue(this.chatHistory[--this.chatHistoryPos] || '') + } else if (e.code === 'ArrowDown') { + if (this.chatHistoryPos === this.chatHistory.length) return + this.updateInputValue(this.chatHistory[++this.chatHistoryPos] || savedCurrentValue || '') + } + }) + + document.addEventListener('keypress', e => { + if (!this.inChat && activeModalStack.length === 0) { + return false + } + + if (!this.inChat) return + + e.stopPropagation() + + if (e.code === 'Enter') { + const message = chatInput.value + if (message) { + this.chatHistory.push(message) + window.sessionStorage.chatHistory = JSON.stringify(this.chatHistory) + const builtinHandled = tryHandleBuiltinCommand(message) + if (!builtinHandled) { + client.write('chat', { message }) + } + } + hideCurrentModal() + } + }) + + this.hide = () => { + this.completionItems = [] + // Clear chat input + chatInput.value = '' + // Unfocus it + chatInput.blur() + // Hide extended chat history + chat.style.maxHeight = 'var(--chatHeight)' + chat.scrollTop = chat.scrollHeight // Stay bottom of the list + this.requestUpdate() + return 'custom' // custom hide + } + this.hide() + + client.on('chat', (packet) => { + // Handle new message + const fullmessage = JSON.parse(packet.message.toString()) + /** @type {MessagePart[]} */ + const msglist = [] + + const readMsg = (msg) => { + const styles = { + color: msg.color, + bold: !!msg.bold, + italic: !!msg.italic, + underlined: !!msg.underlined, + strikethrough: !!msg.strikethrough, + obfuscated: !!msg.obfuscated + } + + if (msg.text) { + msglist.push({ + ...msg, + text: msg.text, + ...styles + }) + } else if (msg.translate) { + const tText = window.loadedData.language[msg.translate] ?? msg.translate + + if (msg.with) { + const splitted = tText.split(/%s|%\d+\$s/g) + + let i = 0 + for (const [j, part] of splitted.entries()) { + msglist.push({ text: part, ...styles }) + + if (j + 1 < splitted.length) { + if (msg.with[i]) { + if (typeof msg.with[i] === 'string') { + readMsg({ + ...styles, + text: msg.with[i] + }) + } else { + readMsg({ + ...styles, + ...msg.with[i] + }) + } + } + i++ + } + } + } else { + msglist.push({ + ...msg, + text: tText, + ...styles + }) + } + } + + if (msg.extra) { + for (const ex of msg.extra) { + readMsg({ ...styles, ...ex }) + } + } + } + + readMsg(fullmessage) + + const lastId = this.messages.at(-1)?.id ?? 0 + this.messages = [...this.messages.slice(-this.messagesLimit), { + parts: msglist, + id: lastId + 1, + fading: false, + faded: false + }] + const message = this.messages.at(-1) + + chat.scrollTop = chat.scrollHeight // Stay bottom of the list + // fading + setTimeout(() => { + message.fading = true + this.requestUpdate() + setTimeout(() => { + message.faded = true + this.requestUpdate() + }, 3000) + }, 5000) + }) + // todo support hover content below, {action: 'show_text', contents: {text}}, and some other types + // todo remove + window.dummyMessage = () => { + client.emit('chat', { + message: '{"color":"yellow","translate":"multiplayer.player.joined","with":[{"insertion":"pviewer672","clickEvent":{"action":"suggest_command","value":"/tell pviewer672 "},"hoverEvent":{"action":"show_entity","contents":{"type":"minecraft:player","id":"ecd0eeb1-625e-3fea-b16e-cb449dcfa434","name":{"text":"pviewer672"}}},"text":"pviewer672"}]}', + position: 1, + sender: '00000000-0000-0000-0000-000000000000', + }) + } + // window.dummyMessage() + + chatInput.addEventListener('input', (e) => { + const completeValue = this.getCompleteValue() + this.completePadText = completeValue === '/' ? '' : completeValue + if (this.completeRequestValue === completeValue) { + const lastWord = chatInput.value.split(' ').at(-1) + this.completionItems = this.completionItemsSource.filter(i => i.startsWith(lastWord)) + return + } + this.completeRequestValue = '' + this.completionItems = [] + this.completionItemsSource = [] + if (options.autoRequestCompletions && this.getCompleteValue() === '/') { + void this.fetchCompletion() + } + }) + chatInput.addEventListener('keydown', (e) => { + if (e.code === 'Tab') { + if (this.completionItems.length) { + this.acceptComplete(this.completionItems[0]) + } else { + void this.fetchCompletion(chatInput.value) + } + e.preventDefault() + } + if (e.code === 'Space' && options.autoRequestCompletions && chatInput.value.startsWith('/')) { + // alternative we could just simply use keyup, but only with keydown we can display suggestions popup as soon as possible + void this.fetchCompletion(this.getCompleteValue(chatInput.value + ' ')) + } + }) + } + + getCompleteValue (value = this.chatInput.value) { + const valueParts = value.split(' ') + const lastLength = valueParts.at(-1).length + const completeValue = lastLength ? value.slice(0, -lastLength) : value + if (valueParts.length === 1 && value.startsWith('/')) return '/' + return completeValue + } + + async fetchCompletion (value = this.getCompleteValue()) { + this.completionItemsSource = [] + this.completionItems = [] + this.completeRequestValue = value + let items = await bot.tabComplete(value, true, true) + if (typeof items[0] === 'object') { + // @ts-expect-error + if (items[0].match) items = items.map(i => i.match) + } + if (value !== this.completeRequestValue) return + if (this.completeRequestValue === '/' && localServer) items = [...items, ...getBuiltinCommandsList()] + this.completionItems = items + this.completionItemsSource = items + } + + renderMessagePart (/** @type {MessagePart} */{ bold, color, italic, strikethrough, text, underlined }) { + const colorF = (color) => { + return color.trim().startsWith('#') ? `color:${color}` : styles[color] ?? undefined + } + + /** @type {string[]} */ + const applyStyles = [ + color ? colorF(color.toLowerCase()) + `; text-shadow: 1px 1px 0px ${colorShadow(colorF(color.toLowerCase()).replace('color:', ''))}` : styles.white, + italic && styles.italic, + bold && styles.bold, + italic && styles.italic, + underlined && styles.underlined, + strikethrough && styles.strikethrough + ].filter(Boolean) + + return html` + ${text} + ` + } + + renderMessage (/** @type {Message} */message) { + const classes = { + 'chat-message-fadeout': message.fading, + 'chat-message-fade': message.fading, + 'chat-message-faded': message.faded, + 'chat-message': true + } + + return html` +
  • + ${message.parts.map(msg => this.renderMessagePart(msg))} +
  • + ` + } + + updateInputValue (value) { + const { chatInput } = this + chatInput.value = value + chatInput.dispatchEvent(new Event('input')) + setTimeout(() => { + chatInput.setSelectionRange(value.length, value.length) + }, 0) + } + + auxInputFocus (fireKey) { + document.dispatchEvent(new KeyboardEvent('keydown', { code: fireKey })) + this.chatInput.focus() + } + + acceptComplete (item) { + const base = this.completeRequestValue === '/' ? '' : this.getCompleteValue() + this.updateInputValue(base + item) + // would be cool but disabled because some comands don't need args (like ping) + // // trigger next tab complete + // this.chatInput.dispatchEvent(new KeyboardEvent('keydown', { code: 'Space' })) + this.chatInput.focus() + } + + render () { + + return html` +
    +
    + + ${repeat(isCypress() ? [] : this.messages, (m) => m.id, (m) => this.renderMessage(m))} +
    +
    +
    +
    + ${this.completionItems.length ? html` +
    +
    ${this.completePadText}
    +
    + ${repeat(this.completionItems, (i) => i, (i) => html`
    this.acceptComplete(i)}>${i}
    `)} +
    +
    + ` : ''} + { + this.auxInputFocus('ArrowUp') + }}> + + { + this.auxInputFocus('ArrowDown') + }}> +
    +
    + ` + } +} + +window.customElements.define('chat-box', ChatBox) diff --git a/src/controls.ts b/src/controls.ts new file mode 100644 index 000000000..fe49a55dd --- /dev/null +++ b/src/controls.ts @@ -0,0 +1,330 @@ +//@ts-check + +import { Vec3 } from 'vec3' +import { proxy, subscribe } from 'valtio' + +import { ControMax } from 'contro-max/build/controMax' +import { CommandEventArgument, SchemaCommandInput } from 'contro-max/build/types' +import { stringStartsWith } from 'contro-max/build/stringUtils' +import { isGameActive, showModal, gameAdditionalState, activeModalStack, hideCurrentModal } from './globalState' +import { reloadChunks } from './utils' + +// doesnt seem to work for now +const customKeymaps = proxy(JSON.parse(localStorage.keymap || '{}')) +subscribe(customKeymaps, () => { + localStorage.keymap = JSON.parse(customKeymaps) +}) + +export const contro = new ControMax({ + commands: { + general: { + jump: ['Space', 'A'], + inventory: ['KeyE', 'X'], + drop: ['KeyQ', 'B'], + sneak: ['ShiftLeft', 'Right Stick'], + sprint: ['ControlLeft', 'Left Stick'], + nextHotbarSlot: [null, 'Left Bumper'], + prevHotbarSlot: [null, 'Right Bumper'], + attackDestroy: [null, 'Right Trigger'], + interactPlace: [null, 'Left Trigger'], + chat: [['KeyT', 'Enter'], null], + command: ['Slash', null], + }, + ui: { + back: [null/* 'Escape' */, 'B'], + click: [null, 'A'], + } + // waila: { + // showLookingBlockRecipe: ['Numpad3'], + // showLookingBlockUsages: ['Numpad4'] + // } + } satisfies Record>, + movementKeymap: 'WASD', + movementVector: '2d', + groupedCommands: { + general: { + switchSlot: ['Digits', []] + } + }, +}, { + target: document, + captureEvents() { + return bot && isGameActive(false) + }, + storeProvider: { + load: () => customKeymaps, + save() { }, + }, + gamepadPollingInterval: 10 +}) +export type Command = CommandEventArgument['command'] + +const setSprinting = (state: boolean) => { + bot.setControlState('sprint', state) + gameAdditionalState.isSprinting = state +} + +contro.on('movementUpdate', ({ vector, gamepadIndex }) => { + // gamepadIndex will be used for splitscreen in future + const coordToAction = [ + ['z', -1, 'forward'], + ['z', 1, 'back'], + ['x', -1, 'left'], + ['x', 1, 'right'], + ] as const + + const newState: Partial = {} + for (const [coord, v] of Object.entries(vector)) { + if (v === undefined || Math.abs(v) < 0.3) continue + // todo use raw values eg for slow movement + const mappedValue = v < 0 ? -1 : 1 + const foundAction = coordToAction.find(([c, mapV]) => c === coord && mapV === mappedValue)?.[2] + newState[foundAction] = true + } + + for (const key of ['forward', 'back', 'left', 'right'] as const) { + if (newState[key] === bot.controlState[key]) continue + const action = !!newState[key] + if (action && !isGameActive(true)) continue + bot.setControlState(key, action) + + if (key === 'forward') { + // todo workaround: need to refactor + if (action) { + contro.emit('trigger', { command: 'general.forward' } as any) + } else { + setSprinting(false) + } + } + } +}) + +let lastCommandTrigger = null as { command: string, time: number } | null + +const secondActionActivationTimeout = 300 +const secondActionCommands = { + 'general.jump'() { + toggleFly() + }, + 'general.forward'() { + setSprinting(true) + } +} + +// detect pause open, as ANY keyup event is not fired when you exit pointer lock (esc) +subscribe(activeModalStack, () => { + if (activeModalStack.length) { + // iterate over pressedKeys + for (const key of contro.pressedKeys) { + contro.pressedKeyOrButtonChanged({ code: key }, false) + } + } +}) + +const uiCommand = (command: Command) => { + if (command === 'ui.back') { + hideCurrentModal() + } else if (command === 'ui.click') { + // todo cursor + } +} + +const onTriggerOrReleased = (command: Command, pressed: boolean) => { + // always allow release! + if (pressed && !isGameActive(true)) { + uiCommand(command) + return + } + if (stringStartsWith(command, 'general')) { + // handle general commands + // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check + switch (command) { + case 'general.jump': + bot.setControlState('jump', pressed) + break + case 'general.sneak': + gameAdditionalState.isSneaking = pressed + bot.setControlState('sneak', pressed) + break + case 'general.sprint': + // todo add setting to change behavior + if (pressed) { + setSprinting(pressed) + } + break + case 'general.attackDestroy': + document.dispatchEvent(new MouseEvent(pressed ? 'mousedown' : 'mouseup', { button: 0 })) + break + case 'general.interactPlace': + document.dispatchEvent(new MouseEvent(pressed ? 'mousedown' : 'mouseup', { button: 2 })) + break + } + } +} + +// im still not sure, maybe need to refactor to handle in inventory instead +const alwaysHandledCommand = (command: Command) => { + if (command === 'general.inventory') { + if (activeModalStack.at(-1)?.reactType === 'inventory') { + hideCurrentModal() + } + } +} + +contro.on('trigger', ({ command }) => { + const willContinue = !isGameActive(true) + alwaysHandledCommand(command) + if (willContinue) return + + const secondActionCommand = secondActionCommands[command] + if (secondActionCommand) { + if (command === lastCommandTrigger?.command && Date.now() - lastCommandTrigger.time < secondActionActivationTimeout) { + const commandToTrigger = secondActionCommands[lastCommandTrigger.command] + commandToTrigger() + lastCommandTrigger = null + } else { + lastCommandTrigger = { + command, + time: Date.now(), + } + } + } + + onTriggerOrReleased(command, true) + + if (stringStartsWith(command, 'general')) { + // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check + switch (command) { + case 'general.inventory': + document.exitPointerLock?.() + showModal({ reactType: 'inventory' }) + break + case 'general.drop': + if (bot.heldItem) bot.tossStack(bot.heldItem) + break + case 'general.chat': + document.getElementById('hud').shadowRoot.getElementById('chat').enableChat() + break + case 'general.command': + document.getElementById('hud').shadowRoot.getElementById('chat').enableChat('/') + break + } + } +}) + +contro.on('release', ({ command }) => { + onTriggerOrReleased(command, false) +}) + +// hard-coded keybindings + +const hardcodedPressedKeys = new Set() +document.addEventListener('keydown', (e) => { + if (hardcodedPressedKeys.has('F3')) { + // reload chunks + if (e.code === 'KeyA') { + //@ts-expect-error + const loadedChunks = Object.entries(worldView.loadedChunks).filter(([, v]) => v).map(([key]) => key.split(',').map(Number)) + for (const [x, z] of loadedChunks) { + worldView.unloadChunk({ x, z }) + } + reloadChunks() + } + } + + if (hardcodedPressedKeys.has(e.code)) return + hardcodedPressedKeys.add(e.code) +}) +document.addEventListener('keyup', (e) => { + hardcodedPressedKeys.delete(e.code) +}) + +// #region creative fly +// these controls are more like for gamemode 3 + +const makeInterval = (fn, interval) => { + const intervalId = setInterval(fn, interval) + + const cleanup = () => { + clearInterval(intervalId) + cleanup.active = false + } + cleanup.active = true + return cleanup +} + +const isFlying = () => bot.physics.gravity === 0 +let endFlyLoop: ReturnType | undefined + +const currentFlyVector = new Vec3(0, 0, 0) +window.currentFlyVector = currentFlyVector + +const startFlyLoop = () => { + if (!isFlying()) return + endFlyLoop?.() + + endFlyLoop = makeInterval(() => { + if (!window.bot) endFlyLoop() + bot.entity.position.add(currentFlyVector.clone().multiply(new Vec3(0, 0.5, 0))) + }, 50) +} + +// todo we will get rid of patching it when refactor controls +let originalSetControlState +const patchedSetControlState = (action, state) => { + if (!isFlying()) { + return originalSetControlState(action, state) + } + + const actionPerFlyVector = { + jump: new Vec3(0, 1, 0), + sneak: new Vec3(0, -1, 0), + } + + const changeVec = actionPerFlyVector[action] + if (!changeVec) { + return originalSetControlState(action, state) + } + const toAddVec = changeVec.scaled(state ? 1 : -1) + for (const coord of ['x', 'y', 'z']) { + if (toAddVec[coord] === 0) continue + if (currentFlyVector[coord] === toAddVec[coord]) return + } + currentFlyVector.add(toAddVec) +} + +const standardAirborneAcceleration = 0.02 +const toggleFly = () => { + if (bot.game.gameMode !== 'creative' && bot.game.gameMode !== 'spectator') return + if (bot.setControlState !== patchedSetControlState) { + originalSetControlState = bot.setControlState + bot.setControlState = patchedSetControlState + } + + if (isFlying()) { + bot.physics['airborneAcceleration'] = standardAirborneAcceleration + bot.creative.stopFlying() + endFlyLoop?.() + } else { + // window.flyingSpeed will be removed + bot.physics['airborneAcceleration'] = window.flyingSpeed ?? 0.1 + bot.entity.velocity = new Vec3(0, 0, 0) + bot.creative.startFlying() + startFlyLoop() + } + gameAdditionalState.isFlying = isFlying() +} +// #endregion +addEventListener('mousedown', async (e) => { + if (!bot) return + // wheel click + // todo support ctrl+wheel (+nbt) + if (e.button === 1) { + const block = bot.blockAtCursor(5) + if (!block) return + const Item = require('prismarine-item')(bot.version) + const item = new Item(block.type, 1, 0) + await bot.creative.setInventorySlot(bot.inventory.hotbarStart + bot.quickBarSlot, item) + bot.updateHeldItem() + } +}) diff --git a/src/createLocalServer.ts b/src/createLocalServer.ts new file mode 100644 index 000000000..0ea0e31c2 --- /dev/null +++ b/src/createLocalServer.ts @@ -0,0 +1,16 @@ +//@ts-check +import mcServer from 'flying-squid' +import serverOptions from './defaultLocalServerOptions' +import { LocalServer } from './customServer' + +export const startLocalServer = () => { + const passOptions = { ...serverOptions, Server: LocalServer } + const server = mcServer.createMCServer(passOptions) + server.formatMessage = (message) => `[server] ${message}` + server.options = passOptions + return server +} + +// features that flying-squid doesn't support at all +// todo move & generate in flying-squid +export const unsupportedLocalServerFeatures = ['transactionPacketExists', 'teleportUsesOwnPacket', 'dimensionDataIsAvailable'] diff --git a/src/crypto.js b/src/crypto.js new file mode 100644 index 000000000..9034a3973 --- /dev/null +++ b/src/crypto.js @@ -0,0 +1,2 @@ +export * from 'crypto-browserify' +export function createPublicKey () { } diff --git a/src/customClient.js b/src/customClient.js new file mode 100644 index 000000000..9bdc725b3 --- /dev/null +++ b/src/customClient.js @@ -0,0 +1,76 @@ +import { options } from './optionsStorage' + +//@ts-check +const { EventEmitter } = require('events') +const debug = require('debug')('minecraft-protocol') +const states = require('minecraft-protocol/src/states') + +window.serverDataChannel ??= {} +export const customCommunication = { + sendData (data) { + setTimeout(() => { + window.serverDataChannel[this.isServer ? 'emitClient' : 'emitServer'](data) + }) + }, + receiverSetup (processData) { + window.serverDataChannel[this.isServer ? 'emitServer' : 'emitClient'] = (data) => { + processData(data) + } + } +} + +class CustomChannelClient extends EventEmitter { + constructor (isServer, version) { + super() + this.version = version + this.isServer = !!isServer + this.state = states.HANDSHAKING + } + + get state () { + return this.protocolState + } + + setSerializer (state) { + customCommunication.receiverSetup.call(this, (/** @type {{name, params, state?}} */parsed) => { + if (!options.excludeCommunicationDebugEvents.includes(parsed.name)) { + debug(`receive in ${this.isServer ? 'server' : 'client'}: ${parsed.name}`) + } + this.emit(parsed.name, parsed.params, parsed) + this.emit('packet_name', parsed.name, parsed.params, parsed) + }) + } + + // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures, grouped-accessor-pairs + set state (newProperty) { + const oldProperty = this.protocolState + this.protocolState = newProperty + + this.setSerializer(this.protocolState) + + this.emit('state', newProperty, oldProperty) + } + + end (reason) { + this._endReason = reason + } + + write (name, params) { + if(!options.excludeCommunicationDebugEvents.includes(name)) { + debug(`[${this.state}] from ${this.isServer ? 'server' : 'client'}: ` + name) + debug(params) + } + + customCommunication.sendData.call(this, { name, params, state: this.state }) + } + + writeBundle (packets) { + // no-op + } + + writeRaw (buffer) { + // no-op + } +} + +export default CustomChannelClient diff --git a/src/customServer.ts b/src/customServer.ts new file mode 100644 index 000000000..e1e2d5402 --- /dev/null +++ b/src/customServer.ts @@ -0,0 +1,20 @@ +import EventEmitter from 'events' + +import CustomChannelClient from './customClient' + +export class LocalServer extends EventEmitter.EventEmitter { + socketServer = null + cipher = null + decipher = null + clients = {} + + constructor(public version, public customPackets, public hideErrors = false) { + super() + } + + listen() { + this.emit('connection', new CustomChannelClient(true, this.version)) + } + + close() { } +} diff --git a/src/defaultLocalServerOptions.js b/src/defaultLocalServerOptions.js new file mode 100644 index 000000000..8e2946164 --- /dev/null +++ b/src/defaultLocalServerOptions.js @@ -0,0 +1,38 @@ +module.exports = { + 'motd': 'A Minecraft Server \nRunning flying-squid', + // host: '', + // eslint-disable-next-line unicorn/numeric-separators-style + 'port': 25565, + 'max-players': 10, + 'online-mode': false, + 'gameMode': 0, + 'difficulty': 0, + 'worldFolder': 'world', + // todo set sid, disable entities auto-spawn + 'generation': { + // grass_field + // diamond_square + // empty + // superflat + // all_the_blocks + // nether + 'name': 'diamond_square', + options: {} + // 'options': { + // 'worldHeight': 80 + // } + }, + 'kickTimeout': 10_000, + 'plugins': {}, + 'modpe': false, + 'view-distance': 2, + 'player-list-text': { + 'header': 'Flying squid', + 'footer': 'Test server' + }, + keepAlive: false, + 'everybody-op': true, + 'max-entities': 100, + 'version': '1.14.4', + versionMajor: '1.14' +} diff --git a/lib/dns.js b/src/dns.js similarity index 91% rename from lib/dns.js rename to src/dns.js index be7206ae3..0bbe5320d 100644 --- a/lib/dns.js +++ b/src/dns.js @@ -10,7 +10,7 @@ module.exports.resolveSrv = function (hostname, callback) { Http.send() Http.onload = function () { - const response = Http.response + const { response } = Http if (response.Status === 3) { const err = new Error('querySrv ENOTFOUND') err.code = 'ENOTFOUND' @@ -24,7 +24,7 @@ module.exports.resolveSrv = function (hostname, callback) { return } const willreturn = [] - response.Answer.forEach(function (object) { + for (const object of response.Answer) { const data = object.data.split(' ') willreturn.push({ priority: data[0], @@ -32,7 +32,7 @@ module.exports.resolveSrv = function (hostname, callback) { port: data[2], name: data[3] }) - }) + } console.log(willreturn) callback(null, willreturn) } diff --git a/src/downloadAndOpenFile.ts b/src/downloadAndOpenFile.ts new file mode 100644 index 000000000..66e2cbd5b --- /dev/null +++ b/src/downloadAndOpenFile.ts @@ -0,0 +1,75 @@ +import prettyBytes from 'pretty-bytes' +import { openWorldZip } from './browserfs' +import { getResourcePackName, installTexturePack, resourcePackState, updateTexturePackInstalledState } from './texturePack' +import { setLoadingScreenStatus } from './utils' + +const getConstantFilesize = (bytes: number) => { + return prettyBytes(bytes, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) +} + +export default async () => { + const qs = new URLSearchParams(window.location.search) + let mapUrl = qs.get('map') + const texturepack = qs.get('texturepack') + // fixme + if (texturepack) mapUrl = texturepack + if (!mapUrl) return false + + if (texturepack) { + await updateTexturePackInstalledState() + if (resourcePackState.resourcePackInstalled) { + if (!confirm(`You are going to install a new texturepack which would override a current one: ${await getResourcePackName()} Continue?`)) return + } + } else { + const menu = document.getElementById('play-screen') + menu.style = 'display: none;' + } + const name = mapUrl.slice(mapUrl.lastIndexOf('/') + 1).slice(-25) + const downloadThing = texturepack ? 'texturepack' : 'world' + setLoadingScreenStatus(`Downloading ${downloadThing} ${name}...`) + + const response = await fetch(mapUrl) + const contentType = response.headers.get('Content-Type') + if (!contentType || !contentType.startsWith('application/zip')) { + alert('Invalid map file') + } + const contentLength = +response.headers.get('Content-Length') + setLoadingScreenStatus(`Downloading ${downloadThing} ${name}: have to download ${getConstantFilesize(contentLength)}...`) + + let downloadedBytes = 0 + const buffer = await new Response( + new ReadableStream({ + async start(controller) { + const reader = response.body.getReader() + + // eslint-disable-next-line no-constant-condition + while (true) { + const { done, value } = await reader.read() + + if (done) { + controller.close() + break + } + + downloadedBytes += value.byteLength + + // Calculate download progress as a percentage + const progress = (downloadedBytes / contentLength) * 100 + + // Update your progress bar or display the progress value as needed + if (contentLength) { + setLoadingScreenStatus(`Download ${downloadThing} progress: ${Math.floor(progress)}% (${getConstantFilesize(downloadedBytes)} / ${getConstantFilesize(contentLength)}))`, false, true) + } + + // Pass the received data to the controller + controller.enqueue(value) + } + }, + }) + ).arrayBuffer() + if (texturepack) { + await installTexturePack(buffer) + } else { + await openWorldZip(buffer) + } +} diff --git a/src/dragndrop.ts b/src/dragndrop.ts new file mode 100644 index 000000000..46a20788c --- /dev/null +++ b/src/dragndrop.ts @@ -0,0 +1,55 @@ +import { promisify } from 'util' +import * as nbt from 'prismarine-nbt' +import { showNotification } from './menus/notification' +import { openWorldDirectory, openWorldZip } from './browserfs' +import { isGameActive } from './globalState' + +const parseNbt = promisify(nbt.parse) +window.nbt = nbt + +// todo display drop zone +for (const event of ['drag', 'dragstart', 'dragend', 'dragover', 'dragenter', 'dragleave', 'drop']) { + window.addEventListener(event, (e: any) => { + if (e.dataTransfer && !e.dataTransfer.types.includes('Files')) { + // e.dataTransfer.effectAllowed = "none" + return + } + e.preventDefault() + }) +} +window.addEventListener('drop', async e => { + if (!e.dataTransfer?.files.length) return + const { items } = e.dataTransfer + const item = items[0] + if (item.getAsFileSystemHandle) { + const filehandle = await item.getAsFileSystemHandle() as FileSystemFileHandle | FileSystemDirectoryHandle + if (filehandle.kind === 'file') { + const file = await filehandle.getFile() + + await handleDroppedFile(file) + } else { + if (isGameActive(false)) { + alert('Exit current world first, before loading a new one.') + return + } + await openWorldDirectory(filehandle ) + } + } else { + await handleDroppedFile(item.getAsFile()) + } +}) + +async function handleDroppedFile(file: File) { + if (file.name.endsWith('.zip')) { + openWorldZip(file) + return + } + + const buffer = await file.arrayBuffer() + const parsed = await parseNbt(Buffer.from(buffer)) + showNotification({ + message: `${file.name} data available in browser console`, + }) + console.log('raw', parsed) + console.log('simplified', nbt.simplify(parsed)) +} diff --git a/src/eruda.js b/src/eruda.js new file mode 100644 index 000000000..61de59649 --- /dev/null +++ b/src/eruda.js @@ -0,0 +1,6 @@ +import { isMobile } from './menus/components/common' + +if (process.env.NODE_ENV === 'development' && isMobile()) { + require('eruda').default.init() + console.log('JS Loaded in', Date.now() - window.startLoad) +} diff --git a/src/globalState.ts b/src/globalState.ts new file mode 100644 index 000000000..42cc0bf88 --- /dev/null +++ b/src/globalState.ts @@ -0,0 +1,161 @@ +//@ts-check + +import { proxy, ref, subscribe } from 'valtio' +import { pointerLock } from './utils' +import { options } from './optionsStorage' + +// todo: refactor structure with support of hideNext=false + +type Modal = ({ elem?: HTMLElement & Record } & { reactType?: string }) + +type ContextMenuItem = { callback; label } + +export const activeModalStack: Modal[] = proxy([]) + +export const replaceActiveModalStack = (name: string, newModalStack = activeModalStacks[name]) => { + hideModal(undefined, undefined, { restorePrevious: false, force: true }) + activeModalStack.splice(0, activeModalStack.length, ...newModalStack) + // todo restore previous +} + +export const activeModalStacks: Record = {} + +window.activeModalStack = activeModalStack + +export const customDisplayManageKeyword = 'custom' + +const defaultModalActions = { + show(modal: Modal) { + if (modal.elem) modal.elem.style.display = 'block' + }, + hide(modal: Modal) { + if (modal.elem) modal.elem.style.display = 'none' + } +} + +/** + * @returns true if operation was successful + */ +const showModalInner = (modal: Modal) => { + const cancel = modal.elem?.show?.() + if (cancel && cancel !== customDisplayManageKeyword) return false + if (cancel !== 'custom') defaultModalActions.show(modal) + return true +} + +export const showModal = (elem: (HTMLElement & Record) | { reactType: string }) => { + const resolved = elem instanceof HTMLElement ? { elem: ref(elem) } : elem + const curModal = activeModalStack.at(-1) + if (elem === curModal?.elem || !showModalInner(resolved)) return + if (curModal) defaultModalActions.hide(curModal) + activeModalStack.push(resolved) +} + +/** + * + * @returns true if previous modal was restored + */ +export const hideModal = (modal = activeModalStack.at(-1), data: any = undefined, options: { force?: boolean; restorePrevious?: boolean } = {}) => { + const { force = false, restorePrevious = true } = options + if (!modal) return + let cancel = modal.elem?.hide?.(data) + if (force && cancel !== customDisplayManageKeyword) { + cancel = undefined + } + + if (!cancel || cancel === customDisplayManageKeyword) { + if (cancel !== customDisplayManageKeyword) defaultModalActions.hide(modal) + activeModalStack.pop() + const newModal = activeModalStack.at(-1) + if (newModal && restorePrevious) { + // would be great to ignore cancel I guess? + showModalInner(newModal) + } + return true + } +} + +export const hideCurrentModal = (_data = undefined, restoredActions = undefined) => { + if (hideModal(undefined, undefined)) { + restoredActions?.() + if (activeModalStack.length === 0) { + if (isGameActive(false)) { + pointerLock.requestPointerLock() + } else { + showModal(document.getElementById('title-screen')) + } + } + } +} + +// --- + +export const currentContextMenu = proxy({ items: [] as ContextMenuItem[] | null, x: 0, y: 0 }) + +export const showContextmenu = (items: ContextMenuItem[], { clientX, clientY }) => { + Object.assign(currentContextMenu, { + items, + x: clientX, + y: clientY, + }) +} + +// --- + +export const miscUiState = proxy({ + currentDisplayQr: null as string | null, + currentTouch: null as boolean | null, + singleplayer: false, + flyingSquid: false, + wanOpened: false, + gameLoaded: false, +}) + +export const isGameActive = (foregroundCheck: boolean) => { + if (foregroundCheck && activeModalStack.length) return false + return miscUiState.gameLoaded +} + +window.miscUiState = miscUiState + +// state that is not possible to get via bot and in-game specific +export const gameAdditionalState = proxy({ + isFlying: false, + isSprinting: false, + isSneaking: false, +}) + +window.gameAdditionalState = gameAdditionalState + +const savePlayers = () => { + if (!window.localServer) return + for (const player of window.localServer.players) { + player.save() + } +} + +setInterval(() => { + savePlayers() + // todo investigate unload failures instead +}, 2000) + +window.addEventListener('unload', (e) => { + savePlayers() +}) + +window.inspectPlayer = () => require('fs').promises.readFile('/world/playerdata/9e487d23-2ffc-365a-b1f8-f38203f59233.dat').then(window.nbt.parse).then(console.log) + +// todo move from global state +window.addEventListener('beforeunload', (event) => { + // todo-low maybe exclude chat? + if (!isGameActive(true) && activeModalStack.at(-1)?.elem.id !== 'chat') return + if (sessionStorage.lastReload && !options.preventDevReloadWhilePlaying) return + if (!options.closeConfirmation) return + + // For major browsers doning only this is enough + event.preventDefault() + + // Display a confirmation prompt + event.returnValue = '' // Required for some browsers + return 'The game is running. Are you sure you want to close this page?' +}) diff --git a/src/globals.d.ts b/src/globals.d.ts new file mode 100644 index 000000000..641a85cff --- /dev/null +++ b/src/globals.d.ts @@ -0,0 +1,47 @@ +/// + +declare const THREE: typeof import('three') +// todo make optional +declare const bot: import('mineflayer').Bot +declare const viewer: import('prismarine-viewer/viewer/lib/viewer').Viewer | undefined +declare const worldView: import('prismarine-viewer/viewer/lib/worldView').WorldView | undefined +declare const localServer: any + +declare interface Document { + getElementById(id): any +} + +declare namespace JSX { + interface IntrinsicElements { + [elemName: string]: any + } +} + +declare interface DocumentFragment { + getElementById(id): HTMLElement & Record + querySelector(id): HTMLElement & Record +} + +declare interface Window extends Record { + +} + +type StringKeys = Extract + + +interface ObjectConstructor { + keys(obj: T): Array> + entries(obj: T): Array<[StringKeys, T[keyof T]]> + // todo review https://stackoverflow.com/questions/57390305/trying-to-get-fromentries-type-right + fromEntries>(obj: T): Record + assign, K extends Record>(target: T, source: K): asserts target is T & K +} + +declare module '*.css' { + const css: string + export default css +} +declare module '*.png' { + const png: string + export default png +} diff --git a/src/globals.js b/src/globals.js new file mode 100644 index 000000000..ecffcea2d --- /dev/null +++ b/src/globals.js @@ -0,0 +1,8 @@ +//@ts-nocheck + +window.bot = undefined +window.THREE = undefined +window.localServer = undefined +window.worldView = undefined +window.viewer = undefined +window.loadedData = undefined diff --git a/src/guessProblem.ts b/src/guessProblem.ts new file mode 100644 index 000000000..2ebdbfa6c --- /dev/null +++ b/src/guessProblem.ts @@ -0,0 +1,5 @@ +export const guessProblem = (/** @type {string} */errorMessage) => { + if (errorMessage.endsWith('Socket error: ECONNREFUSED')) { + return 'Most probably the server is not running.' + } +} diff --git a/src/importsWorkaround.js b/src/importsWorkaround.js new file mode 100644 index 000000000..33815d6b2 --- /dev/null +++ b/src/importsWorkaround.js @@ -0,0 +1,2 @@ +// workaround for mineflayer +process.versions.node = '18.0.0' diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..1dd929fc6 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,777 @@ +/* eslint-disable import/order */ +import './importsWorkaround' +import './styles.css' +import './globals' +import 'iconify-icon' +import './chat' +import './inventory' + +import './menus/components/button' +import './menus/components/edit_box' +import './menus/components/slider' +import './menus/components/hotbar' +import './menus/components/health_bar' +import './menus/components/food_bar' +import './menus/components/breath_bar' +import './menus/components/debug_overlay' +import './menus/components/playerlist_overlay' +import './menus/components/bossbars_overlay' +import './menus/hud' +import './menus/play_screen' +import './menus/pause_screen' +import './menus/loading_or_error_screen' +import './menus/keybinds_screen' +import './menus/options_screen' +import './menus/advanced_options_screen' +import { notification } from './menus/notification' +import './menus/title_screen' +import { initWithRenderer, statsEnd, statsStart } from './rightTopStats' + +import { options, watchValue } from './optionsStorage' +import './reactUi.jsx' +import { contro } from './controls' +import './dragndrop' +import './browserfs' +import './eruda' +import './watchOptions' +import downloadAndOpenFile from './downloadAndOpenFile' + +import net from 'net' +import mineflayer from 'mineflayer' +import { WorldView, Viewer } from 'prismarine-viewer/viewer' +import pathfinder from 'mineflayer-pathfinder' +import { Vec3 } from 'vec3' + +import blockInteraction from './blockInteraction' + +import * as THREE from 'three' + +import { initVR } from './vr' +import { + activeModalStack, + showModal, + hideCurrentModal, + activeModalStacks, + replaceActiveModalStack, + isGameActive, + miscUiState, + gameAdditionalState +} from './globalState' + +import { + pointerLock, + goFullscreen, isCypress, + loadScript, + toMajorVersion, + setLoadingScreenStatus, + setRenderDistance +} from './utils' + +import { + removePanorama, + addPanoramaCubeMap, + initPanoramaOptions +} from './panorama' + +import { startLocalServer, unsupportedLocalServerFeatures } from './createLocalServer' +import serverOptions from './defaultLocalServerOptions' +import updateTime from './updateTime' + +import { subscribeKey } from 'valtio/utils' +import _ from 'lodash-es' + +import { genTexturePackTextures, watchTexturepackInViewer } from './texturePack' +import { connectToPeer } from './localServerMultiplayer' +import CustomChannelClient from './customClient' +import debug from 'debug' + +window.debug = debug +window.THREE = THREE + +if ('serviceWorker' in navigator && !isCypress() && process.env.NODE_ENV !== 'development') { + window.addEventListener('load', () => { + navigator.serviceWorker.register('./service-worker.js').then(registration => { + console.log('SW registered:', registration) + }).catch(registrationError => { + console.log('SW registration failed:', registrationError) + }) + }) +} + +// ACTUAL CODE + +// Create three.js context, add to page +const renderer = new THREE.WebGLRenderer({ + powerPreference: options.highPerformanceGpu ? 'high-performance' : 'default', +}) +initWithRenderer(renderer.domElement) +window.renderer = renderer +renderer.setPixelRatio(window.devicePixelRatio || 1) // todo this value is too high on ios, need to check, probably we should use avg, also need to make it configurable +renderer.setSize(window.innerWidth, window.innerHeight) +renderer.domElement.id = 'viewer-canvas' +document.body.appendChild(renderer.domElement) + +// Create viewer +const viewer: import('prismarine-viewer/viewer/lib/viewer').Viewer = new Viewer(renderer) +window.viewer = viewer +initPanoramaOptions(viewer) +watchTexturepackInViewer(viewer) + +let renderInterval: number +watchValue(options, (o) => { + renderInterval = o.frameLimit && 1000 / o.frameLimit +}) + +let postRenderFrameFn = () => { } +let delta = 0 +let lastTime = performance.now() +const renderFrame = (time: DOMHighResTimeStamp) => { + if (window.stopLoop) return + window.requestAnimationFrame(renderFrame) + if (window.stopRender) return + if (renderInterval) { + delta += time - lastTime + lastTime = time + if (delta > renderInterval) { + delta %= renderInterval + // continue rendering + } else { + return + } + } + statsStart() + viewer.update() + renderer.render(viewer.scene, viewer.camera) + postRenderFrameFn() + statsEnd() +} +renderFrame(performance.now()) + +window.addEventListener('resize', () => { + viewer.camera.aspect = window.innerWidth / window.innerHeight + viewer.camera.updateProjectionMatrix() + renderer.setSize(window.innerWidth, window.innerHeight) +}) + +const loadingScreen = document.getElementById('loading-error-screen') + +const hud = document.getElementById('hud') +const pauseMenu = document.getElementById('pause-screen') + +let mouseMovePostHandle = (e) => { } +let lastMouseMove: number +let debugMenu +const updateCursor = () => { + blockInteraction.update() + debugMenu ??= hud.shadowRoot.querySelector('#debug-overlay') + debugMenu.cursorBlock = blockInteraction.cursorBlock +} +function onCameraMove(e) { + if (e.type !== 'touchmove' && !pointerLock.hasPointerLock) return + e.stopPropagation?.() + const now = performance.now() + // todo: limit camera movement for now to avoid unexpected jumps + if (now - lastMouseMove < 4) return + lastMouseMove = now + let { mouseSensX, mouseSensY } = options + if (mouseSensY === true) mouseSensY = mouseSensX + mouseMovePostHandle({ + x: e.movementX * mouseSensX * 0.0001, + y: e.movementY * mouseSensY * 0.0001 + }) + // todo do it also on every block update within radius 5 + updateCursor() +} +window.addEventListener('mousemove', onCameraMove, { capture: true }) + + +function hideCurrentScreens() { + activeModalStacks['main-menu'] = activeModalStack + replaceActiveModalStack('', []) +} + +async function main() { + const menu = document.getElementById('play-screen') + menu.addEventListener('connect', e => { + const options = e.detail + connect(options) + }) + const connectSingleplayer = (serverOverrides = {}) => { + // todo clean + connect({ server: '', port: '', proxy: '', singleplayer: true, username: options.localUsername, password: '', serverOverrides }) + } + document.querySelector('#title-screen').addEventListener('singleplayer', (e) => { + //@ts-expect-error + connectSingleplayer(e.detail) + }) + const qs = new URLSearchParams(window.location.search) + if (qs.get('singleplayer') === '1') { + // todo + setTimeout(() => { + connectSingleplayer() + }) + } +} + +let listeners = [] +let timeouts = [] +// only for dom listeners (no removeAllListeners) +// todo refactor them out of connect fn instead +const registerListener: import('./utilsTs').RegisterListener = (target, event, callback) => { + target.addEventListener(event, callback) + listeners.push({ target, event, callback }) +} +const removeAllListeners = () => { + for (const { target, event, callback } of listeners) { + target.removeEventListener(event, callback) + } + listeners = [] +} + +// todo +// eslint-disable-next-line complexity +async function connect(connectOptions: { + server: any; port?: string; singleplayer?: any; username: any; password: any; proxy: any; botVersion?: any; serverOverrides?; peerId?: string +}) { + const menu = document.getElementById('play-screen') + menu.style = 'display: none;' + removePanorama() + + const singeplayer = connectOptions.singleplayer + const p2pMultiplayer = !!connectOptions.peerId + miscUiState.singleplayer = singeplayer + miscUiState.flyingSquid = singeplayer || p2pMultiplayer + const oldSetTimeout = window.setTimeout + //@ts-expect-error + window.setTimeout = (callback, ms) => { + const id = oldSetTimeout.call(window, callback, ms) + timeouts.push(id) + return id + } + const { renderDistance, maxMultiplayerRenderDistance } = options + const hostprompt = connectOptions.server + const proxyprompt = connectOptions.proxy + const { username } = connectOptions + const { password } = connectOptions + + let host; let port; let proxy; let proxyport + if (hostprompt.includes(':')) { + [host, port] = hostprompt.split(':') + port = parseInt(port, 10) + } else { + host = hostprompt + port = 25_565 + } + + if (proxyprompt.includes(':')) { + [proxy, proxyport] = proxyprompt.split(':') + proxyport = parseInt(proxyport, 10) + } else { + proxy = proxyprompt + proxyport = undefined + } + console.log(`connecting to ${host} ${port} with ${username}`) + + setLoadingScreenStatus('Logging in') + + let bot: mineflayer.Bot + const destroyAll = () => { + viewer.resetAll() + window.localServer = undefined + + // simple variant, still buggy + postRenderFrameFn = () => { } + if (bot) { + bot.removeAllListeners() + bot._client.removeAllListeners() + bot._client = undefined + // for debugging + window._botDisconnected = undefined + window.bot = bot = undefined + } + removeAllListeners() + for (const timeout of timeouts) { + clearTimeout(timeout) + } + timeouts = [] + } + const handleError = (err) => { + console.log('Encountered error!', err) + + // #region rejoin key + const controller = new AbortController() + window.addEventListener('keydown', (e) => { + if (e.code !== 'KeyR') return + controller.abort() + connect(connectOptions) + loadingScreen.hasError = false + }, { signal: controller.signal }) + // #endregion + + setLoadingScreenStatus(`Error encountered. Error message: ${err}`, true) + destroyAll() + if (isCypress()) throw err + } + + const errorAbortController = new AbortController() + window.addEventListener('unhandledrejection', (e) => { + if (e.reason.name === 'ServerPluginLoadFailure') { + if (confirm(`Failed to load server plugin ${e.reason.pluginName} (invoking ${e.reason.pluginMethod}). Continue?`)) { + return + } + } + handleError(e.reason) + }, { + signal: errorAbortController.signal + }) + window.addEventListener('error', (e) => { + handleError(e.message) + }, { + signal: errorAbortController.signal + }) + + if (proxy) { + console.log(`using proxy ${proxy} ${proxyport}`) + + //@ts-expect-error + net.setProxy({ hostname: proxy, port: proxyport }) + } + + let localServer + try { + Object.assign(serverOptions, _.defaultsDeep({}, connectOptions.serverOverrides ?? {}, options.localServerOptions, serverOptions)) + serverOptions['view-distance'] = renderDistance + const downloadMcData = async (version) => { + setLoadingScreenStatus(`Downloading data for ${version}`) + try { + await genTexturePackTextures(version) + } catch (err) { + console.error(err) + const doContinue = prompt('Failed to apply texture pack. See errors in the console. Continue?') + if (!doContinue) { + setLoadingScreenStatus(undefined) + } + } + await loadScript(`./mc-data/${toMajorVersion(version)}.js`) + } + + const downloadVersion = connectOptions.botVersion || (singeplayer ? serverOptions.version : undefined) + if (downloadVersion) { + await downloadMcData(downloadVersion) + } + + if (singeplayer) { + // SINGLEPLAYER EXPLAINER: + // Note 1: here we have custom sync communication between server Client (flying-squid) and game client (mineflayer) + // Note 2: custom Server class is used which simplifies communication & Client creation on it's side + // local server started + // mineflayer.createBot (see source def) + // bot._client = bot._client ?? mc.createClient(options) <-- mc-protocol package + // tcpDns() skipped since we define connect option + // in setProtocol: we emit 'connect' here below so in that file we send set_protocol and login_start (onLogin handler) + // Client (class) of flying-squid (in server/login.js of mc-protocol): onLogin handler: skip most logic & go to loginClient() which assigns uuid and sends 'success' back to client (onLogin handler) and emits 'login' on the server (login.js in flying-squid handler) + // flying-squid: 'login' -> player.login -> now sends 'login' event to the client (handled in many plugins in mineflayer) -> then 'update_health' is sent which emits 'spawn' in mineflayer + + setLoadingScreenStatus('Starting local server') + localServer = window.localServer = startLocalServer() + // todo need just to call quit if started + // loadingScreen.maybeRecoverable = false + // init world, todo: do it for any async plugins + if (!localServer.pluginsReady) { + await new Promise(resolve => { + localServer.once('pluginsReady', resolve) + }) + } + } + + setLoadingScreenStatus('Creating mineflayer bot') + bot = mineflayer.createBot({ + host, + port, + version: connectOptions.botVersion || false, + ...p2pMultiplayer ? { + stream: await connectToPeer(connectOptions.peerId), + } : {}, + ...singeplayer || p2pMultiplayer ? { + keepAlive: false, + } : {}, + ...singeplayer ? { + version: serverOptions.version, + connect() { }, + Client: CustomChannelClient as any, + } : {}, + username, + password, + viewDistance: 'tiny', + checkTimeoutInterval: 240 * 1000, + noPongTimeout: 240 * 1000, + closeTimeout: 240 * 1000, + async versionSelectedHook(client) { + await downloadMcData(client.version) + setLoadingScreenStatus('Connecting to server') + } + }) + window.bot = bot + if (singeplayer || p2pMultiplayer) { + // p2pMultiplayer still uses the same flying-squid server + const _supportFeature = bot.supportFeature + bot.supportFeature = (feature) => { + if (unsupportedLocalServerFeatures.includes(feature)) { + return false + } + return _supportFeature(feature) + } + + bot.emit('inject_allowed') + bot._client.emit('connect') + } else { + const setupConnectHandlers = () => { + bot._client.socket.on('connect', () => { + console.log('TCP connection established') + //@ts-expect-error + bot._client.socket._ws.addEventListener('close', () => { + console.log('TCP connection closed') + setTimeout(() => { + if (bot) { + bot.emit('end', 'TCP connection closed with unknown reason') + } + }) + }) + }) + } + // socket setup actually can be delayed because of dns lookup + if (bot._client.socket) { + setupConnectHandlers() + } else { + const originalSetSocket = bot._client.setSocket.bind(bot._client) + bot._client.setSocket = (socket) => { + originalSetSocket(socket) + setupConnectHandlers() + } + } + + } + } catch (err) { + handleError(err) + } + if (!bot) return + + const p2pConnectTimeout = p2pMultiplayer ? setTimeout(() => { throw new Error('Spawn timeout. There might be error on other side, check console.') }, 20_000) : undefined + hud.preload(bot) + + // bot.on('inject_allowed', () => { + // loadingScreen.maybeRecoverable = false + // }) + + bot.on('error', handleError) + + bot.on('kicked', (kickReason) => { + console.log('User was kicked!', kickReason) + setLoadingScreenStatus(`The Minecraft server kicked you. Kick reason: ${kickReason}`, true) + destroyAll() + }) + + bot.on('end', (endReason) => { + console.log('disconnected for', endReason) + destroyAll() + setLoadingScreenStatus(`You have been disconnected from the server. End reason: ${endReason}`, true) + if (isCypress()) throw new Error(`disconnected: ${endReason}`) + }) + + bot.once('login', () => { + // server is ok, add it to the history + const serverHistory: string[] = JSON.parse(localStorage.getItem('serverHistory') || '[]') + serverHistory.unshift(connectOptions.server) + localStorage.setItem('serverHistory', JSON.stringify([...new Set(serverHistory)])) + + setLoadingScreenStatus('Loading world') + }) + + bot.once('spawn', () => { + if (p2pConnectTimeout) clearTimeout(p2pConnectTimeout) + const mcData = require('minecraft-data')(bot.version) + + setLoadingScreenStatus('Placing blocks (starting viewer)') + + console.log('bot spawned - starting viewer') + + const { version } = bot + + const center = bot.entity.position + + const worldView: import('prismarine-viewer/viewer/lib/worldView').WorldView = new WorldView(bot.world, singeplayer ? renderDistance : Math.min(renderDistance, maxMultiplayerRenderDistance), center) + window.worldView = worldView + setRenderDistance() + + const updateFov = () => { + let fovSetting = options.fov + // todo check values and add transition + if (bot.controlState.sprint && !bot.controlState.sneak) { + fovSetting += 5 + } + if (gameAdditionalState.isFlying) { + fovSetting += 5 + } + viewer.camera.fov = fovSetting + viewer.camera.updateProjectionMatrix() + } + updateFov() + subscribeKey(options, 'fov', updateFov) + subscribeKey(gameAdditionalState, 'isFlying', updateFov) + subscribeKey(gameAdditionalState, 'isSprinting', updateFov) + subscribeKey(gameAdditionalState, 'isSneaking', () => { + viewer.isSneaking = gameAdditionalState.isSneaking + viewer.setFirstPersonCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch) + }) + + bot.on('physicsTick', () => updateCursor()) + viewer.setVersion(version) + + const debugMenu = hud.shadowRoot.querySelector('#debug-overlay') + + window.loadedData = mcData + window.Vec3 = Vec3 + window.pathfinder = pathfinder + window.debugMenu = debugMenu + + initVR(bot, renderer, viewer) + + postRenderFrameFn = () => { + viewer.setFirstPersonCamera(null, bot.entity.yaw, bot.entity.pitch) + } + + try { + const gl = renderer.getContext() + debugMenu.rendererDevice = gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL) + } catch (err) { + console.error(err) + debugMenu.rendererDevice = '???' + } + + // Link WorldView and Viewer + viewer.listen(worldView) + worldView.listenToBot(bot) + worldView.init(bot.entity.position) + + updateTime(bot) + + // Bot position callback + function botPosition() { + // this might cause lag, but not sure + viewer.setFirstPersonCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch) + worldView.updatePosition(bot.entity.position) + } + bot.on('move', botPosition) + botPosition() + + setLoadingScreenStatus('Setting callbacks') + + const maxPitch = 0.5 * Math.PI + const minPitch = -0.5 * Math.PI + mouseMovePostHandle = ({ x, y }) => { + bot.entity.pitch -= y + bot.entity.pitch = Math.max(minPitch, Math.min(maxPitch, bot.entity.pitch)) + bot.entity.yaw -= x + } + + function changeCallback() { + notification.show = false + if (!pointerLock.hasPointerLock && activeModalStack.length === 0) { + showModal(pauseMenu) + } + } + + registerListener(document, 'pointerlockchange', changeCallback, false) + + let holdingTouch: { touch: Touch, elem: HTMLElement } | undefined + document.body.addEventListener('touchend', (e) => { + if (!isGameActive(true)) return + if (holdingTouch?.touch.identifier !== e.changedTouches[0].identifier) return + holdingTouch.elem.click() + holdingTouch = undefined + }) + document.body.addEventListener('touchstart', (e) => { + if (!isGameActive(true)) return + e.preventDefault() + holdingTouch = { + touch: e.touches[0], + elem: e.composedPath()[0] as HTMLElement + } + }, { passive: false }) + + const cameraControlEl = hud + + /** after what time of holding the finger start breaking the block */ + const touchStartBreakingBlockMs = 500 + let virtualClickActive = false + let virtualClickTimeout + let screenTouches = 0 + let capturedPointer: { id; x; y; sourceX; sourceY; activateCameraMove; time } | null + registerListener(document, 'pointerdown', (e) => { + const clickedEl = e.composedPath()[0] + if (!isGameActive(true) || !miscUiState.currentTouch || clickedEl !== cameraControlEl || e.pointerId === undefined) { + return + } + screenTouches++ + if (screenTouches === 3) { + window.dispatchEvent(new MouseEvent('mousedown', { button: 1 })) + } + if (capturedPointer) { + return + } + cameraControlEl.setPointerCapture(e.pointerId) + capturedPointer = { + id: e.pointerId, + x: e.clientX, + y: e.clientY, + sourceX: e.clientX, + sourceY: e.clientY, + activateCameraMove: false, + time: Date.now() + } + virtualClickTimeout ??= setTimeout(() => { + virtualClickActive = true + document.dispatchEvent(new MouseEvent('mousedown', { button: 0 })) + }, touchStartBreakingBlockMs) + }) + registerListener(document, 'pointermove', (e) => { + if (e.pointerId === undefined || e.pointerId !== capturedPointer?.id) return + window.scrollTo(0, 0) + e.preventDefault() + e.stopPropagation() + + const allowedJitter = 1.1 + // todo support .pressure (3d touch) + const xDiff = Math.abs(e.pageX - capturedPointer.sourceX) > allowedJitter + const yDiff = Math.abs(e.pageY - capturedPointer.sourceY) > allowedJitter + if (!capturedPointer.activateCameraMove && (xDiff || yDiff)) capturedPointer.activateCameraMove = true + if (capturedPointer.activateCameraMove) { + clearTimeout(virtualClickTimeout) + } + onCameraMove({ movementX: e.pageX - capturedPointer.x, movementY: e.pageY - capturedPointer.y, type: 'touchmove' }) + capturedPointer.x = e.pageX + capturedPointer.y = e.pageY + }, { passive: false }) + + contro.on('stickMovement', ({ stick, vector }) => { + if (stick !== 'right') return + let { x, z } = vector + if (Math.abs(x) < 0.18) x = 0 + if (Math.abs(z) < 0.18) z = 0 + onCameraMove({ movementX: x * 10, movementY: z * 10, type: 'touchmove' }) + }) + + registerListener(document, 'lostpointercapture', (e) => { + if (e.pointerId === undefined || e.pointerId !== capturedPointer?.id) return + clearTimeout(virtualClickTimeout) + virtualClickTimeout = undefined + + if (virtualClickActive) { + // button 0 is left click + document.dispatchEvent(new MouseEvent('mouseup', { button: 0 })) + virtualClickActive = false + } else if (!capturedPointer.activateCameraMove && (Date.now() - capturedPointer.time < touchStartBreakingBlockMs)) { + document.dispatchEvent(new MouseEvent('mousedown', { button: 2 })) + blockInteraction.update() + document.dispatchEvent(new MouseEvent('mouseup', { button: 2 })) + } + capturedPointer = undefined + }, { passive: false }) + + registerListener(document, 'pointerup', (e) => { + const clickedEl = e.composedPath()[0] + if (!isGameActive(true) || !miscUiState.currentTouch || clickedEl !== cameraControlEl || e.pointerId === undefined) { + return + } + screenTouches-- + }) + + registerListener(document, 'contextmenu', (e) => e.preventDefault(), false) + + registerListener(document, 'blur', (e) => { + bot.clearControlStates() + }, false) + + setLoadingScreenStatus('Done!') + console.log('Done!') + + hud.init(renderer, bot, host) + hud.style.display = 'block' + blockInteraction.init() + + setTimeout(() => { + errorAbortController.abort() + if (loadingScreen.hasError) return + // remove loading screen, wait a second to make sure a frame has properly rendered + setLoadingScreenStatus(undefined) + hideCurrentScreens() + void viewer.waitForChunksToRender().then(() => { + console.log('All done and ready!') + document.dispatchEvent(new Event('cypress-world-ready')) + }) + miscUiState.gameLoaded = true + }, singeplayer ? 0 : 2500) + }) +} + +window.addEventListener('mousedown', (e) => { + pointerLock.requestPointerLock() +}) + +window.addEventListener('keydown', (e) => { + if (e.code !== 'Escape') return + if (activeModalStack.length) { + hideCurrentModal(undefined, () => { + if (!activeModalStack.length) { + pointerLock.justHitEscape = true + } + }) + } else if (pointerLock.hasPointerLock) { + document.exitPointerLock() + if (options.autoExitFullscreen) { + document.exitFullscreen() + } + } else { + document.dispatchEvent(new Event('pointerlockchange')) + } +}) + +window.addEventListener('keydown', (e) => { + if (e.code === 'F11') { + e.preventDefault() + goFullscreen(true) + } + if (e.code === 'KeyL' && e.altKey) { + console.clear() + } +}) + +addPanoramaCubeMap() +showModal(document.getElementById('title-screen')) +void main() +downloadAndOpenFile().then((downloadAction) => { + if (downloadAction) return + + window.addEventListener('hud-ready', (e) => { + // try to connect to peer + const qs = new URLSearchParams(window.location.search) + const peerId = qs.get('connectPeer') + const version = qs.get('peerVersion') + if (peerId) { + let username = options.guestUsername + if (options.askGuestName) username = prompt('Enter your username', username) + if (!username) return + options.guestUsername = username + connect({ + server: '', port: '', proxy: '', password: '', + username, + botVersion: version || undefined, + peerId + }) + } + }) + if (document.getElementById('hud').isReady) window.dispatchEvent(new Event('hud-ready')) +}, (err) => { + console.error(err) + alert(`Failed to download file: ${err}`) +}) diff --git a/src/inventory.ts b/src/inventory.ts new file mode 100644 index 000000000..72b712190 --- /dev/null +++ b/src/inventory.ts @@ -0,0 +1,153 @@ +import { subscribe } from 'valtio' +import { showInventory } from 'minecraft-inventory-gui/web/ext.mjs' +import InventoryGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/inventory.png' +import Dirt from 'minecraft-assets/minecraft-assets/data/1.17.1/blocks/dirt.png' +import { subscribeKey } from 'valtio/utils' +import MinecraftData from 'minecraft-data' +import { getVersion } from 'prismarine-viewer/viewer/lib/version' +import invspriteJson from './invsprite.json' +import { activeModalStack, hideCurrentModal, miscUiState } from './globalState' + +const loadedImages = new Map() +export type BlockStates = Record> +}> + +let blockStates: BlockStates +let lastInventory +let mcData +let version + +subscribeKey(miscUiState, 'gameLoaded', async () => { + if (!miscUiState.gameLoaded) { + // loadedBlocksAtlas = null + return + } + + // on game load + version = getVersion(bot.version) + blockStates = await fetch(`blocksStates/${version}.json`).then(async res => res.json()) + getImage({ path: 'blocks' } as any) + getImage({ path: 'invsprite' } as any) + mcData = MinecraftData(version) +}) + +const findBlockStateTexturesAtlas = (name) => { + const vars = blockStates[name]?.variants + if (!vars) return + const firstVar = Object.values(vars)[0] + if (!firstVar || !Array.isArray(firstVar)) return + return firstVar[0]?.model.textures +} + +const getBlockData = (name) => { + const blocksImg = loadedImages.get('blocks') + if (!blocksImg?.width) return + + const data = findBlockStateTexturesAtlas(name) + if (!data) return + + const getSpriteBlockSide = (side) => { + const d = data[side] + if (!d) return + const spriteSide = [d.u * blocksImg.width, d.v * blocksImg.height, d.su * blocksImg.width, d.sv * blocksImg.height] + const blockSideData = { + slice: spriteSide, + path: 'blocks' + } + return blockSideData + } + + return { + // todo look at grass bug + top: getSpriteBlockSide('up') || getSpriteBlockSide('top'), + left: getSpriteBlockSide('east') || getSpriteBlockSide('side'), + right: getSpriteBlockSide('north') || getSpriteBlockSide('side'), + } +} + +const getItemSlice = (name) => { + const invspriteImg = loadedImages.get('invsprite') + if (!invspriteImg?.width) return + + const { x, y } = invspriteJson[name] ?? /* unknown item */ { x: 0, y: 0 } + const sprite = [x, y, 32, 32] + return sprite +} + +const getImageSrc = (path) => { + switch (path) { + case 'gui/container/inventory': return InventoryGui + case 'blocks': return globalThis.texturePackDataUrl || `textures/${version}.png` + case 'invsprite': return `invsprite.png` + } + return Dirt +} + +const getImage = ({ path, texture, blockData }) => { + const loadPath = blockData ? 'blocks' : path ?? texture + if (!loadedImages.has(loadPath)) { + const image = new Image() + // image.onload(() => {}) + image.src = getImageSrc(loadPath) + loadedImages.set(loadPath, image) + } + return loadedImages.get(loadPath) +} + +const upInventory = () => { + // inv.pwindow.inv.slots[2].displayName = 'test' + // inv.pwindow.inv.slots[2].blockData = getBlockData('dirt') + const customSlots = bot.inventory.slots.map(slot => { + if (!slot) return + // const itemName = slot.name + // const isItem = mcData.itemsByName[itemName] + + // try get block data first, but ideally we should also have atlas from atlas/ folder + const blockData = getBlockData(slot.name) + if (blockData) { + slot['texture'] = 'blocks' + slot['blockData'] = blockData + } else { + slot['texture'] = 'invsprite' + slot['scale'] = 0.5 + slot['slice'] = getItemSlice(slot.name) + } + + return slot + }) + lastInventory.pwindow.setSlots(customSlots) +} + +subscribe(activeModalStack, () => { + const inventoryOpened = activeModalStack.at(-1)?.reactType === 'inventory' + if (inventoryOpened) { + const inv = showInventory(undefined, getImage, {}, bot) + inv.canvas.style.zIndex = '10' + inv.canvas.style.position = 'fixed' + inv.canvas.style.inset = '0' + // todo scaling + inv.canvasManager.setScale(window.innerHeight < 480 ? 2 : window.innerHeight < 700 ? 3 : 4) + inv.canvasManager.onClose = () => { + hideCurrentModal() + inv.canvasManager.destroy() + } + + lastInventory = inv + upInventory() + } else if (lastInventory) { + lastInventory.destroy() + lastInventory = null + } +}) diff --git a/lib/invsprite.json b/src/invsprite.json similarity index 100% rename from lib/invsprite.json rename to src/invsprite.json diff --git a/src/loadSave.ts b/src/loadSave.ts new file mode 100644 index 000000000..c0260279c --- /dev/null +++ b/src/loadSave.ts @@ -0,0 +1,142 @@ +import fs from 'fs' +import { promisify } from 'util' +import { supportedVersions } from 'flying-squid/src/lib/version' +import * as nbt from 'prismarine-nbt' +import { proxy } from 'valtio' +import { gzip } from 'node-gzip' +import { options } from './optionsStorage' +import { nameToMcOfflineUUID } from './utils' +import { forceCachedDataPaths } from './browserfs' + +const parseNbt = promisify(nbt.parse) + +// additional fs metadata +export const fsState = proxy({ + isReadonly: false, + syncFs: false, + inMemorySave: false, + saveLoaded: false +}) + +const PROPOSE_BACKUP = true + +// eslint-disable-next-line complexity +export const loadSave = async (root = '/world') => { + const disablePrompts = options.disableLoadPrompts + + // todo do it in singleplayer as well + // eslint-disable-next-line guard-for-in + for (const key in forceCachedDataPaths) { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + delete forceCachedDataPaths[key] + } + + const warnings: string[] = [] + let levelDatContent + try { + // todo-low cache reading + levelDatContent = await fs.promises.readFile(`${root}/level.dat`) + } catch (err) { + if (err.code === 'ENOENT') { + if (fsState.isReadonly) { + throw new Error('level.dat not found, ensure you are loading world folder') + } else { + warnings.push('level.dat not found, world in current folder will be created') + } + } else { + throw err + } + } + + let version: string | undefined + let isFlat = false + if (levelDatContent) { + const parsedRaw = await parseNbt(Buffer.from(levelDatContent)) + const levelDat: import('./mcTypes').LevelDat = nbt.simplify(parsedRaw).Data + + const qs = new URLSearchParams(window.location.search) + version = qs.get('mapVersion') ?? levelDat.Version?.Name + if (!version) { + const newVersion = disablePrompts ? '1.8.8' : prompt(`In 1.8 and before world save doesn't contain version info, please enter version you want to use to load the world.\nSupported versions ${supportedVersions.join(', ')}`, '1.8.8') + if (!newVersion) return + version = newVersion + } + if (!supportedVersions.includes(version)) { + version = prompt(`Version ${version} is not supported, supported versions ${supportedVersions.join(', ')}, what try to use instead?`, '1.16.1') + if (!version) return + } + if (levelDat.WorldGenSettings) { + for (const [key, value] of Object.entries(levelDat.WorldGenSettings.dimensions)) { + if (key.slice(10) === 'overworld') { + if (value.generator.type === 'flat') isFlat = true + break + } + } + } + + if (levelDat.generatorName) { + isFlat = levelDat.generatorName === 'flat' + } + if (!isFlat && levelDat.generatorName !== 'default' && levelDat.generatorName !== 'customized') { + warnings.push(`Generator ${levelDat.generatorName} may not be supported yet`) + } + + const playerUuid = nameToMcOfflineUUID(options.localUsername) + const playerDatPath = `${root}/playerdata/${playerUuid}.dat` + try { + await fs.promises.stat(playerDatPath) + } catch (err) { + const playerDat = await gzip(nbt.writeUncompressed({ name: '', ...(parsedRaw.value.Data.value as Record).Player })) + if (fsState.isReadonly) { + forceCachedDataPaths[playerDatPath] = playerDat + } else { + await fs.promises.writeFile(playerDatPath, playerDat) + } + } + + } + + if (warnings.length && !disablePrompts) { + const doContinue = confirm(`Continue with following warnings?\n${warnings.join('\n')}`) + if (!doContinue) return + } + + if (PROPOSE_BACKUP) { + // TODO-HIGH! enable after copyFile in browserfs is implemented + + // const doBackup = options.alwaysBackupWorldBeforeLoading ?? confirm('Do you want to backup your world files before loading it?') + // // const doBackup = true + // if (doBackup) { + // // todo do it in flying squid instead + // await fs.promises.copyFile('/world/level.dat', `/world/level.dat_old`) + // try { + // await fs.promises.mkdir('/backups/region.old', { recursive: true }) + // } catch (err) { } + // const files = await fs.promises.readdir('/world/region') + // for (const file of files) { + // await fs.promises.copyFile(`/world/region/${file}`, `/world/region.old/${file}`) + // } + // } + } + + if (!fsState.isReadonly) { + // todo allow also to ctrl+s + alert('Note: the world is saved only on /save or disconnect! ENSURE YOU HAVE BACKUP!') + } + + fsState.saveLoaded = true + document.querySelector('#title-screen').dispatchEvent(new CustomEvent('singleplayer', { + // todo check gamemode level.dat data etc + detail: { + version, + ...isFlat ? { + generation: { + name: 'superflat' + } + } : {}, + ...root === '/world' ? {} : { + 'worldFolder': root + } + }, + })) +} diff --git a/src/localServerMultiplayer.ts b/src/localServerMultiplayer.ts new file mode 100644 index 000000000..3096e9321 --- /dev/null +++ b/src/localServerMultiplayer.ts @@ -0,0 +1,150 @@ +import { Duplex } from 'stream' +import Peer, { DataConnection } from 'peerjs' +import Client from 'minecraft-protocol/src/client' +import { resolveTimeout, setLoadingScreenStatus } from './utils' +import { miscUiState } from './globalState' + +class CustomDuplex extends Duplex { + constructor(options, public writeAction) { + super(options) + } + + _read() { } + + _write(chunk, encoding, callback) { + this.writeAction(chunk) + callback() + } +} + +let peerInstance: Peer | undefined + +export const getJoinLink = () => { + if (!peerInstance) return + const url = new URL(window.location.href) + url.searchParams.set('connectPeer', peerInstance.id) + url.searchParams.set('peerVersion', localServer.options.version) + return url.toString() +} + +const copyJoinLink = async () => { + miscUiState.wanOpened = true + const joinLink = getJoinLink() + if (navigator.clipboard) { + await navigator.clipboard.writeText(joinLink) + } else { + window.prompt('Copy to clipboard: Ctrl+C, Enter', joinLink) + } +} + +export const openToWanAndCopyJoinLink = async (writeText: (text) => void, doCopy = true) => { + if (!localServer) return + if (peerInstance) { + if (doCopy) await copyJoinLink() + return 'Already opened to wan. Join link copied' + } + const peer = new Peer({ + debug: 3, + }) + peerInstance = peer + peer.on('connection', (connection) => { + console.log('connection') + const serverDuplex = new CustomDuplex({}, (data) => connection.send(data)) + const client = new Client(true, localServer.options.version, undefined) + client.setSocket(serverDuplex) + localServer._server.emit('connection', client) + + connection.on('data', (data: any) => { + serverDuplex.push(Buffer.from(data)) + }) + // our side disconnect + const endConnection = () => { + console.log('connection.close') + serverDuplex.end() + connection.close() + } + serverDuplex.on('end', endConnection) + serverDuplex.on('force-close', endConnection) + client.on('end', endConnection) + + const disconnected = () => { + serverDuplex.end() + client.end() + } + connection.on('iceStateChanged', (state) => { + console.log('iceStateChanged', state) + if (state === 'disconnected') { + disconnected() + } + }) + connection.on('close', disconnected) + connection.on('error', disconnected) + }) + peer.on('error', (error) => { + console.error(error) + writeText(error.message) + }) + return new Promise(resolve => { + peer.on('open', async () => { + await copyJoinLink() + resolve('Copied join link to clipboard') + }) + setTimeout(() => { + resolve('Failed to open to wan (timeout)') + }, 5000) + }) +} + +export const closeWan = () => { + if (!peerInstance) return + peerInstance.destroy() + peerInstance = undefined + miscUiState.wanOpened = false + return 'Closed to wan' +} + +export const connectToPeer = async (peerId: string) => { + setLoadingScreenStatus('Connecting to peer server') + // todo destroy connection on error + const peer = new Peer({ + debug: 3, + }) + await resolveTimeout(new Promise(resolve => { + peer.once('open', resolve) + })) + setLoadingScreenStatus('Connecting to the peer') + const connection = peer.connect(peerId, { + serialization: 'raw', + }) + await resolveTimeout(new Promise((resolve, reject) => { + connection.once('error', (error) => { + console.log(error.type, error.name) + console.log(error) + reject(error.message) + }) + connection.once('open', resolve) + })) + + const clientDuplex = new CustomDuplex({}, (data) => { + // todo rm debug + console.debug('sending', data.toString()) + connection.send(data) + }) + connection.on('data', (data: any) => { + console.debug('received', Buffer.from(data).toString()) + clientDuplex.push(Buffer.from(data)) + }) + connection.on('close', () => { + console.log('connection closed') + clientDuplex.end() + // bot._client.end() + // bot.end() + bot.emit('end', 'Disconnected.') + }) + connection.on('error', (error) => { + console.error(error) + clientDuplex.end() + }) + + return clientDuplex +} diff --git a/src/mcTypes.ts b/src/mcTypes.ts new file mode 100644 index 000000000..e7f6c7afd --- /dev/null +++ b/src/mcTypes.ts @@ -0,0 +1,164 @@ +// todo move from here + +//@ts-format-ignore-region +// 1.8.8 +export interface LevelDat { + WorldGenSettings?: WorldGenSettings; + RandomSeed: number[]; + generatorName?: string; + BorderCenterX: number; + BorderCenterZ: number; + Difficulty: number; + DifficultyLocked: number; + BorderSizeLerpTime: number[]; + Version?: { + Name: string + // id, snapshot + } + /** 0,1 */ + raining: number; + Time: number[]; + GameType: number; + MapFeatures: number; + BorderDamagePerBlock: number; + BorderWarningBlocks: number; + BorderSizeLerpTarget: number; + DayTime: number[]; + initialized: number; + allowCommands: number; + SizeOnDisk: number[]; + GameRules: GameRules; + Player: Player; + SpawnY: number; + rainTime: number; + thunderTime: number; + SpawnZ: number; + hardcore: number; + SpawnX: number; + clearWeatherTime: number; + thundering: number; + generatorVersion?: number; + version: number; + BorderSafeZone: number; + generatorOptions?: string; + LastPlayed: number[]; + BorderWarningTime: number; + LevelName: string; + BorderSize: number; +} + +export interface GameRules { + doTileDrops: string; + doFireTick: string; + reducedDebugInfo: string; + naturalRegeneration: string; + doMobLoot: string; + keepInventory: string; + doEntityDrops: string; + mobGriefing: string; + randomTickSpeed: string; + commandBlockOutput: string; + doMobSpawning: string; + logAdminCommands: string; + sendCommandFeedback: string; + doDaylightCycle: string; + showDeathMessages: string; +} + +export interface Player { + HurtByTimestamp: number; + SleepTimer: number; + Attributes: Attribute[]; + Invulnerable: number; + PortalCooldown: number; + AbsorptionAmount: number; + abilities: Abilities; + FallDistance: number; + DeathTime: number; + XpSeed: number; + HealF: number; + XpTotal: number; + playerGameType: number; + SelectedItem: SelectedItem; + Motion: number[]; + UUIDLeast: number[]; + Health: number; + foodSaturationLevel: number; + Air: number; + OnGround: number; + Dimension: number; + Rotation: number[]; + XpLevel: number; + Score: number; + UUIDMost: number[]; + Sleeping: number; + Pos: number[]; + Fire: number; + XpP: number; + EnderItems: any[]; + foodLevel: number; + foodExhaustionLevel: number; + HurtTime: number; + SelectedItemSlot: number; + Inventory: SelectedItem[]; + foodTickTimer: number; +} + +export interface Attribute { + Base: number; + Name: string; +} + +export interface SelectedItem { + Slot?: number; + id: string; + Count: number; + Damage: number; +} + +export interface Abilities { + invulnerable: number; + mayfly: number; + instabuild: number; + walkSpeed: number; + mayBuild: number; + flying: number; + flySpeed: number; +} + +// 1.16+ + +export interface WorldGenSettings { + /** 0,1 */ + bonus_chest: number; + seed: number[]; + /** 0,1 */ + generate_features: number; + dimensions: Dimensions; +} + +export interface Dimensions { + // :overworld, :the_nether, :the_end + [key: string]: WorldGen; +} + +export interface WorldGen { + generator: WorldGenGenerator; + // same as key + type: string; +} + +export interface WorldGenGenerator { + settings: string; + seed: number[]; + biome_source: PurpleBiomeSource; + type: string; +} + +export interface PurpleBiomeSource { + seed: number[]; + /** only for overworld 0,1 */ + large_biomes?: number; + // :noise, :flat, ? + type: string; +} diff --git a/src/menus/advanced_options_screen.js b/src/menus/advanced_options_screen.js new file mode 100644 index 000000000..f87e8797f --- /dev/null +++ b/src/menus/advanced_options_screen.js @@ -0,0 +1,90 @@ +//@ts-check +const { html, css, LitElement } = require('lit') +const { subscribe } = require('valtio') +const { hideCurrentModal } = require('../globalState') +const { getScreenRefreshRate } = require('../utils') +const { options } = require('../optionsStorage') +const { commonCss, openURL } = require('./components/common') + +class AdvancedOptionsScreen extends LitElement { + /** @type {null | number} */ + frameLimitMax = null + + constructor () { + super() + subscribe(options, () => { + this.requestUpdate() + }) + } + + static get styles () { + return css` + ${commonCss} + .title { + top: 4px; + } + + main { + display: flex; + flex-direction: column; + position: absolute; + top: calc(100% / 6 - 6px); + left: 50%; + width: 310px; + gap: 4px 0; + place-items: center; + place-content: center; + transform: translate(-50%); + } + + .wrapper { + display: flex; + flex-direction: row; + width: 100%; + gap: 0 10px; + height: 20px; + } + ` + } + + render () { + return html` +
    + +

    Advanced Options

    +
    +
    + { + options.alwaysShowMobileControls = !options.alwaysShowMobileControls + } + }> +
    +
    + { + const newVal = e.target.value + options.frameLimit = newVal > this.frameLimitMax ? false : newVal + this.requestUpdate() + }}> + { + const rate = await getScreenRefreshRate() + this.frameLimitMax = rate + this.requestUpdate() + }}> +
    +
    + { + options.touchButtonsSize = +e.target.value + }}> + { + options.highPerformanceGpu = !options.highPerformanceGpu + }}> +
    + + hideCurrentModal()}> +
    + ` + } +} + +window.customElements.define('pmui-advanced-optionsscreen', AdvancedOptionsScreen) diff --git a/lib/menus/components/bossbars_overlay.js b/src/menus/components/bossbars_overlay.js similarity index 86% rename from lib/menus/components/bossbars_overlay.js rename to src/menus/components/bossbars_overlay.js index ab714bb2b..5c22fa9a2 100644 --- a/lib/menus/components/bossbars_overlay.js +++ b/src/menus/components/bossbars_overlay.js @@ -57,19 +57,20 @@ class BossBar extends LitElement { this.updateBar(this.bar) return html` -
    -
    ${this.title}
    -
    -
    -
    -
    -
    -
    ` +
    +
    ${this.title}
    +
    +
    +
    +
    +
    +
    + ` } setTitle (bar) { if (bar._title.text) this.title = bar._title.text - else this.title = translations[this._title.translate] || 'Unkown Entity' + else this.title = translations[this._title.translate] || 'Unknown Entity' } setColor (bar) { @@ -121,9 +122,11 @@ class BossBars extends LitElement { } render () { - return html`
    + return html` +
    ${[...this.bossBars.values()]} -
    ` +
    + ` } init () { diff --git a/lib/menus/components/breath_bar.js b/src/menus/components/breath_bar.js similarity index 85% rename from lib/menus/components/breath_bar.js rename to src/menus/components/breath_bar.js index d0ff1394b..407fee12b 100644 --- a/lib/menus/components/breath_bar.js +++ b/src/menus/components/breath_bar.js @@ -1,4 +1,5 @@ -const { LitElement, html, css } = require('lit') +const { LitElement, html, css, unsafeCSS } = require('lit') +const { guiIcons1_17_1 } = require('../hud') class BreathBar extends LitElement { static get styles () { @@ -22,13 +23,13 @@ class BreathBar extends LitElement { } .breath.full { - background-image: url('textures/1.17.1/gui/icons.png'); + background-image: url('${unsafeCSS(guiIcons1_17_1)}'); background-size: 256px; background-position: var(--offset) var(--bg-y); } .breath.half { - background-image: url('textures/1.17.1/gui/icons.png'); + background-image: url('${unsafeCSS(guiIcons1_17_1)}'); background-size: 256px; background-position: calc(var(--offset) - 9) var(--bg-y); } @@ -45,9 +46,9 @@ class BreathBar extends LitElement { const breaths = breathbar.children - for (let i = 0; i < breaths.length; i++) { - breaths[i].classList.remove('full') - breaths[i].classList.remove('half') + for (const breath of breaths) { + breath.classList.remove('full') + breath.classList.remove('half') } for (let i = 0; i < Math.ceil(hValue / 2); i++) { diff --git a/src/menus/components/button.js b/src/menus/components/button.js new file mode 100644 index 000000000..1db48824e --- /dev/null +++ b/src/menus/components/button.js @@ -0,0 +1,175 @@ +//@ts-check +const { LitElement, html, css, unsafeCSS } = require('lit') +const widgetsGui = require('minecraft-assets/minecraft-assets/data/1.17.1/gui/widgets.png') +const { options } = require('../../optionsStorage') + +let audioContext +/** @type {Record} */ +const sounds = {} + +// load as many resources on page load as possible instead on demand as user can disable internet connection after he thinks the page is loaded +const loadingSounds = [] +async function loadSound (path) { + loadingSounds.push(path) + const res = await window.fetch(path) + const data = await res.arrayBuffer() + + // sounds[path] = await audioContext.decodeAudioData(data) + sounds[path] = data + loadingSounds.splice(loadingSounds.indexOf(path), 1) +} + +export async function playSound (path) { + if (!audioContext) { + audioContext = new window.AudioContext() + for (const [soundName, sound] of Object.entries(sounds)) { + sounds[soundName] = await audioContext.decodeAudioData(sound) + } + } + + const volume = options.volume / 100 + + if (loadingSounds.includes(path)) return + const soundBuffer = sounds[path] + if (!soundBuffer) throw new Error(`Sound ${path} not loaded`) + + const gainNode = audioContext.createGain() + const source = audioContext.createBufferSource() + source.buffer = soundBuffer + source.connect(gainNode) + gainNode.connect(audioContext.destination) + gainNode.gain.value = volume + source.start(0) +} + +class Button extends LitElement { + static get styles () { + return css` + .button { + --txrV: 66px; + position: relative; + width: 200px; + height: 20px; + font-family: minecraft, mojangles, monospace; + font-size: 10px; + color: white; + text-shadow: 1px 1px #222; + border: none; + z-index: 1; + outline: none; + display: inline-flex; + justify-content: center; + align-items: center; + } + + .button:hover, + .button:focus-visible { + --txrV: 86px; + } + + .button:disabled { + --txrV: 46px; + color: #A0A0A0; + text-shadow: 1px 1px #111; + } + + .button::after { + content: ''; + display: block; + position: absolute; + top: 0; + left: 0; + width: calc(50% + 1px); + height: 20px; + background: url('${unsafeCSS(widgetsGui)}'); + background-size: 256px; + background-position-y: calc(var(--txrV) * -1); + z-index: -1; + } + + .button::before { + content: ''; + display: block; + position: absolute; + top: 0; + left: 50%; + width: 50%; + height: 20px; + background: url('${unsafeCSS(widgetsGui)}'); + background-size: 256px; + background-position-x: calc(-200px + 100%); + background-position-y: calc(var(--txrV) * -1); + z-index: -1; + } + + .icon { + position: absolute; + top: 3px; + left: 3px; + font-size: 14px; + } + ` + } + + static get properties () { + return { + label: { + type: String, + attribute: 'pmui-label' + }, + width: { + type: String, + attribute: 'pmui-width' + }, + disabled: { + type: Boolean, + }, + onPress: { + type: Function, + attribute: 'pmui-click' + }, + icon: { + type: Function, + attribute: 'pmui-icon' + }, + testId: { + type: String, + attribute: 'pmui-test-id' + } + } + } + + constructor () { + super() + this.label = '' + this.icon = undefined + this.testId = undefined + this.disabled = false + this.width = '200px' + this.onPress = () => { } + } + + render () { + return html` + + ` + } + + onBtnClick (e) { + playSound('button_click.mp3') + this.dispatchEvent(new window.CustomEvent('pmui-click', { detail: e })) + } +} + +loadSound('button_click.mp3') +window.customElements.define('pmui-button', Button) diff --git a/lib/menus/components/common.js b/src/menus/components/common.js similarity index 74% rename from lib/menus/components/common.js rename to src/menus/components/common.js index 5be48a78c..667d525fd 100644 --- a/lib/menus/components/common.js +++ b/src/menus/components/common.js @@ -44,8 +44,15 @@ const commonCss = css` /** @returns {boolean} */ function isMobile () { - const m = require('ismobilejs').default() - return m.any + return window.matchMedia('(pointer: coarse)').matches +} + +// todo there are better workarounds and proper way to detect notch +/** @returns {boolean} */ +function isProbablyIphone () { + if (!isMobile()) return false + const smallest = window.innerWidth < window.innerHeight ? window.innerWidth : window.innerHeight + return smallest < 600 } /** @@ -55,18 +62,9 @@ function openURL (url) { window.open(url, '_blank', 'noopener,noreferrer') } -/** - * @param {HTMLElement} prev - * @param {HTMLElement} next - */ -function displayScreen (prev, next) { - prev.style.display = 'none' - next.style.display = 'block' -} - export { + isProbablyIphone, commonCss, isMobile, openURL, - displayScreen } diff --git a/lib/menus/components/debug_overlay.js b/src/menus/components/debug_overlay.js similarity index 84% rename from lib/menus/components/debug_overlay.js rename to src/menus/components/debug_overlay.js index 463367c4d..50b97573e 100644 --- a/lib/menus/components/debug_overlay.js +++ b/src/menus/components/debug_overlay.js @@ -9,6 +9,7 @@ class DebugOverlay extends LitElement { display: flex; flex-direction: column; z-index: 40; + pointer-events: none; } .debug-left-side { @@ -19,6 +20,8 @@ class DebugOverlay extends LitElement { .debug-right-side { top: 1px; right: 1px; + /* limit renderer long text width */ + width: 50%; } p { @@ -26,7 +29,7 @@ class DebugOverlay extends LitElement { color: white; font-size: 10px; width: fit-content; - height: 9px; + line-height: 9px; margin: 0; padding: 0; padding-bottom: 1px; @@ -48,6 +51,7 @@ class DebugOverlay extends LitElement { return { showOverlay: { type: Boolean }, cursorBlock: { type: Object }, + rendererDevice: { type: String }, bot: { type: Object }, customEntries: { type: Object } } @@ -61,8 +65,7 @@ class DebugOverlay extends LitElement { firstUpdated () { document.addEventListener('keydown', e => { - e ??= window.event - if (e.key === 'F3') { + if (e.code === 'F3') { this.showOverlay = !this.showOverlay e.preventDefault() } @@ -92,7 +95,6 @@ class DebugOverlay extends LitElement { } const target = this.cursorBlock - const targetDiggable = (target && this.bot.canDigBlock(target)) const pos = this.bot.entity.position const rot = [this.bot.entity.yaw, this.bot.entity.pitch] @@ -127,17 +129,18 @@ class DebugOverlay extends LitElement {

    Facing (viewer): ${rot[0].toFixed(3)} ${rot[1].toFixed(3)}

    Facing (minecraft): ${quadsDescription[minecraftQuad]} (${minecraftYaw.toFixed(1)} ${(rot[1] * -180 / Math.PI).toFixed(1)})

    Light: ${skyL} (${skyL} sky)

    -

    Biome: minecraft:${window.mcData.biomesArray[biomeId].name}

    + +

    Biome: minecraft:${window.loadedData.biomesArray[biomeId]?.name ?? 'unknown biome'}

    Day: ${this.bot.time.day}

    ${Object.entries(this.customEntries).map(([name, value]) => html`

    ${name}: ${value}

    `)}
    -

    Renderer: three.js r${global.THREE.REVISION}

    +

    Renderer: ${this.rendererDevice} powered by three.js r${global.THREE.REVISION}

    - ${targetDiggable ? html`

    ${target.name}

    ${Object.entries(target.getProperties()).map(([n, p], idx, arr) => renderProp(n, p, arr[idx + 1]))}` : ''} - ${targetDiggable ? html`

    Looking at: ${target.position.x} ${target.position.y} ${target.position.z}

    ` : ''} + ${target ? html`

    ${target.name}

    ${Object.entries(target.getProperties()).map(([n, p], idx, arr) => renderProp(n, p, arr[idx + 1]))}` : ''} + ${target ? html`

    Looking at: ${target.position.x} ${target.position.y} ${target.position.z}

    ` : ''}
    ` } diff --git a/lib/menus/components/edit_box.js b/src/menus/components/edit_box.js similarity index 50% rename from lib/menus/components/edit_box.js rename to src/menus/components/edit_box.js index a8ac38fb1..0f42527a6 100644 --- a/lib/menus/components/edit_box.js +++ b/src/menus/components/edit_box.js @@ -1,4 +1,5 @@ const { LitElement, html, css } = require('lit') +const { ifDefined } = require('lit/directives/if-defined.js') class EditBox extends LitElement { static get styles () { @@ -10,6 +11,22 @@ class EditBox extends LitElement { background: black; border: 1px solid grey; } + .edit-container.invalid { + border: 1px solid #c70000; + } + + .edit-container.warning { + border: 1px solid rgb(159, 151, 0); + } + + .edit-container.invalid:hover, + .edit-container.invalid:focus-within { + border-color: red; + } + .edit-container.warning:hover, + .edit-container.warning:focus-within { + border-color: yellow; + } .edit-container:hover, .edit-container:focus-within { @@ -40,6 +57,18 @@ class EditBox extends LitElement { color: white; text-shadow: 1px 1px #222; } + + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + + /* Firefox */ + input[type=number] { + appearance: textfield; + -moz-appearance: textfield; + } ` } @@ -49,6 +78,7 @@ class EditBox extends LitElement { this.id = '' this.value = '' this.label = '' + this.required = false } static get properties () { @@ -68,6 +98,25 @@ class EditBox extends LitElement { value: { type: String, attribute: 'pmui-value' + }, + autocompleteValues: { + type: Array, + }, + type: { + type: String, + attribute: 'pmui-type' + }, + inputMode: { + type: String, + attribute: 'pmui-inputmode' + }, + required: { + type: Boolean, + attribute: 'pmui-required' + }, + state: { + type: String, + attribute: true } } } @@ -75,19 +124,29 @@ class EditBox extends LitElement { render () { return html`
    + ${this.autocompleteValues ? html` + + ${this.autocompleteValues.map(value => html` + + `)} + + ` : ''} { this.value = e.target.value }} + list=${ifDefined(this.autocompleteValues ? `${this.id}-list` : undefined)} + inputmode=${ifDefined(this.inputMode || undefined)} + @input=${({ target: { value } }) => { this.value = this.inputMode === 'decimal' ? value.replaceAll(',', '.') : value }} class="edit-box">
    ` diff --git a/lib/menus/components/food_bar.js b/src/menus/components/food_bar.js similarity index 88% rename from lib/menus/components/food_bar.js rename to src/menus/components/food_bar.js index 320fb4a8b..f64413fe8 100644 --- a/lib/menus/components/food_bar.js +++ b/src/menus/components/food_bar.js @@ -1,4 +1,5 @@ -const { LitElement, html, css } = require('lit') +const { LitElement, html, css, unsafeCSS } = require('lit') +const { guiIcons1_17_1 } = require('../hud') class FoodBar extends LitElement { static get styles () { @@ -19,7 +20,7 @@ class FoodBar extends LitElement { .food { width: 9px; height: 9px; - background-image: url('textures/1.17.1/gui/icons.png'), url('textures/1.17.1/gui/icons.png'); + background-image: url('${unsafeCSS(guiIcons1_17_1)}'), url('${unsafeCSS(guiIcons1_17_1)}'); background-size: 256px, 256px; background-position: var(--bg-x) var(--bg-y), var(--bg-x) var(--bg-y); margin-left: -1px; @@ -49,6 +50,10 @@ class FoodBar extends LitElement { animation: updatedAnim 0.3s steps(2, end) 2; } + .creative { + display: none; + } + @keyframes lowHungerAnim { to { transform: translateY(1px); } } @@ -78,9 +83,9 @@ class FoodBar extends LitElement { const foods = foodbar.children - for (let i = 0; i < foods.length; i++) { - foods[i].classList.remove('full') - foods[i].classList.remove('half') + for (const food of foods) { + food.classList.remove('full') + food.classList.remove('half') } // if (d) this.onHungerUpdate() diff --git a/lib/menus/components/health_bar.js b/src/menus/components/health_bar.js similarity index 91% rename from lib/menus/components/health_bar.js rename to src/menus/components/health_bar.js index fdbc3b8c6..4c0306716 100644 --- a/lib/menus/components/health_bar.js +++ b/src/menus/components/health_bar.js @@ -1,4 +1,5 @@ -const { LitElement, html, css } = require('lit') +const { LitElement, html, css, unsafeCSS } = require('lit') +const { guiIcons1_17_1 } = require('../hud') function getEffectClass (effect) { switch (effect.id) { @@ -13,7 +14,7 @@ class HealthBar extends LitElement { static get styles () { return css` .health { - position: absolute; + position: fixed; display: flex; flex-direction: row; left: calc(50% - 91px); @@ -49,7 +50,7 @@ class HealthBar extends LitElement { .heart { width: 9px; height: 9px; - background-image: url('textures/1.17.1/gui/icons.png'), url('textures/1.17.1/gui/icons.png'); + background-image: url('${unsafeCSS(guiIcons1_17_1)}'), url('${unsafeCSS(guiIcons1_17_1)}'); background-size: 256px, 256px; background-position: var(--bg-x) var(--bg-y), var(--bg-x) var(--bg-y); margin-left: -1px; @@ -119,9 +120,9 @@ class HealthBar extends LitElement { const hearts = health.children - for (let i = 0; i < hearts.length; i++) { - hearts[i].classList.remove('full') - hearts[i].classList.remove('half') + for (const heart of hearts) { + heart.classList.remove('full') + heart.classList.remove('half') } if (d) this.onDamage() diff --git a/lib/menus/components/hotbar.js b/src/menus/components/hotbar.js similarity index 68% rename from lib/menus/components/hotbar.js rename to src/menus/components/hotbar.js index c148f1642..57f0274b9 100644 --- a/lib/menus/components/hotbar.js +++ b/src/menus/components/hotbar.js @@ -1,17 +1,22 @@ -const { LitElement, html, css } = require('lit') +const { LitElement, html, css, unsafeCSS } = require('lit') +const widgetsTexture = require('minecraft-assets/minecraft-assets/data/1.16.4/gui/widgets.png') +const { subscribeKey } = require('valtio/utils') const invsprite = require('../../invsprite.json') +const { isGameActive, miscUiState, showModal } = require('../../globalState') + +const { isProbablyIphone } = require('./common') class Hotbar extends LitElement { static get styles () { return css` .hotbar { - position: absolute; - bottom: 0; + position: fixed; + bottom: ${unsafeCSS(isProbablyIphone() ? '40px' : '0')}; left: 50%; transform: translate(-50%); width: 182px; height: 22px; - background: url("textures/1.16.4/gui/widgets.png"); + background: url("${unsafeCSS(widgetsTexture)}"); background-size: 256px; } @@ -21,7 +26,7 @@ class Hotbar extends LitElement { top: -1px; width: 24px; height: 24px; - background: url("textures/1.16.4/gui/widgets.png"); + background: url("${unsafeCSS(widgetsTexture)}"); background-size: 256px; background-position-y: -22px; } @@ -81,6 +86,16 @@ class Hotbar extends LitElement { transition: visibility 0s, opacity 1s linear; transition-delay: 2s; } + + .hotbar-more { + display:flex; + justify-content: center; + border: 1px solid white; + } + .hotbar-more::before { + content: '...'; + margin-top: -1px; + } ` } @@ -94,6 +109,9 @@ class Hotbar extends LitElement { constructor () { super() + subscribeKey(miscUiState, 'currentTouch', () => { + this.requestUpdate() + }) this.activeItemName = '' } @@ -111,12 +129,17 @@ class Hotbar extends LitElement { this.reloadHotbarSelected(0) document.addEventListener('wheel', (e) => { + if (!isGameActive(true)) return + e.preventDefault() const newSlot = ((this.bot.quickBarSlot + Math.sign(e.deltaY)) % 9 + 9) % 9 this.reloadHotbarSelected(newSlot) + }, { + passive: false, }) document.addEventListener('keydown', (e) => { - const numPressed = e.code.substr(5) + if (!isGameActive(true)) return + const numPressed = +((/Digit(\d)/.exec(e.code))?.[1] ?? -1) if (numPressed < 1 || numPressed > 9) return this.reloadHotbarSelected(numPressed - 1) }) @@ -125,26 +148,26 @@ class Hotbar extends LitElement { if (slot >= this.bot.inventory.hotbarStart + 9) return if (slot < this.bot.inventory.hotbarStart) return - const sprite = newItem ? invsprite[newItem.name] : invsprite.air + const sprite = newItem ? invsprite[newItem.name] ?? { x: 0, y: 0 } : invsprite.air const slotEl = this.shadowRoot.getElementById('hotbar-' + (slot - this.bot.inventory.hotbarStart)) const slotIcon = slotEl.children[0] const slotStack = slotEl.children[1] slotIcon.style['background-position-x'] = `-${sprite.x}px` slotIcon.style['background-position-y'] = `-${sprite.y}px` - slotStack.innerHTML = newItem?.count > 1 ? newItem.count : '' + slotStack.textContent = newItem?.count > 1 ? newItem.count : '' }) } async reloadHotbar () { for (let i = 0; i < 9; i++) { const item = this.bot.inventory.slots[this.bot.inventory.hotbarStart + i] - const sprite = item ? invsprite[item.name] : invsprite.air + const sprite = item ? invsprite[item.name] ?? { x: 0, y: 0 } : invsprite.air const slotEl = this.shadowRoot.getElementById('hotbar-' + i) const slotIcon = slotEl.children[0] const slotStack = slotEl.children[1] slotIcon.style['background-position-x'] = `-${sprite.x}px` slotIcon.style['background-position-y'] = `-${sprite.y}px` - slotStack.innerHTML = item?.count > 1 ? item.count : '' + slotStack.textContent = item?.count > 1 ? item.count : '' } } @@ -164,42 +187,22 @@ class Hotbar extends LitElement {

    ${this.activeItemName}

    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - +
    { + if (!e.target.id.startsWith('hotbar')) return + const slot = +e.target.id.split('-')[1] + this.reloadHotbarSelected(slot) + }}> + ${Array.from({ length: 9 }).map((_, i) => html` +
    { + this.reloadHotbarSelected(i) + }}> +
    +
    -
    -
    - + `)} + ${miscUiState.currentTouch ? html`
    { + showModal({ reactType: 'inventory' }) + }}>` : undefined}
    diff --git a/lib/menus/components/playerlist_overlay.js b/src/menus/components/playerlist_overlay.js similarity index 97% rename from lib/menus/components/playerlist_overlay.js rename to src/menus/components/playerlist_overlay.js index 221393f5f..67c153fc9 100644 --- a/lib/menus/components/playerlist_overlay.js +++ b/src/menus/components/playerlist_overlay.js @@ -1,4 +1,5 @@ const { LitElement, html, css } = require('lit') +const { isGameActive } = require('../../globalState') const MAX_ROWS_PER_COL = 10 @@ -44,7 +45,7 @@ class PlayerListOverlay extends LitElement { color: rgb(42, 204, 237); text-shadow: 1px 1px 0px rgb(4, 44, 67); } - + .playerlist-ping { text-align: right; float: right; @@ -114,7 +115,7 @@ class PlayerListOverlay extends LitElement { } document.addEventListener('keydown', e => { - e ??= window.event + if (!isGameActive(true)) return if (e.key === 'Tab') { showList(true) e.preventDefault() @@ -123,7 +124,6 @@ class PlayerListOverlay extends LitElement { document.addEventListener('keyup', e => { if (!this.isOpen) return - e ??= window.event if (e.key === 'Tab') { showList(false) e.preventDefault() diff --git a/lib/menus/components/slider.js b/src/menus/components/slider.js similarity index 70% rename from lib/menus/components/slider.js rename to src/menus/components/slider.js index 824313a49..77aed7a28 100644 --- a/lib/menus/components/slider.js +++ b/src/menus/components/slider.js @@ -1,4 +1,6 @@ -const { LitElement, html, css } = require('lit') +const { LitElement, html, css, unsafeCSS } = require('lit') + +const widgetsGui = require('minecraft-assets/minecraft-assets/data/1.17.1/gui/widgets.png') class Slider extends LitElement { static get styles () { @@ -26,7 +28,7 @@ class Slider extends LitElement { z-index: 3; } - .slider-container:hover .slider-thumb { + .slider-container:hover .slider:not(:disabled)~.slider-thumb { --txrV: -86px; } @@ -39,7 +41,7 @@ class Slider extends LitElement { left: 0; width: 50%; height: 20px; - background: url('textures/1.17.1/gui/widgets.png'); + background: url('${unsafeCSS(widgetsGui)}'); background-size: 256px; background-position-y: var(--txrV); z-index: -1; @@ -54,7 +56,7 @@ class Slider extends LitElement { left: 50%; width: 50%; height: 20px; - background: url('textures/1.17.1/gui/widgets.png'); + background: url('${unsafeCSS(widgetsGui)}'); background-size: 256px; background-position-x: calc(-200px + 100%); background-position-y: var(--txrV); @@ -74,6 +76,24 @@ class Slider extends LitElement { margin: 0; } + .slider:disabled { + cursor: not-allowed; + } + .slider~.disabled { + display: none; + } + /* .disabled after .slider selector */ + .slider:disabled~.disabled { + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 10; + background: rgba(0, 0, 0, .5); + } + .slider::-webkit-slider-thumb { -webkit-appearance: none; position: relative; @@ -134,6 +154,9 @@ class Slider extends LitElement { type: String, attribute: 'pmui-value' }, + valueDisplay: { + type: String, + }, min: { type: String, attribute: 'pmui-min' @@ -142,6 +165,10 @@ class Slider extends LitElement { type: String, attribute: 'pmui-max' }, + disabled: { + type: String, + attribute: 'pmui-disabled' + }, ratio: { type: Number } } } @@ -158,16 +185,28 @@ class Slider extends LitElement { min="${this.min}" max="${this.max}" value="${this.value}" + ?disabled=${!!this.disabled} @input=${(e) => { - const range = e.target - this.ratio = (range.value - range.min) / (range.max - range.min) - this.value = range.value - }}> + const range = e.target + this.ratio = (range.value - range.min) / (range.max - range.min) + this.value = range.value + }} + @pointerdown=${() => { + window.addEventListener('pointerup', (e) => { + this.dispatchEvent(new InputEvent('change')) + }, { + once: true, + }) + }} + @keyup=${() => { + this.dispatchEvent(new InputEvent('change')) + }}> +
    - +
    ` } diff --git a/lib/menus/hud.js b/src/menus/hud.js similarity index 60% rename from lib/menus/hud.js rename to src/menus/hud.js index 48bcdd1e9..1a536ff26 100644 --- a/lib/menus/hud.js +++ b/src/menus/hud.js @@ -1,24 +1,37 @@ -const { LitElement, html, css } = require('lit') +//@ts-check +const { LitElement, html, css, unsafeCSS } = require('lit') +const { showModal, miscUiState } = require('../globalState') +const { options, watchValue } = require('../optionsStorage') +const { getGamemodeNumber } = require('../utils') const { isMobile } = require('./components/common') +export const guiIcons1_17_1 = require('minecraft-assets/minecraft-assets/data/1.17.1/gui/icons.png') +export const guiIcons1_16_4 = require('minecraft-assets/minecraft-assets/data/1.16.4/gui/icons.png') + class Hud extends LitElement { + firstUpdated () { + this.isReady = true + window.dispatchEvent(new CustomEvent('hud-ready', { detail: this })) + } + static get styles () { return css` :host { - position: absolute; + position: fixed; top: 0; left: 0; z-index: -2; width: 100%; - height: 100%; + height: 100vh; + touch-action: none; } .crosshair { width: 16px; height: 16px; - background: url('textures/1.17.1/gui/icons.png'); + background: url('${unsafeCSS(guiIcons1_17_1)}'); background-size: 256px; - position: absolute; + position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); @@ -26,7 +39,7 @@ class Hud extends LitElement { } #xp-label { - position: absolute; + position: fixed; top: -8px; left: 50%; transform: translate(-50%); @@ -38,13 +51,13 @@ class Hud extends LitElement { } #xp-bar-bg { - position: absolute; + position: fixed; left: 50%; bottom: 24px; transform: translate(-50%); width: 182px; height: 5px; - background-image: url('textures/1.16.4/gui/icons.png'); + background-image: url('${unsafeCSS(guiIcons1_16_4)}'); background-size: 256px; background-position-y: -64px; } @@ -52,7 +65,7 @@ class Hud extends LitElement { .xp-bar { width: 182px; height: 5px; - background-image: url('textures/1.17.1/gui/icons.png'); + background-image: url('${unsafeCSS(guiIcons1_17_1)}'); background-size: 256px; background-position-y: -69px; } @@ -60,7 +73,7 @@ class Hud extends LitElement { .mobile-top-btns { display: none; flex-direction: row; - position: absolute; + position: fixed; top: 0; left: 50%; transform: translate(-50%); @@ -83,6 +96,12 @@ class Hud extends LitElement { .chat-btn { background-position-y: -82px; } + .debug-btn { + background: #9c8c86; + font-size: 8px; + /* todo make other buttons centered */ + margin-right: 5px; + } .mobile-control-forward, .mobile-control-back, @@ -196,7 +215,7 @@ class Hud extends LitElement { * @param {import('mineflayer').Bot} bot */ preload (bot) { - const bossBars = this.shadowRoot.querySelector('#bossbars-overlay') + const bossBars = this.shadowRoot.getElementById('bossbars-overlay') bossBars.bot = bot bossBars.init() @@ -222,8 +241,8 @@ class Hud extends LitElement { debugMenu.bot = bot hotbar.init() - chat.init(bot._client, renderer) - bot.on('spawn', () => playerList.init(bot, host)) + chat.init(bot._client) + playerList.init(bot, host) bot.on('entityHurt', (entity) => { if (entity !== bot.entity) return @@ -240,114 +259,67 @@ class Hud extends LitElement { healthbar.effectEnded(effect) }) - bot.on('game', () => { - healthbar.gameModeChanged(bot.player.gamemode, bot.game.hardcore) - foodbar.gameModeChanged(bot.player.gamemode) - // breathbar.gameModeChanged(bot.player.gamemode) - this.shadowRoot.querySelector('#xp-bar-bg').style.display = bot.player.gamemode === 1 ? 'none' : 'block' - }) + const onGameModeChange = () => { + const gamemode = getGamemodeNumber(bot) + healthbar.gameModeChanged(gamemode, bot.game.hardcore) + foodbar.gameModeChanged(gamemode) + // breathbar.gameModeChanged(gamemode) + this.shadowRoot.querySelector('#xp-bar-bg').style.display = gamemode === 1 ? 'none' : 'block' + } + bot.on('game', onGameModeChange) + onGameModeChange() - bot.on('health', () => { + const onHealthUpdate = () => { healthbar.updateHealth(bot.health, true) foodbar.updateHunger(bot.food, true) - }) + } + bot.on('health', onHealthUpdate) + onHealthUpdate() - bot.on('experience', () => { + const onXpUpdate = () => { + // @ts-expect-error this.shadowRoot.querySelector('#xp-bar-bg').firstElementChild.style.width = `${182 * bot.experience.progress}px` - xpLabel.innerHTML = bot.experience.level + xpLabel.innerHTML = String(bot.experience.level) xpLabel.style.display = bot.experience.level > 0 ? 'block' : 'none' - }) + } + bot.on('experience', onXpUpdate) + onXpUpdate() // bot.on('breath', () => { // breathbar.updateOxygen(bot.oxygenLevel) // }) - bot.on('spawn', () => { - this.shadowRoot.querySelector('#xp-bar-bg').style.display = bot.player.gamemode === 1 ? 'none' : 'block' - this.shadowRoot.querySelector('#xp-bar-bg').firstElementChild.style.width = `${182 * bot.experience.progress}px` - xpLabel.innerHTML = bot.experience.level - xpLabel.style.display = bot.experience.level > 0 ? 'block' : 'none' - healthbar.gameModeChanged(bot.player.gamemode, bot.game.hardcore) - healthbar.updateHealth(bot.health) - foodbar.updateHunger(bot.food) - // breathbar.updateOxygen(bot.oxygenLevel ?? 20) - }) + // TODO + // breathbar.updateOxygen(bot.oxygenLevel ?? 20) - if (document.getElementById('options-screen').forceMobileControls || isMobile()) { - this.showMobileControls(true) - } else { - this.showMobileControls(false) - } + watchValue(options, (o) => { + miscUiState.currentTouch = o.alwaysShowMobileControls || isMobile() + this.showMobileControls(miscUiState.currentTouch) + }) } /** @param {boolean} bl */ showMobileControls (bl) { this.shadowRoot.querySelector('#mobile-top').style.display = bl ? 'flex' : 'none' - this.shadowRoot.querySelector('#mobile-left').style.display = bl ? 'block' : 'none' - this.shadowRoot.querySelector('#mobile-right').style.display = bl ? 'flex' : 'none' - } - - /** - * @param {string} id - * @param {boolean} action - */ - mobileControl (e, id, action) { - e.stopPropagation() - this.bot.setControlState(id, action) } render () { return html`
    - - -
    -
    - - - - - -
    -
    - + + + +
    diff --git a/lib/menus/keybinds_screen.js b/src/menus/keybinds_screen.js similarity index 79% rename from lib/menus/keybinds_screen.js rename to src/menus/keybinds_screen.js index cb4ae1e25..739199d97 100644 --- a/lib/menus/keybinds_screen.js +++ b/src/menus/keybinds_screen.js @@ -1,5 +1,6 @@ const { LitElement, html, css } = require('lit') -const { commonCss, displayScreen } = require('./components/common') +const { hideCurrentModal } = require('../globalState') +const { commonCss } = require('./components/common') class KeyBindsScreen extends LitElement { static get styles () { @@ -103,7 +104,7 @@ class KeyBindsScreen extends LitElement { { defaultKey: 'Slash', key: 'Slash', name: 'Open Command' }, // { defaultKey: '0', key: '0', name: 'Attack/Destroy' }, // { defaultKey: '1', key: '1', name: 'Place Block' }, - { defaultKey: 'KeyQ', key: 'KeyQ', name: 'Drop Item' } + { defaultKey: 'KeyQ', key: 'KeyQ', name: 'Drop Item' }, // { defaultKey: 'Digit1', key: 'Digit1', name: 'Hotbar Slot 1' }, // { defaultKey: 'Digit2', key: 'Digit2', name: 'Hotbar Slot 2' }, // { defaultKey: 'Digit3', key: 'Digit3', name: 'Hotbar Slot 3' }, @@ -113,7 +114,7 @@ class KeyBindsScreen extends LitElement { // { defaultKey: 'Digit7', key: 'Digit7', name: 'Hotbar Slot 7' }, // { defaultKey: 'Digit8', key: 'Digit8', name: 'Hotbar Slot 8' }, // { defaultKey: 'Digit9', key: 'Digit9', name: 'Hotbar Slot 9' }, - // { defaultKey: 'KeyE', key: 'KeyE', name: 'Open Inventory' } + { defaultKey: 'KeyE', key: 'KeyE', name: 'Open Inventory' }, ] document.addEventListener('keydown', (e) => { @@ -134,36 +135,36 @@ class KeyBindsScreen extends LitElement {
    ${this.keymaps.map((m, i) => html` -
    - ${m.name} - -
    - { - e.target.setAttribute('pmui-label', `> ${m.key} <`) - this.selected = i - this.requestUpdate() - }}> - { - this.keymaps[i].key = this.keymaps[i].defaultKey - this.requestUpdate() - this.selected = -1 - }}> +
    + ${m.name} + +
    + { + e.target.setAttribute('pmui-label', `> ${m.key} <`) + this.selected = i + this.requestUpdate() + }}> + { + this.keymaps[i].key = this.keymaps[i].defaultKey + this.requestUpdate() + this.selected = -1 + }}> +
    -
    - `)} + `)}
    v.key !== v.defaultKey)} @pmui-click=${this.onResetAllPress}> - displayScreen(this, document.getElementById('options-screen'))}> + hideCurrentModal()}>
    ` } onResetAllPress () { - for (let i = 0; i < this.keymaps.length; i++) { - this.keymaps[i].key = this.keymaps[i].defaultKey + for (const keymap of this.keymaps) { + keymap.key = keymap.defaultKey } this.requestUpdate() } diff --git a/src/menus/loading_or_error_screen.js b/src/menus/loading_or_error_screen.js new file mode 100644 index 000000000..55ee92792 --- /dev/null +++ b/src/menus/loading_or_error_screen.js @@ -0,0 +1,114 @@ +//@ts-check +const { LitElement, html, css } = require('lit') +const { addPanoramaCubeMap } = require('../panorama') +const { hideModal, activeModalStacks, activeModalStack, replaceActiveModalStack, miscUiState } = require('../globalState') +const { guessProblem } = require('../guessProblem') +const { fsState } = require('../loadSave') +const { commonCss } = require('./components/common') + +class LoadingErrorScreen extends LitElement { + static get styles () { + return css` + ${commonCss} + .title { + top: 30px; + } + + .potential-problem { + color: #808080; + } + .last-status { + color: #808080; + } + + .error-buttons { + position: absolute; + top: calc(20% + 60px); + left: 50%; + transform: translate(-50%); + display: flex; + flex-direction: column; + } + ` + } + + static get properties () { + return { + status: { type: String }, + lastStatus: { type: String }, + _loadingDots: { type: String }, + maybeRecoverable: { type: Boolean }, + hasError: { type: Boolean } + } + } + + constructor () { + super() + this.lastStatus = '' + this.hideDots = false + this.hasError = false + this.maybeRecoverable = true + this.status = 'Waiting for JS load' + this._loadingDots = '' + } + + firstUpdated () { + this.statusRunner() + } + + async statusRunner () { + const array = ['.', '..', '...', ''] + const timer = async ms => new Promise((resolve) => {setTimeout(resolve, ms)}) + + const load = async () => { + // eslint-disable-next-line no-constant-condition + for (let i = 0; true; i = ((i + 1) % array.length)) { + this._loadingDots = array[i] + await timer(500) + } + } + + load() + } + + hide () { + // cancel hiding + return true + } + + render () { + return html` +
    + +
    ${this.status}${this.hasError || this.hideDots ? '' : this._loadingDots} +

    ${this.hasError ? guessProblem(this.status) : ''}

    +

    ${this.lastStatus ? `Last status: ${this.lastStatus}` : this.lastStatus}

    + + ${this.hasError + ? html`
    { + this.hasError = false + this.lastStatus = '' + miscUiState.gameLoaded = false + if (activeModalStacks['main-menu']) { + replaceActiveModalStack('main-menu') + } else { + hideModal(undefined, undefined, { force: true }) + } + document.getElementById('play-screen').style.display = 'block' + addPanoramaCubeMap() + }}> { + if (!confirm('Are you sure you want to delete all local world content?')) return + for (const key of Object.keys(localStorage)) { + if (/^[\da-fA-F]{8}(?:\b-[\da-fA-F]{4}){3}\b-[\da-fA-F]{12}$/g.test(key) || key === '/') { + localStorage.removeItem(key) + } + } + window.location.reload() + }}> window.location.reload()} pmui-label="Full Reload" pmui-width="200px">
    ` + : '' + } + ` + } +} + +window.customElements.define('pmui-loading-error-screen', LoadingErrorScreen) diff --git a/src/menus/notification.js b/src/menus/notification.js new file mode 100644 index 000000000..4982fd6f3 --- /dev/null +++ b/src/menus/notification.js @@ -0,0 +1,96 @@ +//@ts-check + +// create lit element +const { LitElement, html, css } = require('lit') +const { proxy, subscribe } = require('valtio/vanilla') + +// move to globalState? +// rename current (non-stackable) notification to one-time (system) notification +const initialNotification = { + show: false, + autoHide: true, + message: '', + type: 'info', +} +export const notification = proxy(initialNotification) + +export const showNotification = (/** @type {Partial} */newNotification) => { + Object.assign(notification, { show: true, ...newNotification }, initialNotification) +} + +window.notification = notification + +class Notification extends LitElement { + static get properties () { + return { + renderHtml: { type: Boolean }, + } + } + + constructor () { + super() + this.renderHtml = false + let timeout + subscribe(notification, () => { + if (timeout) clearTimeout(timeout) + this.requestUpdate() + if (!notification.show) return + this.renderHtml = true + if (!notification.autoHide) return + timeout = setTimeout(() => { + notification.show = false + }, 3000) + }) + } + + render () { + if (!this.renderHtml) return + const show = notification.show && notification.message + return html` +
    + ${notification.message} +
    + ` + } + + ontransitionend = (event) => { + if (event.propertyName !== 'opacity') return + + if (!notification.show) { + this.renderHtml = false + } + } + + static get styles () { + return css` + .notification { + position: absolute; + bottom: 0; + right: 0; + min-width: 200px; + padding: 10px; + white-space: nowrap; + font-size: 12px; + color: #fff; + text-align: center; + background: #000; + opacity: 0; + transition: opacity 0.3s ease-in-out; + } + + .notification-info { + background: #000; + } + + .notification-error { + background: #d00; + } + + .notification-show { + opacity: 1; + } + ` + } +} + +window.customElements.define('pmui-notification', Notification) diff --git a/src/menus/options_screen.js b/src/menus/options_screen.js new file mode 100644 index 000000000..208ed0cae --- /dev/null +++ b/src/menus/options_screen.js @@ -0,0 +1,156 @@ +const { LitElement, html, css } = require('lit') +const { subscribe } = require('valtio') +const { subscribeKey } = require('valtio/utils') +const { showModal, hideCurrentModal, isGameActive, miscUiState } = require('../globalState') +const { toNumber, openFilePicker, setLoadingScreenStatus } = require('../utils') +const { options, watchValue } = require('../optionsStorage') +const { getResourcePackName, uninstallTexturePack, resourcePackState } = require('../texturePack') +const { fsState } = require('../loadSave') +const { commonCss, isMobile } = require('./components/common') + +class OptionsScreen extends LitElement { + static get styles () { + return css` + ${commonCss} + .title { + top: 4px; + } + + main { + display: flex; + flex-direction: column; + position: absolute; + top: calc(100% / 6 - 6px); + left: 50%; + width: 310px; + gap: 4px 0; + place-items: center; + place-content: center; + transform: translate(-50%); + } + + .wrapper { + display: flex; + flex-direction: row; + width: 100%; + gap: 0 10px; + height: 20px; + } + ` + } + + constructor () { + super() + + watchValue(options, o => { + document.documentElement.style.setProperty('--chatScale', `${o.chatScale / 100}`) + document.documentElement.style.setProperty('--chatWidth', `${o.chatWidth}px`) + document.documentElement.style.setProperty('--chatHeight', `${o.chatHeight}px`) + document.documentElement.style.setProperty('--guiScale', `${o.guiScale}`) + }) + + subscribe(options, () => { + this.requestUpdate() + }) + subscribeKey(miscUiState, 'singleplayer', () => { + this.requestUpdate() + }) + subscribeKey(resourcePackState, 'resourcePackInstalled', () => { + this.requestUpdate() + }) + } + + render () { + return html` +
    + +

    Options

    + +
    +
    + { + options.mouseSensX = +e.target.value + }}> + { + options.mouseSensY = +e.target.value + }}> +
    +
    + { + options.chatWidth = +e.target.value + }}> + { + options.chatHeight = +e.target.value + }}> +
    +
    + { + options.chatScale = +e.target.value + }}> + { + options.volume = +e.target.value + }}> +
    +
    + showModal(document.getElementById('keybinds-screen'))}> + { + options.guiScale = +e.target.value + }}> +
    +
    + { + options.renderDistance = +e.target.value + }}> + { + options.fov = +e.target.value + }}> +
    + +
    + { + showModal(document.querySelector('pmui-advanced-optionsscreen')) + } + }> + { + options.mouseRawInput = !options.mouseRawInput + } + }> +
    +
    + { + options.autoFullScreen = !options.autoFullScreen + } + }> + + { + options.autoExitFullscreen = !options.autoExitFullscreen + } + }> +
    +
    + { + if (resourcePackState.resourcePackInstalled) { + const resourcePackName = await getResourcePackName() + if (confirm(`Uninstall ${resourcePackName} resource pack?`)) { + // todo make hidable + setLoadingScreenStatus('Uninstalling texturepack...') + await uninstallTexturePack() + setLoadingScreenStatus(undefined) + } + } else { + if (!fsState.inMemorySave && isGameActive(false)) { + alert('Unable to install resource pack in loaded save for now') + return + } + openFilePicker('resourcepack') + } + }}> +
    + + hideCurrentModal()}> +
    + ` + } +} + +window.customElements.define('pmui-optionsscreen', OptionsScreen) diff --git a/src/menus/pause_screen.js b/src/menus/pause_screen.js new file mode 100644 index 000000000..9a9dacf0a --- /dev/null +++ b/src/menus/pause_screen.js @@ -0,0 +1,122 @@ +//@ts-check +const { LitElement, html, css } = require('lit') +const { subscribe } = require('valtio') +const { subscribeKey } = require('valtio/utils') +const { hideCurrentModal, showModal, miscUiState } = require('../globalState') +const { fsState } = require('../loadSave') +const { saveWorld } = require('../builtinCommands') +const { disconnect } = require('../utils') +const { closeWan, openToWanAndCopyJoinLink, getJoinLink } = require('../localServerMultiplayer') +const { notification } = require('./notification') +const { openURL } = require('./components/common') + +class PauseScreen extends LitElement { + static get styles () { + return css` + .bg { + position: absolute; + top: 0; + left: 0; + background: rgba(0, 0, 0, 0.75); + width: 100%; + height: 100%; + } + + .title { + position: absolute; + top: 40px; + left: 50%; + transform: translate(-50%); + font-size: 10px; + color: white; + text-shadow: 1px 1px #222; + } + + main { + display: flex; + flex-direction: column; + gap: 4px 0; + position: absolute; + left: 50%; + width: 204px; + top: calc(25% + 48px - 16px); + transform: translate(-50%); + } + + .row { + display: flex; + flex-direction: row; + justify-content: space-between; + width: 100%; + } + ` + } + + constructor () { + super() + + subscribe(fsState, () => { + this.requestUpdate() + }) + subscribeKey(miscUiState, 'singleplayer', () => this.requestUpdate()) + subscribeKey(miscUiState, 'wanOpened', () => this.requestUpdate()) + } + + render () { + const joinButton = miscUiState.singleplayer + const isOpenedToWan = miscUiState.wanOpened + + return html` +
    + +

    Game Menu

    + +
    + +
    + openURL(process.env.GITHUB_URL)}> + openURL('https://discord.gg/4Ucm684Fq3')}> +
    + showModal(document.getElementById('options-screen'))}> + + + ${joinButton ? html` +
    + this.clickJoinLinkButton()}> + this.clickJoinLinkButton(true)}> +
    + ` : ''} + { + disconnect() + }}> +
    + ` + } + + async clickJoinLinkButton (qr = false) { + if (!qr && miscUiState.wanOpened) { + closeWan() + return + } + if (!miscUiState.wanOpened || !qr) { + await openToWanAndCopyJoinLink(() => { }, !qr) + } + if (qr) { + const joinLink = getJoinLink() + miscUiState.currentDisplayQr = joinLink + + } + } + + show () { + this.focus() + // todo? + notification.show = false + } + + onReturnPress () { + hideCurrentModal() + } +} + +window.customElements.define('pmui-pausescreen', PauseScreen) diff --git a/lib/menus/play_screen.js b/src/menus/play_screen.js similarity index 53% rename from lib/menus/play_screen.js rename to src/menus/play_screen.js index fb9aa07e2..d4aad4b02 100644 --- a/lib/menus/play_screen.js +++ b/src/menus/play_screen.js @@ -1,5 +1,12 @@ +//@ts-check const { LitElement, html, css } = require('lit') -const { commonCss, displayScreen } = require('./components/common') +const mineflayer = require('mineflayer') +const viewerSupportedVersions = require('prismarine-viewer/public/supportedVersions.json') +const { hideCurrentModal } = require('../globalState') +const { commonCss } = require('./components/common') + +const fullySupporedVersions = viewerSupportedVersions +const partiallySupportVersions = mineflayer.supportedVersions class PlayScreen extends LitElement { static get styles () { @@ -10,7 +17,7 @@ class PlayScreen extends LitElement { } .edit-boxes { - position: absolute; + position: fixed; top: 59px; left: 50%; display: flex; @@ -38,7 +45,7 @@ class PlayScreen extends LitElement { width: 310px; } - .extra-info-bv { + .extra-info-version { font-size: 10px; color: rgb(206, 206, 206); text-shadow: 1px 1px black; @@ -46,6 +53,18 @@ class PlayScreen extends LitElement { left: calc(50% + 2px); bottom: -34px; } + + .extra-info-proxy { + font-size: 8px; + color: rgb(206, 206, 206); + text-shadow: 1px 1px black; + margin:0; + margin-top:-12px; + } + + a { + color: white; + } ` } @@ -63,14 +82,33 @@ class PlayScreen extends LitElement { constructor () { super() - this.username = window.localStorage.getItem('username') ?? 'pviewer' + (Math.floor(Math.random() * 1000)) - this.password = window.localStorage.getItem('password') ?? '' - window.fetch('config.json').then(res => res.json()).then(config => { - this.server = window.localStorage.getItem('server') ?? config.defaultHost - this.serverport = window.localStorage.getItem('serverport') ?? config.defaultHostPort ?? 25565 - this.proxy = window.localStorage.getItem('proxy') ?? config.defaultProxy - this.proxyport = window.localStorage.getItem('proxyport') ?? (!config.defaultProxy && !config.defaultProxyPort ? '' : config.defaultProxyPort ?? 443) - this.version = window.localStorage.getItem('version') ?? config.defaultVersion + this.version = '' + // todo set them sooner add indicator + window.fetch('config.json').then(async res => res.json()).then(c => c, (error) => { + console.error('Failed to load config.json', error) + return {} + }).then(config => { + const params = new URLSearchParams(window.location.search) + + const getParam = (localStorageKey, qs = localStorageKey) => { + const qsValue = qs ? params.get(qs) : undefined + if (qsValue) { + document.getElementById('title-screen').style.display = 'none' + this.style.display = 'block' + } + return qsValue || window.localStorage.getItem(localStorageKey) + } + + this.server = getParam('server', 'ip') ?? config.defaultHost + this.serverport = getParam('serverport', false) ?? config.defaultHostPort ?? 25_565 + this.proxy = getParam('proxy') ?? config.defaultProxy + this.proxyport = getParam('proxyport', false) ?? (!config.defaultProxy && !config.defaultProxyPort ? '' : config.defaultProxyPort ?? 443) + this.version = getParam('version') || (window.localStorage.getItem('version') ?? config.defaultVersion) + this.username = getParam('username') || 'pviewer' + (Math.floor(Math.random() * 1000)) + this.password = getParam('password') || '' + if (process.env.NODE_ENV === 'development' && params.get('reconnect') && this.server && this.username) { + this.onConnectPress() + } }) } @@ -87,6 +125,9 @@ class PlayScreen extends LitElement { pmui-label="Server IP" pmui-id="serverip" pmui-value="${this.server}" + pmui-type="url" + pmui-required="true" + .autocompleteValues=${JSON.parse(localStorage.getItem('serverHistory') || '[]')} @input=${e => { this.server = e.target.value }} > { this.serverport = e.target.value }} >
    { this.proxy = e.target.value }} > { this.proxyport = e.target.value }} >
    +
    +

    Enter proxy url you want to use.

    +
    { this.version = e.target.value }} >
    -

    Leave blank and it will be chosen automatically

    +

    Leave blank and it will be chosen automatically

    - - displayScreen(this, document.getElementById('title-screen'))}> + + hideCurrentModal()}>
    ` } onConnectPress () { + document.getElementById('title-screen').style.display = 'none' window.localStorage.setItem('username', this.username) window.localStorage.setItem('password', this.password) window.localStorage.setItem('server', this.server) @@ -151,7 +203,7 @@ class PlayScreen extends LitElement { this.dispatchEvent(new window.CustomEvent('connect', { detail: { server: `${this.server}:${this.serverport}`, - proxy: `${this.proxy}${this.proxy !== '' ? `:${this.proxyport}` : ''}`, + proxy: `${this.proxy}${this.proxy === '' ? '' : `:${this.proxyport}`}`, username: this.username, password: this.password, botVersion: this.version diff --git a/src/menus/title_screen.js b/src/menus/title_screen.js new file mode 100644 index 000000000..d1828ef90 --- /dev/null +++ b/src/menus/title_screen.js @@ -0,0 +1,198 @@ +const fs = require('fs') +const { LitElement, html, css, unsafeCSS } = require('lit') + +const mcImage = require('minecraft-assets/minecraft-assets/data/1.17.1/gui/title/minecraft.png') +const { fsState } = require('../loadSave') +const { showModal } = require('../globalState') +const { openWorldDirectory, openWorldZip } = require('../browserfs') +const { options } = require('../optionsStorage') +const defaultLocalServerOptions = require('../defaultLocalServerOptions') +const { openFilePicker } = require('../utils') +const { openURL } = require('./components/common') + +// const SUPPORT_WORLD_LOADING = !!window.showDirectoryPicker +const SUPPORT_WORLD_LOADING = true + +class TitleScreen extends LitElement { + static get styles () { + return css` + .game-title { + position: absolute; + top: 30px; + left: calc(50% - 137px); + } + + .game-title .minec { + display: block; + position: absolute; + top: 0; + left: 0; + background-image: url('${unsafeCSS(mcImage)}'); + background-size: 256px; + width: 155px; + height: 44px; + } + + .game-title .raft { + display: block; + position: absolute; + top: 0; + left: 155px; + background-image: url('${unsafeCSS(mcImage)}'); + background-size: 256px; + width: 155px; + height: 44px; + background-position-y: -45px; + } + + .game-title .edition { + display: block; + position: absolute; + top: 37px; + left: calc(88px + 5px); + background-image: url('extra-textures/edition.png'); + background-size: 128px; + width: 88px; + height: 14px; + } + + .splash { + position: absolute; + top: 32px; + left: 227px; + color: #ff0; + transform: translate(-50%, -50%) rotateZ(-20deg) scale(1); + width: max-content; + text-shadow: 1px 1px #220; + font-size: 10px; + animation: splashAnim 400ms infinite alternate linear; + } + + @keyframes splashAnim { + to { + transform: translate(-50%, -50%) rotateZ(-20deg) scale(1.07); + } + } + + .menu { + display: flex; + flex-direction: column; + gap: 4px 0; + position: absolute; + top: calc(25% + 48px); + left: 50%; + width: 200px; + transform: translate(-50%); + } + + .menu-row { + display: flex; + flex-direction: row; + gap: 0 4px; + width: 100%; + } + + .bottom-info { + display: flex; + flex-direction: row; + justify-content: space-between; + position: absolute; + bottom: -1px; + left: 1px; + width: calc(100% - 2px); + color: white; + text-shadow: 1px 1px #222; + font-size: 10px; + } + ` + } + + static get properties () { + return { + versionStatus: { + type: String + }, + versionTitle: { + type: String + }, + isOutdated: { + type: Boolean + } + } + } + + constructor () { + super() + this.versionStatus = '' + this.versionTitle = '' + this.isOutdated = false + if (process.env.NODE_ENV === 'development') { + this.versionStatus = '(dev)' + } else { + fetch('./version.txt').then(async (f) => { + if (f.status === 404) return + const contents = await f.text() + this.isOutdated = contents === process.env.BUILD_VERSION + this.versionStatus = `(${this.isOutdated ? 'latest' : 'new version available'})` + this.versionTitle = `Loaded: ${process.env.BUILD_VERSION}. Remote: ${contents}` + }, () => { }) + } + } + + reload () { + navigator.serviceWorker.getRegistration().then(registration => { + registration.unregister().then(() => { + window.location.reload() + }) + }) + } + + render () { + return html` +
    +
    +
    +
    + Prismarine is a beautiful block +
    + + + +
    + Prismarine Web Client ${this.versionStatus} + A Minecraft client in the browser! +
    + ` + } +} + +window.customElements.define('pmui-titlescreen', TitleScreen) diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts new file mode 100644 index 000000000..969c40140 --- /dev/null +++ b/src/optionsStorage.ts @@ -0,0 +1,80 @@ +// todo implement async options storage + +import { proxy, subscribe } from 'valtio/vanilla' +// weird webpack configuration bug: it cant import valtio/utils in this file +import { subscribeKey } from 'valtio/utils' + +const mergeAny: (arg1: T, arg2: any) => T = Object.assign + +const defaultOptions = { + renderDistance: 4, + closeConfirmation: true, + autoFullScreen: false, + mouseRawInput: false, + autoExitFullscreen: false, + localUsername: 'wanderer', + mouseSensX: 50, + mouseSensY: 50 as number | true, + // mouseInvertX: false, + chatWidth: 320, + chatHeight: 180, + chatScale: 100, + volume: 50, + // fov: 70, + fov: 75, + guiScale: 3, + autoRequestCompletions: true, + touchButtonsSize: 40, + highPerformanceGpu: false, + + frameLimit: false as number | false, + alwaysBackupWorldBeforeLoading: undefined as boolean | undefined | null, + alwaysShowMobileControls: false, + maxMultiplayerRenderDistance: 6, + excludeCommunicationDebugEvents: [], + preventDevReloadWhilePlaying: false, + numWorkers: 4, + localServerOptions: {}, + preferLoadReadonly: false, + disableLoadPrompts: false, + guestUsername: 'guest', + askGuestName: true +} + +export type AppOptions = typeof defaultOptions + +export const options = proxy( + mergeAny(defaultOptions, JSON.parse(localStorage.options || '{}')) +) + +window.options = window.settings = options + +subscribe(options, () => { + localStorage.options = JSON.stringify(options) +}) + +type WatchValue = >(proxy: T, callback: (p: T) => void) => void + +export const watchValue: WatchValue = (proxy, callback) => { + const watchedProps = new Set() + callback(new Proxy(proxy, { + get(target, p, receiver) { + watchedProps.add(p.toString()) + return Reflect.get(target, p, receiver) + }, + })) + for (const prop of watchedProps) { + subscribeKey(proxy, prop, () => { + callback(proxy) + }) + } +} + +watchValue(options, o => { + globalThis.excludeCommunicationDebugEvents = o.excludeCommunicationDebugEvents +}) + +export const useOptionValue = (setting, valueCallback) => { + valueCallback(setting) + subscribe(setting, valueCallback) +} diff --git a/src/panorama.js b/src/panorama.js new file mode 100644 index 000000000..3ae0f0a8c --- /dev/null +++ b/src/panorama.js @@ -0,0 +1,114 @@ +//@ts-check + +import { join } from 'path' +import fs from 'fs' +import { subscribeKey } from 'valtio/utils' +import { fromTexturePackPath, resourcePackState } from './texturePack' +import { options } from './optionsStorage' + +let panoramaCubeMap +let panoramaUsesResourePack = false +let viewer + +export const initPanoramaOptions = (_viewer) => { + viewer = _viewer +} + +const panoramaFiles = [ + 'panorama_1.png', // WS + 'panorama_3.png', // ES + 'panorama_4.png', // Up + 'panorama_5.png', // Down + 'panorama_0.png', // NS + 'panorama_2.png' // SS +] + +const panoramaResourcePackPath = 'assets/minecraft/textures/gui/title/background' +const possiblyLoadPanoramaFromResourcePack = async (file) => { + let base64Texture + if (panoramaUsesResourePack) { + try { + base64Texture = await fs.promises.readFile(fromTexturePackPath(join(panoramaResourcePackPath, file)), 'base64') + } catch (err) { + panoramaUsesResourePack = false + } + } + if (base64Texture) return `data:image/png;base64,${base64Texture}` + else return join('extra-textures/background', file) +} + +const updateResourcePackSupportPanorama = async () => { + try { + await fs.promises.readFile(fromTexturePackPath(join(panoramaResourcePackPath, panoramaFiles[0])), 'base64') + panoramaUsesResourePack = true + } catch (err) { + panoramaUsesResourePack = false + } +} + +subscribeKey(resourcePackState, 'resourcePackInstalled', async () => { + const oldState = panoramaUsesResourePack + const newState = resourcePackState.resourcePackInstalled && (await updateResourcePackSupportPanorama(), panoramaUsesResourePack) + if (newState === oldState) return + removePanorama() + addPanoramaCubeMap() +}) + +// Menu panorama background +export async function addPanoramaCubeMap () { + if (panoramaCubeMap) return + // remove all existing object in the viewer.scene + // viewer.scene.children = [] + + let time = 0 + viewer.camera = new THREE.PerspectiveCamera(85, window.innerWidth / window.innerHeight, 0.05, 1000) + viewer.camera.updateProjectionMatrix() + viewer.camera.position.set(0, 0, 0) + viewer.camera.rotation.set(0, 0, 0) + const panorGeo = new THREE.BoxGeometry(1000, 1000, 1000) + + const loader = new THREE.TextureLoader() + const panorMaterials = [] + await updateResourcePackSupportPanorama() + for (const file of panoramaFiles) { + panorMaterials.push(new THREE.MeshBasicMaterial({ + map: loader.load(await possiblyLoadPanoramaFromResourcePack(file)), + transparent: true, + side: THREE.DoubleSide + })) + } + + const panoramaBox = new THREE.Mesh(panorGeo, panorMaterials) + + panoramaBox.onBeforeRender = () => { + time += 0.01 + panoramaBox.rotation.y = Math.PI + time * 0.01 + panoramaBox.rotation.z = Math.sin(-time * 0.001) * 0.001 + } + + const group = new THREE.Object3D() + group.add(panoramaBox) + + const Entity = require('prismarine-viewer/viewer/lib/entity/Entity') + for (let i = 0; i < 42; i++) { + const m = new Entity('1.16.4', 'squid').mesh + m.position.set(Math.random() * 30 - 15, Math.random() * 20 - 10, Math.random() * 10 - 17) + m.rotation.set(0, Math.PI + Math.random(), -Math.PI / 4, 'ZYX') + const v = Math.random() * 0.01 + m.children[0].onBeforeRender = () => { + m.rotation.y += v + m.rotation.z = Math.cos(panoramaBox.rotation.y * 3) * Math.PI / 4 - Math.PI / 2 + } + group.add(m) + } + + viewer.scene.add(group) + panoramaCubeMap = group +} + +export function removePanorama () { + if (!panoramaCubeMap) return + viewer.camera = new THREE.PerspectiveCamera(options.fov, window.innerWidth / window.innerHeight, 0.1, 1000) + viewer.camera.updateProjectionMatrix() + viewer.scene.remove(panoramaCubeMap) +} diff --git a/lib/perf_hooks_replacement.js b/src/perf_hooks_replacement.js similarity index 100% rename from lib/perf_hooks_replacement.js rename to src/perf_hooks_replacement.js diff --git a/src/reactUi.jsx b/src/reactUi.jsx new file mode 100644 index 000000000..dc6323222 --- /dev/null +++ b/src/reactUi.jsx @@ -0,0 +1,125 @@ +//@ts-check +import { renderToDom } from '@zardoy/react-util' + +import { LeftTouchArea, RightTouchArea, useUsingTouch, useInterfaceState } from '@dimaka/interface' +import { css } from '@emotion/css' +// import DeathScreen from './react/DeathScreen' +import { useSnapshot } from 'valtio' +import { QRCodeSVG } from 'qrcode.react' +import { createPortal } from 'react-dom' +import { contro } from './controls' +import { activeModalStack, isGameActive, miscUiState } from './globalState' +import { options, watchValue } from './optionsStorage' + +// todo +useInterfaceState.setState({ + isFlying: false, + uiCustomization: { + touchButtonSize: 40, + }, + updateCoord([coord, state]) { + const coordToAction = [ + ['z', -1, 'KeyW'], + ['z', 1, 'KeyS'], + ['x', -1, 'KeyA'], + ['x', 1, 'KeyD'], + ['y', 1, 'Space'], // todo jump + ['y', -1, 'ShiftLeft'], // todo jump + ] + // todo refactor + const actionAndState = state === 0 ? coordToAction.filter(([axis]) => axis === coord) : coordToAction.find(([axis, value]) => axis === coord && value === state) + if (!bot) return + if (state === 0) { + for (const action of actionAndState) { + contro.pressedKeyOrButtonChanged({ code: action[2] }, false) + } + } else { + //@ts-expect-error + contro.pressedKeyOrButtonChanged({ code: actionAndState[2] }, true) + } + } +}) + +watchValue(options, (o) => { + useInterfaceState.setState({ + uiCustomization: { + touchButtonSize: o.touchButtonsSize, + }, + }) +}) + +const TouchControls = () => { + // todo setting + const usingTouch = useUsingTouch() + + if (!usingTouch) return null + return ( +
    div { + pointer-events: auto; + } + `} + > + +
    + +
    + ) +} + +function useIsBotAvailable() { + const stack = useSnapshot(activeModalStack) + + return isGameActive(false) +} + +const DisplayQr = () => { + const { currentDisplayQr } = useSnapshot(miscUiState) + + if (!currentDisplayQr) return null + + return createPortal(
    { + miscUiState.currentDisplayQr = null + }} + > + +
    , document.body) + +} + +const App = () => { + const isBotAvailable = useIsBotAvailable() + if (!isBotAvailable) return null + + return
    + + +
    +} + +renderToDom(, { + strictMode: false, + selector: '#react-root', +}) diff --git a/src/rightTopStats.ts b/src/rightTopStats.ts new file mode 100644 index 000000000..6ca5fbaa6 --- /dev/null +++ b/src/rightTopStats.ts @@ -0,0 +1,52 @@ +import Stats from 'stats.js' +import StatsGl from 'stats-gl' +import { isCypress } from './utils' + +const stats = new Stats() +const stats2 = new Stats() +// in my case values are good: gpu: < 0.5, cpu < 0.15 +const statsGl = new StatsGl() +stats2.showPanel(2) + +let total = 0 +const addStat = (dom, size = 80) => { + dom.style.left = '' + dom.style.right = `${total}px` + dom.style.width = '80px' + document.body.appendChild(dom) + total += size +} +addStat(stats.dom) +addStat(stats2.dom) +addStat(statsGl.container) + +if (localStorage.hideStats || isCypress()) { + stats.dom.style.display = 'none' + stats2.dom.style.display = 'none' + statsGl.container.style.display = 'none' +} + +export const initWithRenderer = (canvas) => { + statsGl.init(canvas) + statsGl.container.style.display = 'flex' + statsGl.container.style.justifyContent = 'flex-end' + let i = 0 + for (const _child of statsGl.container.children) { + const child = _child as HTMLElement + if (i++ === 0) { + child.style.display = 'none' + } + child.style.position = '' + } +} + +export const statsStart = () => { + stats.begin() + stats2.begin() + statsGl.begin() +} +export const statsEnd = () => { + stats.end() + stats2.end() + statsGl.end() +} diff --git a/src/shims.js b/src/shims.js new file mode 100644 index 000000000..3a4cf7b68 --- /dev/null +++ b/src/shims.js @@ -0,0 +1,3 @@ +const BrowserFS = require('browserfs') + +export { BrowserFS } diff --git a/styles.css b/src/styles.css similarity index 83% rename from styles.css rename to src/styles.css index 2bf62eba7..61a7b9058 100644 --- a/styles.css +++ b/src/styles.css @@ -12,7 +12,17 @@ box-sizing: border-box; } +#react-root { + z-index: 9; + position: fixed; +} + +a { + color: white; +} + html { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); height: 100vh; overflow: hidden; } @@ -21,7 +31,7 @@ html { position: absolute; top: 0; left: 0; - background: url('textures/1.17.1/gui/options_background.png'), rgba(0, 0, 0, 0.7); + background: url('minecraft-assets/minecraft-assets/data/1.17.1/gui/options_background.png'), rgba(0, 0, 0, 0.7); background-size: 16px; background-repeat: repeat; width: 100%; @@ -58,8 +68,8 @@ body { user-select: none; } -canvas { - position: absolute; +#viewer-canvas { + position: fixed; top: 0; left: 0; height: 100%; @@ -70,14 +80,14 @@ canvas { } #ui-root { - position: absolute; + position: fixed; top: 0; left: 0; transform-origin: top left; transform: scale(var(--guiScale)); width: calc(100% / var(--guiScale)); height: calc(100% / var(--guiScale)); - z-index: 10; + z-index: 8; image-rendering: optimizeSpeed; image-rendering: -moz-crisp-edges; image-rendering: -webkit-optimize-contrast; @@ -113,8 +123,8 @@ canvas { @media only screen and (max-height: 430px) { #ui-root { - transform: scale(1); - width: calc(100% / 1); - height: calc(100% / 1); + transform: scale(1.5); + width: calc(100% / 1.5); + height: calc(100% / 1.5); } -} \ No newline at end of file +} diff --git a/src/texturePack.ts b/src/texturePack.ts new file mode 100644 index 000000000..83a783186 --- /dev/null +++ b/src/texturePack.ts @@ -0,0 +1,272 @@ +import { join, dirname } from 'path' +import fs from 'fs' +import JSZip from 'jszip' +import type { Viewer } from 'prismarine-viewer/viewer/lib/viewer' +import { subscribeKey } from 'valtio/utils' +import { proxy, ref } from 'valtio' +import blocksFileNames from '../generated/blocks.json' +import { showNotification } from './menus/notification' +import type { BlockStates } from './inventory' +import { removeFileRecursiveAsync } from './browserfs' +import { setLoadingScreenStatus } from './utils' + +export const resourcePackState = proxy({ + resourcePackInstalled: false, + currentTexturesDataUrl: undefined as string | undefined, + currentTexturesBlockStates: undefined as BlockStates | undefined, +}) + +function nextPowerOfTwo(n) { + if (n === 0) return 1 + n-- + n |= n >> 1 + n |= n >> 2 + n |= n >> 4 + n |= n >> 8 + n |= n >> 16 + return n + 1 +} + +const mkdirRecursive = async (path) => { + const parts = path.split('/') + let current = '' + for (const part of parts) { + current += part + '/' + try { + await fs.promises.mkdir(current) + } catch (err) { + } + } +} + +const texturePackBasePath = '/userData/resourcePacks/default' +export const uninstallTexturePack = async () => { + await removeFileRecursiveAsync(texturePackBasePath) + setCustomTexturePackData(undefined, undefined) +} + +export const getResourcePackName = async () => { + // temp + try { + return await fs.promises.readFile(join(texturePackBasePath, 'name.txt'), 'utf8') + } catch (err) { + return '???' + } +} + +export const fromTexturePackPath = (path) => { + return join(texturePackBasePath, path) +} + +export const updateTexturePackInstalledState = async () => { + try { + resourcePackState.resourcePackInstalled = await existsAsync(texturePackBasePath) + } catch { + } +} + +export const installTexturePack = async (file: File | ArrayBuffer) => { + try { + await uninstallTexturePack() + } catch (err) { + } + const status = 'Installing resource pack: copying all files' + setLoadingScreenStatus(status) + // extract the zip and write to fs every file in it + const zip = new JSZip() + const zipFile = await zip.loadAsync(file) + if (!zipFile.file('pack.mcmeta')) throw new Error('Not a resource pack: missing pack.mcmeta') + await mkdirRecursive(texturePackBasePath) + + const allFilesArr = Object.entries(zipFile.files) + let done = 0 + const upStatus = () => { + setLoadingScreenStatus(`${status} ${Math.round(++done / allFilesArr.length * 100)}%`) + } + await Promise.all(allFilesArr.map(async ([path, file]) => { + const writePath = join(texturePackBasePath, path) + if (path.endsWith('/')) return + await mkdirRecursive(dirname(writePath)) + await fs.promises.writeFile(writePath, Buffer.from(await file.async('arraybuffer'))) + done++ + upStatus() + })) + await fs.promises.writeFile(join(texturePackBasePath, 'name.txt'), file['name'] ?? '??', 'utf8') + + if (viewer?.world.active) { + await genTexturePackTextures(viewer.version) + } + setLoadingScreenStatus(undefined) + showNotification({ + message: 'Texturepack installed!', + }) +} + +const existsAsync = async (path) => { + try { + await fs.promises.stat(path) + return true + } catch (err) { + return false + } +} + +type TextureResolvedData = { + blockSize: number + // itemsUrlContent: string +} + +const arrEqual = (a: any[], b: any[]) => a.length === b.length && a.every((x) => b.includes(x)) + +const applyTexturePackData = async (version: string, { blockSize }: TextureResolvedData, blocksUrlContent: string) => { + const result = await fetch(`blocksStates/${version}.json`) + const blockStates: BlockStates = await result.json() + const factor = blockSize / 16 + + // this will be refactored with generateTextures refactor + const processObj = (x) => { + if (typeof x !== 'object' || !x) return + if (Array.isArray(x)) { + for (const v of x) { + processObj(v) + } + + } else { + const actual = Object.keys(x) + const needed = ['u', 'v', 'su', 'sv'] + + if (!arrEqual(actual, needed)) { + for (const v of Object.values(x)) { + processObj(v) + } + return + } + for (const k of needed) { + x[k] *= factor + } + } + } + processObj(blockStates) + setCustomTexturePackData(blocksUrlContent, blockStates) +} + +const setCustomTexturePackData = (blockTextures, blockStates) => { + resourcePackState.currentTexturesBlockStates = blockStates && ref(blockStates) + resourcePackState.currentTexturesDataUrl = blockTextures + resourcePackState.resourcePackInstalled = blockTextures !== undefined +} + +const getSizeFromImage = async (filePath: string) => { + const probeImg = new Image() + const file = await fs.promises.readFile(filePath, 'base64') + probeImg.src = `data:image/png;base64,${file}` + await new Promise((resolve, reject) => { + probeImg.addEventListener('load', resolve) + }) + if (probeImg.width !== probeImg.height) throw new Error(`Probe texture ${filePath} is not square`) + return probeImg.width +} + +export const genTexturePackTextures = async (version: string) => { + setCustomTexturePackData(undefined, undefined) + let blocksBasePath = '/userData/resourcePacks/default/assets/minecraft/textures/block' + // todo not clear why this is needed + const blocksBasePathAlt = '/userData/resourcePacks/default/assets/minecraft/textures/blocks' + const blocksGenereatedPath = `/userData/resourcePacks/default/${version}.png` + const genereatedPathData = `/userData/resourcePacks/default/${version}.json` + if (!(await existsAsync(blocksBasePath))) { + if (await existsAsync(blocksBasePathAlt)) { + blocksBasePath = blocksBasePathAlt + } else { + return + } + } + if (await existsAsync(blocksGenereatedPath)) { + applyTexturePackData(version, JSON.parse(await fs.promises.readFile(genereatedPathData, 'utf8')), await fs.promises.readFile(blocksGenereatedPath, 'utf8')) + return + } + + setLoadingScreenStatus('Generating custom textures') + + const textureFiles = blocksFileNames.indexes[version].map(k => blocksFileNames.blockNames[k]) + textureFiles.unshift('missing_texture.png') + + const texSize = nextPowerOfTwo(Math.ceil(Math.sqrt(textureFiles.length))) + const originalTileSize = 16 + + const firstBlockFile = (await fs.promises.readdir(blocksBasePath)).find(f => f.endsWith('.png')) + if (!firstBlockFile) { + return + } + + // we get the size of image from the first block file, which is not ideal but works in 99% cases + const tileSize = await getSizeFromImage(join(blocksBasePath, firstBlockFile)) + + const imgSize = texSize * tileSize + + const canvas = document.createElement('canvas') + canvas.width = imgSize + canvas.height = imgSize + const src = `textures/${version}.png` + const ctx = canvas.getContext('2d') + ctx.imageSmoothingEnabled = false + const img = new Image() + img.src = src + await new Promise((resolve, reject) => { + img.onerror = reject + img.addEventListener('load', resolve) + }) + for (const [i, fileName] of textureFiles.entries()) { + const x = (i % texSize) * tileSize + const y = Math.floor(i / texSize) * tileSize + const xOrig = (i % texSize) * originalTileSize + const yOrig = Math.floor(i / texSize) * originalTileSize + let imgCustom: HTMLImageElement + try { + const fileBase64 = await fs.promises.readFile(join(blocksBasePath, fileName), 'base64') + const _imgCustom = new Image() + await new Promise(resolve => { + _imgCustom.addEventListener('load', () => { + imgCustom = _imgCustom + resolve() + }) + _imgCustom.onerror = () => { + console.log('Skipping issued texture', fileName) + resolve() + } + _imgCustom.src = `data:image/png;base64,${fileBase64}` + }) + } catch { + console.log('Skipping not found texture', fileName) + } + + if (imgCustom) { + ctx.drawImage(imgCustom, x, y, tileSize, tileSize) + } else { + // todo this involves incorrect mappings for existing textures when the size is different + ctx.drawImage(img, xOrig, yOrig, originalTileSize, originalTileSize, x, y, tileSize, tileSize) + } + } + const blockDataUrl = canvas.toDataURL('image/png') + const newData: TextureResolvedData = { + blockSize: tileSize, + } + await fs.promises.writeFile(genereatedPathData, JSON.stringify(newData), 'utf8') + await fs.promises.writeFile(blocksGenereatedPath, blockDataUrl, 'utf8') + await applyTexturePackData(version, newData, blockDataUrl) + + // const a = document.createElement('a') + // a.href = dataUrl + // a.download = 'pack.png' + // a.click() +} + +export const watchTexturepackInViewer = (viewer: Viewer) => { + subscribeKey(resourcePackState, 'currentTexturesDataUrl', () => { + console.log('applying resourcepack world data') + viewer.world.texturesDataUrl = resourcePackState.currentTexturesDataUrl + viewer.world.blockStatesData = resourcePackState.currentTexturesBlockStates + if (!viewer?.world.active) return + viewer.world.updateTexturesData() + }) +} diff --git a/src/updateTime.ts b/src/updateTime.ts new file mode 100644 index 000000000..6ba296ad9 --- /dev/null +++ b/src/updateTime.ts @@ -0,0 +1,40 @@ +export default (bot: import('mineflayer').Bot) => { + bot.on('time', () => { + // 0 morning + const dayTotal = 24_000 + const evening = 12_542 / dayTotal + const night = 17_843 / dayTotal + const morningStart = 22_300 / dayTotal + const morningEnd = 23_961 / dayTotal + const timeProgress = bot.time.time / dayTotal + + // todo check actual colors + const dayColorRainy = { r: 111 / 255, g: 156 / 255, b: 236 / 255 } + // todo yes, we should make animations (and rain) + // eslint-disable-next-line unicorn/numeric-separators-style + const dayColor = bot.isRaining ? dayColorRainy : { r: 0.6784313725490196, g: 0.8470588235294118, b: 0.9019607843137255 } // lightblue + // let newColor = dayColor + let int = 1 + if (timeProgress < evening) { + // stay dayily + } else if (timeProgress < night) { + const progressNorm = timeProgress - evening + const progressMax = night - evening + int = progressNorm / progressMax + } else if (timeProgress < morningStart) { + int = 0 + } else if (timeProgress < morningEnd) { + const progressNorm = timeProgress - morningStart + const progressMax = night - morningEnd + int = 1 - (progressNorm / progressMax) + } + // todo need to think wisely how to set these values & also move directional light around! + const colorInt = Math.max(int, 0.1) + window.viewer.scene.background = new THREE.Color(dayColor.r * colorInt, dayColor.g * colorInt, dayColor.b * colorInt) + // todo and these too! + // ambient light + window.viewer.scene.children[0].intensity = Math.max(int, 0.25) + // directional light + window.viewer.scene.children[1].intensity = Math.min(int, 0.5) + }) +} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 000000000..8413df8b6 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,249 @@ +import * as crypto from 'crypto' +import UUID from 'uuid-1345' +import { activeModalStack, hideModal, miscUiState, showModal } from './globalState' +import { notification } from './menus/notification' +import { options } from './optionsStorage' +import { saveWorld } from './builtinCommands' +import { openWorldZip } from './browserfs' +import { installTexturePack } from './texturePack' + +export const goFullscreen = async (doToggle = false) => { + if (!document.fullscreenElement) { + // todo display a message or repeat? + await document.documentElement.requestFullscreen().catch(() => { }) + // request full keyboard access + //@ts-expect-error + navigator.keyboard?.lock?.(['Escape', 'KeyW']) + } else if (doToggle) { + await document.exitFullscreen().catch(() => { }) + } +} + +export const toNumber = (val) => { + const num = Number(val) + return isNaN(num) ? undefined : num +} + +export const pointerLock = { + get hasPointerLock() { + return document.pointerLockElement + }, + justHitEscape: false, + async requestPointerLock() { + if (document.getElementById('hud').style.display === 'none' || activeModalStack.length || !document.documentElement.requestPointerLock || miscUiState.currentTouch) { + return + } + if (options.autoFullScreen) { + void goFullscreen() + } + const displayBrowserProblem = () => { + notification.show = true + notification.message = navigator['keyboard'] ? 'Browser Limitation: Click on screen, enable Auto Fullscreen or F11' : 'Browser Limitation: Click on screen or use fullscreen in Chrome' + } + if (!(document.fullscreenElement && navigator['keyboard']) && this.justHitEscape) { + displayBrowserProblem() + } else { + //@ts-expect-error + const promise: any = document.documentElement.requestPointerLock({ + unadjustedMovement: options.mouseRawInput + }) + promise?.catch((error) => { + if (error.name === 'NotSupportedError') { + // Some platforms may not support unadjusted movement, request again a regular pointer lock. + document.documentElement.requestPointerLock() + } else if (error.name === 'SecurityError') { + // cause: https://discourse.threejs.org/t/how-to-avoid-pointerlockcontrols-error/33017/4 + displayBrowserProblem() + } else { + console.error(error) + } + }) + } + this.justHitEscape = false + } +} + +window.getScreenRefreshRate = getScreenRefreshRate + +/** + * Allows to obtain the estimated Hz of the primary monitor in the system. + */ +export async function getScreenRefreshRate(): Promise { + let requestId = null + let callbackTriggered = false + let resolve + + const DOMHighResTimeStampCollection = [] + + const triggerAnimation = (DOMHighResTimeStamp) => { + DOMHighResTimeStampCollection.unshift(DOMHighResTimeStamp) + + if (DOMHighResTimeStampCollection.length > 10) { + const t0 = DOMHighResTimeStampCollection.pop() + const fps = Math.floor(1000 * 10 / (DOMHighResTimeStamp - t0)) + + if (!callbackTriggered) { + resolve(fps/* , DOMHighResTimeStampCollection */) + } + + callbackTriggered = true + } + + requestId = window.requestAnimationFrame(triggerAnimation) + } + + window.requestAnimationFrame(triggerAnimation) + + window.setTimeout(() => { + window.cancelAnimationFrame(requestId) + requestId = null + }, 500) + + return new Promise(_resolve => { + resolve = _resolve + }) +} + +export const getGamemodeNumber = (bot) => { + switch (bot.game.gameMode) { + case 'survival': return 0 + case 'creative': return 1 + case 'adventure': return 2 + case 'spectator': return 3 + default: return -1 + } +} + +export const isCypress = () => { + return localStorage.cypress === 'true' +} + +// https://github.com/PrismarineJS/node-minecraft-protocol/blob/cf1f67117d586b5e6e21f0d9602da12e9fcf46b6/src/server/login.js#L170 +function javaUUID(s: string) { + const hash = crypto.createHash('md5') + hash.update(s, 'utf8') + const buffer = hash.digest() + buffer[6] = (buffer[6] & 0x0f) | 0x30 + buffer[8] = (buffer[8] & 0x3f) | 0x80 + return buffer +} + +export function nameToMcOfflineUUID(name) { + return (new UUID(javaUUID('OfflinePlayer:' + name))).toString() +} + +export const setLoadingScreenStatus = function (status: string | undefined, isError = false, hideDots = false) { + const loadingScreen = document.getElementById('loading-error-screen') + + if (status === undefined) { + loadingScreen.status = '' + hideModal({ elem: loadingScreen }, null, { force: true }) + return + } + + // todo update in component instead + showModal(loadingScreen) + if (loadingScreen.hasError) { + miscUiState.gameLoaded = false + return + } + loadingScreen.hideDots = hideDots + loadingScreen.hasError = isError + loadingScreen.lastStatus = isError ? loadingScreen.status : '' + loadingScreen.status = status +} + + +export const disconnect = async () => { + if (window.localServer) { + await saveWorld() + localServer.quit() + } else { + // workaround bot.end doesn't end the socket and emit end event + bot.end() + bot._client.socket.end() + } + bot._client.emit('end', 'You left the server') + miscUiState.gameLoaded = false +} + +export const loadScript = async function (scriptSrc: string) { + if (document.querySelector(`script[src="${scriptSrc}"]`)) { + return + } + + return new Promise((resolve, reject) => { + const scriptElement = document.createElement('script') + scriptElement.src = scriptSrc + scriptElement.async = true + + scriptElement.addEventListener('load', () => { + resolve(scriptElement) + }) + + scriptElement.onerror = (error) => { + reject(error) + } + + document.head.appendChild(scriptElement) + }) +} + +// doesn't support snapshots +export const toMajorVersion = (version) => { + const [a, b] = (String(version)).split('.') + return `${a}.${b}` +} + +let prevRenderDistance = options.renderDistance +export const setRenderDistance = () => { + worldView.viewDistance = options.renderDistance + if (localServer) { + localServer.options['view-distance'] = options.renderDistance + localServer.players[0].emit('playerChangeRenderDistance', options.renderDistance) + } + prevRenderDistance = options.renderDistance +} +export const reloadChunks = () => { + if (!worldView) return + setRenderDistance() + worldView.updatePosition(bot.entity.position, true) +} + +export const openFilePicker = (specificCase?: 'resourcepack') => { + // create and show input picker + let picker: HTMLInputElement = document.body.querySelector('input#file-zip-picker') + if (!picker) { + picker = document.createElement('input') + picker.type = 'file' + picker.accept = '.zip' + + picker.addEventListener('change', () => { + const file = picker.files[0] + picker.value = '' + if (!file) return + if (!file.name.endsWith('.zip')) { + const doContinue = confirm(`Are you sure ${file.name.slice(-20)} is .zip file? Only .zip files are supported. Continue?`) + if (!doContinue) return + } + if (specificCase === 'resourcepack') { + installTexturePack(file) + } else { + openWorldZip(file) + } + }) + picker.hidden = true + document.body.appendChild(picker) + } + + picker.click() +} + +export const resolveTimeout = async (promise, timeout = 10_000) => { + return new Promise((resolve, reject) => { + promise.then(resolve, reject) + setTimeout(() => { + reject(new Error('timeout')) + }, timeout) + }) +} diff --git a/src/utilsTs.ts b/src/utilsTs.ts new file mode 100644 index 000000000..5c5f0999e --- /dev/null +++ b/src/utilsTs.ts @@ -0,0 +1,29 @@ +type Options = boolean | Readonly | undefined + +function registerListener( + element: Readonly | null | undefined, + eventType: KD, + listener: (this: Document, evt: DocumentEventMap[KD]) => void, + options?: Options, +): void +function registerListener( + element: Readonly | null | undefined, + eventType: KH, + listener: (this: HTMLElement, evt: HTMLElementEventMap[KH]) => void, + options?: Options, +): void +function registerListener( + element: Readonly | null | undefined, + eventType: KW, + listener: (this: Window, evt: WindowEventMap[KW]) => void, + options?: Options, +): void +//@ts-expect-error +function registerListener( + element: Readonly | null | undefined, + eventType: string, + listener: (evt: Event) => void, + options?: Options, +): void + +export type RegisterListener = typeof registerListener diff --git a/lib/vr.js b/src/vr.js similarity index 94% rename from lib/vr.js rename to src/vr.js index 1f2a1a3fb..72d23cb13 100644 --- a/lib/vr.js +++ b/src/vr.js @@ -5,9 +5,10 @@ const { GLTFLoader } = require('three/examples/jsm/loaders/GLTFLoader.js') const { XRControllerModelFactory } = require('three/examples/jsm/webxr/XRControllerModelFactory.js') const TWEEN = require('@tweenjs/tween.js') -function initVR (bot, renderer, viewer) { +async function initVR (bot, renderer, viewer) { if (!('xr' in navigator)) return - if (!navigator.userAgent.includes('OculusBrowser')) return + const isSupported = await navigator.xr.isSessionSupported('immersive-vr') + if (!isSupported) return // VR document.body.appendChild(VRButton.createButton(renderer)) diff --git a/src/watchOptions.ts b/src/watchOptions.ts new file mode 100644 index 000000000..de5450330 --- /dev/null +++ b/src/watchOptions.ts @@ -0,0 +1,7 @@ +// not all options are watched here + +import { subscribeKey } from 'valtio/utils' +import { options } from './optionsStorage' +import { reloadChunks } from './utils' + +subscribeKey(options, 'renderDistance', reloadChunks) diff --git a/test/basic.test.js b/test/basic.test.js deleted file mode 100644 index d461258c8..000000000 --- a/test/basic.test.js +++ /dev/null @@ -1,7 +0,0 @@ -/* eslint-env mocha */ - -describe('basic', () => { - it('test', () => { - - }) -}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..1665bf346 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ESNext", + "moduleResolution": "Node", + "module": "ESNext", + "allowJs": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "noEmit": true, + "resolveJsonModule": true, + "strictFunctionTypes": true, + "noImplicitAny": false, + "noFallthroughCasesInSwitch": true, + "allowUnreachableCode": true, + "forceConsistentCasingInFileNames": true, + "useUnknownInCatchVariables": false, + "skipLibCheck": true, + // this the only options that allows smooth transition from js to ts (by not dropping types from js files) + // however might need to consider includeing *only needed libraries* instead of using this + "maxNodeModuleJsDepth": 1 + // "strictNullChecks": true + }, + "include": [ + "src", + "cypress" + ] +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 000000000..5219613ed --- /dev/null +++ b/vercel.json @@ -0,0 +1,6 @@ +{ + "github": { + "enabled": false, + "silent": false + } +} diff --git a/webpack.common.js b/webpack.common.js deleted file mode 100644 index 98f813c7b..000000000 --- a/webpack.common.js +++ /dev/null @@ -1,86 +0,0 @@ -const webpack = require('webpack') -const path = require('path') -const CopyPlugin = require('copy-webpack-plugin') -const HtmlWebpackPlugin = require('html-webpack-plugin') -const WorkboxPlugin = require('workbox-webpack-plugin') -// https://webpack.js.org/guides/production/ - -const config = { - entry: path.resolve(__dirname, './index.js'), - output: { - path: path.resolve(__dirname, './public'), - filename: './index.js', - publicPath: './' - }, - resolve: { - alias: { - 'minecraft-protocol': path.resolve( - __dirname, - 'node_modules/minecraft-protocol/src/index.js' - ), // Hack to allow creating the client in a browser - express: false, - net: 'net-browserify', - fs: false, - jose: false - }, - fallback: { - jose: false, - zlib: require.resolve('browserify-zlib'), - stream: require.resolve('stream-browserify'), - buffer: require.resolve('buffer/'), - events: require.resolve('events/'), - assert: require.resolve('assert/'), - crypto: require.resolve('crypto-browserify'), - path: require.resolve('path-browserify'), - constants: require.resolve('constants-browserify'), - os: require.resolve('os-browserify/browser'), - http: require.resolve('http-browserify'), - https: require.resolve('https-browserify'), - timers: require.resolve('timers-browserify'), - // fs: require.resolve("fs-memory/singleton"), - child_process: false, - tls: false, - perf_hooks: path.resolve(__dirname, 'lib/perf_hooks_replacement.js'), - dns: path.resolve(__dirname, 'lib/dns.js') - } - }, - plugins: [ - new HtmlWebpackPlugin({ - template: 'index.html', - hash: true, - minify: false - }), - // fix "process is not defined" error: - new webpack.ProvidePlugin({ - process: 'process/browser' - }), - new webpack.ProvidePlugin({ - Buffer: ['buffer', 'Buffer'] - }), - new webpack.NormalModuleReplacementPlugin( - /prismarine-viewer[/|\\]viewer[/|\\]lib[/|\\]utils/, - './utils.web.js' - ), - new WorkboxPlugin.GenerateSW({ - // these options encourage the ServiceWorkers to get in there fast - // and not allow any straggling "old" SWs to hang around - clientsClaim: true, - skipWaiting: true, - include: ['index.html', 'manifest.json'] // not caching a lot as anyway this works only online - }), - new CopyPlugin({ - patterns: [ - { from: path.join(__dirname, '/styles.css'), to: './styles.css' }, - { from: path.join(__dirname, '/node_modules/prismarine-viewer/public/blocksStates/'), to: './blocksStates/' }, - { from: path.join(__dirname, '/node_modules/prismarine-viewer/public/textures/'), to: './textures/' }, - { from: path.join(__dirname, '/node_modules/prismarine-viewer/public/worker.js'), to: './' }, - { from: path.join(__dirname, '/node_modules/prismarine-viewer/public/supportedVersions.json'), to: './' }, - { from: path.join(__dirname, 'assets/'), to: './' }, - { from: path.join(__dirname, 'extra-textures/'), to: './extra-textures/' }, - { from: path.join(__dirname, 'config.json'), to: './config.json' } - ] - }) - ] -} - -module.exports = config diff --git a/webpack.dev.js b/webpack.dev.js deleted file mode 100644 index c8aa4be07..000000000 --- a/webpack.dev.js +++ /dev/null @@ -1,16 +0,0 @@ -const { merge } = require('webpack-merge') -const common = require('./webpack.common.js') -const path = require('path') - -module.exports = merge(common, { - mode: 'development', - devtool: 'inline-source-map', - cache: true, - devServer: { - contentBase: path.resolve(__dirname, './public'), - compress: true, - inline: true, - // open: true, - hot: true - } -}) diff --git a/webpack.prod.js b/webpack.prod.js deleted file mode 100644 index 5c00efb2d..000000000 --- a/webpack.prod.js +++ /dev/null @@ -1,15 +0,0 @@ -const { merge } = require('webpack-merge') -const common = require('./webpack.common.js') - -const LodashModuleReplacementPlugin = require('lodash-webpack-plugin') -const { CleanWebpackPlugin } = require('clean-webpack-plugin') -const webpack = require('webpack') - -module.exports = merge(common, { - mode: 'production', - plugins: [ - new CleanWebpackPlugin(), - new webpack.optimize.ModuleConcatenationPlugin(), - new LodashModuleReplacementPlugin() - ] -})