From 7771dff474f57399235fa562d1977d686d967def Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 9 Aug 2025 00:50:38 +0000
Subject: [PATCH 1/3] Initial plan
From 42220b6d3e8076fadff7ebb0b7cd8ee4e0658ed2 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 9 Aug 2025 01:02:04 +0000
Subject: [PATCH 2/3] Initial repository exploration and validation
Co-authored-by: thesprockee <962164+thesprockee@users.noreply.github.com>
---
Overlay/package-lock.json | 557 +
Overlay/package.json | 81 +-
.../lib/components/CompactMainBanner.svelte | 12 +-
.../src/lib/components/CompactMinimap.svelte | 225 +-
.../lib/components/DiagonalDropdown.svelte | 73 +-
Overlay/src/lib/components/Header.svelte | 50 +-
Overlay/src/lib/components/Minimap.svelte | 269 +-
Overlay/src/lib/components/PlayerLists.svelte | 197 +-
Overlay/src/lib/components/ThreeDee.svelte | 86 +-
.../VisibilityConfigCheckbox.svelte | 29 +-
Overlay/src/lib/css/player_list.css | 112 +-
Overlay/src/lib/css/prism.css | 117 +-
Overlay/src/lib/js/Frame.ts | 152 +-
Overlay/src/lib/js/SparkConfig.ts | 2 +-
Overlay/src/lib/js/empty_frame.ts | 271 +-
Overlay/src/lib/js/prism.js | 679 +-
Overlay/src/lib/js/spark_websocket.js | 128 +-
Overlay/src/lib/js/stores.ts | 159 +-
Overlay/src/lib/js/util.js | 67 +-
Overlay/src/routes/(bulma)/+layout.svelte | 64 +-
Overlay/src/routes/(bulma)/+page.svelte | 118 +-
Overlay/src/routes/(bulma)/api/+page.svelte | 101 +-
.../(bulma)/local_database/+page.svelte | 333 +-
.../src/routes/(bulma)/overlays/+page.svelte | 5 +-
.../(bulma)/overlays/match_setup/+page.svelte | 702 +-
.../routes/(bulma)/websockets/+page.svelte | 123 +-
Overlay/src/routes/(overlays)/+layout.svelte | 11 +-
.../routes/(overlays)/branding/+page.svelte | 326 +-
.../compact_main_banner/+page.svelte | 14 +-
.../components/compact_minimap/+page.svelte | 29 +-
.../(overlays)/components/events/+page.svelte | 2 +-
.../components/minimap/+page.svelte | 31 +-
.../configurable_overlay_movable/+page.svelte | 223 +-
.../(overlays)/depth_events/+page.svelte | 28 +-
.../routes/(overlays)/minimap/+page.svelte | 15 +-
.../routes/(overlays)/playspace/+page.svelte | 17 +-
Overlay/src/routes/+layout.ts | 2 +-
Overlay/static/compact_main_banner.html | 154 +-
Overlay/static/compact_minimap.html | 92 +-
Overlay/static/configurable_overlay.html | 53 +-
Overlay/static/css/autocomplete_styles.css | 42 +-
Overlay/static/css/compact_main_banner.css | 387 +-
Overlay/static/css/configurable_overlay.css | 11 +-
Overlay/static/css/event_banners.css | 137 +-
Overlay/static/css/lib/bulma.min.css | 10608 +++++++++++++++-
Overlay/static/css/main_banner.css | 182 +-
Overlay/static/css/mathematical_time.css | 64 +-
Overlay/static/css/minimap.css | 14 +-
Overlay/static/css/minimap_minimal.css | 76 +-
Overlay/static/css/player_lists.css | 86 +-
Overlay/static/css/shared.css | 9 +-
Overlay/static/css/styles.css | 11 +-
Overlay/static/default_minimap.html | 92 +-
Overlay/static/disc_position_heatmap.html | 387 +-
Overlay/static/docs.html | 43 +-
Overlay/static/event_log.html | 115 +-
Overlay/static/full_overlay.html | 405 +-
Overlay/static/js/autocomplete.js | 235 +-
Overlay/static/js/fetch_utils.js | 108 +-
Overlay/static/js/full_overlay.js | 760 +-
Overlay/static/js/heatmap_min.js | 524 +-
Overlay/static/js/lib/fitty.min.js | 199 +-
Overlay/static/js/lib/heatmap.min.js | 524 +-
.../js/lib/reconnecting-websocket.min.js | 137 +-
Overlay/static/js/minimap.js | 29 +-
Overlay/static/js/spark_websocket.js | 327 +-
Overlay/static/js/util.js | 255 +-
Overlay/static/midmatch_overlay.html | 437 +-
Overlay/static/minimap.html | 92 +-
Overlay/static/openapi.yaml | 254 +-
Overlay/static/player_lists.html | 42 +-
Overlay/static/playspace.html | 143 +-
Overlay/static/speedometer.html | 76 +-
Overlay/static/websockets/game_data.html | 127 +-
.../static/websockets/websocket_example.html | 61 +-
Overlay/svelte.config.js | 7 +-
76 files changed, 18089 insertions(+), 4626 deletions(-)
diff --git a/Overlay/package-lock.json b/Overlay/package-lock.json
index 18a650e..0f8adb8 100644
--- a/Overlay/package-lock.json
+++ b/Overlay/package-lock.json
@@ -25,6 +25,7 @@
"eslint-plugin-svelte3": "^4.0.0",
"prettier": "^2.8.7",
"prettier-plugin-svelte": "^2.10.0",
+ "sass": "^1.90.0",
"scss": "^0.2.4",
"svelte": "^3.58.0",
"svelte-check": "^3.2.0",
@@ -541,6 +542,316 @@
"node": ">= 8"
}
},
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
+ "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.1",
+ "@parcel/watcher-darwin-arm64": "2.5.1",
+ "@parcel/watcher-darwin-x64": "2.5.1",
+ "@parcel/watcher-freebsd-x64": "2.5.1",
+ "@parcel/watcher-linux-arm-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm-musl": "2.5.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm64-musl": "2.5.1",
+ "@parcel/watcher-linux-x64-glibc": "2.5.1",
+ "@parcel/watcher-linux-x64-musl": "2.5.1",
+ "@parcel/watcher-win32-arm64": "2.5.1",
+ "@parcel/watcher-win32-ia32": "2.5.1",
+ "@parcel/watcher-win32-x64": "2.5.1"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
+ "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
+ "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
+ "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
+ "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
+ "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
+ "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
+ "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
+ "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
+ "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
+ "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
+ "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
+ "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
+ "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
"node_modules/@polka/url": {
"version": "1.0.0-next.21",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
@@ -1161,6 +1472,20 @@
"node": ">=8"
}
},
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/devalue": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz",
@@ -1740,6 +2065,13 @@
"node": ">= 4"
}
},
+ "node_modules/immutable": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz",
+ "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -2096,6 +2428,14 @@
"integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
"dev": true
},
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/noms": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
@@ -2527,6 +2867,57 @@
"rimraf": "bin.js"
}
},
+ "node_modules/sass": {
+ "version": "1.90.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz",
+ "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/sass/node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/sass/node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/scss": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/scss/-/scss-0.2.4.tgz",
@@ -3487,6 +3878,123 @@
"fastq": "^1.6.0"
}
},
+ "@parcel/watcher": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
+ "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@parcel/watcher-android-arm64": "2.5.1",
+ "@parcel/watcher-darwin-arm64": "2.5.1",
+ "@parcel/watcher-darwin-x64": "2.5.1",
+ "@parcel/watcher-freebsd-x64": "2.5.1",
+ "@parcel/watcher-linux-arm-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm-musl": "2.5.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm64-musl": "2.5.1",
+ "@parcel/watcher-linux-x64-glibc": "2.5.1",
+ "@parcel/watcher-linux-x64-musl": "2.5.1",
+ "@parcel/watcher-win32-arm64": "2.5.1",
+ "@parcel/watcher-win32-ia32": "2.5.1",
+ "@parcel/watcher-win32-x64": "2.5.1",
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ }
+ },
+ "@parcel/watcher-android-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
+ "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-darwin-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
+ "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-darwin-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
+ "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-freebsd-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
+ "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
+ "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
+ "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
+ "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
+ "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
+ "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
+ "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-win32-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
+ "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-win32-ia32": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
+ "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-win32-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
+ "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
+ "dev": true,
+ "optional": true
+ },
"@polka/url": {
"version": "1.0.0-next.21",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
@@ -3911,6 +4419,13 @@
"integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
"dev": true
},
+ "detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "optional": true
+ },
"devalue": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz",
@@ -4359,6 +4874,12 @@
"integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
"dev": true
},
+ "immutable": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz",
+ "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==",
+ "dev": true
+ },
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -4615,6 +5136,13 @@
"integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
"dev": true
},
+ "node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "optional": true
+ },
"noms": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
@@ -4906,6 +5434,35 @@
}
}
},
+ "sass": {
+ "version": "1.90.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz",
+ "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==",
+ "dev": true,
+ "requires": {
+ "@parcel/watcher": "^2.4.1",
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "dependencies": {
+ "chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "requires": {
+ "readdirp": "^4.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true
+ }
+ }
+ },
"scss": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/scss/-/scss-0.2.4.tgz",
diff --git a/Overlay/package.json b/Overlay/package.json
index 1927fdf..307863b 100644
--- a/Overlay/package.json
+++ b/Overlay/package.json
@@ -1,42 +1,43 @@
{
- "name": "spark_overlays",
- "version": "0.0.1",
- "private": true,
- "scripts": {
- "dev": "vite dev",
- "build": "vite build",
- "preview": "vite preview",
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
- "lint": "prettier --plugin-search-dir . --check . && eslint .",
- "format": "prettier --plugin-search-dir . --write .",
- "cpdir": "npx copyfiles .svelte-kit/output/prerendered/pages build"
- },
- "devDependencies": {
- "@sveltejs/adapter-static": "^2.0.2",
- "@sveltejs/kit": "^1.15.4",
- "@typescript-eslint/eslint-plugin": "^5.58.0",
- "@typescript-eslint/parser": "^5.58.0",
- "eslint": "^8.38.0",
- "eslint-config-prettier": "^8.8.0",
- "eslint-plugin-svelte3": "^4.0.0",
- "prettier": "^2.8.7",
- "prettier-plugin-svelte": "^2.10.0",
- "svelte": "^3.58.0",
- "svelte-check": "^3.2.0",
- "svelte-preprocess": "^5.0.3",
- "tslib": "^2.5.0",
- "typescript": "^5.0.4",
- "vite": "^4.2.1",
- "scss": "^0.2.4",
- "copyfiles": "^2.4.1"
- },
- "type": "module",
- "dependencies": {
- "bulma": "^0.9.4",
- "reconnecting-websocket": "^4.4.0",
- "ws": "^8.11.0",
- "three": "^0.151.3",
- "three.meshline": "^1.4.0"
- }
+ "name": "spark_overlays",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "preview": "vite preview",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
+ "lint": "prettier --plugin-search-dir . --check . && eslint .",
+ "format": "prettier --plugin-search-dir . --write .",
+ "cpdir": "npx copyfiles .svelte-kit/output/prerendered/pages build"
+ },
+ "devDependencies": {
+ "@sveltejs/adapter-static": "^2.0.2",
+ "@sveltejs/kit": "^1.15.4",
+ "@typescript-eslint/eslint-plugin": "^5.58.0",
+ "@typescript-eslint/parser": "^5.58.0",
+ "copyfiles": "^2.4.1",
+ "eslint": "^8.38.0",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-svelte3": "^4.0.0",
+ "prettier": "^2.8.7",
+ "prettier-plugin-svelte": "^2.10.0",
+ "sass": "^1.90.0",
+ "scss": "^0.2.4",
+ "svelte": "^3.58.0",
+ "svelte-check": "^3.2.0",
+ "svelte-preprocess": "^5.0.3",
+ "tslib": "^2.5.0",
+ "typescript": "^5.0.4",
+ "vite": "^4.2.1"
+ },
+ "type": "module",
+ "dependencies": {
+ "bulma": "^0.9.4",
+ "reconnecting-websocket": "^4.4.0",
+ "three": "^0.151.3",
+ "three.meshline": "^1.4.0",
+ "ws": "^8.11.0"
+ }
}
diff --git a/Overlay/src/lib/components/CompactMainBanner.svelte b/Overlay/src/lib/components/CompactMainBanner.svelte
index 47a83bb..2871f77 100644
--- a/Overlay/src/lib/components/CompactMainBanner.svelte
+++ b/Overlay/src/lib/components/CompactMainBanner.svelte
@@ -16,8 +16,6 @@
let mathematicalTimeVisible = false;
let mathematicalTimeText = '';
-
-
let sw = new SparkWebsocket();
sw.subscribe('goal', (data) => {
if (data['team_scored'] == 'blue') {
@@ -184,14 +182,8 @@
{:else if $overlay_config['round_scores']['round_scores_orange'].length - 1 === i}
{:else}
diff --git a/Overlay/src/lib/components/CompactMinimap.svelte b/Overlay/src/lib/components/CompactMinimap.svelte
index c3bd61f..f25639e 100644
--- a/Overlay/src/lib/components/CompactMinimap.svelte
+++ b/Overlay/src/lib/components/CompactMinimap.svelte
@@ -1,115 +1,124 @@
-
-
+
+
+ {#if frame}
+ {#if frame['teams'][0]['players']}
+ {#each frame['teams'][0]['players'] as p}
+
+
+
{p['number'].toString().padStart(2, '0')}
+
+ {/each}
+ {/if}
+
+ {#if frame['teams'][1]['players']}
+ {#each frame['teams'][1]['players'] as p}
+
+
+
{p['number'].toString().padStart(2, '0')}
+
+ {/each}
+ {/if}
+
+ {#if frame}
+
+
+
+ {/if}
+ {/if}
+
-
-
- {#if frame}
-
- {#if frame['teams'][0]['players']}
- {#each frame['teams'][0]['players'] as p}
-
-
-
{p['number'].toString().padStart(2, '0')}
-
- {/each}
- {/if}
-
-
- {#if frame['teams'][1]['players']}
- {#each frame['teams'][1]['players'] as p}
-
-
-
{p['number'].toString().padStart(2, '0')}
-
- {/each}
- {/if}
-
-
- {#if frame}
-
-
-
- {/if}
- {/if}
-
\ No newline at end of file
+
diff --git a/Overlay/src/lib/components/DiagonalDropdown.svelte b/Overlay/src/lib/components/DiagonalDropdown.svelte
index e2be60b..a1780be 100644
--- a/Overlay/src/lib/components/DiagonalDropdown.svelte
+++ b/Overlay/src/lib/components/DiagonalDropdown.svelte
@@ -1,44 +1,47 @@
-
-
-
\ No newline at end of file
diff --git a/Overlay/src/lib/components/Header.svelte b/Overlay/src/lib/components/Header.svelte
index 87ee060..2392282 100644
--- a/Overlay/src/lib/components/Header.svelte
+++ b/Overlay/src/lib/components/Header.svelte
@@ -1,31 +1,31 @@
+
+
+
+
{title}
+
+
+ {subtitle}
+
+
+
+
+
-
-
-
-
-
{title}
-
-
- {subtitle}
-
-
-
-
\ No newline at end of file
diff --git a/Overlay/src/lib/components/Minimap.svelte b/Overlay/src/lib/components/Minimap.svelte
index b81a4a3..d6f6833 100644
--- a/Overlay/src/lib/components/Minimap.svelte
+++ b/Overlay/src/lib/components/Minimap.svelte
@@ -1,136 +1,147 @@
-
-
+
+
+ {#if frame}
+ {#if frame['teams'][0]['players']}
+ {#each frame['teams'][0]['players'] as p}
+
+
+
{p['number'].toString().padStart(2, '0')}
+
+ {/each}
+ {/if}
+
+ {#if frame['teams'][1]['players']}
+ {#each frame['teams'][1]['players'] as p}
+
+
+
{p['number'].toString().padStart(2, '0')}
+
+ {/each}
+ {/if}
+
+ {#if frame}
+
+
+
+ {/if}
+ {/if}
+
-
-
- {#if frame}
-
- {#if frame['teams'][0]['players']}
- {#each frame['teams'][0]['players'] as p}
-
-
-
{p['number'].toString().padStart(2, '0')}
-
- {/each}
- {/if}
-
-
- {#if frame['teams'][1]['players']}
- {#each frame['teams'][1]['players'] as p}
-
-
-
{p['number'].toString().padStart(2, '0')}
-
- {/each}
- {/if}
-
-
- {#if frame}
-
-
-
- {/if}
- {/if}
-
\ No newline at end of file
+
diff --git a/Overlay/src/lib/components/PlayerLists.svelte b/Overlay/src/lib/components/PlayerLists.svelte
index 44efa26..29ee97f 100644
--- a/Overlay/src/lib/components/PlayerLists.svelte
+++ b/Overlay/src/lib/components/PlayerLists.svelte
@@ -1,106 +1,7 @@
-
-
{#if $frame}
@@ -124,4 +25,98 @@
{/if}
-{/if}
\ No newline at end of file
+{/if}
+
+
diff --git a/Overlay/src/lib/components/ThreeDee.svelte b/Overlay/src/lib/components/ThreeDee.svelte
index 74d3db7..492c945 100644
--- a/Overlay/src/lib/components/ThreeDee.svelte
+++ b/Overlay/src/lib/components/ThreeDee.svelte
@@ -1,27 +1,26 @@
-
\ No newline at end of file
+
diff --git a/Overlay/src/lib/components/VisibilityConfigCheckbox.svelte b/Overlay/src/lib/components/VisibilityConfigCheckbox.svelte
index 3958b2c..fb3feab 100644
--- a/Overlay/src/lib/components/VisibilityConfigCheckbox.svelte
+++ b/Overlay/src/lib/components/VisibilityConfigCheckbox.svelte
@@ -1,19 +1,24 @@
- {visibilityChanged(key, e.target.checked)}}/>
+ {
+ visibilityChanged(key, e.target.checked);
+ }}
+ />
{text}
-
\ No newline at end of file
+
diff --git a/Overlay/src/lib/css/player_list.css b/Overlay/src/lib/css/player_list.css
index 797b887..b46151a 100644
--- a/Overlay/src/lib/css/player_list.css
+++ b/Overlay/src/lib/css/player_list.css
@@ -1,91 +1,91 @@
.player_list {
- animation: fade_in 1s;
- width: 17em;
- height: 12em;
- display: flex;
- flex-direction: column;
- flex-wrap: nowrap;
- font-family: 'Inconsolata', monospace;
- font-weight: 900;
- font-size: 1.25em;
- color: #eee;
- text-shadow: 0.1em 0.1em 0 #0005;
- z-index: 11;
+ animation: fade_in 1s;
+ width: 17em;
+ height: 12em;
+ display: flex;
+ flex-direction: column;
+ flex-wrap: nowrap;
+ font-family: 'Inconsolata', monospace;
+ font-weight: 900;
+ font-size: 1.25em;
+ color: #eee;
+ text-shadow: 0.1em 0.1em 0 #0005;
+ z-index: 11;
}
@keyframes fade_in {
- 0% {
- opacity: 0;
- }
+ 0% {
+ opacity: 0;
+ }
- 100% {
- opacity: 1;
- }
+ 100% {
+ opacity: 1;
+ }
}
.player_list.orange {
- text-align: left;
+ text-align: left;
}
.player_list.blue {
- text-align: right;
+ text-align: right;
}
-.player_list.orange>div {
- background: none;
- flex-direction: row-reverse;
+.player_list.orange > div {
+ background: none;
+ flex-direction: row-reverse;
}
-.player_list.blue>div {
- background: none;
+.player_list.blue > div {
+ background: none;
}
-.player_list>div {
- display: flex;
- flex-direction: row;
- flex-wrap: nowrap;
+.player_list > div {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
}
-.player_list>div>div {
- padding: 0.4em 1em;
+.player_list > div > div {
+ padding: 0.4em 1em;
}
/* name */
-.player_list>div>div:first-child {
- flex-grow: 1;
+.player_list > div > div:first-child {
+ flex-grow: 1;
}
-.player_list>div.stunned>div:first-child {
- opacity: 0.5;
+.player_list > div.stunned > div:first-child {
+ opacity: 0.5;
}
/* number */
-.player_list>div>div:last-child {
- width: 1.5em;
- border: 0.1em solid #000f;
- background-color: #000c;
- margin: 0.1em 0.5em;
- padding: 0.25em;
- text-align: center;
+.player_list > div > div:last-child {
+ width: 1.5em;
+ border: 0.1em solid #000f;
+ background-color: #000c;
+ margin: 0.1em 0.5em;
+ padding: 0.25em;
+ text-align: center;
}
-.player_list>div.possession>div:last-child {
- border: 0.2em solid #fff;
- padding: 0.15em;
- background-color: #000f;
- border-radius: 0.2em;
+.player_list > div.possession > div:last-child {
+ border: 0.2em solid #fff;
+ padding: 0.15em;
+ background-color: #000f;
+ border-radius: 0.2em;
}
-.player_list.orange>div>div:first-child {
- background: linear-gradient(90deg, #ff9627aa 0%, #bd7a2400 100%);
- border-bottom: 0.1em solid #ff9627;
+.player_list.orange > div > div:first-child {
+ background: linear-gradient(90deg, #ff9627aa 0%, #bd7a2400 100%);
+ border-bottom: 0.1em solid #ff9627;
}
-.player_list.blue>div>div:first-child {
- background: linear-gradient(-90deg, #4890ddaa 0%, #3f6ae100 100%);
- border-bottom: 0.1em solid #2478d0;
+.player_list.blue > div > div:first-child {
+ background: linear-gradient(-90deg, #4890ddaa 0%, #3f6ae100 100%);
+ border-bottom: 0.1em solid #2478d0;
}
-.player_list>div {
- margin: 0.1em;
-}
\ No newline at end of file
+.player_list > div {
+ margin: 0.1em;
+}
diff --git a/Overlay/src/lib/css/prism.css b/Overlay/src/lib/css/prism.css
index aca412b..9255a31 100644
--- a/Overlay/src/lib/css/prism.css
+++ b/Overlay/src/lib/css/prism.css
@@ -1,3 +1,118 @@
/* PrismJS 1.29.0
https://prismjs.com/download.html#themes=prism&languages=clike+javascript */
-code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
+code[class*='language-'],
+pre[class*='language-'] {
+ color: #000;
+ background: 0 0;
+ text-shadow: 0 1px #fff;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+code[class*='language-'] ::-moz-selection,
+code[class*='language-']::-moz-selection,
+pre[class*='language-'] ::-moz-selection,
+pre[class*='language-']::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+code[class*='language-'] ::selection,
+code[class*='language-']::selection,
+pre[class*='language-'] ::selection,
+pre[class*='language-']::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*='language-'],
+ pre[class*='language-'] {
+ text-shadow: none;
+ }
+}
+pre[class*='language-'] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*='language-'],
+pre[class*='language-'] {
+ background: #f5f2f0;
+}
+:not(pre) > code[class*='language-'] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.cdata,
+.token.comment,
+.token.doctype,
+.token.prolog {
+ color: #708090;
+}
+.token.punctuation {
+ color: #999;
+}
+.token.namespace {
+ opacity: 0.7;
+}
+.token.boolean,
+.token.constant,
+.token.deleted,
+.token.number,
+.token.property,
+.token.symbol,
+.token.tag {
+ color: #905;
+}
+.token.attr-name,
+.token.builtin,
+.token.char,
+.token.inserted,
+.token.selector,
+.token.string {
+ color: #690;
+}
+.language-css .token.string,
+.style .token.string,
+.token.entity,
+.token.operator,
+.token.url {
+ color: #9a6e3a;
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.class-name,
+.token.function {
+ color: #dd4a68;
+}
+.token.important,
+.token.regex,
+.token.variable {
+ color: #e90;
+}
+.token.bold,
+.token.important {
+ font-weight: 700;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
diff --git a/Overlay/src/lib/js/Frame.ts b/Overlay/src/lib/js/Frame.ts
index e15657a..0014e8c 100644
--- a/Overlay/src/lib/js/Frame.ts
+++ b/Overlay/src/lib/js/Frame.ts
@@ -1,109 +1,109 @@
export interface Frame {
- disc: Disc;
+ disc: Disc;
orange_team_restart_request: number;
- sessionid: string;
- game_clock_display: string;
- game_status: string;
- sessionip: string;
- match_type: string;
- map_name: string;
- right_shoulder_pressed2: number;
- teams: Team[];
- blue_round_score: number;
- orange_points: number;
- player: VRPlayer;
- private_match: boolean;
- blue_team_restart_request: number;
- tournament_match: boolean;
- orange_round_score: number;
- rules_changed_by: string;
- total_round_count: number;
- left_shoulder_pressed2: number;
- left_shoulder_pressed: number;
- pause: Pause;
- right_shoulder_pressed: number;
- blue_points: number;
- last_throw: { [key: string]: number };
- client_name: string;
- game_clock: number;
- possession: number[];
- last_score: LastScore;
- rules_changed_at: number;
- err_code: number;
+ sessionid: string;
+ game_clock_display: string;
+ game_status: string;
+ sessionip: string;
+ match_type: string;
+ map_name: string;
+ right_shoulder_pressed2: number;
+ teams: Team[];
+ blue_round_score: number;
+ orange_points: number;
+ player: VRPlayer;
+ private_match: boolean;
+ blue_team_restart_request: number;
+ tournament_match: boolean;
+ orange_round_score: number;
+ rules_changed_by: string;
+ total_round_count: number;
+ left_shoulder_pressed2: number;
+ left_shoulder_pressed: number;
+ pause: Pause;
+ right_shoulder_pressed: number;
+ blue_points: number;
+ last_throw: { [key: string]: number };
+ client_name: string;
+ game_clock: number;
+ possession: number[];
+ last_score: LastScore;
+ rules_changed_at: number;
+ err_code: number;
}
export interface Disc {
- position: number[];
- forward: number[];
- left: number[];
- up: number[];
- velocity: number[];
+ position: number[];
+ forward: number[];
+ left: number[];
+ up: number[];
+ velocity: number[];
bounce_count: number;
}
export interface LastScore {
- disc_speed: number;
- team: string;
- goal_type: string;
- point_amount: number;
+ disc_speed: number;
+ team: string;
+ goal_type: string;
+ point_amount: number;
distance_thrown: number;
- person_scored: string;
- assist_scored: string;
+ person_scored: string;
+ assist_scored: string;
}
export interface Pause {
- paused_state: string;
- unpaused_team: PausedRequestedTeam;
+ paused_state: string;
+ unpaused_team: PausedRequestedTeam;
paused_requested_team: PausedRequestedTeam;
- unpaused_timer: number;
- paused_timer: number;
+ unpaused_timer: number;
+ paused_timer: number;
}
export enum PausedRequestedTeam {
- None = "none",
+ None = 'none'
}
export interface VRPlayer {
- vr_left: number[];
+ vr_left: number[];
vr_position: number[];
- vr_forward: number[];
- vr_up: number[];
+ vr_forward: number[];
+ vr_up: number[];
}
export interface Team {
- players: Player[];
- team: string;
+ players: Player[];
+ team: string;
possession: boolean;
- stats: { [key: string]: number };
+ stats: { [key: string]: number };
}
export interface Player {
- name: string;
- rhand: Body;
- playerid: number;
- userid: number;
+ name: string;
+ rhand: Body;
+ playerid: number;
+ userid: number;
is_emote_playing: boolean;
- number: number;
- level: number;
- stunned: boolean;
- ping: number;
- packetlossratio: number;
- invulnerable: boolean;
- holding_left: PausedRequestedTeam;
- possession: boolean;
- head: Body;
- body: Body;
- holding_right: PausedRequestedTeam;
- lhand: Body;
- blocking: boolean;
- velocity: number[];
- stats: { [key: string]: number };
+ number: number;
+ level: number;
+ stunned: boolean;
+ ping: number;
+ packetlossratio: number;
+ invulnerable: boolean;
+ holding_left: PausedRequestedTeam;
+ possession: boolean;
+ head: Body;
+ body: Body;
+ holding_right: PausedRequestedTeam;
+ lhand: Body;
+ blocking: boolean;
+ velocity: number[];
+ stats: { [key: string]: number };
}
export interface Body {
position?: number[];
- forward: number[];
- left: number[];
- up: number[];
- pos?: number[];
-}
\ No newline at end of file
+ forward: number[];
+ left: number[];
+ up: number[];
+ pos?: number[];
+}
diff --git a/Overlay/src/lib/js/SparkConfig.ts b/Overlay/src/lib/js/SparkConfig.ts
index 88af87d..6842674 100644
--- a/Overlay/src/lib/js/SparkConfig.ts
+++ b/Overlay/src/lib/js/SparkConfig.ts
@@ -57,4 +57,4 @@ export let Config = {
team_logo: ''
}
]
-};
\ No newline at end of file
+};
diff --git a/Overlay/src/lib/js/empty_frame.ts b/Overlay/src/lib/js/empty_frame.ts
index 2f1ef21..801096e 100644
--- a/Overlay/src/lib/js/empty_frame.ts
+++ b/Overlay/src/lib/js/empty_frame.ts
@@ -1,138 +1,141 @@
export const empty_frame = {
- "disc": {
- "position": [0, 0, 0],
- "forward": [0.84400004, -0.514, -0.15200001],
- "left": [-0.28, -0.66400003, 0.69400001],
- "up": [-0.45800003, -0.54300004, -0.70400006],
- "velocity": [0, 0, 0],
- "bounce_count": 0
- },
- "orange_team_restart_request": 0,
- "sessionid": "A1696BF4-1852-4692-AA1F-D4C473BF3681",
- "game_clock_display": "02:42.54",
- "game_status": "playing",
- "sessionip": "209.205.126.138",
- "match_type": "Echo_Arena",
- "map_name": "mpl_arena_a",
- "right_shoulder_pressed2": 0.0,
- "teams": [{
- "players": [],
- "team": "BLUE TEAM",
- "possession": false,
- "stats": {
- "points": 4,
- "possession_time": 56.007523,
- "interceptions": 4,
- "blocks": 1,
- "steals": 0,
- "catches": 2,
- "passes": 2,
- "saves": 0,
- "goals": 2,
- "stuns": 9,
- "assists": 1,
- "shots_taken": 3
- }
- }, {
- "players": [],
- "team": "ORANGE TEAM",
- "possession": true,
- "stats": {
- "points": 0,
- "possession_time": 62.957249,
- "interceptions": 2,
- "blocks": 1,
- "steals": 0,
- "catches": 2,
- "passes": 2,
- "saves": 0,
- "goals": 0,
- "stuns": 7,
- "assists": 0,
- "shots_taken": 0
- }
- }, {
- "players": [],
- "team": "SPECTATORS",
- "possession": false,
- "stats": {
- "points": 0,
- "possession_time": 0.0,
- "interceptions": 0,
- "blocks": 0,
- "steals": 0,
- "catches": 0,
- "passes": 0,
- "saves": 0,
- "goals": 0,
- "stuns": 0,
- "assists": 0,
- "shots_taken": 0
- }
- }],
- "blue_round_score": 0,
- "orange_points": 0,
- "player": {
- "vr_left": [0.0050000004, 0.001, 1.0],
- "vr_position": [14.215001, 1.5230001, 6.6320004],
- "vr_forward": [-0.99400002, 0.109, 0.0050000004],
- "vr_up": [0.109, 0.99400002, -0.0020000001]
- },
- "private_match": false,
- "blue_team_restart_request": 0,
- "tournament_match": false,
- "orange_round_score": 0,
- "rules_changed_by": "[INVALID]",
- "total_round_count": 1,
- "left_shoulder_pressed2": 0.0,
- "left_shoulder_pressed": 0.0,
- "pause": {
- "paused_state": "unpaused",
- "unpaused_team": "none",
- "paused_requested_team": "none",
- "unpaused_timer": 0.0,
- "paused_timer": 0.0
- },
- "right_shoulder_pressed": 0.0,
- "blue_points": 0,
- "last_throw": {
- "arm_speed": 0.0,
- "total_speed": 0.0,
- "off_axis_spin_deg": 0.0,
- "wrist_throw_penalty": 0.0,
- "rot_per_sec": 0.0,
- "pot_speed_from_rot": 0.0,
- "speed_from_arm": 0.0,
- "speed_from_movement": 0.0,
- "speed_from_wrist": 0.0,
- "wrist_align_to_throw_deg": 0.0,
- "throw_align_to_movement_deg": 0.0,
- "off_axis_penalty": 0.0,
- "throw_move_penalty": 0.0
- },
- "client_name": "anonymous",
- "game_clock": 0,
- "possession": [0, 0],
- "last_score": {
- "disc_speed": 0,
- "team": "none",
- "goal_type": "INSIDE SHOT",
- "point_amount": 2,
- "distance_thrown": 0,
- "person_scored": "[INVALID]",
- "assist_scored": ""
- },
- "rules_changed_at": 0,
- "err_code": 0
+ disc: {
+ position: [0, 0, 0],
+ forward: [0.84400004, -0.514, -0.15200001],
+ left: [-0.28, -0.66400003, 0.69400001],
+ up: [-0.45800003, -0.54300004, -0.70400006],
+ velocity: [0, 0, 0],
+ bounce_count: 0
+ },
+ orange_team_restart_request: 0,
+ sessionid: 'A1696BF4-1852-4692-AA1F-D4C473BF3681',
+ game_clock_display: '02:42.54',
+ game_status: 'playing',
+ sessionip: '209.205.126.138',
+ match_type: 'Echo_Arena',
+ map_name: 'mpl_arena_a',
+ right_shoulder_pressed2: 0.0,
+ teams: [
+ {
+ players: [],
+ team: 'BLUE TEAM',
+ possession: false,
+ stats: {
+ points: 4,
+ possession_time: 56.007523,
+ interceptions: 4,
+ blocks: 1,
+ steals: 0,
+ catches: 2,
+ passes: 2,
+ saves: 0,
+ goals: 2,
+ stuns: 9,
+ assists: 1,
+ shots_taken: 3
+ }
+ },
+ {
+ players: [],
+ team: 'ORANGE TEAM',
+ possession: true,
+ stats: {
+ points: 0,
+ possession_time: 62.957249,
+ interceptions: 2,
+ blocks: 1,
+ steals: 0,
+ catches: 2,
+ passes: 2,
+ saves: 0,
+ goals: 0,
+ stuns: 7,
+ assists: 0,
+ shots_taken: 0
+ }
+ },
+ {
+ players: [],
+ team: 'SPECTATORS',
+ possession: false,
+ stats: {
+ points: 0,
+ possession_time: 0.0,
+ interceptions: 0,
+ blocks: 0,
+ steals: 0,
+ catches: 0,
+ passes: 0,
+ saves: 0,
+ goals: 0,
+ stuns: 0,
+ assists: 0,
+ shots_taken: 0
+ }
+ }
+ ],
+ blue_round_score: 0,
+ orange_points: 0,
+ player: {
+ vr_left: [0.0050000004, 0.001, 1.0],
+ vr_position: [14.215001, 1.5230001, 6.6320004],
+ vr_forward: [-0.99400002, 0.109, 0.0050000004],
+ vr_up: [0.109, 0.99400002, -0.0020000001]
+ },
+ private_match: false,
+ blue_team_restart_request: 0,
+ tournament_match: false,
+ orange_round_score: 0,
+ rules_changed_by: '[INVALID]',
+ total_round_count: 1,
+ left_shoulder_pressed2: 0.0,
+ left_shoulder_pressed: 0.0,
+ pause: {
+ paused_state: 'unpaused',
+ unpaused_team: 'none',
+ paused_requested_team: 'none',
+ unpaused_timer: 0.0,
+ paused_timer: 0.0
+ },
+ right_shoulder_pressed: 0.0,
+ blue_points: 0,
+ last_throw: {
+ arm_speed: 0.0,
+ total_speed: 0.0,
+ off_axis_spin_deg: 0.0,
+ wrist_throw_penalty: 0.0,
+ rot_per_sec: 0.0,
+ pot_speed_from_rot: 0.0,
+ speed_from_arm: 0.0,
+ speed_from_movement: 0.0,
+ speed_from_wrist: 0.0,
+ wrist_align_to_throw_deg: 0.0,
+ throw_align_to_movement_deg: 0.0,
+ off_axis_penalty: 0.0,
+ throw_move_penalty: 0.0
+ },
+ client_name: 'anonymous',
+ game_clock: 0,
+ possession: [0, 0],
+ last_score: {
+ disc_speed: 0,
+ team: 'none',
+ goal_type: 'INSIDE SHOT',
+ point_amount: 2,
+ distance_thrown: 0,
+ person_scored: '[INVALID]',
+ assist_scored: ''
+ },
+ rules_changed_at: 0,
+ err_code: 0
};
export const empty_last_score = {
- "disc_speed": 0,
- "team": "none",
- "goal_type": "-----",
- "point_amount": 0,
- "distance_thrown": 0,
- "person_scored": "",
- "assist_scored": ""
-
-};
\ No newline at end of file
+ disc_speed: 0,
+ team: 'none',
+ goal_type: '-----',
+ point_amount: 0,
+ distance_thrown: 0,
+ person_scored: '',
+ assist_scored: ''
+};
diff --git a/Overlay/src/lib/js/prism.js b/Overlay/src/lib/js/prism.js
index db603d2..fcf8e1c 100644
--- a/Overlay/src/lib/js/prism.js
+++ b/Overlay/src/lib/js/prism.js
@@ -1,7 +1,676 @@
/* PrismJS 1.26.0
https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript */
-var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(Pl.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a"+a.content+""+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
-Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
-!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
-Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
-Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
+var _self =
+ 'undefined' != typeof window
+ ? window
+ : 'undefined' != typeof WorkerGlobalScope && self instanceof WorkerGlobalScope
+ ? self
+ : {},
+ Prism = (function (u) {
+ var t = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,
+ n = 0,
+ e = {},
+ M = {
+ manual: u.Prism && u.Prism.manual,
+ disableWorkerMessageHandler: u.Prism && u.Prism.disableWorkerMessageHandler,
+ util: {
+ encode: function e(n) {
+ return n instanceof W
+ ? new W(n.type, e(n.content), n.alias)
+ : Array.isArray(n)
+ ? n.map(e)
+ : n
+ .replace(/&/g, '&')
+ .replace(/= l.reach);
+ y += m.value.length, m = m.next
+ ) {
+ var k = m.value;
+ if (t.length > n.length) return;
+ if (!(k instanceof W)) {
+ var x,
+ b = 1;
+ if (h) {
+ if (!(x = z(p, y, n, f)) || x.index >= n.length) break;
+ var w = x.index,
+ A = x.index + x[0].length,
+ P = y;
+ for (P += m.value.length; P <= w; ) (m = m.next), (P += m.value.length);
+ if (((P -= m.value.length), (y = P), m.value instanceof W)) continue;
+ for (
+ var E = m;
+ E !== t.tail && (P < A || 'string' == typeof E.value);
+ E = E.next
+ )
+ b++, (P += E.value.length);
+ b--, (k = n.slice(y, P)), (x.index -= y);
+ } else if (!(x = z(p, 0, k, f))) continue;
+ var w = x.index,
+ L = x[0],
+ S = k.slice(0, w),
+ O = k.slice(w + L.length),
+ j = y + k.length;
+ l && j > l.reach && (l.reach = j);
+ var C = m.prev;
+ S && ((C = I(t, C, S)), (y += S.length)), q(t, C, b);
+ var N = new W(o, g ? M.tokenize(L, g) : L, d, L);
+ if (((m = I(t, C, N)), O && I(t, m, O), 1 < b)) {
+ var _ = { cause: o + ',' + u, reach: j };
+ e(n, t, r, m.prev, y, _), l && _.reach > l.reach && (l.reach = _.reach);
+ }
+ }
+ }
+ }
+ }
+ })(e, a, n, a.head, 0),
+ (function (e) {
+ var n = [],
+ t = e.head.next;
+ for (; t !== e.tail; ) n.push(t.value), (t = t.next);
+ return n;
+ })(a)
+ );
+ },
+ hooks: {
+ all: {},
+ add: function (e, n) {
+ var t = M.hooks.all;
+ (t[e] = t[e] || []), t[e].push(n);
+ },
+ run: function (e, n) {
+ var t = M.hooks.all[e];
+ if (t && t.length) for (var r, a = 0; (r = t[a++]); ) r(n);
+ }
+ },
+ Token: W
+ };
+ function W(e, n, t, r) {
+ (this.type = e), (this.content = n), (this.alias = t), (this.length = 0 | (r || '').length);
+ }
+ function z(e, n, t, r) {
+ e.lastIndex = n;
+ var a = e.exec(t);
+ if (a && r && a[1]) {
+ var i = a[1].length;
+ (a.index += i), (a[0] = a[0].slice(i));
+ }
+ return a;
+ }
+ function i() {
+ var e = { value: null, prev: null, next: null },
+ n = { value: null, prev: e, next: null };
+ (e.next = n), (this.head = e), (this.tail = n), (this.length = 0);
+ }
+ function I(e, n, t) {
+ var r = n.next,
+ a = { value: t, prev: n, next: r };
+ return (n.next = a), (r.prev = a), e.length++, a;
+ }
+ function q(e, n, t) {
+ for (var r = n.next, a = 0; a < t && r !== e.tail; a++) r = r.next;
+ ((n.next = r).prev = n), (e.length -= a);
+ }
+ if (
+ ((u.Prism = M),
+ (W.stringify = function n(e, t) {
+ if ('string' == typeof e) return e;
+ if (Array.isArray(e)) {
+ var r = '';
+ return (
+ e.forEach(function (e) {
+ r += n(e, t);
+ }),
+ r
+ );
+ }
+ var a = {
+ type: e.type,
+ content: n(e.content, t),
+ tag: 'span',
+ classes: ['token', e.type],
+ attributes: {},
+ language: t
+ },
+ i = e.alias;
+ i && (Array.isArray(i) ? Array.prototype.push.apply(a.classes, i) : a.classes.push(i)),
+ M.hooks.run('wrap', a);
+ var l = '';
+ for (var o in a.attributes)
+ l += ' ' + o + '="' + (a.attributes[o] || '').replace(/"/g, '"') + '"';
+ return (
+ '<' +
+ a.tag +
+ ' class="' +
+ a.classes.join(' ') +
+ '"' +
+ l +
+ '>' +
+ a.content +
+ '' +
+ a.tag +
+ '>'
+ );
+ }),
+ !u.document)
+ )
+ return (
+ u.addEventListener &&
+ (M.disableWorkerMessageHandler ||
+ u.addEventListener(
+ 'message',
+ function (e) {
+ var n = JSON.parse(e.data),
+ t = n.language,
+ r = n.code,
+ a = n.immediateClose;
+ u.postMessage(M.highlight(r, M.languages[t], t)), a && u.close();
+ },
+ !1
+ )),
+ M
+ );
+ var r = M.util.currentScript();
+ function a() {
+ M.manual || M.highlightAll();
+ }
+ if (
+ (r && ((M.filename = r.src), r.hasAttribute('data-manual') && (M.manual = !0)), !M.manual)
+ ) {
+ var l = document.readyState;
+ 'loading' === l || ('interactive' === l && r && r.defer)
+ ? document.addEventListener('DOMContentLoaded', a)
+ : window.requestAnimationFrame
+ ? window.requestAnimationFrame(a)
+ : window.setTimeout(a, 16);
+ }
+ return M;
+ })(_self);
+'undefined' != typeof module && module.exports && (module.exports = Prism),
+ 'undefined' != typeof global && (global.Prism = Prism);
+(Prism.languages.markup = {
+ comment: { pattern: //, greedy: !0 },
+ prolog: { pattern: /<\?[\s\S]+?\?>/, greedy: !0 },
+ doctype: {
+ pattern:
+ /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,
+ greedy: !0,
+ inside: {
+ 'internal-subset': {
+ pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
+ lookbehind: !0,
+ greedy: !0,
+ inside: null
+ },
+ string: { pattern: /"[^"]*"|'[^']*'/, greedy: !0 },
+ punctuation: /^$|[[\]]/,
+ 'doctype-tag': /^DOCTYPE/i,
+ name: /[^\s<>'"]+/
+ }
+ },
+ cdata: { pattern: //i, greedy: !0 },
+ tag: {
+ pattern:
+ /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
+ greedy: !0,
+ inside: {
+ tag: {
+ pattern: /^<\/?[^\s>\/]+/,
+ inside: { punctuation: /^<\/?/, namespace: /^[^\s>\/:]+:/ }
+ },
+ 'special-attr': [],
+ 'attr-value': {
+ pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
+ inside: { punctuation: [{ pattern: /^=/, alias: 'attr-equals' }, /"|'/] }
+ },
+ punctuation: /\/?>/,
+ 'attr-name': { pattern: /[^\s>\/]+/, inside: { namespace: /^[^\s>\/:]+:/ } }
+ }
+ },
+ entity: [{ pattern: /&[\da-z]{1,8};/i, alias: 'named-entity' }, /?[\da-f]{1,8};/i]
+}),
+ (Prism.languages.markup.tag.inside['attr-value'].inside.entity = Prism.languages.markup.entity),
+ (Prism.languages.markup.doctype.inside['internal-subset'].inside = Prism.languages.markup),
+ Prism.hooks.add('wrap', function (a) {
+ 'entity' === a.type && (a.attributes.title = a.content.replace(/&/, '&'));
+ }),
+ Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {
+ value: function (a, e) {
+ var s = {};
+ (s['language-' + e] = {
+ pattern: /(^$)/i,
+ lookbehind: !0,
+ inside: Prism.languages[e]
+ }),
+ (s.cdata = /^$/i);
+ var t = { 'included-cdata': { pattern: //i, inside: s } };
+ t['language-' + e] = { pattern: /[\s\S]+/, inside: Prism.languages[e] };
+ var n = {};
+ (n[a] = {
+ pattern: RegExp(
+ '(<__[^>]*>)(?:))*\\]\\]>|(?!)'.replace(
+ /__/g,
+ function () {
+ return a;
+ }
+ ),
+ 'i'
+ ),
+ lookbehind: !0,
+ greedy: !0,
+ inside: t
+ }),
+ Prism.languages.insertBefore('markup', 'cdata', n);
+ }
+ }),
+ Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', {
+ value: function (a, e) {
+ Prism.languages.markup.tag.inside['special-attr'].push({
+ pattern: RegExp(
+ '(^|["\'\\s])(?:' + a + ')\\s*=\\s*(?:"[^"]*"|\'[^\']*\'|[^\\s\'">=]+(?=[\\s>]))',
+ 'i'
+ ),
+ lookbehind: !0,
+ inside: {
+ 'attr-name': /^[^\s=]+/,
+ 'attr-value': {
+ pattern: /=[\s\S]+/,
+ inside: {
+ value: {
+ pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
+ lookbehind: !0,
+ alias: [e, 'language-' + e],
+ inside: Prism.languages[e]
+ },
+ punctuation: [{ pattern: /^=/, alias: 'attr-equals' }, /"|'/]
+ }
+ }
+ }
+ });
+ }
+ }),
+ (Prism.languages.html = Prism.languages.markup),
+ (Prism.languages.mathml = Prism.languages.markup),
+ (Prism.languages.svg = Prism.languages.markup),
+ (Prism.languages.xml = Prism.languages.extend('markup', {})),
+ (Prism.languages.ssml = Prism.languages.xml),
+ (Prism.languages.atom = Prism.languages.xml),
+ (Prism.languages.rss = Prism.languages.xml);
+!(function (s) {
+ var e = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;
+ (s.languages.css = {
+ comment: /\/\*[\s\S]*?\*\//,
+ atrule: {
+ pattern: /@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,
+ inside: {
+ rule: /^@[\w-]+/,
+ 'selector-function-argument': {
+ pattern:
+ /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
+ lookbehind: !0,
+ alias: 'selector'
+ },
+ keyword: { pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, lookbehind: !0 }
+ }
+ },
+ url: {
+ pattern: RegExp('\\burl\\((?:' + e.source + '|(?:[^\\\\\r\n()"\']|\\\\[^])*)\\)', 'i'),
+ greedy: !0,
+ inside: {
+ function: /^url/i,
+ punctuation: /^\(|\)$/,
+ string: { pattern: RegExp('^' + e.source + '$'), alias: 'url' }
+ }
+ },
+ selector: {
+ pattern: RegExp(
+ '(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + e.source + ')*(?=\\s*\\{)'
+ ),
+ lookbehind: !0
+ },
+ string: { pattern: e, greedy: !0 },
+ property: {
+ pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
+ lookbehind: !0
+ },
+ important: /!important\b/i,
+ function: { pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i, lookbehind: !0 },
+ punctuation: /[(){};:,]/
+ }),
+ (s.languages.css.atrule.inside.rest = s.languages.css);
+ var t = s.languages.markup;
+ t && (t.tag.addInlined('style', 'css'), t.tag.addAttribute('style', 'css'));
+})(Prism);
+Prism.languages.clike = {
+ comment: [
+ { pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, lookbehind: !0, greedy: !0 },
+ { pattern: /(^|[^\\:])\/\/.*/, lookbehind: !0, greedy: !0 }
+ ],
+ string: { pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, greedy: !0 },
+ 'class-name': {
+ pattern:
+ /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
+ lookbehind: !0,
+ inside: { punctuation: /[.\\]/ }
+ },
+ keyword:
+ /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
+ boolean: /\b(?:false|true)\b/,
+ function: /\b\w+(?=\()/,
+ number: /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
+ operator: /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
+ punctuation: /[{}[\];(),.:]/
+};
+(Prism.languages.javascript = Prism.languages.extend('clike', {
+ 'class-name': [
+ Prism.languages.clike['class-name'],
+ {
+ pattern:
+ /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
+ lookbehind: !0
+ }
+ ],
+ keyword: [
+ { pattern: /((?:^|\})\s*)catch\b/, lookbehind: !0 },
+ {
+ pattern:
+ /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
+ lookbehind: !0
+ }
+ ],
+ function:
+ /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
+ number: {
+ pattern: RegExp(
+ '(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])'
+ ),
+ lookbehind: !0
+ },
+ operator:
+ /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
+})),
+ (Prism.languages.javascript['class-name'][0].pattern =
+ /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/),
+ Prism.languages.insertBefore('javascript', 'keyword', {
+ regex: {
+ pattern:
+ /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,
+ lookbehind: !0,
+ greedy: !0,
+ inside: {
+ 'regex-source': {
+ pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
+ lookbehind: !0,
+ alias: 'language-regex',
+ inside: Prism.languages.regex
+ },
+ 'regex-delimiter': /^\/|\/$/,
+ 'regex-flags': /^[a-z]+$/
+ }
+ },
+ 'function-variable': {
+ pattern:
+ /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
+ alias: 'function'
+ },
+ parameter: [
+ {
+ pattern:
+ /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
+ lookbehind: !0,
+ inside: Prism.languages.javascript
+ },
+ {
+ pattern:
+ /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
+ lookbehind: !0,
+ inside: Prism.languages.javascript
+ },
+ {
+ pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
+ lookbehind: !0,
+ inside: Prism.languages.javascript
+ },
+ {
+ pattern:
+ /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
+ lookbehind: !0,
+ inside: Prism.languages.javascript
+ }
+ ],
+ constant: /\b[A-Z](?:[A-Z_]|\dx?)*\b/
+ }),
+ Prism.languages.insertBefore('javascript', 'string', {
+ hashbang: { pattern: /^#!.*/, greedy: !0, alias: 'comment' },
+ 'template-string': {
+ pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
+ greedy: !0,
+ inside: {
+ 'template-punctuation': { pattern: /^`|`$/, alias: 'string' },
+ interpolation: {
+ pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
+ lookbehind: !0,
+ inside: {
+ 'interpolation-punctuation': { pattern: /^\$\{|\}$/, alias: 'punctuation' },
+ rest: Prism.languages.javascript
+ }
+ },
+ string: /[\s\S]+/
+ }
+ },
+ 'string-property': {
+ pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
+ lookbehind: !0,
+ greedy: !0,
+ alias: 'property'
+ }
+ }),
+ Prism.languages.insertBefore('javascript', 'operator', {
+ 'literal-property': {
+ pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
+ lookbehind: !0,
+ alias: 'property'
+ }
+ }),
+ Prism.languages.markup &&
+ (Prism.languages.markup.tag.addInlined('script', 'javascript'),
+ Prism.languages.markup.tag.addAttribute(
+ 'on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)',
+ 'javascript'
+ )),
+ (Prism.languages.js = Prism.languages.javascript);
diff --git a/Overlay/src/lib/js/spark_websocket.js b/Overlay/src/lib/js/spark_websocket.js
index f4fc4e9..f9b1a80 100644
--- a/Overlay/src/lib/js/spark_websocket.js
+++ b/Overlay/src/lib/js/spark_websocket.js
@@ -1,79 +1,79 @@
import ReconnectingWebSocket from 'reconnecting-websocket';
-import {WebSocket} from "ws";
+import { WebSocket } from 'ws';
const options = {
- WebSocket: WebSocket, // custom WebSocket constructor
- connectionTimeout: 1000,
- maxRetries: 10,
+ WebSocket: WebSocket, // custom WebSocket constructor
+ connectionTimeout: 1000,
+ maxRetries: 10
};
export class SparkWebsocket {
- ws;
- callbacks = {};
- initialized = false;
+ ws;
+ callbacks = {};
+ initialized = false;
- constructor() {
- this.ws = new ReconnectingWebSocket("ws://127.0.0.1:6725", [], options);
- this.ws.addEventListener("message", event => {
- this.processMessage(event);
- });
- this.ws.addEventListener("open", event => {
- this.connect(event);
- this.initialized = true;
- });
- }
+ constructor() {
+ this.ws = new ReconnectingWebSocket('ws://127.0.0.1:6725', [], options);
+ this.ws.addEventListener('message', (event) => {
+ this.processMessage(event);
+ });
+ this.ws.addEventListener('open', (event) => {
+ this.connect(event);
+ this.initialized = true;
+ });
+ }
- close() {
- if (this) {
- this.ws.close();
- this.initialized = false;
- }
- }
+ close() {
+ if (this) {
+ this.ws.close();
+ this.initialized = false;
+ }
+ }
- subscribe(eventType, callback) {
- if (callback === null) return;
- if (this.callbacks[eventType] === undefined) {
- this.callbacks[eventType] = [];
- }
- this.callbacks[eventType].push(callback)
- if (this.initialized) {
- this.ws.send("subscribe:" + eventType);
- }
- }
+ subscribe(eventType, callback) {
+ if (callback === null) return;
+ if (this.callbacks[eventType] === undefined) {
+ this.callbacks[eventType] = [];
+ }
+ this.callbacks[eventType].push(callback);
+ if (this.initialized) {
+ this.ws.send('subscribe:' + eventType);
+ }
+ }
- unsubscribe(eventType, callback) {
- if (this.callbacks[eventType] === undefined) {
- this.callbacks[eventType] = [];
- }
- if (callback == null) {
- this.callbacks[eventType] = [];
- } else {
- this.callbacks[eventType].pop(callback)
- }
- if (this.initialized) {
- this.ws.send("unsubscribe:" + eventType);
- }
- }
+ unsubscribe(eventType, callback) {
+ if (this.callbacks[eventType] === undefined) {
+ this.callbacks[eventType] = [];
+ }
+ if (callback == null) {
+ this.callbacks[eventType] = [];
+ } else {
+ this.callbacks[eventType].pop(callback);
+ }
+ if (this.initialized) {
+ this.ws.send('unsubscribe:' + eventType);
+ }
+ }
- connect(event) {
- for (const [key, value] of Object.entries(this.callbacks)) {
- this.ws.send("subscribe:" + key)
- }
- }
+ connect(event) {
+ for (const [key, value] of Object.entries(this.callbacks)) {
+ this.ws.send('subscribe:' + key);
+ }
+ }
- processMessage(event) {
- // split the message header from the rest of the json
- let parts = event.data.split(/:(.+)/)
+ processMessage(event) {
+ // split the message header from the rest of the json
+ let parts = event.data.split(/:(.+)/);
- // if the message didn't have a header properly
- if (parts.length !== 3) return;
+ // if the message didn't have a header properly
+ if (parts.length !== 3) return;
- if (parts[0] === "subscribe") {
- console.log("Subscribed: " + parts[1]);
- }
+ if (parts[0] === 'subscribe') {
+ console.log('Subscribed: ' + parts[1]);
+ }
- if (this.callbacks[parts[0]] !== undefined) {
- this.callbacks[parts[0]].forEach(c => c(JSON.parse(parts[1])));
- }
- }
-}
\ No newline at end of file
+ if (this.callbacks[parts[0]] !== undefined) {
+ this.callbacks[parts[0]].forEach((c) => c(JSON.parse(parts[1])));
+ }
+ }
+}
diff --git a/Overlay/src/lib/js/stores.ts b/Overlay/src/lib/js/stores.ts
index 0312cfe..ed686b6 100644
--- a/Overlay/src/lib/js/stores.ts
+++ b/Overlay/src/lib/js/stores.ts
@@ -1,102 +1,105 @@
-import {readable, derived, writable} from 'svelte/store';
-import {empty_frame, empty_last_score} from "./empty_frame";
-import {SparkWebsocket} from './spark_websocket.js';
-
+import { readable, derived, writable } from 'svelte/store';
+import { empty_frame, empty_last_score } from './empty_frame';
+import { SparkWebsocket } from './spark_websocket.js';
export const frame = readable(empty_frame, function start(set) {
- let sw = new SparkWebsocket();
- sw.subscribe("frame_10hz", data => {
- if (data) {
- clockRunning = gameClock - data['game_clock'] > .001;
- lastClock = data['game_clock'];
- gameClock = data['game_clock'];
- }
- set(data);
- });
-
- return function stop() {
- sw.close();
- }
+ let sw = new SparkWebsocket();
+ sw.subscribe('frame_10hz', (data) => {
+ if (data) {
+ clockRunning = gameClock - data['game_clock'] > 0.001;
+ lastClock = data['game_clock'];
+ gameClock = data['game_clock'];
+ }
+ set(data);
+ });
+
+ return function stop() {
+ sw.close();
+ };
});
-export const mathematical_time = derived(frame, $frame =>
- gameClock - (Math.ceil(Math.abs($frame['orange_score'] - $frame['blue_score']) / 3) * 20 - 20)
+export const mathematical_time = derived(
+ frame,
+ ($frame) =>
+ gameClock - (Math.ceil(Math.abs($frame['orange_score'] - $frame['blue_score']) / 3) * 20 - 20)
);
let lastClock = 0;
let gameClock = 0;
let clockRunning = false;
-export const game_clock_display = readable("-- : --", function start(set) {
-
- const interval = setInterval(() => {
- if (clockRunning) {
- lastClock -= .033;
- if (lastClock < 0) lastClock = 0;
- }
-
- let minutes = Math.trunc(lastClock / 60);
- let seconds = Math.trunc(lastClock % 60);
- let milliseconds = Math.trunc((lastClock - Math.trunc(lastClock)) * 100);
- set(`${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}.${String(milliseconds).padStart(2, '0')}`);
- }, 33);
-
- return function stop() {
- clearInterval(interval);
- };
+export const game_clock_display = readable('-- : --', function start(set) {
+ const interval = setInterval(() => {
+ if (clockRunning) {
+ lastClock -= 0.033;
+ if (lastClock < 0) lastClock = 0;
+ }
+
+ let minutes = Math.trunc(lastClock / 60);
+ let seconds = Math.trunc(lastClock % 60);
+ let milliseconds = Math.trunc((lastClock - Math.trunc(lastClock)) * 100);
+ set(
+ `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}.${String(
+ milliseconds
+ ).padStart(2, '0')}`
+ );
+ }, 33);
+
+ return function stop() {
+ clearInterval(interval);
+ };
});
-
export const last_score = readable(empty_last_score, function start(set) {
- let sw = new SparkWebsocket();
- sw.subscribe("goal", data => {
- set(data);
- });
-
- return function stop() {
- sw.close();
- }
+ let sw = new SparkWebsocket();
+ sw.subscribe('goal', (data) => {
+ set(data);
+ });
+
+ return function stop() {
+ sw.close();
+ };
});
export const overlay_config = writable(null, function start(set) {
- let sw = new SparkWebsocket();
- sw.subscribe("overlay_config", data => {
- set(data);
- });
-
- return function stop() {
- sw.close();
- }
+ let sw = new SparkWebsocket();
+ sw.subscribe('overlay_config', (data) => {
+ set(data);
+ });
+
+ return function stop() {
+ sw.close();
+ };
});
export const event_log = readable(null, function start(set) {
- let sw = new SparkWebsocket();
- sw.subscribe("event_log", data => {
- set(data);
- });
-
- return function stop() {
- sw.close();
- }
+ let sw = new SparkWebsocket();
+ sw.subscribe('event_log', (data) => {
+ set(data);
+ });
+
+ return function stop() {
+ sw.close();
+ };
});
export const pause = readable(null, function start(set) {
- let sw = new SparkWebsocket();
- sw.subscribe("pause", data => {
- set(data);
- });
-
- return function stop() {
- sw.close();
- }
+ let sw = new SparkWebsocket();
+ sw.subscribe('pause', (data) => {
+ set(data);
+ });
+
+ return function stop() {
+ sw.close();
+ };
});
export const joust = readable(null, function start(set) {
- let sw = new SparkWebsocket();
- sw.subscribe("joust", data => {
- set(data);
- });
-
- return function stop() {
- sw.close();
- }
-});
\ No newline at end of file
+ let sw = new SparkWebsocket();
+ sw.subscribe('joust', (data) => {
+ set(data);
+ });
+
+ return function stop() {
+ sw.close();
+ };
+});
diff --git a/Overlay/src/lib/js/util.js b/Overlay/src/lib/js/util.js
index b2effbb..8017843 100644
--- a/Overlay/src/lib/js/util.js
+++ b/Overlay/src/lib/js/util.js
@@ -1,7 +1,7 @@
export function httpGetAsync(theUrl, callback = null, failCallback = null) {
fetch(theUrl)
- .then(ret => ret.text())
- .then(ret => {
+ .then((ret) => ret.text())
+ .then((ret) => {
if (callback !== null) {
callback(ret);
}
@@ -15,10 +15,10 @@
export function httpPostAsync(theUrl, body, callback = null, failCallback = null) {
fetch(theUrl, {
- method: "POST",
- headers: {'Content-Type': 'application/json'},
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body)
- }).then(res => {
+ }).then((res) => {
if (callback != null) {
callback(res);
}
@@ -29,21 +29,21 @@ export function toMinutesString(seconds) {
const mins = seconds / 60;
let secs = Math.floor(seconds % 60);
if (secs < 10) {
- secs = "0" + secs;
+ secs = '0' + secs;
}
- return Math.floor(mins) + ":" + secs;
+ return Math.floor(mins) + ':' + secs;
}
export function write(className, data) {
if (data === undefined || data == null || data.toString() === 'undefined') {
- data = "";
+ data = '';
}
const elements = document.getElementsByClassName(className);
- Array.from(elements).forEach(e => {
+ Array.from(elements).forEach((e) => {
e.innerHTML = data;
- if (data === "") {
- e.style.opacity = "0";
+ if (data === '') {
+ e.style.opacity = '0';
} else {
e.style.opacity = 1;
e.classList.remove('hide');
@@ -53,14 +53,14 @@ export function write(className, data) {
export function writeText(className, data) {
if (data === undefined || data == null || data.toString() === 'undefined') {
- data = "";
+ data = '';
}
const elements = document.getElementsByClassName(className);
- Array.from(elements).forEach(e => {
+ Array.from(elements).forEach((e) => {
e.innerText = data;
- if (data === "") {
- e.style.opacity = "0";
+ if (data === '') {
+ e.style.opacity = '0';
} else {
e.style.opacity = 1;
e.classList.remove('hide');
@@ -72,7 +72,7 @@ export function writeHREF(className, data) {
if (data === undefined || data === null || data.includes('undefined')) return;
const elements = document.getElementsByClassName(className);
- Array.from(elements).forEach(e => {
+ Array.from(elements).forEach((e) => {
e.href = data;
e.style.opacity = 1;
e.classList.remove('hide');
@@ -83,7 +83,7 @@ export function writeValue(className, data) {
if (data === undefined || data === null || data.includes('undefined')) return;
const elements = document.getElementsByClassName(className);
- Array.from(elements).forEach(e => {
+ Array.from(elements).forEach((e) => {
e.value = data;
e.style.opacity = 1;
e.classList.remove('hide');
@@ -92,11 +92,11 @@ export function writeValue(className, data) {
export function writeTextValue(className, data) {
if (data === undefined || data === null || data.includes('undefined')) {
- data = "";
+ data = '';
}
const elements = document.getElementsByClassName(className);
- Array.from(elements).forEach(e => {
+ Array.from(elements).forEach((e) => {
e.value = data;
e.style.opacity = 1;
e.classList.remove('hide');
@@ -108,7 +108,7 @@ export function writeValueId(idName, data) {
const e = document.getElementById(idName);
e.value = data;
- e.style.opacity = "1";
+ e.style.opacity = '1';
e.classList.remove('hide');
}
@@ -116,7 +116,7 @@ export function writeChecked(className, data) {
if (data === undefined) return;
const elements = document.getElementsByClassName(className);
- Array.from(elements).forEach(e => {
+ Array.from(elements).forEach((e) => {
e.checked = data;
e.style.opacity = 1;
e.classList.remove('hide');
@@ -124,16 +124,17 @@ export function writeChecked(className, data) {
}
export function writeSrc(className, src_) {
- if (src_ === undefined || src_ === "" || src_ === null) {
- src_ = "";
+ if (src_ === undefined || src_ === '' || src_ === null) {
+ src_ = '';
}
const elements = document.getElementsByClassName(className);
- Array.from(elements).forEach(e => {
+ Array.from(elements).forEach((e) => {
e.src = src_;
- if (src_ === "") {
- e.style.opacity = "0";
- e.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
+ if (src_ === '') {
+ e.style.opacity = '0';
+ e.src =
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
} else {
e.style.opacity = 1;
e.classList.remove('hide');
@@ -142,15 +143,15 @@ export function writeSrc(className, src_) {
}
export function setImage(className, src_) {
- if (src_ === undefined || src_ === "" || src_ === null) {
- src_ = "";
+ if (src_ === undefined || src_ === '' || src_ === null) {
+ src_ = '';
}
const elements = document.getElementsByClassName(className);
- Array.from(elements).forEach(e => {
+ Array.from(elements).forEach((e) => {
e.src = src_;
- if (src_ === "") {
- e.style.opacity = "0";
+ if (src_ === '') {
+ e.style.opacity = '0';
} else {
e.style.opacity = 1;
e.classList.remove('hide');
@@ -162,4 +163,4 @@ export function removeAllChildNodes(parent) {
while (parent.firstChild) {
parent.removeChild(parent.firstChild);
}
-}
\ No newline at end of file
+}
diff --git a/Overlay/src/routes/(bulma)/+layout.svelte b/Overlay/src/routes/(bulma)/+layout.svelte
index 939ff1f..a2794e7 100644
--- a/Overlay/src/routes/(bulma)/+layout.svelte
+++ b/Overlay/src/routes/(bulma)/+layout.svelte
@@ -1,40 +1,38 @@
-
-
+
-
+ body {
+ font-family: 'Inconsolata', monospace;
+ }
-
+ h1 {
+ font-size: 2em;
+ }
-
\ No newline at end of file
+ .content ul li {
+ list-style: none;
+ margin-top: 2em;
+ }
+
diff --git a/Overlay/src/routes/(bulma)/+page.svelte b/Overlay/src/routes/(bulma)/+page.svelte
index 88aa86c..534f332 100644
--- a/Overlay/src/routes/(bulma)/+page.svelte
+++ b/Overlay/src/routes/(bulma)/+page.svelte
@@ -2,64 +2,31 @@
Spark
-
-
Spark
-
+
- Spark is a Windows desktop program that can
- record, process, and upload EchoVR data from either a local EchoVR client or an Oculus Quest on the
- same network. Check out the Echopedia
- page for a full list of features.
+ Spark is a Windows desktop program that
+ can record, process, and upload EchoVR data from either a local EchoVR client or an Oculus
+ Quest on the same network. Check out the
+ Echopedia page for a full list
+ of features.
- The stuff hosted here can be used to control various aspects of Spark, for overlays in OBS, or to make
- it easier to create your own overlays using data generated by Spark.
+ The stuff hosted here can be used to control various aspects of Spark, for overlays in OBS,
+ or to make it easier to create your own overlays using data generated by Spark.
-
\ No newline at end of file
+
+
+
diff --git a/Overlay/src/routes/(bulma)/api/+page.svelte b/Overlay/src/routes/(bulma)/api/+page.svelte
index ab034a6..a795ca4 100644
--- a/Overlay/src/routes/(bulma)/api/+page.svelte
+++ b/Overlay/src/routes/(bulma)/api/+page.svelte
@@ -1,56 +1,59 @@
-
- Match Setup
-
-
-
-
-
-
-
-
-
-
Spark API
-
-
- The Spark API can be used to control various aspects of Spark using 3rd party tools such as AutoHotKey
- or get data from the game for your own custom overlays or tools.
-
+
+ Match Setup
+
+
+
-
-
+
+
+
+
Spark API
+
+
+ The Spark API can be used to control various aspects of Spark using 3rd party tools such as
+ AutoHotKey or get data from the game for your own custom overlays or tools.
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/Overlay/src/routes/(bulma)/local_database/+page.svelte b/Overlay/src/routes/(bulma)/local_database/+page.svelte
index bd05412..8c17f12 100644
--- a/Overlay/src/routes/(bulma)/local_database/+page.svelte
+++ b/Overlay/src/routes/(bulma)/local_database/+page.svelte
@@ -1,180 +1,175 @@
+
+
- Local Database
+ Local Database
-
-
-
+
-
-
-
-
-
-
Refresh
-
-
-
-
Jousts
-
Limited to the last 1,000 jousts for performance.
-
-
-
- Match Time
- Session ID
- Game Clock
- Player Name
- Type
- Time
- Max Speed
- Tube Exit Speed
-
-
-
- {#each jousts as joust}
-
- {joust['match_time']}
- {joust['session_id'].substring(0, 3)}
- ...{joust['session_id'].substring(joust['session_id'].length - 3)}
- {joust['game_clock'].toFixed(2)} s
- {joust['player_name']}
- {#if joust['event_type'] === 'defensive_joust'}
- {#if joust['other_player_name'] === 'orange'}
- Defensive
- {:else if joust['other_player_name'] === 'blue'}
- Defensive
- {:else}
- Defensive
- {/if}
- {:else if joust['event_type'] === 'joust_speed'}
- Neutral
- {:else}
- {joust['event_type']}
- {/if}
- {joust['z2'].toFixed(2)} s
- {joust['x2'].toFixed(1)} m/s
- {joust['y2'].toFixed(1)} m/s
-
- {/each}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
All Events
-
Limited to the last 1,000 events for performance.
-
-
-
- Match Time
- Session ID
- Game Clock
- Type
- Player Name
- Other Player Name
-
-
-
- {#each events as e}
-
- {e['match_time']}
- {e['session_id'].substring(0, 3)}
- ...{e['session_id'].substring(e['session_id'].length - 3)}
- {e['game_clock'].toFixed(2)} s
- {e['event_type']}
- {e['player_name']}
- {e['other_player_name']}
-
- {/each}
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
Refresh
+
+
+
+
Jousts
+
Limited to the last 1,000 jousts for performance.
+
+
+
+ Match Time
+ Session ID
+ Game Clock
+ Player Name
+ Type
+ Time
+ Max Speed
+ Tube Exit Speed
+
+
+
+ {#each jousts as joust}
+
+ {joust['match_time']}
+ {joust['session_id'].substring(0, 3)}
+ ...{joust['session_id'].substring(joust['session_id'].length - 3)}
+ {joust['game_clock'].toFixed(2)} s
+ {joust['player_name']}
+ {#if joust['event_type'] === 'defensive_joust'}
+ {#if joust['other_player_name'] === 'orange'}
+ Defensive
+ {:else if joust['other_player_name'] === 'blue'}
+ Defensive
+ {:else}
+ Defensive
+ {/if}
+ {:else if joust['event_type'] === 'joust_speed'}
+ Neutral
+ {:else}
+ {joust['event_type']}
+ {/if}
+ {joust['z2'].toFixed(2)} s
+ {joust['x2'].toFixed(1)} m/s
+ {joust['y2'].toFixed(1)} m/s
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
All Events
+
Limited to the last 1,000 events for performance.
+
+
+
+ Match Time
+ Session ID
+ Game Clock
+ Type
+ Player Name
+ Other Player Name
+
+
+
+ {#each events as e}
+
+ {e['match_time']}
+ {e['session_id'].substring(0, 3)}
+ ...{e['session_id'].substring(e['session_id'].length - 3)}
+ {e['game_clock'].toFixed(2)} s
+ {e['event_type']}
+ {e['player_name']}
+ {e['other_player_name']}
+
+ {/each}
+
+
+
+
+
+
diff --git a/Overlay/src/routes/(bulma)/overlays/+page.svelte b/Overlay/src/routes/(bulma)/overlays/+page.svelte
index 2c5b45f..131937f 100644
--- a/Overlay/src/routes/(bulma)/overlays/+page.svelte
+++ b/Overlay/src/routes/(bulma)/overlays/+page.svelte
@@ -29,7 +29,10 @@
-
A scene collection with these overlays has already been added to OBS. You can also add these URLs as browser sources to your streaming software yourself.
+
+ A scene collection with these overlays has already been added to OBS. You can also add these
+ URLs as browser sources to your streaming software yourself.
+
/branding Several examples of acceptable attribution. You
diff --git a/Overlay/src/routes/(bulma)/overlays/match_setup/+page.svelte b/Overlay/src/routes/(bulma)/overlays/match_setup/+page.svelte
index 08f70b2..119b109 100644
--- a/Overlay/src/routes/(bulma)/overlays/match_setup/+page.svelte
+++ b/Overlay/src/routes/(bulma)/overlays/match_setup/+page.svelte
@@ -1,341 +1,379 @@
+
+
- Match Setup
+ Match Setup
-
-
+
+
-
-
+
+
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
Overlay Configuration
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Update
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
Overlay Configuration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Update
+
+
+
-
-
+
diff --git a/Overlay/src/routes/(bulma)/websockets/+page.svelte b/Overlay/src/routes/(bulma)/websockets/+page.svelte
index 0e4a718..fd9ab48 100644
--- a/Overlay/src/routes/(bulma)/websockets/+page.svelte
+++ b/Overlay/src/routes/(bulma)/websockets/+page.svelte
@@ -1,68 +1,68 @@
-
- Spark Websocket API
-
-
-
-
-
-
-
-
+
+ Spark Websocket API
-
+
+
+
+
+
+
+
+
-
-
-
+
+ This API allows you to subscribe to any number of events and immediately get a custom json
+ response back with information about that event. This is more efficient and more responsive than
+ a polling-based approach, and it makes organization much simpler. Without this feature, event
+ detection and parsing would have to happen in the browser, but Spark already does this, so why
+ not share the data.
-
- This API allows you to subscribe to any number of events and immediately get a custom json response back with
- information about that event. This is more efficient and more responsive than a polling-based approach, and it
- makes organization much simpler. Without this feature, event detection and parsing would have to happen in the
- browser, but Spark already does this, so why not share the data.
+
+
List of available events:
+
+ goal
+ save
+ steal
+ stun
+ joust
+ pause
+ joined_game
+ left_game
+ frame_1hz
+ frame_10hz
+ frame_30hz
+
+
+ List of events that immediately respond with the current state, then send updates on change:
+
+
-
-
List of available events:
-
- goal
- save
- steal
- stun
- joust
- pause
- joined_game
- left_game
- frame_1hz
- frame_10hz
- frame_30hz
-
-
List of events that immediately respond with the current state, then send updates on change:
-
+
Usage:
+
+ Add this code to the bottom of your <body> tag in your .html file. Instead of
+ console.log(), modify the visibility or content of various elements on your page.
+
-
Usage:
-
Add this code to the bottom of your <body> tag in your .html file. Instead of console.log(), modify the
- visibility or content of various elements on your page.
-
-
{`
+ {`
`}
-
-
+`}
+
+
+
diff --git a/Overlay/src/routes/(overlays)/+layout.svelte b/Overlay/src/routes/(overlays)/+layout.svelte
index 9920ac1..5c69032 100644
--- a/Overlay/src/routes/(overlays)/+layout.svelte
+++ b/Overlay/src/routes/(overlays)/+layout.svelte
@@ -1,5 +1,6 @@
-
-
-
\ No newline at end of file
diff --git a/Overlay/src/routes/(overlays)/branding/+page.svelte b/Overlay/src/routes/(overlays)/branding/+page.svelte
index d3b8d08..2a51da9 100644
--- a/Overlay/src/routes/(overlays)/branding/+page.svelte
+++ b/Overlay/src/routes/(overlays)/branding/+page.svelte
@@ -1,170 +1,166 @@
- IgniteVR Metrics Branding
+ IgniteVR Metrics Branding
+
+
+ IgniteVR Metrics Branding. Use these (or your own) before, during, or after the scoreboard
+ overlays provided by Ignite.
+
+
+ Import this page as a browser source in OBS, then crop to choose the one you want.
+
+
+
+
+
Powered By
+
+
IgniteVR Metrics
+
+
+
+
Powered By
+
+
IgniteVR Metrics
+
+
+
+
Powered By
+
+
IgniteVR Metrics
+
+
+
+
Powered By
+
+
IgniteVR Metrics
+
+
+
+
Powered By
+
+
IgniteVR Metrics
+
+
+
+
-
-
-
-
IgniteVR Metrics Branding. Use these (or your own) before, during, or after the
- scoreboard overlays provided
- by Ignite.
-
-
- Import this page as a browser source in OBS, then crop to choose the one you want.
-
-
-
-
-
-
Powered By
-
-
IgniteVR Metrics
-
-
-
-
Powered By
-
-
IgniteVR Metrics
-
-
-
-
-
Powered By
-
-
IgniteVR Metrics
-
-
-
-
-
Powered By
-
-
IgniteVR Metrics
-
-
-
-
Powered By
-
-
IgniteVR Metrics
-
-
-
-
\ No newline at end of file
diff --git a/Overlay/src/routes/(overlays)/components/compact_main_banner/+page.svelte b/Overlay/src/routes/(overlays)/components/compact_main_banner/+page.svelte
index c8f4683..e45c5c3 100644
--- a/Overlay/src/routes/(overlays)/components/compact_main_banner/+page.svelte
+++ b/Overlay/src/routes/(overlays)/components/compact_main_banner/+page.svelte
@@ -1,13 +1,11 @@
-
- Compact Main Banner Overlay
-
-
+
+ Compact Main Banner Overlay
+
-
-
\ No newline at end of file
+
+
diff --git a/Overlay/src/routes/(overlays)/components/compact_minimap/+page.svelte b/Overlay/src/routes/(overlays)/components/compact_minimap/+page.svelte
index c74989a..3db7a97 100644
--- a/Overlay/src/routes/(overlays)/components/compact_minimap/+page.svelte
+++ b/Overlay/src/routes/(overlays)/components/compact_minimap/+page.svelte
@@ -1,23 +1,22 @@
-
- Compact Minimap Overlay
-
-
+
+ Compact Minimap Overlay
+
-
-
\ No newline at end of file
+
+
diff --git a/Overlay/src/routes/(overlays)/components/events/+page.svelte b/Overlay/src/routes/(overlays)/components/events/+page.svelte
index c6ccd0c..cd91801 100644
--- a/Overlay/src/routes/(overlays)/components/events/+page.svelte
+++ b/Overlay/src/routes/(overlays)/components/events/+page.svelte
@@ -6,4 +6,4 @@
Event Log
-
+
diff --git a/Overlay/src/routes/(overlays)/components/minimap/+page.svelte b/Overlay/src/routes/(overlays)/components/minimap/+page.svelte
index 627a0bf..59bccef 100644
--- a/Overlay/src/routes/(overlays)/components/minimap/+page.svelte
+++ b/Overlay/src/routes/(overlays)/components/minimap/+page.svelte
@@ -1,23 +1,22 @@
-
- Minimap Overlay
-
-
-
+
+ Minimap Overlay
+
-
-
\ No newline at end of file
+
+
diff --git a/Overlay/src/routes/(overlays)/configurable_overlay_movable/+page.svelte b/Overlay/src/routes/(overlays)/configurable_overlay_movable/+page.svelte
index b4d1e9d..5ba9403 100644
--- a/Overlay/src/routes/(overlays)/configurable_overlay_movable/+page.svelte
+++ b/Overlay/src/routes/(overlays)/configurable_overlay_movable/+page.svelte
@@ -1,120 +1,133 @@
-
-
- {#if config && config['visibility']}
- {#if config['visibility']['main_banner']}
-
-
-
- {/if}
-
- {#if config['visibility']['player_rosters']}
-
-
-
- {/if}
-
- {#if config['visibility']['player_rosters']}
-
-
-
- {/if}
-
+
+ {#if config && config['visibility']}
+ {#if config['visibility']['main_banner']}
+
+
+
+ {/if}
- {#if config['visibility']['minimap']}
-
-
-
- {/if}
+ {#if config['visibility']['player_rosters']}
+
+
+
+ {/if}
+ {#if config['visibility']['player_rosters']}
+
+
+
+ {/if}
- {#if config['visibility']['compact_minimap']}
-
-
-
- {/if}
+ {#if config['visibility']['minimap']}
+
+
+
+ {/if}
- {#if config['visibility']['event_log']}
-
-
-
- {/if}
- {/if}
-
+ {#if config['visibility']['compact_minimap']}
+
+
+
+ {/if}
+ {#if config['visibility']['event_log']}
+
+
+
+ {/if}
+ {/if}
+
diff --git a/Overlay/src/routes/(overlays)/depth_events/+page.svelte b/Overlay/src/routes/(overlays)/depth_events/+page.svelte
index 7cde8c2..939cf34 100644
--- a/Overlay/src/routes/(overlays)/depth_events/+page.svelte
+++ b/Overlay/src/routes/(overlays)/depth_events/+page.svelte
@@ -1,12 +1,11 @@
+
+ Minimap Overlay
+
-
-
\ No newline at end of file
+
+
diff --git a/Overlay/src/routes/(overlays)/playspace/+page.svelte b/Overlay/src/routes/(overlays)/playspace/+page.svelte
index 56a926a..5db58ca 100644
--- a/Overlay/src/routes/(overlays)/playspace/+page.svelte
+++ b/Overlay/src/routes/(overlays)/playspace/+page.svelte
@@ -1,14 +1,13 @@
-
- Minimap Overlay
-
+
+
+ Minimap Overlay
+
-
-
\ No newline at end of file
+
+
diff --git a/Overlay/src/routes/+layout.ts b/Overlay/src/routes/+layout.ts
index c7b59ce..1c6dd41 100644
--- a/Overlay/src/routes/+layout.ts
+++ b/Overlay/src/routes/+layout.ts
@@ -1,3 +1,3 @@
export const prerender = true;
// export const csr = false;
-export const ssr = false;
\ No newline at end of file
+export const ssr = false;
diff --git a/Overlay/static/compact_main_banner.html b/Overlay/static/compact_main_banner.html
index 6cb5425..61f4265 100644
--- a/Overlay/static/compact_main_banner.html
+++ b/Overlay/static/compact_main_banner.html
@@ -1,94 +1,84 @@
-
-
-
- Compact Main Banner
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
Compact Main Banner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
TEST GOAL TYPE
-
TEST_USER
+
+
+
+
+
+
+
+
TEST GOAL TYPE
+
TEST_USER
+
+
3
+
-
3
-
-
-
-
-
-
-
-
-
-
-
TEST GOAL TYPE
-
TEST_USER
+
+
+
+
+
+
+
TEST GOAL TYPE
+
TEST_USER
+
+
3
+
+
+
-
3
-
+
+
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+