├── .gitignore ├── game ├── .gitignore ├── src │ ├── server │ │ ├── index.ts │ │ └── tsconfig.json │ ├── client │ │ ├── tsconfig.json │ │ ├── util.ts │ │ ├── classes │ │ │ ├── Camera.ts │ │ │ ├── Raycast.ts │ │ │ └── NuiComms.ts │ │ └── index.ts │ └── shared │ │ ├── logger.ts │ │ └── vector3.ts ├── package.json ├── esbuild.cjs └── pnpm-lock.yaml ├── ui ├── src │ ├── constants.ts │ ├── vite-env.d.ts │ ├── style.scss │ ├── components │ │ └── ui │ │ │ ├── index.tsx │ │ │ └── ui.module.scss │ ├── lib │ │ ├── util.ts │ │ └── NuiComms.ts │ ├── main.tsx │ └── index.tsx ├── tsconfig.vite.json ├── vite.config.ts ├── .gitignore ├── index.html ├── tsconfig.json ├── package.json ├── public │ └── vite.svg └── pnpm-lock.yaml ├── .vscode └── settings.json ├── shared └── types │ ├── util.ts │ └── nui-comms.ts ├── fxmanifest.lua ├── package.json ├── README.md ├── biome.json ├── yarn.lock └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /game/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /ui/src/constants.ts: -------------------------------------------------------------------------------- 1 | export const ROTATION_ORDER = 'YZX'; 2 | -------------------------------------------------------------------------------- /ui/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /game/src/server/index.ts: -------------------------------------------------------------------------------- 1 | setImmediate(() => { 2 | console.log('Server is running...'); 3 | }); 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "**/node_modules": true 4 | }, 5 | "typescript.tsdk": "./node_modules/typescript/lib" 6 | } 7 | -------------------------------------------------------------------------------- /ui/src/style.scss: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | 6 | #root { 7 | width: 100vw; 8 | height: 100vh; 9 | overflow: hidden; 10 | } 11 | -------------------------------------------------------------------------------- /shared/types/util.ts: -------------------------------------------------------------------------------- 1 | export type Vec3 = { x: number; y: number; z: number }; 2 | 3 | export type ObjEntries = { 4 | [K in keyof T]: [K, T[K]]; 5 | }[keyof T][]; 6 | -------------------------------------------------------------------------------- /ui/tsconfig.vite.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'cerulean' 2 | game 'gta5' 3 | 4 | client_scripts { 5 | 'game/dist/client.js' 6 | } 7 | 8 | server_scripts { 9 | 'game/dist/server.js' 10 | } 11 | 12 | ui_page 'ui/dist/index.html' 13 | 14 | files { 15 | 'ui/dist/index.html', 16 | 'ui/dist/assets/*' 17 | } -------------------------------------------------------------------------------- /ui/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react-swc'; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | base: './', 7 | build: { 8 | emptyOutDir: true, 9 | }, 10 | plugins: [react()], 11 | }); 12 | 13 | -------------------------------------------------------------------------------- /ui/src/components/ui/index.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from "react"; 2 | 3 | import styles from "./ui.module.scss"; 4 | 5 | export const UI: FC = () => { 6 | return ( 7 |
8 | 11 |
12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /ui/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | UI 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fivem-threejs-wrapper", 3 | "version": "1.0.0", 4 | "author": "gallejens", 5 | "license": "ISC", 6 | "scripts": { 7 | "build": "cd game && pnpm build && cd ../ui && pnpm build", 8 | "watch": "cd game && pnpm watch", 9 | "fullinstall": "cd game && pnpm i && cd ../ui && pnpm i" 10 | }, 11 | "devDependencies": { 12 | "@biomejs/biome": "1.5.3", 13 | "typescript": "5.3.3" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ui/src/components/ui/ui.module.scss: -------------------------------------------------------------------------------- 1 | $primary-color: #fa5252; 2 | $white-color: #e0e0e0; 3 | 4 | .ui { 5 | width: auto; 6 | height: auto; 7 | 8 | & > .button { 9 | width: 9vh; 10 | height: 9vh; 11 | background-color: $primary-color; 12 | border: none; 13 | border-radius: 1.5vh; 14 | 15 | font-size: 5.5vh; 16 | color: $white-color; 17 | font-weight: bold; 18 | 19 | box-shadow: 0px 0px 50px 20px rgba(0, 0, 0, 0.1); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ui/src/lib/util.ts: -------------------------------------------------------------------------------- 1 | import { Vec3 } from '@shared/types/util'; 2 | 3 | export const transformCoords = (gtaCoords: Vec3) => { 4 | const { x, y, z } = gtaCoords; 5 | return { 6 | x, 7 | y: z, 8 | z: y * -1, 9 | }; 10 | }; 11 | 12 | export const transformRotation = (gtaRotation: Vec3) => { 13 | return { 14 | x: gtaRotation.x, 15 | y: Math.abs(gtaRotation.y) > Math.PI / 4 ? -gtaRotation.z : gtaRotation.z, 16 | z: gtaRotation.y, 17 | }; 18 | }; 19 | -------------------------------------------------------------------------------- /ui/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { Canvas } from "@react-three/fiber"; 2 | import React from "react"; 3 | import ReactDOM from "react-dom/client"; 4 | import { App } from "."; 5 | 6 | import "./style.scss"; 7 | 8 | const rootEl = document.getElementById("root"); 9 | if (!rootEl) throw new Error("No root element"); 10 | 11 | const root = ReactDOM.createRoot(rootEl); 12 | root.render( 13 | 14 | 15 | 16 | 17 | 18 | ); 19 | -------------------------------------------------------------------------------- /game/src/client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "strict": true, 5 | "esModuleInterop": true, 6 | "allowSyntheticDefaultImports": true, 7 | "module": "CommonJS", 8 | "types": ["@types/node", "@citizenfx/client"], 9 | "lib": ["ES2020"], 10 | "skipLibCheck": true, 11 | "paths": { 12 | "@shared/*": ["../../../shared/*"] 13 | } 14 | }, 15 | "include": ["./**/*", "../../../shared", "../shared/**/*"], 16 | "exclude": ["**/node_modules"] 17 | } 18 | -------------------------------------------------------------------------------- /game/src/server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "strict": true, 5 | "esModuleInterop": true, 6 | "allowSyntheticDefaultImports": true, 7 | "module": "CommonJS", 8 | "types": ["@types/node", "@citizenfx/server"], 9 | "lib": ["ES2020"], 10 | "skipLibCheck": true, 11 | "paths": { 12 | "@shared/*": ["../../../shared/*"] 13 | } 14 | }, 15 | "include": ["./**/*", "../../../shared", "../shared/**/*"], 16 | "exclude": ["**/node_modules"] 17 | } 18 | -------------------------------------------------------------------------------- /game/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "game", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "type": "module", 6 | "scripts": { 7 | "build": "pnpm typecheck && node esbuild.cjs", 8 | "watch": "pnpm typecheck && node esbuild.cjs --watch", 9 | "typecheck": "tsc --noEmit -p src/client/tsconfig.json && tsc --noEmit -p src/server/tsconfig.json" 10 | }, 11 | "devDependencies": { 12 | "@citizenfx/client": "2.0.7345-1", 13 | "@citizenfx/server": "2.0.7345-1", 14 | "@types/node": "^20.11.6", 15 | "esbuild": "^0.19.12", 16 | "typescript": "5.3.3" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /game/src/shared/logger.ts: -------------------------------------------------------------------------------- 1 | type Level = 'INFO' | 'WARN' | 'ERROR' | 'DEBUG'; 2 | 3 | export class Logger { 4 | private name: string; 5 | 6 | constructor(name: string) { 7 | this.name = name; 8 | } 9 | 10 | private log(level: Level, ...args: string[]) { 11 | console.log(`[${this.name}] (${level}) ${args.join(' ')}`); 12 | } 13 | 14 | public info(...args: string[]) { 15 | this.log('INFO', ...args); 16 | } 17 | 18 | public warn(...args: string[]) { 19 | this.log('WARN', ...args); 20 | } 21 | 22 | public error(...args: string[]) { 23 | this.log('ERROR', ...args); 24 | } 25 | 26 | public debug(...args: string[]) { 27 | this.log('DEBUG', ...args); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fivem-threejs-wrapper 2 | 3 | ## Showcase 4 | 5 | - https://youtu.be/ThgPESyyvRU 6 | 7 | - By default it should show a 'E' interact button inside default MRPD. 8 | 9 | ## What is this? 10 | 11 | This is a showcase/template resource on how to use ThreeJS in FiveM. 12 | You could use this to create inworld UIs, object movement gizmo, etc... 13 | 14 | ## How to use 15 | 16 | React & TS knowledge is required to use this resource. 17 | 18 | ``` 19 | npm fullinstall && npm run build 20 | ``` 21 | 22 | ### Tools 23 | 24 | - There is a '/raycast' command available to get a position and surfacenormal. 25 | 26 | ## Disclaimer 27 | 28 | This is not a complete resource, you will need to add your own logic to actually make use of it. 29 | -------------------------------------------------------------------------------- /ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | "baseUrl": "./", 17 | 18 | /* Linting */ 19 | "strict": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "noFallthroughCasesInSwitch": true, 23 | "paths": { 24 | "@shared/*": ["../shared/*"] 25 | } 26 | }, 27 | "include": ["src", "../shared"], 28 | "references": [{ "path": "./tsconfig.vite.json" }] 29 | } 30 | 31 | -------------------------------------------------------------------------------- /ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "watch": "tsc && vite build --watch" 10 | }, 11 | "dependencies": { 12 | "@react-three/drei": "^9.96.5", 13 | "@react-three/fiber": "^8.15.15", 14 | "@uidotdev/usehooks": "^2.4.1", 15 | "react": "^18.2.0", 16 | "react-dom": "^18.2.0", 17 | "sass": "^1.70.0", 18 | "three": "^0.160.1" 19 | }, 20 | "devDependencies": { 21 | "@types/react": "^18.2.43", 22 | "@types/react-dom": "^18.2.17", 23 | "@types/three": "^0.160.0", 24 | "@typescript-eslint/eslint-plugin": "^6.14.0", 25 | "@typescript-eslint/parser": "^6.14.0", 26 | "@vitejs/plugin-react-swc": "^3.5.0", 27 | "typescript": "^5.2.2", 28 | "vite": "^5.0.8" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /game/src/client/util.ts: -------------------------------------------------------------------------------- 1 | import { Vec3 } from '@shared/types/util'; 2 | 3 | export const getEntityCoords = (entity: number): Vec3 => { 4 | const [x, y, z] = GetEntityCoords(entity, true); 5 | return { x, y, z }; 6 | }; 7 | 8 | export function radToDeg(rad: number): number; 9 | export function radToDeg(rad: Vec3): Vec3; 10 | export function radToDeg(rad: number | Vec3): number | Vec3 { 11 | if (typeof rad === 'number') { 12 | return (rad * 180) / Math.PI; 13 | } 14 | 15 | return { 16 | x: (rad.x * 180) / Math.PI, 17 | y: (rad.y * 180) / Math.PI, 18 | z: (rad.z * 180) / Math.PI, 19 | }; 20 | } 21 | 22 | export function degToRad(deg: number): number; 23 | export function degToRad(deg: Vec3): Vec3; 24 | export function degToRad(deg: number | Vec3): number | Vec3 { 25 | if (typeof deg === 'number') { 26 | return (deg * Math.PI) / 180; 27 | } 28 | 29 | return { 30 | x: (deg.x * Math.PI) / 180, 31 | y: (deg.y * Math.PI) / 180, 32 | z: (deg.z * Math.PI) / 180, 33 | }; 34 | } 35 | -------------------------------------------------------------------------------- /shared/types/nui-comms.ts: -------------------------------------------------------------------------------- 1 | import { Vec3 } from './util'; 2 | 3 | export namespace NUIComms { 4 | export type Event = { 5 | update: { 6 | camera: { 7 | position: Vec3; 8 | rotation: Vec3; 9 | meta?: { 10 | fov: number; 11 | near: number; 12 | far: number; 13 | }; 14 | }; 15 | }; 16 | }; 17 | 18 | export type EventBody = { 19 | [K in keyof Event]: { 20 | action: K; 21 | data: Event[K]; 22 | }; 23 | }[keyof Event]; 24 | 25 | // NUI -> Game Request 26 | type RequestWrapper = { 27 | data: Data; 28 | response: Response; 29 | }; 30 | 31 | export type Request = { 32 | ready: RequestWrapper; 33 | }; 34 | 35 | export type Response = { 36 | data: Request[T]['response']; 37 | meta: 38 | | { 39 | ok: true; 40 | } 41 | | { 42 | ok: false; 43 | message: string; 44 | }; 45 | }; 46 | } 47 | -------------------------------------------------------------------------------- /ui/src/lib/NuiComms.ts: -------------------------------------------------------------------------------- 1 | import { type NUIComms } from '@shared/types/nui-comms'; 2 | 3 | class NuiComms { 4 | private endpoint: string; 5 | 6 | constructor() { 7 | if (import.meta.env.PROD) { 8 | //@ts-ignore 9 | this.endpoint = `https://${GetParentResourceName()}/request`; 10 | } else { 11 | this.endpoint = ''; 12 | } 13 | } 14 | 15 | public async request( 16 | action: T, 17 | data: NUIComms.Request[T]['data'] = null 18 | ): Promise { 19 | if (import.meta.env.DEV) return null; 20 | 21 | const result: NUIComms.Response = await fetch(this.endpoint, { 22 | method: 'post', 23 | headers: { 24 | 'Content-Type': 'application/json; charset=UTF-8', 25 | }, 26 | body: JSON.stringify({ 27 | action, 28 | data, 29 | }), 30 | }).then(res => res.json()); 31 | 32 | if (!result.meta.ok) { 33 | throw new Error(result.meta.message); 34 | } 35 | 36 | return result.data; 37 | } 38 | } 39 | 40 | export const nuiComms = new NuiComms(); 41 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "linter": { 7 | "enabled": true, 8 | "rules": { 9 | "recommended": true, 10 | "suspicious": { 11 | "noConfusingVoidType": "off", 12 | "noExplicitAny": "off" 13 | }, 14 | "complexity": { 15 | "noForEach": "off", 16 | "noBannedTypes": "off" 17 | }, 18 | "style": { 19 | "noNonNullAssertion": "off" 20 | }, 21 | "a11y": { 22 | "useKeyWithClickEvents": "off" 23 | }, 24 | "correctness": { 25 | "useExhaustiveDependencies": "off" 26 | } 27 | } 28 | }, 29 | "formatter": { 30 | "enabled": true, 31 | "lineWidth": 80, 32 | "indentStyle": "space", 33 | "indentWidth": 2, 34 | "lineEnding": "lf" 35 | }, 36 | "javascript": { 37 | "formatter": { 38 | "arrowParentheses": "asNeeded", 39 | "jsxQuoteStyle": "single", 40 | "semicolons": "always", 41 | "trailingComma": "es5", 42 | "quoteProperties": "asNeeded", 43 | "bracketSpacing": true, 44 | "bracketSameLine": false 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /game/esbuild.cjs: -------------------------------------------------------------------------------- 1 | const esbuild = require("esbuild"); 2 | 3 | const IS_WATCH_MODE = process.argv[2] === "--watch"; 4 | 5 | const TARGET_ENTRIES = [ 6 | { 7 | target: "es2020", 8 | entryPoints: ["src/client/index.ts"], 9 | outfile: "dist/client.js", 10 | }, 11 | { 12 | target: "node16", 13 | entryPoints: ["src/server/index.ts"], 14 | platform: "node", 15 | outfile: "dist/server.js", 16 | }, 17 | ]; 18 | 19 | const buildBundle = async () => { 20 | try { 21 | const baseOptions = { 22 | logLevel: "info", 23 | bundle: true, 24 | charset: "utf8", 25 | minifyWhitespace: true, 26 | absWorkingDir: process.cwd(), 27 | }; 28 | 29 | for (const targetOpts of TARGET_ENTRIES) { 30 | const mergedOpts = { ...baseOptions, ...targetOpts }; 31 | 32 | if (IS_WATCH_MODE) { 33 | const context = await esbuild.context(mergedOpts); 34 | await context.watch(); 35 | continue; 36 | } 37 | 38 | const { errors } = await esbuild.build(mergedOpts); 39 | 40 | if (errors.length) { 41 | console.error(`[ESBuild] Bundle failed with ${errors.length} errors`); 42 | process.exit(1); 43 | } 44 | } 45 | } catch (e) { 46 | console.log("[ESBuild] Build failed with error"); 47 | console.error(e); 48 | process.exit(1); 49 | } 50 | }; 51 | 52 | buildBundle().catch(() => process.exit(1)); 53 | -------------------------------------------------------------------------------- /ui/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /game/src/client/classes/Camera.ts: -------------------------------------------------------------------------------- 1 | import { NUIComms } from '@shared/types/nui-comms'; 2 | import { ObjEntries } from '@shared/types/util'; 3 | import { degToRad } from '../util'; 4 | import { nuiComms } from './NuiComms'; 5 | 6 | class Camera { 7 | private metadata: Required['meta']; 8 | private thread: NodeJS.Timer | null; 9 | 10 | constructor() { 11 | this.metadata = { 12 | fov: 0, 13 | near: 0, 14 | far: 0, 15 | }; 16 | this.thread = null; 17 | } 18 | 19 | public startThread() { 20 | if (this.thread) return; 21 | 22 | this.thread = setInterval(this.onFrame, 4); 23 | } 24 | 25 | private onFrame = () => { 26 | const newMetadata: typeof this.metadata = { 27 | fov: GetFinalRenderedCamFov(), 28 | near: GetFinalRenderedCamNearClip(), 29 | far: GetFinalRenderedCamFarClip(), 30 | }; 31 | 32 | const metaChanged = ( 33 | Object.entries(newMetadata) as ObjEntries 34 | ).some(([k, v]) => this.metadata[k] !== v); 35 | 36 | nuiComms.send('update', { 37 | camera: { 38 | position: this.getCameraPosition(), 39 | rotation: this.getCameraRotation(), 40 | meta: metaChanged ? newMetadata : undefined, 41 | }, 42 | }); 43 | 44 | this.metadata = newMetadata; 45 | }; 46 | 47 | private getCameraPosition() { 48 | const [x, y, z] = GetFinalRenderedCamCoord(); 49 | return { x, y, z }; 50 | } 51 | 52 | private getCameraRotation() { 53 | const [x, y, z] = GetFinalRenderedCamRot(1); 54 | return degToRad({ x, y, z }); 55 | } 56 | } 57 | 58 | export const camera = new Camera(); 59 | -------------------------------------------------------------------------------- /game/src/client/index.ts: -------------------------------------------------------------------------------- 1 | import { camera } from './classes/Camera'; 2 | import { nuiComms } from './classes/NuiComms'; 3 | import { Raycast } from './classes/Raycast'; 4 | import { getEntityCoords } from './util'; 5 | 6 | setImmediate(async () => { 7 | await nuiComms.init(); 8 | 9 | camera.startThread(); 10 | }); 11 | 12 | RegisterCommand( 13 | 'raycast', 14 | async () => { 15 | const raycast = await new Promise(res => { 16 | const thread = setInterval(() => { 17 | const raycast = new Raycast(); 18 | if (!raycast.hit || !raycast.coords || !raycast.surfaceNormal) return; 19 | 20 | const plyCoords = getEntityCoords(PlayerPedId()); 21 | DrawLine( 22 | plyCoords.x, 23 | plyCoords.y, 24 | plyCoords.z, 25 | raycast.coords.x, 26 | raycast.coords.y, 27 | raycast.coords.z, 28 | 0, 29 | 0, 30 | 255, 31 | 255 32 | ); 33 | DrawMarker( 34 | 28, 35 | raycast.coords.x, 36 | raycast.coords.y, 37 | raycast.coords.z, 38 | 0, 39 | 0, 40 | 0, 41 | 0, 42 | 0, 43 | 0, 44 | 0.05, 45 | 0.05, 46 | 0.05, 47 | 0, 48 | 0, 49 | 255, 50 | 255, 51 | false, 52 | true, 53 | 2, 54 | false, 55 | //@ts-ignore 56 | null, 57 | null, 58 | false 59 | ); 60 | if (IsControlJustPressed(0, 18)) { 61 | clearInterval(thread); 62 | res(raycast); 63 | return; 64 | } 65 | }, 0); 66 | }); 67 | 68 | if (!raycast.hit || !raycast.coords || !raycast.surfaceNormal) return; 69 | 70 | const surfaceRotation = raycast.getSurfaceRotation(); 71 | 72 | console.log( 73 | 'Do not forget to transform these coords to threejs coordsystem' 74 | ); 75 | console.log({ coords: raycast.coords, rotation: surfaceRotation }); 76 | }, 77 | false 78 | ); 79 | -------------------------------------------------------------------------------- /ui/src/index.tsx: -------------------------------------------------------------------------------- 1 | import { Html } from "@react-three/drei"; 2 | import { useThree } from "@react-three/fiber"; 3 | import { NUIComms } from "@shared/types/nui-comms"; 4 | import { FC, useEffect, useState } from "react"; 5 | import { Euler } from "three"; 6 | import { UI } from "./components/ui"; 7 | import { ROTATION_ORDER } from "./constants"; 8 | import { nuiComms } from "./lib/NuiComms"; 9 | import { transformCoords, transformRotation } from "./lib/util"; 10 | 11 | export const App: FC = () => { 12 | const [isReady, setIsReady] = useState(false); 13 | const { camera } = useThree(s => ({ camera: s.camera })); 14 | 15 | if (!("isPerspectiveCamera" in camera)) { 16 | console.error("Main camera is not perspective camera"); 17 | return null; 18 | } 19 | 20 | useEffect(() => { 21 | const handler = ({ data: event }: MessageEvent) => { 22 | switch (event.action) { 23 | case "update": { 24 | if (event.data.camera.meta) { 25 | camera.near = event.data.camera.meta.near; 26 | camera.far = event.data.camera.meta.far; 27 | camera.fov = event.data.camera.meta.fov; 28 | camera.rotation.order = ROTATION_ORDER; 29 | camera.updateProjectionMatrix(); 30 | } 31 | 32 | const camPos = transformCoords(event.data.camera.position); 33 | camera.position.set(camPos.x, camPos.y, camPos.z); 34 | 35 | const camRot = transformRotation(event.data.camera.rotation); 36 | camera.rotation.set(camRot.x, camRot.y, camRot.z); 37 | } 38 | } 39 | }; 40 | 41 | window.addEventListener("message", handler); 42 | setIsReady(true); 43 | 44 | return () => { 45 | window.removeEventListener("message", handler); 46 | }; 47 | }, [camera]); 48 | 49 | // send ready event on first ready 50 | useEffect(() => { 51 | if (!isReady) return; 52 | 53 | nuiComms.request("ready"); 54 | }, [isReady]); 55 | 56 | return ( 57 | <> 58 | 62 | 63 | 64 | 65 | 66 | 67 | ); 68 | }; 69 | -------------------------------------------------------------------------------- /game/src/client/classes/Raycast.ts: -------------------------------------------------------------------------------- 1 | import { Vec3 } from '@shared/types/util'; 2 | import { Vector3 } from '../../shared/vector3'; 3 | 4 | export class Raycast { 5 | private readonly _hit: boolean; 6 | private readonly _entity: number | null; 7 | private readonly _surfaceNormal: Vec3 | null; 8 | private readonly _coords: Vec3 | null; 9 | 10 | constructor(distance = 25.0, flag = -1, ignore = PlayerPedId()) { 11 | const cameraCoords = Vector3.create(GetGameplayCamCoord()); 12 | const cameraRotation = Vector3.create(GetGameplayCamRot(0)); 13 | const forwardVector = Raycast.getForwardVector(cameraRotation); 14 | const forwardCoords = cameraCoords.add(forwardVector.multiply(distance)); 15 | 16 | const handle = StartExpensiveSynchronousShapeTestLosProbe( 17 | cameraCoords.x, 18 | cameraCoords.y, 19 | cameraCoords.z, 20 | forwardCoords.x, 21 | forwardCoords.y, 22 | forwardCoords.z, 23 | flag, 24 | ignore, 25 | 0 26 | ); 27 | const [ 28 | _, 29 | hit, 30 | [hitCoordX, hitCoordY, hitCoordZ], 31 | [surfaceNormalX, surfaceNormalY, surfaceNormalZ], 32 | entityHit, 33 | ] = GetShapeTestResult(handle); 34 | 35 | this._hit = !!hit; 36 | 37 | if (this._hit) { 38 | this._coords = { x: hitCoordX, y: hitCoordY, z: hitCoordZ }; 39 | this._surfaceNormal = { 40 | x: surfaceNormalX, 41 | y: surfaceNormalY, 42 | z: surfaceNormalZ, 43 | }; 44 | 45 | if ( 46 | entityHit && 47 | DoesEntityExist(entityHit) && 48 | GetEntityType(entityHit) !== 0 49 | ) { 50 | this._entity = entityHit; 51 | } else { 52 | this._entity = null; 53 | } 54 | } else { 55 | this._coords = null; 56 | this._surfaceNormal = null; 57 | this._entity = null; 58 | } 59 | } 60 | 61 | public get hit() { 62 | return this._hit; 63 | } 64 | public get entity() { 65 | return this._entity; 66 | } 67 | public get coords() { 68 | return this._coords; 69 | } 70 | public get surfaceNormal() { 71 | return this._surfaceNormal; 72 | } 73 | 74 | public static getForwardVector(rotation: Vector3) { 75 | const rotationRadians = rotation.multiply(Math.PI / 180); 76 | return new Vector3( 77 | -Math.sin(rotationRadians.z) * Math.abs(Math.cos(rotationRadians.x)), 78 | Math.cos(rotationRadians.z) * Math.abs(Math.cos(rotationRadians.x)), 79 | Math.sin(rotationRadians.x) 80 | ); 81 | } 82 | 83 | public getSurfaceRotation() { 84 | if (!this.surfaceNormal) throw new Error('No surface normal found'); 85 | 86 | const upVector = new Vector3(0, 1, 0); 87 | const rotationAxis = upVector.crossProduct(this.surfaceNormal).normalize; 88 | const rotationAngle = Math.acos(upVector.dotProduct(this.surfaceNormal)); 89 | const rotationVector = rotationAxis.multiply(rotationAngle); 90 | 91 | return rotationVector; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /game/src/client/classes/NuiComms.ts: -------------------------------------------------------------------------------- 1 | import { type NUIComms } from '../../../../shared/types/nui-comms'; 2 | import { Logger } from '../../shared/logger'; 3 | 4 | const NUI_CALLBACK_NAME = 'request'; 5 | 6 | type RequestHandler = ( 7 | data: NUIComms.Request[T]['data'] 8 | ) => 9 | | NUIComms.Request[T]['response'] 10 | | Promise 11 | | void; 12 | 13 | class NuiComms { 14 | private logger: Logger; 15 | private handlers: Partial<{ 16 | [K in keyof NUIComms.Request]: RequestHandler; 17 | }>; 18 | 19 | private ready: boolean; 20 | private awaitingReadyResolvers: (() => void)[]; 21 | 22 | constructor() { 23 | this.logger = new Logger('NuiActions'); 24 | this.handlers = {}; 25 | this.ready = false; 26 | this.awaitingReadyResolvers = []; 27 | } 28 | 29 | public init() { 30 | RegisterNuiCallbackType(NUI_CALLBACK_NAME); 31 | on(`__cfx_nui:${NUI_CALLBACK_NAME}`, this.handleRequest); 32 | 33 | const readyProm = new Promise(res => { 34 | this.register('ready', () => { 35 | this.ready = true; 36 | this.awaitingReadyResolvers.forEach(res => res()); 37 | this.awaitingReadyResolvers = []; 38 | this.logger.info('Ready'); 39 | res(); 40 | }); 41 | }); 42 | 43 | return readyProm; 44 | } 45 | 46 | private handleRequest = async ( 47 | data: { action: T; data: NUIComms.Request[T]['data'] }, 48 | cb: (cb: NUIComms.Response) => void 49 | ) => { 50 | const handler = this.handlers[data.action]; 51 | if (!handler) { 52 | cb({ 53 | data: null, 54 | meta: { 55 | ok: false, 56 | message: `No requesthandler for ${data.action}`, 57 | }, 58 | }); 59 | return; 60 | } 61 | 62 | try { 63 | const result = await this.handlers[data.action]!(data.data); 64 | cb({ data: result ?? null, meta: { ok: true } }); 65 | } catch (e: any) { 66 | cb({ 67 | data: null, 68 | meta: { ok: false, message: e?.message ?? 'Unknown error' }, 69 | }); 70 | } 71 | }; 72 | 73 | public send( 74 | action: T, 75 | data: NUIComms.Event[T] 76 | ) { 77 | if (!this.ready) { 78 | const awaitingReadyPromise = new Promise(res => { 79 | this.awaitingReadyResolvers.push(res); 80 | }); 81 | awaitingReadyPromise.then(() => { 82 | this.send(action, data); 83 | }); 84 | return; 85 | } 86 | 87 | SendNUIMessage({ action, data }); 88 | } 89 | 90 | public register( 91 | name: T, 92 | cb: RequestHandler 93 | ) { 94 | if (this.handlers[name]) { 95 | this.logger.error(`Handler for "${String(name)}" already exists`); 96 | return; 97 | } 98 | 99 | // @ts-ignore - TS doesn't like this even though it's valid 100 | this.handlers[name] = cb; 101 | } 102 | } 103 | 104 | export const nuiComms = new NuiComms(); 105 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@biomejs/biome@1.5.3": 6 | version "1.5.3" 7 | resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.5.3.tgz#0762b9f681c247a228522e6c506060e734809d48" 8 | integrity sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg== 9 | optionalDependencies: 10 | "@biomejs/cli-darwin-arm64" "1.5.3" 11 | "@biomejs/cli-darwin-x64" "1.5.3" 12 | "@biomejs/cli-linux-arm64" "1.5.3" 13 | "@biomejs/cli-linux-arm64-musl" "1.5.3" 14 | "@biomejs/cli-linux-x64" "1.5.3" 15 | "@biomejs/cli-linux-x64-musl" "1.5.3" 16 | "@biomejs/cli-win32-arm64" "1.5.3" 17 | "@biomejs/cli-win32-x64" "1.5.3" 18 | 19 | "@biomejs/cli-darwin-arm64@1.5.3": 20 | version "1.5.3" 21 | resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.5.3.tgz#8df0a562ca59b7a77151e26f67f45074644fab1c" 22 | integrity sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw== 23 | 24 | "@biomejs/cli-darwin-x64@1.5.3": 25 | version "1.5.3" 26 | resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.3.tgz#ab5376f15d9e23b60ae2b0b51f7feee38a62bba2" 27 | integrity sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw== 28 | 29 | "@biomejs/cli-linux-arm64-musl@1.5.3": 30 | version "1.5.3" 31 | resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.3.tgz#a2ba748a6cf94e2288244294a8e36a7db153982f" 32 | integrity sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ== 33 | 34 | "@biomejs/cli-linux-arm64@1.5.3": 35 | version "1.5.3" 36 | resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.3.tgz#c805d48a4740cadd4fbdc22bf74d86b6e10ed84e" 37 | integrity sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg== 38 | 39 | "@biomejs/cli-linux-x64-musl@1.5.3": 40 | version "1.5.3" 41 | resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.3.tgz#b524a85e46724543eb0f3eda143dd62e58d6e148" 42 | integrity sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw== 43 | 44 | "@biomejs/cli-linux-x64@1.5.3": 45 | version "1.5.3" 46 | resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.3.tgz#3934339eac9ec14307cb73541158cbf1695bfb79" 47 | integrity sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw== 48 | 49 | "@biomejs/cli-win32-arm64@1.5.3": 50 | version "1.5.3" 51 | resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.3.tgz#db337fc521bd046015499d8bbc02835dbd93f01c" 52 | integrity sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA== 53 | 54 | "@biomejs/cli-win32-x64@1.5.3": 55 | version "1.5.3" 56 | resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.5.3.tgz#1a424f26b709bc17fc592de18e8f48a6d2a44c86" 57 | integrity sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA== 58 | 59 | typescript@^5.3.3: 60 | version "5.3.3" 61 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" 62 | integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== 63 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | '@biomejs/biome': 9 | specifier: 1.5.3 10 | version: 1.5.3 11 | typescript: 12 | specifier: 5.3.3 13 | version: 5.3.3 14 | 15 | packages: 16 | 17 | /@biomejs/biome@1.5.3: 18 | resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==} 19 | engines: {node: '>=14.*'} 20 | hasBin: true 21 | requiresBuild: true 22 | optionalDependencies: 23 | '@biomejs/cli-darwin-arm64': 1.5.3 24 | '@biomejs/cli-darwin-x64': 1.5.3 25 | '@biomejs/cli-linux-arm64': 1.5.3 26 | '@biomejs/cli-linux-arm64-musl': 1.5.3 27 | '@biomejs/cli-linux-x64': 1.5.3 28 | '@biomejs/cli-linux-x64-musl': 1.5.3 29 | '@biomejs/cli-win32-arm64': 1.5.3 30 | '@biomejs/cli-win32-x64': 1.5.3 31 | dev: true 32 | 33 | /@biomejs/cli-darwin-arm64@1.5.3: 34 | resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==} 35 | engines: {node: '>=14.*'} 36 | cpu: [arm64] 37 | os: [darwin] 38 | requiresBuild: true 39 | dev: true 40 | optional: true 41 | 42 | /@biomejs/cli-darwin-x64@1.5.3: 43 | resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==} 44 | engines: {node: '>=14.*'} 45 | cpu: [x64] 46 | os: [darwin] 47 | requiresBuild: true 48 | dev: true 49 | optional: true 50 | 51 | /@biomejs/cli-linux-arm64-musl@1.5.3: 52 | resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==} 53 | engines: {node: '>=14.*'} 54 | cpu: [arm64] 55 | os: [linux] 56 | requiresBuild: true 57 | dev: true 58 | optional: true 59 | 60 | /@biomejs/cli-linux-arm64@1.5.3: 61 | resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==} 62 | engines: {node: '>=14.*'} 63 | cpu: [arm64] 64 | os: [linux] 65 | requiresBuild: true 66 | dev: true 67 | optional: true 68 | 69 | /@biomejs/cli-linux-x64-musl@1.5.3: 70 | resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==} 71 | engines: {node: '>=14.*'} 72 | cpu: [x64] 73 | os: [linux] 74 | requiresBuild: true 75 | dev: true 76 | optional: true 77 | 78 | /@biomejs/cli-linux-x64@1.5.3: 79 | resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==} 80 | engines: {node: '>=14.*'} 81 | cpu: [x64] 82 | os: [linux] 83 | requiresBuild: true 84 | dev: true 85 | optional: true 86 | 87 | /@biomejs/cli-win32-arm64@1.5.3: 88 | resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==} 89 | engines: {node: '>=14.*'} 90 | cpu: [arm64] 91 | os: [win32] 92 | requiresBuild: true 93 | dev: true 94 | optional: true 95 | 96 | /@biomejs/cli-win32-x64@1.5.3: 97 | resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==} 98 | engines: {node: '>=14.*'} 99 | cpu: [x64] 100 | os: [win32] 101 | requiresBuild: true 102 | dev: true 103 | optional: true 104 | 105 | /typescript@5.3.3: 106 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 107 | engines: {node: '>=14.17'} 108 | hasBin: true 109 | dev: true 110 | -------------------------------------------------------------------------------- /game/src/shared/vector3.ts: -------------------------------------------------------------------------------- 1 | import { Vec3 } from '@shared/types/util'; 2 | 3 | export class Vector3 implements Vec3 { 4 | public static create(v1: number | Vec3 | number[]): Vector3 { 5 | if (typeof v1 === 'number') { 6 | return new Vector3(v1, v1, v1); 7 | } 8 | if (Array.isArray(v1)) { 9 | return new Vector3(v1[0], v1[1], v1[2]); 10 | } 11 | return new Vector3(v1.x, v1.y, v1.z); 12 | } 13 | 14 | public static clone(v1: Vec3): Vector3 { 15 | return Vector3.create(v1); 16 | } 17 | 18 | public static add(v1: Vec3, v2: number | Vec3): Vector3 { 19 | if (typeof v2 === 'number') { 20 | return new Vector3(v1.x + v2, v1.y + v2, v1.z + v2); 21 | } 22 | return new Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z); 23 | } 24 | 25 | public static subtract(v1: Vec3, v2: Vec3): Vector3 { 26 | return new Vector3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z); 27 | } 28 | 29 | public static multiply(v1: Vec3, v2: Vec3 | number): Vector3 { 30 | if (typeof v2 === 'number') { 31 | return new Vector3(v1.x * v2, v1.y * v2, v1.z * v2); 32 | } 33 | return new Vector3(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z); 34 | } 35 | 36 | public static divide(v1: Vec3, v2: Vec3 | number): Vector3 { 37 | if (typeof v2 === 'number') { 38 | return new Vector3(v1.x / v2, v1.y / v2, v1.z / v2); 39 | } 40 | return new Vector3(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z); 41 | } 42 | 43 | public static dotProduct(v1: Vec3, v2: Vec3): number { 44 | return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; 45 | } 46 | 47 | public static crossProduct(v1: Vec3, v2: Vec3): Vector3 { 48 | const x = v1.y * v2.z - v1.z * v2.y; 49 | const y = v1.z * v2.x - v1.x * v2.z; 50 | const z = v1.x * v2.y - v1.y * v2.x; 51 | return new Vector3(x, y, z); 52 | } 53 | 54 | public static normalize(v: Vector3): Vector3 { 55 | return Vector3.divide(v, v.Length); 56 | } 57 | 58 | public static isSame(v1: Vec3, v2: Vec3): boolean { 59 | return v1.x === v2.x && v1.y === v2.y && v1.z === v2.z; 60 | } 61 | 62 | constructor(public x: number, public y: number, public z: number) { 63 | this.x = x ?? 0; 64 | this.y = y ?? 0; 65 | this.z = z ?? 0; 66 | } 67 | 68 | public clone(): Vector3 { 69 | return new Vector3(this.x, this.y, this.z); 70 | } 71 | 72 | /** 73 | * The product of the Euclidean magnitudes of this and another Vector3. 74 | * 75 | * @param v Vector3 to find Euclidean magnitude between. 76 | * @returns Euclidean magnitude with another vector. 77 | */ 78 | public distanceSquared(v: Vec3): number { 79 | const w: Vector3 = this.subtract(v); 80 | return Vector3.dotProduct(w, w); 81 | } 82 | 83 | /** 84 | * The distance between two Vectors. 85 | * 86 | * @param v Vector3 to find distance between. 87 | * @returns Distance between this and another vector. 88 | */ 89 | public distance(v: Vec3): number { 90 | return Math.sqrt(this.distanceSquared(v)); 91 | } 92 | 93 | public get normalize(): Vector3 { 94 | return Vector3.normalize(this); 95 | } 96 | 97 | public crossProduct(v: Vec3): Vector3 { 98 | return Vector3.crossProduct(this, v); 99 | } 100 | 101 | public dotProduct(v: Vec3): number { 102 | return Vector3.dotProduct(this, v); 103 | } 104 | 105 | public add(v: number | Vec3): Vec3 { 106 | return Vector3.add(this, v); 107 | } 108 | 109 | public subtract(v: Vec3): Vector3 { 110 | return Vector3.subtract(this, v); 111 | } 112 | 113 | public multiply(v: number | Vec3): Vector3 { 114 | return Vector3.multiply(this, v); 115 | } 116 | 117 | public divide(v: number | Vec3): Vec3 { 118 | return Vector3.divide(this, v); 119 | } 120 | 121 | public replace(v: Vec3): void { 122 | this.x = v.x; 123 | this.y = v.y; 124 | this.z = v.z; 125 | } 126 | 127 | public get Length(): number { 128 | return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /game/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | '@citizenfx/client': 9 | specifier: 2.0.7345-1 10 | version: 2.0.7345-1 11 | '@citizenfx/server': 12 | specifier: 2.0.7345-1 13 | version: 2.0.7345-1 14 | '@types/node': 15 | specifier: ^20.11.6 16 | version: 20.11.6 17 | esbuild: 18 | specifier: ^0.19.12 19 | version: 0.19.12 20 | typescript: 21 | specifier: 5.3.3 22 | version: 5.3.3 23 | 24 | packages: 25 | 26 | /@citizenfx/client@2.0.7345-1: 27 | resolution: {integrity: sha512-5rLAmgpAZEq5xt9rwXa1GaR7FgHl8+c8oM23FK16LhfBly5/h6AviKW6PNJN6RAW+hHP1H184zX1JvClTVIFqw==} 28 | dev: true 29 | 30 | /@citizenfx/server@2.0.7345-1: 31 | resolution: {integrity: sha512-PQnY8wxm6AHgmgB7T/vvSDg4TUtyUovgD25GabaaKxohNU8hWs3SQmdO1FPeLtBk0aPBbmAIH5Yg9vw84Eev2A==} 32 | dev: true 33 | 34 | /@esbuild/aix-ppc64@0.19.12: 35 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 36 | engines: {node: '>=12'} 37 | cpu: [ppc64] 38 | os: [aix] 39 | requiresBuild: true 40 | dev: true 41 | optional: true 42 | 43 | /@esbuild/android-arm64@0.19.12: 44 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 45 | engines: {node: '>=12'} 46 | cpu: [arm64] 47 | os: [android] 48 | requiresBuild: true 49 | dev: true 50 | optional: true 51 | 52 | /@esbuild/android-arm@0.19.12: 53 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 54 | engines: {node: '>=12'} 55 | cpu: [arm] 56 | os: [android] 57 | requiresBuild: true 58 | dev: true 59 | optional: true 60 | 61 | /@esbuild/android-x64@0.19.12: 62 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 63 | engines: {node: '>=12'} 64 | cpu: [x64] 65 | os: [android] 66 | requiresBuild: true 67 | dev: true 68 | optional: true 69 | 70 | /@esbuild/darwin-arm64@0.19.12: 71 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 72 | engines: {node: '>=12'} 73 | cpu: [arm64] 74 | os: [darwin] 75 | requiresBuild: true 76 | dev: true 77 | optional: true 78 | 79 | /@esbuild/darwin-x64@0.19.12: 80 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 81 | engines: {node: '>=12'} 82 | cpu: [x64] 83 | os: [darwin] 84 | requiresBuild: true 85 | dev: true 86 | optional: true 87 | 88 | /@esbuild/freebsd-arm64@0.19.12: 89 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 90 | engines: {node: '>=12'} 91 | cpu: [arm64] 92 | os: [freebsd] 93 | requiresBuild: true 94 | dev: true 95 | optional: true 96 | 97 | /@esbuild/freebsd-x64@0.19.12: 98 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 99 | engines: {node: '>=12'} 100 | cpu: [x64] 101 | os: [freebsd] 102 | requiresBuild: true 103 | dev: true 104 | optional: true 105 | 106 | /@esbuild/linux-arm64@0.19.12: 107 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 108 | engines: {node: '>=12'} 109 | cpu: [arm64] 110 | os: [linux] 111 | requiresBuild: true 112 | dev: true 113 | optional: true 114 | 115 | /@esbuild/linux-arm@0.19.12: 116 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 117 | engines: {node: '>=12'} 118 | cpu: [arm] 119 | os: [linux] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@esbuild/linux-ia32@0.19.12: 125 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 126 | engines: {node: '>=12'} 127 | cpu: [ia32] 128 | os: [linux] 129 | requiresBuild: true 130 | dev: true 131 | optional: true 132 | 133 | /@esbuild/linux-loong64@0.19.12: 134 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 135 | engines: {node: '>=12'} 136 | cpu: [loong64] 137 | os: [linux] 138 | requiresBuild: true 139 | dev: true 140 | optional: true 141 | 142 | /@esbuild/linux-mips64el@0.19.12: 143 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 144 | engines: {node: '>=12'} 145 | cpu: [mips64el] 146 | os: [linux] 147 | requiresBuild: true 148 | dev: true 149 | optional: true 150 | 151 | /@esbuild/linux-ppc64@0.19.12: 152 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 153 | engines: {node: '>=12'} 154 | cpu: [ppc64] 155 | os: [linux] 156 | requiresBuild: true 157 | dev: true 158 | optional: true 159 | 160 | /@esbuild/linux-riscv64@0.19.12: 161 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 162 | engines: {node: '>=12'} 163 | cpu: [riscv64] 164 | os: [linux] 165 | requiresBuild: true 166 | dev: true 167 | optional: true 168 | 169 | /@esbuild/linux-s390x@0.19.12: 170 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 171 | engines: {node: '>=12'} 172 | cpu: [s390x] 173 | os: [linux] 174 | requiresBuild: true 175 | dev: true 176 | optional: true 177 | 178 | /@esbuild/linux-x64@0.19.12: 179 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 180 | engines: {node: '>=12'} 181 | cpu: [x64] 182 | os: [linux] 183 | requiresBuild: true 184 | dev: true 185 | optional: true 186 | 187 | /@esbuild/netbsd-x64@0.19.12: 188 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 189 | engines: {node: '>=12'} 190 | cpu: [x64] 191 | os: [netbsd] 192 | requiresBuild: true 193 | dev: true 194 | optional: true 195 | 196 | /@esbuild/openbsd-x64@0.19.12: 197 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 198 | engines: {node: '>=12'} 199 | cpu: [x64] 200 | os: [openbsd] 201 | requiresBuild: true 202 | dev: true 203 | optional: true 204 | 205 | /@esbuild/sunos-x64@0.19.12: 206 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 207 | engines: {node: '>=12'} 208 | cpu: [x64] 209 | os: [sunos] 210 | requiresBuild: true 211 | dev: true 212 | optional: true 213 | 214 | /@esbuild/win32-arm64@0.19.12: 215 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 216 | engines: {node: '>=12'} 217 | cpu: [arm64] 218 | os: [win32] 219 | requiresBuild: true 220 | dev: true 221 | optional: true 222 | 223 | /@esbuild/win32-ia32@0.19.12: 224 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 225 | engines: {node: '>=12'} 226 | cpu: [ia32] 227 | os: [win32] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/win32-x64@0.19.12: 233 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 234 | engines: {node: '>=12'} 235 | cpu: [x64] 236 | os: [win32] 237 | requiresBuild: true 238 | dev: true 239 | optional: true 240 | 241 | /@types/node@20.11.6: 242 | resolution: {integrity: sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==} 243 | dependencies: 244 | undici-types: 5.26.5 245 | dev: true 246 | 247 | /esbuild@0.19.12: 248 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 249 | engines: {node: '>=12'} 250 | hasBin: true 251 | requiresBuild: true 252 | optionalDependencies: 253 | '@esbuild/aix-ppc64': 0.19.12 254 | '@esbuild/android-arm': 0.19.12 255 | '@esbuild/android-arm64': 0.19.12 256 | '@esbuild/android-x64': 0.19.12 257 | '@esbuild/darwin-arm64': 0.19.12 258 | '@esbuild/darwin-x64': 0.19.12 259 | '@esbuild/freebsd-arm64': 0.19.12 260 | '@esbuild/freebsd-x64': 0.19.12 261 | '@esbuild/linux-arm': 0.19.12 262 | '@esbuild/linux-arm64': 0.19.12 263 | '@esbuild/linux-ia32': 0.19.12 264 | '@esbuild/linux-loong64': 0.19.12 265 | '@esbuild/linux-mips64el': 0.19.12 266 | '@esbuild/linux-ppc64': 0.19.12 267 | '@esbuild/linux-riscv64': 0.19.12 268 | '@esbuild/linux-s390x': 0.19.12 269 | '@esbuild/linux-x64': 0.19.12 270 | '@esbuild/netbsd-x64': 0.19.12 271 | '@esbuild/openbsd-x64': 0.19.12 272 | '@esbuild/sunos-x64': 0.19.12 273 | '@esbuild/win32-arm64': 0.19.12 274 | '@esbuild/win32-ia32': 0.19.12 275 | '@esbuild/win32-x64': 0.19.12 276 | dev: true 277 | 278 | /typescript@5.3.3: 279 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 280 | engines: {node: '>=14.17'} 281 | hasBin: true 282 | dev: true 283 | 284 | /undici-types@5.26.5: 285 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 286 | dev: true 287 | -------------------------------------------------------------------------------- /ui/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@react-three/drei': 9 | specifier: ^9.96.5 10 | version: 9.96.5(@react-three/fiber@8.15.15)(@types/react@18.2.48)(@types/three@0.160.0)(react-dom@18.2.0)(react@18.2.0)(three@0.160.1) 11 | '@react-three/fiber': 12 | specifier: ^8.15.15 13 | version: 8.15.15(react-dom@18.2.0)(react@18.2.0)(three@0.160.1) 14 | '@uidotdev/usehooks': 15 | specifier: ^2.4.1 16 | version: 2.4.1(react-dom@18.2.0)(react@18.2.0) 17 | react: 18 | specifier: ^18.2.0 19 | version: 18.2.0 20 | react-dom: 21 | specifier: ^18.2.0 22 | version: 18.2.0(react@18.2.0) 23 | sass: 24 | specifier: ^1.70.0 25 | version: 1.70.0 26 | three: 27 | specifier: ^0.160.1 28 | version: 0.160.1 29 | 30 | devDependencies: 31 | '@types/react': 32 | specifier: ^18.2.43 33 | version: 18.2.48 34 | '@types/react-dom': 35 | specifier: ^18.2.17 36 | version: 18.2.18 37 | '@types/three': 38 | specifier: ^0.160.0 39 | version: 0.160.0 40 | '@typescript-eslint/eslint-plugin': 41 | specifier: ^6.14.0 42 | version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) 43 | '@typescript-eslint/parser': 44 | specifier: ^6.14.0 45 | version: 6.19.1(eslint@8.56.0)(typescript@5.3.3) 46 | '@vitejs/plugin-react-swc': 47 | specifier: ^3.5.0 48 | version: 3.5.0(vite@5.0.12) 49 | typescript: 50 | specifier: ^5.2.2 51 | version: 5.3.3 52 | vite: 53 | specifier: ^5.0.8 54 | version: 5.0.12(sass@1.70.0) 55 | 56 | packages: 57 | 58 | /@aashutoshrathi/word-wrap@1.2.6: 59 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 60 | engines: {node: '>=0.10.0'} 61 | dev: true 62 | 63 | /@babel/runtime@7.23.9: 64 | resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} 65 | engines: {node: '>=6.9.0'} 66 | dependencies: 67 | regenerator-runtime: 0.14.1 68 | dev: false 69 | 70 | /@esbuild/aix-ppc64@0.19.12: 71 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 72 | engines: {node: '>=12'} 73 | cpu: [ppc64] 74 | os: [aix] 75 | requiresBuild: true 76 | dev: true 77 | optional: true 78 | 79 | /@esbuild/android-arm64@0.19.12: 80 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 81 | engines: {node: '>=12'} 82 | cpu: [arm64] 83 | os: [android] 84 | requiresBuild: true 85 | dev: true 86 | optional: true 87 | 88 | /@esbuild/android-arm@0.19.12: 89 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 90 | engines: {node: '>=12'} 91 | cpu: [arm] 92 | os: [android] 93 | requiresBuild: true 94 | dev: true 95 | optional: true 96 | 97 | /@esbuild/android-x64@0.19.12: 98 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 99 | engines: {node: '>=12'} 100 | cpu: [x64] 101 | os: [android] 102 | requiresBuild: true 103 | dev: true 104 | optional: true 105 | 106 | /@esbuild/darwin-arm64@0.19.12: 107 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 108 | engines: {node: '>=12'} 109 | cpu: [arm64] 110 | os: [darwin] 111 | requiresBuild: true 112 | dev: true 113 | optional: true 114 | 115 | /@esbuild/darwin-x64@0.19.12: 116 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 117 | engines: {node: '>=12'} 118 | cpu: [x64] 119 | os: [darwin] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@esbuild/freebsd-arm64@0.19.12: 125 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 126 | engines: {node: '>=12'} 127 | cpu: [arm64] 128 | os: [freebsd] 129 | requiresBuild: true 130 | dev: true 131 | optional: true 132 | 133 | /@esbuild/freebsd-x64@0.19.12: 134 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 135 | engines: {node: '>=12'} 136 | cpu: [x64] 137 | os: [freebsd] 138 | requiresBuild: true 139 | dev: true 140 | optional: true 141 | 142 | /@esbuild/linux-arm64@0.19.12: 143 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 144 | engines: {node: '>=12'} 145 | cpu: [arm64] 146 | os: [linux] 147 | requiresBuild: true 148 | dev: true 149 | optional: true 150 | 151 | /@esbuild/linux-arm@0.19.12: 152 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 153 | engines: {node: '>=12'} 154 | cpu: [arm] 155 | os: [linux] 156 | requiresBuild: true 157 | dev: true 158 | optional: true 159 | 160 | /@esbuild/linux-ia32@0.19.12: 161 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 162 | engines: {node: '>=12'} 163 | cpu: [ia32] 164 | os: [linux] 165 | requiresBuild: true 166 | dev: true 167 | optional: true 168 | 169 | /@esbuild/linux-loong64@0.19.12: 170 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 171 | engines: {node: '>=12'} 172 | cpu: [loong64] 173 | os: [linux] 174 | requiresBuild: true 175 | dev: true 176 | optional: true 177 | 178 | /@esbuild/linux-mips64el@0.19.12: 179 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 180 | engines: {node: '>=12'} 181 | cpu: [mips64el] 182 | os: [linux] 183 | requiresBuild: true 184 | dev: true 185 | optional: true 186 | 187 | /@esbuild/linux-ppc64@0.19.12: 188 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 189 | engines: {node: '>=12'} 190 | cpu: [ppc64] 191 | os: [linux] 192 | requiresBuild: true 193 | dev: true 194 | optional: true 195 | 196 | /@esbuild/linux-riscv64@0.19.12: 197 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 198 | engines: {node: '>=12'} 199 | cpu: [riscv64] 200 | os: [linux] 201 | requiresBuild: true 202 | dev: true 203 | optional: true 204 | 205 | /@esbuild/linux-s390x@0.19.12: 206 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 207 | engines: {node: '>=12'} 208 | cpu: [s390x] 209 | os: [linux] 210 | requiresBuild: true 211 | dev: true 212 | optional: true 213 | 214 | /@esbuild/linux-x64@0.19.12: 215 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 216 | engines: {node: '>=12'} 217 | cpu: [x64] 218 | os: [linux] 219 | requiresBuild: true 220 | dev: true 221 | optional: true 222 | 223 | /@esbuild/netbsd-x64@0.19.12: 224 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 225 | engines: {node: '>=12'} 226 | cpu: [x64] 227 | os: [netbsd] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/openbsd-x64@0.19.12: 233 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 234 | engines: {node: '>=12'} 235 | cpu: [x64] 236 | os: [openbsd] 237 | requiresBuild: true 238 | dev: true 239 | optional: true 240 | 241 | /@esbuild/sunos-x64@0.19.12: 242 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 243 | engines: {node: '>=12'} 244 | cpu: [x64] 245 | os: [sunos] 246 | requiresBuild: true 247 | dev: true 248 | optional: true 249 | 250 | /@esbuild/win32-arm64@0.19.12: 251 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 252 | engines: {node: '>=12'} 253 | cpu: [arm64] 254 | os: [win32] 255 | requiresBuild: true 256 | dev: true 257 | optional: true 258 | 259 | /@esbuild/win32-ia32@0.19.12: 260 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 261 | engines: {node: '>=12'} 262 | cpu: [ia32] 263 | os: [win32] 264 | requiresBuild: true 265 | dev: true 266 | optional: true 267 | 268 | /@esbuild/win32-x64@0.19.12: 269 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 270 | engines: {node: '>=12'} 271 | cpu: [x64] 272 | os: [win32] 273 | requiresBuild: true 274 | dev: true 275 | optional: true 276 | 277 | /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): 278 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 279 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 280 | peerDependencies: 281 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 282 | dependencies: 283 | eslint: 8.56.0 284 | eslint-visitor-keys: 3.4.3 285 | dev: true 286 | 287 | /@eslint-community/regexpp@4.10.0: 288 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 289 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 290 | dev: true 291 | 292 | /@eslint/eslintrc@2.1.4: 293 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 294 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 295 | dependencies: 296 | ajv: 6.12.6 297 | debug: 4.3.4 298 | espree: 9.6.1 299 | globals: 13.24.0 300 | ignore: 5.3.0 301 | import-fresh: 3.3.0 302 | js-yaml: 4.1.0 303 | minimatch: 3.1.2 304 | strip-json-comments: 3.1.1 305 | transitivePeerDependencies: 306 | - supports-color 307 | dev: true 308 | 309 | /@eslint/js@8.56.0: 310 | resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} 311 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 312 | dev: true 313 | 314 | /@humanwhocodes/config-array@0.11.14: 315 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 316 | engines: {node: '>=10.10.0'} 317 | dependencies: 318 | '@humanwhocodes/object-schema': 2.0.2 319 | debug: 4.3.4 320 | minimatch: 3.1.2 321 | transitivePeerDependencies: 322 | - supports-color 323 | dev: true 324 | 325 | /@humanwhocodes/module-importer@1.0.1: 326 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 327 | engines: {node: '>=12.22'} 328 | dev: true 329 | 330 | /@humanwhocodes/object-schema@2.0.2: 331 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} 332 | dev: true 333 | 334 | /@mediapipe/tasks-vision@0.10.8: 335 | resolution: {integrity: sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==} 336 | dev: false 337 | 338 | /@nodelib/fs.scandir@2.1.5: 339 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 340 | engines: {node: '>= 8'} 341 | dependencies: 342 | '@nodelib/fs.stat': 2.0.5 343 | run-parallel: 1.2.0 344 | dev: true 345 | 346 | /@nodelib/fs.stat@2.0.5: 347 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 348 | engines: {node: '>= 8'} 349 | dev: true 350 | 351 | /@nodelib/fs.walk@1.2.8: 352 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 353 | engines: {node: '>= 8'} 354 | dependencies: 355 | '@nodelib/fs.scandir': 2.1.5 356 | fastq: 1.16.0 357 | dev: true 358 | 359 | /@react-spring/animated@9.6.1(react@18.2.0): 360 | resolution: {integrity: sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==} 361 | peerDependencies: 362 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 363 | dependencies: 364 | '@react-spring/shared': 9.6.1(react@18.2.0) 365 | '@react-spring/types': 9.6.1 366 | react: 18.2.0 367 | dev: false 368 | 369 | /@react-spring/core@9.6.1(react@18.2.0): 370 | resolution: {integrity: sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==} 371 | peerDependencies: 372 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 373 | dependencies: 374 | '@react-spring/animated': 9.6.1(react@18.2.0) 375 | '@react-spring/rafz': 9.6.1 376 | '@react-spring/shared': 9.6.1(react@18.2.0) 377 | '@react-spring/types': 9.6.1 378 | react: 18.2.0 379 | dev: false 380 | 381 | /@react-spring/rafz@9.6.1: 382 | resolution: {integrity: sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==} 383 | dev: false 384 | 385 | /@react-spring/shared@9.6.1(react@18.2.0): 386 | resolution: {integrity: sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==} 387 | peerDependencies: 388 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 389 | dependencies: 390 | '@react-spring/rafz': 9.6.1 391 | '@react-spring/types': 9.6.1 392 | react: 18.2.0 393 | dev: false 394 | 395 | /@react-spring/three@9.6.1(@react-three/fiber@8.15.15)(react@18.2.0)(three@0.160.1): 396 | resolution: {integrity: sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==} 397 | peerDependencies: 398 | '@react-three/fiber': '>=6.0' 399 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 400 | three: '>=0.126' 401 | dependencies: 402 | '@react-spring/animated': 9.6.1(react@18.2.0) 403 | '@react-spring/core': 9.6.1(react@18.2.0) 404 | '@react-spring/shared': 9.6.1(react@18.2.0) 405 | '@react-spring/types': 9.6.1 406 | '@react-three/fiber': 8.15.15(react-dom@18.2.0)(react@18.2.0)(three@0.160.1) 407 | react: 18.2.0 408 | three: 0.160.1 409 | dev: false 410 | 411 | /@react-spring/types@9.6.1: 412 | resolution: {integrity: sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==} 413 | dev: false 414 | 415 | /@react-three/drei@9.96.5(@react-three/fiber@8.15.15)(@types/react@18.2.48)(@types/three@0.160.0)(react-dom@18.2.0)(react@18.2.0)(three@0.160.1): 416 | resolution: {integrity: sha512-mEf8y8S0FCdCryfbKJ1vghYzMgI+7bgssEeerBBwCk4pi7h8OeavWISXb7QzY9dQLbPm5lL/X0PC7qLE6VUKww==} 417 | peerDependencies: 418 | '@react-three/fiber': '>=8.0' 419 | react: '>=18.0' 420 | react-dom: '>=18.0' 421 | three: '>=0.137' 422 | peerDependenciesMeta: 423 | react-dom: 424 | optional: true 425 | dependencies: 426 | '@babel/runtime': 7.23.9 427 | '@mediapipe/tasks-vision': 0.10.8 428 | '@react-spring/three': 9.6.1(@react-three/fiber@8.15.15)(react@18.2.0)(three@0.160.1) 429 | '@react-three/fiber': 8.15.15(react-dom@18.2.0)(react@18.2.0)(three@0.160.1) 430 | '@use-gesture/react': 10.3.0(react@18.2.0) 431 | camera-controls: 2.7.3(three@0.160.1) 432 | cross-env: 7.0.3 433 | detect-gpu: 5.0.37 434 | glsl-noise: 0.0.0 435 | maath: 0.10.7(@types/three@0.160.0)(three@0.160.1) 436 | meshline: 3.1.7(three@0.160.1) 437 | react: 18.2.0 438 | react-composer: 5.0.3(react@18.2.0) 439 | react-dom: 18.2.0(react@18.2.0) 440 | react-merge-refs: 1.1.0 441 | stats-gl: 2.0.1 442 | stats.js: 0.17.0 443 | suspend-react: 0.1.3(react@18.2.0) 444 | three: 0.160.1 445 | three-mesh-bvh: 0.7.0(three@0.160.1) 446 | three-stdlib: 2.29.4(three@0.160.1) 447 | troika-three-text: 0.47.2(three@0.160.1) 448 | tunnel-rat: 0.1.2(@types/react@18.2.48)(react@18.2.0) 449 | utility-types: 3.11.0 450 | uuid: 9.0.1 451 | zustand: 3.7.2(react@18.2.0) 452 | transitivePeerDependencies: 453 | - '@types/react' 454 | - '@types/three' 455 | - immer 456 | dev: false 457 | 458 | /@react-three/fiber@8.15.15(react-dom@18.2.0)(react@18.2.0)(three@0.160.1): 459 | resolution: {integrity: sha512-Z5POnzgpYxrgnYuiCv+8t7lpynEcGcn0/323kV1NtE7Cwq16aMqEuC6nF2Y/tK+crJpKNEqsRtvng/eJy0xxOA==} 460 | peerDependencies: 461 | expo: '>=43.0' 462 | expo-asset: '>=8.4' 463 | expo-file-system: '>=11.0' 464 | expo-gl: '>=11.0' 465 | react: '>=18.0' 466 | react-dom: '>=18.0' 467 | react-native: '>=0.64' 468 | three: '>=0.133' 469 | peerDependenciesMeta: 470 | expo: 471 | optional: true 472 | expo-asset: 473 | optional: true 474 | expo-file-system: 475 | optional: true 476 | expo-gl: 477 | optional: true 478 | react-dom: 479 | optional: true 480 | react-native: 481 | optional: true 482 | dependencies: 483 | '@babel/runtime': 7.23.9 484 | '@types/react-reconciler': 0.26.7 485 | '@types/webxr': 0.5.11 486 | base64-js: 1.5.1 487 | buffer: 6.0.3 488 | its-fine: 1.1.1(react@18.2.0) 489 | react: 18.2.0 490 | react-dom: 18.2.0(react@18.2.0) 491 | react-reconciler: 0.27.0(react@18.2.0) 492 | react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) 493 | scheduler: 0.21.0 494 | suspend-react: 0.1.3(react@18.2.0) 495 | three: 0.160.1 496 | zustand: 3.7.2(react@18.2.0) 497 | dev: false 498 | 499 | /@rollup/rollup-android-arm-eabi@4.9.6: 500 | resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} 501 | cpu: [arm] 502 | os: [android] 503 | requiresBuild: true 504 | dev: true 505 | optional: true 506 | 507 | /@rollup/rollup-android-arm64@4.9.6: 508 | resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} 509 | cpu: [arm64] 510 | os: [android] 511 | requiresBuild: true 512 | dev: true 513 | optional: true 514 | 515 | /@rollup/rollup-darwin-arm64@4.9.6: 516 | resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} 517 | cpu: [arm64] 518 | os: [darwin] 519 | requiresBuild: true 520 | dev: true 521 | optional: true 522 | 523 | /@rollup/rollup-darwin-x64@4.9.6: 524 | resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} 525 | cpu: [x64] 526 | os: [darwin] 527 | requiresBuild: true 528 | dev: true 529 | optional: true 530 | 531 | /@rollup/rollup-linux-arm-gnueabihf@4.9.6: 532 | resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} 533 | cpu: [arm] 534 | os: [linux] 535 | requiresBuild: true 536 | dev: true 537 | optional: true 538 | 539 | /@rollup/rollup-linux-arm64-gnu@4.9.6: 540 | resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} 541 | cpu: [arm64] 542 | os: [linux] 543 | requiresBuild: true 544 | dev: true 545 | optional: true 546 | 547 | /@rollup/rollup-linux-arm64-musl@4.9.6: 548 | resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} 549 | cpu: [arm64] 550 | os: [linux] 551 | requiresBuild: true 552 | dev: true 553 | optional: true 554 | 555 | /@rollup/rollup-linux-riscv64-gnu@4.9.6: 556 | resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} 557 | cpu: [riscv64] 558 | os: [linux] 559 | requiresBuild: true 560 | dev: true 561 | optional: true 562 | 563 | /@rollup/rollup-linux-x64-gnu@4.9.6: 564 | resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} 565 | cpu: [x64] 566 | os: [linux] 567 | requiresBuild: true 568 | dev: true 569 | optional: true 570 | 571 | /@rollup/rollup-linux-x64-musl@4.9.6: 572 | resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} 573 | cpu: [x64] 574 | os: [linux] 575 | requiresBuild: true 576 | dev: true 577 | optional: true 578 | 579 | /@rollup/rollup-win32-arm64-msvc@4.9.6: 580 | resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} 581 | cpu: [arm64] 582 | os: [win32] 583 | requiresBuild: true 584 | dev: true 585 | optional: true 586 | 587 | /@rollup/rollup-win32-ia32-msvc@4.9.6: 588 | resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} 589 | cpu: [ia32] 590 | os: [win32] 591 | requiresBuild: true 592 | dev: true 593 | optional: true 594 | 595 | /@rollup/rollup-win32-x64-msvc@4.9.6: 596 | resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} 597 | cpu: [x64] 598 | os: [win32] 599 | requiresBuild: true 600 | dev: true 601 | optional: true 602 | 603 | /@swc/core-darwin-arm64@1.3.105: 604 | resolution: {integrity: sha512-buWeweLVDXXmcnfIemH4PGnpjwsDTUGitnPchdftb0u1FU8zSSP/lw/pUCBDG/XvWAp7c/aFxgN4CyG0j7eayA==} 605 | engines: {node: '>=10'} 606 | cpu: [arm64] 607 | os: [darwin] 608 | requiresBuild: true 609 | dev: true 610 | optional: true 611 | 612 | /@swc/core-darwin-x64@1.3.105: 613 | resolution: {integrity: sha512-hFmXPApqjA/8sy/9NpljHVaKi1OvL9QkJ2MbbTCCbJERuHMpMUeMBUWipHRfepGHFhU+9B9zkEup/qJaJR4XIg==} 614 | engines: {node: '>=10'} 615 | cpu: [x64] 616 | os: [darwin] 617 | requiresBuild: true 618 | dev: true 619 | optional: true 620 | 621 | /@swc/core-linux-arm-gnueabihf@1.3.105: 622 | resolution: {integrity: sha512-mwXyMC41oMKkKrPpL8uJpOxw7fyfQoVtIw3Y5p0Blabk+espNYqix0E8VymHdRKuLmM//z5wVmMsuHdGBHvZeg==} 623 | engines: {node: '>=10'} 624 | cpu: [arm] 625 | os: [linux] 626 | requiresBuild: true 627 | dev: true 628 | optional: true 629 | 630 | /@swc/core-linux-arm64-gnu@1.3.105: 631 | resolution: {integrity: sha512-H7yEIVydnUtqBSUxwmO6vpIQn7j+Rr0DF6ZOORPyd/SFzQJK9cJRtmJQ3ZMzlJ1Bb+1gr3MvjgLEnmyCYEm2Hg==} 632 | engines: {node: '>=10'} 633 | cpu: [arm64] 634 | os: [linux] 635 | requiresBuild: true 636 | dev: true 637 | optional: true 638 | 639 | /@swc/core-linux-arm64-musl@1.3.105: 640 | resolution: {integrity: sha512-Jg7RTFT3pGFdGt5elPV6oDkinRy7q9cXpenjXnJnM2uvx3jOwnsAhexPyCDHom8SHL0j+9kaLLC66T3Gz1E4UA==} 641 | engines: {node: '>=10'} 642 | cpu: [arm64] 643 | os: [linux] 644 | requiresBuild: true 645 | dev: true 646 | optional: true 647 | 648 | /@swc/core-linux-x64-gnu@1.3.105: 649 | resolution: {integrity: sha512-DJghplpyusAmp1X5pW/y93MmS/u83Sx5GrpJxI6KLPa82+NItTgMcl8KBQmW5GYAJpVKZyaIvBanS5TdR8aN2w==} 650 | engines: {node: '>=10'} 651 | cpu: [x64] 652 | os: [linux] 653 | requiresBuild: true 654 | dev: true 655 | optional: true 656 | 657 | /@swc/core-linux-x64-musl@1.3.105: 658 | resolution: {integrity: sha512-wD5jL2dZH/5nPNssBo6jhOvkI0lmWnVR4vnOXWjuXgjq1S0AJpO5jdre/6pYLmf26hft3M42bteDnjR4AAZ38w==} 659 | engines: {node: '>=10'} 660 | cpu: [x64] 661 | os: [linux] 662 | requiresBuild: true 663 | dev: true 664 | optional: true 665 | 666 | /@swc/core-win32-arm64-msvc@1.3.105: 667 | resolution: {integrity: sha512-UqJtwILUHRw2+3UTPnRkZrzM/bGdQtbR4UFdp79mZQYfryeOUVNg7aJj/bWUTkKtLiZ3o+FBNrM/x2X1mJX5bA==} 668 | engines: {node: '>=10'} 669 | cpu: [arm64] 670 | os: [win32] 671 | requiresBuild: true 672 | dev: true 673 | optional: true 674 | 675 | /@swc/core-win32-ia32-msvc@1.3.105: 676 | resolution: {integrity: sha512-Z95C6vZgBEJ1snidYyjVKnVWiy/ZpPiIFIXGWkDr4ZyBgL3eZX12M6LzZ+NApHKffrbO4enbFyFomueBQgS2oA==} 677 | engines: {node: '>=10'} 678 | cpu: [ia32] 679 | os: [win32] 680 | requiresBuild: true 681 | dev: true 682 | optional: true 683 | 684 | /@swc/core-win32-x64-msvc@1.3.105: 685 | resolution: {integrity: sha512-3J8fkyDPFsS3mszuYUY4Wfk7/B2oio9qXUwF3DzOs2MK+XgdyMLIptIxL7gdfitXJBH8k39uVjrIw1JGJDjyFA==} 686 | engines: {node: '>=10'} 687 | cpu: [x64] 688 | os: [win32] 689 | requiresBuild: true 690 | dev: true 691 | optional: true 692 | 693 | /@swc/core@1.3.105: 694 | resolution: {integrity: sha512-me2VZyr3OjqRpFrYQJJYy7x/zbFSl9nt+MAGnIcBtjDsN00iTVqEaKxBjPBFQV9BDAgPz2SRWes/DhhVm5SmMw==} 695 | engines: {node: '>=10'} 696 | requiresBuild: true 697 | peerDependencies: 698 | '@swc/helpers': ^0.5.0 699 | peerDependenciesMeta: 700 | '@swc/helpers': 701 | optional: true 702 | dependencies: 703 | '@swc/counter': 0.1.2 704 | '@swc/types': 0.1.5 705 | optionalDependencies: 706 | '@swc/core-darwin-arm64': 1.3.105 707 | '@swc/core-darwin-x64': 1.3.105 708 | '@swc/core-linux-arm-gnueabihf': 1.3.105 709 | '@swc/core-linux-arm64-gnu': 1.3.105 710 | '@swc/core-linux-arm64-musl': 1.3.105 711 | '@swc/core-linux-x64-gnu': 1.3.105 712 | '@swc/core-linux-x64-musl': 1.3.105 713 | '@swc/core-win32-arm64-msvc': 1.3.105 714 | '@swc/core-win32-ia32-msvc': 1.3.105 715 | '@swc/core-win32-x64-msvc': 1.3.105 716 | dev: true 717 | 718 | /@swc/counter@0.1.2: 719 | resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} 720 | dev: true 721 | 722 | /@swc/types@0.1.5: 723 | resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} 724 | dev: true 725 | 726 | /@types/draco3d@1.4.9: 727 | resolution: {integrity: sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA==} 728 | dev: false 729 | 730 | /@types/estree@1.0.5: 731 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 732 | dev: true 733 | 734 | /@types/json-schema@7.0.15: 735 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 736 | dev: true 737 | 738 | /@types/offscreencanvas@2019.7.3: 739 | resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} 740 | dev: false 741 | 742 | /@types/prop-types@15.7.11: 743 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 744 | 745 | /@types/react-dom@18.2.18: 746 | resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} 747 | dependencies: 748 | '@types/react': 18.2.48 749 | dev: true 750 | 751 | /@types/react-reconciler@0.26.7: 752 | resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} 753 | dependencies: 754 | '@types/react': 18.2.48 755 | dev: false 756 | 757 | /@types/react-reconciler@0.28.8: 758 | resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==} 759 | dependencies: 760 | '@types/react': 18.2.48 761 | dev: false 762 | 763 | /@types/react@18.2.48: 764 | resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} 765 | dependencies: 766 | '@types/prop-types': 15.7.11 767 | '@types/scheduler': 0.16.8 768 | csstype: 3.1.3 769 | 770 | /@types/scheduler@0.16.8: 771 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 772 | 773 | /@types/semver@7.5.6: 774 | resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} 775 | dev: true 776 | 777 | /@types/stats.js@0.17.3: 778 | resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==} 779 | 780 | /@types/three@0.160.0: 781 | resolution: {integrity: sha512-jWlbUBovicUKaOYxzgkLlhkiEQJkhCVvg4W2IYD2trqD2om3VK4DGLpHH5zQHNr7RweZK/5re/4IVhbhvxbV9w==} 782 | dependencies: 783 | '@types/stats.js': 0.17.3 784 | '@types/webxr': 0.5.11 785 | fflate: 0.6.10 786 | meshoptimizer: 0.18.1 787 | 788 | /@types/webxr@0.5.11: 789 | resolution: {integrity: sha512-bo3K4UFBwP1RbMjuMin9cgyThD5YxjIWjQHJT7O7PVU2DB81qop7JnZAXRmrrGPbEsoHcdUmjmQDXI6zfqkVIQ==} 790 | 791 | /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): 792 | resolution: {integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==} 793 | engines: {node: ^16.0.0 || >=18.0.0} 794 | peerDependencies: 795 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha 796 | eslint: ^7.0.0 || ^8.0.0 797 | typescript: '*' 798 | peerDependenciesMeta: 799 | typescript: 800 | optional: true 801 | dependencies: 802 | '@eslint-community/regexpp': 4.10.0 803 | '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) 804 | '@typescript-eslint/scope-manager': 6.19.1 805 | '@typescript-eslint/type-utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) 806 | '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) 807 | '@typescript-eslint/visitor-keys': 6.19.1 808 | debug: 4.3.4 809 | eslint: 8.56.0 810 | graphemer: 1.4.0 811 | ignore: 5.3.0 812 | natural-compare: 1.4.0 813 | semver: 7.5.4 814 | ts-api-utils: 1.0.3(typescript@5.3.3) 815 | typescript: 5.3.3 816 | transitivePeerDependencies: 817 | - supports-color 818 | dev: true 819 | 820 | /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): 821 | resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==} 822 | engines: {node: ^16.0.0 || >=18.0.0} 823 | peerDependencies: 824 | eslint: ^7.0.0 || ^8.0.0 825 | typescript: '*' 826 | peerDependenciesMeta: 827 | typescript: 828 | optional: true 829 | dependencies: 830 | '@typescript-eslint/scope-manager': 6.19.1 831 | '@typescript-eslint/types': 6.19.1 832 | '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) 833 | '@typescript-eslint/visitor-keys': 6.19.1 834 | debug: 4.3.4 835 | eslint: 8.56.0 836 | typescript: 5.3.3 837 | transitivePeerDependencies: 838 | - supports-color 839 | dev: true 840 | 841 | /@typescript-eslint/scope-manager@6.19.1: 842 | resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==} 843 | engines: {node: ^16.0.0 || >=18.0.0} 844 | dependencies: 845 | '@typescript-eslint/types': 6.19.1 846 | '@typescript-eslint/visitor-keys': 6.19.1 847 | dev: true 848 | 849 | /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): 850 | resolution: {integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==} 851 | engines: {node: ^16.0.0 || >=18.0.0} 852 | peerDependencies: 853 | eslint: ^7.0.0 || ^8.0.0 854 | typescript: '*' 855 | peerDependenciesMeta: 856 | typescript: 857 | optional: true 858 | dependencies: 859 | '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) 860 | '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) 861 | debug: 4.3.4 862 | eslint: 8.56.0 863 | ts-api-utils: 1.0.3(typescript@5.3.3) 864 | typescript: 5.3.3 865 | transitivePeerDependencies: 866 | - supports-color 867 | dev: true 868 | 869 | /@typescript-eslint/types@6.19.1: 870 | resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==} 871 | engines: {node: ^16.0.0 || >=18.0.0} 872 | dev: true 873 | 874 | /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): 875 | resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==} 876 | engines: {node: ^16.0.0 || >=18.0.0} 877 | peerDependencies: 878 | typescript: '*' 879 | peerDependenciesMeta: 880 | typescript: 881 | optional: true 882 | dependencies: 883 | '@typescript-eslint/types': 6.19.1 884 | '@typescript-eslint/visitor-keys': 6.19.1 885 | debug: 4.3.4 886 | globby: 11.1.0 887 | is-glob: 4.0.3 888 | minimatch: 9.0.3 889 | semver: 7.5.4 890 | ts-api-utils: 1.0.3(typescript@5.3.3) 891 | typescript: 5.3.3 892 | transitivePeerDependencies: 893 | - supports-color 894 | dev: true 895 | 896 | /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): 897 | resolution: {integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==} 898 | engines: {node: ^16.0.0 || >=18.0.0} 899 | peerDependencies: 900 | eslint: ^7.0.0 || ^8.0.0 901 | dependencies: 902 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) 903 | '@types/json-schema': 7.0.15 904 | '@types/semver': 7.5.6 905 | '@typescript-eslint/scope-manager': 6.19.1 906 | '@typescript-eslint/types': 6.19.1 907 | '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) 908 | eslint: 8.56.0 909 | semver: 7.5.4 910 | transitivePeerDependencies: 911 | - supports-color 912 | - typescript 913 | dev: true 914 | 915 | /@typescript-eslint/visitor-keys@6.19.1: 916 | resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==} 917 | engines: {node: ^16.0.0 || >=18.0.0} 918 | dependencies: 919 | '@typescript-eslint/types': 6.19.1 920 | eslint-visitor-keys: 3.4.3 921 | dev: true 922 | 923 | /@uidotdev/usehooks@2.4.1(react-dom@18.2.0)(react@18.2.0): 924 | resolution: {integrity: sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==} 925 | engines: {node: '>=16'} 926 | peerDependencies: 927 | react: '>=18.0.0' 928 | react-dom: '>=18.0.0' 929 | dependencies: 930 | react: 18.2.0 931 | react-dom: 18.2.0(react@18.2.0) 932 | dev: false 933 | 934 | /@ungap/structured-clone@1.2.0: 935 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 936 | dev: true 937 | 938 | /@use-gesture/core@10.3.0: 939 | resolution: {integrity: sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A==} 940 | dev: false 941 | 942 | /@use-gesture/react@10.3.0(react@18.2.0): 943 | resolution: {integrity: sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA==} 944 | peerDependencies: 945 | react: '>= 16.8.0' 946 | dependencies: 947 | '@use-gesture/core': 10.3.0 948 | react: 18.2.0 949 | dev: false 950 | 951 | /@vitejs/plugin-react-swc@3.5.0(vite@5.0.12): 952 | resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==} 953 | peerDependencies: 954 | vite: ^4 || ^5 955 | dependencies: 956 | '@swc/core': 1.3.105 957 | vite: 5.0.12(sass@1.70.0) 958 | transitivePeerDependencies: 959 | - '@swc/helpers' 960 | dev: true 961 | 962 | /acorn-jsx@5.3.2(acorn@8.11.3): 963 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 964 | peerDependencies: 965 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 966 | dependencies: 967 | acorn: 8.11.3 968 | dev: true 969 | 970 | /acorn@8.11.3: 971 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 972 | engines: {node: '>=0.4.0'} 973 | hasBin: true 974 | dev: true 975 | 976 | /ajv@6.12.6: 977 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 978 | dependencies: 979 | fast-deep-equal: 3.1.3 980 | fast-json-stable-stringify: 2.1.0 981 | json-schema-traverse: 0.4.1 982 | uri-js: 4.4.1 983 | dev: true 984 | 985 | /ansi-regex@5.0.1: 986 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 987 | engines: {node: '>=8'} 988 | dev: true 989 | 990 | /ansi-styles@4.3.0: 991 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 992 | engines: {node: '>=8'} 993 | dependencies: 994 | color-convert: 2.0.1 995 | dev: true 996 | 997 | /anymatch@3.1.3: 998 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 999 | engines: {node: '>= 8'} 1000 | dependencies: 1001 | normalize-path: 3.0.0 1002 | picomatch: 2.3.1 1003 | 1004 | /argparse@2.0.1: 1005 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1006 | dev: true 1007 | 1008 | /array-union@2.1.0: 1009 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 1010 | engines: {node: '>=8'} 1011 | dev: true 1012 | 1013 | /balanced-match@1.0.2: 1014 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1015 | dev: true 1016 | 1017 | /base64-js@1.5.1: 1018 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 1019 | dev: false 1020 | 1021 | /bidi-js@1.0.3: 1022 | resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} 1023 | dependencies: 1024 | require-from-string: 2.0.2 1025 | dev: false 1026 | 1027 | /binary-extensions@2.2.0: 1028 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1029 | engines: {node: '>=8'} 1030 | 1031 | /brace-expansion@1.1.11: 1032 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1033 | dependencies: 1034 | balanced-match: 1.0.2 1035 | concat-map: 0.0.1 1036 | dev: true 1037 | 1038 | /brace-expansion@2.0.1: 1039 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1040 | dependencies: 1041 | balanced-match: 1.0.2 1042 | dev: true 1043 | 1044 | /braces@3.0.2: 1045 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1046 | engines: {node: '>=8'} 1047 | dependencies: 1048 | fill-range: 7.0.1 1049 | 1050 | /buffer@6.0.3: 1051 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 1052 | dependencies: 1053 | base64-js: 1.5.1 1054 | ieee754: 1.2.1 1055 | dev: false 1056 | 1057 | /callsites@3.1.0: 1058 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1059 | engines: {node: '>=6'} 1060 | dev: true 1061 | 1062 | /camera-controls@2.7.3(three@0.160.1): 1063 | resolution: {integrity: sha512-L4mxjBd3u8qiOLozdWrH2P8ZybSsDXBF7iyNyqNEFJhPUkovmuARWR8JTc1B/qlclOIg6FvZZA/0uAZMMim0mw==} 1064 | peerDependencies: 1065 | three: '>=0.126.1' 1066 | dependencies: 1067 | three: 0.160.1 1068 | dev: false 1069 | 1070 | /chalk@4.1.2: 1071 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1072 | engines: {node: '>=10'} 1073 | dependencies: 1074 | ansi-styles: 4.3.0 1075 | supports-color: 7.2.0 1076 | dev: true 1077 | 1078 | /chokidar@3.5.3: 1079 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1080 | engines: {node: '>= 8.10.0'} 1081 | dependencies: 1082 | anymatch: 3.1.3 1083 | braces: 3.0.2 1084 | glob-parent: 5.1.2 1085 | is-binary-path: 2.1.0 1086 | is-glob: 4.0.3 1087 | normalize-path: 3.0.0 1088 | readdirp: 3.6.0 1089 | optionalDependencies: 1090 | fsevents: 2.3.3 1091 | 1092 | /color-convert@2.0.1: 1093 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1094 | engines: {node: '>=7.0.0'} 1095 | dependencies: 1096 | color-name: 1.1.4 1097 | dev: true 1098 | 1099 | /color-name@1.1.4: 1100 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1101 | dev: true 1102 | 1103 | /concat-map@0.0.1: 1104 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1105 | dev: true 1106 | 1107 | /cross-env@7.0.3: 1108 | resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} 1109 | engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} 1110 | hasBin: true 1111 | dependencies: 1112 | cross-spawn: 7.0.3 1113 | dev: false 1114 | 1115 | /cross-spawn@7.0.3: 1116 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1117 | engines: {node: '>= 8'} 1118 | dependencies: 1119 | path-key: 3.1.1 1120 | shebang-command: 2.0.0 1121 | which: 2.0.2 1122 | 1123 | /csstype@3.1.3: 1124 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1125 | 1126 | /debounce@1.2.1: 1127 | resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} 1128 | dev: false 1129 | 1130 | /debug@4.3.4: 1131 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1132 | engines: {node: '>=6.0'} 1133 | peerDependencies: 1134 | supports-color: '*' 1135 | peerDependenciesMeta: 1136 | supports-color: 1137 | optional: true 1138 | dependencies: 1139 | ms: 2.1.2 1140 | dev: true 1141 | 1142 | /deep-is@0.1.4: 1143 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1144 | dev: true 1145 | 1146 | /detect-gpu@5.0.37: 1147 | resolution: {integrity: sha512-EraWs84faI4iskB4qvE39bevMIazEvd1RpoyGLOBesRLbiz6eMeJqqRPHjEFClfRByYZzi9IzU35rBXIO76oDw==} 1148 | dependencies: 1149 | webgl-constants: 1.1.1 1150 | dev: false 1151 | 1152 | /dir-glob@3.0.1: 1153 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1154 | engines: {node: '>=8'} 1155 | dependencies: 1156 | path-type: 4.0.0 1157 | dev: true 1158 | 1159 | /doctrine@3.0.0: 1160 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1161 | engines: {node: '>=6.0.0'} 1162 | dependencies: 1163 | esutils: 2.0.3 1164 | dev: true 1165 | 1166 | /draco3d@1.5.7: 1167 | resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} 1168 | dev: false 1169 | 1170 | /esbuild@0.19.12: 1171 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 1172 | engines: {node: '>=12'} 1173 | hasBin: true 1174 | requiresBuild: true 1175 | optionalDependencies: 1176 | '@esbuild/aix-ppc64': 0.19.12 1177 | '@esbuild/android-arm': 0.19.12 1178 | '@esbuild/android-arm64': 0.19.12 1179 | '@esbuild/android-x64': 0.19.12 1180 | '@esbuild/darwin-arm64': 0.19.12 1181 | '@esbuild/darwin-x64': 0.19.12 1182 | '@esbuild/freebsd-arm64': 0.19.12 1183 | '@esbuild/freebsd-x64': 0.19.12 1184 | '@esbuild/linux-arm': 0.19.12 1185 | '@esbuild/linux-arm64': 0.19.12 1186 | '@esbuild/linux-ia32': 0.19.12 1187 | '@esbuild/linux-loong64': 0.19.12 1188 | '@esbuild/linux-mips64el': 0.19.12 1189 | '@esbuild/linux-ppc64': 0.19.12 1190 | '@esbuild/linux-riscv64': 0.19.12 1191 | '@esbuild/linux-s390x': 0.19.12 1192 | '@esbuild/linux-x64': 0.19.12 1193 | '@esbuild/netbsd-x64': 0.19.12 1194 | '@esbuild/openbsd-x64': 0.19.12 1195 | '@esbuild/sunos-x64': 0.19.12 1196 | '@esbuild/win32-arm64': 0.19.12 1197 | '@esbuild/win32-ia32': 0.19.12 1198 | '@esbuild/win32-x64': 0.19.12 1199 | dev: true 1200 | 1201 | /escape-string-regexp@4.0.0: 1202 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1203 | engines: {node: '>=10'} 1204 | dev: true 1205 | 1206 | /eslint-scope@7.2.2: 1207 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1208 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1209 | dependencies: 1210 | esrecurse: 4.3.0 1211 | estraverse: 5.3.0 1212 | dev: true 1213 | 1214 | /eslint-visitor-keys@3.4.3: 1215 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1216 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1217 | dev: true 1218 | 1219 | /eslint@8.56.0: 1220 | resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} 1221 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1222 | hasBin: true 1223 | dependencies: 1224 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) 1225 | '@eslint-community/regexpp': 4.10.0 1226 | '@eslint/eslintrc': 2.1.4 1227 | '@eslint/js': 8.56.0 1228 | '@humanwhocodes/config-array': 0.11.14 1229 | '@humanwhocodes/module-importer': 1.0.1 1230 | '@nodelib/fs.walk': 1.2.8 1231 | '@ungap/structured-clone': 1.2.0 1232 | ajv: 6.12.6 1233 | chalk: 4.1.2 1234 | cross-spawn: 7.0.3 1235 | debug: 4.3.4 1236 | doctrine: 3.0.0 1237 | escape-string-regexp: 4.0.0 1238 | eslint-scope: 7.2.2 1239 | eslint-visitor-keys: 3.4.3 1240 | espree: 9.6.1 1241 | esquery: 1.5.0 1242 | esutils: 2.0.3 1243 | fast-deep-equal: 3.1.3 1244 | file-entry-cache: 6.0.1 1245 | find-up: 5.0.0 1246 | glob-parent: 6.0.2 1247 | globals: 13.24.0 1248 | graphemer: 1.4.0 1249 | ignore: 5.3.0 1250 | imurmurhash: 0.1.4 1251 | is-glob: 4.0.3 1252 | is-path-inside: 3.0.3 1253 | js-yaml: 4.1.0 1254 | json-stable-stringify-without-jsonify: 1.0.1 1255 | levn: 0.4.1 1256 | lodash.merge: 4.6.2 1257 | minimatch: 3.1.2 1258 | natural-compare: 1.4.0 1259 | optionator: 0.9.3 1260 | strip-ansi: 6.0.1 1261 | text-table: 0.2.0 1262 | transitivePeerDependencies: 1263 | - supports-color 1264 | dev: true 1265 | 1266 | /espree@9.6.1: 1267 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1268 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1269 | dependencies: 1270 | acorn: 8.11.3 1271 | acorn-jsx: 5.3.2(acorn@8.11.3) 1272 | eslint-visitor-keys: 3.4.3 1273 | dev: true 1274 | 1275 | /esquery@1.5.0: 1276 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1277 | engines: {node: '>=0.10'} 1278 | dependencies: 1279 | estraverse: 5.3.0 1280 | dev: true 1281 | 1282 | /esrecurse@4.3.0: 1283 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1284 | engines: {node: '>=4.0'} 1285 | dependencies: 1286 | estraverse: 5.3.0 1287 | dev: true 1288 | 1289 | /estraverse@5.3.0: 1290 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1291 | engines: {node: '>=4.0'} 1292 | dev: true 1293 | 1294 | /esutils@2.0.3: 1295 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1296 | engines: {node: '>=0.10.0'} 1297 | dev: true 1298 | 1299 | /fast-deep-equal@3.1.3: 1300 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1301 | dev: true 1302 | 1303 | /fast-glob@3.3.2: 1304 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1305 | engines: {node: '>=8.6.0'} 1306 | dependencies: 1307 | '@nodelib/fs.stat': 2.0.5 1308 | '@nodelib/fs.walk': 1.2.8 1309 | glob-parent: 5.1.2 1310 | merge2: 1.4.1 1311 | micromatch: 4.0.5 1312 | dev: true 1313 | 1314 | /fast-json-stable-stringify@2.1.0: 1315 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1316 | dev: true 1317 | 1318 | /fast-levenshtein@2.0.6: 1319 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1320 | dev: true 1321 | 1322 | /fastq@1.16.0: 1323 | resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} 1324 | dependencies: 1325 | reusify: 1.0.4 1326 | dev: true 1327 | 1328 | /fflate@0.6.10: 1329 | resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} 1330 | 1331 | /file-entry-cache@6.0.1: 1332 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1333 | engines: {node: ^10.12.0 || >=12.0.0} 1334 | dependencies: 1335 | flat-cache: 3.2.0 1336 | dev: true 1337 | 1338 | /fill-range@7.0.1: 1339 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1340 | engines: {node: '>=8'} 1341 | dependencies: 1342 | to-regex-range: 5.0.1 1343 | 1344 | /find-up@5.0.0: 1345 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1346 | engines: {node: '>=10'} 1347 | dependencies: 1348 | locate-path: 6.0.0 1349 | path-exists: 4.0.0 1350 | dev: true 1351 | 1352 | /flat-cache@3.2.0: 1353 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 1354 | engines: {node: ^10.12.0 || >=12.0.0} 1355 | dependencies: 1356 | flatted: 3.2.9 1357 | keyv: 4.5.4 1358 | rimraf: 3.0.2 1359 | dev: true 1360 | 1361 | /flatted@3.2.9: 1362 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 1363 | dev: true 1364 | 1365 | /fs.realpath@1.0.0: 1366 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1367 | dev: true 1368 | 1369 | /fsevents@2.3.3: 1370 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1371 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1372 | os: [darwin] 1373 | requiresBuild: true 1374 | optional: true 1375 | 1376 | /glob-parent@5.1.2: 1377 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1378 | engines: {node: '>= 6'} 1379 | dependencies: 1380 | is-glob: 4.0.3 1381 | 1382 | /glob-parent@6.0.2: 1383 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1384 | engines: {node: '>=10.13.0'} 1385 | dependencies: 1386 | is-glob: 4.0.3 1387 | dev: true 1388 | 1389 | /glob@7.2.3: 1390 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1391 | dependencies: 1392 | fs.realpath: 1.0.0 1393 | inflight: 1.0.6 1394 | inherits: 2.0.4 1395 | minimatch: 3.1.2 1396 | once: 1.4.0 1397 | path-is-absolute: 1.0.1 1398 | dev: true 1399 | 1400 | /globals@13.24.0: 1401 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1402 | engines: {node: '>=8'} 1403 | dependencies: 1404 | type-fest: 0.20.2 1405 | dev: true 1406 | 1407 | /globby@11.1.0: 1408 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1409 | engines: {node: '>=10'} 1410 | dependencies: 1411 | array-union: 2.1.0 1412 | dir-glob: 3.0.1 1413 | fast-glob: 3.3.2 1414 | ignore: 5.3.0 1415 | merge2: 1.4.1 1416 | slash: 3.0.0 1417 | dev: true 1418 | 1419 | /glsl-noise@0.0.0: 1420 | resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} 1421 | dev: false 1422 | 1423 | /graphemer@1.4.0: 1424 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1425 | dev: true 1426 | 1427 | /has-flag@4.0.0: 1428 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1429 | engines: {node: '>=8'} 1430 | dev: true 1431 | 1432 | /ieee754@1.2.1: 1433 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1434 | dev: false 1435 | 1436 | /ignore@5.3.0: 1437 | resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} 1438 | engines: {node: '>= 4'} 1439 | dev: true 1440 | 1441 | /immutable@4.3.4: 1442 | resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} 1443 | 1444 | /import-fresh@3.3.0: 1445 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1446 | engines: {node: '>=6'} 1447 | dependencies: 1448 | parent-module: 1.0.1 1449 | resolve-from: 4.0.0 1450 | dev: true 1451 | 1452 | /imurmurhash@0.1.4: 1453 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1454 | engines: {node: '>=0.8.19'} 1455 | dev: true 1456 | 1457 | /inflight@1.0.6: 1458 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1459 | dependencies: 1460 | once: 1.4.0 1461 | wrappy: 1.0.2 1462 | dev: true 1463 | 1464 | /inherits@2.0.4: 1465 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1466 | dev: true 1467 | 1468 | /is-binary-path@2.1.0: 1469 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1470 | engines: {node: '>=8'} 1471 | dependencies: 1472 | binary-extensions: 2.2.0 1473 | 1474 | /is-extglob@2.1.1: 1475 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1476 | engines: {node: '>=0.10.0'} 1477 | 1478 | /is-glob@4.0.3: 1479 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1480 | engines: {node: '>=0.10.0'} 1481 | dependencies: 1482 | is-extglob: 2.1.1 1483 | 1484 | /is-number@7.0.0: 1485 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1486 | engines: {node: '>=0.12.0'} 1487 | 1488 | /is-path-inside@3.0.3: 1489 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1490 | engines: {node: '>=8'} 1491 | dev: true 1492 | 1493 | /isexe@2.0.0: 1494 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1495 | 1496 | /its-fine@1.1.1(react@18.2.0): 1497 | resolution: {integrity: sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==} 1498 | peerDependencies: 1499 | react: '>=18.0' 1500 | dependencies: 1501 | '@types/react-reconciler': 0.28.8 1502 | react: 18.2.0 1503 | dev: false 1504 | 1505 | /js-tokens@4.0.0: 1506 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1507 | dev: false 1508 | 1509 | /js-yaml@4.1.0: 1510 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1511 | hasBin: true 1512 | dependencies: 1513 | argparse: 2.0.1 1514 | dev: true 1515 | 1516 | /json-buffer@3.0.1: 1517 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1518 | dev: true 1519 | 1520 | /json-schema-traverse@0.4.1: 1521 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1522 | dev: true 1523 | 1524 | /json-stable-stringify-without-jsonify@1.0.1: 1525 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1526 | dev: true 1527 | 1528 | /keyv@4.5.4: 1529 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1530 | dependencies: 1531 | json-buffer: 3.0.1 1532 | dev: true 1533 | 1534 | /levn@0.4.1: 1535 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1536 | engines: {node: '>= 0.8.0'} 1537 | dependencies: 1538 | prelude-ls: 1.2.1 1539 | type-check: 0.4.0 1540 | dev: true 1541 | 1542 | /locate-path@6.0.0: 1543 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1544 | engines: {node: '>=10'} 1545 | dependencies: 1546 | p-locate: 5.0.0 1547 | dev: true 1548 | 1549 | /lodash.merge@4.6.2: 1550 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1551 | dev: true 1552 | 1553 | /loose-envify@1.4.0: 1554 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1555 | hasBin: true 1556 | dependencies: 1557 | js-tokens: 4.0.0 1558 | dev: false 1559 | 1560 | /lru-cache@6.0.0: 1561 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1562 | engines: {node: '>=10'} 1563 | dependencies: 1564 | yallist: 4.0.0 1565 | dev: true 1566 | 1567 | /maath@0.10.7(@types/three@0.160.0)(three@0.160.1): 1568 | resolution: {integrity: sha512-zQ2xd7dNOIVTjAS+hj22fyj1EFYmOJX6tzKjZ92r6WDoq8hyFxjuGA2q950tmR4iC/EKXoMQdSipkaJVuUHDTg==} 1569 | peerDependencies: 1570 | '@types/three': '>=0.144.0' 1571 | three: '>=0.144.0' 1572 | dependencies: 1573 | '@types/three': 0.160.0 1574 | three: 0.160.1 1575 | dev: false 1576 | 1577 | /merge2@1.4.1: 1578 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1579 | engines: {node: '>= 8'} 1580 | dev: true 1581 | 1582 | /meshline@3.1.7(three@0.160.1): 1583 | resolution: {integrity: sha512-uf9fPI9wy0Ie0kZjvKuIkf2n7gi3ih0wdTeb/kmSvmzpPyEL5d9lFohg9+JV9VC4sQUBOZDgxu6fnjn57goSHg==} 1584 | peerDependencies: 1585 | three: '>=0.137' 1586 | dependencies: 1587 | three: 0.160.1 1588 | dev: false 1589 | 1590 | /meshoptimizer@0.18.1: 1591 | resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} 1592 | 1593 | /micromatch@4.0.5: 1594 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1595 | engines: {node: '>=8.6'} 1596 | dependencies: 1597 | braces: 3.0.2 1598 | picomatch: 2.3.1 1599 | dev: true 1600 | 1601 | /minimatch@3.1.2: 1602 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1603 | dependencies: 1604 | brace-expansion: 1.1.11 1605 | dev: true 1606 | 1607 | /minimatch@9.0.3: 1608 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1609 | engines: {node: '>=16 || 14 >=14.17'} 1610 | dependencies: 1611 | brace-expansion: 2.0.1 1612 | dev: true 1613 | 1614 | /ms@2.1.2: 1615 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1616 | dev: true 1617 | 1618 | /nanoid@3.3.7: 1619 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1620 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1621 | hasBin: true 1622 | dev: true 1623 | 1624 | /natural-compare@1.4.0: 1625 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1626 | dev: true 1627 | 1628 | /normalize-path@3.0.0: 1629 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1630 | engines: {node: '>=0.10.0'} 1631 | 1632 | /object-assign@4.1.1: 1633 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1634 | engines: {node: '>=0.10.0'} 1635 | dev: false 1636 | 1637 | /once@1.4.0: 1638 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1639 | dependencies: 1640 | wrappy: 1.0.2 1641 | dev: true 1642 | 1643 | /optionator@0.9.3: 1644 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1645 | engines: {node: '>= 0.8.0'} 1646 | dependencies: 1647 | '@aashutoshrathi/word-wrap': 1.2.6 1648 | deep-is: 0.1.4 1649 | fast-levenshtein: 2.0.6 1650 | levn: 0.4.1 1651 | prelude-ls: 1.2.1 1652 | type-check: 0.4.0 1653 | dev: true 1654 | 1655 | /p-limit@3.1.0: 1656 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1657 | engines: {node: '>=10'} 1658 | dependencies: 1659 | yocto-queue: 0.1.0 1660 | dev: true 1661 | 1662 | /p-locate@5.0.0: 1663 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1664 | engines: {node: '>=10'} 1665 | dependencies: 1666 | p-limit: 3.1.0 1667 | dev: true 1668 | 1669 | /parent-module@1.0.1: 1670 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1671 | engines: {node: '>=6'} 1672 | dependencies: 1673 | callsites: 3.1.0 1674 | dev: true 1675 | 1676 | /path-exists@4.0.0: 1677 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1678 | engines: {node: '>=8'} 1679 | dev: true 1680 | 1681 | /path-is-absolute@1.0.1: 1682 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1683 | engines: {node: '>=0.10.0'} 1684 | dev: true 1685 | 1686 | /path-key@3.1.1: 1687 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1688 | engines: {node: '>=8'} 1689 | 1690 | /path-type@4.0.0: 1691 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1692 | engines: {node: '>=8'} 1693 | dev: true 1694 | 1695 | /picocolors@1.0.0: 1696 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1697 | dev: true 1698 | 1699 | /picomatch@2.3.1: 1700 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1701 | engines: {node: '>=8.6'} 1702 | 1703 | /postcss@8.4.33: 1704 | resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} 1705 | engines: {node: ^10 || ^12 || >=14} 1706 | dependencies: 1707 | nanoid: 3.3.7 1708 | picocolors: 1.0.0 1709 | source-map-js: 1.0.2 1710 | dev: true 1711 | 1712 | /potpack@1.0.2: 1713 | resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} 1714 | dev: false 1715 | 1716 | /prelude-ls@1.2.1: 1717 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1718 | engines: {node: '>= 0.8.0'} 1719 | dev: true 1720 | 1721 | /prop-types@15.8.1: 1722 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1723 | dependencies: 1724 | loose-envify: 1.4.0 1725 | object-assign: 4.1.1 1726 | react-is: 16.13.1 1727 | dev: false 1728 | 1729 | /punycode@2.3.1: 1730 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1731 | engines: {node: '>=6'} 1732 | dev: true 1733 | 1734 | /queue-microtask@1.2.3: 1735 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1736 | dev: true 1737 | 1738 | /react-composer@5.0.3(react@18.2.0): 1739 | resolution: {integrity: sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==} 1740 | peerDependencies: 1741 | react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 1742 | dependencies: 1743 | prop-types: 15.8.1 1744 | react: 18.2.0 1745 | dev: false 1746 | 1747 | /react-dom@18.2.0(react@18.2.0): 1748 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1749 | peerDependencies: 1750 | react: ^18.2.0 1751 | dependencies: 1752 | loose-envify: 1.4.0 1753 | react: 18.2.0 1754 | scheduler: 0.23.0 1755 | dev: false 1756 | 1757 | /react-is@16.13.1: 1758 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1759 | dev: false 1760 | 1761 | /react-merge-refs@1.1.0: 1762 | resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} 1763 | dev: false 1764 | 1765 | /react-reconciler@0.27.0(react@18.2.0): 1766 | resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} 1767 | engines: {node: '>=0.10.0'} 1768 | peerDependencies: 1769 | react: ^18.0.0 1770 | dependencies: 1771 | loose-envify: 1.4.0 1772 | react: 18.2.0 1773 | scheduler: 0.21.0 1774 | dev: false 1775 | 1776 | /react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0): 1777 | resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} 1778 | peerDependencies: 1779 | react: '>=16.13' 1780 | react-dom: '>=16.13' 1781 | dependencies: 1782 | debounce: 1.2.1 1783 | react: 18.2.0 1784 | react-dom: 18.2.0(react@18.2.0) 1785 | dev: false 1786 | 1787 | /react@18.2.0: 1788 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1789 | engines: {node: '>=0.10.0'} 1790 | dependencies: 1791 | loose-envify: 1.4.0 1792 | dev: false 1793 | 1794 | /readdirp@3.6.0: 1795 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1796 | engines: {node: '>=8.10.0'} 1797 | dependencies: 1798 | picomatch: 2.3.1 1799 | 1800 | /regenerator-runtime@0.14.1: 1801 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1802 | dev: false 1803 | 1804 | /require-from-string@2.0.2: 1805 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1806 | engines: {node: '>=0.10.0'} 1807 | dev: false 1808 | 1809 | /resolve-from@4.0.0: 1810 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1811 | engines: {node: '>=4'} 1812 | dev: true 1813 | 1814 | /reusify@1.0.4: 1815 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1816 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1817 | dev: true 1818 | 1819 | /rimraf@3.0.2: 1820 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1821 | hasBin: true 1822 | dependencies: 1823 | glob: 7.2.3 1824 | dev: true 1825 | 1826 | /rollup@4.9.6: 1827 | resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} 1828 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1829 | hasBin: true 1830 | dependencies: 1831 | '@types/estree': 1.0.5 1832 | optionalDependencies: 1833 | '@rollup/rollup-android-arm-eabi': 4.9.6 1834 | '@rollup/rollup-android-arm64': 4.9.6 1835 | '@rollup/rollup-darwin-arm64': 4.9.6 1836 | '@rollup/rollup-darwin-x64': 4.9.6 1837 | '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 1838 | '@rollup/rollup-linux-arm64-gnu': 4.9.6 1839 | '@rollup/rollup-linux-arm64-musl': 4.9.6 1840 | '@rollup/rollup-linux-riscv64-gnu': 4.9.6 1841 | '@rollup/rollup-linux-x64-gnu': 4.9.6 1842 | '@rollup/rollup-linux-x64-musl': 4.9.6 1843 | '@rollup/rollup-win32-arm64-msvc': 4.9.6 1844 | '@rollup/rollup-win32-ia32-msvc': 4.9.6 1845 | '@rollup/rollup-win32-x64-msvc': 4.9.6 1846 | fsevents: 2.3.3 1847 | dev: true 1848 | 1849 | /run-parallel@1.2.0: 1850 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1851 | dependencies: 1852 | queue-microtask: 1.2.3 1853 | dev: true 1854 | 1855 | /sass@1.70.0: 1856 | resolution: {integrity: sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==} 1857 | engines: {node: '>=14.0.0'} 1858 | hasBin: true 1859 | dependencies: 1860 | chokidar: 3.5.3 1861 | immutable: 4.3.4 1862 | source-map-js: 1.0.2 1863 | 1864 | /scheduler@0.21.0: 1865 | resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} 1866 | dependencies: 1867 | loose-envify: 1.4.0 1868 | dev: false 1869 | 1870 | /scheduler@0.23.0: 1871 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1872 | dependencies: 1873 | loose-envify: 1.4.0 1874 | dev: false 1875 | 1876 | /semver@7.5.4: 1877 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1878 | engines: {node: '>=10'} 1879 | hasBin: true 1880 | dependencies: 1881 | lru-cache: 6.0.0 1882 | dev: true 1883 | 1884 | /shebang-command@2.0.0: 1885 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1886 | engines: {node: '>=8'} 1887 | dependencies: 1888 | shebang-regex: 3.0.0 1889 | 1890 | /shebang-regex@3.0.0: 1891 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1892 | engines: {node: '>=8'} 1893 | 1894 | /slash@3.0.0: 1895 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1896 | engines: {node: '>=8'} 1897 | dev: true 1898 | 1899 | /source-map-js@1.0.2: 1900 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1901 | engines: {node: '>=0.10.0'} 1902 | 1903 | /stats-gl@2.0.1: 1904 | resolution: {integrity: sha512-EhFm1AxoSBK3MflkFawZ4jmOX1dWu0nBAtCpvGxGsondEvCpsohbpRpM8pi8UAcxG5eRsDsCiRcxdH20j3Rp9A==} 1905 | dev: false 1906 | 1907 | /stats.js@0.17.0: 1908 | resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} 1909 | dev: false 1910 | 1911 | /strip-ansi@6.0.1: 1912 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1913 | engines: {node: '>=8'} 1914 | dependencies: 1915 | ansi-regex: 5.0.1 1916 | dev: true 1917 | 1918 | /strip-json-comments@3.1.1: 1919 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1920 | engines: {node: '>=8'} 1921 | dev: true 1922 | 1923 | /supports-color@7.2.0: 1924 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1925 | engines: {node: '>=8'} 1926 | dependencies: 1927 | has-flag: 4.0.0 1928 | dev: true 1929 | 1930 | /suspend-react@0.1.3(react@18.2.0): 1931 | resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} 1932 | peerDependencies: 1933 | react: '>=17.0' 1934 | dependencies: 1935 | react: 18.2.0 1936 | dev: false 1937 | 1938 | /text-table@0.2.0: 1939 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1940 | dev: true 1941 | 1942 | /three-mesh-bvh@0.7.0(three@0.160.1): 1943 | resolution: {integrity: sha512-Hj0Z1Rp02yy5H+/xtMBu/dYAeRsSONaBaVLZoST9sMpZxycHypRiUeMHucPOLWFHnpc5hwelOnONcLpkfhDg0Q==} 1944 | peerDependencies: 1945 | three: '>= 0.151.0' 1946 | dependencies: 1947 | three: 0.160.1 1948 | dev: false 1949 | 1950 | /three-stdlib@2.29.4(three@0.160.1): 1951 | resolution: {integrity: sha512-XNzGCrz/uAk9XoLwd35eN7dQyI4ggXZTeqjcN034YdYBpBlNO9kmLHehl/0Nw9jCelblB7jla+unHAOIyLyV6Q==} 1952 | peerDependencies: 1953 | three: '>=0.128.0' 1954 | dependencies: 1955 | '@types/draco3d': 1.4.9 1956 | '@types/offscreencanvas': 2019.7.3 1957 | '@types/webxr': 0.5.11 1958 | draco3d: 1.5.7 1959 | fflate: 0.6.10 1960 | potpack: 1.0.2 1961 | three: 0.160.1 1962 | dev: false 1963 | 1964 | /three@0.160.1: 1965 | resolution: {integrity: sha512-Bgl2wPJypDOZ1stAxwfWAcJ0WQf7QzlptsxkjYiURPz+n5k4RBDLsq+6f9Y75TYxn6aHLcWz+JNmwTOXWrQTBQ==} 1966 | dev: false 1967 | 1968 | /to-regex-range@5.0.1: 1969 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1970 | engines: {node: '>=8.0'} 1971 | dependencies: 1972 | is-number: 7.0.0 1973 | 1974 | /troika-three-text@0.47.2(three@0.160.1): 1975 | resolution: {integrity: sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==} 1976 | peerDependencies: 1977 | three: '>=0.125.0' 1978 | dependencies: 1979 | bidi-js: 1.0.3 1980 | three: 0.160.1 1981 | troika-three-utils: 0.47.2(three@0.160.1) 1982 | troika-worker-utils: 0.47.2 1983 | webgl-sdf-generator: 1.1.1 1984 | dev: false 1985 | 1986 | /troika-three-utils@0.47.2(three@0.160.1): 1987 | resolution: {integrity: sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==} 1988 | peerDependencies: 1989 | three: '>=0.125.0' 1990 | dependencies: 1991 | three: 0.160.1 1992 | dev: false 1993 | 1994 | /troika-worker-utils@0.47.2: 1995 | resolution: {integrity: sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==} 1996 | dev: false 1997 | 1998 | /ts-api-utils@1.0.3(typescript@5.3.3): 1999 | resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} 2000 | engines: {node: '>=16.13.0'} 2001 | peerDependencies: 2002 | typescript: '>=4.2.0' 2003 | dependencies: 2004 | typescript: 5.3.3 2005 | dev: true 2006 | 2007 | /tunnel-rat@0.1.2(@types/react@18.2.48)(react@18.2.0): 2008 | resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} 2009 | dependencies: 2010 | zustand: 4.5.0(@types/react@18.2.48)(react@18.2.0) 2011 | transitivePeerDependencies: 2012 | - '@types/react' 2013 | - immer 2014 | - react 2015 | dev: false 2016 | 2017 | /type-check@0.4.0: 2018 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2019 | engines: {node: '>= 0.8.0'} 2020 | dependencies: 2021 | prelude-ls: 1.2.1 2022 | dev: true 2023 | 2024 | /type-fest@0.20.2: 2025 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2026 | engines: {node: '>=10'} 2027 | dev: true 2028 | 2029 | /typescript@5.3.3: 2030 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 2031 | engines: {node: '>=14.17'} 2032 | hasBin: true 2033 | dev: true 2034 | 2035 | /uri-js@4.4.1: 2036 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2037 | dependencies: 2038 | punycode: 2.3.1 2039 | dev: true 2040 | 2041 | /use-sync-external-store@1.2.0(react@18.2.0): 2042 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} 2043 | peerDependencies: 2044 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2045 | dependencies: 2046 | react: 18.2.0 2047 | dev: false 2048 | 2049 | /utility-types@3.11.0: 2050 | resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} 2051 | engines: {node: '>= 4'} 2052 | dev: false 2053 | 2054 | /uuid@9.0.1: 2055 | resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} 2056 | hasBin: true 2057 | dev: false 2058 | 2059 | /vite@5.0.12(sass@1.70.0): 2060 | resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} 2061 | engines: {node: ^18.0.0 || >=20.0.0} 2062 | hasBin: true 2063 | peerDependencies: 2064 | '@types/node': ^18.0.0 || >=20.0.0 2065 | less: '*' 2066 | lightningcss: ^1.21.0 2067 | sass: '*' 2068 | stylus: '*' 2069 | sugarss: '*' 2070 | terser: ^5.4.0 2071 | peerDependenciesMeta: 2072 | '@types/node': 2073 | optional: true 2074 | less: 2075 | optional: true 2076 | lightningcss: 2077 | optional: true 2078 | sass: 2079 | optional: true 2080 | stylus: 2081 | optional: true 2082 | sugarss: 2083 | optional: true 2084 | terser: 2085 | optional: true 2086 | dependencies: 2087 | esbuild: 0.19.12 2088 | postcss: 8.4.33 2089 | rollup: 4.9.6 2090 | sass: 1.70.0 2091 | optionalDependencies: 2092 | fsevents: 2.3.3 2093 | dev: true 2094 | 2095 | /webgl-constants@1.1.1: 2096 | resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} 2097 | dev: false 2098 | 2099 | /webgl-sdf-generator@1.1.1: 2100 | resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} 2101 | dev: false 2102 | 2103 | /which@2.0.2: 2104 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2105 | engines: {node: '>= 8'} 2106 | hasBin: true 2107 | dependencies: 2108 | isexe: 2.0.0 2109 | 2110 | /wrappy@1.0.2: 2111 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2112 | dev: true 2113 | 2114 | /yallist@4.0.0: 2115 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2116 | dev: true 2117 | 2118 | /yocto-queue@0.1.0: 2119 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2120 | engines: {node: '>=10'} 2121 | dev: true 2122 | 2123 | /zustand@3.7.2(react@18.2.0): 2124 | resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} 2125 | engines: {node: '>=12.7.0'} 2126 | peerDependencies: 2127 | react: '>=16.8' 2128 | peerDependenciesMeta: 2129 | react: 2130 | optional: true 2131 | dependencies: 2132 | react: 18.2.0 2133 | dev: false 2134 | 2135 | /zustand@4.5.0(@types/react@18.2.48)(react@18.2.0): 2136 | resolution: {integrity: sha512-zlVFqS5TQ21nwijjhJlx4f9iGrXSL0o/+Dpy4txAP22miJ8Ti6c1Ol1RLNN98BMib83lmDH/2KmLwaNXpjrO1A==} 2137 | engines: {node: '>=12.7.0'} 2138 | peerDependencies: 2139 | '@types/react': '>=16.8' 2140 | immer: '>=9.0.6' 2141 | react: '>=16.8' 2142 | peerDependenciesMeta: 2143 | '@types/react': 2144 | optional: true 2145 | immer: 2146 | optional: true 2147 | react: 2148 | optional: true 2149 | dependencies: 2150 | '@types/react': 18.2.48 2151 | react: 18.2.0 2152 | use-sync-external-store: 1.2.0(react@18.2.0) 2153 | dev: false 2154 | --------------------------------------------------------------------------------