diff --git a/ExpressAPI/.eslintignore b/ExpressAPI/.eslintignore
deleted file mode 100644
index d20e8f3982dc1099c7b4840a21672271652c39c1..0000000000000000000000000000000000000000
--- a/ExpressAPI/.eslintignore
+++ /dev/null
@@ -1,4 +0,0 @@
-dist
-node_modules
-logs
-prisma
\ No newline at end of file
diff --git a/ExpressAPI/.eslintrc.json b/ExpressAPI/.eslintrc.json
deleted file mode 100644
index be8c02d07111eec0c73437a65326e56150fda24d..0000000000000000000000000000000000000000
--- a/ExpressAPI/.eslintrc.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "root"   : true,
-    "parser" : "@typescript-eslint/parser",
-    "plugins": [
-        "@typescript-eslint"
-    ],
-    "extends": [
-        "eslint:recommended",
-        "plugin:@typescript-eslint/recommended"
-    ]
-}
\ No newline at end of file
diff --git a/ExpressAPI/.idea/jsLinters/eslint.xml b/ExpressAPI/.idea/jsLinters/eslint.xml
index 541945bb0819b8ff4a3dae9431632ebd10e6f98b..131435bc5a3326955d1b8c29a70c927d59e3c00d 100644
--- a/ExpressAPI/.idea/jsLinters/eslint.xml
+++ b/ExpressAPI/.idea/jsLinters/eslint.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="EslintConfiguration">
+    <custom-configuration-file used="false" path="eslint.config.mjs" />
     <option name="fix-on-save" value="true" />
   </component>
 </project>
\ No newline at end of file
diff --git a/ExpressAPI/eslint.config.mjs b/ExpressAPI/eslint.config.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..4d80e1f605598a5d16d208cefee2d72ae5a9585c
--- /dev/null
+++ b/ExpressAPI/eslint.config.mjs
@@ -0,0 +1,24 @@
+// @ts-check
+// @formatter:off
+
+import eslint from '@eslint/js';
+import tseslint from 'typescript-eslint';
+
+export default tseslint.config({
+                                   ignores: [ 'dist/*', 'node_modules/*', 'logs/*', 'prisma/*', 'eslint.config.mjs' ]
+                               }, eslint.configs.recommended, ...tseslint.configs.recommendedTypeChecked, {
+                                   languageOptions: {
+                                       parserOptions: {
+                                           project: true, tsconfigRootDir: import.meta.dirname
+                                       }
+                                   }
+                               }, {
+                                   plugins: {
+                                       '@typescript-eslint': tseslint.plugin
+                                   }, rules: {
+                                       '@typescript-eslint/no-unsafe-assignment': 'off',
+                                       '@typescript-eslint/no-unsafe-member-access': 'off',
+                                       '@typescript-eslint/require-await': 'off',
+                                       '@typescript-eslint/restrict-template-expressions': 'off',
+                                   }
+                               });
\ No newline at end of file
diff --git a/ExpressAPI/package-lock.json b/ExpressAPI/package-lock.json
index f1471fc20b2291036d8bce3fe2578ea422bda97e..52616b25f1eabbeefc52acc91712ef4d91754ce7 100644
--- a/ExpressAPI/package-lock.json
+++ b/ExpressAPI/package-lock.json
@@ -50,16 +50,16 @@
                 "@types/swagger-ui-express": "^4.1.6",
                 "@types/tar-stream": "^3.1.3",
                 "@types/uuid": "^9.0.8",
-                "@typescript-eslint/eslint-plugin": "^6.21.0",
-                "@typescript-eslint/parser": "^6.21.0",
                 "dotenv-cli": "^7.3.0",
                 "dotenv-vault": "^1.26.0",
+                "eslint": "^8.57.0",
                 "genversion": "^3.2.0",
                 "nodemon": "^3.0.3",
                 "npm": "^10.4.0",
                 "prisma": "^5.9.1",
                 "tsx": "^4.7.1",
-                "typescript": "^5.4.3"
+                "typescript": "^5.4.3",
+                "typescript-eslint": "^7.4.0"
             }
         },
         "node_modules/@aashutoshrathi/word-wrap": {
@@ -67,7 +67,6 @@
             "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
             "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -532,7 +531,6 @@
             "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
             "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
@@ -556,18 +554,33 @@
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
             "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "balanced-match": "^1.0.0",
                 "concat-map": "0.0.1"
             }
         },
+        "node_modules/@eslint/eslintrc/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@eslint/eslintrc/node_modules/minimatch": {
             "version": "3.1.2",
             "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
             "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "brace-expansion": "^1.1.7"
             },
@@ -575,12 +588,17 @@
                 "node": "*"
             }
         },
+        "node_modules/@eslint/eslintrc/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@eslint/js": {
             "version": "8.57.0",
             "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
             "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
             }
@@ -635,7 +653,6 @@
             "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
             "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "@humanwhocodes/object-schema": "^2.0.2",
                 "debug": "^4.3.1",
@@ -650,18 +667,33 @@
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
             "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "balanced-match": "^1.0.0",
                 "concat-map": "0.0.1"
             }
         },
+        "node_modules/@humanwhocodes/config-array/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
             "version": "3.1.2",
             "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
             "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "brace-expansion": "^1.1.7"
             },
@@ -669,12 +701,17 @@
                 "node": "*"
             }
         },
+        "node_modules/@humanwhocodes/config-array/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@humanwhocodes/module-importer": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
             "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=12.22"
             },
@@ -687,8 +724,7 @@
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
             "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/@jridgewell/resolve-uri": {
             "version": "3.1.2",
@@ -798,6 +834,23 @@
                 "sprintf-js": "~1.0.2"
             }
         },
+        "node_modules/@oclif/core/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@oclif/core/node_modules/js-yaml": {
             "version": "3.14.1",
             "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -811,6 +864,12 @@
                 "js-yaml": "bin/js-yaml.js"
             }
         },
+        "node_modules/@oclif/core/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@oclif/linewrap": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz",
@@ -877,6 +936,23 @@
                 "sprintf-js": "~1.0.2"
             }
         },
+        "node_modules/@oclif/plugin-help/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@oclif/plugin-help/node_modules/js-yaml": {
             "version": "3.14.1",
             "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -890,6 +966,12 @@
                 "js-yaml": "bin/js-yaml.js"
             }
         },
+        "node_modules/@oclif/plugin-help/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@oclif/plugin-not-found": {
             "version": "2.4.3",
             "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-2.4.3.tgz",
@@ -952,6 +1034,23 @@
                 "sprintf-js": "~1.0.2"
             }
         },
+        "node_modules/@oclif/plugin-not-found/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@oclif/plugin-not-found/node_modules/js-yaml": {
             "version": "3.14.1",
             "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -965,6 +1064,12 @@
                 "js-yaml": "bin/js-yaml.js"
             }
         },
+        "node_modules/@oclif/plugin-not-found/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@oclif/plugin-update": {
             "version": "3.2.4",
             "resolved": "https://registry.npmjs.org/@oclif/plugin-update/-/plugin-update-3.2.4.tgz",
@@ -1036,6 +1141,23 @@
                 "sprintf-js": "~1.0.2"
             }
         },
+        "node_modules/@oclif/plugin-update/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@oclif/plugin-update/node_modules/js-yaml": {
             "version": "3.14.1",
             "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -1049,6 +1171,12 @@
                 "js-yaml": "bin/js-yaml.js"
             }
         },
+        "node_modules/@oclif/plugin-update/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@oclif/plugin-warn-if-update-available": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.1.1.tgz",
@@ -1114,6 +1242,23 @@
                 "sprintf-js": "~1.0.2"
             }
         },
+        "node_modules/@oclif/plugin-warn-if-update-available/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@oclif/plugin-warn-if-update-available/node_modules/js-yaml": {
             "version": "3.14.1",
             "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -1127,6 +1272,12 @@
                 "js-yaml": "bin/js-yaml.js"
             }
         },
+        "node_modules/@oclif/plugin-warn-if-update-available/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@oclif/screen": {
             "version": "3.0.8",
             "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.8.tgz",
@@ -1507,16 +1658,16 @@
             "dev": true
         },
         "node_modules/@typescript-eslint/eslint-plugin": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
-            "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz",
+            "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/regexpp": "^4.5.1",
-                "@typescript-eslint/scope-manager": "6.21.0",
-                "@typescript-eslint/type-utils": "6.21.0",
-                "@typescript-eslint/utils": "6.21.0",
-                "@typescript-eslint/visitor-keys": "6.21.0",
+                "@typescript-eslint/scope-manager": "7.4.0",
+                "@typescript-eslint/type-utils": "7.4.0",
+                "@typescript-eslint/utils": "7.4.0",
+                "@typescript-eslint/visitor-keys": "7.4.0",
                 "debug": "^4.3.4",
                 "graphemer": "^1.4.0",
                 "ignore": "^5.2.4",
@@ -1525,15 +1676,15 @@
                 "ts-api-utils": "^1.0.1"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/typescript-eslint"
             },
             "peerDependencies": {
-                "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
-                "eslint": "^7.0.0 || ^8.0.0"
+                "@typescript-eslint/parser": "^7.0.0",
+                "eslint": "^8.56.0"
             },
             "peerDependenciesMeta": {
                 "typescript": {
@@ -1541,27 +1692,50 @@
                 }
             }
         },
+        "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@typescript-eslint/parser": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
-            "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz",
+            "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/scope-manager": "6.21.0",
-                "@typescript-eslint/types": "6.21.0",
-                "@typescript-eslint/typescript-estree": "6.21.0",
-                "@typescript-eslint/visitor-keys": "6.21.0",
+                "@typescript-eslint/scope-manager": "7.4.0",
+                "@typescript-eslint/types": "7.4.0",
+                "@typescript-eslint/typescript-estree": "7.4.0",
+                "@typescript-eslint/visitor-keys": "7.4.0",
                 "debug": "^4.3.4"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/typescript-eslint"
             },
             "peerDependencies": {
-                "eslint": "^7.0.0 || ^8.0.0"
+                "eslint": "^8.56.0"
             },
             "peerDependenciesMeta": {
                 "typescript": {
@@ -1569,17 +1743,40 @@
                 }
             }
         },
+        "node_modules/@typescript-eslint/parser/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@typescript-eslint/parser/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@typescript-eslint/scope-manager": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
-            "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz",
+            "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.21.0",
-                "@typescript-eslint/visitor-keys": "6.21.0"
+                "@typescript-eslint/types": "7.4.0",
+                "@typescript-eslint/visitor-keys": "7.4.0"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
@@ -1587,25 +1784,25 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
-            "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz",
+            "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/typescript-estree": "6.21.0",
-                "@typescript-eslint/utils": "6.21.0",
+                "@typescript-eslint/typescript-estree": "7.4.0",
+                "@typescript-eslint/utils": "7.4.0",
                 "debug": "^4.3.4",
                 "ts-api-utils": "^1.0.1"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/typescript-eslint"
             },
             "peerDependencies": {
-                "eslint": "^7.0.0 || ^8.0.0"
+                "eslint": "^8.56.0"
             },
             "peerDependenciesMeta": {
                 "typescript": {
@@ -1613,13 +1810,36 @@
                 }
             }
         },
+        "node_modules/@typescript-eslint/type-utils/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@typescript-eslint/type-utils/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@typescript-eslint/types": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
-            "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz",
+            "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==",
             "dev": true,
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
@@ -1627,13 +1847,13 @@
             }
         },
         "node_modules/@typescript-eslint/typescript-estree": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
-            "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz",
+            "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.21.0",
-                "@typescript-eslint/visitor-keys": "6.21.0",
+                "@typescript-eslint/types": "7.4.0",
+                "@typescript-eslint/visitor-keys": "7.4.0",
                 "debug": "^4.3.4",
                 "globby": "^11.1.0",
                 "is-glob": "^4.0.3",
@@ -1642,7 +1862,7 @@
                 "ts-api-utils": "^1.0.1"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
@@ -1654,6 +1874,23 @@
                 }
             }
         },
+        "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
             "version": "9.0.3",
             "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
@@ -1669,42 +1906,48 @@
                 "url": "https://github.com/sponsors/isaacs"
             }
         },
+        "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/@typescript-eslint/utils": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
-            "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz",
+            "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.4.0",
                 "@types/json-schema": "^7.0.12",
                 "@types/semver": "^7.5.0",
-                "@typescript-eslint/scope-manager": "6.21.0",
-                "@typescript-eslint/types": "6.21.0",
-                "@typescript-eslint/typescript-estree": "6.21.0",
+                "@typescript-eslint/scope-manager": "7.4.0",
+                "@typescript-eslint/types": "7.4.0",
+                "@typescript-eslint/typescript-estree": "7.4.0",
                 "semver": "^7.5.4"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/typescript-eslint"
             },
             "peerDependencies": {
-                "eslint": "^7.0.0 || ^8.0.0"
+                "eslint": "^8.56.0"
             }
         },
         "node_modules/@typescript-eslint/visitor-keys": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
-            "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz",
+            "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.21.0",
+                "@typescript-eslint/types": "7.4.0",
                 "eslint-visitor-keys": "^3.4.1"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
@@ -1715,8 +1958,7 @@
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
             "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/abbrev": {
             "version": "1.1.1",
@@ -1765,7 +2007,6 @@
             "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
             "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
             "dev": true,
-            "peer": true,
             "peerDependencies": {
                 "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
             }
@@ -1784,7 +2025,6 @@
             "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
             "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "fast-deep-equal": "^3.1.1",
                 "fast-json-stable-stringify": "^2.0.0",
@@ -1800,8 +2040,7 @@
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
             "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/ansi-escapes": {
             "version": "4.3.2",
@@ -2054,19 +2293,6 @@
                 "node": ">= 0.8"
             }
         },
-        "node_modules/body-parser/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/body-parser/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
         "node_modules/body-parser/node_modules/qs": {
             "version": "6.11.0",
             "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -2193,7 +2419,6 @@
             "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
             "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=6"
             }
@@ -2490,19 +2715,6 @@
                 "node": ">= 0.8.0"
             }
         },
-        "node_modules/compression/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/compression/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
         "node_modules/concat-map": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2649,20 +2861,11 @@
             "dev": true
         },
         "node_modules/debug": {
-            "version": "4.3.4",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-            "dev": true,
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
             "dependencies": {
-                "ms": "2.1.2"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "peerDependenciesMeta": {
-                "supports-color": {
-                    "optional": true
-                }
+                "ms": "2.0.0"
             }
         },
         "node_modules/decko": {
@@ -2675,8 +2878,7 @@
             "version": "0.1.4",
             "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
             "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/defaults": {
             "version": "1.0.4",
@@ -2757,7 +2959,6 @@
             "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
             "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "esutils": "^2.0.2"
             },
@@ -2986,7 +3187,6 @@
             "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
             "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.2.0",
                 "@eslint-community/regexpp": "^4.6.1",
@@ -3042,7 +3242,6 @@
             "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
             "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "esrecurse": "^4.3.0",
                 "estraverse": "^5.2.0"
@@ -3071,18 +3270,33 @@
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
             "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "balanced-match": "^1.0.0",
                 "concat-map": "0.0.1"
             }
         },
+        "node_modules/eslint/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/eslint/node_modules/glob-parent": {
             "version": "6.0.2",
             "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
             "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "is-glob": "^4.0.3"
             },
@@ -3095,7 +3309,6 @@
             "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
             "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "brace-expansion": "^1.1.7"
             },
@@ -3103,12 +3316,17 @@
                 "node": "*"
             }
         },
+        "node_modules/eslint/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/espree": {
             "version": "9.6.1",
             "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
             "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "acorn": "^8.9.0",
                 "acorn-jsx": "^5.3.2",
@@ -3139,7 +3357,6 @@
             "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
             "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "estraverse": "^5.1.0"
             },
@@ -3152,7 +3369,6 @@
             "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
             "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "estraverse": "^5.2.0"
             },
@@ -3165,7 +3381,6 @@
             "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
             "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=4.0"
             }
@@ -3175,7 +3390,6 @@
             "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
             "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -3256,19 +3470,6 @@
                 "node": ">= 8.0.0"
             }
         },
-        "node_modules/express/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/express/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
         "node_modules/express/node_modules/qs": {
             "version": "6.11.0",
             "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -3347,8 +3548,7 @@
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
             "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/fast-levenshtein": {
             "version": "3.0.0",
@@ -3417,7 +3617,6 @@
             "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
             "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "flat-cache": "^3.0.4"
             },
@@ -3472,19 +3671,6 @@
                 "node": ">= 0.8"
             }
         },
-        "node_modules/finalhandler/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/finalhandler/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
         "node_modules/find-package": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/find-package/-/find-package-1.0.0.tgz",
@@ -3499,7 +3685,6 @@
             "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
             "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "locate-path": "^6.0.0",
                 "path-exists": "^4.0.0"
@@ -3516,7 +3701,6 @@
             "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
             "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "flatted": "^3.2.9",
                 "keyv": "^4.5.3",
@@ -3530,8 +3714,7 @@
             "version": "3.3.1",
             "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
             "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/fn.name": {
             "version": "1.1.0",
@@ -3771,7 +3954,6 @@
             "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
             "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
             },
@@ -3787,7 +3969,6 @@
             "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
             "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=10"
             },
@@ -3937,6 +4118,29 @@
                 "node": ">=8.0.0"
             }
         },
+        "node_modules/http-call/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/http-call/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/http-errors": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -4023,7 +4227,6 @@
             "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
             "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "parent-module": "^1.0.0",
                 "resolve-from": "^4.0.0"
@@ -4040,7 +4243,6 @@
             "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
             "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=0.8.19"
             }
@@ -4203,7 +4405,6 @@
             "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
             "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=8"
             }
@@ -4334,8 +4535,7 @@
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
             "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/json-parse-better-errors": {
             "version": "1.0.2",
@@ -4362,8 +4562,7 @@
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
             "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/json5": {
             "version": "2.2.3",
@@ -4409,6 +4608,11 @@
                 "npm": ">=6"
             }
         },
+        "node_modules/jsonwebtoken/node_modules/ms": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+        },
         "node_modules/jwa": {
             "version": "1.4.1",
             "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -4433,7 +4637,6 @@
             "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
             "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "json-buffer": "3.0.1"
             }
@@ -4448,7 +4651,6 @@
             "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
             "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "prelude-ls": "^1.2.1",
                 "type-check": "~0.4.0"
@@ -4462,7 +4664,6 @@
             "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
             "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "p-locate": "^5.0.0"
             },
@@ -4524,8 +4725,7 @@
             "version": "4.6.2",
             "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
             "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/lodash.once": {
             "version": "4.1.1",
@@ -4601,6 +4801,11 @@
                 "node": ">= 12.0.0"
             }
         },
+        "node_modules/logform/node_modules/ms": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+        },
         "node_modules/loose-envify": {
             "version": "1.4.0",
             "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -4845,19 +5050,6 @@
                 "node": ">= 0.8.0"
             }
         },
-        "node_modules/morgan/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/morgan/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
         "node_modules/morgan/node_modules/on-finished": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -4870,9 +5062,9 @@
             }
         },
         "node_modules/ms": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
         },
         "node_modules/multer": {
             "version": "1.4.5-lts.1",
@@ -5071,6 +5263,23 @@
                 "concat-map": "0.0.1"
             }
         },
+        "node_modules/nodemon/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/nodemon/node_modules/has-flag": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -5092,6 +5301,12 @@
                 "node": "*"
             }
         },
+        "node_modules/nodemon/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/nodemon/node_modules/supports-color": {
             "version": "5.5.0",
             "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -8061,7 +8276,6 @@
             "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
             "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "@aashutoshrathi/word-wrap": "^1.2.3",
                 "deep-is": "^0.1.3",
@@ -8078,8 +8292,7 @@
             "version": "2.0.6",
             "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/ora": {
             "version": "5.4.1",
@@ -8118,7 +8331,6 @@
             "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
             "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "yocto-queue": "^0.1.0"
             },
@@ -8134,7 +8346,6 @@
             "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
             "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "p-limit": "^3.0.2"
             },
@@ -8150,7 +8361,6 @@
             "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
             "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "callsites": "^3.0.0"
             },
@@ -8217,7 +8427,6 @@
             "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
             "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=8"
             }
@@ -8358,7 +8567,6 @@
             "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
             "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">= 0.8.0"
             }
@@ -8686,7 +8894,6 @@
             "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
             "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=4"
             }
@@ -8728,7 +8935,6 @@
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
             "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "glob": "^7.1.3"
             },
@@ -8844,19 +9050,6 @@
                 "node": ">= 0.8.0"
             }
         },
-        "node_modules/send/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/send/node_modules/debug/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
         "node_modules/send/node_modules/ms": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -9053,6 +9246,29 @@
                 "ws": "^7.4.2"
             }
         },
+        "node_modules/simple-websocket/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/simple-websocket/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
         "node_modules/simple-websocket/node_modules/readable-stream": {
             "version": "3.6.2",
             "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -9215,7 +9431,6 @@
             "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
             "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=8"
             },
@@ -9573,7 +9788,6 @@
             "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
             "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "prelude-ls": "^1.2.1"
             },
@@ -9623,6 +9837,32 @@
                 "node": ">=14.17"
             }
         },
+        "node_modules/typescript-eslint": {
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.4.0.tgz",
+            "integrity": "sha512-8GYQsb/joknlAZEAs/kqonfrsAc98C5DoellmwHREPqKwSTKSY2YB93IwmvNuX6+WE5QkKc31X9wHo/UcpYXpw==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/eslint-plugin": "7.4.0",
+                "@typescript-eslint/parser": "7.4.0",
+                "@typescript-eslint/utils": "7.4.0"
+            },
+            "engines": {
+                "node": "^18.18.0 || >=20.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependencies": {
+                "eslint": "^8.56.0"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/uglify-js": {
             "version": "3.17.4",
             "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
@@ -9972,7 +10212,6 @@
             "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
             "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=10"
             },
diff --git a/ExpressAPI/package.json b/ExpressAPI/package.json
index 5756151d8890e58f3fccdbfc538d6550b19c9274..3f75499e5ae5978cbae89c9d73204b71f57cf3e7 100644
--- a/ExpressAPI/package.json
+++ b/ExpressAPI/package.json
@@ -56,28 +56,28 @@
         "zod-validation-error": "^3.0.0"
     },
     "devDependencies": {
-        "@redocly/cli"                    : "^1.8.2",
-        "@types/compression"              : "^1.7.5",
-        "@types/cors"                     : "^2.8.17",
-        "@types/express"                  : "^4.17.21",
-        "@types/jsonwebtoken"             : "^9.0.5",
-        "@types/morgan"                   : "^1.9.9",
-        "@types/multer"                   : "^1.4.11",
-        "@types/node"                     : "^20.11.17",
-        "@types/parse-link-header"        : "^2.0.3",
-        "@types/semver"                   : "^7.5.6",
-        "@types/swagger-ui-express"       : "^4.1.6",
-        "@types/tar-stream"               : "^3.1.3",
-        "@types/uuid"                     : "^9.0.8",
-        "@typescript-eslint/eslint-plugin": "^6.21.0",
-        "@typescript-eslint/parser"       : "^6.21.0",
-        "dotenv-cli"                      : "^7.3.0",
-        "dotenv-vault"                    : "^1.26.0",
-        "genversion"                      : "^3.2.0",
-        "nodemon"                         : "^3.0.3",
-        "npm"                             : "^10.4.0",
-        "prisma"                          : "^5.9.1",
-        "tsx"                             : "^4.7.1",
-        "typescript"                      : "^5.4.3"
+        "@redocly/cli"             : "^1.8.2",
+        "@types/compression"       : "^1.7.5",
+        "@types/cors"              : "^2.8.17",
+        "@types/express"           : "^4.17.21",
+        "@types/jsonwebtoken"      : "^9.0.5",
+        "@types/morgan"            : "^1.9.9",
+        "@types/multer"            : "^1.4.11",
+        "@types/node"              : "^20.11.17",
+        "@types/parse-link-header" : "^2.0.3",
+        "@types/semver"            : "^7.5.6",
+        "@types/swagger-ui-express": "^4.1.6",
+        "@types/tar-stream"        : "^3.1.3",
+        "@types/uuid"              : "^9.0.8",
+        "dotenv-cli"               : "^7.3.0",
+        "dotenv-vault"             : "^1.26.0",
+        "eslint"                   : "^8.57.0",
+        "genversion"               : "^3.2.0",
+        "nodemon"                  : "^3.0.3",
+        "npm"                      : "^10.4.0",
+        "prisma"                   : "^5.9.1",
+        "tsx"                      : "^4.7.1",
+        "typescript"               : "^5.4.3",
+        "typescript-eslint"        : "^7.4.0"
     }
 }
diff --git a/ExpressAPI/src/controllers/Session.ts b/ExpressAPI/src/controllers/Session.ts
index 3c3bae24d0d118a5e51ccddaa4ec9999ebd36576..d3063ea19457c4c8c2a01fab4315abf68d9df6d1 100644
--- a/ExpressAPI/src/controllers/Session.ts
+++ b/ExpressAPI/src/controllers/Session.ts
@@ -29,7 +29,7 @@ class Session {
 
                 if ( jwtData.profile ) {
                     this.profile = jwtData.profile;
-                    this.profile = await UserManager.getById(this.profile.id!) ?? this.profile;
+                    this.profile = await UserManager.getById(this.profile.id) ?? this.profile;
                 }
             } catch ( err ) {
                 res.sendStatus(StatusCodes.UNAUTHORIZED).end();
@@ -66,8 +66,8 @@ class Session {
      */
     sendResponse(res: express.Response | undefined, code: number, data?: unknown, descriptionOverride?: string, internalCode?: number) {
         if ( res ) {
-            Promise.resolve(data).then((toReturn: unknown) => {
-                this.getResponse(internalCode ?? code, toReturn, descriptionOverride).then(response => {
+            void Promise.resolve(data).then((toReturn: unknown) => {
+                void this.getResponse(internalCode ?? code, toReturn, descriptionOverride).then(response => {
                     res.status(code).json(response);
                 });
             });
diff --git a/ExpressAPI/src/express/API.ts b/ExpressAPI/src/express/API.ts
index 4245d9212b7cf423b3b27ff3c43352654d285184..75352032d28438703694ed12386f8e0742a17652 100644
--- a/ExpressAPI/src/express/API.ts
+++ b/ExpressAPI/src/express/API.ts
@@ -45,9 +45,11 @@ class API implements WorkerTask {
         this.backend.use(cors()); //Allow CORS requests
         this.backend.use(compression()); //Compress responses
 
-        this.backend.use(async (_req, res, next) => {
-            res.header('dojocli-latest-version', await DojoCliVersionHelper.getLatestVersion());
-            next();
+        this.backend.use((_req, res, next) => {
+            void DojoCliVersionHelper.getLatestVersion().then((latestVersion) => {
+                res.header('dojocli-latest-version', latestVersion);
+                next();
+            });
         });
     }
 
diff --git a/ExpressAPI/src/helpers/DojoValidators.ts b/ExpressAPI/src/helpers/DojoValidators.ts
index cef01a07a39f009cbd2e8e092e9c79d6bb506fb6..c00cbcac97d09495dd2d05404f2f9deb4e766f18 100644
--- a/ExpressAPI/src/helpers/DojoValidators.ts
+++ b/ExpressAPI/src/helpers/DojoValidators.ts
@@ -8,6 +8,7 @@ import Json5FileValidator                                           from '../sha
 import ExerciseResultsFile                                          from '../shared/types/Dojo/ExerciseResultsFile.js';
 import ParamsCallbackManager                                        from '../middlewares/ParamsCallbackManager.js';
 import ExerciseManager                                              from '../managers/ExerciseManager.js';
+import Toolbox                                                      from '../shared/helpers/Toolbox.js';
 
 
 declare type DojoMeta = Meta & {
@@ -44,7 +45,7 @@ class DojoValidators {
     readonly jsonSanitizer = this.toValidatorSchemaOptions({
                                                                options: value => {
                                                                    try {
-                                                                       return JSON.parse(value as string);
+                                                                       return JSON.parse(value as string) as unknown;
                                                                    } catch ( e ) {
                                                                        return value;
                                                                    }
@@ -61,7 +62,7 @@ class DojoValidators {
                                                                           return new Promise((resolve, reject) => {
                                                                               const template = this.getParamValue(req, path) as string;
                                                                               if ( template ) {
-                                                                                  GitlabManager.checkTemplateAccess(template, req).then(templateAccess => {
+                                                                                  void GitlabManager.checkTemplateAccess(template, req).then(templateAccess => {
                                                                                       templateAccess ? resolve(true) : reject();
                                                                                   });
                                                                               }
@@ -77,7 +78,7 @@ class DojoValidators {
                                                                       }) => {
                                                                           try {
                                                                               const template = this.getParamValue(req, path);
-                                                                              if ( template ) {
+                                                                              if ( template && Toolbox.isString(template) ) {
                                                                                   const gitlabUrlWithCredentials = Config.gitlab.urls[0].replace(/^([a-z]{3,5}:\/{2})?(.*)/, `$1${ Config.gitlab.account.username }:${ Config.gitlab.account.token }@$2`);
                                                                                   return `${ gitlabUrlWithCredentials }${ template }.git`;
                                                                               } else {
diff --git a/ExpressAPI/src/managers/HttpManager.ts b/ExpressAPI/src/managers/HttpManager.ts
index 0d9b7d2cd09841c0d1d5f83cedbba8093f8fb7e6..548dbb4d343de861ff21aac4b8e0e0629db8fb7a 100644
--- a/ExpressAPI/src/managers/HttpManager.ts
+++ b/ExpressAPI/src/managers/HttpManager.ts
@@ -12,7 +12,7 @@ class HttpManager {
     private registerRequestInterceptor() {
         axios.interceptors.request.use(config => {
             if ( config.data instanceof FormData ) {
-                config.headers = { ...config.headers, ...(config.data as FormData).getHeaders() } as AxiosRequestHeaders;
+                config.headers = { ...config.headers, ...config.data.getHeaders() } as AxiosRequestHeaders;
             }
             return config;
         });
diff --git a/ExpressAPI/src/middlewares/ClientVersionCheckerMiddleware.ts b/ExpressAPI/src/middlewares/ClientVersionCheckerMiddleware.ts
index d4d1cba3fc9cffba1fcf4a254c5880a74353897e..d6eb50163c85610c8c59c1fc9e76acccfbfef744 100644
--- a/ExpressAPI/src/middlewares/ClientVersionCheckerMiddleware.ts
+++ b/ExpressAPI/src/middlewares/ClientVersionCheckerMiddleware.ts
@@ -8,7 +8,7 @@ import { StatusCodes } from 'http-status-codes';
 
 class ClientVersionCheckerMiddleware {
     register(): (req: express.Request, res: express.Response, next: express.NextFunction) => void {
-        return async (req: express.Request, res: express.Response, next: express.NextFunction) => {
+        return (req: express.Request, res: express.Response, next: express.NextFunction) => {
             if ( req.headers['client'] && req.headers['client-version'] ) {
                 const requestClient = req.headers['client'] as string;
                 const requestClientVersion = req.headers['client-version'] as string;
diff --git a/ExpressAPI/src/middlewares/ParamsCallbackManager.ts b/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
index a1836d10d7349c935920061299226a7eb825568c..576bcb11f6c7c316f8cee89ffaf2d11e3fcfc1d9 100644
--- a/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
+++ b/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
@@ -11,7 +11,7 @@ type GetFunction = (id: string | number, ...args: Array<unknown>) => Promise<unk
 class ParamsCallbackManager {
     protected listenParam(paramName: string, backend: Express, getFunction: GetFunction, args: Array<unknown>, indexName: string) {
         backend.param(paramName, (req: express.Request, res: express.Response, next: express.NextFunction, id: string | number) => {
-            getFunction(id, ...args).then(result => {
+            void getFunction(id, ...args).then(result => {
                 if ( result ) {
                     this.initBoundParams(req);
                     (req.boundParams as Record<string, unknown>)[indexName] = result;
diff --git a/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts b/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts
index 6729055cdb2bf16f6668f027f0e54c087022a7a3..1d1445d68f017c7914e3ba88a48ee1e31b3a0ec0 100644
--- a/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts
+++ b/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts
@@ -5,20 +5,20 @@ import { StatusCodes }       from 'http-status-codes';
 
 class ParamsValidatorMiddleware {
     validate(validations: Array<ExpressValidator.ValidationChain> | ExpressValidator.Schema): (req: express.Request, res: express.Response, next: express.NextFunction) => void {
-        return async (req: express.Request, res: express.Response, next: express.NextFunction) => {
-
+        return (req: express.Request, res: express.Response, next: express.NextFunction) => {
             if ( !(validations instanceof Array) ) {
                 validations = ExpressValidator.checkSchema(validations);
             }
 
-            await Promise.all(validations.map(validation => validation.run(req)));
-
-            const errors = ExpressValidator.validationResult(req);
-            if ( !errors.isEmpty() ) {
-                return req.session.sendResponse(res, StatusCodes.BAD_REQUEST, { errors: errors.array() });
-            }
+            void Promise.all(validations.map(validation => validation.run(req))).then(() => {
+                const errors = ExpressValidator.validationResult(req);
+                if ( !errors.isEmpty() ) {
+                    req.session.sendResponse(res, StatusCodes.BAD_REQUEST, { errors: errors.array() });
+                    return;
+                }
 
-            return next();
+                next();
+            });
         };
     }
 }
diff --git a/ExpressAPI/src/middlewares/SecurityMiddleware.ts b/ExpressAPI/src/middlewares/SecurityMiddleware.ts
index cffbfae62b44ccb7fa8ddeaae6bfa58211f1a6e0..83c5100ada96e3d8e83c192d27b76559d3461962 100644
--- a/ExpressAPI/src/middlewares/SecurityMiddleware.ts
+++ b/ExpressAPI/src/middlewares/SecurityMiddleware.ts
@@ -13,13 +13,13 @@ class SecurityMiddleware {
     private async checkType(checkType: SecurityCheckType, req: express.Request): Promise<boolean> {
         try {
             switch ( String(checkType) ) {
-                case SecurityCheckType.TEACHING_STAFF:
+                case SecurityCheckType.TEACHING_STAFF.valueOf():
                     return req.session.profile.isTeachingStaff;
-                case SecurityCheckType.ASSIGNMENT_STAFF:
+                case SecurityCheckType.ASSIGNMENT_STAFF.valueOf():
                     return await AssignmentManager.isUserAllowedToAccessAssignment(req.boundParams.assignment!, req.session.profile);
-                case SecurityCheckType.ASSIGNMENT_IS_PUBLISHED:
+                case SecurityCheckType.ASSIGNMENT_IS_PUBLISHED.valueOf():
                     return req.boundParams.assignment?.published ?? false;
-                case SecurityCheckType.EXERCISE_SECRET:
+                case SecurityCheckType.EXERCISE_SECRET.valueOf():
                     return (req.headers.exercisesecret as string | undefined) === req.boundParams.exercise!.secret;
                 default:
                     return false;
@@ -32,7 +32,7 @@ class SecurityMiddleware {
 
     // First check if connected then check if at least ONE rule match. It's NOT an AND but it's a OR function.
     check(checkIfConnected: boolean, ...checkTypes: Array<SecurityCheckType>): (req: express.Request, res: express.Response, next: express.NextFunction) => void {
-        return async (req: express.Request, res: express.Response, next: express.NextFunction) => {
+        return (req: express.Request, res: express.Response, next: express.NextFunction) => {
             if ( !this.isConnected(checkIfConnected, req) ) {
                 return req.session.sendResponse(res, StatusCodes.UNAUTHORIZED);
             }
diff --git a/ExpressAPI/src/middlewares/SessionMiddleware.ts b/ExpressAPI/src/middlewares/SessionMiddleware.ts
index 0fb52098a320e20ba9630ea428be57c1023c2f7d..ceb9ada3e7e2482f6ca434b85b89f788e2fa3cfd 100644
--- a/ExpressAPI/src/middlewares/SessionMiddleware.ts
+++ b/ExpressAPI/src/middlewares/SessionMiddleware.ts
@@ -5,11 +5,11 @@ import { Express } from 'express-serve-static-core';
 
 class SessionMiddleware {
     registerOnBackend(backend: Express) {
-        backend.use(async (req: express.Request, res: express.Response, next: express.NextFunction) => {
+        backend.use((req: express.Request, res: express.Response, next: express.NextFunction) => {
             req.session = new Session();
-            await req.session.initSession(req, res);
-
-            return next();
+            void req.session.initSession(req, res).then(() => {
+                next();
+            });
         });
     }
 }
diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts
index 4a330a52828006bc82847fbc594406a6a5d535eb..18c79a4e022b660ef3c0de8e37c6be118c93ce89 100644
--- a/ExpressAPI/src/routes/AssignmentRoutes.ts
+++ b/ExpressAPI/src/routes/AssignmentRoutes.ts
@@ -1,27 +1,27 @@
-import { Express }               from 'express-serve-static-core';
-import express                   from 'express';
-import * as ExpressValidator     from 'express-validator';
-import { StatusCodes }           from 'http-status-codes';
-import RoutesManager             from '../express/RoutesManager.js';
-import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware.js';
-import SecurityMiddleware        from '../middlewares/SecurityMiddleware.js';
-import SecurityCheckType         from '../types/SecurityCheckType.js';
-import GitlabManager             from '../managers/GitlabManager.js';
-import Config                    from '../config/Config.js';
-import logger                    from '../shared/logging/WinstonLogger.js';
-import DojoValidators            from '../helpers/DojoValidators.js';
-import { Prisma }                from '@prisma/client';
-import db                        from '../helpers/DatabaseHelper.js';
-import { Assignment }            from '../types/DatabaseTypes.js';
-import AssignmentManager         from '../managers/AssignmentManager.js';
-import fs                        from 'fs';
-import path                      from 'path';
-import SharedAssignmentHelper    from '../shared/helpers/Dojo/SharedAssignmentHelper.js';
-import GlobalHelper              from '../helpers/GlobalHelper.js';
-import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode.js';
-import DojoModelsHelper          from '../helpers/DojoModelsHelper.js';
-import * as Gitlab               from '@gitbeaker/rest';
-import { GitbeakerRequestError } from '@gitbeaker/requester-utils';
+import { Express }                 from 'express-serve-static-core';
+import express, { RequestHandler } from 'express';
+import * as ExpressValidator       from 'express-validator';
+import { StatusCodes }             from 'http-status-codes';
+import RoutesManager               from '../express/RoutesManager.js';
+import ParamsValidatorMiddleware   from '../middlewares/ParamsValidatorMiddleware.js';
+import SecurityMiddleware          from '../middlewares/SecurityMiddleware.js';
+import SecurityCheckType           from '../types/SecurityCheckType.js';
+import GitlabManager               from '../managers/GitlabManager.js';
+import Config                      from '../config/Config.js';
+import logger                      from '../shared/logging/WinstonLogger.js';
+import DojoValidators              from '../helpers/DojoValidators.js';
+import { Prisma }                  from '@prisma/client';
+import db                          from '../helpers/DatabaseHelper.js';
+import { Assignment }              from '../types/DatabaseTypes.js';
+import AssignmentManager           from '../managers/AssignmentManager.js';
+import fs                          from 'fs';
+import path                        from 'path';
+import SharedAssignmentHelper      from '../shared/helpers/Dojo/SharedAssignmentHelper.js';
+import GlobalHelper                from '../helpers/GlobalHelper.js';
+import DojoStatusCode              from '../shared/types/Dojo/DojoStatusCode.js';
+import DojoModelsHelper            from '../helpers/DojoModelsHelper.js';
+import * as Gitlab                 from '@gitbeaker/rest';
+import { GitbeakerRequestError }   from '@gitbeaker/requester-utils';
 
 
 class AssignmentRoutes implements RoutesManager {
@@ -51,14 +51,14 @@ class AssignmentRoutes implements RoutesManager {
     };
 
     registerOnBackend(backend: Express) {
-        backend.get('/assignments/:assignmentNameOrUrl', SecurityMiddleware.check(true), this.getAssignment.bind(this));
-        backend.post('/assignments', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.assignmentValidator), this.createAssignment.bind(this));
+        backend.get('/assignments/:assignmentNameOrUrl', SecurityMiddleware.check(true), this.getAssignment.bind(this) as RequestHandler);
+        backend.post('/assignments', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.assignmentValidator), this.createAssignment.bind(this) as RequestHandler);
 
-        backend.patch('/assignments/:assignmentNameOrUrl/publish', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.changeAssignmentPublishedStatus(true).bind(this));
-        backend.patch('/assignments/:assignmentNameOrUrl/unpublish', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.changeAssignmentPublishedStatus(false).bind(this));
+        backend.patch('/assignments/:assignmentNameOrUrl/publish', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.changeAssignmentPublishedStatus(true).bind(this) as RequestHandler);
+        backend.patch('/assignments/:assignmentNameOrUrl/unpublish', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.changeAssignmentPublishedStatus(false).bind(this) as RequestHandler);
 
-        backend.post('/assignments/:assignmentNameOrUrl/corrections', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), ParamsValidatorMiddleware.validate(this.assignmentAddCorrigeValidator), this.linkUpdateAssignmentCorrection(false).bind(this));
-        backend.patch('/assignments/:assignmentNameOrUrl/corrections/:exerciseIdOrUrl', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.linkUpdateAssignmentCorrection(true).bind(this));
+        backend.post('/assignments/:assignmentNameOrUrl/corrections', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), ParamsValidatorMiddleware.validate(this.assignmentAddCorrigeValidator), this.linkUpdateAssignmentCorrection(false).bind(this) as RequestHandler);
+        backend.patch('/assignments/:assignmentNameOrUrl/corrections/:exerciseIdOrUrl', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.linkUpdateAssignmentCorrection(true).bind(this) as RequestHandler);
     }
 
     // Get an assignment by its name or gitlab url
diff --git a/ExpressAPI/src/routes/BaseRoutes.ts b/ExpressAPI/src/routes/BaseRoutes.ts
index 57a215ff00ca7bee6260af671e392321d7c84bf6..e26e11ace9bba1b6740f3d7a9af7948a59409d76 100644
--- a/ExpressAPI/src/routes/BaseRoutes.ts
+++ b/ExpressAPI/src/routes/BaseRoutes.ts
@@ -1,13 +1,13 @@
-import { Express }     from 'express-serve-static-core';
-import express         from 'express';
-import { StatusCodes } from 'http-status-codes';
-import RoutesManager   from '../express/RoutesManager.js';
+import { Express }                 from 'express-serve-static-core';
+import express, { RequestHandler } from 'express';
+import { StatusCodes }             from 'http-status-codes';
+import RoutesManager               from '../express/RoutesManager.js';
 
 
 class BaseRoutes implements RoutesManager {
     registerOnBackend(backend: Express) {
-        backend.get('/', this.homepage.bind(this));
-        backend.get('/health_check', this.healthCheck.bind(this));
+        backend.get('/', this.homepage.bind(this) as RequestHandler);
+        backend.get('/health_check', this.healthCheck.bind(this) as RequestHandler);
     }
 
     private async homepage(req: express.Request, res: express.Response) {
diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts
index 116fd1df9b57028231c1d6bc833f0f3b68bf0fbf..b32ab8b22983feed2cef9d06768bedfc0b70b2c6 100644
--- a/ExpressAPI/src/routes/ExerciseRoutes.ts
+++ b/ExpressAPI/src/routes/ExerciseRoutes.ts
@@ -1,31 +1,31 @@
-import { Express }               from 'express-serve-static-core';
-import express                   from 'express';
-import * as ExpressValidator     from 'express-validator';
-import { StatusCodes }           from 'http-status-codes';
-import RoutesManager             from '../express/RoutesManager.js';
-import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware.js';
-import SecurityMiddleware        from '../middlewares/SecurityMiddleware.js';
-import GitlabManager             from '../managers/GitlabManager.js';
-import Config                    from '../config/Config.js';
-import logger                    from '../shared/logging/WinstonLogger.js';
-import DojoValidators            from '../helpers/DojoValidators.js';
-import { v4 as uuidv4 }          from 'uuid';
-import { Prisma }                from '@prisma/client';
-import { Assignment, Exercise }  from '../types/DatabaseTypes.js';
-import db                        from '../helpers/DatabaseHelper.js';
-import SecurityCheckType         from '../types/SecurityCheckType.js';
-import JSON5                     from 'json5';
-import fs                        from 'fs';
-import path                      from 'path';
-import AssignmentFile            from '../shared/types/Dojo/AssignmentFile.js';
-import ExerciseResultsFile       from '../shared/types/Dojo/ExerciseResultsFile.js';
-import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode.js';
-import GlobalHelper              from '../helpers/GlobalHelper.js';
-import { IFileDirStat }          from '../shared/helpers/recursiveFilesStats/RecursiveFilesStats.js';
-import ExerciseManager           from '../managers/ExerciseManager.js';
-import * as Gitlab               from '@gitbeaker/rest';
-import GitlabTreeFileType        from '../shared/types/Gitlab/GitlabTreeFileType.js';
-import { GitbeakerRequestError } from '@gitbeaker/requester-utils';
+import { Express }                 from 'express-serve-static-core';
+import express, { RequestHandler } from 'express';
+import * as ExpressValidator       from 'express-validator';
+import { StatusCodes }             from 'http-status-codes';
+import RoutesManager               from '../express/RoutesManager.js';
+import ParamsValidatorMiddleware   from '../middlewares/ParamsValidatorMiddleware.js';
+import SecurityMiddleware          from '../middlewares/SecurityMiddleware.js';
+import GitlabManager               from '../managers/GitlabManager.js';
+import Config                      from '../config/Config.js';
+import logger                      from '../shared/logging/WinstonLogger.js';
+import DojoValidators              from '../helpers/DojoValidators.js';
+import { v4 as uuidv4 }            from 'uuid';
+import { Prisma }                  from '@prisma/client';
+import { Assignment, Exercise }    from '../types/DatabaseTypes.js';
+import db                          from '../helpers/DatabaseHelper.js';
+import SecurityCheckType           from '../types/SecurityCheckType.js';
+import JSON5                       from 'json5';
+import fs                          from 'fs';
+import path                        from 'path';
+import AssignmentFile              from '../shared/types/Dojo/AssignmentFile.js';
+import ExerciseResultsFile         from '../shared/types/Dojo/ExerciseResultsFile.js';
+import DojoStatusCode              from '../shared/types/Dojo/DojoStatusCode.js';
+import GlobalHelper                from '../helpers/GlobalHelper.js';
+import { IFileDirStat }            from '../shared/helpers/recursiveFilesStats/RecursiveFilesStats.js';
+import ExerciseManager             from '../managers/ExerciseManager.js';
+import * as Gitlab                 from '@gitbeaker/rest';
+import GitlabTreeFileType          from '../shared/types/Gitlab/GitlabTreeFileType.js';
+import { GitbeakerRequestError }   from '@gitbeaker/requester-utils';
 
 
 class ExerciseRoutes implements RoutesManager {
@@ -65,11 +65,11 @@ class ExerciseRoutes implements RoutesManager {
     };
 
     registerOnBackend(backend: Express) {
-        backend.post('/assignments/:assignmentNameOrUrl/exercises', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_IS_PUBLISHED), ParamsValidatorMiddleware.validate(this.exerciseValidator), this.createExercise.bind(this));
+        backend.post('/assignments/:assignmentNameOrUrl/exercises', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_IS_PUBLISHED), ParamsValidatorMiddleware.validate(this.exerciseValidator), this.createExercise.bind(this) as RequestHandler);
 
-        backend.get('/exercises/:exerciseIdOrUrl/assignment', SecurityMiddleware.check(false, SecurityCheckType.EXERCISE_SECRET), this.getAssignment.bind(this));
+        backend.get('/exercises/:exerciseIdOrUrl/assignment', SecurityMiddleware.check(false, SecurityCheckType.EXERCISE_SECRET), this.getAssignment.bind(this) as RequestHandler);
 
-        backend.post('/exercises/:exerciseIdOrUrl/results', SecurityMiddleware.check(false, SecurityCheckType.EXERCISE_SECRET), ParamsValidatorMiddleware.validate(this.resultValidator), this.createResult.bind(this));
+        backend.post('/exercises/:exerciseIdOrUrl/results', SecurityMiddleware.check(false, SecurityCheckType.EXERCISE_SECRET), ParamsValidatorMiddleware.validate(this.resultValidator), this.createResult.bind(this) as RequestHandler);
     }
 
     private getExerciseName(assignment: Assignment, members: Array<Gitlab.UserSchema>, suffix: number): string {
@@ -219,7 +219,7 @@ class ExerciseRoutes implements RoutesManager {
         const immutablePaths = dojoAssignmentFile.immutable.map(fileDescriptor => fileDescriptor.path);
 
         await Promise.all(repoTree.map(async gitlabTreeFile => {
-            if ( gitlabTreeFile.type === GitlabTreeFileType.BLOB ) {
+            if ( gitlabTreeFile.type === GitlabTreeFileType.BLOB.valueOf() ) {
                 for ( const immutablePath of immutablePaths ) {
                     if ( gitlabTreeFile.path.startsWith(immutablePath) ) {
                         immutableFiles.push(await GitlabManager.getFile(req.boundParams.exercise!.assignment.gitlabId, gitlabTreeFile.path));
diff --git a/ExpressAPI/src/routes/GitlabRoutes.ts b/ExpressAPI/src/routes/GitlabRoutes.ts
index 1a5c00d23142e85bccd3b1ed681b1411c10bee7c..a2cf557790c98987195ac6312cfa0668ac691fa6 100644
--- a/ExpressAPI/src/routes/GitlabRoutes.ts
+++ b/ExpressAPI/src/routes/GitlabRoutes.ts
@@ -1,14 +1,14 @@
-import { Express }        from 'express-serve-static-core';
-import express            from 'express';
-import RoutesManager      from '../express/RoutesManager.js';
-import SecurityMiddleware from '../middlewares/SecurityMiddleware.js';
-import SecurityCheckType  from '../types/SecurityCheckType.js';
-import GitlabManager      from '../managers/GitlabManager.js';
+import { Express }                 from 'express-serve-static-core';
+import express, { RequestHandler } from 'express';
+import RoutesManager               from '../express/RoutesManager.js';
+import SecurityMiddleware          from '../middlewares/SecurityMiddleware.js';
+import SecurityCheckType           from '../types/SecurityCheckType.js';
+import GitlabManager               from '../managers/GitlabManager.js';
 
 
 class GitlabRoutes implements RoutesManager {
     registerOnBackend(backend: Express) {
-        backend.get('/gitlab/project/:gitlabProjectIdOrNamespace/checkTemplateAccess', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), this.checkTemplateAccess.bind(this));
+        backend.get('/gitlab/project/:gitlabProjectIdOrNamespace/checkTemplateAccess', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), this.checkTemplateAccess.bind(this) as RequestHandler);
     }
 
     private async checkTemplateAccess(req: express.Request, res: express.Response) {
diff --git a/ExpressAPI/src/routes/SessionRoutes.ts b/ExpressAPI/src/routes/SessionRoutes.ts
index 4ea2571c49c15f8e5a3d962c032e43b790554e96..91a173fd00cf1ae72be0c7b1037f08f1e02c49b5 100644
--- a/ExpressAPI/src/routes/SessionRoutes.ts
+++ b/ExpressAPI/src/routes/SessionRoutes.ts
@@ -1,14 +1,14 @@
-import { Express }               from 'express-serve-static-core';
-import express                   from 'express';
-import * as ExpressValidator     from 'express-validator';
-import { StatusCodes }           from 'http-status-codes';
-import RoutesManager             from '../express/RoutesManager.js';
-import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware.js';
-import SecurityMiddleware        from '../middlewares/SecurityMiddleware.js';
-import GitlabManager             from '../managers/GitlabManager.js';
-import UserManager               from '../managers/UserManager.js';
-import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode.js';
-import Config                    from '../config/Config.js';
+import { Express }                 from 'express-serve-static-core';
+import express, { RequestHandler } from 'express';
+import * as ExpressValidator       from 'express-validator';
+import { StatusCodes }             from 'http-status-codes';
+import RoutesManager               from '../express/RoutesManager.js';
+import ParamsValidatorMiddleware   from '../middlewares/ParamsValidatorMiddleware.js';
+import SecurityMiddleware          from '../middlewares/SecurityMiddleware.js';
+import GitlabManager               from '../managers/GitlabManager.js';
+import UserManager                 from '../managers/UserManager.js';
+import DojoStatusCode              from '../shared/types/Dojo/DojoStatusCode.js';
+import Config                      from '../config/Config.js';
 
 
 class SessionRoutes implements RoutesManager {
@@ -31,9 +31,9 @@ class SessionRoutes implements RoutesManager {
     };
 
     registerOnBackend(backend: Express) {
-        backend.post('/login', ParamsValidatorMiddleware.validate(this.loginValidator), this.login.bind(this));
-        backend.post('/refresh_tokens', ParamsValidatorMiddleware.validate(this.refreshTokensValidator), this.refreshTokens.bind(this));
-        backend.get('/test_session', SecurityMiddleware.check(true), this.testSession.bind(this));
+        backend.post('/login', ParamsValidatorMiddleware.validate(this.loginValidator), this.login.bind(this) as RequestHandler);
+        backend.post('/refresh_tokens', ParamsValidatorMiddleware.validate(this.refreshTokensValidator), this.refreshTokens.bind(this) as RequestHandler);
+        backend.get('/test_session', SecurityMiddleware.check(true), this.testSession.bind(this) as RequestHandler);
     }
 
     private async login(req: express.Request, res: express.Response) {
diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared
index 021300d29473dee2ad229384d22a521c0e5c14aa..f965766ab5d5b0d687deb77da96778f37bf6ccb0 160000
--- a/ExpressAPI/src/shared
+++ b/ExpressAPI/src/shared
@@ -1 +1 @@
-Subproject commit 021300d29473dee2ad229384d22a521c0e5c14aa
+Subproject commit f965766ab5d5b0d687deb77da96778f37bf6ccb0