From f5e8d0591f6ebcabe69729d7f9e1c1a90abb6857 Mon Sep 17 00:00:00 2001
From: geireann <geireann.lindfield@gmail.com>
Date: Fri, 12 Jul 2024 09:34:51 -0400
Subject: Fixed nested collections in templates. cleaned up some cod.e

---
 src/client/views/collections/CollectionCarousel3DView.tsx | 1 +
 1 file changed, 1 insertion(+)

(limited to 'src/client/views/collections/CollectionCarousel3DView.tsx')

diff --git a/src/client/views/collections/CollectionCarousel3DView.tsx b/src/client/views/collections/CollectionCarousel3DView.tsx
index 27c85533f..38f681e87 100644
--- a/src/client/views/collections/CollectionCarousel3DView.tsx
+++ b/src/client/views/collections/CollectionCarousel3DView.tsx
@@ -17,6 +17,7 @@ import { FocusViewOptions } from '../nodes/FocusViewOptions';
 import './CollectionCarousel3DView.scss';
 import { CollectionSubView } from './CollectionSubView';
 
+// eslint-disable-next-line @typescript-eslint/no-var-requires
 const { CAROUSEL3D_CENTER_SCALE, CAROUSEL3D_SIDE_SCALE, CAROUSEL3D_TOP } = require('../global/globalCssVariables.module.scss');
 
 @observer
-- 
cgit v1.2.3-70-g09d2


From 31b1872be1e8d010d2cbe08e92c589505e86d293 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Mon, 22 Jul 2024 15:26:27 -0400
Subject: adding type fixes to avoid 'any's

---
 .env.swo                                           |  Bin 0 -> 12288 bytes
 .eslintrc.json                                     |    2 +-
 package-lock.json                                  | 1544 ++++++++++----------
 package.json                                       |    2 +-
 src/ClientUtils.ts                                 |   10 +-
 src/client/views/InkingStroke.tsx                  |   17 +-
 src/client/views/StyleProvider.tsx                 |    3 +-
 .../views/collections/CollectionCarousel3DView.tsx |   10 +-
 .../views/collections/CollectionDockingView.tsx    |    7 +-
 src/client/views/collections/CollectionSubView.tsx |    2 +-
 src/client/views/collections/TabDocView.tsx        |   13 +-
 src/client/views/collections/TreeView.tsx          |    8 +-
 .../CollectionFreeFormLayoutEngines.tsx            |   20 +-
 .../collectionFreeForm/CollectionFreeFormView.tsx  |   77 +-
 src/client/views/nodes/DocumentView.tsx            |   85 +-
 src/client/views/nodes/FieldView.tsx               |   26 +-
 .../views/nodes/RecordingBox/RecordingView.tsx     |   14 +-
 src/client/views/nodes/ScreenshotBox.tsx           |    1 -
 18 files changed, 938 insertions(+), 903 deletions(-)
 create mode 100644 .env.swo

(limited to 'src/client/views/collections/CollectionCarousel3DView.tsx')

diff --git a/.env.swo b/.env.swo
new file mode 100644
index 000000000..1a66a7865
Binary files /dev/null and b/.env.swo differ
diff --git a/.eslintrc.json b/.eslintrc.json
index 2e4da56b8..e0298fd5f 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -47,7 +47,7 @@
         "no-underscore-dangle": "off",
         "no-nested-ternary": "off",
         "lines-between-class-members": "off",
-        "no-explicit-any": "off",
+        "no-explicit-any": "on",
         // Note: you must disable the base rule as it can report incorrect errors
         "no-shadow": "off",
         "@typescript-eslint/no-shadow": "warn",
diff --git a/package-lock.json b/package-lock.json
index f11d8a462..0187d7952 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -101,7 +101,7 @@
                 "express-session": "^1.17.3",
                 "express-validator": "^7.0.1",
                 "extract-colors": "^4.0.2",
-                "ffmpeg": "0.0.4",
+                "ffmpeg": "^0.0.4",
                 "file-loader": "^6.2.0",
                 "file-saver": "^2.0.5",
                 "find-in-files": "^0.5.0",
@@ -541,9 +541,9 @@
             }
         },
         "node_modules/@azure/core-rest-pipeline": {
-            "version": "1.16.1",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.1.tgz",
-            "integrity": "sha512-ExPSbgjwCoht6kB7B4MeZoBAxcQSIl29r/bPeazZJx50ej4JJCByimLOrZoIsurISNyJQQHf30b3JfqC3Hb88A==",
+            "version": "1.16.2",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.2.tgz",
+            "integrity": "sha512-Hnhm/PG9/SQ07JJyLDv3l9Qr8V3xgAe1hFoBYzt6LaalMxfL/ZqFaZf/bz5VN3pMcleCPwl8ivlS2Fjxq/iC8Q==",
             "dependencies": {
                 "@azure/abort-controller": "^2.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -581,9 +581,9 @@
             }
         },
         "node_modules/@azure/core-util": {
-            "version": "1.9.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz",
-            "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==",
+            "version": "1.9.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.1.tgz",
+            "integrity": "sha512-OLsq0etbHO1MA7j6FouXFghuHrAFGk+5C1imcpQ2e+0oZhYF07WLA+NW2Vqs70R7d+zOAWiWM3tbE1sXcDN66g==",
             "dependencies": {
                 "@azure/abort-controller": "^2.0.0",
                 "tslib": "^2.6.2"
@@ -616,9 +616,9 @@
             }
         },
         "node_modules/@azure/logger": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.2.tgz",
-            "integrity": "sha512-l170uE7bsKpIU6B/giRc9i4NI0Mj+tANMMMxf7Zi/5cKzEqPayP7+X1WPrG7e+91JgY8N+7K7nF2WOi7iVhXvg==",
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.3.tgz",
+            "integrity": "sha512-J8/cIKNQB1Fc9fuYqBVnrppiUtW+5WWJPCj/tAokC5LdSTwkWWttN+jsRgw9BLYD7JDBx7PceiqOBxJJ1tQz3Q==",
             "dependencies": {
                 "tslib": "^2.6.2"
             },
@@ -662,29 +662,29 @@
             }
         },
         "node_modules/@babel/compat-data": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz",
-            "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==",
+            "version": "7.24.9",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz",
+            "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==",
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/core": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz",
-            "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==",
+            "version": "7.24.9",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz",
+            "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==",
             "peer": true,
             "dependencies": {
                 "@ampproject/remapping": "^2.2.0",
                 "@babel/code-frame": "^7.24.7",
-                "@babel/generator": "^7.24.7",
-                "@babel/helper-compilation-targets": "^7.24.7",
-                "@babel/helper-module-transforms": "^7.24.7",
-                "@babel/helpers": "^7.24.7",
-                "@babel/parser": "^7.24.7",
+                "@babel/generator": "^7.24.9",
+                "@babel/helper-compilation-targets": "^7.24.8",
+                "@babel/helper-module-transforms": "^7.24.9",
+                "@babel/helpers": "^7.24.8",
+                "@babel/parser": "^7.24.8",
                 "@babel/template": "^7.24.7",
-                "@babel/traverse": "^7.24.7",
-                "@babel/types": "^7.24.7",
+                "@babel/traverse": "^7.24.8",
+                "@babel/types": "^7.24.9",
                 "convert-source-map": "^2.0.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -700,11 +700,11 @@
             }
         },
         "node_modules/@babel/generator": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz",
-            "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==",
+            "version": "7.24.10",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz",
+            "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==",
             "dependencies": {
-                "@babel/types": "^7.24.7",
+                "@babel/types": "^7.24.9",
                 "@jridgewell/gen-mapping": "^0.3.5",
                 "@jridgewell/trace-mapping": "^0.3.25",
                 "jsesc": "^2.5.1"
@@ -737,13 +737,13 @@
             }
         },
         "node_modules/@babel/helper-compilation-targets": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz",
-            "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz",
+            "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==",
             "dependencies": {
-                "@babel/compat-data": "^7.24.7",
-                "@babel/helper-validator-option": "^7.24.7",
-                "browserslist": "^4.22.2",
+                "@babel/compat-data": "^7.24.8",
+                "@babel/helper-validator-option": "^7.24.8",
+                "browserslist": "^4.23.1",
                 "lru-cache": "^5.1.1",
                 "semver": "^6.3.1"
             },
@@ -752,14 +752,14 @@
             }
         },
         "node_modules/@babel/helper-create-class-features-plugin": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz",
-            "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz",
+            "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==",
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.24.7",
                 "@babel/helper-environment-visitor": "^7.24.7",
                 "@babel/helper-function-name": "^7.24.7",
-                "@babel/helper-member-expression-to-functions": "^7.24.7",
+                "@babel/helper-member-expression-to-functions": "^7.24.8",
                 "@babel/helper-optimise-call-expression": "^7.24.7",
                 "@babel/helper-replace-supers": "^7.24.7",
                 "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
@@ -839,12 +839,12 @@
             }
         },
         "node_modules/@babel/helper-member-expression-to-functions": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz",
-            "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
+            "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
             "dependencies": {
-                "@babel/traverse": "^7.24.7",
-                "@babel/types": "^7.24.7"
+                "@babel/traverse": "^7.24.8",
+                "@babel/types": "^7.24.8"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -863,9 +863,9 @@
             }
         },
         "node_modules/@babel/helper-module-transforms": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz",
-            "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==",
+            "version": "7.24.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz",
+            "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==",
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.24.7",
                 "@babel/helper-module-imports": "^7.24.7",
@@ -892,9 +892,9 @@
             }
         },
         "node_modules/@babel/helper-plugin-utils": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
-            "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+            "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
             "engines": {
                 "node": ">=6.9.0"
             }
@@ -967,9 +967,9 @@
             }
         },
         "node_modules/@babel/helper-string-parser": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz",
-            "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+            "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
             "engines": {
                 "node": ">=6.9.0"
             }
@@ -983,9 +983,9 @@
             }
         },
         "node_modules/@babel/helper-validator-option": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz",
-            "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+            "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
             "engines": {
                 "node": ">=6.9.0"
             }
@@ -1005,13 +1005,13 @@
             }
         },
         "node_modules/@babel/helpers": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz",
-            "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz",
+            "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==",
             "peer": true,
             "dependencies": {
                 "@babel/template": "^7.24.7",
-                "@babel/types": "^7.24.7"
+                "@babel/types": "^7.24.8"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1032,9 +1032,9 @@
             }
         },
         "node_modules/@babel/parser": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
-            "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz",
+            "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==",
             "bin": {
                 "parser": "bin/babel-parser.js"
             },
@@ -1451,15 +1451,15 @@
             }
         },
         "node_modules/@babel/plugin-transform-classes": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz",
-            "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz",
+            "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==",
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.24.7",
-                "@babel/helper-compilation-targets": "^7.24.7",
+                "@babel/helper-compilation-targets": "^7.24.8",
                 "@babel/helper-environment-visitor": "^7.24.7",
                 "@babel/helper-function-name": "^7.24.7",
-                "@babel/helper-plugin-utils": "^7.24.7",
+                "@babel/helper-plugin-utils": "^7.24.8",
                 "@babel/helper-replace-supers": "^7.24.7",
                 "@babel/helper-split-export-declaration": "^7.24.7",
                 "globals": "^11.1.0"
@@ -1495,11 +1495,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-destructuring": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz",
-            "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
+            "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.7"
+                "@babel/helper-plugin-utils": "^7.24.8"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1687,12 +1687,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-commonjs": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz",
-            "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
+            "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
             "dependencies": {
-                "@babel/helper-module-transforms": "^7.24.7",
-                "@babel/helper-plugin-utils": "^7.24.7",
+                "@babel/helper-module-transforms": "^7.24.8",
+                "@babel/helper-plugin-utils": "^7.24.8",
                 "@babel/helper-simple-access": "^7.24.7"
             },
             "engines": {
@@ -1841,11 +1841,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-optional-chaining": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz",
-            "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
+            "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.7",
+                "@babel/helper-plugin-utils": "^7.24.8",
                 "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
                 "@babel/plugin-syntax-optional-chaining": "^7.8.3"
             },
@@ -2064,11 +2064,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-typeof-symbol": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz",
-            "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
+            "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.7"
+                "@babel/helper-plugin-utils": "^7.24.8"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -2137,14 +2137,14 @@
             }
         },
         "node_modules/@babel/preset-env": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz",
-            "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==",
-            "dependencies": {
-                "@babel/compat-data": "^7.24.7",
-                "@babel/helper-compilation-targets": "^7.24.7",
-                "@babel/helper-plugin-utils": "^7.24.7",
-                "@babel/helper-validator-option": "^7.24.7",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz",
+            "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==",
+            "dependencies": {
+                "@babel/compat-data": "^7.24.8",
+                "@babel/helper-compilation-targets": "^7.24.8",
+                "@babel/helper-plugin-utils": "^7.24.8",
+                "@babel/helper-validator-option": "^7.24.8",
                 "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7",
                 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7",
                 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
@@ -2175,9 +2175,9 @@
                 "@babel/plugin-transform-block-scoping": "^7.24.7",
                 "@babel/plugin-transform-class-properties": "^7.24.7",
                 "@babel/plugin-transform-class-static-block": "^7.24.7",
-                "@babel/plugin-transform-classes": "^7.24.7",
+                "@babel/plugin-transform-classes": "^7.24.8",
                 "@babel/plugin-transform-computed-properties": "^7.24.7",
-                "@babel/plugin-transform-destructuring": "^7.24.7",
+                "@babel/plugin-transform-destructuring": "^7.24.8",
                 "@babel/plugin-transform-dotall-regex": "^7.24.7",
                 "@babel/plugin-transform-duplicate-keys": "^7.24.7",
                 "@babel/plugin-transform-dynamic-import": "^7.24.7",
@@ -2190,7 +2190,7 @@
                 "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
                 "@babel/plugin-transform-member-expression-literals": "^7.24.7",
                 "@babel/plugin-transform-modules-amd": "^7.24.7",
-                "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+                "@babel/plugin-transform-modules-commonjs": "^7.24.8",
                 "@babel/plugin-transform-modules-systemjs": "^7.24.7",
                 "@babel/plugin-transform-modules-umd": "^7.24.7",
                 "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
@@ -2200,7 +2200,7 @@
                 "@babel/plugin-transform-object-rest-spread": "^7.24.7",
                 "@babel/plugin-transform-object-super": "^7.24.7",
                 "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
-                "@babel/plugin-transform-optional-chaining": "^7.24.7",
+                "@babel/plugin-transform-optional-chaining": "^7.24.8",
                 "@babel/plugin-transform-parameters": "^7.24.7",
                 "@babel/plugin-transform-private-methods": "^7.24.7",
                 "@babel/plugin-transform-private-property-in-object": "^7.24.7",
@@ -2211,7 +2211,7 @@
                 "@babel/plugin-transform-spread": "^7.24.7",
                 "@babel/plugin-transform-sticky-regex": "^7.24.7",
                 "@babel/plugin-transform-template-literals": "^7.24.7",
-                "@babel/plugin-transform-typeof-symbol": "^7.24.7",
+                "@babel/plugin-transform-typeof-symbol": "^7.24.8",
                 "@babel/plugin-transform-unicode-escapes": "^7.24.7",
                 "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
                 "@babel/plugin-transform-unicode-regex": "^7.24.7",
@@ -2220,7 +2220,7 @@
                 "babel-plugin-polyfill-corejs2": "^0.4.10",
                 "babel-plugin-polyfill-corejs3": "^0.10.4",
                 "babel-plugin-polyfill-regenerator": "^0.6.1",
-                "core-js-compat": "^3.31.0",
+                "core-js-compat": "^3.37.1",
                 "semver": "^6.3.1"
             },
             "engines": {
@@ -2268,9 +2268,9 @@
             "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
         },
         "node_modules/@babel/runtime": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
-            "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz",
+            "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==",
             "dependencies": {
                 "regenerator-runtime": "^0.14.0"
             },
@@ -2279,9 +2279,9 @@
             }
         },
         "node_modules/@babel/runtime-corejs3": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.7.tgz",
-            "integrity": "sha512-eytSX6JLBY6PVAeQa2bFlDx/7Mmln/gaEpsit5a3WEvjGfiIytEsgAwuIXCPM0xvw0v0cJn3ilq0/TvXrW0kgA==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.8.tgz",
+            "integrity": "sha512-DXG/BhegtMHhnN7YPIvxWd303/9aXvYFD1TjNL3CD6tUrhI2LVsg3Lck0aql5TRH29n4sj3emcROypkZVUfSuA==",
             "dependencies": {
                 "core-js-pure": "^3.30.2",
                 "regenerator-runtime": "^0.14.0"
@@ -2304,18 +2304,18 @@
             }
         },
         "node_modules/@babel/traverse": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz",
-            "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==",
+            "version": "7.24.8",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz",
+            "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==",
             "dependencies": {
                 "@babel/code-frame": "^7.24.7",
-                "@babel/generator": "^7.24.7",
+                "@babel/generator": "^7.24.8",
                 "@babel/helper-environment-visitor": "^7.24.7",
                 "@babel/helper-function-name": "^7.24.7",
                 "@babel/helper-hoist-variables": "^7.24.7",
                 "@babel/helper-split-export-declaration": "^7.24.7",
-                "@babel/parser": "^7.24.7",
-                "@babel/types": "^7.24.7",
+                "@babel/parser": "^7.24.8",
+                "@babel/types": "^7.24.8",
                 "debug": "^4.3.1",
                 "globals": "^11.1.0"
             },
@@ -2332,11 +2332,11 @@
             }
         },
         "node_modules/@babel/types": {
-            "version": "7.24.7",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz",
-            "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==",
+            "version": "7.24.9",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz",
+            "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==",
             "dependencies": {
-                "@babel/helper-string-parser": "^7.24.7",
+                "@babel/helper-string-parser": "^7.24.8",
                 "@babel/helper-validator-identifier": "^7.24.7",
                 "to-fast-properties": "^2.0.0"
             },
@@ -2385,15 +2385,15 @@
             }
         },
         "node_modules/@emotion/babel-plugin": {
-            "version": "11.11.0",
-            "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
-            "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
+            "version": "11.12.0",
+            "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz",
+            "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==",
             "dependencies": {
                 "@babel/helper-module-imports": "^7.16.7",
                 "@babel/runtime": "^7.18.3",
-                "@emotion/hash": "^0.9.1",
-                "@emotion/memoize": "^0.8.1",
-                "@emotion/serialize": "^1.1.2",
+                "@emotion/hash": "^0.9.2",
+                "@emotion/memoize": "^0.9.0",
+                "@emotion/serialize": "^1.2.0",
                 "babel-plugin-macros": "^3.1.0",
                 "convert-source-map": "^1.5.0",
                 "escape-string-regexp": "^4.0.0",
@@ -2408,47 +2408,47 @@
             "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
         },
         "node_modules/@emotion/cache": {
-            "version": "11.11.0",
-            "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
-            "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
-            "dependencies": {
-                "@emotion/memoize": "^0.8.1",
-                "@emotion/sheet": "^1.2.2",
-                "@emotion/utils": "^1.2.1",
-                "@emotion/weak-memoize": "^0.3.1",
+            "version": "11.13.0",
+            "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.0.tgz",
+            "integrity": "sha512-hPV345J/tH0Cwk2wnU/3PBzORQ9HeX+kQSbwI+jslzpRCHE6fSGTohswksA/Ensr8znPzwfzKZCmAM9Lmlhp7g==",
+            "dependencies": {
+                "@emotion/memoize": "^0.9.0",
+                "@emotion/sheet": "^1.4.0",
+                "@emotion/utils": "^1.4.0",
+                "@emotion/weak-memoize": "^0.4.0",
                 "stylis": "4.2.0"
             }
         },
         "node_modules/@emotion/hash": {
-            "version": "0.9.1",
-            "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
-            "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+            "version": "0.9.2",
+            "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+            "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="
         },
         "node_modules/@emotion/is-prop-valid": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
-            "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz",
+            "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==",
             "dependencies": {
-                "@emotion/memoize": "^0.8.1"
+                "@emotion/memoize": "^0.9.0"
             }
         },
         "node_modules/@emotion/memoize": {
-            "version": "0.8.1",
-            "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
-            "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
+            "version": "0.9.0",
+            "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+            "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="
         },
         "node_modules/@emotion/react": {
-            "version": "11.11.4",
-            "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz",
-            "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==",
+            "version": "11.13.0",
+            "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz",
+            "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==",
             "dependencies": {
                 "@babel/runtime": "^7.18.3",
-                "@emotion/babel-plugin": "^11.11.0",
-                "@emotion/cache": "^11.11.0",
-                "@emotion/serialize": "^1.1.3",
-                "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
-                "@emotion/utils": "^1.2.1",
-                "@emotion/weak-memoize": "^0.3.1",
+                "@emotion/babel-plugin": "^11.12.0",
+                "@emotion/cache": "^11.13.0",
+                "@emotion/serialize": "^1.3.0",
+                "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
+                "@emotion/utils": "^1.4.0",
+                "@emotion/weak-memoize": "^0.4.0",
                 "hoist-non-react-statics": "^3.3.1"
             },
             "peerDependencies": {
@@ -2461,33 +2461,33 @@
             }
         },
         "node_modules/@emotion/serialize": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz",
-            "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==",
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz",
+            "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==",
             "dependencies": {
-                "@emotion/hash": "^0.9.1",
-                "@emotion/memoize": "^0.8.1",
-                "@emotion/unitless": "^0.8.1",
-                "@emotion/utils": "^1.2.1",
+                "@emotion/hash": "^0.9.2",
+                "@emotion/memoize": "^0.9.0",
+                "@emotion/unitless": "^0.9.0",
+                "@emotion/utils": "^1.4.0",
                 "csstype": "^3.0.2"
             }
         },
         "node_modules/@emotion/sheet": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
-            "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
+            "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="
         },
         "node_modules/@emotion/styled": {
-            "version": "11.11.5",
-            "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz",
-            "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==",
+            "version": "11.13.0",
+            "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz",
+            "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==",
             "dependencies": {
                 "@babel/runtime": "^7.18.3",
-                "@emotion/babel-plugin": "^11.11.0",
-                "@emotion/is-prop-valid": "^1.2.2",
-                "@emotion/serialize": "^1.1.4",
-                "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
-                "@emotion/utils": "^1.2.1"
+                "@emotion/babel-plugin": "^11.12.0",
+                "@emotion/is-prop-valid": "^1.3.0",
+                "@emotion/serialize": "^1.3.0",
+                "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
+                "@emotion/utils": "^1.4.0"
             },
             "peerDependencies": {
                 "@emotion/react": "^11.0.0-rc.0",
@@ -2506,27 +2506,27 @@
             "peer": true
         },
         "node_modules/@emotion/unitless": {
-            "version": "0.8.1",
-            "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
-            "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+            "version": "0.9.0",
+            "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz",
+            "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ=="
         },
         "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
-            "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz",
+            "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==",
             "peerDependencies": {
                 "react": ">=16.8.0"
             }
         },
         "node_modules/@emotion/utils": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
-            "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz",
+            "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ=="
         },
         "node_modules/@emotion/weak-memoize": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
-            "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
+            "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="
         },
         "node_modules/@eslint-community/eslint-utils": {
             "version": "4.4.0",
@@ -2634,9 +2634,9 @@
             }
         },
         "node_modules/@eslint/js": {
-            "version": "9.6.0",
-            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.6.0.tgz",
-            "integrity": "sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==",
+            "version": "9.7.0",
+            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz",
+            "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==",
             "dev": true,
             "engines": {
                 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2670,29 +2670,29 @@
             }
         },
         "node_modules/@floating-ui/core": {
-            "version": "1.6.4",
-            "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz",
-            "integrity": "sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==",
+            "version": "1.6.5",
+            "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.5.tgz",
+            "integrity": "sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==",
             "dependencies": {
-                "@floating-ui/utils": "^0.2.4"
+                "@floating-ui/utils": "^0.2.5"
             }
         },
         "node_modules/@floating-ui/dom": {
-            "version": "1.6.7",
-            "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz",
-            "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==",
+            "version": "1.6.8",
+            "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.8.tgz",
+            "integrity": "sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==",
             "dependencies": {
                 "@floating-ui/core": "^1.6.0",
-                "@floating-ui/utils": "^0.2.4"
+                "@floating-ui/utils": "^0.2.5"
             }
         },
         "node_modules/@floating-ui/react": {
-            "version": "0.26.19",
-            "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.19.tgz",
-            "integrity": "sha512-Jk6zITdjjIvjO/VdQFvpRaD3qPwOHH6AoDHxjhpy+oK4KFgaSP871HYWUAPdnLmx1gQ+w/pB312co3tVml+BXA==",
+            "version": "0.26.20",
+            "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.20.tgz",
+            "integrity": "sha512-RixKJJG92fcIsVoqrFr4Onpzh7hlOx4U7NV4aLhMLmtvjZ5oTB/WzXaANYUZATKqXvvW7t9sCxtzejip26N5Ag==",
             "dependencies": {
                 "@floating-ui/react-dom": "^2.1.1",
-                "@floating-ui/utils": "^0.2.4",
+                "@floating-ui/utils": "^0.2.5",
                 "tabbable": "^6.0.0"
             },
             "peerDependencies": {
@@ -2713,9 +2713,9 @@
             }
         },
         "node_modules/@floating-ui/utils": {
-            "version": "0.2.4",
-            "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz",
-            "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA=="
+            "version": "0.2.5",
+            "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.5.tgz",
+            "integrity": "sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ=="
         },
         "node_modules/@formatjs/ecma402-abstract": {
             "version": "2.0.0",
@@ -2762,57 +2762,52 @@
             }
         },
         "node_modules/@fortawesome/fontawesome-common-types": {
-            "version": "6.5.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz",
-            "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==",
-            "hasInstallScript": true,
+            "version": "6.6.0",
+            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz",
+            "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==",
             "engines": {
                 "node": ">=6"
             }
         },
         "node_modules/@fortawesome/fontawesome-svg-core": {
-            "version": "6.5.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz",
-            "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==",
-            "hasInstallScript": true,
+            "version": "6.6.0",
+            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz",
+            "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==",
             "dependencies": {
-                "@fortawesome/fontawesome-common-types": "6.5.2"
+                "@fortawesome/fontawesome-common-types": "6.6.0"
             },
             "engines": {
                 "node": ">=6"
             }
         },
         "node_modules/@fortawesome/free-brands-svg-icons": {
-            "version": "6.5.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.2.tgz",
-            "integrity": "sha512-zi5FNYdmKLnEc0jc0uuHH17kz/hfYTg4Uei0wMGzcoCL/4d3WM3u1VMc0iGGa31HuhV5i7ZK8ZlTCQrHqRHSGQ==",
-            "hasInstallScript": true,
+            "version": "6.6.0",
+            "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.6.0.tgz",
+            "integrity": "sha512-1MPD8lMNW/earme4OQi1IFHtmHUwAKgghXlNwWi9GO7QkTfD+IIaYpIai4m2YJEzqfEji3jFHX1DZI5pbY/biQ==",
             "dependencies": {
-                "@fortawesome/fontawesome-common-types": "6.5.2"
+                "@fortawesome/fontawesome-common-types": "6.6.0"
             },
             "engines": {
                 "node": ">=6"
             }
         },
         "node_modules/@fortawesome/free-regular-svg-icons": {
-            "version": "6.5.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.2.tgz",
-            "integrity": "sha512-iabw/f5f8Uy2nTRtJ13XZTS1O5+t+anvlamJ3zJGLEVE2pKsAWhPv2lq01uQlfgCX7VaveT3EVs515cCN9jRbw==",
-            "hasInstallScript": true,
+            "version": "6.6.0",
+            "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.6.0.tgz",
+            "integrity": "sha512-Yv9hDzL4aI73BEwSEh20clrY8q/uLxawaQ98lekBx6t9dQKDHcDzzV1p2YtBGTtolYtNqcWdniOnhzB+JPnQEQ==",
             "dependencies": {
-                "@fortawesome/fontawesome-common-types": "6.5.2"
+                "@fortawesome/fontawesome-common-types": "6.6.0"
             },
             "engines": {
                 "node": ">=6"
             }
         },
         "node_modules/@fortawesome/free-solid-svg-icons": {
-            "version": "6.5.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz",
-            "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==",
-            "hasInstallScript": true,
+            "version": "6.6.0",
+            "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz",
+            "integrity": "sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA==",
             "dependencies": {
-                "@fortawesome/fontawesome-common-types": "6.5.2"
+                "@fortawesome/fontawesome-common-types": "6.6.0"
             },
             "engines": {
                 "node": ">=6"
@@ -2831,30 +2826,30 @@
             }
         },
         "node_modules/@fullcalendar/core": {
-            "version": "6.1.14",
-            "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.14.tgz",
-            "integrity": "sha512-hIPRBevm0aMc2aHy1hRIJgXmI1QTvQM1neQa9oxtuqUmF1+ApYC3oAdwcQMTuI7lHHw3pKJDyJFkKLPPnL6HXA==",
+            "version": "6.1.15",
+            "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.15.tgz",
+            "integrity": "sha512-BuX7o6ALpLb84cMw1FCB9/cSgF4JbVO894cjJZ6kP74jzbUZNjtwffwRdA+Id8rrLjT30d/7TrkW90k4zbXB5Q==",
             "dependencies": {
                 "preact": "~10.12.1"
             }
         },
         "node_modules/@fullcalendar/daygrid": {
-            "version": "6.1.14",
-            "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.14.tgz",
-            "integrity": "sha512-DSyjiA1dEM8k3bOCrZpZOmAOZu71KGtH02ze+4QKuhxkmn/zQghmmLRdfzpOrcyJg6xGKkoB4pBcO+2lXar8XQ==",
+            "version": "6.1.15",
+            "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.15.tgz",
+            "integrity": "sha512-j8tL0HhfiVsdtOCLfzK2J0RtSkiad3BYYemwQKq512cx6btz6ZZ2RNc/hVnIxluuWFyvx5sXZwoeTJsFSFTEFA==",
             "peerDependencies": {
-                "@fullcalendar/core": "~6.1.14"
+                "@fullcalendar/core": "~6.1.15"
             }
         },
         "node_modules/@fullcalendar/multimonth": {
-            "version": "6.1.14",
-            "resolved": "https://registry.npmjs.org/@fullcalendar/multimonth/-/multimonth-6.1.14.tgz",
-            "integrity": "sha512-el2vbZZgTkdufgOvRxqx61czjRMfEK50449g4SkqbagtS3ITNMAv84KHFcsbXVbd9Nh3UhbXDuYZuzJZpvY7mQ==",
+            "version": "6.1.15",
+            "resolved": "https://registry.npmjs.org/@fullcalendar/multimonth/-/multimonth-6.1.15.tgz",
+            "integrity": "sha512-sEZY6jbOYkeF9TwhUldG+UUVv+hiPlGkS8zZEgPR7ypcjhipyA03c5rPjx7N6huOHqh6lCMH59zlohLooQRlaw==",
             "dependencies": {
-                "@fullcalendar/daygrid": "~6.1.14"
+                "@fullcalendar/daygrid": "~6.1.15"
             },
             "peerDependencies": {
-                "@fullcalendar/core": "~6.1.14"
+                "@fullcalendar/core": "~6.1.15"
             }
         },
         "node_modules/@googlemaps/js-api-loader": {
@@ -3717,9 +3712,9 @@
             }
         },
         "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
-            "version": "7.6.2",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -3777,57 +3772,26 @@
             }
         },
         "node_modules/@mongodb-js/saslprep": {
-            "version": "1.1.7",
-            "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz",
-            "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==",
+            "version": "1.1.8",
+            "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz",
+            "integrity": "sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==",
             "dependencies": {
                 "sparse-bitfield": "^3.0.3"
             }
         },
-        "node_modules/@mui/base": {
-            "version": "5.0.0-beta.40",
-            "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz",
-            "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==",
-            "dependencies": {
-                "@babel/runtime": "^7.23.9",
-                "@floating-ui/react-dom": "^2.0.8",
-                "@mui/types": "^7.2.14",
-                "@mui/utils": "^5.15.14",
-                "@popperjs/core": "^2.11.8",
-                "clsx": "^2.1.0",
-                "prop-types": "^15.8.1"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/mui-org"
-            },
-            "peerDependencies": {
-                "@types/react": "^17.0.0 || ^18.0.0",
-                "react": "^17.0.0 || ^18.0.0",
-                "react-dom": "^17.0.0 || ^18.0.0"
-            },
-            "peerDependenciesMeta": {
-                "@types/react": {
-                    "optional": true
-                }
-            }
-        },
         "node_modules/@mui/core-downloads-tracker": {
-            "version": "5.16.0",
-            "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.0.tgz",
-            "integrity": "sha512-8SLffXYPRVpcZx5QzxNE8fytTqzp+IuU3deZbQWg/vSaTlDpR5YVrQ4qQtXTi5cRdhOufV5INylmwlKK+//nPw==",
+            "version": "5.16.4",
+            "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.4.tgz",
+            "integrity": "sha512-rNdHXhclwjEZnK+//3SR43YRx0VtjdHnUFhMSGYmAMJve+KiwEja/41EYh8V3pZKqF2geKyfcFUenTfDTYUR4w==",
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/mui-org"
             }
         },
         "node_modules/@mui/icons-material": {
-            "version": "5.16.0",
-            "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.0.tgz",
-            "integrity": "sha512-6ISoOhkp9w5gD0PEW9JklrcbyARDkFWNTBdwXZ1Oy5IGlyu9B0zG0hnUIe4H17IaF1Vgj6C8VI+v4tkSdK0veg==",
+            "version": "5.16.4",
+            "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.4.tgz",
+            "integrity": "sha512-j9/CWctv6TH6Dou2uR2EH7UOgu79CW/YcozxCYVLJ7l03pCsiOlJ5sBArnWJxJ+nGkFwyL/1d1k8JEPMDR125A==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9"
             },
@@ -3850,21 +3814,21 @@
             }
         },
         "node_modules/@mui/material": {
-            "version": "5.16.0",
-            "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.0.tgz",
-            "integrity": "sha512-DbR1NckTLpjt9Zut9EGQ70th86HfN0BYQgyYro6aXQrNfjzSwe3BJS1AyBQ5mJ7TdL6YVRqohfukxj9JlqZZUg==",
+            "version": "5.16.4",
+            "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.4.tgz",
+            "integrity": "sha512-dBnh3/zRYgEVIS3OE4oTbujse3gifA0qLMmuUk13ywsDCbngJsdgwW5LuYeiT5pfA8PGPGSqM7mxNytYXgiMCw==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
-                "@mui/base": "5.0.0-beta.40",
-                "@mui/core-downloads-tracker": "^5.16.0",
-                "@mui/system": "^5.16.0",
-                "@mui/types": "^7.2.14",
-                "@mui/utils": "^5.16.0",
+                "@mui/core-downloads-tracker": "^5.16.4",
+                "@mui/system": "^5.16.4",
+                "@mui/types": "^7.2.15",
+                "@mui/utils": "^5.16.4",
+                "@popperjs/core": "^2.11.8",
                 "@types/react-transition-group": "^4.4.10",
                 "clsx": "^2.1.0",
                 "csstype": "^3.1.3",
                 "prop-types": "^15.8.1",
-                "react-is": "^18.2.0",
+                "react-is": "^18.3.1",
                 "react-transition-group": "^4.4.5"
             },
             "engines": {
@@ -3894,12 +3858,12 @@
             }
         },
         "node_modules/@mui/private-theming": {
-            "version": "5.16.0",
-            "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.0.tgz",
-            "integrity": "sha512-sYpubkO1MZOnxNyVOClrPNOTs0MfuRVVnAvCeMaOaXt6GimgQbnUcshYv2pSr6PFj+Mqzdff/FYOBceK8u5QgA==",
+            "version": "5.16.4",
+            "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.4.tgz",
+            "integrity": "sha512-ZsAm8cq31SJ37SVWLRlu02v9SRthxnfQofaiv14L5Bht51B0dz6yQEoVU/V8UduZDCCIrWkBHuReVfKhE/UuXA==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
-                "@mui/utils": "^5.16.0",
+                "@mui/utils": "^5.16.4",
                 "prop-types": "^15.8.1"
             },
             "engines": {
@@ -3920,9 +3884,9 @@
             }
         },
         "node_modules/@mui/styled-engine": {
-            "version": "5.15.14",
-            "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz",
-            "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==",
+            "version": "5.16.4",
+            "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.4.tgz",
+            "integrity": "sha512-0+mnkf+UiAmTVB8PZFqOhqf729Yh0Cxq29/5cA3VAyDVTRIUUQ8FXQhiAhUIbijFmM72rY80ahFPXIm4WDbzcA==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
                 "@emotion/cache": "^11.11.0",
@@ -3951,15 +3915,15 @@
             }
         },
         "node_modules/@mui/system": {
-            "version": "5.16.0",
-            "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.0.tgz",
-            "integrity": "sha512-9YbkC2m3+pNumAvubYv+ijLtog6puJ0fJ6rYfzfLCM47pWrw3m+30nXNM8zMgDaKL6vpfWJcCXm+LPaWBpy7sw==",
+            "version": "5.16.4",
+            "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.4.tgz",
+            "integrity": "sha512-ET1Ujl2/8hbsD611/mqUuNArMCGv/fIWO/f8B3ZqF5iyPHM2aS74vhTNyjytncc4i6dYwGxNk+tLa7GwjNS0/w==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
-                "@mui/private-theming": "^5.16.0",
-                "@mui/styled-engine": "^5.15.14",
-                "@mui/types": "^7.2.14",
-                "@mui/utils": "^5.16.0",
+                "@mui/private-theming": "^5.16.4",
+                "@mui/styled-engine": "^5.16.4",
+                "@mui/types": "^7.2.15",
+                "@mui/utils": "^5.16.4",
                 "clsx": "^2.1.0",
                 "csstype": "^3.1.3",
                 "prop-types": "^15.8.1"
@@ -3990,9 +3954,9 @@
             }
         },
         "node_modules/@mui/types": {
-            "version": "7.2.14",
-            "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz",
-            "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==",
+            "version": "7.2.15",
+            "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz",
+            "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==",
             "peerDependencies": {
                 "@types/react": "^17.0.0 || ^18.0.0"
             },
@@ -4003,14 +3967,15 @@
             }
         },
         "node_modules/@mui/utils": {
-            "version": "5.16.0",
-            "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.0.tgz",
-            "integrity": "sha512-kLLi5J1xY+mwtUlMb8Ubdxf4qFAA1+U7WPBvjM/qQ4CIwLCohNb0sHo1oYPufjSIH/Z9+dhVxD7dJlfGjd1AVA==",
+            "version": "5.16.4",
+            "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.4.tgz",
+            "integrity": "sha512-nlppYwq10TBIFqp7qxY0SvbACOXeOjeVL3pOcDsK0FT8XjrEXh9/+lkg8AEIzD16z7YfiJDQjaJG2OLkE7BxNg==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
-                "@types/prop-types": "^15.7.11",
+                "@types/prop-types": "^15.7.12",
+                "clsx": "^2.1.1",
                 "prop-types": "^15.8.1",
-                "react-is": "^18.2.0"
+                "react-is": "^18.3.1"
             },
             "engines": {
                 "node": ">=12.0.0"
@@ -4117,9 +4082,9 @@
             "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg=="
         },
         "node_modules/@octokit/request": {
-            "version": "9.1.1",
-            "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.1.tgz",
-            "integrity": "sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==",
+            "version": "9.1.3",
+            "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz",
+            "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==",
             "dependencies": {
                 "@octokit/endpoint": "^10.0.0",
                 "@octokit/request-error": "^6.0.1",
@@ -4131,9 +4096,9 @@
             }
         },
         "node_modules/@octokit/request-error": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.1.tgz",
-            "integrity": "sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==",
+            "version": "6.1.4",
+            "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.4.tgz",
+            "integrity": "sha512-VpAhIUxwhWZQImo/dWAN/NpPqqojR6PSLgLYAituLM6U+ddx9hCioFGwBr5Mi+oi5CLeJkcAs3gJ0PYYzU6wUg==",
             "dependencies": {
                 "@octokit/types": "^13.0.0"
             },
@@ -6150,25 +6115,25 @@
             }
         },
         "node_modules/@react-spring/animated": {
-            "version": "9.7.3",
-            "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz",
-            "integrity": "sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==",
+            "version": "9.7.4",
+            "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.4.tgz",
+            "integrity": "sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ==",
             "dependencies": {
-                "@react-spring/shared": "~9.7.3",
-                "@react-spring/types": "~9.7.3"
+                "@react-spring/shared": "~9.7.4",
+                "@react-spring/types": "~9.7.4"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
             }
         },
         "node_modules/@react-spring/core": {
-            "version": "9.7.3",
-            "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.3.tgz",
-            "integrity": "sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==",
+            "version": "9.7.4",
+            "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.4.tgz",
+            "integrity": "sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw==",
             "dependencies": {
-                "@react-spring/animated": "~9.7.3",
-                "@react-spring/shared": "~9.7.3",
-                "@react-spring/types": "~9.7.3"
+                "@react-spring/animated": "~9.7.4",
+                "@react-spring/shared": "~9.7.4",
+                "@react-spring/types": "~9.7.4"
             },
             "funding": {
                 "type": "opencollective",
@@ -6178,31 +6143,37 @@
                 "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
             }
         },
+        "node_modules/@react-spring/rafz": {
+            "version": "9.7.4",
+            "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.4.tgz",
+            "integrity": "sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA=="
+        },
         "node_modules/@react-spring/shared": {
-            "version": "9.7.3",
-            "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.3.tgz",
-            "integrity": "sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==",
+            "version": "9.7.4",
+            "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.4.tgz",
+            "integrity": "sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w==",
             "dependencies": {
-                "@react-spring/types": "~9.7.3"
+                "@react-spring/rafz": "~9.7.4",
+                "@react-spring/types": "~9.7.4"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
             }
         },
         "node_modules/@react-spring/types": {
-            "version": "9.7.3",
-            "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.3.tgz",
-            "integrity": "sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw=="
+            "version": "9.7.4",
+            "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.4.tgz",
+            "integrity": "sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g=="
         },
         "node_modules/@react-spring/web": {
-            "version": "9.7.3",
-            "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.3.tgz",
-            "integrity": "sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==",
+            "version": "9.7.4",
+            "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.4.tgz",
+            "integrity": "sha512-UMvCZp7I5HCVIleSa4BwbNxynqvj+mJjG2m20VO2yPoi2pnCYANy58flvz9v/YcXTAvsmL655FV3pm5fbr6akA==",
             "dependencies": {
-                "@react-spring/animated": "~9.7.3",
-                "@react-spring/core": "~9.7.3",
-                "@react-spring/shared": "~9.7.3",
-                "@react-spring/types": "~9.7.3"
+                "@react-spring/animated": "~9.7.4",
+                "@react-spring/core": "~9.7.4",
+                "@react-spring/shared": "~9.7.4",
+                "@react-spring/types": "~9.7.4"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
@@ -7169,9 +7140,9 @@
             }
         },
         "node_modules/@swc/helpers": {
-            "version": "0.5.11",
-            "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz",
-            "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==",
+            "version": "0.5.12",
+            "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz",
+            "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==",
             "dependencies": {
                 "tslib": "^2.4.0"
             }
@@ -8025,25 +7996,6 @@
                 "url": "https://opencollective.com/turf"
             }
         },
-        "node_modules/@turf/line-overlap/node_modules/deep-equal": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
-            "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
-            "dependencies": {
-                "is-arguments": "^1.1.1",
-                "is-date-object": "^1.0.5",
-                "is-regex": "^1.1.4",
-                "object-is": "^1.1.5",
-                "object-keys": "^1.1.1",
-                "regexp.prototype.flags": "^1.5.1"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
         "node_modules/@turf/line-segment": {
             "version": "6.5.0",
             "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz",
@@ -9448,11 +9400,26 @@
             }
         },
         "node_modules/@types/lodash": {
-            "version": "4.17.6",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz",
-            "integrity": "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==",
+            "version": "4.17.7",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz",
+            "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==",
             "dev": true
         },
+        "node_modules/@types/mapbox__point-geometry": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz",
+            "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA=="
+        },
+        "node_modules/@types/mapbox__vector-tile": {
+            "version": "1.3.4",
+            "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz",
+            "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==",
+            "dependencies": {
+                "@types/geojson": "*",
+                "@types/mapbox__point-geometry": "*",
+                "@types/pbf": "*"
+            }
+        },
         "node_modules/@types/mapbox-gl": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-3.1.0.tgz",
@@ -9493,9 +9460,9 @@
             "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
         },
         "node_modules/@types/node": {
-            "version": "20.14.10",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
-            "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
+            "version": "20.14.11",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz",
+            "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==",
             "dependencies": {
                 "undici-types": "~5.26.4"
             }
@@ -9593,6 +9560,11 @@
                 "@types/passport": "*"
             }
         },
+        "node_modules/@types/pbf": {
+            "version": "3.0.5",
+            "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz",
+            "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA=="
+        },
         "node_modules/@types/pdf-parse": {
             "version": "1.1.4",
             "resolved": "https://registry.npmjs.org/@types/pdf-parse/-/pdf-parse-1.1.4.tgz",
@@ -9915,9 +9887,9 @@
             }
         },
         "node_modules/@types/ws": {
-            "version": "8.5.10",
-            "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
-            "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
+            "version": "8.5.11",
+            "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.11.tgz",
+            "integrity": "sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*"
@@ -9943,16 +9915,16 @@
             "dev": true
         },
         "node_modules/@typescript-eslint/eslint-plugin": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz",
-            "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz",
+            "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/regexpp": "^4.10.0",
-                "@typescript-eslint/scope-manager": "7.16.0",
-                "@typescript-eslint/type-utils": "7.16.0",
-                "@typescript-eslint/utils": "7.16.0",
-                "@typescript-eslint/visitor-keys": "7.16.0",
+                "@typescript-eslint/scope-manager": "7.16.1",
+                "@typescript-eslint/type-utils": "7.16.1",
+                "@typescript-eslint/utils": "7.16.1",
+                "@typescript-eslint/visitor-keys": "7.16.1",
                 "graphemer": "^1.4.0",
                 "ignore": "^5.3.1",
                 "natural-compare": "^1.4.0",
@@ -9976,14 +9948,14 @@
             }
         },
         "node_modules/@typescript-eslint/parser": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz",
-            "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==",
-            "dependencies": {
-                "@typescript-eslint/scope-manager": "7.16.0",
-                "@typescript-eslint/types": "7.16.0",
-                "@typescript-eslint/typescript-estree": "7.16.0",
-                "@typescript-eslint/visitor-keys": "7.16.0",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz",
+            "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==",
+            "dependencies": {
+                "@typescript-eslint/scope-manager": "7.16.1",
+                "@typescript-eslint/types": "7.16.1",
+                "@typescript-eslint/typescript-estree": "7.16.1",
+                "@typescript-eslint/visitor-keys": "7.16.1",
                 "debug": "^4.3.4"
             },
             "engines": {
@@ -10003,12 +9975,12 @@
             }
         },
         "node_modules/@typescript-eslint/scope-manager": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
-            "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz",
+            "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==",
             "dependencies": {
-                "@typescript-eslint/types": "7.16.0",
-                "@typescript-eslint/visitor-keys": "7.16.0"
+                "@typescript-eslint/types": "7.16.1",
+                "@typescript-eslint/visitor-keys": "7.16.1"
             },
             "engines": {
                 "node": "^18.18.0 || >=20.0.0"
@@ -10019,13 +9991,13 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz",
-            "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz",
+            "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/typescript-estree": "7.16.0",
-                "@typescript-eslint/utils": "7.16.0",
+                "@typescript-eslint/typescript-estree": "7.16.1",
+                "@typescript-eslint/utils": "7.16.1",
                 "debug": "^4.3.4",
                 "ts-api-utils": "^1.3.0"
             },
@@ -10046,9 +10018,9 @@
             }
         },
         "node_modules/@typescript-eslint/types": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
-            "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz",
+            "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==",
             "engines": {
                 "node": "^18.18.0 || >=20.0.0"
             },
@@ -10058,12 +10030,12 @@
             }
         },
         "node_modules/@typescript-eslint/typescript-estree": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz",
-            "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz",
+            "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==",
             "dependencies": {
-                "@typescript-eslint/types": "7.16.0",
-                "@typescript-eslint/visitor-keys": "7.16.0",
+                "@typescript-eslint/types": "7.16.1",
+                "@typescript-eslint/visitor-keys": "7.16.1",
                 "debug": "^4.3.4",
                 "globby": "^11.1.0",
                 "is-glob": "^4.0.3",
@@ -10085,9 +10057,9 @@
             }
         },
         "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
-            "version": "7.6.2",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -10096,15 +10068,15 @@
             }
         },
         "node_modules/@typescript-eslint/utils": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz",
-            "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz",
+            "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.4.0",
-                "@typescript-eslint/scope-manager": "7.16.0",
-                "@typescript-eslint/types": "7.16.0",
-                "@typescript-eslint/typescript-estree": "7.16.0"
+                "@typescript-eslint/scope-manager": "7.16.1",
+                "@typescript-eslint/types": "7.16.1",
+                "@typescript-eslint/typescript-estree": "7.16.1"
             },
             "engines": {
                 "node": "^18.18.0 || >=20.0.0"
@@ -10118,11 +10090,11 @@
             }
         },
         "node_modules/@typescript-eslint/visitor-keys": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
-            "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz",
+            "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==",
             "dependencies": {
-                "@typescript-eslint/types": "7.16.0",
+                "@typescript-eslint/types": "7.16.1",
                 "eslint-visitor-keys": "^3.4.3"
             },
             "engines": {
@@ -10139,55 +10111,55 @@
             "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
         },
         "node_modules/@vue/compiler-core": {
-            "version": "3.4.31",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz",
-            "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==",
+            "version": "3.4.33",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.33.tgz",
+            "integrity": "sha512-MoIREbkdPQlnGfSKDMgzTqzqx5nmEjIc0ydLVYlTACGBsfvOJ4tHSbZXKVF536n6fB+0eZaGEOqsGThPpdvF5A==",
             "dependencies": {
                 "@babel/parser": "^7.24.7",
-                "@vue/shared": "3.4.31",
+                "@vue/shared": "3.4.33",
                 "entities": "^4.5.0",
                 "estree-walker": "^2.0.2",
                 "source-map-js": "^1.2.0"
             }
         },
         "node_modules/@vue/compiler-dom": {
-            "version": "3.4.31",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz",
-            "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==",
+            "version": "3.4.33",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.33.tgz",
+            "integrity": "sha512-GzB8fxEHKw0gGet5BKlpfXEqoBnzSVWwMnT+dc25wE7pFEfrU/QsvjZMP9rD4iVXHBBoemTct8mN0GJEI6ZX5A==",
             "dependencies": {
-                "@vue/compiler-core": "3.4.31",
-                "@vue/shared": "3.4.31"
+                "@vue/compiler-core": "3.4.33",
+                "@vue/shared": "3.4.33"
             }
         },
         "node_modules/@vue/compiler-sfc": {
-            "version": "3.4.31",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz",
-            "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==",
+            "version": "3.4.33",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.33.tgz",
+            "integrity": "sha512-7rk7Vbkn21xMwIUpHQR4hCVejwE6nvhBOiDgoBcR03qvGqRKA7dCBSsHZhwhYUsmjlbJ7OtD5UFIyhP6BY+c8A==",
             "dependencies": {
                 "@babel/parser": "^7.24.7",
-                "@vue/compiler-core": "3.4.31",
-                "@vue/compiler-dom": "3.4.31",
-                "@vue/compiler-ssr": "3.4.31",
-                "@vue/shared": "3.4.31",
+                "@vue/compiler-core": "3.4.33",
+                "@vue/compiler-dom": "3.4.33",
+                "@vue/compiler-ssr": "3.4.33",
+                "@vue/shared": "3.4.33",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.30.10",
-                "postcss": "^8.4.38",
+                "postcss": "^8.4.39",
                 "source-map-js": "^1.2.0"
             }
         },
         "node_modules/@vue/compiler-ssr": {
-            "version": "3.4.31",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz",
-            "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==",
+            "version": "3.4.33",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.33.tgz",
+            "integrity": "sha512-0WveC9Ai+eT/1b6LCV5IfsufBZ0HP7pSSTdDjcuW302tTEgoBw8rHVHKPbGUtzGReUFCRXbv6zQDDgucnV2WzQ==",
             "dependencies": {
-                "@vue/compiler-dom": "3.4.31",
-                "@vue/shared": "3.4.31"
+                "@vue/compiler-dom": "3.4.33",
+                "@vue/shared": "3.4.33"
             }
         },
         "node_modules/@vue/shared": {
-            "version": "3.4.31",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz",
-            "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA=="
+            "version": "3.4.33",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.33.tgz",
+            "integrity": "sha512-aoRY0jQk3A/cuvdkodTrM4NMfxco8n55eG4H7ML/CRy7OryHfiqvug4xrCBBMbbN+dvXAetDDwZW9DXWWjBntA=="
         },
         "node_modules/@webassemblyjs/ast": {
             "version": "1.12.1",
@@ -10519,14 +10491,14 @@
             }
         },
         "node_modules/ajv-formats/node_modules/ajv": {
-            "version": "8.16.0",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
-            "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
+            "version": "8.17.1",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+            "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
             "dependencies": {
                 "fast-deep-equal": "^3.1.3",
+                "fast-uri": "^3.0.1",
                 "json-schema-traverse": "^1.0.0",
-                "require-from-string": "^2.0.2",
-                "uri-js": "^4.4.1"
+                "require-from-string": "^2.0.2"
             },
             "funding": {
                 "type": "github",
@@ -10736,6 +10708,38 @@
                 "deep-equal": "^2.0.5"
             }
         },
+        "node_modules/aria-query/node_modules/deep-equal": {
+            "version": "2.2.3",
+            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
+            "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
+            "dev": true,
+            "dependencies": {
+                "array-buffer-byte-length": "^1.0.0",
+                "call-bind": "^1.0.5",
+                "es-get-iterator": "^1.1.3",
+                "get-intrinsic": "^1.2.2",
+                "is-arguments": "^1.1.1",
+                "is-array-buffer": "^3.0.2",
+                "is-date-object": "^1.0.5",
+                "is-regex": "^1.1.4",
+                "is-shared-array-buffer": "^1.0.2",
+                "isarray": "^2.0.5",
+                "object-is": "^1.1.5",
+                "object-keys": "^1.1.1",
+                "object.assign": "^4.1.4",
+                "regexp.prototype.flags": "^1.5.1",
+                "side-channel": "^1.0.4",
+                "which-boxed-primitive": "^1.0.2",
+                "which-collection": "^1.0.1",
+                "which-typed-array": "^1.1.13"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/arr-union": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
@@ -10888,18 +10892,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/array.prototype.toreversed": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
-            "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
-            "dev": true,
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "define-properties": "^1.2.0",
-                "es-abstract": "^1.22.1",
-                "es-shim-unscopables": "^1.0.0"
-            }
-        },
         "node_modules/array.prototype.tosorted": {
             "version": "1.1.4",
             "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
@@ -11080,6 +11072,38 @@
                 "deep-equal": "^2.0.5"
             }
         },
+        "node_modules/axobject-query/node_modules/deep-equal": {
+            "version": "2.2.3",
+            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
+            "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
+            "dev": true,
+            "dependencies": {
+                "array-buffer-byte-length": "^1.0.0",
+                "call-bind": "^1.0.5",
+                "es-get-iterator": "^1.1.3",
+                "get-intrinsic": "^1.2.2",
+                "is-arguments": "^1.1.1",
+                "is-array-buffer": "^3.0.2",
+                "is-date-object": "^1.0.5",
+                "is-regex": "^1.1.4",
+                "is-shared-array-buffer": "^1.0.2",
+                "isarray": "^2.0.5",
+                "object-is": "^1.1.5",
+                "object-keys": "^1.1.1",
+                "object.assign": "^4.1.4",
+                "regexp.prototype.flags": "^1.5.1",
+                "side-channel": "^1.0.4",
+                "which-boxed-primitive": "^1.0.2",
+                "which-collection": "^1.0.1",
+                "which-typed-array": "^1.1.13"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/b4a": {
             "version": "1.6.6",
             "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz",
@@ -11620,6 +11644,13 @@
                 "which",
                 "write-file-atomic"
             ],
+            "workspaces": [
+                "docs",
+                "smoke-tests",
+                "mock-globals",
+                "mock-registry",
+                "workspaces/*"
+            ],
             "dependencies": {
                 "@isaacs/string-locale-compare": "^1.1.0",
                 "@npmcli/arborist": "^6.5.0",
@@ -13529,19 +13560,6 @@
                 "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
             }
         },
-        "node_modules/browndash-components/node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": {
-            "version": "3.6.2",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "inherits": "^2.0.3",
-                "string_decoder": "^1.1.1",
-                "util-deprecate": "^1.0.1"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
         "node_modules/browndash-components/node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": {
             "version": "3.0.7",
             "inBundle": true,
@@ -13987,6 +14005,19 @@
                 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
+        "node_modules/browndash-components/node_modules/npm/node_modules/readable-stream": {
+            "version": "3.6.2",
+            "inBundle": true,
+            "license": "MIT",
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
         "node_modules/browndash-components/node_modules/npm/node_modules/retry": {
             "version": "0.12.0",
             "inBundle": true,
@@ -14872,9 +14903,9 @@
             }
         },
         "node_modules/caniuse-lite": {
-            "version": "1.0.30001641",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz",
-            "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==",
+            "version": "1.0.30001643",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz",
+            "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==",
             "funding": [
                 {
                     "type": "opencollective",
@@ -15559,6 +15590,11 @@
                 "tinyqueue": "^2.0.3"
             }
         },
+        "node_modules/concaveman/node_modules/quickselect": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+            "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+        },
         "node_modules/concaveman/node_modules/rbush": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
@@ -15887,9 +15923,9 @@
             }
         },
         "node_modules/css-loader/node_modules/semver": {
-            "version": "7.6.2",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -16061,9 +16097,9 @@
             "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg=="
         },
         "node_modules/cytoscape": {
-            "version": "3.30.0",
-            "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.0.tgz",
-            "integrity": "sha512-l590mjTHT6/Cbxp13dGPC2Y7VXdgc+rUeF8AnF/JPzhjNevbDJfObnJgaSjlldOgBQZbue+X6IUZ7r5GAgvauQ==",
+            "version": "3.30.1",
+            "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.1.tgz",
+            "integrity": "sha512-TRJc3HbBPkHd50u9YfJh2FxD1lDLZ+JXnJoyBn5LkncoeuT7fapO/Hq/Ed8TdFclaKshzInge2i30bg7VKeoPQ==",
             "engines": {
                 "node": ">=0.10"
             }
@@ -16627,9 +16663,9 @@
             }
         },
         "node_modules/dayjs": {
-            "version": "1.11.11",
-            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz",
-            "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg=="
+            "version": "1.11.12",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz",
+            "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg=="
         },
         "node_modules/debug": {
             "version": "4.3.5",
@@ -16725,29 +16761,16 @@
             }
         },
         "node_modules/deep-equal": {
-            "version": "2.2.3",
-            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
-            "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
-            "dev": true,
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
+            "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
             "dependencies": {
-                "array-buffer-byte-length": "^1.0.0",
-                "call-bind": "^1.0.5",
-                "es-get-iterator": "^1.1.3",
-                "get-intrinsic": "^1.2.2",
                 "is-arguments": "^1.1.1",
-                "is-array-buffer": "^3.0.2",
                 "is-date-object": "^1.0.5",
                 "is-regex": "^1.1.4",
-                "is-shared-array-buffer": "^1.0.2",
-                "isarray": "^2.0.5",
                 "object-is": "^1.1.5",
                 "object-keys": "^1.1.1",
-                "object.assign": "^4.1.4",
-                "regexp.prototype.flags": "^1.5.1",
-                "side-channel": "^1.0.4",
-                "which-boxed-primitive": "^1.0.2",
-                "which-collection": "^1.0.1",
-                "which-typed-array": "^1.1.13"
+                "regexp.prototype.flags": "^1.5.1"
             },
             "engines": {
                 "node": ">= 0.4"
@@ -16951,9 +16974,9 @@
             }
         },
         "node_modules/depcheck/node_modules/semver": {
-            "version": "7.6.2",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -17226,9 +17249,9 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
         "node_modules/electron-to-chromium": {
-            "version": "1.4.823",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.823.tgz",
-            "integrity": "sha512-4h+oPeAiGQOHFyUJOqpoEcPj/xxlicxBzOErVeYVMMmAiXUXsGpsFd0QXBMaUUbnD8hhSfLf9uw+MlsoIA7j5w=="
+            "version": "1.4.832",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.832.tgz",
+            "integrity": "sha512-cTen3SB0H2SGU7x467NRe1eVcQgcuS6jckKfWJHia2eo0cHIGOqHoAxevIYZD4eRHcWjkvFzo93bi3vJ9W+1lA=="
         },
         "node_modules/elkjs": {
             "version": "0.9.3",
@@ -17309,9 +17332,9 @@
             }
         },
         "node_modules/engine.io-parser": {
-            "version": "5.2.2",
-            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz",
-            "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==",
+            "version": "5.2.3",
+            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+            "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
             "engines": {
                 "node": ">=10.0.0"
             }
@@ -18828,13 +18851,13 @@
             }
         },
         "node_modules/eslint-plugin-prettier": {
-            "version": "5.1.3",
-            "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
-            "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==",
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz",
+            "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==",
             "dev": true,
             "dependencies": {
                 "prettier-linter-helpers": "^1.0.0",
-                "synckit": "^0.8.6"
+                "synckit": "^0.9.1"
             },
             "engines": {
                 "node": "^14.18.0 || >=16.0.0"
@@ -18858,35 +18881,35 @@
             }
         },
         "node_modules/eslint-plugin-react": {
-            "version": "7.34.3",
-            "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz",
-            "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==",
+            "version": "7.35.0",
+            "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz",
+            "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==",
             "dev": true,
             "dependencies": {
                 "array-includes": "^3.1.8",
                 "array.prototype.findlast": "^1.2.5",
                 "array.prototype.flatmap": "^1.3.2",
-                "array.prototype.toreversed": "^1.1.2",
                 "array.prototype.tosorted": "^1.1.4",
                 "doctrine": "^2.1.0",
                 "es-iterator-helpers": "^1.0.19",
                 "estraverse": "^5.3.0",
+                "hasown": "^2.0.2",
                 "jsx-ast-utils": "^2.4.1 || ^3.0.0",
                 "minimatch": "^3.1.2",
                 "object.entries": "^1.1.8",
                 "object.fromentries": "^2.0.8",
-                "object.hasown": "^1.1.4",
                 "object.values": "^1.2.0",
                 "prop-types": "^15.8.1",
                 "resolve": "^2.0.0-next.5",
                 "semver": "^6.3.1",
-                "string.prototype.matchall": "^4.0.11"
+                "string.prototype.matchall": "^4.0.11",
+                "string.prototype.repeat": "^1.0.0"
             },
             "engines": {
                 "node": ">=4"
             },
             "peerDependencies": {
-                "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+                "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
             }
         },
         "node_modules/eslint-plugin-react-hooks": {
@@ -19596,6 +19619,11 @@
             "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
         },
+        "node_modules/fast-uri": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
+            "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw=="
+        },
         "node_modules/fast-xml-parser": {
             "version": "4.4.0",
             "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz",
@@ -20226,9 +20254,9 @@
             }
         },
         "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
-            "version": "7.6.2",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -20570,25 +20598,6 @@
                 "deep-equal": "^1.0.0"
             }
         },
-        "node_modules/geojson-equality/node_modules/deep-equal": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
-            "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
-            "dependencies": {
-                "is-arguments": "^1.1.1",
-                "is-date-object": "^1.0.5",
-                "is-regex": "^1.1.4",
-                "object-is": "^1.1.5",
-                "object-keys": "^1.1.1",
-                "regexp.prototype.flags": "^1.5.1"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
         "node_modules/geojson-rbush": {
             "version": "3.2.0",
             "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.2.0.tgz",
@@ -20606,6 +20615,11 @@
             "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz",
             "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA=="
         },
+        "node_modules/geojson-rbush/node_modules/quickselect": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+            "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+        },
         "node_modules/geojson-rbush/node_modules/rbush": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
@@ -20704,9 +20718,9 @@
             }
         },
         "node_modules/get-tsconfig": {
-            "version": "4.7.5",
-            "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
-            "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+            "version": "4.7.6",
+            "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz",
+            "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==",
             "dev": true,
             "dependencies": {
                 "resolve-pkg-maps": "^1.0.0"
@@ -21959,8 +21973,7 @@
         "node_modules/image-size-stream/node_modules/image-size": {
             "version": "0.3.5",
             "resolved": "git+ssh://git@github.com/netroy/image-size.git#da2c863807a3e9602617bdd357b0de3ab4a064c1",
-            "integrity": "sha512-nF4/PT7i5t72LJKRBAXfM8PCzUDQurOUzPsNUjQDpUhFpLNuCpSY0+XIHNcc/LtoU3GqSCK3wQDU+CCty3Bfcw==",
-            "license": "MIT",
+            "integrity": "sha512-bOV/01RFEAMM7OJU4alHoipipEYAdVk1W9rto2aN1ZnEZsZ1A1OCVJJ2iMaaJIKidVXGZNbP9knmW/3wWTZ4/Q==",
             "bin": {
                 "image-size": "bin/image-size"
             },
@@ -21995,9 +22008,9 @@
             "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
         },
         "node_modules/immutable": {
-            "version": "4.3.6",
-            "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
-            "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ=="
+            "version": "4.3.7",
+            "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz",
+            "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw=="
         },
         "node_modules/import-fresh": {
             "version": "3.3.0",
@@ -22023,9 +22036,9 @@
             }
         },
         "node_modules/import-local": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
-            "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+            "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
             "dependencies": {
                 "pkg-dir": "^4.2.0",
                 "resolve-cwd": "^3.0.0"
@@ -22591,9 +22604,9 @@
             }
         },
         "node_modules/is-core-module": {
-            "version": "2.14.0",
-            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz",
-            "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==",
+            "version": "2.15.0",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
+            "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
             "dependencies": {
                 "hasown": "^2.0.2"
             },
@@ -23108,15 +23121,12 @@
             }
         },
         "node_modules/jackspeak": {
-            "version": "3.4.2",
-            "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.2.tgz",
-            "integrity": "sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==",
+            "version": "3.4.3",
+            "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+            "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
             "dependencies": {
                 "@isaacs/cliui": "^8.0.2"
             },
-            "engines": {
-                "node": "14 >=14.21 || 16 >=16.20 || >=18"
-            },
             "funding": {
                 "url": "https://github.com/sponsors/isaacs"
             },
@@ -23356,9 +23366,9 @@
             "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
         },
         "node_modules/jsdom": {
-            "version": "24.1.0",
-            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz",
-            "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==",
+            "version": "24.1.1",
+            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz",
+            "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==",
             "dev": true,
             "dependencies": {
                 "cssstyle": "^4.0.1",
@@ -23367,11 +23377,11 @@
                 "form-data": "^4.0.0",
                 "html-encoding-sniffer": "^4.0.0",
                 "http-proxy-agent": "^7.0.2",
-                "https-proxy-agent": "^7.0.4",
+                "https-proxy-agent": "^7.0.5",
                 "is-potential-custom-element-name": "^1.0.1",
-                "nwsapi": "^2.2.10",
+                "nwsapi": "^2.2.12",
                 "parse5": "^7.1.2",
-                "rrweb-cssom": "^0.7.0",
+                "rrweb-cssom": "^0.7.1",
                 "saxes": "^6.0.0",
                 "symbol-tree": "^3.2.4",
                 "tough-cookie": "^4.1.4",
@@ -23380,7 +23390,7 @@
                 "whatwg-encoding": "^3.1.1",
                 "whatwg-mimetype": "^4.0.0",
                 "whatwg-url": "^14.0.0",
-                "ws": "^8.17.0",
+                "ws": "^8.18.0",
                 "xml-name-validator": "^5.0.0"
             },
             "engines": {
@@ -24175,9 +24185,13 @@
             "dev": true
         },
         "node_modules/mapbox-gl": {
-            "version": "3.5.1",
-            "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.5.1.tgz",
-            "integrity": "sha512-sf4N18vl5FHS8lPRWZjTZShgIziDqSxan3MazHClvYYXezsAPn6hApRvAS2HEMTq7MXzRcvvt4sYgQWLubwnBw==",
+            "version": "3.5.2",
+            "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.5.2.tgz",
+            "integrity": "sha512-KUrmDmLFKPp3MSsWGNTH5uvtYwJknV+eFJ+vxiN6hqKpzbme37z+JfYs5Mehs3CgFaIV/pUdnEV9UPUZJPuS+Q==",
+            "workspaces": [
+                "src/style-spec",
+                "test/build/typings"
+            ],
             "dependencies": {
                 "@mapbox/jsonlint-lines-primitives": "^2.0.2",
                 "@mapbox/mapbox-gl-supported": "^3.0.0",
@@ -24186,6 +24200,8 @@
                 "@mapbox/unitbezier": "^0.0.1",
                 "@mapbox/vector-tile": "^1.3.1",
                 "@mapbox/whoots-js": "^3.1.0",
+                "@types/geojson": "^7946.0.14",
+                "@types/mapbox__vector-tile": "^1.3.4",
                 "cheap-ruler": "^4.0.0",
                 "csscolorparser": "~1.0.3",
                 "earcut": "^3.0.0",
@@ -24198,12 +24214,12 @@
                 "murmurhash-js": "^1.0.0",
                 "pbf": "^3.2.1",
                 "potpack": "^2.0.0",
-                "quickselect": "^2.0.0",
+                "quickselect": "^3.0.0",
                 "rw": "^1.3.3",
                 "serialize-to-js": "^3.1.2",
                 "supercluster": "^8.0.1",
-                "tiny-lru": "^11.2.6",
-                "tinyqueue": "^2.0.3",
+                "tiny-lru": "^11.2.11",
+                "tinyqueue": "^3.0.0",
                 "tweakpane": "^4.0.4",
                 "vt-pbf": "^3.1.3"
             }
@@ -24213,6 +24229,11 @@
             "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz",
             "integrity": "sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg=="
         },
+        "node_modules/mapbox-gl/node_modules/tinyqueue": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz",
+            "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g=="
+        },
         "node_modules/markdown-it": {
             "version": "14.1.0",
             "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
@@ -30807,9 +30828,9 @@
             "integrity": "sha512-yc0LhH6tItlvfLBugVUEtgawwFU2sIe+cSdmRJJCTMZ5GEJyLxNyC/NIOAOGk67Fa8GNpOttO3Xz/1bHpXFD/g=="
         },
         "node_modules/mobx": {
-            "version": "6.13.0",
-            "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.0.tgz",
-            "integrity": "sha512-1laWODrBWmB7mDJ8EClCjUQTyLwJ0ydJgE4FtK7t9r3JnjXgc9OhmYs2P4RtHrY1co5+4T6cKP2UswX2SU29mA==",
+            "version": "6.13.1",
+            "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.1.tgz",
+            "integrity": "sha512-ekLRxgjWJr8hVxj9ZKuClPwM/iHckx3euIJ3Np7zLVNtqJvfbbq7l370W/98C8EabdQ1pB5Jd3BbDWxJPNnaOg==",
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/mobx"
@@ -30872,9 +30893,9 @@
             }
         },
         "node_modules/mocha": {
-            "version": "10.6.0",
-            "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz",
-            "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==",
+            "version": "10.7.0",
+            "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.0.tgz",
+            "integrity": "sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==",
             "dev": true,
             "dependencies": {
                 "ansi-colors": "^4.1.3",
@@ -31064,9 +31085,9 @@
             }
         },
         "node_modules/mongoose": {
-            "version": "8.5.0",
-            "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.0.tgz",
-            "integrity": "sha512-iGgZvgO+fIgX1AQMehkG+Wj8qrWc9it8vUZrSKWjrebgfwHTqUcIdTgWK8mT1us1xd83NOQxiuGbg9ZJtLxs2Q==",
+            "version": "8.5.1",
+            "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.1.tgz",
+            "integrity": "sha512-OhVcwVl91A1G6+XpjDcpkGP7l7ikZkxa0DylX7NT/lcEqAjggzSdqDxb48A+xsDxqNAr0ntSJ1yiE3+KJTOd5Q==",
             "dependencies": {
                 "bson": "^6.7.0",
                 "kareem": "2.6.3",
@@ -31401,9 +31422,9 @@
             }
         },
         "node_modules/node-releases": {
-            "version": "2.0.14",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
-            "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+            "version": "2.0.18",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+            "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
         },
         "node_modules/node-stream-zip": {
             "version": "1.15.0",
@@ -31473,9 +31494,9 @@
             }
         },
         "node_modules/nodemon/node_modules/semver": {
-            "version": "7.6.2",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -31522,9 +31543,9 @@
             }
         },
         "node_modules/npm": {
-            "version": "10.8.1",
-            "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.1.tgz",
-            "integrity": "sha512-Dp1C6SvSMYQI7YHq/y2l94uvI+59Eqbu1EpuKQHQ8p16txXRuRit5gH3Lnaagk2aXDIjg/Iru9pd05bnneKgdw==",
+            "version": "10.8.2",
+            "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.2.tgz",
+            "integrity": "sha512-x/AIjFIKRllrhcb48dqUNAAZl0ig9+qMuN91RpZo3Cb2+zuibfh+KISl6+kVVyktDz230JKc208UkQwwMqyB+w==",
             "bundleDependencies": [
                 "@isaacs/string-locale-compare",
                 "@npmcli/arborist",
@@ -31595,15 +31616,22 @@
                 "which",
                 "write-file-atomic"
             ],
+            "workspaces": [
+                "docs",
+                "smoke-tests",
+                "mock-globals",
+                "mock-registry",
+                "workspaces/*"
+            ],
             "dependencies": {
                 "@isaacs/string-locale-compare": "^1.1.0",
-                "@npmcli/arborist": "^7.5.3",
-                "@npmcli/config": "^8.3.3",
+                "@npmcli/arborist": "^7.5.4",
+                "@npmcli/config": "^8.3.4",
                 "@npmcli/fs": "^3.1.1",
                 "@npmcli/map-workspaces": "^3.0.6",
-                "@npmcli/package-json": "^5.1.1",
+                "@npmcli/package-json": "^5.2.0",
                 "@npmcli/promise-spawn": "^7.0.2",
-                "@npmcli/redact": "^2.0.0",
+                "@npmcli/redact": "^2.0.1",
                 "@npmcli/run-script": "^8.1.0",
                 "@sigstore/tuf": "^2.3.4",
                 "abbrev": "^2.0.0",
@@ -31614,7 +31642,7 @@
                 "cli-columns": "^4.0.0",
                 "fastest-levenshtein": "^1.0.16",
                 "fs-minipass": "^3.0.3",
-                "glob": "^10.4.1",
+                "glob": "^10.4.2",
                 "graceful-fs": "^4.2.11",
                 "hosted-git-info": "^7.0.2",
                 "ini": "^4.1.3",
@@ -31622,30 +31650,30 @@
                 "is-cidr": "^5.1.0",
                 "json-parse-even-better-errors": "^3.0.2",
                 "libnpmaccess": "^8.0.6",
-                "libnpmdiff": "^6.1.3",
-                "libnpmexec": "^8.1.2",
-                "libnpmfund": "^5.0.11",
+                "libnpmdiff": "^6.1.4",
+                "libnpmexec": "^8.1.3",
+                "libnpmfund": "^5.0.12",
                 "libnpmhook": "^10.0.5",
                 "libnpmorg": "^6.0.6",
-                "libnpmpack": "^7.0.3",
+                "libnpmpack": "^7.0.4",
                 "libnpmpublish": "^9.0.9",
                 "libnpmsearch": "^7.0.6",
                 "libnpmteam": "^6.0.5",
                 "libnpmversion": "^6.0.3",
                 "make-fetch-happen": "^13.0.1",
-                "minimatch": "^9.0.4",
+                "minimatch": "^9.0.5",
                 "minipass": "^7.1.1",
                 "minipass-pipeline": "^1.2.4",
                 "ms": "^2.1.2",
                 "node-gyp": "^10.1.0",
                 "nopt": "^7.2.1",
-                "normalize-package-data": "^6.0.1",
+                "normalize-package-data": "^6.0.2",
                 "npm-audit-report": "^5.0.0",
                 "npm-install-checks": "^6.3.0",
                 "npm-package-arg": "^11.0.2",
-                "npm-pick-manifest": "^9.0.1",
+                "npm-pick-manifest": "^9.1.0",
                 "npm-profile": "^10.0.0",
-                "npm-registry-fetch": "^17.0.1",
+                "npm-registry-fetch": "^17.1.0",
                 "npm-user-validate": "^2.0.1",
                 "p-map": "^4.0.0",
                 "pacote": "^18.0.6",
@@ -31768,7 +31796,7 @@
             }
         },
         "node_modules/npm/node_modules/@npmcli/arborist": {
-            "version": "7.5.3",
+            "version": "7.5.4",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
@@ -31816,16 +31844,16 @@
             }
         },
         "node_modules/npm/node_modules/@npmcli/config": {
-            "version": "8.3.3",
+            "version": "8.3.4",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
                 "@npmcli/map-workspaces": "^3.0.2",
+                "@npmcli/package-json": "^5.1.1",
                 "ci-info": "^4.0.0",
                 "ini": "^4.1.2",
                 "nopt": "^7.2.1",
                 "proc-log": "^4.2.0",
-                "read-package-json-fast": "^3.0.2",
                 "semver": "^7.3.5",
                 "walk-up-path": "^3.0.1"
             },
@@ -31845,11 +31873,12 @@
             }
         },
         "node_modules/npm/node_modules/@npmcli/git": {
-            "version": "5.0.7",
+            "version": "5.0.8",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
                 "@npmcli/promise-spawn": "^7.0.0",
+                "ini": "^4.1.3",
                 "lru-cache": "^10.0.1",
                 "npm-pick-manifest": "^9.0.0",
                 "proc-log": "^4.0.0",
@@ -31923,7 +31952,7 @@
             }
         },
         "node_modules/npm/node_modules/@npmcli/package-json": {
-            "version": "5.1.1",
+            "version": "5.2.0",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
@@ -31962,7 +31991,7 @@
             }
         },
         "node_modules/npm/node_modules/@npmcli/redact": {
-            "version": "2.0.0",
+            "version": "2.0.1",
             "inBundle": true,
             "license": "ISC",
             "engines": {
@@ -32334,7 +32363,7 @@
             }
         },
         "node_modules/npm/node_modules/debug": {
-            "version": "4.3.4",
+            "version": "4.3.5",
             "inBundle": true,
             "license": "MIT",
             "dependencies": {
@@ -32408,7 +32437,7 @@
             }
         },
         "node_modules/npm/node_modules/foreground-child": {
-            "version": "3.1.1",
+            "version": "3.2.1",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
@@ -32433,16 +32462,8 @@
                 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/function-bind": {
-            "version": "1.1.2",
-            "inBundle": true,
-            "license": "MIT",
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
         "node_modules/npm/node_modules/glob": {
-            "version": "10.4.1",
+            "version": "10.4.2",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
@@ -32450,6 +32471,7 @@
                 "jackspeak": "^3.1.2",
                 "minimatch": "^9.0.4",
                 "minipass": "^7.1.2",
+                "package-json-from-dist": "^1.0.0",
                 "path-scurry": "^1.11.1"
             },
             "bin": {
@@ -32467,17 +32489,6 @@
             "inBundle": true,
             "license": "ISC"
         },
-        "node_modules/npm/node_modules/hasown": {
-            "version": "2.0.2",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "function-bind": "^1.1.2"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            }
-        },
         "node_modules/npm/node_modules/hosted-git-info": {
             "version": "7.0.2",
             "inBundle": true,
@@ -32507,7 +32518,7 @@
             }
         },
         "node_modules/npm/node_modules/https-proxy-agent": {
-            "version": "7.0.4",
+            "version": "7.0.5",
             "inBundle": true,
             "license": "MIT",
             "dependencies": {
@@ -32616,17 +32627,6 @@
                 "node": ">=14"
             }
         },
-        "node_modules/npm/node_modules/is-core-module": {
-            "version": "2.13.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "hasown": "^2.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
         "node_modules/npm/node_modules/is-fullwidth-code-point": {
             "version": "3.0.0",
             "inBundle": true,
@@ -32646,7 +32646,7 @@
             "license": "ISC"
         },
         "node_modules/npm/node_modules/jackspeak": {
-            "version": "3.1.2",
+            "version": "3.4.0",
             "inBundle": true,
             "license": "BlueOak-1.0.0",
             "dependencies": {
@@ -32714,11 +32714,11 @@
             }
         },
         "node_modules/npm/node_modules/libnpmdiff": {
-            "version": "6.1.3",
+            "version": "6.1.4",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "@npmcli/arborist": "^7.5.3",
+                "@npmcli/arborist": "^7.5.4",
                 "@npmcli/installed-package-contents": "^2.1.0",
                 "binary-extensions": "^2.3.0",
                 "diff": "^5.1.0",
@@ -32732,11 +32732,11 @@
             }
         },
         "node_modules/npm/node_modules/libnpmexec": {
-            "version": "8.1.2",
+            "version": "8.1.3",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "@npmcli/arborist": "^7.5.3",
+                "@npmcli/arborist": "^7.5.4",
                 "@npmcli/run-script": "^8.1.0",
                 "ci-info": "^4.0.0",
                 "npm-package-arg": "^11.0.2",
@@ -32752,11 +32752,11 @@
             }
         },
         "node_modules/npm/node_modules/libnpmfund": {
-            "version": "5.0.11",
+            "version": "5.0.12",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "@npmcli/arborist": "^7.5.3"
+                "@npmcli/arborist": "^7.5.4"
             },
             "engines": {
                 "node": "^16.14.0 || >=18.0.0"
@@ -32787,11 +32787,11 @@
             }
         },
         "node_modules/npm/node_modules/libnpmpack": {
-            "version": "7.0.3",
+            "version": "7.0.4",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "@npmcli/arborist": "^7.5.3",
+                "@npmcli/arborist": "^7.5.4",
                 "@npmcli/run-script": "^8.1.0",
                 "npm-package-arg": "^11.0.2",
                 "pacote": "^18.0.6"
@@ -32887,7 +32887,7 @@
             }
         },
         "node_modules/npm/node_modules/minimatch": {
-            "version": "9.0.4",
+            "version": "9.0.5",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
@@ -32957,26 +32957,6 @@
                 "node": ">=8"
             }
         },
-        "node_modules/npm/node_modules/minipass-json-stream": {
-            "version": "1.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "jsonparse": "^1.3.1",
-                "minipass": "^3.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": {
-            "version": "3.3.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
         "node_modules/npm/node_modules/minipass-pipeline": {
             "version": "1.2.4",
             "inBundle": true,
@@ -33122,12 +33102,11 @@
             }
         },
         "node_modules/npm/node_modules/normalize-package-data": {
-            "version": "6.0.1",
+            "version": "6.0.2",
             "inBundle": true,
             "license": "BSD-2-Clause",
             "dependencies": {
                 "hosted-git-info": "^7.0.0",
-                "is-core-module": "^2.8.1",
                 "semver": "^7.3.5",
                 "validate-npm-package-license": "^3.0.4"
             },
@@ -33199,7 +33178,7 @@
             }
         },
         "node_modules/npm/node_modules/npm-pick-manifest": {
-            "version": "9.0.1",
+            "version": "9.1.0",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
@@ -33225,15 +33204,15 @@
             }
         },
         "node_modules/npm/node_modules/npm-registry-fetch": {
-            "version": "17.0.1",
+            "version": "17.1.0",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
                 "@npmcli/redact": "^2.0.0",
+                "jsonparse": "^1.3.1",
                 "make-fetch-happen": "^13.0.0",
                 "minipass": "^7.0.2",
                 "minipass-fetch": "^3.0.0",
-                "minipass-json-stream": "^1.0.1",
                 "minizlib": "^2.1.2",
                 "npm-package-arg": "^11.0.0",
                 "proc-log": "^4.0.0"
@@ -33264,6 +33243,11 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/npm/node_modules/package-json-from-dist": {
+            "version": "1.0.0",
+            "inBundle": true,
+            "license": "BlueOak-1.0.0"
+        },
         "node_modules/npm/node_modules/pacote": {
             "version": "18.0.6",
             "inBundle": true,
@@ -33534,13 +33518,13 @@
             }
         },
         "node_modules/npm/node_modules/socks-proxy-agent": {
-            "version": "8.0.3",
+            "version": "8.0.4",
             "inBundle": true,
             "license": "MIT",
             "dependencies": {
                 "agent-base": "^7.1.1",
                 "debug": "^4.3.4",
-                "socks": "^2.7.1"
+                "socks": "^2.8.3"
             },
             "engines": {
                 "node": ">= 14"
@@ -33951,9 +33935,9 @@
             }
         },
         "node_modules/nwsapi": {
-            "version": "2.2.10",
-            "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz",
-            "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==",
+            "version": "2.2.12",
+            "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz",
+            "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==",
             "dev": true
         },
         "node_modules/oauth": {
@@ -34134,23 +34118,6 @@
                 "node": ">= 0.4"
             }
         },
-        "node_modules/object.hasown": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz",
-            "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==",
-            "dev": true,
-            "dependencies": {
-                "define-properties": "^1.2.1",
-                "es-abstract": "^1.23.2",
-                "es-object-atoms": "^1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
         "node_modules/object.values": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
@@ -34240,9 +34207,9 @@
             }
         },
         "node_modules/openai": {
-            "version": "4.52.5",
-            "resolved": "https://registry.npmjs.org/openai/-/openai-4.52.5.tgz",
-            "integrity": "sha512-qqH8GsyPE3z06took/2uWOGqRcrZNlRoPAsihpg4jsl0+2Dfelnw6HDDMep0EI2Cfzw75nn3vHRZehep/IZzxg==",
+            "version": "4.52.7",
+            "resolved": "https://registry.npmjs.org/openai/-/openai-4.52.7.tgz",
+            "integrity": "sha512-dgxA6UZHary6NXUHEDj5TWt8ogv0+ibH+b4pT5RrWMjiRZVylNwLcw/2ubDrX5n0oUmHX/ZgudMJeemxzOvz7A==",
             "dependencies": {
                 "@types/node": "^18.11.18",
                 "@types/node-fetch": "^2.6.4",
@@ -34258,9 +34225,9 @@
             }
         },
         "node_modules/openai/node_modules/@types/node": {
-            "version": "18.19.39",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz",
-            "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==",
+            "version": "18.19.41",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.41.tgz",
+            "integrity": "sha512-LX84pRJ+evD2e2nrgYCHObGWkiQJ1mL+meAgbvnwk/US6vmMY7S2ygBTGV2Jw91s9vUsLSXeDEkUHZIJGLrhsg==",
             "dependencies": {
                 "undici-types": "~5.26.4"
             }
@@ -35067,9 +35034,9 @@
             }
         },
         "node_modules/postcss-selector-parser": {
-            "version": "6.1.0",
-            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
-            "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
+            "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==",
             "dependencies": {
                 "cssesc": "^3.0.0",
                 "util-deprecate": "^1.0.2"
@@ -35106,9 +35073,9 @@
             }
         },
         "node_modules/prettier": {
-            "version": "3.3.2",
-            "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
-            "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
+            "version": "3.3.3",
+            "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+            "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
             "dev": true,
             "bin": {
                 "prettier": "bin/prettier.cjs"
@@ -35260,17 +35227,17 @@
             }
         },
         "node_modules/prosemirror-model": {
-            "version": "1.21.3",
-            "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.3.tgz",
-            "integrity": "sha512-nt2Xs/RNGepD9hrrkzXvtCm1mpGJoQfFSPktGa0BF/aav6XsnmVGZ9sTXNWRLupAz5SCLa3EyKlFeK7zJWROKg==",
+            "version": "1.22.2",
+            "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.22.2.tgz",
+            "integrity": "sha512-I4lS7HHIW47D0Xv/gWmi4iUWcQIDYaJKd8Hk4+lcSps+553FlQrhmxtItpEvTr75iAruhzVShVp6WUwsT6Boww==",
             "dependencies": {
                 "orderedmap": "^2.0.0"
             }
         },
         "node_modules/prosemirror-schema-list": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.4.0.tgz",
-            "integrity": "sha512-nZOIq/AkBSzCENxUyLm5ltWE53e2PLk65ghMN8qLQptOmDVixZlPqtMeQdiNw0odL9vNpalEjl3upgRkuJ/Jyw==",
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.4.1.tgz",
+            "integrity": "sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==",
             "dependencies": {
                 "prosemirror-model": "^1.0.0",
                 "prosemirror-state": "^1.0.0",
@@ -35296,9 +35263,9 @@
             }
         },
         "node_modules/prosemirror-view": {
-            "version": "1.33.8",
-            "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.8.tgz",
-            "integrity": "sha512-4PhMr/ufz2cdvFgpUAnZfs+0xij3RsFysreeG9V/utpwX7AJtYCDVyuRxzWoMJIEf4C7wVihuBNMPpFLPCiLQw==",
+            "version": "1.33.9",
+            "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.9.tgz",
+            "integrity": "sha512-xV1A0Vz9cIcEnwmMhKKFAOkfIp8XmJRnaZoPqNXrPS7EK5n11Ov8V76KhR0RsfQd/SIzmWY+bg+M44A2Lx/Nnw==",
             "dependencies": {
                 "prosemirror-model": "^1.20.0",
                 "prosemirror-state": "^1.0.0",
@@ -35563,9 +35530,9 @@
             }
         },
         "node_modules/quickselect": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
-            "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz",
+            "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="
         },
         "node_modules/random-bytes": {
             "version": "1.0.0",
@@ -35930,9 +35897,9 @@
             }
         },
         "node_modules/react-intersection-observer": {
-            "version": "9.10.3",
-            "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.10.3.tgz",
-            "integrity": "sha512-9NYfKwPZRovB6QJee7fDg0zz/SyYrqXtn5xTZU0vwLtLVBtfu9aZt1pVmr825REE49VPDZ7Lm5SNHjJBOTZHpA==",
+            "version": "9.13.0",
+            "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.13.0.tgz",
+            "integrity": "sha512-y0UvBfjDiXqC8h0EWccyaj4dVBWMxgEx0t5RGNzQsvkfvZwugnKwxpu70StY4ivzYuMajavwUDjH4LJyIki9Lw==",
             "peerDependencies": {
                 "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
                 "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
@@ -37492,11 +37459,12 @@
             }
         },
         "node_modules/rimraf": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.0.tgz",
-            "integrity": "sha512-u+yqhM92LW+89cxUQK0SRyvXYQmyuKHx0jkx4W7KfwLGLqJnQM5031Uv1trE4gB9XEXBM/s6MxKlfW95IidqaA==",
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
+            "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
             "dependencies": {
-                "glob": "^11.0.0"
+                "glob": "^11.0.0",
+                "package-json-from-dist": "^1.0.0"
             },
             "bin": {
                 "rimraf": "dist/esm/bin.mjs"
@@ -37737,9 +37705,9 @@
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
         "node_modules/sass": {
-            "version": "1.77.7",
-            "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.7.tgz",
-            "integrity": "sha512-9ywH75cO+rLjbrZ6en3Gp8qAMwPGBapFtlsMJoDTkcMU/bSe5a6cjKVUn5Jr4Gzg5GbP3HE8cm+02pLCgcoMow==",
+            "version": "1.77.8",
+            "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz",
+            "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==",
             "dependencies": {
                 "chokidar": ">=3.0.0 <4.0.0",
                 "immutable": "^4.0.0",
@@ -37835,14 +37803,14 @@
             }
         },
         "node_modules/schema-utils/node_modules/ajv": {
-            "version": "8.16.0",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
-            "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
+            "version": "8.17.1",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+            "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
             "dependencies": {
                 "fast-deep-equal": "^3.1.3",
+                "fast-uri": "^3.0.1",
                 "json-schema-traverse": "^1.0.0",
-                "require-from-string": "^2.0.2",
-                "uri-js": "^4.4.1"
+                "require-from-string": "^2.0.2"
             },
             "funding": {
                 "type": "github",
@@ -38346,9 +38314,9 @@
             }
         },
         "node_modules/simple-update-notifier/node_modules/semver": {
-            "version": "7.6.2",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -38926,6 +38894,16 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/string.prototype.repeat": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+            "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+            "dev": true,
+            "dependencies": {
+                "define-properties": "^1.1.3",
+                "es-abstract": "^1.17.5"
+            }
+        },
         "node_modules/string.prototype.trim": {
             "version": "1.2.9",
             "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
@@ -39130,9 +39108,9 @@
             }
         },
         "node_modules/styled-components": {
-            "version": "6.1.11",
-            "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz",
-            "integrity": "sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==",
+            "version": "6.1.12",
+            "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.12.tgz",
+            "integrity": "sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==",
             "dependencies": {
                 "@emotion/is-prop-valid": "1.2.2",
                 "@emotion/unitless": "0.8.1",
@@ -39156,6 +39134,24 @@
                 "react-dom": ">= 16.8.0"
             }
         },
+        "node_modules/styled-components/node_modules/@emotion/is-prop-valid": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
+            "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
+            "dependencies": {
+                "@emotion/memoize": "^0.8.1"
+            }
+        },
+        "node_modules/styled-components/node_modules/@emotion/memoize": {
+            "version": "0.8.1",
+            "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+            "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
+        },
+        "node_modules/styled-components/node_modules/@emotion/unitless": {
+            "version": "0.8.1",
+            "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+            "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+        },
         "node_modules/styled-components/node_modules/postcss": {
             "version": "8.4.38",
             "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
@@ -39235,9 +39231,9 @@
             "dev": true
         },
         "node_modules/synckit": {
-            "version": "0.8.8",
-            "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
-            "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
+            "version": "0.9.1",
+            "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz",
+            "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==",
             "dev": true,
             "dependencies": {
                 "@pkgr/core": "^0.1.0",
@@ -39383,9 +39379,9 @@
             "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
         },
         "node_modules/terser": {
-            "version": "5.31.2",
-            "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz",
-            "integrity": "sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==",
+            "version": "5.31.3",
+            "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz",
+            "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==",
             "dependencies": {
                 "@jridgewell/source-map": "^0.3.3",
                 "acorn": "^8.8.2",
@@ -39849,9 +39845,9 @@
             }
         },
         "node_modules/ts-loader/node_modules/semver": {
-            "version": "7.6.2",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "version": "7.6.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+            "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
             "dev": true,
             "bin": {
                 "semver": "bin/semver.js"
@@ -40373,9 +40369,9 @@
             }
         },
         "node_modules/type-fest": {
-            "version": "4.21.0",
-            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz",
-            "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==",
+            "version": "4.23.0",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz",
+            "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==",
             "engines": {
                 "node": ">=16"
             },
@@ -40486,14 +40482,14 @@
             "integrity": "sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ=="
         },
         "node_modules/typescript-eslint": {
-            "version": "7.16.0",
-            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.16.0.tgz",
-            "integrity": "sha512-kaVRivQjOzuoCXU6+hLnjo3/baxyzWVO5GrnExkFzETRYJKVHYkrJglOu2OCm8Hi9RPDWX1PTNNTpU5KRV0+RA==",
+            "version": "7.16.1",
+            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.16.1.tgz",
+            "integrity": "sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/eslint-plugin": "7.16.0",
-                "@typescript-eslint/parser": "7.16.0",
-                "@typescript-eslint/utils": "7.16.0"
+                "@typescript-eslint/eslint-plugin": "7.16.1",
+                "@typescript-eslint/parser": "7.16.1",
+                "@typescript-eslint/utils": "7.16.1"
             },
             "engines": {
                 "node": "^18.18.0 || >=20.0.0"
@@ -41122,9 +41118,9 @@
             }
         },
         "node_modules/vfile": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz",
-            "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==",
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz",
+            "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==",
             "dependencies": {
                 "@types/unist": "^3.0.0",
                 "unist-util-stringify-position": "^4.0.0",
@@ -41136,9 +41132,9 @@
             }
         },
         "node_modules/vfile-location": {
-            "version": "5.0.2",
-            "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz",
-            "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==",
+            "version": "5.0.3",
+            "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+            "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
             "dependencies": {
                 "@types/unist": "^3.0.0",
                 "vfile": "^6.0.0"
@@ -41324,9 +41320,9 @@
             }
         },
         "node_modules/webpack": {
-            "version": "5.92.1",
-            "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz",
-            "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==",
+            "version": "5.93.0",
+            "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz",
+            "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==",
             "dependencies": {
                 "@types/eslint-scope": "^3.7.3",
                 "@types/estree": "^1.0.5",
@@ -41441,9 +41437,9 @@
             }
         },
         "node_modules/webpack-dev-middleware": {
-            "version": "7.2.1",
-            "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz",
-            "integrity": "sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA==",
+            "version": "7.3.0",
+            "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.3.0.tgz",
+            "integrity": "sha512-xD2qnNew+F6KwOGZR7kWdbIou/ud7cVqLEXeK1q0nHcNsX/u7ul/fSdlOTX4ntSL5FNFy7ZJJXbf0piF591JYw==",
             "dependencies": {
                 "colorette": "^2.0.10",
                 "memfs": "^4.6.0",
diff --git a/package.json b/package.json
index a614d108e..56800edfc 100644
--- a/package.json
+++ b/package.json
@@ -186,7 +186,7 @@
         "express-session": "^1.17.3",
         "express-validator": "^7.0.1",
         "extract-colors": "^4.0.2",
-        "ffmpeg": "0.0.4",
+        "ffmpeg": "^0.0.4",
         "file-loader": "^6.2.0",
         "file-saver": "^2.0.5",
         "find-in-files": "^0.5.0",
diff --git a/src/ClientUtils.ts b/src/ClientUtils.ts
index b890e7bfc..fc415d589 100644
--- a/src/ClientUtils.ts
+++ b/src/ClientUtils.ts
@@ -7,11 +7,11 @@ import { CollectionViewType, DocumentType } from './client/documents/DocumentTyp
 import { Colors } from './client/views/global/globalEnums';
 import { CreateImage } from './client/views/nodes/WebBoxRenderer';
 
-export function DashColor(color: string) {
+export function DashColor(color: string | undefined) {
     try {
         return color ? Color(color.toLowerCase()) : Color('transparent');
     } catch (e) {
-        if (color.includes('gradient')) console.log("using color 'white' in place of :" + color);
+        if (color?.includes('gradient')) console.log("using color 'white' in place of :" + color);
         else console.log('COLOR error:', e);
         return Color('white');
     }
@@ -455,7 +455,7 @@ export function addStyleSheet() {
     const sheets = document.head.appendChild(style);
     return sheets.sheet;
 }
-export function addStyleSheetRule(sheet: CSSStyleSheet | null, selector: string, css: string | {[key:string]: string}, selectorPrefix = '.') {
+export function addStyleSheetRule(sheet: CSSStyleSheet | null, selector: string, css: string | { [key: string]: string }, selectorPrefix = '.') {
     const propText =
         typeof css === 'string'
             ? css
@@ -464,14 +464,14 @@ export function addStyleSheetRule(sheet: CSSStyleSheet | null, selector: string,
                   .join(';');
     return sheet?.insertRule(selectorPrefix + selector + '{' + propText + '}', sheet.cssRules.length);
 }
-export function removeStyleSheetRule(sheet: CSSStyleSheet|null, rule: number) {
+export function removeStyleSheetRule(sheet: CSSStyleSheet | null, rule: number) {
     if (sheet?.rules.length) {
         sheet.removeRule(rule);
         return true;
     }
     return false;
 }
-export function clearStyleSheetRules(sheet: CSSStyleSheet|null) {
+export function clearStyleSheetRules(sheet: CSSStyleSheet | null) {
     if (sheet?.rules.length) {
         numberRange(sheet.rules.length).map(() => sheet.removeRule(0));
         return true;
diff --git a/src/client/views/InkingStroke.tsx b/src/client/views/InkingStroke.tsx
index 55f28f415..784d252a3 100644
--- a/src/client/views/InkingStroke.tsx
+++ b/src/client/views/InkingStroke.tsx
@@ -47,6 +47,7 @@ import { FormattedTextBox, FormattedTextBoxProps } from './nodes/formattedText/F
 import { PinDocView, PinProps } from './PinFuncs';
 import { StyleProp } from './StyleProp';
 
+// eslint-disable-next-line @typescript-eslint/no-var-requires
 const { INK_MASK_SIZE } = require('./global/globalCssVariables.module.scss'); // prettier-ignore
 
 @observer
@@ -292,7 +293,7 @@ export class InkingStroke extends ViewBoxAnnotatableComponent<FieldViewProps>()
      * @param boundsTop the screen space top coordinate of the ink stroke
      * @returns the JSX controls for displaying an editing UI for the stroke (control point & tangent handles)
      */
-    componentUI = (boundsLeft: number, boundsTop: number) => {
+    componentUI = (boundsLeft: number, boundsTop: number): null | JSX.Element => {
         const inkDoc = this.Document;
         const { inkData, inkStrokeWidth } = this.inkScaledData();
         const screenSpaceCenterlineStrokeWidth = Math.min(3, inkStrokeWidth * this.ScreenToLocalBoxXf().inverse().Scale); // the width of the blue line widget that shows the centerline of the ink stroke
@@ -344,12 +345,12 @@ export class InkingStroke extends ViewBoxAnnotatableComponent<FieldViewProps>()
     };
     @computed get fillColor(): string {
         const isInkMask = BoolCast(this.layoutDoc.stroke_isInkMask);
-        return isInkMask ? DashColor(StrCast(this.layoutDoc.fillColor, 'transparent')).blacken(0).rgb().toString() : this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FillColor) ?? 'transparent';
+        return isInkMask ? DashColor(StrCast(this.layoutDoc.fillColor, 'transparent')).blacken(0).rgb().toString() : ((this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FillColor) as 'string') ?? 'transparent');
     }
     @computed get strokeColor() {
         const { inkData } = this.inkScaledData();
         const { fillColor } = this;
-        return !InkingStroke.IsClosed(inkData) && fillColor && fillColor !== 'transparent' ? fillColor : this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.Color) ?? StrCast(this.layoutDoc.color);
+        return !InkingStroke.IsClosed(inkData) && fillColor && fillColor !== 'transparent' ? fillColor : ((this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.Color) as 'string') ?? StrCast(this.layoutDoc.color));
     }
     render() {
         TraceMobx();
@@ -370,8 +371,8 @@ export class InkingStroke extends ViewBoxAnnotatableComponent<FieldViewProps>()
             });
         }
         const highlight = !this.controlUndo && this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.Highlighting);
-        const highlightIndex = highlight?.highlightIndex;
-        const highlightColor = !this._props.isSelected() && !isInkMask && highlight?.highlightIndex ? highlight?.highlightColor : undefined;
+        const { highlightIndex, highlightColor: hColor } = (highlight as { highlightIndex?: number; highlightColor?: string }) ?? { highlightIndex: undefined, highlightColor: undefined };
+        const highlightColor = !this._props.isSelected() && !isInkMask && highlightIndex ? hColor : undefined;
         const color = StrCast(this.layoutDoc.stroke_outlineColor, !closed && fillColor && fillColor !== 'transparent' ? StrCast(this.layoutDoc.color, 'transparent') : 'transparent');
 
         // Visually renders the polygonal line made by the user.
@@ -401,12 +402,12 @@ export class InkingStroke extends ViewBoxAnnotatableComponent<FieldViewProps>()
         );
         const higlightMargin = Math.min(12, Math.max(2, 0.3 * inkStrokeWidth));
         // Invisible polygonal line that enables the ink to be selected by the user.
-        const clickableLine = (downHdlr?: (e: React.PointerEvent) => void, mask: boolean = false): any =>
+        const clickableLine = (downHdlr?: (e: React.PointerEvent) => void, mask: boolean = false) =>
             InteractionUtils.CreatePolyline(
                 inkData,
                 inkLeft,
                 inkTop,
-                mask && color === 'transparent' ? this.strokeColor : highlightColor ?? color,
+                mask && color === 'transparent' ? this.strokeColor : (highlightColor ?? color),
                 inkStrokeWidth,
                 inkStrokeWidth + NumCast(this.layoutDoc.stroke_borderWidth) + (fillColor ? (closed ? higlightMargin : (highlightIndex ?? 0) + higlightMargin) : higlightMargin),
                 StrCast(this.layoutDoc.stroke_lineJoin),
@@ -420,7 +421,7 @@ export class InkingStroke extends ViewBoxAnnotatableComponent<FieldViewProps>()
                 inkScaleX,
                 inkScaleY,
                 '',
-                this._props.pointerEvents?.() ?? 'visiblepainted',
+                this._props.pointerEvents?.() ?? 'visiblePainted',
                 0.0,
                 false,
                 downHdlr,
diff --git a/src/client/views/StyleProvider.tsx b/src/client/views/StyleProvider.tsx
index 618f69221..9cb52aacf 100644
--- a/src/client/views/StyleProvider.tsx
+++ b/src/client/views/StyleProvider.tsx
@@ -144,7 +144,7 @@ export function DefaultStyleProvider(doc: Opt<Doc>, props: Opt<FieldViewProps &
                         highlightStyle: doc.isGroup ? "dotted": highlightStyle,
                         highlightColor,
                         highlightIndex,
-                        highlightStroke: layoutDoc?.layout_isSvg,
+                        highlightStroke: BoolCast(layoutDoc?.layout_isSvg),
                     };
                 }
             }
@@ -378,6 +378,7 @@ export function DefaultStyleProvider(doc: Opt<Doc>, props: Opt<FieldViewProps &
         }
         default:
     }
+    return undefined;
 }
 
 export function DashboardToggleButton(doc: Doc, field: string, onIcon: IconProp, offIcon: IconProp, clickFunc?: () => void) {
diff --git a/src/client/views/collections/CollectionCarousel3DView.tsx b/src/client/views/collections/CollectionCarousel3DView.tsx
index 38f681e87..c799eb3c8 100644
--- a/src/client/views/collections/CollectionCarousel3DView.tsx
+++ b/src/client/views/collections/CollectionCarousel3DView.tsx
@@ -1,5 +1,3 @@
-/* eslint-disable jsx-a11y/no-static-element-interactions */
-/* eslint-disable jsx-a11y/click-events-have-key-events */
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { computed, makeObservable } from 'mobx';
 import { observer } from 'mobx-react';
@@ -15,7 +13,7 @@ import { StyleProp } from '../StyleProp';
 import { DocumentView } from '../nodes/DocumentView';
 import { FocusViewOptions } from '../nodes/FocusViewOptions';
 import './CollectionCarousel3DView.scss';
-import { CollectionSubView } from './CollectionSubView';
+import { CollectionSubView, SubCollectionViewProps } from './CollectionSubView';
 
 // eslint-disable-next-line @typescript-eslint/no-var-requires
 const { CAROUSEL3D_CENTER_SCALE, CAROUSEL3D_SIDE_SCALE, CAROUSEL3D_TOP } = require('../global/globalCssVariables.module.scss');
@@ -25,7 +23,7 @@ export class CollectionCarousel3DView extends CollectionSubView() {
     @computed get scrollSpeed() {
         return this.layoutDoc._autoScrollSpeed ? NumCast(this.layoutDoc._autoScrollSpeed) : 1000; // default scroll speed
     }
-    constructor(props: any) {
+    constructor(props: SubCollectionViewProps) {
         super(props);
         makeObservable(this);
     }
@@ -181,8 +179,8 @@ export class CollectionCarousel3DView extends CollectionSubView() {
                 className="collectionCarousel3DView-outer"
                 ref={this.createDashEventsTarget}
                 style={{
-                    background: this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.BackgroundColor),
-                    color: this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.Color),
+                    background: this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.BackgroundColor) as string,
+                    color: this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.Color) as string,
                 }}>
                 <div className="carousel-wrapper" style={{ transform: `translateX(${this.translateX}px)` }}>
                     {this.content}
diff --git a/src/client/views/collections/CollectionDockingView.tsx b/src/client/views/collections/CollectionDockingView.tsx
index 2a36e96bf..5a142cc6e 100644
--- a/src/client/views/collections/CollectionDockingView.tsx
+++ b/src/client/views/collections/CollectionDockingView.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
 import { action, IReactionDisposer, makeObservable, observable, reaction } from 'mobx';
 import { observer } from 'mobx-react';
 import * as React from 'react';
@@ -28,7 +29,7 @@ import { OverlayView } from '../OverlayView';
 import { ScriptingRepl } from '../ScriptingRepl';
 import { UndoStack } from '../UndoStack';
 import './CollectionDockingView.scss';
-import { CollectionSubView } from './CollectionSubView';
+import { CollectionSubView, SubCollectionViewProps } from './CollectionSubView';
 
 const _global = (window /* browser */ || global) /* node */ as any;
 
@@ -40,7 +41,7 @@ export class CollectionDockingView extends CollectionSubView() {
      * configuring golden layout to render its documents using the specified React component
      * @param ele - typically would be set to TabDocView
      */
-    public static Init(ele: any) {
+    public static Init(ele: JSX.Element | null) {
         this.tabClass = ele;
         DocumentView.addSplit = CollectionDockingView.AddSplit;
     }
@@ -60,7 +61,7 @@ export class CollectionDockingView extends CollectionSubView() {
     private _goldenLayout: any = null;
     static _highlightStyleSheet = addStyleSheet();
 
-    constructor(props: any) {
+    constructor(props: SubCollectionViewProps) {
         super(props);
         makeObservable(this);
         if (this._props.renderDepth < 0) CollectionDockingView.Instance = this;
diff --git a/src/client/views/collections/CollectionSubView.tsx b/src/client/views/collections/CollectionSubView.tsx
index e250d7a90..b7169ece0 100644
--- a/src/client/views/collections/CollectionSubView.tsx
+++ b/src/client/views/collections/CollectionSubView.tsx
@@ -67,7 +67,7 @@ export function CollectionSubView<X>() {
         private gestureDisposer?: GestureUtils.GestureEventDisposer;
         protected _mainCont?: HTMLDivElement;
 
-        constructor(props: any) {
+        constructor(props: X & SubCollectionViewProps) {
             super(props);
             makeObservable(this);
         }
diff --git a/src/client/views/collections/TabDocView.tsx b/src/client/views/collections/TabDocView.tsx
index 46f61290e..f50f7394b 100644
--- a/src/client/views/collections/TabDocView.tsx
+++ b/src/client/views/collections/TabDocView.tsx
@@ -14,7 +14,7 @@ import { Id } from '../../../fields/FieldSymbols';
 import { List } from '../../../fields/List';
 import { FieldId } from '../../../fields/RefField';
 import { ComputedField } from '../../../fields/ScriptField';
-import { Cast, DocCast, NumCast, StrCast, toList } from '../../../fields/Types';
+import { Cast, NumCast, StrCast, toList } from '../../../fields/Types';
 import { DocServer } from '../../DocServer';
 import { CollectionViewType, DocumentType } from '../../documents/DocumentTypes';
 import { Docs } from '../../documents/Documents';
@@ -67,7 +67,7 @@ class TabMiniThumb extends React.Component<TabMiniThumbProps> {
 }
 @observer
 export class TabMinimapView extends ObservableReactComponent<TabMinimapViewProps> {
-    static miniStyleProvider = (doc: Opt<Doc>, props: Opt<FieldViewProps>, property: string): any => {
+    static miniStyleProvider = (doc: Opt<Doc>, props: Opt<FieldViewProps>, property: string) => {
         if (doc) {
             switch (property.split(':')[0]) {
                 case StyleProp.PointerEvents: return 'none';
@@ -274,7 +274,7 @@ export class TabDocView extends ObservableReactComponent<TabDocViewProps> {
     }
 
     static Activate = (tabDoc: Doc) => {
-        const tab = Array.from(CollectionDockingView.Instance?.tabMap!).find(findTab => findTab.DashDoc === tabDoc && !findTab.contentItem.config.props.keyValue);
+        const tab = Array.from(CollectionDockingView.Instance?.tabMap ?? []).find(findTab => findTab.DashDoc === tabDoc && !findTab.contentItem.config.props.keyValue);
         tab?.header.parent.setActiveContentItem(tab.contentItem); // glr: Panning does not work when this is set - (this line is for trying to make a tab that is not topmost become topmost)
         return tab !== undefined;
     };
@@ -286,7 +286,7 @@ export class TabDocView extends ObservableReactComponent<TabDocViewProps> {
     //     }
     //     return undefined;
     // }
-    constructor(props: any) {
+    constructor(props: TabDocViewProps) {
         super(props);
         makeObservable(this);
         DocumentView.activateTabView = TabDocView.Activate;
@@ -399,9 +399,10 @@ export class TabDocView extends ObservableReactComponent<TabDocViewProps> {
                 tab._disposers.color = reaction(
                     () => ({ variant: SnappingManager.userVariantColor, degree: Doc.GetBrushStatus(doc), highlight: DefaultStyleProvider(this._document, undefined, StyleProp.Highlighting) }),
                     ({ variant, degree, highlight }) => {
-                        const color = highlight?.highlightIndex === Doc.DocBrushStatus.highlighted ? highlight.highlightColor : degree ? ['transparent', variant, variant, 'orange'][degree] : variant;
+                        const { highlightIndex, highlightColor } = (highlight as { highlightIndex: number; highlightColor: string }) ?? { highlightIndex: undefined, highlightColor: undefined };
+                        const color = highlightIndex === Doc.DocBrushStatus.highlighted ? highlightColor : degree ? ['transparent', variant, variant, 'orange'][degree] : variant;
 
-                        const textColor = color === variant ? SnappingManager.userColor ?? '' : lightOrDark(color);
+                        const textColor = color === variant ? (SnappingManager.userColor ?? '') : lightOrDark(color);
                         titleEle.style.color = textColor;
                         iconWrap.style.color = textColor;
                         closeWrap.style.color = textColor;
diff --git a/src/client/views/collections/TreeView.tsx b/src/client/views/collections/TreeView.tsx
index f69aea2a7..161d93788 100644
--- a/src/client/views/collections/TreeView.tsx
+++ b/src/client/views/collections/TreeView.tsx
@@ -472,7 +472,7 @@ export class TreeView extends ObservableReactComponent<TreeViewProps> {
     refTransform = (ref: HTMLElement | undefined | null) => {
         if (!ref) return this.ScreenToLocalTransform();
         const { translateX, translateY, scale } = ClientUtils.GetScreenTransform(ref);
-        return new Transform(-translateX, -translateY, 1).scale(1/scale);
+        return new Transform(-translateX, -translateY, 1).scale(1 / scale);
     };
     docTransform = () => this.refTransform(this._dref?.ContentDiv);
     getTransform = () => this.refTransform(this._tref.current);
@@ -777,7 +777,7 @@ export class TreeView extends ObservableReactComponent<TreeViewProps> {
 
     @computed get renderBullet() {
         TraceMobx();
-        const iconType = this.treeView._props.styleProvider?.(this.Document, this.treeView._props, StyleProp.TreeViewIcon + (this.treeViewOpen ? ':treeOpen' : !this.childDocs.length ? ':empty' : '')) || 'question';
+        const iconType = (this.treeView._props.styleProvider?.(this.Document, this.treeView._props, StyleProp.TreeViewIcon + (this.treeViewOpen ? ':treeOpen' : !this.childDocs.length ? ':empty' : '')) as string) || 'question';
         const color = SettingsManager.userColor;
         const checked = this.onCheckedClick ? this.Document.treeView_Checked ?? 'unchecked' : undefined;
         return (
@@ -923,7 +923,7 @@ export class TreeView extends ObservableReactComponent<TreeViewProps> {
                         style={{
                             // just render a title for a tree view label (identified by treeViewDoc being set in 'props')
                             maxWidth: props?.PanelWidth() || undefined,
-                            background: props?.styleProvider?.(doc, props, StyleProp.BackgroundColor),
+                            background: props?.styleProvider?.(doc, props, StyleProp.BackgroundColor) as string,
                             outline: SnappingManager.IsDragging ? undefined: `solid ${highlightColor} ${highlightIndex}px`,
                             paddingLeft: NumCast(treeView.Document.childXPadding, NumCast(treeView._props.childXPadding, Doc.IsComicStyle(doc)?20:0)),
                             paddingRight: NumCast(treeView.Document.childXPadding, NumCast(treeView._props.childXPadding, Doc.IsComicStyle(doc)?20:0)),
@@ -1179,7 +1179,7 @@ export class TreeView extends ObservableReactComponent<TreeViewProps> {
 
     @computed get renderBorder() {
         const sorting = StrCast(this.Document.treeView_SortCriterion, TreeSort.WhenAdded);
-        const sortings = (this._props.styleProvider?.(this.Document, this.treeView._props, StyleProp.TreeViewSortings) ?? {}) as { [key: string]: { color: string; label: string } };
+        const sortings = (this._props.styleProvider?.(this.Document, this.treeView._props, StyleProp.TreeViewSortings) ?? {}) as { [key: string]: { color: string; icon: JSX.Element } };
         return (
             <div className={`treeView-border${this.treeView.outlineMode ? TreeViewType.outline : ''}`} style={{ borderColor: sortings[sorting]?.color }}>
                 {!this.treeViewOpen ? null : this.renderContent}
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx
index de51cc73c..79aad0ef2 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLayoutEngines.tsx
@@ -9,7 +9,7 @@ import { aggregateBounds } from '../../../../Utils';
 
 export interface ViewDefBounds {
     type: string;
-    payload: any;
+    payload: unknown;
     x: number;
     y: number;
     z?: number;
@@ -72,11 +72,15 @@ function toLabel(target: FieldResult<FieldType>) {
  */
 function getTextWidth(text: string, font: string): number {
     // re-use canvas object for better performance
-    const canvas = (getTextWidth as any).canvas || ((getTextWidth as any).canvas = document.createElement('canvas'));
+    const selfStoreHack = getTextWidth as unknown as { canvas: Element };
+    const canvas = (selfStoreHack.canvas = (selfStoreHack.canvas as unknown as HTMLCanvasElement) ?? document.createElement('canvas'));
     const context = canvas.getContext('2d');
-    context.font = font;
-    const metrics = context.measureText(text);
-    return metrics.width;
+    if (context) {
+        context.font = font;
+        const metrics = context.measureText(text);
+        return metrics.width;
+    }
+    return 0;
 }
 
 interface PivotColumn {
@@ -131,13 +135,13 @@ export function computeStarburstLayout(poolData: Map<string, PoolData>, pivotDoc
     return normalizeResults(burstDiam, 12, docMap, poolData, viewDefsToJSX, [], 0, [divider]);
 }
 
-export function computePivotLayout(poolData: Map<string, PoolData>, pivotDoc: Doc, childPairs: { layout: Doc; data?: Doc }[], panelDim: number[], viewDefsToJSX: (views: ViewDefBounds[]) => ViewDefResult[], engineProps: any) {
+export function computePivotLayout(poolData: Map<string, PoolData>, pivotDoc: Doc, childPairs: { layout: Doc; data?: Doc }[], panelDim: number[], viewDefsToJSX: (views: ViewDefBounds[]) => ViewDefResult[], engineProps: unknown) {
     const docMap = new Map<string, PoolData>();
     const fieldKey = 'data';
     const pivotColumnGroups = new Map<FieldResult<FieldType>, PivotColumn>();
 
     let nonNumbers = 0;
-    const pivotFieldKey = toLabel(engineProps?.pivotField ?? pivotDoc._pivotField) || 'author';
+    const pivotFieldKey = toLabel((engineProps as { pivotField?: string })?.pivotField ?? pivotDoc._pivotField) || 'author';
     childPairs.forEach(pair => {
         const listValue = Cast(pair.layout[pivotFieldKey], listSpec('string'), null);
 
@@ -265,7 +269,7 @@ export function computePivotLayout(poolData: Map<string, PoolData>, pivotDoc: Do
         y: -maxColHeight + pivotAxisWidth,
         width: pivotAxisWidth * numCols * expander,
         height: maxColHeight,
-        payload: pivotColumnGroups.get(key)!.filters,
+        payload: pivotColumnGroups.get(key)?.filters,
     }));
     groupNames.push(...dividers);
     // eslint-disable-next-line no-use-before-define
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index 812aa5fa3..39c3da7a5 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -1,6 +1,4 @@
 /* eslint-disable react/jsx-props-no-spreading */
-/* eslint-disable jsx-a11y/click-events-have-key-events */
-/* eslint-disable jsx-a11y/no-static-element-interactions */
 import { Bezier } from 'bezier-js';
 import { Colors } from 'browndash-components';
 import { action, computed, IReactionDisposer, makeObservable, observable, reaction, runInAction } from 'mobx';
@@ -9,7 +7,7 @@ import { computedFn } from 'mobx-utils';
 import * as React from 'react';
 import { ClientUtils, DashColor, lightOrDark, OmitKeys, returnFalse, returnZero, setupMoveUpEvents, UpdateIcon } from '../../../../ClientUtils';
 import { DateField } from '../../../../fields/DateField';
-import { Doc, DocListCast, Field, FieldType, Opt } from '../../../../fields/Doc';
+import { Doc, DocListCast, Field, FieldType, Opt, StrListCast } from '../../../../fields/Doc';
 import { ActiveArrowEnd, ActiveArrowStart, ActiveDash, ActiveEraserWidth, ActiveInkBezierApprox, ActiveInkColor, ActiveInkWidth, ActiveIsInkMask, SetActiveInkColor, SetActiveInkWidth } from '../../nodes/DocumentView';
 import { DocData, Height, Width } from '../../../../fields/DocSymbols';
 import { Id } from '../../../../fields/FieldSymbols';
@@ -46,7 +44,7 @@ import { FormattedTextBox } from '../../nodes/formattedText/FormattedTextBox';
 import { OpenWhere, OpenWhereMod } from '../../nodes/OpenWhere';
 import { PinDocView, PinProps } from '../../PinFuncs';
 import { StyleProp } from '../../StyleProp';
-import { CollectionSubView } from '../CollectionSubView';
+import { CollectionSubView, SubCollectionViewProps } from '../CollectionSubView';
 import { TreeViewType } from '../CollectionTreeViewType';
 import { CollectionFreeFormBackgroundGrid } from './CollectionFreeFormBackgroundGrid';
 import { CollectionFreeFormClusters } from './CollectionFreeFormClusters';
@@ -71,7 +69,7 @@ export interface collectionFreeformViewProps {
     childPointerEvents?: () => string | undefined;
     viewField?: string;
     noOverlay?: boolean; // used to suppress docs in the overlay (z) layer (ie, for minimap since overlay doesn't scale)
-    engineProps?: any;
+    engineProps?: unknown;
     getScrollHeight?: () => number | undefined;
 }
 
@@ -123,14 +121,14 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
     @observable _marqueeViewRef = React.createRef<MarqueeView>();
     @observable _brushedView: { width: number; height: number; panX: number; panY: number } | undefined = undefined; // highlighted region of freeform canvas used by presentations to indicate a region
     @observable GroupChildDrag: boolean = false; // child document view being dragged.  needed to update drop areas of groups when a group item is dragged.
-    @observable _childPointerEvents: 'none' | 'all' | 'visiblepainted' | undefined = undefined;
+    @observable _childPointerEvents: 'none' | 'all' | 'visiblePainted' | undefined = undefined;
     @observable _lightboxDoc: Opt<Doc> = undefined;
     @observable _paintedId = 'id' + Utils.GenerateGuid().replace(/-/g, '');
     @observable _keyframeEditing = false;
     @observable _eraserX: number = 0;
     @observable _eraserY: number = 0;
     @observable _showEraserCircle: boolean = false; // to determine whether the radius eraser should show
-    constructor(props: collectionFreeformViewProps) {
+    constructor(props: SubCollectionViewProps) {
         super(props);
         makeObservable(this);
     }
@@ -140,12 +138,12 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
     @computed get childPointerEvents() {
         return SnappingManager.IsResizing
             ? 'none'
-            : this._props.childPointerEvents?.() ??
+            : (this._props.childPointerEvents?.() ??
                   (this._props.viewDefDivClick || //
                   (this.layoutEngine === computePassLayout.name && !this._props.isSelected()) ||
                   this.isContentActive() === false
                       ? 'none'
-                      : this._props.pointerEvents?.());
+                      : this._props.pointerEvents?.()));
     }
     @computed get contentViews() {
         const viewsMask = this._layoutElements.filter(ele => ele.bounds && !ele.bounds.z && ele.inkMask !== -1 && ele.inkMask !== undefined).map(ele => ele.ele);
@@ -185,7 +183,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
             .transform(this.panZoomXf);
     }
     @computed get backgroundColor() {
-        return this._props.styleProvider?.(this.Document, this._props, StyleProp.BackgroundColor);
+        return this._props.styleProvider?.(this.Document, this._props, StyleProp.BackgroundColor) as string;
     }
     @computed get fitWidth() {
         return this._props.fitWidth?.(this.Document) ?? this.layoutDoc.layout_fitWidth;
@@ -357,7 +355,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
      * @param options
      * @returns
      */
-    focus = (anchor: Doc, options: FocusViewOptions): any => {
+    focus = (anchor: Doc, options: FocusViewOptions) => {
         if (anchor.isGroup && !options.docTransform && options.contextPath?.length) {
             // don't focus on group if there's a context path because we're about to focus on a group item
             // which will override any group focus. (If we allowed the group to focus, it would mark didMove even if there were no net movement)
@@ -374,14 +372,14 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
         const xfToCollection = options?.docTransform ?? Transform.Identity();
         const savedState = { panX: NumCast(this.Document[this.panXFieldKey]), panY: NumCast(this.Document[this.panYFieldKey]), scale: options?.willZoomCentered ? this.Document[this.scaleFieldKey] : undefined };
         const cantTransform = this.fitContentsToBox || ((this.Document.isGroup || this.layoutDoc._lockedTransform) && !DocumentView.LightboxDoc());
-        const { panX, panY, scale } = cantTransform || (!options.willPan && !options.willZoomCentered) ? savedState : this.calculatePanIntoView(anchor, xfToCollection, options?.willZoomCentered ? options?.zoomScale ?? 0.75 : undefined);
+        const { panX, panY, scale } = cantTransform || (!options.willPan && !options.willZoomCentered) ? savedState : this.calculatePanIntoView(anchor, xfToCollection, options?.willZoomCentered ? (options?.zoomScale ?? 0.75) : undefined);
 
         // focus on the document in the collection
         const didMove = !cantTransform && !anchor.z && (panX !== savedState.panX || panY !== savedState.panY || scale !== savedState.scale);
         if (didMove) options.didMove = true;
         // glr: freeform transform speed can be set by adjusting presentation_transition field - needs a way of knowing when presentation is not active...
         if (didMove) {
-            const focusTime = options?.instant ? 0 : options.zoomTime ?? 500;
+            const focusTime = options?.instant ? 0 : (options.zoomTime ?? 500);
             (options.zoomScale ?? options.willZoomCentered) && scale && (this.Document[this.scaleFieldKey] = scale);
             this.setPan(panX, panY, focusTime); // docs that are floating in their collection can't be panned to from their collection -- need to propagate the pan to a parent freeform somehow
             return focusTime;
@@ -1178,6 +1176,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
     // for some reason bezier.js doesn't handle the case of intersecting a linear curve, so we wrap the intersection
     // call in a test for linearity
     bintersects = (curve: Bezier, otherCurve: Bezier) => {
+        // eslint-disable-next-line @typescript-eslint/no-explicit-any
         if ((curve as any)._linear) {
             // bezier.js doesn't intersect properly if the curve is actually a line -- so get intersect other curve against this line, then figure out the t coordinates of the intersection on this line
             const intersections = otherCurve.lineIntersects({ p1: curve.points[0], p2: curve.points[3] });
@@ -1187,6 +1186,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                 return intT ? [intT] : [];
             }
         }
+        // eslint-disable-next-line @typescript-eslint/no-explicit-any
         if ((otherCurve as any)._linear) {
             return curve.lineIntersects({ p1: otherCurve.points[0], p2: otherCurve.points[3] });
         }
@@ -1478,7 +1478,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
         return ret;
     };
     childPointerEventsFunc = () => this._childPointerEvents;
-    childContentsActive = () => (this._props.childContentsActive ?? this.isContentActive() === false ? returnFalse : emptyFunction)();
+    childContentsActive = () => ((this._props.childContentsActive ?? this.isContentActive() === false) ? returnFalse : emptyFunction)();
     getChildDocView(entry: PoolData) {
         const childLayout = entry.pair.layout;
         const childData = entry.pair.data;
@@ -1603,7 +1603,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
         };
     }
 
-    onViewDefDivClick = (e: React.MouseEvent, payload: any) => {
+    onViewDefDivClick = (e: React.MouseEvent, payload: unknown) => {
         (this._props.viewDefDivClick || ScriptCast(this.Document.onViewDefDivClick))?.script.run({ this: this.Document, payload });
         e.stopPropagation();
     };
@@ -1637,7 +1637,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                       ele: (
                           <div
                               className="collectionFreeform-customDiv"
-                              title={viewDef.payload?.join(' ')}
+                              title={StrListCast(viewDef.payload as string).join(' ')}
                               key={'div' + x + y + z + viewDef.payload}
                               onClick={e => this.onViewDefDivClick(e, viewDef)}
                               style={{ width, height, backgroundColor: color, transform }}
@@ -1658,7 +1658,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
 
     doEngineLayout(
         poolData: Map<string, PoolData>,
-        engine: (poolData: Map<string, PoolData>, pivotDoc: Doc, childPairs: { layout: Doc; data?: Doc }[], panelDim: number[], viewDefsToJSX: (views: ViewDefBounds[]) => ViewDefResult[], engineProps: any) => ViewDefResult[]
+        engine: (poolData: Map<string, PoolData>, pivotDoc: Doc, childPairs: { layout: Doc; data?: Doc }[], panelDim: number[], viewDefsToJSX: (views: ViewDefBounds[]) => ViewDefResult[], engineProps: unknown) => ViewDefResult[]
     ) {
         return engine(poolData, this.Document, this.childLayoutPairs, [this._props.PanelWidth(), this._props.PanelHeight()], this.viewDefsToJSX, this._props.engineProps);
     }
@@ -1688,7 +1688,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
             .forEach(entry =>
                 elements.push({
                     ele: this.getChildDocView(entry[1]),
-                    bounds: (entry[1].opacity === 0 ? { payload:undefined, type:"", ...entry[1], width: 0, height: 0 } : { payload:undefined,  type:"",...entry[1] }),
+                    bounds: entry[1].opacity === 0 ? { payload: undefined, type: '', ...entry[1], width: 0, height: 0 } : { payload: undefined, type: '', ...entry[1] },
                     inkMask: BoolCast(entry[1].pair.layout.stroke_isInkMask) ? NumCast(entry[1].pair.layout.opacity, 1) : -1,
                 })
             );
@@ -1771,7 +1771,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                 this._disposers.pointerevents = reaction(
                     () => this.childPointerEvents,
                     pointerevents => {
-                        this._childPointerEvents = pointerevents as any;
+                        this._childPointerEvents = pointerevents as 'none' | 'all' | 'visiblePainted' | undefined;
                     },
                     { fireImmediately: true }
                 );
@@ -1812,24 +1812,25 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
 
     updateIcon = () => {
         const contentDiv = this.DocumentView?.().ContentDiv;
-        contentDiv && UpdateIcon(
-            this.layoutDoc[Id] + '-icon' + new Date().getTime(),
-            contentDiv,
-            NumCast(this.layoutDoc._width),
-            NumCast(this.layoutDoc._height),
-            this._props.PanelWidth(),
-            this._props.PanelHeight(),
-            0,
-            1,
-            false,
-            '',
-            (iconFile, nativeWidth, nativeHeight) => {
-                this.dataDoc.icon = new ImageField(iconFile);
-                this.dataDoc.icon_nativeWidth = nativeWidth;
-                this.dataDoc.icon_nativeHeight = nativeHeight;
-            }
-        );
-    }
+        contentDiv &&
+            UpdateIcon(
+                this.layoutDoc[Id] + '-icon' + new Date().getTime(),
+                contentDiv,
+                NumCast(this.layoutDoc._width),
+                NumCast(this.layoutDoc._height),
+                this._props.PanelWidth(),
+                this._props.PanelHeight(),
+                0,
+                1,
+                false,
+                '',
+                (iconFile, nativeWidth, nativeHeight) => {
+                    this.dataDoc.icon = new ImageField(iconFile);
+                    this.dataDoc.icon_nativeWidth = nativeWidth;
+                    this.dataDoc.icon_nativeHeight = nativeHeight;
+                }
+            );
+    };
 
     @action
     onCursorMove = (e: React.PointerEvent) => {
@@ -2134,7 +2135,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                 onDragOver={e => e.preventDefault()}
                 onContextMenu={this.onContextMenu}
                 style={{
-                    pointerEvents: this._props.isContentActive() && SnappingManager.IsDragging ? 'all' : (this._props.pointerEvents?.() as any),
+                    pointerEvents: this._props.isContentActive() && SnappingManager.IsDragging ? 'all' : this._props.pointerEvents?.(),
                     textAlign: this.isAnnotationOverlay ? 'initial' : undefined,
                     transform: `scale(${this.nativeDimScaling})`,
                     width: `${100 / this.nativeDimScaling}%`,
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 24cb4ccf6..0f2905d5b 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -1,6 +1,5 @@
 /* eslint-disable no-use-before-define */
 /* eslint-disable react/jsx-props-no-spreading */
-/* eslint-disable jsx-a11y/no-static-element-interactions */
 import { IconProp } from '@fortawesome/fontawesome-svg-core';
 import { Howl } from 'howler';
 import { IReactionDisposer, action, computed, makeObservable, observable, reaction, runInAction } from 'mobx';
@@ -55,13 +54,6 @@ import { PresEffect, PresEffectDirection } from './trails/PresEnums';
 import SpringAnimation from './trails/SlideEffect';
 import { SpringType, springMappings } from './trails/SpringUtils';
 
-interface Window {
-    MediaRecorder: MediaRecorder;
-}
-declare class MediaRecorder {
-    constructor(e: any); // whatever MediaRecorder has
-}
-
 export interface DocumentViewProps extends FieldViewSharedProps {
     hideDecorations?: boolean; // whether to suppress all DocumentDecorations when doc is selected
     hideResizeHandles?: boolean; // whether to suppress resized handles on doc decorations when this document is selected
@@ -135,15 +127,15 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
     animateScaleTime = () => this._animateScaleTime ?? 100;
     style = (doc: Doc, sprop: StyleProp | string) => this._props.styleProvider?.(doc, this._props, sprop);
     @computed get opacity()           { return this.style(this.layoutDoc, StyleProp.Opacity) as number; } // prettier-ignore
-    @computed get boxShadow()         { return this.style(this.layoutDoc, StyleProp.BoxShadow); } // prettier-ignore
-    @computed get borderRounding()    { return this.style(this.layoutDoc, StyleProp.BorderRounding); } // prettier-ignore
+    @computed get boxShadow()         { return this.style(this.layoutDoc, StyleProp.BoxShadow) as string; } // prettier-ignore
+    @computed get borderRounding()    { return this.style(this.layoutDoc, StyleProp.BorderRounding) as string; } // prettier-ignore
     @computed get widgetDecorations() { return this.style(this.layoutDoc, StyleProp.Decorations) as JSX.Element; } // prettier-ignore
     @computed get backgroundBoxColor(){ return this.style(this.layoutDoc, StyleProp.BackgroundColor + ':docView') as string; } // prettier-ignore
     @computed get showTitle()         { return this.style(this.layoutDoc, StyleProp.ShowTitle) as Opt<string>; } // prettier-ignore
     @computed get showCaption()       { return this.style(this.layoutDoc, StyleProp.ShowCaption) as string ?? "";  } // prettier-ignore
     @computed get headerMargin()      { return this.style(this.layoutDoc, StyleProp.HeaderMargin)  as number ?? 0; } // prettier-ignore
     @computed get titleHeight()       { return this.style(this.layoutDoc, StyleProp.TitleHeight) as number ?? 0;  } // prettier-ignore
-    @computed get docContents()       { return this.style(this.Document, StyleProp.DocContents); } // prettier-ignore
+    @computed get docContents()       { return this.style(this.Document, StyleProp.DocContents) as JSX.Element; } // prettier-ignore
     @computed get highlighting()      { return this.style(this.Document, StyleProp.Highlighting); } // prettier-ignore
     @computed get borderPath()        { return this.style(this.Document, StyleProp.BorderPath); } // prettier-ignore
 
@@ -164,13 +156,13 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
     /// disable pointer events on content when there's an enabled onClick script (and not in explore mode) and the contents aren't forced active, or if contents are marked inactive
     @computed get _contentPointerEvents() {
         TraceMobx();
-        return this._props.contentPointerEvents ??
+        return (this._props.contentPointerEvents ??
             ((!this.disableClickScriptFunc && //
                 this.onClickHdlr &&
                 !SnappingManager.ExploreMode &&
                 !this.layoutDoc.layout_isSvg &&
                 this.isContentActive() !== true) ||
-                this.isContentActive() === false)
+                this.isContentActive() === false))
             ? 'none'
             : this._pointerEvents;
     }
@@ -224,7 +216,7 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
             { fireImmediately: true }
         );
         this._disposers.pointerevents = reaction(
-            () => this.style(this.Document, StyleProp.PointerEvents) as ("all" | "none" | "visiblePainted" | undefined),
+            () => this.style(this.Document, StyleProp.PointerEvents) as 'all' | 'none' | 'visiblePainted' | undefined,
             pointerevents => {
                 this._pointerEvents = pointerevents;
             },
@@ -450,7 +442,11 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
         if (this.Document === Doc.ActiveDashboard) {
             e.stopPropagation();
             e.preventDefault();
-            alert((e.target as HTMLElement)?.closest?.('*.lm_content') ? "You can't perform this move most likely because you didn't drag the document's title bar to enable embedding in a different document." : 'Linking to document tabs not yet supported.');
+            alert(
+                (e.target as HTMLElement)?.closest?.('*.lm_content')
+                    ? "You can't perform this move most likely because you didn't drag the document's title bar to enable embedding in a different document."
+                    : 'Linking to document tabs not yet supported.'
+            );
             return true;
         }
         const annoData = de.complete.annoDragData;
@@ -897,7 +893,7 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
         const showTitle = this.showTitle?.split(':')[0];
         return !DocCast(this.Document) || GetEffectiveAcl(this.dataDoc) === AclPrivate
             ? null
-            : this.docContents ?? (
+            : (this.docContents ?? (
                   <div
                       className="documentView-node"
                       id={this.Document.type !== DocumentType.LINK ? this._docView?.DocUniqueId : undefined}
@@ -923,27 +919,33 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
                       )}
                       {this.widgetDecorations ?? null}
                   </div>
-              );
+              ));
     };
 
     render() {
         TraceMobx();
         const { highlighting, borderPath } = this;
+        const { highlightIndex, highlightStyle, highlightColor, highlightStroke } = (highlighting as { highlightIndex: number; highlightStyle: string; highlightColor: string; highlightStroke: boolean }) ?? {
+            highlightIndex: undefined,
+            highlightStyle: undefined,
+            highlightColor: undefined,
+            highlightStroke: undefined,
+        };
+        const { clipPath, jsx } = (borderPath as { clipPath: string; jsx: JSX.Element }) ?? { clipPath: undefined, jsx: undefined };
         const boxShadow = !highlighting
             ? this.boxShadow
-            : highlighting && this.borderRounding && highlighting.highlightStyle !== 'dashed'
-              ? `0 0 0 ${highlighting.highlightIndex}px ${highlighting.highlightColor}`
+            : highlighting && this.borderRounding && highlightStyle !== 'dashed'
+              ? `0 0 0 ${highlightIndex}px ${highlightColor}`
               : this.boxShadow || (this.Document.isTemplateForField ? 'black 0.2vw 0.2vw 0.8vw' : undefined);
         const renderDoc = this.renderDoc({
             borderRadius: this.borderRounding,
-            outline: highlighting && !this.borderRounding && !highlighting.highlightStroke ? `${highlighting.highlightColor} ${highlighting.highlightStyle} ${highlighting.highlightIndex}px` : 'solid 0px',
-            border: highlighting && this.borderRounding && highlighting.highlightStyle === 'dashed' ? `${highlighting.highlightStyle} ${highlighting.highlightColor} ${highlighting.highlightIndex}px` : undefined,
+            outline: highlighting && !this.borderRounding && !highlightStroke ? `${highlightColor} ${highlightStyle} ${highlightIndex}px` : 'solid 0px',
+            border: highlighting && this.borderRounding && highlightStyle === 'dashed' ? `${highlightStyle} ${highlightColor} ${highlightIndex}px` : undefined,
             boxShadow,
-            clipPath: borderPath?.clipPath,
+            clipPath,
         });
 
         return (
-            // eslint-disable-next-line jsx-a11y/click-events-have-key-events
             <div
                 className={`${DocumentView.ROOT_DIV} docView-hack`}
                 ref={this._mainCont}
@@ -957,8 +959,8 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
                     borderRadius: this.borderRounding,
                     pointerEvents: this._pointerEvents === 'visiblePainted' ? 'none' : this._pointerEvents, // visible painted means that the underlying doc contents are irregular and will process their own pointer events (otherwise, the contents are expected to fill the entire doc view box so we can handle pointer events here)
                 }}>
-                {this._componentView?.isUnstyledView?.() || this.Document.type === DocumentType.CONFIG ? renderDoc : DocumentViewInternal.AnimationEffect(renderDoc, this.Document[Animation], this.Document)}
-                {borderPath?.jsx}
+                {this._componentView?.isUnstyledView?.() || this.Document.type === DocumentType.CONFIG || !renderDoc ? renderDoc : DocumentViewInternal.AnimationEffect(renderDoc, this.Document[Animation], this.Document)}
+                {jsx}
             </div>
         );
     }
@@ -968,7 +970,22 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
      * @param presEffectDoc presentation effects document that specifies the animation effect parameters
      * @returns a function that will wrap a JSX animation element wrapping any JSX element
      */
-    public static AnimationEffect(renderDoc: JSX.Element, presEffectDoc: Opt<Doc>, root: Doc) {
+    public static AnimationEffect(
+        renderDoc: JSX.Element,
+        presEffectDoc: Opt<
+            | Doc
+            | {
+                  presentation_effectDirection?: string;
+                  followLinkAnimDirection?: string;
+                  presentation_transition?: number;
+                  followLinkTransitionTime?: number;
+                  presentation_effectTiming?: number;
+                  presentation_effect?: string;
+                  followLinkAnimEffect?: string;
+              }
+        >,
+        root: Doc
+    ) {
         const dir = ((presEffectDoc?.presentation_effectDirection ?? presEffectDoc?.followLinkAnimDirection) || PresEffectDirection.Center) as PresEffectDirection;
         const duration = Cast(presEffectDoc?.presentation_transition, 'number', Cast(presEffectDoc?.followLinkTransitionTime, 'number', null));
         const effectProps = {
@@ -982,7 +999,7 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
         };
 
         const timing = StrCast(presEffectDoc?.presentation_effectTiming);
-        const timingConfig = (timing ? JSON.parse(timing) : undefined) ??  {
+        const timingConfig = (timing ? JSON.parse(timing) : undefined) ?? {
             type: SpringType.GENTLE,
             ...springMappings.gentle,
         };
@@ -1054,7 +1071,7 @@ export class DocumentView extends DocComponent<DocumentViewProps>() {
     public static allViews: () => DocumentView[];
     public static addView: (dv: DocumentView) => void | undefined;
     public static removeView: (dv: DocumentView) => void | undefined;
-    public static addViewRenderedCb: (doc: Opt<Doc>, func: (dv: DocumentView) => any) => boolean;
+    public static addViewRenderedCb: (doc: Opt<Doc>, func: (dv: DocumentView) => void) => boolean;
     public static getViews = (doc?: Doc) => Array.from(doc?.[DocViews] ?? []) as DocumentView[];
     public static getFirstDocumentView: (toFind: Doc) => DocumentView | undefined;
     public static getDocumentView: (target: Doc | undefined, preferredCollection?: DocumentView) => Opt<DocumentView>;
@@ -1107,7 +1124,7 @@ export class DocumentView extends DocComponent<DocumentViewProps>() {
     @observable private _htmlOverlayText: Opt<string> = undefined;
     @observable private _isHovering = false;
     @observable private _selected = false;
-    @observable public static CurrentlyPlaying: DocumentView[] = [];  // audio or video media views that are currently playing
+    @observable public static CurrentlyPlaying: DocumentView[] = []; // audio or video media views that are currently playing
 
     @computed private get shouldNotScale() {
         return (this.layout_fitWidth && !this.nativeWidth) || this.ComponentView?.isUnstyledView?.();
@@ -1254,7 +1271,6 @@ export class DocumentView extends DocComponent<DocumentViewProps>() {
     }
 
     public playAnnotation = () => {
-        const self = this;
         const audioAnnoState = this.dataDoc.audioAnnoState ?? AudioAnnoState.stopped;
         const audioAnnos = Cast(this.dataDoc[this.LayoutFieldKey + '_audioAnnotations'], listSpec(AudioField), null);
         const anno = audioAnnos?.lastElement();
@@ -1267,7 +1283,7 @@ export class DocumentView extends DocComponent<DocumentViewProps>() {
                         autoplay: true,
                         loop: false,
                         volume: 0.5,
-                        onend: action(() => { self.dataDoc.audioAnnoState = AudioAnnoState.stopped; }), // prettier-ignore
+                        onend: action(() => { this.dataDoc.audioAnnoState = AudioAnnoState.stopped; }), // prettier-ignore
                     });
                     this.dataDoc.audioAnnoState = AudioAnnoState.playing;
                     break;
@@ -1426,9 +1442,10 @@ export class DocumentView extends DocComponent<DocumentViewProps>() {
                 <div className="documentView-htmlOverlayInner" style={{ transition: `all 500ms`, opacity: this._enableHtmlOverlayTransitions ? 0.9 : 0 }}>
                     {DocumentViewInternal.AnimationEffect(
                         <div className="webBox-textHighlight">
-                            <ObserverJsxParser autoCloseVoidElements key={42} onError={e=> console.log('PARSE error', e)} renderInWrapper={false} jsx={StrCast(this._htmlOverlayText)} />
+                            {/* eslint-disable-next-line @typescript-eslint/no-explicit-any  */}
+                            <ObserverJsxParser autoCloseVoidElements key={42} onError={(e: any) => console.log('PARSE error', e)} renderInWrapper={false} jsx={StrCast(this._htmlOverlayText)} />
                         </div>,
-                        { ...(this._htmlOverlayEffect ?? {}), presentation_effect: effect ?? PresEffect.Expand } as any as Doc,
+                        { ...(this._htmlOverlayEffect ?? {}), presentation_effect: effect ?? PresEffect.Expand },
                         this.Document
                     )}
                 </div>
@@ -1457,7 +1474,7 @@ export class DocumentView extends DocComponent<DocumentViewProps>() {
                         style={{
                             transform: `translate(${this.centeringX}px, ${this.centeringY}px)`,
                             width: xshift ?? `${this._props.PanelWidth() - this.Xshift * 2}px`,
-                            height: this._props.forceAutoHeight ? undefined : yshift ?? (this.layout_fitWidth ? `${this.panelHeight}px` : `${(this.effectiveNativeHeight / this.effectiveNativeWidth) * this._props.PanelWidth()}px`),
+                            height: this._props.forceAutoHeight ? undefined : (yshift ?? (this.layout_fitWidth ? `${this.panelHeight}px` : `${(this.effectiveNativeHeight / this.effectiveNativeWidth) * this._props.PanelWidth()}px`)),
                         }}>
                         <DocumentViewInternal
                             {...this._props}
diff --git a/src/client/views/nodes/FieldView.tsx b/src/client/views/nodes/FieldView.tsx
index 92a518012..c77f5a136 100644
--- a/src/client/views/nodes/FieldView.tsx
+++ b/src/client/views/nodes/FieldView.tsx
@@ -18,7 +18,25 @@ import { OpenWhere } from './OpenWhere';
 
 export type FocusFuncType = (doc: Doc, options: FocusViewOptions) => Opt<number>;
 // eslint-disable-next-line no-use-before-define
-export type StyleProviderFuncType = (doc: Opt<Doc>, props: Opt<FieldViewProps>, property: string) => Opt<FieldType> |{ clipPath: string; jsx: Element; } | JSX.Element | null;
+export type StyleProviderFuncType = (
+    doc: Opt<Doc>,
+    props: Opt<FieldViewProps>,
+    property: string
+) =>
+    | Opt<FieldType>
+    | { clipPath: string; jsx: JSX.Element }
+    | JSX.Element
+    | null
+    | {
+          [key: string]:
+              | {
+                    color: string;
+                    icon: JSX.Element | string;
+                }
+              | undefined;
+      }
+    | { highlightStyle: string; highlightColor: string; highlightIndex: number; highlightStroke: boolean }
+    | undefined;
 //
 // these properties get assigned through the render() method of the DocumentView when it creates this node.
 // However, that only happens because the properties are "defined" in the markup for the field view.
@@ -30,7 +48,7 @@ export interface FieldViewSharedProps {
     LayoutTemplateString?: string;
     LayoutTemplate?: () => Opt<Doc>;
     renderDepth: number;
-    scriptContext?: any; // can be assigned anything and will be passed as 'scriptContext' to any OnClick script that executes on this document
+    scriptContext?: unknown; // can be assigned anything and will be passed as 'scriptContext' to any OnClick script that executes on this document
     xPadding?: number;
     yPadding?: number;
     dontRegisterView?: boolean;
@@ -45,7 +63,7 @@ export interface FieldViewSharedProps {
     containerViewPath?: () => DocumentView[];
     fitContentsToBox?: () => boolean; // used by freeformview to fit its contents to its panel. corresponds to _freeform_fitContentsToBox property on a Document
     isGroupActive?: () => string | undefined; // is this document part of a group that is active
-    setContentViewBox?: (view: ViewBoxInterface<FieldViewProps>) => any; // called by rendered field's viewBox so that DocumentView can make direct calls to the viewBox
+    setContentViewBox?: (view: ViewBoxInterface<FieldViewProps>) => void; // called by rendered field's viewBox so that DocumentView can make direct calls to the viewBox
     PanelWidth: () => number;
     PanelHeight: () => number;
     isDocumentActive?: () => boolean | undefined; // whether a document should handle pointer events
@@ -76,7 +94,7 @@ export interface FieldViewSharedProps {
     bringToFront?: (doc: Doc, sendToBack?: boolean) => void;
     waitForDoubleClickToClick?: () => 'never' | 'always' | undefined;
     defaultDoubleClick?: () => 'default' | 'ignore' | undefined;
-    pointerEvents?: () => Opt<string>;
+    pointerEvents?: () => Opt<'none' | 'all' | 'visiblePainted'>;
     suppressSetHeight?: boolean;
 }
 
diff --git a/src/client/views/nodes/RecordingBox/RecordingView.tsx b/src/client/views/nodes/RecordingBox/RecordingView.tsx
index b8451fe60..37ffca2d6 100644
--- a/src/client/views/nodes/RecordingBox/RecordingView.tsx
+++ b/src/client/views/nodes/RecordingBox/RecordingView.tsx
@@ -1,6 +1,4 @@
-/* eslint-disable jsx-a11y/label-has-associated-control */
 /* eslint-disable react/button-has-type */
-/* eslint-disable jsx-a11y/control-has-associated-label */
 import * as React from 'react';
 import { useEffect, useRef, useState } from 'react';
 import { IconContext } from 'react-icons';
@@ -14,7 +12,7 @@ import { ProgressBar } from './ProgressBar';
 import './RecordingView.scss';
 
 export interface MediaSegment {
-    videoChunks: any[];
+    videoChunks: Blob[];
     endTime: number;
     startTime: number;
     presentation?: Presentation;
@@ -91,15 +89,15 @@ export function RecordingView(props: IRecordingViewProps) {
     }, []);
 
     useEffect(() => {
-        let interval: any = null;
+        let interval: null | NodeJS.Timeout = null;
         if (recording) {
             interval = setInterval(() => {
                 setRecordingTimer(unit => unit + 1);
             }, 10);
         } else if (!recording && recordingTimer !== 0) {
-            clearInterval(interval);
+            interval && clearInterval(interval);
         }
-        return () => clearInterval(interval);
+        return interval ? () => clearInterval(interval!) : undefined;
     }, [recording]);
 
     const setVideoProgressHelper = (curProgrss: number) => {
@@ -127,9 +125,9 @@ export function RecordingView(props: IRecordingViewProps) {
         if (!videoRecorder.current) videoRecorder.current = new MediaRecorder(await startShowingStream());
 
         // temporary chunks of video
-        let videoChunks: any = [];
+        let videoChunks: Blob[] = [];
 
-        videoRecorder.current.ondataavailable = (event: any) => {
+        videoRecorder.current.ondataavailable = (event: BlobEvent) => {
             if (event.data.size > 0) videoChunks.push(event.data);
         };
 
diff --git a/src/client/views/nodes/ScreenshotBox.tsx b/src/client/views/nodes/ScreenshotBox.tsx
index 3be50f5e6..9ef1071f7 100644
--- a/src/client/views/nodes/ScreenshotBox.tsx
+++ b/src/client/views/nodes/ScreenshotBox.tsx
@@ -1,4 +1,3 @@
-/* eslint-disable jsx-a11y/media-has-caption */
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import * as React from 'react';
 // import { Canvas } from '@react-three/fiber';
-- 
cgit v1.2.3-70-g09d2

