commit 8a5ba1c541183be27d2cfd0428a1b283446c9c5f Author: supercodeur Date: Sun Jun 29 20:05:44 2025 +0200 [feat] Initial commit diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..4ea57b0 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,34 @@ +kind: pipeline +type: docker +name: deploy-static-site + +steps: + - name: deploy public_html + image: alpine:3.20 + volumes: + - name: ididit + path: /var/www/ididit + commands: + - | + if [ -d public_html ] && [ "$(ls -A public_html)" ]; then + target="/var/www/ididit/${DRONE_REPO_OWNER}/${DRONE_REPO_NAME}" + echo "Déploiement vers $target" + rm -rf "$target" + mkdir -p "$target" + cp -r public_html/* "$target/" + echo "Déploiement terminé." + echo "https://ididit.bymycode.com/${DRONE_REPO_OWNER}/${DRONE_REPO_NAME}" + ls -alh "$target" + else + echo "Aucun dossier public_html à déployer." + fi + when: + branch: + - main + event: + - push + +volumes: + - name: ididit + host: + path: /var/www/ididit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6bdbe62 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/.idea/ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7c4c107 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,489 @@ +{ + "name": "tetris", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tetris", + "dependencies": { + "kaboom": "^3000.1.17" + }, + "devDependencies": { + "esbuild": "^0.25.5" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/kaboom": { + "version": "3000.1.17", + "resolved": "https://registry.npmjs.org/kaboom/-/kaboom-3000.1.17.tgz", + "integrity": "sha512-npAtjGxj9Oj9vLpXfURck9eUPHR2ac1Lhc1bNcZ0NWcs+Lgs40Ty+wjujv1C2DwjWvxaX+3r2G64M35BS/Ry2g==", + "deprecated": "Kaboom is no longer maintained. Please use KAPLAY, the new game library built as its successor, by its developers.", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..924ddf1 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "tetris", + "scripts": { + "build": "esbuild --bundle src/main.js --outfile=www/main.js --minify", + "dev": "esbuild --bundle src/main.js --outfile=www/main.js --servedir=www", + "bundle": "npm run build && mkdir -p dist && zip -r dist/game.zip www -x \"**/.DS_Store\"" + }, + "dependencies": { + "kaboom": "^3000.1.17" + }, + "devDependencies": { + "esbuild": "^0.25.5" + } +} diff --git a/public_html/img/white.png b/public_html/img/white.png new file mode 100644 index 0000000..01d01a1 Binary files /dev/null and b/public_html/img/white.png differ diff --git a/public_html/index.html b/public_html/index.html new file mode 100644 index 0000000..6a8c3c8 --- /dev/null +++ b/public_html/index.html @@ -0,0 +1,9 @@ + + + + tetris + + + + + \ No newline at end of file diff --git a/public_html/main.js b/public_html/main.js new file mode 100644 index 0000000..77068fa --- /dev/null +++ b/public_html/main.js @@ -0,0 +1,56 @@ +(()=>{var Xn=Object.defineProperty,n=(r,e)=>Xn(r,"name",{value:e,configurable:!0}),Wn=(()=>{for(var r=new Uint8Array(128),e=0;e<64;e++)r[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return h=>{for(var u=h.length,f=new Uint8Array((u-(h[u-1]=="=")-(h[u-2]=="="))*3/4|0),A=0,P=0;A>4,f[P++]=Y<<4|V>>2,f[P++]=V<<6|re}return f}})();function Ge(r){return r*Math.PI/180}n(Ge,"deg2rad");function Bt(r){return r*180/Math.PI}n(Bt,"rad2deg");function je(r,e,h){return e>h?je(r,h,e):Math.min(Math.max(r,e),h)}n(je,"clamp");function Qe(r,e,h){if(typeof r=="number"&&typeof e=="number")return r+(e-r)*h;if(r instanceof E&&e instanceof E||r instanceof ee&&e instanceof ee)return r.lerp(e,h);throw new Error(`Bad value for lerp(): ${r}, ${e}. Only number, Vec2 and Color is supported.`)}n(Qe,"lerp");function $e(r,e,h,u,f){return u+(r-e)/(h-e)*(f-u)}n($e,"map");function Ws(r,e,h,u,f){return je($e(r,e,h,u,f),u,f)}n(Ws,"mapc");var E=class be{static{n(this,"Vec2")}x=0;y=0;constructor(e=0,h=e){this.x=e,this.y=h}static fromAngle(e){let h=Ge(e);return new be(Math.cos(h),Math.sin(h))}static LEFT=new be(-1,0);static RIGHT=new be(1,0);static UP=new be(0,-1);static DOWN=new be(0,1);clone(){return new be(this.x,this.y)}add(...e){let h=M(...e);return new be(this.x+h.x,this.y+h.y)}sub(...e){let h=M(...e);return new be(this.x-h.x,this.y-h.y)}scale(...e){let h=M(...e);return new be(this.x*h.x,this.y*h.y)}dist(...e){let h=M(...e);return this.sub(h).len()}sdist(...e){let h=M(...e);return this.sub(h).slen()}len(){return Math.sqrt(this.dot(this))}slen(){return this.dot(this)}unit(){let e=this.len();return e===0?new be(0):this.scale(1/e)}normal(){return new be(this.y,-this.x)}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}angle(...e){let h=M(...e);return Bt(Math.atan2(this.y-h.y,this.x-h.x))}angleBetween(...e){let h=M(...e);return Bt(Math.atan2(this.cross(h),this.dot(h)))}lerp(e,h){return new be(Qe(this.x,e.x,h),Qe(this.y,e.y,h))}slerp(e,h){let u=this.dot(e),f=this.cross(e),A=Math.atan2(f,u);return this.scale(Math.sin((1-h)*A)).add(e.scale(Math.sin(h*A))).scale(1/f)}isZero(){return this.x===0&&this.y===0}toFixed(e){return new be(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new ye(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}};function M(...r){if(r.length===1){if(r[0]instanceof E)return new E(r[0].x,r[0].y);if(Array.isArray(r[0])&&r[0].length===2)return new E(...r[0])}return new E(...r)}n(M,"vec2");var ee=class ue{static{n(this,"Color")}r=255;g=255;b=255;constructor(e,h,u){this.r=je(e,0,255),this.g=je(h,0,255),this.b=je(u,0,255)}static fromArray(e){return new ue(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ue(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let h=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return new ue(parseInt(h[1],16),parseInt(h[2],16),parseInt(h[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,h,u){if(h==0)return new ue(255*u,255*u,255*u);let f=n((re,b,j)=>(j<0&&(j+=1),j>1&&(j-=1),j<1/6?re+(b-re)*6*j:j<1/2?b:j<2/3?re+(b-re)*(2/3-j)*6:re),"hue2rgb"),A=u<.5?u*(1+h):u+h-u*h,P=2*u-A,C=f(P,A,e+1/3),Y=f(P,A,e),V=f(P,A,e-1/3);return new ue(Math.round(C*255),Math.round(Y*255),Math.round(V*255))}static RED=new ue(255,0,0);static GREEN=new ue(0,255,0);static BLUE=new ue(0,0,255);static YELLOW=new ue(255,255,0);static MAGENTA=new ue(255,0,255);static CYAN=new ue(0,255,255);static WHITE=new ue(255,255,255);static BLACK=new ue(0,0,0);clone(){return new ue(this.r,this.g,this.b)}lighten(e){return new ue(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ue(255-this.r,255-this.g,255-this.b)}mult(e){return new ue(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,h){return new ue(Qe(this.r,e.r,h),Qe(this.g,e.g,h),Qe(this.b,e.b,h))}toHSL(){let e=this.r/255,h=this.g/255,u=this.b/255,f=Math.max(e,h,u),A=Math.min(e,h,u),P=(f+A)/2,C=P,Y=P;if(f==A)P=C=0;else{let V=f-A;switch(C=Y>.5?V/(2-f-A):V/(f+A),f){case e:P=(h-u)/V+(hee.fromHSL(r,e,h),"hsl2rgb"),me=class ai{static{n(this,"Quad")}x=0;y=0;w=1;h=1;constructor(e,h,u,f){this.x=e,this.y=h,this.w=u,this.h=f}scale(e){return new ai(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new E(this.x,this.y)}clone(){return new ai(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}};function he(r,e,h,u){return new me(r,e,h,u)}n(he,"quad");var Le=class Ye{static{n(this,"Mat4")}m=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];constructor(e){e&&(this.m=e)}static translate(e){return new Ye([1,0,0,0,0,1,0,0,0,0,1,0,e.x,e.y,0,1])}static scale(e){return new Ye([e.x,0,0,0,0,e.y,0,0,0,0,1,0,0,0,0,1])}static rotateX(e){e=Ge(-e);let h=Math.cos(e),u=Math.sin(e);return new Ye([1,0,0,0,0,h,-u,0,0,u,h,0,0,0,0,1])}static rotateY(e){e=Ge(-e);let h=Math.cos(e),u=Math.sin(e);return new Ye([h,0,u,0,0,1,0,0,-u,0,h,0,0,0,0,1])}static rotateZ(e){e=Ge(-e);let h=Math.cos(e),u=Math.sin(e);return new Ye([h,-u,0,0,u,h,0,0,0,0,1,0,0,0,0,1])}translate(e){return this.m[12]+=this.m[0]*e.x+this.m[4]*e.y,this.m[13]+=this.m[1]*e.x+this.m[5]*e.y,this.m[14]+=this.m[2]*e.x+this.m[6]*e.y,this.m[15]+=this.m[3]*e.x+this.m[7]*e.y,this}scale(e){return this.m[0]*=e.x,this.m[4]*=e.y,this.m[1]*=e.x,this.m[5]*=e.y,this.m[2]*=e.x,this.m[6]*=e.y,this.m[3]*=e.x,this.m[7]*=e.y,this}rotate(e){e=Ge(-e);let h=Math.cos(e),u=Math.sin(e),f=this.m[0],A=this.m[1],P=this.m[4],C=this.m[5];return this.m[0]=f*h+A*u,this.m[1]=-f*u+A*h,this.m[4]=P*h+C*u,this.m[5]=-P*u+C*h,this}mult(e){let h=[];for(let u=0;u<4;u++)for(let f=0;f<4;f++)h[u*4+f]=this.m[0*4+f]*e.m[u*4+0]+this.m[1*4+f]*e.m[u*4+1]+this.m[2*4+f]*e.m[u*4+2]+this.m[3*4+f]*e.m[u*4+3];return new Ye(h)}multVec2(e){return new E(e.x*this.m[0]+e.y*this.m[4]+this.m[12],e.x*this.m[1]+e.y*this.m[5]+this.m[13])}getTranslation(){return new E(this.m[12],this.m[13])}getScale(){if(this.m[0]!=0||this.m[1]!=0){let e=this.m[0]*this.m[5]-this.m[1]*this.m[4],h=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new E(h,e/h)}else if(this.m[4]!=0||this.m[5]!=0){let e=this.m[0]*this.m[5]-this.m[1]*this.m[4],h=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new E(e/h,h)}else return new E(0,0)}getRotation(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return Bt(this.m[1]>0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Bt(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new E(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new E(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new E(0,0)}invert(){let e=[],h=this.m[10]*this.m[15]-this.m[14]*this.m[11],u=this.m[9]*this.m[15]-this.m[13]*this.m[11],f=this.m[9]*this.m[14]-this.m[13]*this.m[10],A=this.m[8]*this.m[15]-this.m[12]*this.m[11],P=this.m[8]*this.m[14]-this.m[12]*this.m[10],C=this.m[8]*this.m[13]-this.m[12]*this.m[9],Y=this.m[6]*this.m[15]-this.m[14]*this.m[7],V=this.m[5]*this.m[15]-this.m[13]*this.m[7],re=this.m[5]*this.m[14]-this.m[13]*this.m[6],b=this.m[4]*this.m[15]-this.m[12]*this.m[7],j=this.m[4]*this.m[14]-this.m[12]*this.m[6],y=this.m[5]*this.m[15]-this.m[13]*this.m[7],W=this.m[4]*this.m[13]-this.m[12]*this.m[5],de=this.m[6]*this.m[11]-this.m[10]*this.m[7],te=this.m[5]*this.m[11]-this.m[9]*this.m[7],U=this.m[5]*this.m[10]-this.m[9]*this.m[6],fe=this.m[4]*this.m[11]-this.m[8]*this.m[7],S=this.m[4]*this.m[10]-this.m[8]*this.m[6],Be=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*h-this.m[6]*u+this.m[7]*f,e[4]=-(this.m[4]*h-this.m[6]*A+this.m[7]*P),e[8]=this.m[4]*u-this.m[5]*A+this.m[7]*C,e[12]=-(this.m[4]*f-this.m[5]*P+this.m[6]*C),e[1]=-(this.m[1]*h-this.m[2]*u+this.m[3]*f),e[5]=this.m[0]*h-this.m[2]*A+this.m[3]*P,e[9]=-(this.m[0]*u-this.m[1]*A+this.m[3]*C),e[13]=this.m[0]*f-this.m[1]*P+this.m[2]*C,e[2]=this.m[1]*Y-this.m[2]*V+this.m[3]*re,e[6]=-(this.m[0]*Y-this.m[2]*b+this.m[3]*j),e[10]=this.m[0]*y-this.m[1]*b+this.m[3]*W,e[14]=-(this.m[0]*re-this.m[1]*j+this.m[2]*W),e[3]=-(this.m[1]*de-this.m[2]*te+this.m[3]*U),e[7]=this.m[0]*de-this.m[2]*fe+this.m[3]*S,e[11]=-(this.m[0]*te-this.m[1]*fe+this.m[3]*Be),e[15]=this.m[0]*U-this.m[1]*S+this.m[2]*Be;let K=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let Se=0;Se<4;Se++)for(let we=0;we<4;we++)e[Se*4+we]*=1/K;return new Ye(e)}clone(){return new Ye([...this.m])}toString(){return this.m.toString()}};function hi(r,e,h,u=f=>-Math.cos(f)){return r+(u(h)+1)/2*(e-r)}n(hi,"wave");var _n=1103515245,$n=12345,Ns=2147483648,Zs=class{static{n(this,"RNG")}seed;constructor(r){this.seed=r}gen(){return this.seed=(_n*this.seed+$n)%Ns,this.seed/Ns}genNumber(r,e){return r+this.gen()*(e-r)}genVec2(r,e){return new E(this.genNumber(r.x,e.x),this.genNumber(r.y,e.y))}genColor(r,e){return new ee(this.genNumber(r.r,e.r),this.genNumber(r.g,e.g),this.genNumber(r.b,e.b))}genAny(...r){if(r.length===0)return this.gen();if(r.length===1){if(typeof r[0]=="number")return this.genNumber(0,r[0]);if(r[0]instanceof E)return this.genVec2(M(0,0),r[0]);if(r[0]instanceof ee)return this.genColor(Z(0,0,0),r[0])}else if(r.length===2){if(typeof r[0]=="number"&&typeof r[1]=="number")return this.genNumber(r[0],r[1]);if(r[0]instanceof E&&r[1]instanceof E)return this.genVec2(r[0],r[1]);if(r[0]instanceof ee&&r[1]instanceof ee)return this.genColor(r[0],r[1])}}},li=new Zs(Date.now());function _s(r){return r!=null&&(li.seed=r),li.seed}n(_s,"randSeed");function hr(...r){return li.genAny(...r)}n(hr,"rand");function wi(...r){return Math.floor(hr(...r))}n(wi,"randi");function $s(r){return hr()<=r}n($s,"chance");function en(r){return r[wi(r.length)]}n(en,"choose");function tn(r,e){return r.pos.x+r.width>e.pos.x&&r.pos.xe.pos.y&&r.pos.y1||f<0||f>1?null:u}n(rn,"testLineLineT");function Tt(r,e){let h=rn(r,e);return h?M(r.p1.x+h*(r.p2.x-r.p1.x),r.p1.y+h*(r.p2.y-r.p1.y)):null}n(Tt,"testLineLine");function sn(r,e){if(lr(r,e.p1)||lr(r,e.p2))return!0;let h=r.points();return!!Tt(e,new Pt(h[0],h[1]))||!!Tt(e,new Pt(h[1],h[2]))||!!Tt(e,new Pt(h[2],h[3]))||!!Tt(e,new Pt(h[3],h[0]))}n(sn,"testRectLine");function lr(r,e){return e.x>r.pos.x&&e.xr.pos.y&&e.yNumber.EPSILON)return!1;let f=h.dot(u)/u.dot(u);return f>=0&&f<=1}n(nn,"testLinePoint");function Ai(r,e){let h=r.p2.sub(r.p1),u=h.dot(h),f=r.p1.sub(e.center),A=2*h.dot(f),P=f.dot(f)-e.radius*e.radius,C=A*A-4*u*P;if(u<=Number.EPSILON||C<0)return!1;if(C==0){let Y=-A/(2*u);if(Y>=0&&Y<=1)return!0}else{let Y=(-A+Math.sqrt(C))/(2*u),V=(-A-Math.sqrt(C))/(2*u);if(Y>=0&&Y<=1||V>=0&&V<=1)return!0}return Vi(e,r.p1)}n(Ai,"testLineCircle");function Vi(r,e){return r.center.sdist(e)e.y!=u[A].y>e.y&&e.x<(u[A].x-u[f].x)*(e.y-u[f].y)/(u[A].y-u[f].y)+u[f].x&&(h=!h);return h}n(vi,"testPolygonPoint");var Pt=class ui{static{n(this,"Line")}p1;p2;constructor(e,h){this.p1=e.clone(),this.p2=h.clone()}transform(e){return new ui(e.multVec2(this.p1),e.multVec2(this.p2))}bbox(){return ye.fromPoints(this.p1,this.p2)}area(){return this.p1.dist(this.p2)}clone(){return new ui(this.p1,this.p2)}},ye=class di{static{n(this,"Rect")}pos;width;height;constructor(e,h,u){this.pos=e.clone(),this.width=h,this.height=u}static fromPoints(e,h){return new di(e.clone(),h.x-e.x,h.y-e.y)}center(){return new E(this.pos.x+this.width/2,this.pos.y+this.height/2)}points(){return[this.pos,this.pos.add(this.width,0),this.pos.add(this.width,this.height),this.pos.add(0,this.height)]}transform(e){return new sr(this.points().map(h=>e.multVec2(h)))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new di(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let h=this.pos,u=this.pos.add(this.width,this.height),f=Math.max(h.x-e.x,0,e.x-u.x),A=Math.max(h.y-e.y,0,e.y-u.y);return f*f+A*A}},Us=class an{static{n(this,"Circle")}center;radius;constructor(e,h){this.center=e.clone(),this.radius=h}transform(e){return new eo(this.center,this.radius,this.radius).transform(e)}bbox(){return ye.fromPoints(this.center.sub(M(this.radius)),this.center.add(M(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new an(this.center,this.radius)}},eo=class ci{static{n(this,"Ellipse")}center;radiusX;radiusY;constructor(e,h,u){this.center=e.clone(),this.radiusX=h,this.radiusY=u}transform(e){return new ci(e.multVec2(this.center),e.m[0]*this.radiusX,e.m[5]*this.radiusY)}bbox(){return ye.fromPoints(this.center.sub(M(this.radiusX,this.radiusY)),this.center.add(M(this.radiusX,this.radiusY)))}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new ci(this.center,this.radiusX,this.radiusY)}},sr=class fi{static{n(this,"Polygon")}pts;constructor(e){if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new fi(this.pts.map(h=>e.multVec2(h)))}bbox(){let e=M(Number.MAX_VALUE),h=M(-Number.MAX_VALUE);for(let u of this.pts)e.x=Math.min(e.x,u.x),h.x=Math.max(h.x,u.x),e.y=Math.min(e.y,u.y),h.y=Math.max(h.y,u.y);return ye.fromPoints(e,h)}area(){let e=0,h=this.pts.length;for(let u=0;ue.clone()))}};function hn(r,e){let h=Number.MAX_VALUE,u=M(0);for(let f of[r,e])for(let A=0;Athis.delete(e)}},Mt=class un{static{n(this,"EventController")}paused=!1;cancel;constructor(e){this.cancel=e}static join(e){let h=new un(()=>e.forEach(u=>u.cancel()));return Object.defineProperty(h,"paused",{get:()=>e[0].paused,set:u=>e.forEach(f=>f.paused=u)}),h.paused=!1,h}},ke=class{static{n(this,"Event")}handlers=new ln;add(r){let e=this.handlers.pushd((...u)=>{h.paused||r(...u)}),h=new Mt(e);return h}addOnce(r){let e=this.add((...h)=>{e.cancel(),r(...h)});return e}next(){return new Promise(r=>this.addOnce(r))}trigger(...r){this.handlers.forEach(e=>e(...r))}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},nr=class{static{n(this,"EventHandler")}handlers={};on(r,e){return this.handlers[r]||(this.handlers[r]=new ke),this.handlers[r].add(e)}onOnce(r,e){let h=this.on(r,(...u)=>{h.cancel(),e(...u)});return h}next(r){return new Promise(e=>{this.onOnce(r,(...h)=>e(h[0]))})}trigger(r,...e){this.handlers[r]&&this.handlers[r].trigger(...e)}remove(r){delete this.handlers[r]}clear(){this.handlers={}}numListeners(r){return this.handlers[r]?.numListeners()??0}};function Dr(r,e){if(r===e)return!0;let h=typeof r,u=typeof e;if(h!==u)return!1;if(h==="object"&&u==="object"&&r!==null&&e!==null){if(Array.isArray(r)!==Array.isArray(e))return!1;let f=Object.keys(r),A=Object.keys(e);if(f.length!==A.length)return!1;for(let P of f){let C=r[P],Y=e[P];if(!Dr(C,Y))return!1}return!0}return!1}n(Dr,"deepEq");function dn(r){let e=window.atob(r),h=e.length,u=new Uint8Array(h);for(let f=0;fr.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),to=n(r=>r.split(".").slice(0,-1).join("."),"getFileName");function Pe(r,e){return(...h)=>{let u=h.length;if(u===r.length)return r(...h);if(u===e.length)return e(...h)}}n(Pe,"overload2");var ro=(()=>{let r=0;return()=>r++})(),io=n(r=>r instanceof Error?r.message:String(r),"getErrorMessage"),so=class{static{n(this,"BinaryHeap")}_items;_compareFn;constructor(r=(e,h)=>e0;){let e=Math.floor((r-1)/2);if(!this._compareFn(this._items[r],this._items[e])&&this._items[r]>=this._items[e])break;this.swap(r,e),r=e}}moveDown(r){for(;r=e&&r<=h}n(et,"betweenInclusive");var Gs={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"select",10:"lstick",16:"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",9:"start",10:"lstick",16:"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home",17:"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{0:"south",1:"east",2:"west",3:"north",4:"lshoulder",5:"rshoulder",6:"ltrigger",7:"rtrigger",8:"select",9:"start",10:"lstick",11:"rstick",12:"dpad-up",13:"dpad-down",14:"dpad-left",15:"dpad-right",16:"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}},Fr=class{static{n(this,"ButtonState")}pressed=new Set([]);pressedRepeat=new Set([]);released=new Set([]);down=new Set([]);update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(r){this.pressed.add(r),this.pressedRepeat.add(r),this.down.add(r)}pressRepeat(r){this.pressedRepeat.add(r)}release(r){this.down.delete(r),this.pressed.delete(r),this.released.add(r)}},oo=class{static{n(this,"GamepadState")}buttonState=new Fr;stickState=new Map},ao=class{static{n(this,"FPSCounter")}dts=[];timer=0;fps=0;tick(r){this.dts.push(r),this.timer+=r,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((e,h)=>e+h)/this.dts.length)),this.dts=[])}},ho=n(r=>{if(!r.canvas)throw new Error("Please provide a canvas");let e={canvas:r.canvas,loopID:null,stopped:!1,dt:0,time:0,realTime:0,fpsCounter:new ao,timeScale:1,skipTime:!1,numFrames:0,mousePos:new E(0),mouseDeltaPos:new E(0),keyState:new Fr,mouseState:new Fr,mergedGamepadState:new oo,gamepadStates:new Map,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:r.canvas.offsetWidth,lastHeight:r.canvas.offsetHeight,events:new nr};function h(){return e.dt*e.timeScale}n(h,"dt");function u(){return e.time}n(u,"time");function f(){return e.fpsCounter.fps}n(f,"fps");function A(){return e.numFrames}n(A,"numFrames");function P(){return e.canvas.toDataURL()}n(P,"screenshot");function C(c){e.canvas.style.cursor=c}n(C,"setCursor");function Y(){return e.canvas.style.cursor}n(Y,"getCursor");function V(c){if(c)try{let v=e.canvas.requestPointerLock();v.catch&&v.catch(R=>console.error(R))}catch(v){console.error(v)}else document.exitPointerLock()}n(V,"setCursorLocked");function re(){return!!document.pointerLockElement}n(re,"isCursorLocked");function b(c){c.requestFullscreen?c.requestFullscreen():c.webkitRequestFullscreen&&c.webkitRequestFullscreen()}n(b,"enterFullscreen");function j(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}n(j,"exitFullscreen");function y(){return document.fullscreenElement||document.webkitFullscreenElement}n(y,"getFullscreenElement");function W(c=!0){c?b(e.canvas):j()}n(W,"setFullscreen");function de(){return!!y()}n(de,"isFullscreen");function te(){e.stopped=!0;for(let c in ie)e.canvas.removeEventListener(c,ie[c]);for(let c in le)document.removeEventListener(c,le[c]);for(let c in ne)window.removeEventListener(c,ne[c]);Ae.disconnect()}n(te,"quit");function U(c){e.loopID!==null&&cancelAnimationFrame(e.loopID);let v=0,R=n(q=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(R);return}let Q=q/1e3,ce=Q-e.realTime,Re=r.maxFPS?1/r.maxFPS:0;e.realTime=Q,v+=ce,v>Re&&(e.skipTime||(e.dt=v,e.time+=h(),e.fpsCounter.tick(e.dt)),v=0,e.skipTime=!1,e.numFrames++,ot(),c(),zt()),e.loopID=requestAnimationFrame(R)},"frame");R(0)}n(U,"run");function fe(){return"ontouchstart"in window||navigator.maxTouchPoints>0}n(fe,"isTouchscreen");function S(){return e.mousePos.clone()}n(S,"mousePos");function Be(){return e.mouseDeltaPos.clone()}n(Be,"mouseDeltaPos");function K(c="left"){return e.mouseState.pressed.has(c)}n(K,"isMousePressed");function Se(c="left"){return e.mouseState.down.has(c)}n(Se,"isMouseDown");function we(c="left"){return e.mouseState.released.has(c)}n(we,"isMouseReleased");function Ee(){return e.isMouseMoved}n(Ee,"isMouseMoved");function ze(c){return c===void 0?e.keyState.pressed.size>0:e.keyState.pressed.has(c)}n(ze,"isKeyPressed");function kt(c){return c===void 0?e.keyState.pressedRepeat.size>0:e.keyState.pressedRepeat.has(c)}n(kt,"isKeyPressedRepeat");function pt(c){return c===void 0?e.keyState.down.size>0:e.keyState.down.has(c)}n(pt,"isKeyDown");function gt(c){return c===void 0?e.keyState.released.size>0:e.keyState.released.has(c)}n(gt,"isKeyReleased");function mt(c){return c===void 0?e.mergedGamepadState.buttonState.pressed.size>0:e.mergedGamepadState.buttonState.pressed.has(c)}n(mt,"isGamepadButtonPressed");function Oe(c){return c===void 0?e.mergedGamepadState.buttonState.down.size>0:e.mergedGamepadState.buttonState.down.has(c)}n(Oe,"isGamepadButtonDown");function Nt(c){return c===void 0?e.mergedGamepadState.buttonState.released.size>0:e.mergedGamepadState.buttonState.released.has(c)}n(Nt,"isGamepadButtonReleased");function Ut(c){return e.events.on("resize",c)}n(Ut,"onResize");let fr=Pe(c=>e.events.on("keyDown",c),(c,v)=>e.events.on("keyDown",R=>R===c&&v(c))),pr=Pe(c=>e.events.on("keyPress",c),(c,v)=>e.events.on("keyPress",R=>R===c&&v(c))),gr=Pe(c=>e.events.on("keyPressRepeat",c),(c,v)=>e.events.on("keyPressRepeat",R=>R===c&&v(c))),mr=Pe(c=>e.events.on("keyRelease",c),(c,v)=>e.events.on("keyRelease",R=>R===c&&v(c))),Lt=Pe(c=>e.events.on("mouseDown",v=>c(v)),(c,v)=>e.events.on("mouseDown",R=>R===c&&v(R))),Gt=Pe(c=>e.events.on("mousePress",v=>c(v)),(c,v)=>e.events.on("mousePress",R=>R===c&&v(R))),Ot=Pe(c=>e.events.on("mouseRelease",v=>c(v)),(c,v)=>e.events.on("mouseRelease",R=>R===c&&v(R)));function wt(c){return e.events.on("mouseMove",()=>c(S(),Be()))}n(wt,"onMouseMove");function At(c){return e.events.on("charInput",c)}n(At,"onCharInput");function qt(c){return e.events.on("touchStart",c)}n(qt,"onTouchStart");function rt(c){return e.events.on("touchMove",c)}n(rt,"onTouchMove");function Ht(c){return e.events.on("touchEnd",c)}n(Ht,"onTouchEnd");function Kt(c){return e.events.on("scroll",c)}n(Kt,"onScroll");function Vt(c){return e.events.on("hide",c)}n(Vt,"onHide");function Yt(c){return e.events.on("show",c)}n(Yt,"onShow");function vt(c,v){if(typeof c=="function")return e.events.on("gamepadButtonDown",c);if(typeof c=="string"&&typeof v=="function")return e.events.on("gamepadButtonDown",R=>R===c&&v(c))}n(vt,"onGamepadButtonDown");function yt(c,v){if(typeof c=="function")return e.events.on("gamepadButtonPress",c);if(typeof c=="string"&&typeof v=="function")return e.events.on("gamepadButtonPress",R=>R===c&&v(c))}n(yt,"onGamepadButtonPress");function jt(c,v){if(typeof c=="function")return e.events.on("gamepadButtonRelease",c);if(typeof c=="string"&&typeof v=="function")return e.events.on("gamepadButtonRelease",R=>R===c&&v(c))}n(jt,"onGamepadButtonRelease");function it(c,v){return e.events.on("gamepadStick",(R,q)=>R===c&&v(q))}n(it,"onGamepadStick");function Qt(c){e.events.on("gamepadConnect",c)}n(Qt,"onGamepadConnect");function st(c){e.events.on("gamepadDisconnect",c)}n(st,"onGamepadDisconnect");function Fe(c){return e.mergedGamepadState.stickState.get(c)||new E(0)}n(Fe,"getGamepadStick");function nt(){return[...e.charInputted]}n(nt,"charInputted");function xt(){return[...e.gamepads]}n(xt,"getGamepads");function ot(){e.events.trigger("input"),e.keyState.down.forEach(c=>e.events.trigger("keyDown",c)),e.mouseState.down.forEach(c=>e.events.trigger("mouseDown",c)),Ne()}n(ot,"processInput");function zt(){e.keyState.update(),e.mouseState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((c,v)=>{e.mergedGamepadState.stickState.set(v,new E(0))}),e.charInputted=[],e.isMouseMoved=!1,e.gamepadStates.forEach(c=>{c.buttonState.update(),c.stickState.forEach((v,R)=>{c.stickState.set(R,new E(0))})})}n(zt,"resetInput");function Et(c){let v={index:c.index,isPressed:R=>e.gamepadStates.get(c.index).buttonState.pressed.has(R),isDown:R=>e.gamepadStates.get(c.index).buttonState.down.has(R),isReleased:R=>e.gamepadStates.get(c.index).buttonState.released.has(R),getStick:R=>e.gamepadStates.get(c.index).stickState.get(R)};return e.gamepads.push(v),e.gamepadStates.set(c.index,{buttonState:new Fr,stickState:new Map([["left",new E(0)],["right",new E(0)]])}),v}n(Et,"registerGamepad");function $(c){e.gamepads=e.gamepads.filter(v=>v.index!==c.index),e.gamepadStates.delete(c.index)}n($,"removeGamepad");function Ne(){for(let c of navigator.getGamepads())c&&!e.gamepadStates.has(c.index)&&Et(c);for(let c of e.gamepads){let v=navigator.getGamepads()[c.index],R=(r.gamepads??{})[v.id]??Gs[v.id]??Gs.default,q=e.gamepadStates.get(c.index);for(let Q=0;Q{let v=new E(c.offsetX,c.offsetY),R=new E(c.movementX,c.movementY);if(de()){let q=e.canvas.width/Ue,Q=e.canvas.height/Ue,ce=window.innerWidth,Re=window.innerHeight,Jt=ce/Re,Xt=q/Q;if(Jt>Xt){let De=Re/Q,Me=(ce-q*De)/2;v.x=$e(c.offsetX-Me,0,q*De,0,q),v.y=$e(c.offsetY,0,Q*De,0,Q)}else{let De=ce/q,Me=(Re-Q*De)/2;v.x=$e(c.offsetX,0,q*De,0,q),v.y=$e(c.offsetY-Me,0,Q*De,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=v,e.mouseDeltaPos=R,e.events.trigger("mouseMove")})};let Je=["left","middle","right","back","forward"];ie.mousedown=c=>{e.events.onOnce("input",()=>{let v=Je[c.button];v&&(e.mouseState.press(v),e.events.trigger("mousePress",v))})},ie.mouseup=c=>{e.events.onOnce("input",()=>{let v=Je[c.button];v&&(e.mouseState.release(v),e.events.trigger("mouseRelease",v))})};let wr=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),qe={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};ie.keydown=c=>{wr.has(c.key)&&c.preventDefault(),e.events.onOnce("input",()=>{let v=qe[c.key]||c.key.toLowerCase();v.length===1?(e.events.trigger("charInput",v),e.charInputted.push(v)):v==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),c.repeat?(e.keyState.pressRepeat(v),e.events.trigger("keyPressRepeat",v)):(e.keyState.press(v),e.events.trigger("keyPressRepeat",v),e.events.trigger("keyPress",v))})},ie.keyup=c=>{e.events.onOnce("input",()=>{let v=qe[c.key]||c.key.toLowerCase();e.keyState.release(v),e.events.trigger("keyRelease",v)})},ie.touchstart=c=>{c.preventDefault(),e.events.onOnce("input",()=>{let v=[...c.changedTouches],R=e.canvas.getBoundingClientRect();r.touchToMouse!==!1&&(e.mousePos=new E(v[0].clientX-R.x,v[0].clientY-R.y),e.mouseState.press("left"),e.events.trigger("mousePress","left")),v.forEach(q=>{e.events.trigger("touchStart",new E(q.clientX-R.x,q.clientY-R.y),q)})})},ie.touchmove=c=>{c.preventDefault(),e.events.onOnce("input",()=>{let v=[...c.changedTouches],R=e.canvas.getBoundingClientRect();r.touchToMouse!==!1&&(e.mousePos=new E(v[0].clientX-R.x,v[0].clientY-R.y),e.events.trigger("mouseMove")),v.forEach(q=>{e.events.trigger("touchMove",new E(q.clientX-R.x,q.clientY-R.y),q)})})},ie.touchend=c=>{e.events.onOnce("input",()=>{let v=[...c.changedTouches],R=e.canvas.getBoundingClientRect();r.touchToMouse!==!1&&(e.mousePos=new E(v[0].clientX-R.x,v[0].clientY-R.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),v.forEach(q=>{e.events.trigger("touchEnd",new E(q.clientX-R.x,q.clientY-R.y),q)})})},ie.touchcancel=c=>{e.events.onOnce("input",()=>{let v=[...c.changedTouches],R=e.canvas.getBoundingClientRect();r.touchToMouse!==!1&&(e.mousePos=new E(v[0].clientX-R.x,v[0].clientY-R.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),v.forEach(q=>{e.events.trigger("touchEnd",new E(q.clientX-R.x,q.clientY-R.y),q)})})},ie.wheel=c=>{c.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new E(c.deltaX,c.deltaY))})},ie.contextmenu=c=>c.preventDefault(),le.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.events.trigger("show")):e.events.trigger("hide")},ne.gamepadconnected=c=>{let v=Et(c.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",v)})},ne.gamepaddisconnected=c=>{let v=xt().filter(R=>R.index===c.gamepad.index)[0];$(c.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",v)})};for(let c in ie)e.canvas.addEventListener(c,ie[c]);for(let c in le)document.addEventListener(c,le[c]);for(let c in ne)window.addEventListener(c,ne[c]);let Ae=new ResizeObserver(c=>{for(let v of c)if(v.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return Ae.observe(e.canvas),{dt:h,time:u,run:U,canvas:e.canvas,fps:f,numFrames:A,quit:te,setFullscreen:W,isFullscreen:de,setCursor:C,screenshot:P,getGamepads:xt,getCursor:Y,setCursorLocked:V,isCursorLocked:re,isTouchscreen:fe,mousePos:S,mouseDeltaPos:Be,isKeyDown:pt,isKeyPressed:ze,isKeyPressedRepeat:kt,isKeyReleased:gt,isMouseDown:Se,isMousePressed:K,isMouseReleased:we,isMouseMoved:Ee,isGamepadButtonPressed:mt,isGamepadButtonDown:Oe,isGamepadButtonReleased:Nt,getGamepadStick:Fe,charInputted:nt,onResize:Ut,onKeyDown:fr,onKeyPress:pr,onKeyPressRepeat:gr,onKeyRelease:mr,onMouseDown:Lt,onMousePress:Gt,onMouseRelease:Ot,onMouseMove:wt,onCharInput:At,onTouchStart:qt,onTouchMove:rt,onTouchEnd:Ht,onScroll:Kt,onHide:Vt,onShow:Yt,onGamepadButtonDown:vt,onGamepadButtonPress:yt,onGamepadButtonRelease:jt,onGamepadStick:it,onGamepadConnect:Qt,onGamepadDisconnect:st,events:e.events}},"default"),ut=class bn{static{n(this,"Texture")}ctx;src=null;glTex;width;height;constructor(e,h,u,f={}){this.ctx=e;let A=e.gl;this.glTex=e.gl.createTexture(),e.onDestroy(()=>this.free()),this.width=h,this.height=u;let P={linear:A.LINEAR,nearest:A.NEAREST}[f.filter??e.opts.texFilter]??A.NEAREST,C={repeat:A.REPEAT,clampToEadge:A.CLAMP_TO_EDGE}[f.wrap]??A.CLAMP_TO_EDGE;this.bind(),h&&u&&A.texImage2D(A.TEXTURE_2D,0,A.RGBA,h,u,0,A.RGBA,A.UNSIGNED_BYTE,null),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,P),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,P),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,C),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,C),this.unbind()}static fromImage(e,h,u={}){let f=new bn(e,h.width,h.height,u);return f.update(h),f.src=h,f}update(e,h=0,u=0){let f=this.ctx.gl;this.bind(),f.texSubImage2D(f.TEXTURE_2D,0,h,u,f.RGBA,f.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},br=class{static{n(this,"FrameBuffer")}ctx;tex;glFramebuffer;glRenderbuffer;constructor(r,e,h,u={}){this.ctx=r;let f=r.gl;r.onDestroy(()=>this.free()),this.tex=new ut(r,e,h,u),this.glFramebuffer=f.createFramebuffer(),this.glRenderbuffer=f.createRenderbuffer(),this.bind(),f.renderbufferStorage(f.RENDERBUFFER,f.DEPTH_STENCIL,e,h),f.framebufferTexture2D(f.FRAMEBUFFER,f.COLOR_ATTACHMENT0,f.TEXTURE_2D,this.tex.glTex,0),f.framebufferRenderbuffer(f.FRAMEBUFFER,f.DEPTH_STENCIL_ATTACHMENT,f.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let r=this.ctx.gl,e=new Uint8ClampedArray(this.width*this.height*4);this.bind(),r.readPixels(0,0,this.width,this.height,r.RGBA,r.UNSIGNED_BYTE,e),this.unbind();let h=this.width*4,u=new Uint8Array(h);for(let f=0;f<(this.height/2|0);f++){let A=f*h,P=(this.height-f-1)*h;u.set(e.subarray(A,A+h)),e.copyWithin(A,P,P+h),e.set(u,P)}return new ImageData(e,this.width,this.height)}toDataURL(){let r=document.createElement("canvas"),e=r.getContext("2d");return r.width=this.width,r.height=this.height,e.putImageData(this.toImageData(),0,0),r.toDataURL()}draw(r){this.bind(),r(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let r=this.ctx.gl;r.deleteFramebuffer(this.glFramebuffer),r.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},lo=class{static{n(this,"Shader")}ctx;glProgram;constructor(r,e,h,u){this.ctx=r,r.onDestroy(()=>this.free());let f=r.gl,A=f.createShader(f.VERTEX_SHADER),P=f.createShader(f.FRAGMENT_SHADER);f.shaderSource(A,e),f.shaderSource(P,h),f.compileShader(A),f.compileShader(P);let C=f.createProgram();if(this.glProgram=C,f.attachShader(C,A),f.attachShader(C,P),u.forEach((Y,V)=>f.bindAttribLocation(C,V,Y)),f.linkProgram(C),!f.getProgramParameter(C,f.LINK_STATUS)){let Y=f.getShaderInfoLog(A);if(Y)throw new Error("VERTEX SHADER "+Y);let V=f.getShaderInfoLog(P);if(V)throw new Error("FRAGMENT SHADER "+V)}f.deleteShader(A),f.deleteShader(P)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(r){let e=this.ctx.gl;for(let h in r){let u=r[h],f=e.getUniformLocation(this.glProgram,h);typeof u=="number"?e.uniform1f(f,u):u instanceof Le?e.uniformMatrix4fv(f,!1,new Float32Array(u.m)):u instanceof ee?e.uniform3f(f,u.r,u.g,u.b):u instanceof E&&e.uniform2f(f,u.x,u.y)}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},uo=class{static{n(this,"BatchRenderer")}ctx;glVBuf;glIBuf;vqueue=[];iqueue=[];stride;maxVertices;maxIndices;vertexFormat;numDraws=0;curPrimitive=null;curTex=null;curShader=null;curUniform={};constructor(r,e,h,u){let f=r.gl;this.vertexFormat=e,this.ctx=r,this.stride=e.reduce((A,P)=>A+P.size,0),this.maxVertices=h,this.maxIndices=u,this.glVBuf=f.createBuffer(),r.pushArrayBuffer(this.glVBuf),f.bufferData(f.ARRAY_BUFFER,h*4,f.DYNAMIC_DRAW),r.popArrayBuffer(),this.glIBuf=f.createBuffer(),r.pushElementArrayBuffer(this.glIBuf),f.bufferData(f.ELEMENT_ARRAY_BUFFER,u*4,f.DYNAMIC_DRAW),r.popElementArrayBuffer()}push(r,e,h,u,f=null,A={}){(r!==this.curPrimitive||f!==this.curTex||u!==this.curShader||!Dr(this.curUniform,A)||this.vqueue.length+e.length*this.stride>this.maxVertices||this.iqueue.length+h.length>this.maxIndices)&&this.flush();let P=this.vqueue.length/this.stride;for(let C of e)this.vqueue.push(C);for(let C of h)this.iqueue.push(C+P);this.curPrimitive=r,this.curShader=u,this.curTex=f,this.curUniform=A}flush(){if(!this.curPrimitive||!this.curShader||this.vqueue.length===0||this.iqueue.length===0)return;let r=this.ctx.gl;this.ctx.pushArrayBuffer(this.glVBuf),r.bufferSubData(r.ARRAY_BUFFER,0,new Float32Array(this.vqueue)),this.ctx.pushElementArrayBuffer(this.glIBuf),r.bufferSubData(r.ELEMENT_ARRAY_BUFFER,0,new Uint16Array(this.iqueue)),this.ctx.setVertexFormat(this.vertexFormat),this.curShader.bind(),this.curShader.send(this.curUniform),this.curTex?.bind(),r.drawElements(this.curPrimitive,this.iqueue.length,r.UNSIGNED_SHORT,0),this.curTex?.unbind(),this.curShader.unbind(),this.ctx.popArrayBuffer(),this.ctx.popElementArrayBuffer(),this.vqueue=[],this.iqueue=[],this.numDraws++}free(){let r=this.ctx.gl;r.deleteBuffer(this.glVBuf),r.deleteBuffer(this.glIBuf)}};function _e(r){let e=[],h=n(A=>{e.push(A),r(A)},"push"),u=n(()=>{e.pop(),r(f()??null)},"pop"),f=n(()=>e[e.length-1],"cur");return[h,u,f]}n(_e,"genStack");function Sn(r,e={}){let h=[];function u(K){h.push(K)}n(u,"onDestroy");function f(){h.forEach(K=>K()),r.getExtension("WEBGL_lose_context").loseContext()}n(f,"destroy");let A=null;function P(K){if(Dr(K,A))return;A=K;let Se=K.reduce((we,Ee)=>we+Ee.size,0);K.reduce((we,Ee,ze)=>(r.vertexAttribPointer(ze,Ee.size,r.FLOAT,!1,Se*4,we),r.enableVertexAttribArray(ze),we+Ee.size*4),0)}n(P,"setVertexFormat");let[C,Y]=_e(K=>r.bindTexture(r.TEXTURE_2D,K)),[V,re]=_e(K=>r.bindBuffer(r.ARRAY_BUFFER,K)),[b,j]=_e(K=>r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,K)),[y,W]=_e(K=>r.bindFramebuffer(r.FRAMEBUFFER,K)),[de,te]=_e(K=>r.bindRenderbuffer(r.RENDERBUFFER,K)),[U,fe]=_e(({x:K,y:Se,w:we,h:Ee})=>{r.viewport(K,Se,we,Ee)}),[S,Be]=_e(K=>r.useProgram(K));return U({x:0,y:0,w:r.drawingBufferWidth,h:r.drawingBufferHeight}),{gl:r,opts:e,onDestroy:u,destroy:f,pushTexture2D:C,popTexture2D:Y,pushArrayBuffer:V,popArrayBuffer:re,pushElementArrayBuffer:b,popElementArrayBuffer:j,pushFramebuffer:y,popFramebuffer:W,pushRenderbuffer:de,popRenderbuffer:te,pushViewport:U,popViewport:fe,pushProgram:S,popProgram:Be,setVertexFormat:P}}n(Sn,"initGfx");var Ie=class Rn{static{n(this,"Asset")}loaded=!1;data=null;error=null;onLoadEvents=new ke;onErrorEvents=new ke;onFinishEvents=new ke;constructor(e){e.then(h=>{this.data=h,this.onLoadEvents.trigger(h)}).catch(h=>{if(this.error=h,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(h);else throw h}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let h=new Rn(Promise.resolve(e));return h.data=e,h.loaded=!0,h}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},Rt=class{static{n(this,"AssetBucket")}assets=new Map;lastUID=0;add(r,e){let h=r??this.lastUID+++"",u=new Ie(e);return this.assets.set(h,u),u}addLoaded(r,e){let h=r??this.lastUID+++"",u=Ie.loaded(e);return this.assets.set(h,u),u}get(r){return this.assets.get(r)}progress(){if(this.assets.size===0)return 1;let r=0;return this.assets.forEach(e=>{e.loaded&&r++}),r/this.assets.size}};function Nr(r){return fetch(r).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${r}"`);return e})}n(Nr,"fetchURL");function or(r){return Nr(r).then(e=>e.json())}n(or,"fetchJSON");function Mn(r){return Nr(r).then(e=>e.text())}n(Mn,"fetchText");function Tn(r){return Nr(r).then(e=>e.arrayBuffer())}n(Tn,"fetchArrayBuffer");function ar(r){let e=new Image;return e.crossOrigin="anonymous",e.src=r,new Promise((h,u)=>{e.onload=()=>h(e),e.onerror=()=>u(new Error(`Failed to load image from "${r}"`))})}n(ar,"loadImg");var Sr=2.5949095,Os=1.70158+1,qs=2*Math.PI/3,Hs=2*Math.PI/4.5,Ir={linear:r=>r,easeInSine:r=>1-Math.cos(r*Math.PI/2),easeOutSine:r=>Math.sin(r*Math.PI/2),easeInOutSine:r=>-(Math.cos(Math.PI*r)-1)/2,easeInQuad:r=>r*r,easeOutQuad:r=>1-(1-r)*(1-r),easeInOutQuad:r=>r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2,easeInCubic:r=>r*r*r,easeOutCubic:r=>1-Math.pow(1-r,3),easeInOutCubic:r=>r<.5?4*r*r*r:1-Math.pow(-2*r+2,3)/2,easeInQuart:r=>r*r*r*r,easeOutQuart:r=>1-Math.pow(1-r,4),easeInOutQuart:r=>r<.5?8*r*r*r*r:1-Math.pow(-2*r+2,4)/2,easeInQuint:r=>r*r*r*r*r,easeOutQuint:r=>1-Math.pow(1-r,5),easeInOutQuint:r=>r<.5?16*r*r*r*r*r:1-Math.pow(-2*r+2,5)/2,easeInExpo:r=>r===0?0:Math.pow(2,10*r-10),easeOutExpo:r=>r===1?1:1-Math.pow(2,-10*r),easeInOutExpo:r=>r===0?0:r===1?1:r<.5?Math.pow(2,20*r-10)/2:(2-Math.pow(2,-20*r+10))/2,easeInCirc:r=>1-Math.sqrt(1-Math.pow(r,2)),easeOutCirc:r=>Math.sqrt(1-Math.pow(r-1,2)),easeInOutCirc:r=>r<.5?(1-Math.sqrt(1-Math.pow(2*r,2)))/2:(Math.sqrt(1-Math.pow(-2*r+2,2))+1)/2,easeInBack:r=>Os*r*r*r-1.70158*r*r,easeOutBack:r=>1+Os*Math.pow(r-1,3)+1.70158*Math.pow(r-1,2),easeInOutBack:r=>r<.5?Math.pow(2*r,2)*((Sr+1)*2*r-Sr)/2:(Math.pow(2*r-2,2)*((Sr+1)*(r*2-2)+Sr)+2)/2,easeInElastic:r=>r===0?0:r===1?1:-Math.pow(2,10*r-10)*Math.sin((r*10-10.75)*qs),easeOutElastic:r=>r===0?0:r===1?1:Math.pow(2,-10*r)*Math.sin((r*10-.75)*qs)+1,easeInOutElastic:r=>r===0?0:r===1?1:r<.5?-(Math.pow(2,20*r-10)*Math.sin((20*r-11.125)*Hs))/2:Math.pow(2,-20*r+10)*Math.sin((20*r-11.125)*Hs)/2+1,easeInBounce:r=>1-Ir.easeOutBounce(1-r),easeOutBounce:r=>r<1/2.75?7.5625*r*r:r<2/2.75?7.5625*(r-=1.5/2.75)*r+.75:r<2.5/2.75?7.5625*(r-=2.25/2.75)*r+.9375:7.5625*(r-=2.625/2.75)*r+.984375,easeInOutBounce:r=>r<.5?(1-Ir.easeOutBounce(1-2*r))/2:(1+Ir.easeOutBounce(2*r-1))/2},Rr=Ir,co=class{static{n(this,"TexPacker")}textures=[];canvas;c2d;x=0;y=0;curHeight=0;gfx;constructor(r,e,h){this.gfx=r,this.canvas=document.createElement("canvas"),this.canvas.width=e,this.canvas.height=h,this.textures=[ut.fromImage(r,this.canvas)],this.c2d=this.canvas.getContext("2d")}add(r){if(r.width>this.canvas.width||r.height>this.canvas.height)throw new Error(`Texture size (${r.width} x ${r.height}) exceeds limit (${this.canvas.width} x ${this.canvas.height})`);this.x+r.width>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+r.height>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(ut.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let e=this.textures[this.textures.length-1],h=new E(this.x,this.y);return this.x+=r.width,r.height>this.curHeight&&(this.curHeight=r.height),r instanceof ImageData?this.c2d.putImageData(r,h.x,h.y):this.c2d.drawImage(r,h.x,h.y),e.update(this.canvas),[e,new me(h.x/this.canvas.width,h.y/this.canvas.height,r.width/this.canvas.width,r.height/this.canvas.height)]}free(){for(let r of this.textures)r.free()}},fo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==",po=Wn("SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4Ljc2LjEwMAAAAAAAAAAAAAAA//tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAASAAAeMwAUFBQUFCIiIiIiIjAwMDAwPj4+Pj4+TExMTExZWVlZWVlnZ2dnZ3V1dXV1dYODg4ODkZGRkZGRn5+fn5+frKysrKy6urq6urrIyMjIyNbW1tbW1uTk5OTk8vLy8vLy//////8AAAAATGF2YzU4LjEzAAAAAAAAAAAAAAAAJAQKAAAAAAAAHjOZTf9/AAAAAAAAAAAAAAAAAAAAAP/7kGQAAANUMEoFPeACNQV40KEYABEY41g5vAAA9RjpZxRwAImU+W8eshaFpAQgALAAYALATx/nYDYCMJ0HITQYYA7AH4c7MoGsnCMU5pnW+OQnBcDrQ9Xx7w37/D+PimYavV8elKUpT5fqx5VjV6vZ38eJR48eRKa9KUp7v396UgPHkQwMAAAAAA//8MAOp39CECAAhlIEEIIECBAgTT1oj///tEQYT0wgEIYxgDC09aIiE7u7u7uIiIz+LtoIQGE/+XAGYLjpTAIOGYYy0ZACgDgSNFxC7YYiINocwERjAEDhIy0mRoGwAE7lOTBsGhj1qrXNCU9GrgwSPr80jj0dIpT9DRUNHKJbRxiWSiifVHuD2b0EbjLkOUzSXztP3uE1JpHzV6NPq+f3P5T0/f/lNH7lWTavQ5Xz1yLVe653///qf93B7f/vMdaKJAAJAMAIwIMAHMpzDkoYwD8CR717zVb8/p54P3MikXGCEWhQOEAOAdP6v8b8oNL/EzdnROC8Zo+z+71O8VVAGIKFEglKbidkoLam0mAFiwo0ZoVExf/7kmQLgAQyZFxvPWAENcVKXeK0ABAk2WFMaSNIzBMptBYfArbkZgpWjEQpcmjxQoG2qREWQcvpzuuIm29THt3ElhDNlrXV///XTGbm7Kbx0ymcRX///x7GVvquf5vk/dPs0Wi5Td1vggDxqbNII4bAPTU3Ix5h9FJTe7zv1LHG/uPsPrvth0ejchVzVT3giirs6sQAACgQAAIAdaXbRAYra/2t0//3HwqLKIlBOJhOg4BzAOkt+MOL6H8nlNvKyi3rOnqP//zf6AATwBAKIcHKixxwjl1TjDVIrvTqdmKQOFQBUBDwZ1EhHlDEGEVyGQWBAHrcJgRSXYbkvHK/8/6rbYjs4Qj0C8mRy2hwRv/82opGT55fROgRoBTjanaiQiMRHUu1/P3V9yGFffaVv78U1/6l/kpo0cz73vuSv/9GeaqDVRA5bWdHRKQKIEAAAAoIktKeEmdQFKN5sguv/ZSC0oxCAR7CzcJgEsd8cA0M/x0tzv15E7//5L5KCqoIAAmBFIKM1UxYtMMFjLKESTE8lhaelUyCBYeA2IN4rK1iDt//+5JkEgAkZzlVq29D8DJDWo0YLLARwPFZrL0PyLsUazTAlpI+hKSx01VSOfbjXg0iW9/jVPDleLJ15QQA4Okdc5ByMDFIeuCCE5CvevwBGH8YibiX9FtaIIgUikF42wrZw6ZJ6WlHrA+Ki5++NNMeYH1lEkwwJAIJB4ugVFguXFc20Vd/FLlvq1GSiSwAFABABABA47k6BFeNvxEQZO9v3L1IE4iEVElfrXmEmlyWIyGslFA55gH/sW7////o9AAFIBIIAAIUMzYTTNkgsAmYObfwQyzplrOmYvq0BKCKNN+nUTbvD7cJzvHxrEWG5QqvP8U1vFx6CwE8NoRc2ADBeEb/HoXh60N7ST8nw9QiiGoYvf/r6GtC9+vLwXHjaSkIp3iupC5+Nii81Zhu85pNYbFvrf+UFThDOYYY26off+W6b//73GTiN9xDfl0AAwBAiMBO8qsDBPOZtuT/dTbjVVbY/KSGH6ppHwKv/6X+s8gUCN/lODzv////GQAGAMQAADlXAUCBJiY0wFQZusYQOaQzaTwDBTcx0IvVp8m7uxKp//uSZBMCBHRI1eNPLHAyxNqWGeoYUIEnWYyxD8DUFSn0l6iojcd+oEOkzV6uWqyHNzjqmv+7V5xGUfY9yEmbziTzjRscm9OqFQp1PKFrqu3PX/7YuGtDU6bt0OUTpv38rdc+37dVDQLKUchaJ853E9edNDGqWwsYz1VoiSStEJtZvw6+sNqFWqaIXJjQCGAAGWAYVwmag/x3BRJw1wYF7IzVqDcNzn85d//FzK7IgwbQwccLoB4AsF8Nj/1ESRUAAVJwAFh0YOFEhmSJEHKQRDyhszgLUpHIgFrb5cySFg5jv10ImlYuvaaGBItfXqnNPmic+XNkmb5fW49vdhq97nQMQyGIlM2v8oQSrxKSxE4F1WqrduqvuJCRof1R7Gsre9KszUVF1/t3PzH2tnp+iSUG3rDwGNcDzxCGA8atuQF0paZAAkAhAQAEAC240yJV+nJgUrqq8axAYtVpYjZyFGb13/17jwiClQDaCdytZpyHHf1R/EG/+lUAgAAAChhmJvioVGGBCFgqdpsGAkUUrbTstwTCJgLQpFIsELW7t/68Iv/7kmQUgAQ9NFO9aeAAPAU6RKwUABClY2e5hoARGpDvPydCAsY8WO10fSvUOnfT98+n/l/6/+hxslhQ1DEOaevNKGocvIYba8WJpaP/15pX0NQ1DUNn/////k6lPp/N61rBi8RJFfERV3IgrqDsJA64sjCoKxDDQ9xEcWDpMBDwVFDIAEIAAzryxsjGi4q/oWpixKjhklAF4pUrDPjFhFVupDFZ/t/t0YPAygUBhADPR/KLCKJ8h2Oxhpxz/zNRAAFl0MAZLAYEAiVbEiz36LSgZ5QoQVat69KNy8FyM5Z80ACHAzgnISEkxUSJIDyBSwi5KF4mjBl4xJdbrG9ComLrL8YATiodhQKCkj6ROdyg1y5XmZlvMVmpJzYppJDwLi/Lp9vT3TfmimOGpuezi2U/9FNav0zX9Oja2r//8+hvuihuQAAMAVmqFgAgCcuboAEAAAUcqy8ca0BHBmwbFkED0CNA1YYDPkhcQrRJxcY3BzfxxltAz9vX62Xl3plAzWmRO+FkZyH///1qAAEjQBAACUpgU5o2AIBmFBGMamrGg0b/+5JkC4ADxyLWb2ngAEEkGofsoACP7U1JLaxTkOqFaKhspGgnW3SGC56ZgUJGCRnLOmIJAkuNBgvwU4Ocf8CJK9UsafH9/Frj///365XSoME+DZMw5UNjrMbVoeIj9EL91IuQ5KHyl5V2LCpdIdESgafOHxVGkAlkHuakmix/gN8+BP/sKguLAAoAtUjtvaoeEADwr3OK11E4KBlojgeQNQBJ4MvCAd/4t/xMMzeLhQGQ1//6tQu5BaBOGCT6U4aafvXZ//4iAPAAAAbLkgIlQmMSLA2H1CVNAlWwyVvKIQIxOSK1NWxs4MBUATlKrAkIMPAjCAdS6MVFzuURWa/+/qQWEGsA6EEpiBEJb9Q21lAHoBoD0B6aAPhyt+bG3muoXIN3RLadXxUfr/ohjGFF/p97eqNI5noKAqYLNPpUTDSI9/TmA6B+YAAADgA0Y4lxTW1SQfOQuDDDI0KTTuIrF5qoJrUFhUFAsg+AT2hbkaRZYGIjBKVDIa5VgNN/9P/rCDsBJbYJRKpCA1ArAkigIeYY61AjE+jubyiZFZ3+L789//uSZBCABHVj2entNmw1JXokLycYEFTFVa0wz4DYjKs08J2Q+r4n3lgbWaaMwMLEjFW88F39brqPF83cv1mCSJeY3Q2uiQxhBJxCBeR1D2LQRsYQcZUTzdNll8+OwZBsIwSgl45ymaHX603Mz7JmZuvt71GDTN66zev/+cLn/b5imV8pAHkg61FIJchBSG+zycgAZgADD6F1iQQRXRWmWS6bDIIgyBCZEcdl/KgXGmVKFv/vl8ry/5bLypf//U5jhYDhL9X/pAA0AKBIAAKgGtGXGGWJgEoF2JNsHlKfSKLRhGBAgIuWZKIJCFpF1VBhkB+EfzEyMUJdWuMrEZoPZ5BfF3/Nu62riIdjoO4AAKD2sTrDmpZZaYysf/810TitAVvn9xtFucieiaEy54YqiIO6RqkGAm5wVO0bFB0sDTdNxYGekKktR4KAAfAwUIgI8Ci6aXgtwbhPWAC+CKExAFydNtYGXNZoQjUsXv/9vKjgmdwieb+h7kHvPoc//0FaCACAATKFC4Y9ammklidbaiJNPBhGWTNhFSgdtalK12lpl//7kmQRAFN2NFI7TBvwNKNaTRsFGBWdfV2tPNcYvBHpgPKJsc8IUcTCxY3HSvUVNTWe/Z3YWlrJ0yrNRUiT19aprA7E+mPP+ZmC3/CsheOJXhc/9VJb3UZnphUBcqZUZQth1i3XqtPYu2Sy1s8DV9ZYACAAASAAHgFkQcOqgB5utFHFh3kSi4USs0yk4iOClREmjvdG+upaiLcRA6/9QGbOfxF/8sEAQAVG0G07YFMihKR4EXJCkRdX9isueLqUMRAQdhDZmv3KeR0nPqRVrZmSIXDt+BBSR7qqbKQcB98W9qiMb55preHIStxFWPE4lAyI+BKz2iSxonpvMR5DgKxTH6vGGXAbYCaAnJUW4W07EesQqbfqdbo4qNnPxSpn1H8eahszc/y9//dn1V7D/OYpn1szQKAPXTMlO/rO//u7JriJXbld7aP33v6RXYg/COIDzTWkTspg6Ay1YaDSwKxrP/LfIikHjmO871POf/kEAseAgoPEi9/0ZziNwfxVKy9qAEGEEAAq1EcOamDEGHAA0iao8k31rz2MiLNEik6VQ37/+5JkEAgEYU5WU0M3MDjDe0o9IjiOzSVM7aCzEM2GqXD8pFB0zxMcHCQNHtZD+R+pMWZxOJ/otEZTvVN/MeU12xTVcL+f2YaiNJTVoPd6SvzEnKel5GXOzEaazgdChnP2jOAwpfyRpVlQwoJBwpN1L1DL////6TVWcoepf7CVWrpEWiym5lR5U0BSMlxQC4qByOyQIAEuJfIriWixDqRgMfVZWuvRowjR9BzP5lZlT/+YG50CsSBG////////liXDQVMxEaBkbzKAAACnDIAstY7iK7gGSF7SIDexaTtPOHABk9YcmJEACmo50pgWal22etroBpYoVqtU6OPqvlf0c4QCAfLk9P/FJs4KCQMf6ECZyA6BwqqyJ0rMYj56k1/UlTIx1V3Rt5NF71D4qlptDC8VMgQVHFDlQnDFi06qQgKQAAIK4TxxJGFGYJuZNGXRdpq7IW/DYpPIQRFJLAc+qn1E0XYdOkQVJT+z8Lvff//8vbKAWTIBBUUdM6cOhlDry7x4dAkJXIBhbO3HSMMMGBQ9K9/JNfu09PjTO64wYEcR//uSZBeABP5g11NPRVwzQ4r8PMJVj7j9UU2wUwDPjeq0Z5w675D9+uDdL2QsuIry2lZtwn/pJYyRRjANEOQxNWw8mU7Tq+vueV7JrX/Pg7VIkEuZT5dwd85MVoq5lpStNICkBAcFR88//58KO8Zjt2PIGxWl1cVfXeNGH18SReNT//hYliWtQuNluxyxONbm4U+lpkAgpyE7yAIYUjIaqHmARJ0GQTtmH60xdwFp/u253XBCxD0f/lBcguCALn//Y5nqEv//1h4BAAwgAA5gcHmpIplgeW9fAOM6RFZUywrsGAiRmKkanQnCFBjYoPDS7bjwtPTkVI8D/P8VVLcTUz65n7PW2s3tNYHgEul4tBaIz0A9RgJAyAMI4/i0fpQKjhX9S+qIa0vmc4CZit/0/3UTDGeKNpkk0nu2rUE2ag8WErhE/kgAiQCJKQEYBA5Wn6CxHoIUh6dQ46nLIuwFk4S/LaDQxXu7Yf/pf//lwJB0S/Ff/4C///EiBEiAAAIAMnpngiIABAdMpKigkXaUwhLEGvpiofmXW57h2XAZO3CMRv/7kmQUAEOHQlHraRTQMkQp6GWFZBTVU1lNPTPYyIyocYeUoNgLBWAs1jPkTv/tXBaeZ/tbD/nAGP8/xT0SNEi5zof0KIVEzVe9r5lZOol7kyaXMYS4J/ZS3djp//UaeVyR0mUMlTgfz8XqMzIEgAQQ6UNQ1DSE0/C16OvyaocF4ijAGFci0FSYqCUSaWs6t9F6/699DKvMgMoK1//kSbvxtyBN27I7mdXgNMAW75sRU1UwUHYG5axI2tFIFpkgx7nnK+1JmRKjqeAd5Ph0QAL4QAnirmiPlg0yBDlrb/d3ngtA65rb999+8vdDCfnJuJAYIl285zklpVbrKpk1PEzrOY9NZUgyz6OiOsKt5qG/g2ibxSZ+/eTI/NB8n4ev//n2nIw85GAdwuJL7kYnnAbpcf1RBKH6b2U4RWP8dmWH5snsAFYwADBgAopKdzFJq4Jlmotloh/m4QpTSvJRE3nYZHephoqBhVf+P7vQ9BPlwZCP+3//+hdy5uUwS3LDEgQx4cdIgvDEBR1YqymCsSbKzRy2aQmSv+AAcAgAkvzPfuX/+5JkFQAj6VFX00Zr5DllOhhgpn4MmSs+zSRRiO8U5tWklYgSLKfs+Xheb/+6WaAQCKTztNeJ382MUltZNnjSJoFrCqB6C4mFcwJpJD4Oc8dLDXMTh9k1/rmTopfzqv9AvHWfOuZJlEvHSVMjyjpkVucKSzxJVQBgAAIo8DGqRdYCXPckFYg+dH9A/qUyljrtpxH9RJX/Z3Vv6uFkPg4M2jf3CL09QrwOrMt69n//8UFEAAMHWdhg1CcjyVBwiArOYlDL5NPY6x8ZLFBCGi6SVTKX5nqdSEFjebnv2zHdt0dj6xvORsSFzwqRNTJSZIrrlpXcURNL9WW7krBgr5jPMaGcvJ5v0N1s19CV7+7fvQfjySX2QECWUgKgeJCIif4WRBZ/6archpDkzE7oWctK3zEHP9Smeai8oeHkM6AK7pGjtOgeFv40ugqNd+Iv///uAZAMgAAAUeSWhLPpdwk3iXpBw43hOVIp1gliUOSaeZcZeZhLAH9TtD56wUpBduzLF5v5qViTH6o+I0+8Z1asaLgKVAohlpB72DgAQBQxEd3g//uSZCiAA6k0UdMPQfA+xcnBYON8E3WDVU0w1ZjPDSmo8IniHAFDNnkXF3B94gicH5d8MFw+IHZwufxOf/8gsHw+XrD4Jn8T4RAyQiABNBQg/3giEWuZ42mVFB3kkXNjhqBg1CghEUbN3/7/KBhyqNueef/MIDBClP3YRnKLiIlEFzf//0g+4zKpRIKTpqQgUtnHGFw6RSLN421iGcYapqFxny/capK9r9v+2BSy/RU1yZxa2eGaWK07ijfcxeiO3iuHJvjbXzts+Ny+XyFnsne1h0qG4mAaN6xRGaLVxKPlrri0Bg9oXGyxcw8JRBPkUzC8v451vVd9liSX85JMrmkVNwxOCwUg298////7ks//L409/hwMRIozKiIckXtjzDaAMTBcAACAwLGargPSEgEJZN/EFjfF/VKgaMYKMbwtf/T0UCGGfjfOAZ2frCigYdwh/+sGlQBxhCAAAUHkDPqOdmmUdAVYl3IhrEfR8qZFjLYEPOyzVGvm6lNUJCk2PNazwFxaijk+ZEaiTehoJGuDh6zN/EVP8BCLD/88BoY7Xv/7kmQlgBNmMtNTL0FwOGZJ/WHiKAyhJU+soE3A3JnmAa2oaCIru/+RrEHMTphxQ0X/LzoVy4gKhYl6ZUlklW7CLRVoYmgABwCRMAAMA/poCiEEYLsBVodWcVZ18+CcAfH165U4Xgh7/X1/BAQF6GN/BwQ/+D9S9P6wII//CoANYFYCBAKlGQDKhVjjylKARw2mPAtp8JjcQHggQswVsOEKsF6AIBWvmpIFdSZvRVv/LHWEy0+txMxu+VK9gEqG5pWf6GNGU4UBVkfd+bsj/6lZE0fkOpAqAOvyUO9oo+IiEtcLKOGzhhSGa4MYINHWoQsFr8zzmow0tRILkqz5/+vFxl/oZX/+qGW//xiLjR3xcGn//0QLkTQJh1UA8MAQAEXC/YxODKTDUEhrASs1512GRp+dRFFdTWIRaOXrve1eNjTNpreqQYrC9NBlQc1f8YO2po8bnH6qffuRvU7taiNF3baokE0YpmjRCHRclWBb9NCHKHpERwHRG3pqgXklq4sBpLjGvmekg8Y7SjM1FZopIM8IhB6dtMr8aKsdovh4FW//+5JkQ4CjTDdSU0gtIDiE+YBrKgwNbSVJTCBPwN8N5ZW8NKDnhRB8AXCm//KAsBUCwKU//oJQnET+UP3/zpYRocAAABJkVzzIuoLGEaDoxfsNva12EUdxhJMGFQioSg8GxKsLm8kWEmExJuNidarkk+OTXc0i2OZEq2v+tZr/MDZRS0I7LfRpHdlsiF6m/mEjk+XlK10UqtKYUwNgMx24hUtCJLfpM3ExUeKDYjClgZAzAjQ0qlNQBTsGpk9zSRkCiKkRGp572VXsPYChGvxhAuYkDYZK//jSRgto2mTf6+PJqgAAgIAAAACYZE6aZOHhYkYlcbpeYQq1RgLO4U8TIlL1sGw+iKZi5Kzc/bKT0yXrIUMES89RCWy8oWlxqIQlKANLFpT/KjUrK+UCYbZqGnjVj29aO5dzofWAskRX5eJWPi4kf/aRVjy3Wlyg2AnMYIDSTLwZUTASIzflPWUwwlUnIFMnGiyABeaXJcN91PmQJCLzmvUJkFOHCrX/+6O///IHnT4tT9YYBoNMQ09GfKIErwdwChNz1Qy5+5S/wWeY//uSZF+C03UyT2tMO0A3RRkhY20KzQjDMszhA8DjlGOBp5y4ZCS3ica52GIGiryv7FAaSDVZSXKFTiir+GvGiuK4rjgwPVTddso+W/42a4ueJJHDYtfj6YoKknnjzRgKA0fBIRZOSsprJqnoNN73ps/Z9DVgbKNbMGmRzrYBMAZCPUANkAZQ0syAC2ubK1NF90+WoesBpnhY8qwVDkNb/5Uof6//418TgElCSgAIgyAAQBHEmiaQFPIRmfAMELffpo0IflyEuAAQnSnKvwTlVlnIgOAAGS3P3IydjXPSh/CaVRqpSNCjQqDvPM+fLcuN+WgqNix6CoHomUWTT86JjziRSZ3yjnq+dIldKPU11KUuf6wAASMAAJxE+MlyktgE9UGSxjEx6RR0v1s9bWZ+EJSrGtjqUIhklG3J8eLRn/2U/nv7f///+7/6gBQgEAMUijVMwweWWMyYM/PLXuc7DptIQmBARMRCxXjEIcTNDQgSSeHpUNXO7dRSOllJPvnY7yzaO1hmUjsKvHe99fOxrabMX7mGTi5tsNkZVZLndzxse//7kmR7ABM2O0pbKTvQN4NI+WGFPA2ZESs1pYAAvA0jVrJwAHfbr/c6//vW790dzX36QNBRlDv/6QQAU3V64yUgBEAYc/lI8e5bm+Z9+j+4aaj4tFrb//iker/4a12b/V//q//9v+7vAEAAAAMqZTGd5gL4f54o6ZebKNrR/zWVYUEVYVVv8BuAV2OUT+DUQgkJ8J1Ey4ZbFCiAwgwzMSdHV4jQR+OoPWEASaPkyYq+PsQFFJCsEEJtOiUjI/+GRhtC2DnizTMXATJig9Ey/kAJMrkHGYJ8gpLjmJOYoskpav+ShRJInyGGZVJMihDi6pIxRZJJel/8iZPkYiREnyKE0akTL5QNSqT5iiySS9Ja2SV//5ME0ak//+4KgAAABgQBAADAMDgYCAEgCteQ0fZH6+ICXA357+MPfhR/+ywRf/U///LVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JknQAFoWhGLm5gBClBmT3GiAAAAAGkHAAAIAAANIOAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"),go="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOcAAACDCAYAAAB2kQxsAAAAAXNSR0IArs4c6QAABdRJREFUeJzt3d3N3TYMgGG16ADdoAhyl7UyV9bqXRB0g2zQXgRGDcOWSIoUaX3vAwQBknMk/4gWLcnHrQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDEb9kb8FH99eeXf6Wf/efn35ynDyj1pEsb6G6NUxOYZ7sdB/QtPdnWRnn29gbKMYDUspPs0SgPb22cHANo/JG9AZF6wWBp3JLgeir36bvff3x9LOvzp2/dbSFA97bk5I4a9VMD7TXOUcP0uJ+d6emu5d6V1QvMs5nj8FZPx37X/b2TFpzShtnafeP0DipJMFnLnN3/w1OQ7tZgP+pA4VVKcHo0TG36KNULKGt5XsHZmi1APS5WM2Vqg0i7vbsG6YcIznN9vRTxXHavgdxtv6Tc3vc1pAHqdaG6ipwKYprpf1sFp6aH0gRTrxxLubPB2avHu+c/l3mICvqnsr//+Cq+qGrK1Xw/wzbBaRkNvSv3yew9cq+cu89L6nu6F/cMzCgzF1ftANlbe+Otp1IkDVxyVfbo6Z481f3507dhvXfbrk3HpdtjKTNqKuio8678c7mzF6ns6arfMyrVNoA75wMfNU2hKSeCx3Fq7dc+SPfDc39H9Vqn2CT//4bsYeT1PecOJyGSJdh6PZOlbElPZz2PHtlD1cUeS4LT4z5IOihwfNaD5ERm9qxH/dZ7Vmt9M999CtCZbdLUP/p3r2zFQ0paG8lr4Eb6+ZWBcSeq/qhyK6bXUfXOSgtO7/tOb9eT1NveqKttpYbiyXu/euV51JV16/T6e86zyF5TUp731V5Sp+Z7M71h9QvFNWWuvr0Sy4LzLfNvrel6zRX1e+hN2VzrnNlfaYD0xhCs++851lDh3vNV95xe6YvHgb8bwbNcuc+f09wbaUj2dzYgjz93//5kh94t0quCM8OKK6glKKuM0EYHfhUZWd8WwenZa0rLsp6s2YY66o0k9WUvS4NManBaGuo1eDIHgUZ1ePdkntsfFaCz5VZJdStsxyt7ziMNXHEAK5yk1mqmhrMPf1fcp57Vqe3SqZTMEduZhqAZyaywFne0DVHngHTZ11bznE88l/1lBZ9meP8851plWkBCO7drmQvWnL/sY/fKtFaqN3iy6iofsQxNktJnTMgfPXJUz3w3VaP5vOQ7Iyszvy2DczSi+aYFET2jINUEqFcAS4+rV480WlwRWXe07dLa0YGvfl9kmbTvPZJ1TXGvn4t4yuRp+2aMgk27wkm63DIztU3vOVfueC8wK4zKWtK0M+nvJXmOdlt65MgFFCva06qsKz044SvjIiN5TjLaaHxhtNyyouXBGZ1WSn66Ivt+M7pRZAWoZsDq+t2emeM1am/WtHxFG9runrO1/n1CxLK7CilxJM/H4bwuTJJBvWtgvm0gcNu01uvpd8la1soLE7xkpYDea4Ot6W3GOSzRc3o/qHw2M9qmXWA+uw+jbd0hyO9Yz0+vJ9QGcO/8ZV2YUqYVPN8dImXp3aJ/w1XTGGYfKZN+P7IXiXqO1uINLzFOm/Pz+BV4C03PNEqpZl//ELXP1ro8nhLyKLPHMyAiXyvh4cMFZ2uyAJXc62gzgJl1nhrSLMEzcLx+5qQnIhgqv6qhTHC2Zmus1tUuowCVDkRU6j0jgiJqhLPSSq2q7wMtMSBkdbcQWjNCq2nMlRrTnajAPP/t+c5Sj3K8VNueQ+pGzaa2MyOb2sZseW2dpL6ZnjMzfeQFt/Fe3XP2WIfGvRY6a569jCJ9TaIlcCS9KQE5p1TP2VrMbwLNDlZEvpE5AkGxh9f2nLO/QOetytIwAnMf6SfS2ns+jaZ6B4i2sWvSvF0HWOAj/aRGNFAaPXbw2rS2Rzr0T/ChshKNM3qd4135BCaqK9VAKy+lAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4DBC0k0jFtF9wAAAAASUVORK5CYII=",mo="data:image/png;base64,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",wo="3000.1.17",Ks=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",Mr="topleft",Ys=64,Ao="monospace",Tr="monospace",Vo=36,Pr=64,Br=256,js=2048,Qs=2048,zs=2048,Js=2048,Xs=.1,vo=64,si="linear",yo=8,xo=4,mi=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],Eo=mi.reduce((r,e)=>r+e.size,0),Pn=2048,bo=Pn*4*Eo,So=Pn*6,Ro=` +attribute vec2 a_pos; +attribute vec2 a_uv; +attribute vec4 a_color; + +varying vec2 v_pos; +varying vec2 v_uv; +varying vec4 v_color; + +vec4 def_vert() { + return vec4(a_pos, 0.0, 1.0); +} + +{{user}} + +void main() { + vec4 pos = vert(a_pos, a_uv, a_color); + v_pos = a_pos; + v_uv = a_uv; + v_color = a_color; + gl_Position = pos; +} +`,Mo=` +precision mediump float; + +varying vec2 v_pos; +varying vec2 v_uv; +varying vec4 v_color; + +uniform sampler2D u_tex; + +vec4 def_frag() { + return v_color * texture2D(u_tex, v_uv); +} + +{{user}} + +void main() { + gl_FragColor = frag(v_pos, v_uv, v_color, u_tex); + if (gl_FragColor.a == 0.0) { + discard; + } +} +`,ni=` +vec4 vert(vec2 pos, vec2 uv, vec4 color) { + return def_vert(); +} +`,oi=` +vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { + return def_frag(); +} +`,To=new Set(["id","require"]),Po=new Set(["add","update","draw","destroy","inspect","drawInspect"]);function lt(r){switch(r){case"topleft":return new E(-1,-1);case"top":return new E(0,-1);case"topright":return new E(1,-1);case"left":return new E(-1,0);case"center":return new E(0,0);case"right":return new E(1,0);case"botleft":return new E(-1,1);case"bot":return new E(0,1);case"botright":return new E(1,1);default:return r}}n(lt,"anchorPt");function Bn(r){switch(r){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}n(Bn,"alignPt");function Fn(r){return r.createBuffer(1,1,44100)}n(Fn,"createEmptyAudioBuffer");var In=n((r={})=>{let e=r.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let h=r.canvas??(()=>{let t=document.createElement("canvas");return e.appendChild(t),t})(),u=r.scale??1,f=r.width&&r.height&&!r.stretch&&!r.letterbox;f?(h.width=r.width*u,h.height=r.height*u):(h.width=h.parentElement.offsetWidth,h.height=h.parentElement.offsetHeight);let A=["outline: none","cursor: default"];if(f){let t=h.width,i=h.height;A.push(`width: ${t}px`),A.push(`height: ${i}px`)}else A.push("width: 100%"),A.push("height: 100%");r.crisp&&(A.push("image-rendering: pixelated"),A.push("image-rendering: crisp-edges")),h.style.cssText=A.join(";");let P=r.pixelDensity||window.devicePixelRatio;h.width*=P,h.height*=P,h.tabIndex=0;let C=document.createElement("canvas");C.width=Br,C.height=Br;let Y=C.getContext("2d",{willReadFrequently:!0}),V=ho({canvas:h,touchToMouse:r.touchToMouse,gamepads:r.gamepads,pixelDensity:r.pixelDensity,maxFPS:r.maxFPS}),re=[],b=V.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0}),j=Sn(b,{texFilter:r.texFilter}),y=(()=>{let t=it(ni,oi),i=ut.fromImage(j,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),s=r.width&&r.height?new br(j,r.width*P*u,r.height*P*u):new br(j,b.drawingBufferWidth,b.drawingBufferHeight),a=null,o=1;r.background&&(a=Z(r.background),o=Array.isArray(r.background)?r.background[3]:1,b.clearColor(a.r/255,a.g/255,a.b/255,o??1)),b.enable(b.BLEND),b.blendFuncSeparate(b.SRC_ALPHA,b.ONE_MINUS_SRC_ALPHA,b.ONE,b.ONE_MINUS_SRC_ALPHA);let l=new uo(j,mi,bo,So),p=ut.fromImage(j,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"});return{lastDrawCalls:0,defShader:t,defTex:i,frameBuffer:s,postShader:null,postShaderUniform:null,renderer:l,transform:new Le,transformStack:[],bgTex:p,bgColor:a,bgAlpha:o,width:r.width??b.drawingBufferWidth/P/u,height:r.height??b.drawingBufferHeight/P/u,viewport:{x:0,y:0,width:b.drawingBufferWidth,height:b.drawingBufferHeight},fixed:!1}})();class W{static{n(this,"SpriteData")}tex;frames=[new me(0,0,1,1)];anims={};slice9=null;constructor(i,s,a={},o=null){this.tex=i,s&&(this.frames=s),this.anims=a,this.slice9=o}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(i,s={}){return typeof i=="string"?W.fromURL(i,s):Promise.resolve(W.fromImage(i,s))}static fromImage(i,s={}){let[a,o]=U.packer.add(i),l=s.frames?s.frames.map(p=>new me(o.x+p.x*o.w,o.y+p.y*o.h,p.w*o.w,p.h*o.h)):pt(s.sliceX||1,s.sliceY||1,o.x,o.y,o.w,o.h);return new W(a,l,s.anims,s.slice9)}static fromURL(i,s={}){return ar(i).then(a=>W.fromImage(a,s))}}class de{static{n(this,"SoundData")}buf;constructor(i){this.buf=i}static fromArrayBuffer(i){return new Promise((s,a)=>te.ctx.decodeAudioData(i,s,a)).then(s=>new de(s))}static fromURL(i){return Ls(i)?de.fromArrayBuffer(cn(i)):Tn(i).then(s=>de.fromArrayBuffer(s))}}let te=(()=>{let t=new(window.AudioContext||window.webkitAudioContext),i=t.createGain();i.connect(t.destination);let s=new de(Fn(t));return t.decodeAudioData(po.buffer.slice(0)).then(a=>{s.buf=a}).catch(a=>{console.error("Failed to load burp: ",a)}),{ctx:t,masterNode:i,burpSnd:s}})(),U={urlPrefix:"",sprites:new Rt,fonts:new Rt,bitmapFonts:new Rt,sounds:new Rt,shaders:new Rt,custom:new Rt,packer:new co(j,zs,Js),loaded:!1};function fe(t){return typeof t!="string"||Ls(t)?t:U.urlPrefix+t}n(fe,"fixURL");let S={events:new nr,objEvents:new nr,root:Ar([]),gravity:0,scenes:{},logs:[],cam:{pos:null,scale:new E(1),angle:0,shake:0,transform:new Le}};S.root.use(yr());function Be(t){return U.custom.add(null,t)}n(Be,"load");function K(){let t=[U.sprites,U.sounds,U.shaders,U.fonts,U.bitmapFonts,U.custom];return t.reduce((i,s)=>i+s.progress(),0)/t.length}n(K,"loadProgress");function Se(t){return t!==void 0&&(U.urlPrefix=t),U.urlPrefix}n(Se,"loadRoot");function we(t,i){return U.custom.add(t,or(i))}n(we,"loadJSON");class Ee{static{n(this,"FontData")}fontface;filter=si;outline=null;size=Pr;constructor(i,s={}){if(this.fontface=i,this.filter=s.filter??si,this.size=s.size??Pr,this.size>Br)throw new Error(`Max font size: ${Br}`);s.outline&&(this.outline={width:1,color:Z(0,0,0)},typeof s.outline=="number"?this.outline.width=s.outline:typeof s.outline=="object"&&(s.outline.width&&(this.outline.width=s.outline.width),s.outline.color&&(this.outline.color=s.outline.color)))}}function ze(t,i,s={}){let a=new FontFace(t,typeof i=="string"?`url(${i})`:i);return document.fonts.add(a),U.fonts.add(t,a.load().catch(o=>{throw new Error(`Failed to load font from "${i}": ${o}`)}).then(o=>new Ee(o,s)))}n(ze,"loadFont");function kt(t,i,s,a,o={}){return U.bitmapFonts.add(t,ar(i).then(l=>Qt(ut.fromImage(j,l,o),s,a,o.chars??Ks)))}n(kt,"loadBitmapFont");function pt(t=1,i=1,s=0,a=0,o=1,l=1){let p=[],w=o/t,g=l/i;for(let d=0;d{or(i).then(o=>{gt(t,o).then(s).catch(a)})}):W.from(t).then(s=>{let a={};for(let o in i){let l=i[o],p=s.frames[0],w=zs*p.w,g=Js*p.h,d=l.frames?l.frames.map(T=>new me(p.x+(l.x+T.x)/w*p.w,p.y+(l.y+T.y)/g*p.h,T.w/w*p.w,T.h/g*p.h)):pt(l.sliceX||1,l.sliceY||1,p.x+l.x/w*p.w,p.y+l.y/g*p.h,l.width/w*p.w,l.height/g*p.h),m=new W(s.tex,d,l.anims);U.sprites.addLoaded(o,m),a[o]=m}return a}))}n(gt,"loadSpriteAtlas");function mt(t,i={}){let s=document.createElement("canvas"),a=t[0].width,o=t[0].height;s.width=a*t.length,s.height=o;let l=s.getContext("2d");t.forEach((w,g)=>{w instanceof ImageData?l.putImageData(w,g*a,0):l.drawImage(w,g*a,0)});let p=l.getImageData(0,0,t.length*a,o);return W.fromImage(p,{...i,sliceX:t.length,sliceY:1})}n(mt,"createSpriteSheet");function Oe(t,i,s={sliceX:1,sliceY:1,anims:{}}){return i=fe(i),Array.isArray(i)?i.some(a=>typeof a=="string")?U.sprites.add(t,Promise.all(i.map(a=>typeof a=="string"?ar(a):Promise.resolve(a))).then(a=>mt(a,s))):U.sprites.addLoaded(t,mt(i,s)):typeof i=="string"?U.sprites.add(t,W.from(i,s)):U.sprites.addLoaded(t,W.fromImage(i,s))}n(Oe,"loadSprite");function Nt(t,i){return i=fe(i),U.sprites.add(t,new Promise(async s=>{let a=typeof i=="string"?await or(i):i,o=await Promise.all(a.frames.map(ar)),l=document.createElement("canvas");l.width=a.width,l.height=a.height*a.frames.length;let p=l.getContext("2d");o.forEach((g,d)=>{p.drawImage(g,0,d*a.height)});let w=await Oe(null,l,{sliceY:a.frames.length,anims:a.anims});s(w)}))}n(Nt,"loadPedit");function Ut(t,i,s){i=fe(i),s=fe(s),typeof i=="string"&&!s&&(s=to(i)+".json");let a=typeof s=="string"?or(s):Promise.resolve(s);return U.sprites.add(t,a.then(o=>{let l=o.meta.size,p=o.frames.map(g=>new me(g.frame.x/l.w,g.frame.y/l.h,g.frame.w/l.w,g.frame.h/l.h)),w={};for(let g of o.meta.frameTags)g.from===g.to?w[g.name]=g.from:w[g.name]={from:g.from,to:g.to,speed:10,loop:!0,pingpong:g.direction==="pingpong"};return W.from(i,{frames:p,anims:w})}))}n(Ut,"loadAseprite");function fr(t,i,s){return U.shaders.addLoaded(t,it(i,s))}n(fr,"loadShader");function pr(t,i,s){i=fe(i),s=fe(s);let a=n(l=>l?Mn(l):Promise.resolve(null),"resolveUrl"),o=Promise.all([a(i),a(s)]).then(([l,p])=>it(l,p));return U.shaders.add(t,o)}n(pr,"loadShaderURL");function gr(t,i){return i=fe(i),U.sounds.add(t,typeof i=="string"?de.fromURL(i):de.fromArrayBuffer(i))}n(gr,"loadSound");function mr(t="bean"){return Oe(t,fo)}n(mr,"loadBean");function Lt(t){return U.sprites.get(t)}n(Lt,"getSprite");function Gt(t){return U.sounds.get(t)}n(Gt,"getSound");function Ot(t){return U.fonts.get(t)}n(Ot,"getFont");function wt(t){return U.bitmapFonts.get(t)}n(wt,"getBitmapFont");function At(t){return U.shaders.get(t)}n(At,"getShader");function qt(t){return U.custom.get(t)}n(qt,"getAsset");function rt(t){if(typeof t=="string"){let i=Lt(t);if(i)return i;if(K()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof W)return Ie.loaded(t);if(t instanceof Ie)return t;throw new Error(`Invalid sprite: ${t}`)}}n(rt,"resolveSprite");function Ht(t){if(typeof t=="string"){let i=Gt(t);if(i)return i;if(K()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof de)return Ie.loaded(t);if(t instanceof Ie)return t;throw new Error(`Invalid sound: ${t}`)}}n(Ht,"resolveSound");function Kt(t){if(!t)return y.defShader;if(typeof t=="string"){let i=At(t);if(i)return i.data??i;if(K()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof Ie)return t.data?t.data:t;return t}n(Kt,"resolveShader");function Vt(t){if(!t)return Vt(r.font??Ao);if(typeof t=="string"){let i=wt(t),s=Ot(t);if(i)return i.data??i;if(s)return s.data??s;if(document.fonts.check(`${Pr}px ${t}`))return t;if(K()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof Ie)return t.data?t.data:t;return t}n(Vt,"resolveFont");function Yt(t){return t!==void 0&&(te.masterNode.gain.value=t),te.masterNode.gain.value}n(Yt,"volume");function vt(t,i={}){let s=te.ctx,a=i.paused??!1,o=s.createBufferSource(),l=new ke,p=s.createGain(),w=i.seek??0,g=0,d=0,m=!1;o.loop=!!i.loop,o.detune.value=i.detune??0,o.playbackRate.value=i.speed??1,o.connect(p),o.onended=()=>{L()>=o.buffer?.duration&&l.trigger()},p.connect(te.masterNode),p.gain.value=i.volume??1;let T=n(D=>{o.buffer=D.buf,a||(g=s.currentTime,o.start(0,w),m=!0)},"start"),B=Ht(t);B instanceof Ie&&B.onLoad(T);let L=n(()=>{if(!o.buffer)return 0;let D=a?d-g:s.currentTime-g,N=o.buffer.duration;return o.loop?D%N:Math.min(D,N)},"getTime"),G=n(D=>{let N=s.createBufferSource();return N.buffer=D.buffer,N.loop=D.loop,N.playbackRate.value=D.playbackRate.value,N.detune.value=D.detune.value,N.onended=D.onended,N.connect(p),N},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(D){if(a!==D)if(a=D,D)m&&(o.stop(),m=!1),d=s.currentTime;else{o=G(o);let N=d-g;o.start(0,N),m=!0,g=s.currentTime-N,d=0}},get paused(){return a},play(D=0){this.seek(D),this.paused=!1},seek(D){o.buffer?.duration&&(D>o.buffer.duration||(a?(o=G(o),g=d-D):(o.stop(),o=G(o),g=s.currentTime-D,o.start(0,D),m=!0,d=0)))},set speed(D){o.playbackRate.value=D},get speed(){return o.playbackRate.value},set detune(D){o.detune.value=D},get detune(){return o.detune.value},set volume(D){p.gain.value=Math.max(D,0)},get volume(){return p.gain.value},set loop(D){o.loop=D},get loop(){return o.loop},duration(){return o.buffer?.duration??0},time(){return L()%this.duration()},onEnd(D){return l.add(D)},then(D){return this.onEnd(D)}}}n(vt,"play");function yt(t){return vt(te.burpSnd,t)}n(yt,"burp");function jt(t,i){return new br(j,t,i)}n(jt,"makeCanvas");function it(t=ni,i=oi){let s=Ro.replace("{{user}}",t??ni),a=Mo.replace("{{user}}",i??oi);try{return new lo(j,s,a,mi.map(o=>o.name))}catch(o){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,p=io(o).match(l),w=Number(p.groups.line)-14,g=p.groups.msg.trim(),d=p.groups.type.toLowerCase();throw new Error(`${d} shader line ${w}: ${g}`)}}n(it,"makeShader");function Qt(t,i,s,a){let o=t.width/i,l={},p=a.split("").entries();for(let[w,g]of p)l[g]=new me(w%o*i,Math.floor(w/o)*s,i,s);return{tex:t,map:l,size:s}}n(Qt,"makeFont");function st(t,i,s,a=y.defTex,o=y.defShader,l={}){let p=Kt(o);if(!p||p instanceof Ie)return;let w=y.fixed||s?y.transform:S.cam.transform.mult(y.transform),g=[];for(let d of t){let m=zt(w.multVec2(d.pos));g.push(m.x,m.y,d.uv.x,d.uv.y,d.color.r/255,d.color.g/255,d.color.b/255,d.opacity)}y.renderer.push(b.TRIANGLES,g,i,p,a,l)}n(st,"drawRaw");function Fe(){y.renderer.flush()}n(Fe,"flush");function nt(){b.clear(b.COLOR_BUFFER_BIT),y.frameBuffer.bind(),b.clear(b.COLOR_BUFFER_BIT),y.bgColor||Me(()=>{Ue({width:Ve(),height:ve(),quad:new me(0,0,Ve()/Ys,ve()/Ys),tex:y.bgTex,fixed:!0})}),y.renderer.numDraws=0,y.fixed=!1,y.transformStack.length=0,y.transform=new Le}n(nt,"frameStart");function xt(t,i){y.postShader=t,y.postShaderUniform=i??null}n(xt,"usePostEffect");function ot(){Fe(),y.lastDrawCalls=y.renderer.numDraws,y.frameBuffer.unbind(),b.viewport(0,0,b.drawingBufferWidth,b.drawingBufferHeight);let t=y.width,i=y.height;y.width=b.drawingBufferWidth/P,y.height=b.drawingBufferHeight/P,Je({flipY:!0,tex:y.frameBuffer.tex,pos:new E(y.viewport.x,y.viewport.y),width:y.viewport.width,height:y.viewport.height,shader:y.postShader,uniform:typeof y.postShaderUniform=="function"?y.postShaderUniform():y.postShaderUniform,fixed:!0}),Fe(),y.width=t,y.height=i}n(ot,"frameEnd");function zt(t){return new E(t.x/Ve()*2-1,-t.y/ve()*2+1)}n(zt,"screen2ndc");function Et(t){y.transform=t.clone()}n(Et,"pushMatrix");function $(...t){if(t[0]===void 0)return;let i=M(...t);i.x===0&&i.y===0||y.transform.translate(i)}n($,"pushTranslate");function Ne(...t){if(t[0]===void 0)return;let i=M(...t);i.x===1&&i.y===1||y.transform.scale(i)}n(Ne,"pushScale");function ie(t){t&&y.transform.rotate(t)}n(ie,"pushRotate");function le(){y.transformStack.push(y.transform.clone())}n(le,"pushTransform");function ne(){y.transformStack.length>0&&(y.transform=y.transformStack.pop())}n(ne,"popTransform");function Ue(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let i=t.width,s=t.height,a=lt(t.anchor||Mr).scale(new E(i,s).scale(-.5)),o=t.quad||new me(0,0,1,1),l=t.color||Z(255,255,255),p=t.opacity??1,w=t.tex?Xs/t.tex.width:0,g=t.tex?Xs/t.tex.height:0,d=o.x+w,m=o.y+g,T=o.w-w*2,B=o.h-g*2;le(),$(t.pos),ie(t.angle),Ne(t.scale),$(a),st([{pos:new E(-i/2,s/2),uv:new E(t.flipX?d+T:d,t.flipY?m:m+B),color:l,opacity:p},{pos:new E(-i/2,-s/2),uv:new E(t.flipX?d+T:d,t.flipY?m+B:m),color:l,opacity:p},{pos:new E(i/2,-s/2),uv:new E(t.flipX?d:d+T,t.flipY?m+B:m),color:l,opacity:p},{pos:new E(i/2,s/2),uv:new E(t.flipX?d:d+T,t.flipY?m:m+B),color:l,opacity:p}],[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform),ne()}n(Ue,"drawUVQuad");function Je(t){if(!t.tex)throw new Error('drawTexture() requires property "tex".');let i=t.quad??new me(0,0,1,1),s=t.tex.width*i.w,a=t.tex.height*i.h,o=new E(1);if(t.tiled){let l=Math.ceil((t.width||s)/s),p=Math.ceil((t.height||a)/a),w=lt(t.anchor||Mr).add(new E(1,1)).scale(.5).scale(l*s,p*a);for(let g=0;g({pos:new E(p.x,p.y),uv:new E(0),color:t.color??ee.WHITE,opacity:t.opacity??1}));st(l,[0,1,3,1,2,3],t.fixed,y.defTex,t.shader,t.uniform)}n(c,"drawLine");function v(t){let i=t.pts;if(!i)throw new Error('drawLines() requires property "pts".');if(!(i.length<2))if(t.radius&&i.length>=3){let s=i[0].sdist(i[1]);for(let o=1;o=360&&t.outline){t.fill!==!1&&ce(Object.assign(l,{outline:null})),ce(Object.assign(l,{pts:o.slice(1),fill:!1}));return}ce(l)}n(Q,"drawEllipse");function ce(t){if(!t.pts)throw new Error('drawPolygon() requires property "pts".');let i=t.pts.length;if(!(i<3)){if(le(),$(t.pos),Ne(t.scale),ie(t.angle),$(t.offset),t.fill!==!1){let s=t.color??ee.WHITE,a=t.pts.map((l,p)=>({pos:new E(l.x,l.y),uv:new E(0,0),color:t.colors&&t.colors[p]?t.colors[p].mult(s):s,opacity:t.opacity??1})),o=[...Array(i-2).keys()].map(l=>[0,l+1,l+2]).flat();st(a,t.indices??o,t.fixed,y.defTex,t.shader,t.uniform)}t.outline&&v({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity}),ne()}}n(ce,"drawPolygon");function Re(t,i,s){Fe(),b.clear(b.STENCIL_BUFFER_BIT),b.enable(b.STENCIL_TEST),b.stencilFunc(b.NEVER,1,255),b.stencilOp(b.REPLACE,b.REPLACE,b.REPLACE),i(),Fe(),b.stencilFunc(s,1,255),b.stencilOp(b.KEEP,b.KEEP,b.KEEP),t(),Fe(),b.disable(b.STENCIL_TEST)}n(Re,"drawStenciled");function Jt(t,i){Re(t,i,b.EQUAL)}n(Jt,"drawMasked");function Xt(t,i){Re(t,i,b.NOTEQUAL)}n(Xt,"drawSubtracted");function De(){return(y.viewport.width+y.viewport.height)/(y.width+y.height)}n(De,"getViewportScale");function Me(t){Fe();let i=y.width,s=y.height;y.width=y.viewport.width,y.height=y.viewport.height,t(),Fe(),y.width=i,y.height=s}n(Me,"drawUnscaled");function Ur(t,i){i.pos&&(t.pos=t.pos.add(i.pos)),i.scale&&(t.scale=t.scale.scale(M(i.scale))),i.angle&&(t.angle+=i.angle),i.color&&t.ch.length===1&&(t.color=t.color.mult(i.color)),i.opacity&&(t.opacity*=i.opacity)}n(Ur,"applyCharTransform");let Si=/\[(?