diff --git a/.eslintrc.js b/.eslintrc.js
index bdf306698301433a5ac5a6cb0771997f083e5e8f..ba46a82a308290fb6bcaae957b77f0f22cb63498 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -6,7 +6,7 @@ module.exports = {
   ignorePatterns: ["node_modules", "build", "coverage"],
   plugins: ["eslint-comments", "functional"],
   extends: [
-    "plugin:vue/essential",
+    "plugin:vue/recommended",
     "eslint:recommended",
     "@vue/typescript/recommended",
     "@vue/prettier",
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 367b7aa490f9f63c8f70c35672425b8352eb294e..c854e6af1d62a5b53cbd4fe0ed57c0655acae8a3 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,6 +9,7 @@
     "cSpell.words": [
       "Coscine",
       "pinia",
+      "RWTH",
       "vite"
     ]
 }
diff --git a/src/App.vue b/src/App.vue
index 887be908a5acc56d7dcec4535fda0cbea84fcb98..6d591d9f8587e3f0194b984206d94ecf2cd86cb2 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -14,6 +14,7 @@
       </div>
     </main>
     <ExpiryToast />
+    <NotificationToast />
   </div>
 </template>
 
@@ -34,10 +35,6 @@ export default defineComponent({
     return { mainStore, projectStore, userStore };
   },
 
-  created() {
-    this.initialize();
-  },
-
   computed: {
     loggedIn(): boolean {
       return this.mainStore.loggedIn;
@@ -49,6 +46,11 @@ export default defineComponent({
   },
 
   watch: {
+    // Listen for token changes and reload the page to fetch data again
+    "mainStore.coscine.authorization.bearer"() {
+      window.location.reload();
+    },
+
     loggedIn() {
       this.userStore.retrieveUser(this.loggedIn);
     },
@@ -58,6 +60,10 @@ export default defineComponent({
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
       await this.userStore.retrieveUser(this.loggedIn);
diff --git a/src/components.d.ts b/src/components.d.ts
index e3dea2052cf883015212f42df3b8b4f3e75acfe4..f78d7de5e69936bcff351cc62dea825602d31ab5 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -4,19 +4,20 @@
 
 declare module "vue" {
   export interface GlobalComponents {
-    BreadCrumbs: typeof import("./components/BreadCrumbs.vue")["default"];
-    CoscineCard: typeof import("./components/CoscineCard.vue")["default"];
-    CoscineFormGroup: typeof import("./components/CoscineFormGroup.vue")["default"];
-    CoscineHeadline: typeof import("./components/CoscineHeadline.vue")["default"];
-    CoscineModal: typeof import("./components/CoscineModal.vue")["default"];
-    ExpiryToast: typeof import("./components/ExpiryToast.vue")["default"];
-    LoadingIndicator: typeof import("./components/LoadingIndicator.vue")["default"];
-    LoadingSpinner: typeof import("./components/LoadingSpinner.vue")["default"];
+    BreadCrumbs: typeof import("./components/elements/BreadCrumbs.vue")["default"];
+    CoscineCard: typeof import("./components/coscine/CoscineCard.vue")["default"];
+    CoscineFormGroup: typeof import("./components/coscine/CoscineFormGroup.vue")["default"];
+    CoscineHeadline: typeof import("./components/coscine/CoscineHeadline.vue")["default"];
+    CoscineModal: typeof import("./components/coscine/CoscineModal.vue")["default"];
+    ExpiryToast: typeof import("./components/toasts/ExpiryToast.vue")["default"];
+    LoadingIndicator: typeof import("./components/elements/LoadingIndicator.vue")["default"];
+    LoadingSpinner: typeof import("./components/coscine/LoadingSpinner.vue")["default"];
     Maintenance: typeof import("./components/banner/Maintenance.vue")["default"];
-    MultiSelect: typeof import("./components/MultiSelect.vue")["default"];
-    Navbar: typeof import("./components/Navbar.vue")["default"];
+    MultiSelect: typeof import("./components/coscine/MultiSelect.vue")["default"];
+    Navbar: typeof import("./components/elements/Navbar.vue")["default"];
+    NotificationToast: typeof import("./components/toasts/NotificationToast.vue")["default"];
     Pilot: typeof import("./components/banner/Pilot.vue")["default"];
-    SidebarMenu: typeof import("./components/SidebarMenu.vue")["default"];
+    SidebarMenu: typeof import("./components/elements/SidebarMenu.vue")["default"];
   }
 }
 
diff --git a/src/components/ExpiryToast.vue b/src/components/ExpiryToast.vue
deleted file mode 100644
index bbd03bda38831b9951f2d126bc3d719f80c3bfa5..0000000000000000000000000000000000000000
--- a/src/components/ExpiryToast.vue
+++ /dev/null
@@ -1,102 +0,0 @@
-<template>
-  <b-toast
-    v-model="loginStore.expiredSession"
-    toaster="b-toaster-bottom-right"
-    variant="danger"
-    solid
-    no-auto-hide
-    no-close-button
-    :title="$t('toast.session.title')"
-  >
-    <p class="text-center">{{ $t("toast.session.message") }}</p>
-    <div class="d-flex justify-content-center">
-      <b-button
-        class="mt-2"
-        size="sm"
-        variant="secondary"
-        @click="redirectToLogin"
-      >
-        {{ $t("toast.session.link") }}
-      </b-button>
-    </div>
-  </b-toast>
-</template>
-
-<script lang="ts">
-import { defineComponent } from "@vue/composition-api";
-
-import * as jose from "jose";
-import moment from "moment";
-
-import useMainStore from "@/store/index";
-import useLoginStore from "@/modules/login/store";
-
-export default defineComponent({
-  setup() {
-    const mainStore = useMainStore();
-    const loginStore = useLoginStore();
-
-    return { mainStore, loginStore };
-  },
-  computed: {
-    token(): string {
-      return this.mainStore.coscine.authorization.bearer;
-    },
-  },
-  data() {
-    return {
-      tokenExpiredInterval: 0,
-    };
-  },
-  created() {
-    this.initialize();
-  },
-  watch: {
-    token() {
-      this.initialize();
-    },
-  },
-  methods: {
-    getCurrentTokenExpirationDuration(): number {
-      const jwt = jose.decodeJwt(this.token);
-      const now = moment.utc(moment.now());
-      if (jwt.exp) {
-        // Use UTC to avoid time conversion errors
-        const tokenExpiresAt = moment(jwt.exp * 1000).utc();
-        const untilTokenExpiration = moment.duration(tokenExpiresAt.diff(now));
-
-        // Return as milliseconds for setInterval() method
-        return untilTokenExpiration.asMilliseconds();
-      }
-      return 0;
-    },
-    initialize() {
-      this.loginStore.expiredSession = false;
-      if (this.tokenExpiredInterval) {
-        clearInterval(this.tokenExpiredInterval);
-      }
-      if (this.token) {
-        this.tokenExpiredInterval = this.setInterval(
-          this.notifyTokenExpired,
-          this.getCurrentTokenExpirationDuration()
-        );
-      }
-    },
-    notifyTokenExpired() {
-      this.loginStore.expiredSession = true;
-      // Cancel interval expiration check
-      clearInterval(this.tokenExpiredInterval);
-    },
-    redirectToLogin() {
-      this.loginStore.redirectToLogin(this.$route, true);
-    },
-    setInterval(fn: () => void, delay: number) {
-      const maxDelay = Math.pow(2, 31) - 1;
-      if (delay > maxDelay) {
-        return setInterval(fn, maxDelay);
-      }
-      return setInterval(fn, delay);
-    },
-  },
-});
-</script>
diff --git a/src/components/banner/Maintenance.vue b/src/components/banner/Maintenance.vue
index da121db853479694ab7653bcb3b613b9e0aa41a7..cc718e30d0875e911e0ea280b7c1cbe0da377c73 100644
--- a/src/components/banner/Maintenance.vue
+++ b/src/components/banner/Maintenance.vue
@@ -2,12 +2,12 @@
   <b-alert
     v-if="visibility"
     :show="show"
-    @dismissed="saveVisibility"
     dismissible
     variant="warning"
+    @dismissed="saveVisibility"
   >
     <i18n :path="messagePath" tag="p">
-      <template v-slot:link>
+      <template #link>
         <a :href="maintenance.url" target="_blank">{{
           $t("banner.maintenance.moreInformation")
         }}</a>
diff --git a/src/components/banner/Pilot.vue b/src/components/banner/Pilot.vue
index e84a8d0d1fd9285a5a6c5171b42c19ce378168ae..6675ee20d45046d28975625586ae384637ad5bd5 100644
--- a/src/components/banner/Pilot.vue
+++ b/src/components/banner/Pilot.vue
@@ -2,9 +2,9 @@
   <b-alert
     v-if="pilotVisibility"
     :show="pilotVisibility"
-    @dismissed="saveVisibility"
     dismissible
     variant="warning"
+    @dismissed="saveVisibility"
   >
     <i18n path="banner.pilot.pilotBannerText" tag="p">
       <template #link>
diff --git a/src/components/CoscineCard.vue b/src/components/coscine/CoscineCard.vue
similarity index 84%
rename from src/components/CoscineCard.vue
rename to src/components/coscine/CoscineCard.vue
index c4b92d35f52ae1c9da4bf94ddd1a3efe245544aa..ca2b8d383495d48c3d3bdd61848467ffce908c19 100644
--- a/src/components/CoscineCard.vue
+++ b/src/components/coscine/CoscineCard.vue
@@ -2,25 +2,26 @@
   <b-card
     no-body
     class="coscine_card m-2 text-center"
+    :class="isLoading ? 'bg-light' : ''"
     @click.prevent="openCard()"
   >
     <!-- Stretched Link (Card) -->
-    <a :href="hrefFromRouter(to)" class="stretched-link" />
+    <a v-if="!isLoading" :href="hrefFromRouter(to)" class="stretched-link" />
 
     <!-- Badge -->
     <template #header>
-      <b-badge pill :variant="badge_type" v-if="badge_visibility">
-        {{ badge_text }}
+      <b-badge v-if="badgeVisibility" pill :variant="badgeType">
+        {{ badgeText }}
       </b-badge>
     </template>
 
     <!-- Settings Button -->
     <b-button
       v-if="toSettings"
-      @click.stop.prevent="settingsCard()"
       size="sm"
       variant="outline-primary"
       class="settings_button"
+      @click.stop.prevent="settingsCard"
     >
       <b-icon icon="pencil-fill" />
       <!-- Stretched Link (Settings) -->
@@ -29,8 +30,10 @@
 
     <b-card-body class="pt-0 pb-2 px-2">
       <div>
+        <!-- Loading Spinner -->
+        <b-spinner v-if="isLoading" variant="primary" class="card_icon" />
         <!-- Icon -->
-        <b-icon :icon="cardIcon" variant="primary" class="card_icon" />
+        <b-icon v-else :icon="cardIcon" variant="primary" class="card_icon" />
       </div>
       <!-- Title -->
       <b-card-text>
@@ -47,35 +50,27 @@ import { RawLocation } from "vue-router";
 export default defineComponent({
   components: {},
 
-  data() {
-    return {
-      createIcon: "plus-circle-fill",
-      resourceIcon: "archive",
-      projectIcon: "folder2-open",
-      placeHolderIcon: "circle-fill",
-    };
-  },
-
   props: {
     title: {
       type: String,
       required: true,
     },
-    badge_text: {
+    badgeText: {
       default: "",
       type: String,
     },
-    badge_visibility: {
+    badgeVisibility: {
       default: false,
       type: Boolean,
     },
-    badge_type: {
+    badgeType: {
       default: "warning",
       type: String,
     },
     type: {
+      default: "",
       type: String,
-      required: true,
+      required: false,
     },
     toSettings: {
       default: null,
@@ -85,6 +80,19 @@ export default defineComponent({
       type: Object as PropType<RawLocation>,
       required: true,
     },
+    isLoading: {
+      default: false,
+      type: Boolean,
+    },
+  },
+
+  data() {
+    return {
+      createIcon: "plus-circle-fill",
+      resourceIcon: "archive",
+      projectIcon: "folder2-open",
+      placeHolderIcon: "circle-fill",
+    };
   },
 
   computed: {
diff --git a/src/components/CoscineFormGroup.vue b/src/components/coscine/CoscineFormGroup.vue
similarity index 94%
rename from src/components/CoscineFormGroup.vue
rename to src/components/coscine/CoscineFormGroup.vue
index 89cf9b6db2b0692a5d92747e4a93ccf99504cc08..e16800405629e430ad23ffc3c7ebd939d7c9a082 100644
--- a/src/components/CoscineFormGroup.vue
+++ b/src/components/coscine/CoscineFormGroup.vue
@@ -18,9 +18,9 @@
       <!-- Label -->
       <span id="label" class="text-break">{{ label }}</span>
 
-      <div class="d-inline ml-1" v-if="info">
+      <div v-if="info" class="d-inline ml-1">
         <!-- Information Circle Icon -->
-        <b-icon icon="info-circle" :id="labelFor" />
+        <b-icon :id="labelFor" icon="info-circle" />
 
         <!-- Popover -->
         <b-popover
diff --git a/src/components/CoscineHeadline.vue b/src/components/coscine/CoscineHeadline.vue
similarity index 100%
rename from src/components/CoscineHeadline.vue
rename to src/components/coscine/CoscineHeadline.vue
diff --git a/src/components/CoscineModal.vue b/src/components/coscine/CoscineModal.vue
similarity index 91%
rename from src/components/CoscineModal.vue
rename to src/components/coscine/CoscineModal.vue
index 5e0b2099677154ec2a5d8d335e5b04da2ec12e4e..917b3d015311932bc8c676362a35862345de29b6 100644
--- a/src/components/CoscineModal.vue
+++ b/src/components/coscine/CoscineModal.vue
@@ -1,16 +1,18 @@
 <template>
   <b-modal
     :visible="value"
-    @change="$emit('input', value)"
     :title="title"
-    @hidden="hideModal"
     :hide-footer="true"
+    @change="$emit('input', value)"
+    @hidden="hideModal"
   >
     <div>
       {{ body }}
     </div>
     <slot />
-    <slot name="buttons" />
+    <div class="mt-4">
+      <slot name="buttons" />
+    </div>
   </b-modal>
 </template>
 
diff --git a/src/components/LoadingSpinner.vue b/src/components/coscine/LoadingSpinner.vue
similarity index 96%
rename from src/components/LoadingSpinner.vue
rename to src/components/coscine/LoadingSpinner.vue
index 8e4c03d4b92a2b86b182735b868658c62af86645..d4613964e3b23729bb2016ca5c666681122e26d3 100644
--- a/src/components/LoadingSpinner.vue
+++ b/src/components/coscine/LoadingSpinner.vue
@@ -6,9 +6,8 @@
     :show="isWaitingForResponse"
     :variant="'white'"
     :opacity="0.9"
-    :z-index="2000"
+    :z-index="1000"
     :blur="''"
-    rounded="sm"
   >
     <template #overlay>
       <div class="text-center">
diff --git a/src/components/MultiSelect.vue b/src/components/coscine/MultiSelect.vue
similarity index 98%
rename from src/components/MultiSelect.vue
rename to src/components/coscine/MultiSelect.vue
index 23811ebc32aeea232e043202974a26b1a76af40d..35e9f0fd50a9f701f3302ec7af0ae739d073ee3f 100644
--- a/src/components/MultiSelect.vue
+++ b/src/components/coscine/MultiSelect.vue
@@ -11,14 +11,14 @@
         no-outer-focus
         class="mb-2"
       >
-        <template v-slot="{ tags, disabled, addTag, removeTag }">
+        <template #default="{ tags, disabled, addTag, removeTag }">
           <ul v-if="tags.length > 0" class="list-inline d-inline-block mb-2">
             <li v-for="tag in tags" :key="tag" class="list-inline-item">
               <b-form-tag
-                @remove="removeTag(tag)"
                 :title="tag"
                 :disabled="disabled"
                 variant="info"
+                @remove="removeTag(tag)"
                 >{{ tag }}</b-form-tag
               >
             </li>
@@ -44,8 +44,8 @@
                 :disabled="disabled"
               >
                 <b-form-input
-                  v-model="search"
                   id="tag-search-input"
+                  v-model="search"
                   type="search"
                   size="sm"
                   autocomplete="off"
diff --git a/src/components/BreadCrumbs.vue b/src/components/elements/BreadCrumbs.vue
similarity index 100%
rename from src/components/BreadCrumbs.vue
rename to src/components/elements/BreadCrumbs.vue
diff --git a/src/components/LoadingIndicator.vue b/src/components/elements/LoadingIndicator.vue
similarity index 100%
rename from src/components/LoadingIndicator.vue
rename to src/components/elements/LoadingIndicator.vue
diff --git a/src/components/Navbar.vue b/src/components/elements/Navbar.vue
similarity index 93%
rename from src/components/Navbar.vue
rename to src/components/elements/Navbar.vue
index ffcd08c91ec4ed544633247d1958970475a013f0..dbc49fac3dba560b3f54f501b38696e15ac70f00 100644
--- a/src/components/Navbar.vue
+++ b/src/components/elements/Navbar.vue
@@ -1,17 +1,14 @@
 <template>
   <header id="header">
     <b-navbar toggleable="md" type="dark" variant="dark">
-      <!-- Sidebar Toggle -->
-      <b-navbar-nav>
-        <b-nav-item @click="toggleSidebar">
-          <b-icon icon="justify" />
-        </b-nav-item>
-      </b-navbar-nav>
-
       <!-- Coscine Logo -->
       <b-navbar-brand id="coscineLogo">
         <RouterLink :to="{ name: 'list-projects' }">
-          <img alt="Coscine logo" src="@/assets/svg/coscine_white.svg" />
+          <img
+            alt="Coscine Logo"
+            src="@/assets/svg/coscine_white.svg"
+            class="mx-3"
+          />
         </RouterLink>
       </b-navbar-brand>
 
@@ -28,8 +25,8 @@
               </template>
               <b-form-input
                 id="search"
-                type="search"
                 v-model="searchTerm"
+                type="search"
                 :placeholder="$t('nav.search')"
               />
             </b-input-group>
@@ -45,8 +42,8 @@
             <!-- Language Options -->
             <b-dropdown-item
               v-for="(locale, index) in locales"
-              :disabled="$root.$i18n.locale === locale"
               :key="index"
+              :disabled="$root.$i18n.locale === locale"
               @click="changeLocale(locale)"
               >{{ $t("nav.lang" + locale.toUpperCase()) }}</b-dropdown-item
             >
@@ -71,11 +68,11 @@
             >
           </b-nav-item-dropdown>
 
-          <b-nav-item-dropdown right v-if="loggedIn">
-            <template #button-content v-if="user"
+          <b-nav-item-dropdown v-if="loggedIn" right>
+            <template v-if="user" #button-content
               >{{ $t("nav.user", { displayName: user.displayName }) }}
             </template>
-            <template #button-content v-else
+            <template v-else #button-content
               ><b-skeleton
                 animation="fade"
                 height="1.5rem"
@@ -101,9 +98,9 @@
 
           <router-link
             v-else
+            v-slot="{ href, isExactActive }"
             :to="{ name: 'login', query: { redirect: $route.fullPath } }"
             custom
-            v-slot="{ href, isExactActive }"
           >
             <b-nav-item right :disabled="isExactActive" :href="href">{{
               $t("nav.userLogIn")
diff --git a/src/components/SidebarMenu.vue b/src/components/elements/SidebarMenu.vue
similarity index 98%
rename from src/components/SidebarMenu.vue
rename to src/components/elements/SidebarMenu.vue
index 38b90f02db84ef45c2ef8e681c716730e7eed6b9..5e6ae8046d2be696294f8cf373183e73e1575ed4 100644
--- a/src/components/SidebarMenu.vue
+++ b/src/components/elements/SidebarMenu.vue
@@ -2,18 +2,18 @@
   <sidebar-menu
     :menu="menu"
     :collapsed="collapsed"
-    @toggle-collapse="collapse"
     :relative="true"
-    :showOneChild="true"
-    :disableHover="true"
+    :show-one-child="true"
+    :disable-hover="true"
     theme="white-theme"
+    @toggle-collapse="collapse"
   >
-    <template v-slot:toggle-icon>
+    <template #toggle-icon>
       <b-icon v-if="!collapsed" icon="arrow-bar-left" />
       <b-icon v-else icon="arrow-bar-right" />
     </template>
 
-    <template v-slot:dropdown-icon>
+    <template #dropdown-icon>
       <b-icon icon="caret-right" />
     </template>
   </sidebar-menu>
@@ -59,9 +59,6 @@ export default defineComponent({
 
     return { mainStore, projectStore, resourceStore };
   },
-  created() {
-    this.collapsed = !this.sidebarActive;
-  },
   data() {
     return {
       collapsed: false,
@@ -257,6 +254,9 @@ export default defineComponent({
       this.collapsed = !this.sidebarActive;
     },
   },
+  created() {
+    this.collapsed = !this.sidebarActive;
+  },
   methods: {
     collapse(collapsed: boolean) {
       this.collapsed = collapsed;
diff --git a/src/components/toasts/ExpiryToast.vue b/src/components/toasts/ExpiryToast.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3f94927f1194507a5aee6af71416a400a0a7e9f3
--- /dev/null
+++ b/src/components/toasts/ExpiryToast.vue
@@ -0,0 +1,132 @@
+<template>
+  <div>
+    <!-- White Overlay Background -->
+    <b-overlay
+      no-wrap
+      :fixed="true"
+      :show="loginStore.expiredSession"
+      :variant="'white'"
+      :opacity="0.9"
+      :z-index="1000"
+      :blur="''"
+    >
+      <template #overlay>
+        <!-- Remove the default loading spinner -->
+        <div />
+      </template>
+    </b-overlay>
+
+    <!-- Expiry Toast -->
+    <b-toast
+      v-model="loginStore.expiredSession"
+      toaster="b-toaster-bottom-right"
+      variant="danger"
+      solid
+      no-auto-hide
+      no-close-button
+      :title="$t('toast.session.title')"
+    >
+      <!-- Toast Body Text -->
+      <p class="text-center">{{ $t("toast.session.message") }}</p>
+
+      <!-- Login Button -->
+      <div class="d-flex justify-content-center">
+        <b-button
+          class="mt-2"
+          size="sm"
+          variant="secondary"
+          @click="redirectToLogin"
+        >
+          {{ $t("toast.session.link") }}
+        </b-button>
+      </div>
+    </b-toast>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from "@vue/composition-api";
+
+import * as jose from "jose";
+import moment from "moment";
+
+import useMainStore from "@/store/index";
+import useLoginStore from "@/modules/login/store";
+
+export default defineComponent({
+  setup() {
+    const mainStore = useMainStore();
+    const loginStore = useLoginStore();
+
+    return { mainStore, loginStore };
+  },
+  data() {
+    return {
+      tokenExpiredInterval: 0,
+    };
+  },
+  computed: {
+    token(): string {
+      return this.mainStore.coscine.authorization.bearer;
+    },
+  },
+  watch: {
+    token() {
+      this.initialize();
+    },
+  },
+  created() {
+    this.initialize();
+  },
+  methods: {
+    getCurrentTokenExpirationDuration(): number {
+      try {
+        const jwt = jose.decodeJwt(this.token);
+        const now = moment.utc(moment.now());
+        if (jwt.exp) {
+          // Use UTC to avoid time conversion errors
+          const tokenExpiresAt = moment(jwt.exp * 1000).utc();
+          const untilTokenExpiration = moment.duration(
+            tokenExpiresAt.diff(now)
+          );
+
+          // Return as milliseconds for setInterval() method
+          return untilTokenExpiration.asMilliseconds();
+        } else {
+          return 0;
+        }
+      } catch (error) {
+        // Provided token is not a valid JWT Token
+        return 0;
+      }
+    },
+    initialize() {
+      this.loginStore.expiredSession = false;
+      if (this.tokenExpiredInterval) {
+        clearInterval(this.tokenExpiredInterval);
+      }
+      if (this.token) {
+        this.tokenExpiredInterval = this.setInterval(
+          this.notifyTokenExpired,
+          this.getCurrentTokenExpirationDuration()
+        );
+      }
+    },
+    notifyTokenExpired() {
+      this.loginStore.expiredSession = true;
+      // Cancel interval expiration check
+      clearInterval(this.tokenExpiredInterval);
+    },
+    redirectToLogin() {
+      this.loginStore.redirectToLogin(this.$route, true);
+    },
+    setInterval(fn: () => void, delay: number): number {
+      const maxDelay = Math.pow(2, 31) - 1;
+      if (delay > maxDelay) {
+        return window.setInterval(fn, maxDelay);
+      }
+      return window.setInterval(fn, delay);
+    },
+  },
+});
+</script>
diff --git a/src/components/toasts/NotificationToast.vue b/src/components/toasts/NotificationToast.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6ad4fea1992154bafbfeadf0d7638ace68b9ee98
--- /dev/null
+++ b/src/components/toasts/NotificationToast.vue
@@ -0,0 +1,48 @@
+<template>
+  <div />
+</template>
+
+<script lang="ts">
+import { defineComponent } from "vue-demi";
+import useNotificationStore from "@/store/notification";
+import type { NotificationToast } from "@/store/types";
+
+export default defineComponent({
+  setup() {
+    const notificationStore = useNotificationStore();
+
+    return { notificationStore };
+  },
+
+  computed: {
+    currentToast(): NotificationToast | undefined {
+      return this.notificationStore.notificationQueue
+        ? (this.notificationStore.notificationQueue.at(0) as NotificationToast)
+        : undefined;
+    },
+  },
+
+  watch: {
+    currentToast() {
+      const toast = this.currentToast;
+      if (toast) {
+        // Display the notification toast
+        this.makeToast(toast);
+        // Toast has been shown, remove it from the queue
+        this.notificationStore.deleteNotification(toast);
+      }
+    },
+  },
+
+  methods: {
+    async makeToast(toast: NotificationToast) {
+      if (!toast.toaster) {
+        toast.toaster = "b-toaster-bottom-right";
+      }
+      this.$root.$bvToast.toast(toast.body, toast);
+    },
+  },
+});
+</script>
+
+<style></style>
diff --git a/src/i18n/de.ts b/src/i18n/de.ts
index 58a8510463457f2c95469d5a30961ec72a36a17a..ba28b6510b62fc040ae709198ec000c45aeec822 100644
--- a/src/i18n/de.ts
+++ b/src/i18n/de.ts
@@ -105,6 +105,16 @@ export default {
           "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).",
       },
     },
+    apiError: {
+      general: {
+        title: "Ein Fehler ist aufgetreten",
+        body: "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).",
+      },
+      specific: {
+        title: "Ein Fehler ist aufgetreten",
+        body: "Es ist ein Fehler aufgetreten {error}. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).",
+      },
+    },
   },
 
   breadcrumbs: {
@@ -232,9 +242,9 @@ export default {
   },
 
   email: {
-    serviceDeskEmail: "servicedesk@rwth-aachen.de",
+    serviceDeskEmail: "servicedesk@itc.rwth-aachen.de",
     serviceDeskMailTo:
-      "mailto:servicedesk@rwth-aachen.de?subject=CoScInE%20Pilot%20Program",
+      "mailto:servicedesk@itc.rwth-aachen.de?subject=CoScInE%20Pilot%20Program",
     serviceDeskName: "Servicedesk",
   },
 } as VueI18n.LocaleMessageObject;
diff --git a/src/i18n/en.ts b/src/i18n/en.ts
index 1cf6727f4efcb3dc6343be3cef430461b1442322..e0791174db14deeeda8a92b63963fb0f8e54bc52 100644
--- a/src/i18n/en.ts
+++ b/src/i18n/en.ts
@@ -89,7 +89,7 @@ export default {
       failure: {
         title: "Error on saving",
         message:
-          "An error occured. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).",
+          "An error occurred. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).",
       },
     },
     onDelete: {
@@ -100,7 +100,17 @@ export default {
       failure: {
         title: "Error on deletion",
         message:
-          "An error occured. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).",
+          "An error occurred. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).",
+      },
+    },
+    apiError: {
+      general: {
+        title: "An error occurred",
+        body: "An error occurred. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).",
+      },
+      specific: {
+        title: "An error occurred",
+        body: "An error occurred {error}. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).",
       },
     },
   },
@@ -229,9 +239,9 @@ export default {
   },
 
   email: {
-    serviceDeskEmail: "servicedesk@rwth-aachen.de",
+    serviceDeskEmail: "servicedesk@itc.rwth-aachen.de",
     serviceDeskMailTo:
-      "mailto:servicedesk@rwth-aachen.de?subject=Coscine%20Pilot%20Program",
+      "mailto:servicedesk@itc.rwth-aachen.de?subject=Coscine%20Pilot%20Program",
     serviceDeskName: "Servicedesk",
   },
 } as VueI18n.LocaleMessageObject;
diff --git a/src/modules/admin/AdminModule.vue b/src/modules/admin/AdminModule.vue
index bb98cfb53a04fb8a2cfcca9690344c63a0fd9cd1..b58932377881d2930f291f7748ee316f5cd7565b 100644
--- a/src/modules/admin/AdminModule.vue
+++ b/src/modules/admin/AdminModule.vue
@@ -20,16 +20,16 @@ export default defineComponent({
     return { mainStore, adminStore };
   },
 
-  created() {
-    this.initialize();
-  },
-
   computed: {
     moduleIsReady(): boolean {
       return true;
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
       // do initialization stuff (e.g. API calls, element loading, etc.)
diff --git a/src/modules/admin/pages/Admin.vue b/src/modules/admin/pages/Admin.vue
index 5f19ae17089fab68d6251813414797d2d9a0e4a3..37f4a8604764916be343e65fae3959832935a40d 100644
--- a/src/modules/admin/pages/Admin.vue
+++ b/src/modules/admin/pages/Admin.vue
@@ -16,7 +16,7 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import CoscineHeadline from "@/components/CoscineHeadline.vue";
+import CoscineHeadline from "@/components/coscine/CoscineHeadline.vue";
 
 // import the store for current module
 import useAdminStore from "../store";
@@ -24,15 +24,14 @@ import useAdminStore from "../store";
 import useMainStore from "@/store/index";
 
 export default defineComponent({
+  components: {
+    CoscineHeadline,
+  },
   setup() {
     const mainStore = useMainStore();
     const adminStore = useAdminStore();
 
     return { mainStore, adminStore };
   },
-
-  components: {
-    CoscineHeadline,
-  },
 });
 </script>
diff --git a/src/modules/error/ErrorModule.vue b/src/modules/error/ErrorModule.vue
index b0c836e15071ec59543c3d4c2cf60472db4c21a8..5d27a41e457f2a41cdab7281c3cac9f5ffddf993 100644
--- a/src/modules/error/ErrorModule.vue
+++ b/src/modules/error/ErrorModule.vue
@@ -20,16 +20,16 @@ export default defineComponent({
     return { mainStore, errorStore };
   },
 
-  created() {
-    this.initialize();
-  },
-
   computed: {
     moduleIsReady(): boolean {
       return true;
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
       // do initialization stuff (e.g. API calls, element loading, etc.)
diff --git a/src/modules/error/pages/NotFound.vue b/src/modules/error/pages/NotFound.vue
index 37431cd9ed7ad6a6b9162e4a1c0e246766041d23..3a3d13dd786caca739a7d46fde98b2547ee4b2f6 100644
--- a/src/modules/error/pages/NotFound.vue
+++ b/src/modules/error/pages/NotFound.vue
@@ -16,7 +16,7 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import CoscineHeadline from "@/components/CoscineHeadline.vue";
+import CoscineHeadline from "@/components/coscine/CoscineHeadline.vue";
 
 // import the store for current module
 import useErrorStore from "../store";
@@ -24,15 +24,14 @@ import useErrorStore from "../store";
 import useMainStore from "@/store/index";
 
 export default defineComponent({
+  components: {
+    CoscineHeadline,
+  },
   setup() {
     const mainStore = useMainStore();
     const errorStore = useErrorStore();
 
     return { mainStore, errorStore };
   },
-
-  components: {
-    CoscineHeadline,
-  },
 });
 </script>
diff --git a/src/modules/login/LoginModule.vue b/src/modules/login/LoginModule.vue
index 9e15fabc356cedc112ad3022da2e4a24c627c12e..9b60b323dc72ce1c4ac9bce5c21cbcd86d2207b9 100644
--- a/src/modules/login/LoginModule.vue
+++ b/src/modules/login/LoginModule.vue
@@ -20,16 +20,16 @@ export default defineComponent({
     return { mainStore, loginStore };
   },
 
-  created() {
-    this.initialize();
-  },
-
   computed: {
     moduleIsReady(): boolean {
       return true;
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
       // do initialization stuff (e.g. API calls, element loading, etc.)
diff --git a/src/modules/pid/PidModule.vue b/src/modules/pid/PidModule.vue
index 8010d3fde3cbcfc7dc0a82f381886d1de1bd2ef5..e38b34f7778ed330c7c6fe390f574cd01e669805 100644
--- a/src/modules/pid/PidModule.vue
+++ b/src/modules/pid/PidModule.vue
@@ -20,16 +20,16 @@ export default defineComponent({
     return { mainStore, pidStore };
   },
 
-  created() {
-    this.initialize();
-  },
-
   computed: {
     moduleIsReady(): boolean {
       return true;
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
       // do initialization stuff (e.g. API calls, element loading, etc.)
diff --git a/src/modules/pid/pages/Pid.vue b/src/modules/pid/pages/Pid.vue
index 3e863c39311a7a757c59fda22c88e3fbe5a1d716..a130096c844edb8cd607925a4c104d512ca3604a 100644
--- a/src/modules/pid/pages/Pid.vue
+++ b/src/modules/pid/pages/Pid.vue
@@ -15,7 +15,7 @@
 
 <script lang="ts">
 import { defineComponent } from "vue-demi";
-import CoscineHeadline from "@/components/CoscineHeadline.vue";
+import CoscineHeadline from "@/components/coscine/CoscineHeadline.vue";
 
 // import the store for current module
 import usePidStore from "../store";
@@ -23,15 +23,14 @@ import usePidStore from "../store";
 import useMainStore from "@/store/index";
 
 export default defineComponent({
+  components: {
+    CoscineHeadline,
+  },
   setup() {
     const mainStore = useMainStore();
     const pidStore = usePidStore();
 
     return { mainStore, pidStore };
   },
-
-  components: {
-    CoscineHeadline,
-  },
 });
 </script>
diff --git a/src/modules/project/ProjectModule.vue b/src/modules/project/ProjectModule.vue
index 3666440bc4ab0fe54f51c7c0957d01cff67a0fcc..fa56c2859ac0b828a45ec672bb173717fcbc551c 100644
--- a/src/modules/project/ProjectModule.vue
+++ b/src/modules/project/ProjectModule.vue
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <router-view :loading="!moduleIsReady" />
+    <router-view />
   </div>
 </template>
 
@@ -10,6 +10,7 @@ import { defineComponent } from "vue-demi";
 // import the store for current module
 import useProjectStore from "./store";
 import useResourceStore from "@/modules/resource/store";
+import useNotificationStore from "@/store/notification";
 // import the main store
 import useMainStore from "@/store/index";
 
@@ -17,16 +18,17 @@ import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.P
 import type { Route } from "vue-router";
 
 export default defineComponent({
+  async beforeRouteUpdate(to, from, next) {
+    await this.apiFetch(to);
+    next();
+  },
   setup() {
     const mainStore = useMainStore();
     const projectStore = useProjectStore();
+    const notificationStore = useNotificationStore();
     const resourceStore = useResourceStore();
 
-    return { mainStore, projectStore, resourceStore };
-  },
-
-  created() {
-    this.initialize();
+    return { mainStore, projectStore, notificationStore, resourceStore };
   },
 
   computed: {
@@ -34,20 +36,32 @@ export default defineComponent({
       return this.projectStore.currentProject;
     },
     moduleIsReady(): boolean {
+      // Currently unused
       return (
-        this.projectStore !== null &&
         this.projectStore.currentSlug !== null &&
         this.projectStore.currentProject !== null &&
         this.projectStore.currentResources !== null &&
         this.projectStore.currentSubProjects !== null &&
         this.projectStore.currentQuotas !== null &&
-        this.resourceStore.resourceTypes !== null &&
         this.projectStore.currentProjectRoles !== null &&
-        this.projectStore.roles !== null
+        this.projectStore.roles !== null &&
+        this.projectStore.roles !== undefined &&
+        this.resourceStore.resourceTypes !== null
       );
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
+  beforeDestroy() {
+    // Set the slug to null in order to hide the project from the sidebar
+    if (this.projectStore.currentSlug) {
+      this.projectStore.currentSlug = null;
+    }
+  },
+
   methods: {
     async initialize() {
       await this.apiFetch(this.$router.currentRoute);
@@ -88,10 +102,5 @@ export default defineComponent({
       }
     },
   },
-
-  async beforeRouteUpdate(to, from, next) {
-    await this.apiFetch(to);
-    next();
-  },
 });
 </script>
diff --git a/src/modules/project/RootProjectModule.vue b/src/modules/project/RootProjectModule.vue
index 47570e87ca1bfc0f0433ae24abf27c00d7c6a426..2a517547bbc30863bdc6a984fe8522ba5b003acd 100644
--- a/src/modules/project/RootProjectModule.vue
+++ b/src/modules/project/RootProjectModule.vue
@@ -1,6 +1,9 @@
 <template>
   <div>
     <router-view v-if="moduleIsReady" />
+    <b-row v-else align-h="center" class="my-4">
+      <b-spinner variant="secondary" />
+    </b-row>
   </div>
 </template>
 
@@ -13,6 +16,10 @@ import useProjectStore from "./store";
 import useMainStore from "@/store/index";
 
 export default defineComponent({
+  async beforeRouteUpdate(to, from, next) {
+    await this.apiFetch();
+    next();
+  },
   setup() {
     const mainStore = useMainStore();
     const projectStore = useProjectStore();
@@ -20,20 +27,19 @@ export default defineComponent({
     return { mainStore, projectStore };
   },
 
-  created() {
-    this.initialize();
-  },
-
   computed: {
     moduleIsReady(): boolean {
       return (
-        this.projectStore !== null &&
         this.projectStore.topLevelProjects !== null &&
         this.projectStore.roles !== null
       );
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
       await this.apiFetch();
@@ -55,10 +61,5 @@ export default defineComponent({
       }
     },
   },
-
-  async beforeRouteUpdate(to, from, next) {
-    await this.apiFetch();
-    next();
-  },
 });
 </script>
diff --git a/src/modules/project/i18n/de.ts b/src/modules/project/i18n/de.ts
index c455e76fbd750d337405d455fde78b45a0f233e7..56ee0ebf5c1e85573b8ad0900a3ccd5b668c00a7 100644
--- a/src/modules/project/i18n/de.ts
+++ b/src/modules/project/i18n/de.ts
@@ -116,16 +116,15 @@ export default {
     quota: {
       headline: "Quota Management",
       resources: "Ressourcen",
-      rangeText1: " GB von ",
-      rangeText2: " GB reserviert",
-      gb: " GB ",
+      rangeText: "{allocated} GB von {maximum} GB reserviert",
+      gb: "{number} GB",
 
       projectLabel: "Projekt:",
-      resourceTypeLabel: "Ressource Typ:",
+      resourceTypeLabel: "Ressourcentyp:",
 
-      emptyProjectSelect: "-- Bitte wählen Sie ein Projekt --",
-      emptyResourceTypeSelect: "-- Bitte wählen Sie einen Ressourcen Typ --",
-      noResourceTypeChoosen: "Es wurde kein Ressourcen Typ ausgewählt.",
+      emptyProjectSelect: "Bitte wählen Sie ein Projekt aus.",
+      emptyResourceTypeSelect: "Bitte wählen Sie einen Ressourcentyp aus.",
+      noResourceTypeChoosen: "Es wurde kein Ressourcentyp ausgewählt.",
 
       moreHelp: "Mehr anfordern",
       moreHelpLink:
@@ -140,24 +139,24 @@ export default {
 
       connectionErrorTitle: "Fehler bei der Abfrage der Quotas",
       connectionErrorBody:
-        "Bei der Abfrage der Quotas ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@rwth-aachen.de",
+        "Bei der Abfrage der Quotas ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@itc.rwth-aachen.de",
 
       resourceTypeQuotaChangedSuccessTitle: "Quota erfolgreich verändert",
       resourceTypeQuotaChangedSuccessBody:
         "Die Quota im Projekt {ProjectName} wurde auf {AmountInGB} GB gesetzt.",
       resourceTypeQuotaChangedFailureTitle: "Fehler beim Ändern der Quota",
       resourceTypeQuotaChangedFailureBody:
-        "Beim Ändern der Quota ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@rwth-aachen.de",
+        "Beim Ändern der Quota ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@itc.rwth-aachen.de",
 
       resourceQuotaChangedSuccessTitle: "Quota erfolgreich verändert",
       resourceQuotaChangedSuccessBody:
         "Die Quota in Ressource {ResourceName} wurde auf {AmountInGB} GB gesetzt.",
       resourceQuotaChangedFailureTitle: "Fehler beim Ändern der Quota",
       resourceQuotaChangedFailureBody:
-        "Beim Ändern der Quota ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@rwth-aachen.de",
+        "Beim Ändern der Quota ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@itc.rwth-aachen.de",
     },
 
-    // Settíngs.vue
+    // Settings.vue
     settings: {
       // page title is fetched from `sidebar.projectSettings`
 
@@ -170,6 +169,7 @@ export default {
       },
     },
   },
+
   form: {
     project: {
       labelSymbol: ":",
diff --git a/src/modules/project/i18n/en.ts b/src/modules/project/i18n/en.ts
index 308050af07536f9f8e620342263f9c058fa60bb4..007f58402d301a7d8a53392c1a344f60e3717f08 100644
--- a/src/modules/project/i18n/en.ts
+++ b/src/modules/project/i18n/en.ts
@@ -111,15 +111,14 @@ export default {
     quota: {
       headline: "Quota Management",
       resources: "Resources",
-      rangeText1: " GB of ",
-      rangeText2: " GB reserved",
-      gb: " GB ",
+      rangeText: "{allocated} GB of {maximum} GB reserved",
+      gb: "{number} GB",
 
       projectLabel: "Project:",
       resourceTypeLabel: "Resource Type:",
 
-      emptyProjectSelect: "-- Please select a project --",
-      emptyResourceTypeSelect: "-- Please select a resource type --",
+      emptyProjectSelect: "Please select a project.",
+      emptyResourceTypeSelect: "Please select a resource type.",
       noResourceTypeChoosen: "No resource type selected.",
 
       moreHelp: "Request more",
@@ -134,27 +133,27 @@ export default {
 
       emptyTableText: "No resources exist for this resource type.",
 
-      connectionErrorTitle: "Resource quota retrieval not successfull",
+      connectionErrorTitle: "Resource quota retrieval not successful",
       connectionErrorBody:
-        "An error occured while retrieving the resource type quota. Please try again. If the error persists, contact us at servicedesk@rwth-aachen.de",
+        "An error occurred while retrieving the resource type quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de",
 
       resourceTypeQuotaChangedSuccessTitle: "Quota extended successfully",
       resourceTypeQuotaChangedSuccessBody:
         "The quota for project {ProjectName} was successfully extended to {AmountInGB} GB.",
       resourceTypeQuotaChangedFailureTitle:
-        "Resource quota extension not successfull",
+        "Resource quota extension not successful",
       resourceTypeQuotaChangedFailureBody:
-        "An error occured while extending the resource type quota. Please try again. If the error persists, contact us at servicedesk@rwth-aachen.de",
+        "An error occurred while extending the resource type quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de",
 
       resourceQuotaChangedSuccessTitle: "Quota extended successfully",
       resourceQuotaChangedSuccessBody:
         "The quota for resource {ResourceName} was successfully extended to {AmountInGB} GB.",
-      resourceQuotaChangedFailureTitle: "Quota extension not successfull",
+      resourceQuotaChangedFailureTitle: "Quota extension not successful",
       resourceQuotaChangedFailureBody:
-        "An error occured while extending the quota. Please try again. If the error persists, contact us at servicedesk@rwth-aachen.de",
+        "An error occurred while extending the quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de",
     },
 
-    // Settíngs.vue
+    // Settings.vue
     settings: {
       // page title is fetched from `sidebar.projectSettings`
 
@@ -166,6 +165,7 @@ export default {
       },
     },
   },
+
   form: {
     project: {
       labelSymbol: ":",
diff --git a/src/modules/project/pages/CreateProject.vue b/src/modules/project/pages/CreateProject.vue
index a138e27cec9b37090c100af1eb695c8bbaf7b14f..9b7f302c2bf1b245f5f50527104f507d87ef3c6c 100644
--- a/src/modules/project/pages/CreateProject.vue
+++ b/src/modules/project/pages/CreateProject.vue
@@ -19,7 +19,7 @@
 
           <FormNaming
             v-model="projectForm"
-            :isLoading="isLoading"
+            :is-loading="isLoading"
             @validation="formValidations.naming = $event"
           />
 
@@ -27,8 +27,8 @@
 
           <FormMetadata
             v-model="projectForm"
-            :isLoading="isLoading"
-            :parentProject="project"
+            :is-loading="isLoading"
+            :parent-project="project"
             @validation="formValidations.metadata = $event"
           />
 
@@ -38,7 +38,6 @@
               type="submit"
               variant="primary"
               class="float-right"
-              @click.prevent="clickSave"
               :disabled="
                 formValidations.naming.$invalid ||
                 formValidations.metadata.$invalid ||
@@ -46,6 +45,7 @@
                   !formValidations.metadata.$anyDirty) ||
                 isWaitingForResponse
               "
+              @click.prevent="clickSave"
             >
               {{ $t("buttons.submit") }}</b-button
             >
@@ -54,8 +54,8 @@
 
         <!-- Loading Spinner on Submit -->
         <LoadingSpinner
-          :isWaitingForResponse="isWaitingForResponse"
-          :textAfter="$t('page.createProject.loadingSpinnerProjectCreation')"
+          :is-waiting-for-response="isWaitingForResponse"
+          :text-after="$t('page.createProject.loadingSpinnerProjectCreation')"
         />
       </div>
       <div class="col-sm-2" />
@@ -85,19 +85,20 @@ import useProjectStore from "../store";
 import useMainStore from "@/store/index";
 import useResourceStore from "@/modules/resource/store";
 import { navigateToProject } from "@/router";
+import useNotificationStore from "@/store/notification";
 
 export default defineComponent({
+  components: {
+    FormNaming,
+    FormMetadata,
+  },
   setup() {
     const mainStore = useMainStore();
     const projectStore = useProjectStore();
     const resourceStore = useResourceStore();
+    const notificationStore = useNotificationStore();
 
-    return { mainStore, projectStore, resourceStore };
-  },
-
-  components: {
-    FormNaming,
-    FormMetadata,
+    return { mainStore, projectStore, resourceStore, notificationStore };
   },
 
   data() {
@@ -153,20 +154,6 @@ export default defineComponent({
   },
 
   methods: {
-    makeToast(
-      text = "Message",
-      givenTitle = "Title",
-      variant: string | undefined = undefined
-    ) {
-      this.$root.$bvToast.toast(text, {
-        title: givenTitle,
-        autoHideDelay: 5000,
-        toaster: "b-toaster-bottom-right",
-        variant: variant,
-        noCloseButton: true,
-      });
-    },
-
     async clickSave() {
       // Validate form again
       this.formValidations.naming.$touch();
@@ -197,11 +184,11 @@ export default defineComponent({
       } else {
         this.isWaitingForResponse = false;
         // On Failure
-        this.makeToast(
-          this.$t("toast.onSave.failure.message").toString(),
-          this.$t("toast.onSave.failure.title").toString(),
-          "danger"
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("toast.onSave.failure.title").toString(),
+          body: this.$t("toast.onSave.failure.message").toString(),
+          variant: "danger",
+        });
       }
     },
   },
diff --git a/src/modules/project/pages/Members.vue b/src/modules/project/pages/Members.vue
index 0791f1e36c677b10be76a3c3d627ee331cd9ecfb..c942998064a1dc2a96388ee21ddc7c756cfa52ea 100644
--- a/src/modules/project/pages/Members.vue
+++ b/src/modules/project/pages/Members.vue
@@ -5,7 +5,7 @@
     <div class="UserManagement">
       <!-- Search Row  -->
       <UserSearchRow
-        :memberRole="memberRole"
+        :member-role="memberRole"
         :project="project"
         :roles="roles"
         @addUser="addUser"
@@ -25,12 +25,12 @@
                 :filter="filter"
                 :busy="isBusy"
                 :roles="roles"
-                :emptyText="$t('page.members.emptyTableText')"
-                :emptyFilteredText="$t('page.members.emptyFilterText')"
-                :deleteText="$t('buttons.delete')"
-                :removeText="$t('buttons.remove')"
-                :ownerCount="ownerCount"
-                :ownerRole="ownerRole"
+                :empty-text="$t('page.members.emptyTableText')"
+                :empty-filtered-text="$t('page.members.emptyFilterText')"
+                :delete-text="$t('buttons.delete')"
+                :remove-text="$t('buttons.remove')"
+                :owner-count="ownerCount"
+                :owner-role="ownerRole"
                 @tableFilteredRows="onFilteredRows"
                 @setRole="setRole"
                 @selectedItem="prepareDeletion"
@@ -46,12 +46,12 @@
                 :filter="filter"
                 :busy="isBusy"
                 :roles="roles"
-                :emptyText="$t('page.members.emptyTableText')"
-                :emptyFilteredText="$t('page.members.emptyFilterText')"
-                :deleteText="$t('buttons.delete')"
-                :removeText="$t('buttons.remove')"
-                :ownerCount="ownerCount"
-                :ownerRole="ownerRole"
+                :empty-text="$t('page.members.emptyTableText')"
+                :empty-filtered-text="$t('page.members.emptyFilterText')"
+                :delete-text="$t('buttons.delete')"
+                :remove-text="$t('buttons.remove')"
+                :owner-count="ownerCount"
+                :owner-role="ownerRole"
                 sort-by="email"
                 @revokeInvitation="revokeInvitation"
                 @resendInvitation="resendInvitation"
@@ -63,11 +63,11 @@
 
       <!-- Modal Revoke Invited Email  -->
       <DeleteModal
-        descriptionKey="page.members.removeSelectedInvitation"
-        titleKey="page.members.deleteInvitationTitle"
+        description-key="page.members.removeSelectedInvitation"
+        title-key="page.members.deleteInvitationTitle"
         :visible="isDeleteInvitedUserModalVisible"
-        :selectedUser="selectedInvitation.userMail"
-        :selectedProject="projectName"
+        :selected-user="selectedInvitation.userMail"
+        :selected-project="projectName"
         @ok="confirmRevokeInvitation"
         @close="closeInvitedUserModal"
       />
@@ -75,33 +75,33 @@
       <!--- Modal Delete Current Members --->
       <DeleteModal
         :visible="isDeleteUserModalVisible"
-        :selectedUser="
+        :selected-user="
           candidateForDeletion.user ? candidateForDeletion.user.displayName : ''
         "
-        :selectedProject="projectName"
+        :selected-project="projectName"
         @ok="deleteUser"
         @close="closeUserModal"
       />
 
       <!-- Modal Invitation Pending  -->
       <InvitationPendingModal
-        :candidateForInvitation="candidateForInvitation"
+        :candidate-for-invitation="candidateForInvitation"
       />
 
       <!-- Modal User Import  -->
       <ImportUserModal
-        :memberHeaders="memberHeaders"
-        :memberRole="memberRole"
+        :member-headers="memberHeaders"
+        :member-role="memberRole"
         :project="project"
-        :projectRoles="projectRoles"
+        :project-roles="projectRoles"
         :roles="roles"
         @addUser="addUser"
       />
 
       <!-- Modal User Invite  -->
       <InviteUserModal
-        :candidateForInvitation="candidateForInvitation"
-        :projectName="projectName"
+        :candidate-for-invitation="candidateForInvitation"
+        :project-name="projectName"
         :roles="roles"
         @storeNewInvitation="storeNewInvitation"
       />
@@ -133,16 +133,9 @@ import type {
   SendInvitationObject,
 } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 import type { ExtendedSendInvitationObject } from "../types";
+import useNotificationStore from "@/store/notification";
 
 export default defineComponent({
-  setup() {
-    const mainStore = useMainStore();
-    const projectStore = useProjectStore();
-    const userStore = useUserStore();
-
-    return { mainStore, projectStore, userStore };
-  },
-
   components: {
     MembersTable,
     UserSearchRow,
@@ -151,6 +144,35 @@ export default defineComponent({
     InvitationPendingModal,
     InviteUserModal,
   },
+  setup() {
+    const mainStore = useMainStore();
+    const projectStore = useProjectStore();
+    const userStore = useUserStore();
+    const notificationStore = useNotificationStore();
+
+    return { mainStore, projectStore, userStore, notificationStore };
+  },
+
+  data() {
+    return {
+      // For controlling delete modals
+      isDeleteInvitedUserModalVisible: false,
+      isDeleteUserModalVisible: false,
+      // For external users
+      selectedInvitation: {} as InvitationReturnObject,
+      isRevokeInvitationModalVisible: false,
+      // Other
+      isBusy: false,
+      filteredRows: 0,
+      filter: "",
+      candidateForDeletion: {} as ProjectRoleObject,
+      candidateForInvitation: {} as ExtendedSendInvitationObject,
+      roleStrings: {
+        member: "Member",
+        owner: "Owner",
+      },
+    };
+  },
 
   computed: {
     invitations(): InvitationReturnObject[] | null {
@@ -251,27 +273,6 @@ export default defineComponent({
     },
   },
 
-  data() {
-    return {
-      // For controlling delete modals
-      isDeleteInvitedUserModalVisible: false,
-      isDeleteUserModalVisible: false,
-      // For external users
-      selectedInvitation: {} as InvitationReturnObject,
-      isRevokeInvitationModalVisible: false,
-      // Other
-      isBusy: false,
-      filteredRows: 0,
-      filter: "",
-      candidateForDeletion: {} as ProjectRoleObject,
-      candidateForInvitation: {} as ExtendedSendInvitationObject,
-      roleStrings: {
-        member: "Member",
-        owner: "Owner",
-      },
-    };
-  },
-
   methods: {
     // For external users
     async storeNewInvitation(
@@ -282,16 +283,16 @@ export default defineComponent({
       try {
         await this.projectStore.storeInvitation(value);
         await this.projectStore.retrieveInvitations(this.project);
-        this.makeToast(
-          toastText,
-          this.$t("page.members.userManagement").toString()
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("page.members.userManagement").toString(),
+          body: toastText,
+        });
       } catch {
-        this.makeToast(
-          errorText,
-          this.$t("page.members.userManagement").toString(),
-          "danger"
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("page.members.userManagement").toString(),
+          body: errorText,
+          variant: "danger",
+        });
       }
     },
 
@@ -301,20 +302,16 @@ export default defineComponent({
         role: selectedInvitation.roleId,
         email: selectedInvitation.userMail,
       };
-      const errorText = this.$parent
-        .$t("page.members.invitedUserError", {
-          email: selectedInvitation.userMail,
-        })
-        .toString();
-      const text = this.$parent
-        .$t("page.members.invitedUserText", {
-          email: selectedInvitation.userMail,
-          role: selectedInvitation.roleId
-            ? this.getRoleNameFromId(selectedInvitation.roleId)
-            : "",
-          projectName: this.projectName,
-        })
-        .toString();
+      const errorText = this.$t("page.members.invitedUserError", {
+        email: selectedInvitation.userMail,
+      }).toString();
+      const text = this.$t("page.members.invitedUserText", {
+        email: selectedInvitation.userMail,
+        role: selectedInvitation.roleId
+          ? this.getRoleNameFromId(selectedInvitation.roleId)
+          : "",
+        projectName: this.projectName,
+      }).toString();
       this.storeNewInvitation(invitation, text, errorText);
     },
 
@@ -326,33 +323,28 @@ export default defineComponent({
 
     async confirmRevokeInvitation() {
       if (this.selectedInvitation.id) {
-        const text = this.$parent
-          .$t("page.members.removedUser", {
-            email: this.selectedInvitation.userMail,
-            project: this.projectName,
-          })
-          .toString();
+        const text = this.$t("page.members.removedUser", {
+          email: this.selectedInvitation.userMail,
+          project: this.projectName,
+        }).toString();
         const worked = await this.projectStore.deleteInvitation(
           this.selectedInvitation.id
         );
         if (worked) {
           await this.projectStore.retrieveInvitations(this.project);
-          this.makeToast(
-            text,
-            this.$t("page.members.userManagement").toString()
-          );
+          this.notificationStore.postNotification({
+            title: this.$t("page.members.userManagement").toString(),
+            body: text,
+          });
         } else {
-          const errorMsg = this.$parent
-            .$t("page.members.deleteExternalUserError", {
-              email: this.selectedInvitation.userMail,
-            })
-            .toString();
-
-          this.makeToast(
-            errorMsg,
-            this.$t("page.members.userManagement").toString(),
-            "danger"
-          );
+          const errorMsg = this.$t("page.members.deleteExternalUserError", {
+            email: this.selectedInvitation.userMail,
+          }).toString();
+          this.notificationStore.postNotification({
+            title: this.$t("page.members.userManagement").toString(),
+            body: errorMsg,
+            variant: "danger",
+          });
         }
 
         this.isDeleteInvitedUserModalVisible = false;
@@ -380,23 +372,24 @@ export default defineComponent({
             : this.roleStrings.member;
       }
 
-      let text = this.$parent
-        .$t("page.members.changedRole", {
-          project: this.projectName,
-          role:
-            projectRole.role && projectRole.role.id
-              ? this.getRoleNameFromId(projectRole.role.id)
-              : "",
-          user:
-            projectRole.user && projectRole.user.displayName
-              ? projectRole.user.displayName
-              : "",
-        })
-        .toString();
+      let text = this.$t("page.members.changedRole", {
+        project: this.projectName,
+        role:
+          projectRole.role && projectRole.role.id
+            ? this.getRoleNameFromId(projectRole.role.id)
+            : "",
+        user:
+          projectRole.user && projectRole.user.displayName
+            ? projectRole.user.displayName
+            : "",
+      }).toString();
 
       await this.projectStore.storeProjectRole(projectRole);
       await this.getProjectRoles();
-      this.makeToast(text, this.$t("page.members.userManagement").toString());
+      this.notificationStore.postNotification({
+        title: this.$t("page.members.userManagement").toString(),
+        body: text,
+      });
     },
 
     getRoleNameFromId(roleId: string): string | null | undefined {
@@ -416,23 +409,24 @@ export default defineComponent({
         projectRole.projectId = this.project.id;
       }
 
-      let text = this.$parent
-        .$t("page.members.addedUser", {
-          project: this.projectName,
-          role:
-            projectRole.role && projectRole.role.id
-              ? this.getRoleNameFromId(projectRole.role.id)
-              : "",
-          user:
-            projectRole.user && projectRole.user.displayName
-              ? projectRole.user.displayName
-              : "",
-        })
-        .toString();
+      let text = this.$t("page.members.addedUser", {
+        project: this.projectName,
+        role:
+          projectRole.role && projectRole.role.id
+            ? this.getRoleNameFromId(projectRole.role.id)
+            : "",
+        user:
+          projectRole.user && projectRole.user.displayName
+            ? projectRole.user.displayName
+            : "",
+      }).toString();
 
       await this.projectStore.storeProjectRole(projectRole);
       await this.getProjectRoles();
-      this.makeToast(text, this.$t("page.members.userManagement").toString());
+      this.notificationStore.postNotification({
+        title: this.$t("page.members.userManagement").toString(),
+        body: text,
+      });
       if (callback) {
         callback();
       }
@@ -479,15 +473,16 @@ export default defineComponent({
     },
 
     async deleteUser() {
-      const text = this.$parent
-        .$t("page.members.removedUser", {
-          email: this.candidateForDeletion.user?.displayName,
-          project: this.projectName,
-        })
-        .toString();
+      const text = this.$t("page.members.removedUser", {
+        email: this.candidateForDeletion.user?.displayName,
+        project: this.projectName,
+      }).toString();
       await this.projectStore.deleteProjectRole(this.candidateForDeletion);
       await this.getProjectRoles();
-      this.makeToast(text, this.$t("page.members.userManagement").toString());
+      this.notificationStore.postNotification({
+        title: this.$t("page.members.userManagement").toString(),
+        body: text,
+      });
       this.isDeleteUserModalVisible = false;
     },
 
@@ -503,16 +498,6 @@ export default defineComponent({
       this.filteredRows = value;
     },
 
-    makeToast(text = "Message", givenTitle = "Title", toastVariant = "") {
-      this.$root.$bvToast.toast(text, {
-        title: givenTitle,
-        autoHideDelay: 5000,
-        variant: toastVariant,
-        toaster: "b-toaster-bottom-right",
-        noCloseButton: true,
-      });
-    },
-
     setFilter(filter: string) {
       this.filter = filter;
     },
diff --git a/src/modules/project/pages/ProjectPage.vue b/src/modules/project/pages/ProjectPage.vue
index a122dd17a8f01f3ee2f2bad8fa08bf331f34c51a..c2d1d0fe8600e80be64e39ebaead256f42cf9799 100644
--- a/src/modules/project/pages/ProjectPage.vue
+++ b/src/modules/project/pages/ProjectPage.vue
@@ -13,15 +13,24 @@
               :to="toCreateResource()"
               @open-card="openCreateResource($event)"
             />
+            <!-- Loading Card Placeholder -->
+            <CoscineCard
+              v-if="!resources"
+              :to="{}"
+              :title="$t('default.loading')"
+              :is-loading="!resources"
+            />
+            <!-- Content Cards -->
             <CoscineCard
               v-for="(resource, index) in resources"
+              v-else
               :key="index"
               :title="resource.displayName"
               type="resource"
-              :badge_visibility="resource.archived"
-              :badge_text="$t('default.archived')"
+              :badge-visibility="resource.archived"
+              :badge-text="$t('default.archived')"
               :to="toResource(resource)"
-              :toSettings="toResourceSettings(resource)"
+              :to-settings="toResourceSettings(resource)"
               @open-card="openResource($event, resource)"
               @open-card-settings="openResourceSettings($event, resource)"
             />
@@ -47,13 +56,21 @@
             :to="toCreateSubProject()"
             @open-card="openCreateProject($event)"
           />
+          <!-- Loading Card Placeholder -->
+          <CoscineCard
+            v-if="!subProjects"
+            :to="{}"
+            :title="$t('default.loading')"
+            :is-loading="!subProjects"
+          />
+          <!-- Content Cards -->
           <CoscineCard
-            v-for="(project, index) in subProjects"
+            v-for="(subProject, index) in subProjects"
             :key="index"
-            :title="project.displayName"
+            :title="subProject.displayName"
             type="project"
-            :to="toSubProject(project)"
-            @open-card="openProject($event, project)"
+            :to="toSubProject(subProject)"
+            @open-card="openProject($event, subProject)"
           />
         </b-card-group>
       </div>
@@ -77,6 +94,9 @@ import useMainStore from "@/store/index";
 import useResourceStore from "@/modules/resource/store";
 
 export default defineComponent({
+  components: {
+    MembersList,
+  },
   setup() {
     const mainStore = useMainStore();
     const projectStore = useProjectStore();
@@ -85,17 +105,6 @@ export default defineComponent({
     return { mainStore, projectStore, resourceStore };
   },
 
-  props: {
-    loading: {
-      default: false,
-      type: Boolean,
-    },
-  },
-
-  components: {
-    MembersList,
-  },
-
   computed: {
     project(): ProjectObject | null {
       return this.projectStore.currentProject;
diff --git a/src/modules/project/pages/Quota.vue b/src/modules/project/pages/Quota.vue
index 2b1374e840835510660165ae109faa8695cbe2cf..990276430c31a8ef4a35177a7bf8675e7f905f7b 100644
--- a/src/modules/project/pages/Quota.vue
+++ b/src/modules/project/pages/Quota.vue
@@ -49,10 +49,10 @@
         <coscine-form-group
           class="projectQuotaSlider"
           :label="
-            selectedQuota.allocated +
-            $t('page.quota.rangeText1').toString() +
-            selectedQuota.maximum +
-            $t('page.quota.rangeText2').toString()
+            $t('page.quota.rangeText', {
+              allocated: selectedQuota.allocated,
+              maximum: selectedQuota.maximum,
+            })
           "
           :disabled="
             selectedResourceTypeInformation &&
@@ -60,7 +60,7 @@
           "
         >
           <div class="rangeVisual">
-            {{ totalAllocatedSpace }}{{ $t("page.quota.gb") }}
+            {{ $t("page.quota.gb", { number: totalAllocatedSpace }) }}
             <b-form-input
               v-model="selectedQuota.allocated"
               type="range"
@@ -69,7 +69,7 @@
               :disabled="storingQuota"
               @change="changeProjectQuota"
             ></b-form-input>
-            {{ selectedQuota.maximum }}{{ $t("page.quota.gb") }}
+            {{ $t("page.quota.gb", { number: selectedQuota.maximum }) }}
           </div>
         </coscine-form-group>
 
@@ -125,7 +125,7 @@
 
             <!-- Reserved Cell Contents  -->
             <template #cell(allocated)="data">
-              {{ data.item.allocated }}{{ $t("page.quota.gb") }}
+              {{ $t("page.quota.gb", { number: data.item.allocated }) }}
             </template>
 
             <!-- Used Cell Contents -->
@@ -136,7 +136,7 @@
             <!-- Adjust Quota Slider Contents -->
             <template #cell(adjust)="data">
               <div class="rangeVisual">
-                {{ data.item.used }}{{ $t("page.quota.gb") }}
+                {{ $t("page.quota.gb", { number: data.item.used }) }}
                 <b-form-input
                   v-model="data.item.allocated"
                   type="range"
@@ -145,7 +145,7 @@
                   :disabled="storingQuota"
                   @change="changeResourceQuota(data.item)"
                 />
-                {{ data.item.maximum }}{{ $t("page.quota.gb") }}
+                {{ $t("page.quota.gb", { number: data.item.maximum }) }}
               </div>
             </template>
 
@@ -182,6 +182,7 @@ import type {
   ProjectQuotaReturnObject as ResourceQuota,
   UpdateResourceObject,
 } from "@coscine/api-client/dist/types/Coscine.Api.Quota";
+import useNotificationStore from "@/store/notification";
 
 interface ExtendedResourceQuota extends ResourceQuota {
   maximum?: number;
@@ -192,8 +193,33 @@ export default defineComponent({
     const mainStore = useMainStore();
     const projectStore = useProjectStore();
     const resourceStore = useResourceStore();
+    const notificationStore = useNotificationStore();
 
-    return { mainStore, projectStore, resourceStore };
+    return { mainStore, projectStore, resourceStore, notificationStore };
+  },
+
+  data() {
+    return {
+      selectedQuota: {
+        maximum: 0,
+        allocated: 0,
+        used: 0,
+      } as ProjectQuotaReturnObject,
+      selectedResourceTypeId: null as null | string,
+
+      resourceQuotas: [] as ExtendedResourceQuota[],
+      totalAllocatedSpace: 0,
+
+      tableFields: [
+        { key: "name", sortable: true },
+        { key: "allocated", sortable: true },
+        "used",
+        "adjust",
+      ],
+      loadingData: false,
+
+      storingQuota: false,
+    };
   },
 
   computed: {
@@ -259,30 +285,6 @@ export default defineComponent({
     },
   },
 
-  data() {
-    return {
-      selectedQuota: {
-        maximum: 0,
-        allocated: 0,
-        used: 0,
-      } as ProjectQuotaReturnObject,
-      selectedResourceTypeId: null as null | string,
-
-      resourceQuotas: [] as ExtendedResourceQuota[],
-      totalAllocatedSpace: 0,
-
-      tableFields: [
-        { key: "name", sortable: true },
-        { key: "allocated", sortable: true },
-        "used",
-        "adjust",
-      ],
-      loadingData: false,
-
-      storingQuota: false,
-    };
-  },
-
   watch: {
     resourceTypeQuota() {
       if (this.resourceTypeQuota) {
@@ -337,27 +339,25 @@ export default defineComponent({
           );
           await this.projectStore.retrieveQuotas(this.project);
           this.calculateSpaceNeeds();
-          this.makeToast(
-            this.$parent
-              .$t("page.quota.resourceTypeQuotaChangedSuccessTitle")
-              .toString(),
-            this.$parent
-              .$t("page.quota.resourceTypeQuotaChangedSuccessBody", {
-                ProjectName: this.project.displayName,
-                AmountInGB: this.selectedQuota.allocated,
-              })
-              .toString()
-          );
+          this.notificationStore.postNotification({
+            title: this.$t(
+              "page.quota.resourceTypeQuotaChangedSuccessTitle"
+            ).toString(),
+            body: this.$t("page.quota.resourceTypeQuotaChangedSuccessBody", {
+              ProjectName: this.project.displayName,
+              AmountInGB: this.selectedQuota.allocated,
+            }).toString(),
+          });
         } catch {
-          this.makeToast(
-            this.$parent
-              .$t("page.quota.resourceTypeQuotaChangedFailureTitle")
-              .toString(),
-            this.$parent
-              .$t("page.quota.resourceTypeQuotaChangedFailureBody")
-              .toString(),
-            true
-          );
+          this.notificationStore.postNotification({
+            title: this.$t(
+              "page.quota.resourceTypeQuotaChangedFailureTitle"
+            ).toString(),
+            body: this.$t(
+              "page.quota.resourceTypeQuotaChangedFailureBody"
+            ).toString(),
+            variant: "warning",
+          });
         } finally {
           this.storingQuota = false;
         }
@@ -377,45 +377,27 @@ export default defineComponent({
         );
         await this.projectStore.retrieveQuotas(this.project);
         this.calculateSpaceNeeds();
-        this.makeToast(
-          this.$parent
-            .$t("page.quota.resourceQuotaChangedSuccessTitle")
-            .toString(),
-          this.$parent
-            .$t("page.quota.resourceQuotaChangedSuccessBody", {
-              ResourceName: resourceQuotaObject.name,
-              AmountInGB: resourceQuotaObject.allocated,
-            })
-            .toString()
-        );
+        this.notificationStore.postNotification({
+          title: this.$t(
+            "page.quota.resourceQuotaChangedSuccessTitle"
+          ).toString(),
+          body: this.$t("page.quota.resourceQuotaChangedSuccessBody", {
+            ResourceName: resourceQuotaObject.name,
+            AmountInGB: resourceQuotaObject.allocated,
+          }).toString(),
+        });
       } catch {
-        this.makeToast(
-          this.$parent
-            .$t("page.quota.resourceQuotaChangedFailureTitle")
-            .toString(),
-          this.$parent
-            .$t("page.quota.resourceQuotaChangedFailureBody")
-            .toString(),
-          true
-        );
-      } finally {
-        this.storingQuota = false;
-      }
-    },
-    makeToast(givenTitle = "Title", text = "Message", error = false) {
-      if (error) {
-        this.$root.$bvToast.toast(text, {
-          title: givenTitle,
-          noAutoHide: true,
+        this.notificationStore.postNotification({
+          title: this.$t(
+            "page.quota.resourceQuotaChangedFailureTitle"
+          ).toString(),
+          body: this.$t(
+            "page.quota.resourceQuotaChangedFailureBody"
+          ).toString(),
           variant: "warning",
-          toaster: "b-toaster-bottom-right",
-        });
-      } else {
-        this.$root.$bvToast.toast(text, {
-          title: givenTitle,
-          toaster: "b-toaster-bottom-right",
-          noCloseButton: true,
         });
+      } finally {
+        this.storingQuota = false;
       }
     },
     selectFirstResourceType() {
diff --git a/src/modules/project/pages/Settings.vue b/src/modules/project/pages/Settings.vue
index a9fd4a1f15911bc5ab89b6237aa9ae37d33a3d5d..a6923f79f8987f63f595e18e663f88c8dea12788 100644
--- a/src/modules/project/pages/Settings.vue
+++ b/src/modules/project/pages/Settings.vue
@@ -8,7 +8,7 @@
           <FormNaming
             v-model="projectForm"
             :disabled="!isOwner"
-            :isLoading="isLoading"
+            :is-loading="isLoading"
             @validation="formValidations.naming = $event"
           />
 
@@ -17,9 +17,9 @@
           <FormMetadata
             v-model="projectForm"
             :disabled="!isOwner"
-            :isLoading="isLoading"
-            :currentProject="project"
-            :parentProject="parentProject"
+            :is-loading="isLoading"
+            :current-project="project"
+            :parent-project="parentProject"
             @validation="formValidations.metadata = $event"
           />
 
@@ -29,7 +29,6 @@
               type="submit"
               variant="primary"
               class="float-right"
-              @click.prevent="clickSave"
               :disabled="
                 formValidations.naming.$invalid ||
                 formValidations.metadata.$invalid ||
@@ -37,6 +36,7 @@
                   !formValidations.metadata.$anyDirty) ||
                 isWaitingForResponse
               "
+              @click.prevent="clickSave"
             >
               {{ $t("buttons.submit") }}</b-button
             >
@@ -57,12 +57,12 @@
         <DeleteProjectModal
           v-if="project"
           :open="isDeleteModalVisible"
-          :displayName="project.displayName"
+          :display-name="project.displayName"
           @close="isDeleteModalVisible = false"
           @clickDelete="clickDelete"
         />
 
-        <LoadingSpinner :isWaitingForResponse="isWaitingForResponse" />
+        <LoadingSpinner :is-waiting-for-response="isWaitingForResponse" />
       </div>
       <div class="col-sm-2" />
     </b-row>
@@ -90,20 +90,21 @@ import type {
   VisibilityObject,
 } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 import { navigateToProject } from "@/router";
+import useNotificationStore from "@/store/notification";
 
 export default defineComponent({
-  setup() {
-    const mainStore = useMainStore();
-    const projectStore = useProjectStore();
-
-    return { mainStore, projectStore };
-  },
-
   components: {
     FormNaming,
     FormMetadata,
     DeleteProjectModal,
   },
+  setup() {
+    const mainStore = useMainStore();
+    const projectStore = useProjectStore();
+    const notificationStore = useNotificationStore();
+
+    return { mainStore, projectStore, notificationStore };
+  },
 
   data() {
     return {
@@ -190,20 +191,6 @@ export default defineComponent({
       }
     },
 
-    makeToast(
-      text = "Message",
-      givenTitle = "Title",
-      variant: string | undefined = undefined
-    ) {
-      this.$root.$bvToast.toast(text, {
-        title: givenTitle,
-        autoHideDelay: 5000,
-        toaster: "b-toaster-bottom-right",
-        variant: variant,
-        noCloseButton: true,
-      });
-    },
-
     async clickDelete() {
       this.isDeleteModalVisible = false;
       if (this.project) {
@@ -216,18 +203,18 @@ export default defineComponent({
           // Refresh the project information in the store
           await this.projectStore.refreshProjectInformation(parentProject);
           // Replace the current location with parent project or project list
-          this.makeToast(
-            this.$t("toast.onDelete.success.message").toString(),
-            this.$t("toast.onDelete.success.title").toString()
-          );
+          this.notificationStore.postNotification({
+            title: this.$t("toast.onDelete.success.title").toString(),
+            body: this.$t("toast.onDelete.success.message").toString(),
+          });
           navigateToProject(parentProject);
         } else {
           // On Failure
-          this.makeToast(
-            this.$t("toast.onDelete.failure.message").toString(),
-            this.$t("toast.onDelete.failure.title").toString(),
-            "danger"
-          );
+          this.notificationStore.postNotification({
+            title: this.$t("toast.onDelete.failure.title").toString(),
+            body: this.$t("toast.onDelete.failure.message").toString(),
+            variant: "danger",
+          });
         }
       }
     },
@@ -255,17 +242,17 @@ export default defineComponent({
         this.formValidations.metadata.$reset();
         // Refresh the project information in the store
         await this.projectStore.refreshProjectInformation(this.project);
-        this.makeToast(
-          this.$t("toast.onSave.success.message").toString(),
-          this.$t("toast.onSave.success.title").toString()
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("toast.onSave.success.title").toString(),
+          body: this.$t("toast.onSave.success.message").toString(),
+        });
       } else {
         // On Failure
-        this.makeToast(
-          this.$t("toast.onSave.failure.message").toString(),
-          this.$t("toast.onSave.failure.title").toString(),
-          "danger"
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("toast.onSave.failure.title").toString(),
+          body: this.$t("toast.onSave.failure.message").toString(),
+          variant: "danger",
+        });
       }
     },
   },
diff --git a/src/modules/project/pages/components/FormMetadata.vue b/src/modules/project/pages/components/FormMetadata.vue
index af92c2fc22390a1038fced1c16a33440d5a9e1e3..0539b2f3ced6c3e40832d3d4ef93bca1bf2e8805 100644
--- a/src/modules/project/pages/components/FormMetadata.vue
+++ b/src/modules/project/pages/components/FormMetadata.vue
@@ -7,22 +7,22 @@
     <coscine-form-group
       v-if="parentProject"
       :mandatory="false"
-      labelFor="CopyData"
+      label-for="CopyData"
       :label="
         $t('form.project.copyMetadataLabel', {
           project: parentProject.projectName,
         })
       "
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="button"
       class="d-flex align-items-center"
     >
       <b-button
-        variant="secondary"
         id="project_copy_button"
+        variant="secondary"
         size="sm"
-        @click.prevent="copyMetadataFromParent"
         :disabled="disabled"
+        @click.prevent="copyMetadataFromParent"
       >
         {{ $t("buttons.copyMetadata") }}</b-button
       >
@@ -31,9 +31,9 @@
     <!-- Principal Investigators -->
     <coscine-form-group
       :mandatory="true"
-      labelFor="PrincipleInvestigators"
+      label-for="PrincipleInvestigators"
       :label="$t('form.project.projectPrincipleInvestigatorsLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <b-form-input
@@ -65,9 +65,9 @@
     <!-- Project Start -->
     <coscine-form-group
       :mandatory="true"
-      labelFor="StartDate"
+      label-for="StartDate"
       :label="$t('form.project.projectStartLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <b-form-datepicker
@@ -90,9 +90,9 @@
     <!-- Project End -->
     <coscine-form-group
       :mandatory="true"
-      labelFor="EndDate"
+      label-for="EndDate"
       :label="$t('form.project.projectEndLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <b-form-datepicker
@@ -114,9 +114,9 @@
     <!-- Discipline -->
     <coscine-form-group
       :mandatory="true"
-      labelFor="Discipline"
+      label-for="Discipline"
       :label="$t('form.project.projectDisciplineLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <multiselect
@@ -146,9 +146,9 @@
     <!-- Participating Organizations -->
     <coscine-form-group
       :mandatory="true"
-      labelFor="Organization"
+      label-for="Organization"
       :label="$t('form.project.projectOrganizationLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <multiselect
@@ -185,9 +185,9 @@
 
     <!-- Project Keywords -->
     <coscine-form-group
-      labelFor="Keywords"
+      label-for="Keywords"
       :label="$t('form.project.projectKeywordsLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <multiselect
@@ -223,28 +223,28 @@
     <!-- Visibility -->
     <coscine-form-group
       :mandatory="true"
-      labelFor="Visibility"
+      label-for="Visibility"
       :label="$t('form.project.projectMetadataVisibilityLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <b-form-radio-group
-        name="radios-stacked"
         v-model="selectedVisibility"
-        @change="setVisibility(selectedVisibility)"
+        name="radios-stacked"
         :options="visibilities"
         text-field="displayName"
         value-field="id"
         stacked
         :disabled="disabled"
+        @change="setVisibility(selectedVisibility)"
       />
     </coscine-form-group>
 
     <!-- Grant ID -->
     <coscine-form-group
-      labelFor="GrantId"
+      label-for="GrantId"
       :label="$t('form.project.projectGrantIdLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <b-form-input
@@ -289,24 +289,20 @@ import useProjectStore from "../../store";
 import useMainStore from "@/store/index";
 
 export default defineComponent({
-  setup() {
-    const mainStore = useMainStore();
-    const projectStore = useProjectStore();
-
-    return { mainStore, projectStore };
-  },
-
+  mixins: [validationMixin],
   props: {
     value: {
       type: Object as PropType<ProjectObject>,
       required: true,
     },
     currentProject: {
-      type: Object as PropType<ProjectObject>,
+      default: null,
+      type: [Object, null] as PropType<ProjectObject | null>,
       required: false,
     },
     parentProject: {
-      type: Object as PropType<ProjectObject>,
+      default: null,
+      type: [Object, null] as PropType<ProjectObject | null>,
       required: false,
     },
     disabled: {
@@ -318,8 +314,18 @@ export default defineComponent({
       type: Boolean,
     },
   },
+  emits: {
+    validation: (input: Validation) => {
+      return input ? true : false;
+    },
+  },
 
-  mixins: [validationMixin],
+  setup() {
+    const mainStore = useMainStore();
+    const projectStore = useProjectStore();
+
+    return { mainStore, projectStore };
+  },
 
   validations: {
     projectForm: {
@@ -351,10 +357,6 @@ export default defineComponent({
     },
   },
 
-  created() {
-    this.onProjectLoaded();
-  },
-
   data() {
     return {
       projectForm: this.value,
@@ -385,12 +387,6 @@ export default defineComponent({
     },
   },
 
-  emits: {
-    validation: (input: Validation) => {
-      return input ? true : false;
-    },
-  },
-
   watch: {
     currentProject() {
       this.onProjectLoaded();
@@ -432,6 +428,10 @@ export default defineComponent({
     },
   },
 
+  created() {
+    this.onProjectLoaded();
+  },
+
   methods: {
     onProjectLoaded() {
       if (this.currentProject) {
diff --git a/src/modules/project/pages/components/FormNaming.vue b/src/modules/project/pages/components/FormNaming.vue
index e2be4519bdb0f1fe21f6473ffdb35f21b264de7a..22a3e93b2acd1e14e79670c497ea92f5d19ffad9 100644
--- a/src/modules/project/pages/components/FormNaming.vue
+++ b/src/modules/project/pages/components/FormNaming.vue
@@ -3,15 +3,14 @@
     <!-- Project Name -->
     <CoscineFormGroup
       :mandatory="true"
-      labelFor="ProjectName"
+      label-for="ProjectName"
       :label="$t('form.project.projectNameLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <b-form-input
         id="ProjectName"
         v-model="$v.projectForm.projectName.$model"
-        @input="translateProjectNameToDisplayName"
         :state="
           $v.projectForm.projectName.$dirty
             ? !$v.projectForm.projectName.$error
@@ -21,6 +20,7 @@
         :maxlength="maxLengthFromValidation($v.projectForm.projectName)"
         required
         :disabled="disabled"
+        @input="translateProjectNameToDisplayName"
       />
       <div class="invalid-tooltip">
         {{
@@ -34,15 +34,14 @@
     <!-- Display Name -->
     <CoscineFormGroup
       :mandatory="true"
-      labelFor="DisplayName"
+      label-for="DisplayName"
       :label="$t('form.project.displayNameLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <b-form-input
         id="DisplayName"
         v-model="$v.projectForm.displayName.$model"
-        @input="isLockedDisplayName = true"
         :state="
           $v.projectForm.displayName.$dirty
             ? !$v.projectForm.displayName.$error
@@ -52,6 +51,7 @@
         :maxlength="maxLengthFromValidation($v.projectForm.displayName)"
         required
         :disabled="disabled"
+        @input="isLockedDisplayName = true"
       />
       <div class="invalid-tooltip">
         {{
@@ -65,9 +65,9 @@
     <!-- Project Description -->
     <CoscineFormGroup
       :mandatory="true"
-      labelFor="Description"
+      label-for="Description"
       :label="$t('form.project.projectDescriptionLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       type="input"
     >
       <b-form-textarea
@@ -103,6 +103,27 @@ import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.P
 export default defineComponent({
   mixins: [validationMixin],
 
+  props: {
+    value: {
+      type: Object as PropType<ProjectObject>,
+      required: true,
+    },
+    disabled: {
+      default: false,
+      type: Boolean,
+    },
+    isLoading: {
+      default: false,
+      type: Boolean,
+    },
+  },
+
+  emits: {
+    validation: (input: Validation) => {
+      return input ? true : false;
+    },
+  },
+
   validations: {
     projectForm: {
       projectName: {
@@ -127,27 +148,6 @@ export default defineComponent({
     };
   },
 
-  props: {
-    value: {
-      type: Object as PropType<ProjectObject>,
-      required: true,
-    },
-    disabled: {
-      default: false,
-      type: Boolean,
-    },
-    isLoading: {
-      default: false,
-      type: Boolean,
-    },
-  },
-
-  emits: {
-    validation: (input: Validation) => {
-      return input ? true : false;
-    },
-  },
-
   watch: {
     projectForm: {
       handler() {
diff --git a/src/modules/project/pages/components/MembersList.vue b/src/modules/project/pages/components/MembersList.vue
index 540f88afbc6ec61b94c7fa7dd4530dbb8aeeeb65..1ed91e6763b83bd029ab6fda2bd1f8b8e99c30f8 100644
--- a/src/modules/project/pages/components/MembersList.vue
+++ b/src/modules/project/pages/components/MembersList.vue
@@ -2,6 +2,9 @@
   <div>
     <CoscineHeadline :headline="$tc('page.project.member', 2)" />
     <!-- Members -->
+    <b-row v-if="!projectRoles" align-h="center" class="my-4">
+      <b-spinner variant="secondary" />
+    </b-row>
     <div class="list">
       <div class="user-complete-name-list container-fluid">
         <span v-for="(projectRole, index) in projectRoles" :key="index">
@@ -11,10 +14,16 @@
 
             <!-- Member Details -->
             <b-col class="user-details">
+              <!-- Member Display Name -->
               {{ projectRole.user.displayName }}
               <br />
+              <!-- Member Email -->
               <a
-                v-b-tooltip.hover.bottom="projectRole.user.emailAddress"
+                v-b-tooltip.hover.bottom="{
+                  title: projectRole.user.emailAddress,
+                  boundary: 'viewport',
+                }"
+                class="text-secondary"
                 :href="'mailto:' + projectRole.user.emailAddress"
               >
                 {{ projectRole.user.emailAddress }}
@@ -22,24 +31,28 @@
             </b-col>
 
             <!-- Leave Button -->
-            <b-button
-              id="leave"
-              class="float-right"
-              variant="primary"
-              name="leave"
-              size="sm"
-              v-if="projectRole.user.id === currentUser.id"
-              v-on:click="leaveModal = true"
-              :disabled="ownerCount < 2 && isOwner"
-              tabindex="0"
-              v-b-tooltip.hover.bottom
-              :title="
-                ownerCount < 2 && isOwner
-                  ? $t('page.project.members.tooltipDisabled')
-                  : $t('page.project.members.tooltip')
-              "
-              >{{ $t("buttons.leave") }}</b-button
+            <span
+              v-b-tooltip.hover.left="{
+                title:
+                  ownerCount < 2 && isOwner
+                    ? $t('page.project.members.tooltipDisabled')
+                    : $t('page.project.members.tooltip'),
+                boundary: 'viewport',
+              }"
             >
+              <b-button
+                v-if="projectRole.user.id === currentUser.id"
+                class="float-right"
+                variant="primary"
+                name="leave"
+                size="sm"
+                :disabled="ownerCount < 2 && isOwner"
+                tabindex="0"
+                @click="leaveModal = true"
+              >
+                {{ $t("buttons.leave") }}
+              </b-button>
+            </span>
           </b-row>
         </span>
       </div>
@@ -73,11 +86,11 @@
 
         <!-- Leave Modal Buttons -->
         <b-button
+          ref="modalLeaveProjectCancel"
           class="float-right"
           variant="primary"
-          @click="leaveModal = false"
-          ref="modalLeaveProjectCancel"
           autofocus
+          @click="leaveModal = false"
           >{{ $t("buttons.cancel") }}</b-button
         >
         <b-button class="float-Left" variant="danger" @click="leaveProject">{{
diff --git a/src/modules/project/pages/components/MembersTable.vue b/src/modules/project/pages/components/MembersTable.vue
index 29d748c6a610bd95f52b483f754afed10efaa3e3..76a96a7d1ca2bdb38aed4630b562e0e2c2a657ac 100644
--- a/src/modules/project/pages/components/MembersTable.vue
+++ b/src/modules/project/pages/components/MembersTable.vue
@@ -31,16 +31,16 @@
 
       <!-- Project Members - Role Column -->
       <template #cell(role)="row">
-        <div class="noOverflow" v-if="row.item.role">
+        <div v-if="row.item.role" class="noOverflow">
           <b-form-select
             v-model="row.item.role.id"
             :options="roles"
-            @change="role(row.item)"
             :disabled="
               ownerCount === 1 && ownerRole && row.item.role.id === ownerRole.id
             "
             text-field="displayName"
             value-field="id"
+            @change="role(row.item)"
           />
         </div>
       </template>
@@ -54,10 +54,10 @@
 
       <!-- Project Members - Actions Column -->
       <template #cell(memberActions)="row">
-        <div class="noOverflow" v-if="row.item.role">
+        <div v-if="row.item.role" class="noOverflow">
           <!-- Remove Member -->
           <b-button
-            :btnText="removeText"
+            :btn-text="removeText"
             variant="danger"
             size="sm"
             :disabled="
@@ -88,7 +88,7 @@
             class="leftActionBtn"
             size="sm"
             variant="danger"
-            :btnText="deleteText"
+            :btn-text="deleteText"
             @click="revokeInvitation(selectedInvitation.item)"
             >{{ deleteText }}</b-button
           >
@@ -97,8 +97,8 @@
           <b-button
             class="rightActionBtn"
             size="sm"
-            @click="resendInvitation(selectedInvitation.item)"
             :disabled="!checkExpiration(selectedInvitation.item.expiration)"
+            @click="resendInvitation(selectedInvitation.item)"
             >{{ $t("buttons.resend") }}
           </b-button>
         </div>
@@ -118,18 +118,13 @@ import type {
 
 export default defineComponent({
   name: "MembersTable",
-  data() {
-    return {
-      sortDesc: false,
-      filteredRows: 0,
-    };
-  },
   props: {
     headers: {
       required: true,
       type: Array,
     },
     id: {
+      default: "membersTable",
       type: String,
     },
     items: {
@@ -137,17 +132,19 @@ export default defineComponent({
       type: Array,
     },
     filter: {
-      type: String,
       default: "",
+      type: String,
     },
     busy: {
       type: Boolean,
       default: false,
     },
     emptyText: {
+      default: "Empty",
       type: String,
     },
     emptyFilteredText: {
+      default: "Empty",
       type: String,
     },
     ownerCount: {
@@ -159,12 +156,15 @@ export default defineComponent({
       default: null,
     },
     deleteText: {
+      default: "Delete",
       type: String,
     },
     removeText: {
+      default: "Remove",
       type: String,
     },
     roles: {
+      default: null,
       type: [Array, null] as PropType<RoleObject[] | null>,
     },
     sortBy: {
@@ -172,6 +172,12 @@ export default defineComponent({
       type: String,
     },
   },
+  data() {
+    return {
+      sortDesc: false,
+      filteredRows: 0,
+    };
+  },
   methods: {
     onFiltered(filteredItems: ProjectRoleObject[]) {
       this.filteredRows = filteredItems.length;
diff --git a/src/modules/project/pages/components/UserSearchRow.vue b/src/modules/project/pages/components/UserSearchRow.vue
index 180d78e32b52416b2ee15acb97a4e3e5d783604b..cef3bbf3183518e8eb51aea2ad0ec36076c2a0bb 100644
--- a/src/modules/project/pages/components/UserSearchRow.vue
+++ b/src/modules/project/pages/components/UserSearchRow.vue
@@ -4,7 +4,7 @@
       <div class="adaptAlign">
         <b-row>
           <!-- Invitation Search Field -->
-          <b-col sm="5" @keydown.enter.prevent.self="" id="firstCol">
+          <b-col id="firstCol" sm="5" @keydown.enter.prevent.self="">
             <v-select
               v-model="selectedAddingUser"
               :placeholder="$t('page.members.searchUserPlaceholder')"
@@ -13,11 +13,11 @@
                 'no-results': queriedUsers.length === 0,
               }"
               :options="queriedUsers"
-              :filterBy="filterMock"
-              @input="setNewUser"
-              @search="triggerFetchOptions"
+              :filter-by="filterMock"
               :selectable="(option) => !option.hasProjectRole"
               label="displayName"
+              @input="setNewUser"
+              @search="triggerFetchOptions"
             >
               <template v-if="searchString === ''" slot="no-options">
                 {{ $t("page.members.pleaseTypeSomething") }}
@@ -57,7 +57,7 @@
           </b-col>
 
           <!-- Role Drop-Down -->
-          <b-col sm="2" id="secondCol">
+          <b-col id="secondCol" sm="2">
             <b-form-select
               :options="roles"
               :value="
@@ -67,29 +67,29 @@
                   ? memberRole.id
                   : null
               "
-              @input="setNewRole"
               text-field="displayName"
               value-field="id"
+              @input="setNewRole"
             >
             </b-form-select>
           </b-col>
 
           <!-- Buttons -->
-          <b-col sm="5" id="thirdCol">
+          <b-col id="thirdCol" sm="5">
             <!-- Add User -->
             <b-button
               v-if="validInvitation && !validSelection"
               name="inviteUserToProject"
-              @click="prepareInvitation(newUserRole)"
               :disabled="!validInvitation"
+              @click="prepareInvitation(newUserRole)"
               >{{ $t("buttons.invite") }}</b-button
             >
             <!-- Import -->
             <b-button
               v-else
               name="addUserToProject"
-              @click="addUser(newUserRole)"
               :disabled="!validSelection"
+              @click="addUser(newUserRole)"
               >{{ $t("buttons.addUser") }}</b-button
             >
             <b-button
@@ -104,17 +104,17 @@
 
     <!-- Members Search Field -->
     <b-col
+      id="fourthCol"
       sm="3"
       align-self="end"
       @keydown.enter.prevent.self=""
-      id="fourthCol"
     >
       <b-input-group>
         <b-form-input
-          type="search"
           id="filterInput"
-          @input="setFilter"
+          type="search"
           :placeholder="$t('page.members.typeToSearch')"
+          @input="setFilter"
         ></b-form-input>
       </b-input-group>
     </b-col>
@@ -128,7 +128,7 @@ import { defineComponent, PropType } from "vue-demi";
 import vSelect from "vue-select";
 import "vue-select/dist/vue-select.css";
 
-Vue.component("v-select", vSelect);
+Vue.component("VSelect", vSelect);
 
 import useUserStore from "@/modules/user/store";
 
@@ -140,6 +140,22 @@ import type {
 import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
 
 export default defineComponent({
+  props: {
+    memberRole: {
+      default: null,
+      type: [Object, null, undefined] as PropType<
+        RoleObject | null | undefined
+      >,
+    },
+    project: {
+      default: null,
+      type: [Object, null] as PropType<ProjectObject | null>,
+    },
+    roles: {
+      default: null,
+      type: [Array, null] as PropType<RoleObject[] | null>,
+    },
+  },
   setup() {
     const userStore = useUserStore();
 
@@ -154,19 +170,6 @@ export default defineComponent({
       selectedAddingUser: null as UserObject | null,
     };
   },
-  props: {
-    memberRole: {
-      type: [Object, null, undefined] as PropType<
-        RoleObject | null | undefined
-      >,
-    },
-    project: {
-      type: [Object, null] as PropType<ProjectObject | null>,
-    },
-    roles: {
-      type: [Array, null] as PropType<RoleObject[] | null>,
-    },
-  },
   computed: {
     validEmail(): boolean {
       const emailRegex =
@@ -263,7 +266,7 @@ export default defineComponent({
     async fetchUserOptions(search: string, loading: (value: boolean) => void) {
       if (search && this.project && this.project.id) {
         loading(true);
-        this.queriedUsers = await this.userStore.queryUser(
+        this.queriedUsers = await this.userStore.getUser(
           search,
           this.project.id
         );
diff --git a/src/modules/project/pages/components/modals/DeleteProjectModal.vue b/src/modules/project/pages/components/modals/DeleteProjectModal.vue
index e5963bb0fd315806629a84ae678812f2d4de2f92..b972dc0ce1985a0b7829059e9fc19ae9889d7998 100644
--- a/src/modules/project/pages/components/modals/DeleteProjectModal.vue
+++ b/src/modules/project/pages/components/modals/DeleteProjectModal.vue
@@ -3,9 +3,9 @@
   <b-modal
     id="deleteProjectModal"
     v-model="isOpen"
+    :hide-footer="true"
     @close="close"
     @hidden="hidden"
-    :hide-footer="true"
   >
     <!-- Title -->
     <template #modal-title>
@@ -36,18 +36,16 @@
       </div>
     </b-form-group>
 
-    <template>
-      <!-- Modal Cancel Button -->
-      <b-button @click="close">{{ $t("buttons.cancel") }}</b-button>
-      <!-- Modal Delete Button -->
-      <b-button
-        @click="clickDelete"
-        variant="danger"
-        class="float-right"
-        :disabled="!nameValid"
-        >{{ $t("buttons.delete") }}</b-button
-      >
-    </template>
+    <!-- Modal Cancel Button -->
+    <b-button @click="close">{{ $t("buttons.cancel") }}</b-button>
+    <!-- Modal Delete Button -->
+    <b-button
+      variant="danger"
+      class="float-right"
+      :disabled="!nameValid"
+      @click="clickDelete"
+      >{{ $t("buttons.delete") }}</b-button
+    >
   </b-modal>
 </template>
 
@@ -75,6 +73,11 @@ export default defineComponent({
     },
   },
 
+  emits: {
+    clickDelete: null,
+    close: null,
+  },
+
   data() {
     return {
       isOpen: false,
@@ -111,11 +114,6 @@ export default defineComponent({
       }
     },
   },
-
-  emits: {
-    clickDelete: null,
-    close: null,
-  },
 });
 </script>
 
diff --git a/src/modules/project/pages/components/modals/ImportUserModal.vue b/src/modules/project/pages/components/modals/ImportUserModal.vue
index 148ab409092bf2b7d8d64dacbf3890ba39c74326..b29c55fd6a01a1eb1014886fc1523cfb43aa6358 100644
--- a/src/modules/project/pages/components/modals/ImportUserModal.vue
+++ b/src/modules/project/pages/components/modals/ImportUserModal.vue
@@ -2,9 +2,9 @@
   <b-modal
     id="importUserModal"
     :title="$t('page.members.importUserTitle')"
-    @hidden="resetModal"
     size="lg"
     hide-footer
+    @hidden="resetModal"
   >
     <!-- Select Project Drop-Down -->
     <b-row>
@@ -16,11 +16,11 @@
             }}</b-form-select-option>
           </template>
           <b-form-select-option
-            v-for="project in additionalProjects"
-            :value="project.id"
-            :key="project.id"
+            v-for="additionalProject in additionalProjects"
+            :key="additionalProject.id"
+            :value="additionalProject.id"
           >
-            {{ project.projectName }}
+            {{ additionalProject.projectName }}
           </b-form-select-option>
         </b-form-select>
       </b-col>
@@ -37,9 +37,9 @@
             :headers="memberHeaders"
             :items="additionalMembers"
             :roles="roles"
-            :emptyText="$t('page.members.emptyImportTableText')"
-            :emptyFilteredText="$t('page.members.emptyImportTableFilterText')"
-            :removeText="$t('page.members.removeUser')"
+            :empty-text="$t('page.members.emptyImportTableText')"
+            :empty-filtered-text="$t('page.members.emptyImportTableFilterText')"
+            :remove-text="$t('page.members.removeUser')"
             @selectedItem="removeSelectedRow"
           />
         </div>
@@ -54,8 +54,8 @@
           <!-- Import -->
           <b-button
             name="importUsers"
-            @click="importUser"
             :disabled="additionalMembers.length === 0"
+            @click="importUser"
             >{{ $t("buttons.import") }}</b-button
           >
         </div>
@@ -81,41 +81,45 @@ import type {
 } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 
 export default defineComponent({
-  setup() {
-    const projectStore = useProjectStore();
-
-    return { projectStore };
-  },
   components: {
     MembersTable,
   },
-  data() {
-    return {
-      additionalMembers: [] as ProjectRoleObject[],
-      isBusy: false,
-      selectedProject: null as string | null,
-    };
-  },
   props: {
     memberHeaders: {
       required: true,
       type: Array,
     },
     memberRole: {
+      default: null,
       type: [Object, null, undefined] as PropType<
         RoleObject | null | undefined
       >,
     },
     project: {
+      default: null,
       type: [Object, null] as PropType<ProjectObject | null>,
     },
     projectRoles: {
+      default: null,
       type: [Array, null] as PropType<ProjectRole[] | null>,
     },
     roles: {
+      default: null,
       type: [Array, null] as PropType<RoleObject[] | null>,
     },
   },
+  setup() {
+    const projectStore = useProjectStore();
+
+    return { projectStore };
+  },
+  data() {
+    return {
+      additionalMembers: [] as ProjectRoleObject[],
+      isBusy: false,
+      selectedProject: null as string | null,
+    };
+  },
   computed: {
     additionalProjects(): ProjectObject[] | null {
       if (this.projects && this.project) {
diff --git a/src/modules/project/pages/components/modals/InviteUserModal.vue b/src/modules/project/pages/components/modals/InviteUserModal.vue
index 0854a6a00d04e0cecbd3bc7742dd19eb8e2516fc..6368dac6f28037be25ff6c76f701a60a465526a7 100644
--- a/src/modules/project/pages/components/modals/InviteUserModal.vue
+++ b/src/modules/project/pages/components/modals/InviteUserModal.vue
@@ -67,9 +67,11 @@ export default defineComponent({
       type: Object as PropType<ExtendedSendInvitationObject>,
     },
     projectName: {
+      default: "",
       type: String,
     },
     roles: {
+      default: null,
       type: [Array, null] as PropType<RoleObject[] | null>,
     },
   },
@@ -86,20 +88,16 @@ export default defineComponent({
       }
     },
     inviteUser() {
-      const text = this.$parent
-        .$t("page.members.invitedUserText", {
-          email: this.candidateForInvitation.email,
-          role: this.candidateForInvitation.role
-            ? this.getRoleNameFromId(this.candidateForInvitation.role)
-            : "",
-          projectName: this.projectName,
-        })
-        .toString();
-      const errorText = this.$parent
-        .$t("page.members.invitedUserError", {
-          email: this.candidateForInvitation.email,
-        })
-        .toString();
+      const text = this.$t("page.members.invitedUserText", {
+        email: this.candidateForInvitation.email,
+        role: this.candidateForInvitation.role
+          ? this.getRoleNameFromId(this.candidateForInvitation.role)
+          : "",
+        projectName: this.projectName,
+      }).toString();
+      const errorText = this.$t("page.members.invitedUserError", {
+        email: this.candidateForInvitation.email,
+      }).toString();
       this.$emit(
         "storeNewInvitation",
         this.candidateForInvitation,
diff --git a/src/modules/project/store.ts b/src/modules/project/store.ts
index 78d963ef0556f2c60ecd4f6a0a054ea75712b353..919bcbeec940faa16fc35517f277ae178d13dfd2 100644
--- a/src/modules/project/store.ts
+++ b/src/modules/project/store.ts
@@ -1,6 +1,5 @@
 import { defineStore } from "pinia";
 import { ProjectState, VisitedProjectObject } from "./types";
-import { StatusCodes } from "http-status-codes";
 import { reactive } from "vue-demi";
 import { removeQueryParameterFromUrl } from "@/router";
 import { defaultOrganizations } from "./data/defaultOrganizations";
@@ -35,7 +34,9 @@ import type {
 import type { Route } from "vue-router";
 import { updatedDiff } from "deep-object-diff";
 
+import useNotificationStore from "@/store/notification";
 import useUserStore from "../user/store";
+import type { AxiosError } from "axios";
 
 /*  
   Store variable name is "this.<id>Store"
@@ -199,84 +200,98 @@ export const useProjectStore = defineStore({
   */
   actions: {
     async retrieveAllProjects() {
-      const apiResponse = await ProjectApi.projectIndex();
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await ProjectApi.projectIndex();
         this.allProjects = apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveTopLevelProjects() {
-      const apiResponse = await ProjectApi.projectGetTopLevelProjects();
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await ProjectApi.projectGetTopLevelProjects();
         this.topLevelProjects = apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveProjectBySlug(slug: string) {
-      const apiResponse = await ProjectApi.projectGetBySlug(slug);
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await ProjectApi.projectGetBySlug(slug);
         const project: ProjectObject = apiResponse.data;
         this.addProjectAsVisited(project);
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveInvitations(project: ProjectObject | null) {
-      if (project && project.id && project.slug) {
-        const apiResponse = await ProjectApi.projectListInvitations(project.id);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project && project.id && project.slug) {
+          const apiResponse = await ProjectApi.projectListInvitations(
+            project.id
+          );
           this.visitedProjects[project.slug].invitations = apiResponse.data;
         } else {
-          // Handle other Status Codes
+          console.error("Selected project is null or its ID is undefined.");
         }
-      } else {
-        console.error("Selected project is null or its ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveSubProjects(project: ProjectObject | null) {
-      if (project && project.id && project.slug) {
-        const apiResponse = await SubProjectApi.subProjectGet(project.id);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project && project.id && project.slug) {
+          const apiResponse = await SubProjectApi.subProjectGet(project.id);
           this.visitedProjects[project.slug].subProjects = apiResponse.data;
         } else {
-          // Handle other Status Codes
+          console.error("Selected project is null or its ID is undefined.");
         }
-      } else {
-        console.error("Selected project is null or its ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveResources(project: ProjectObject | null) {
-      if (project && project.id && project.slug) {
-        const apiResponse = await ProjectApi.projectGetResources(project.id);
-        if (apiResponse.status === StatusCodes.OK) {
-          this.visitedProjects[project.slug].resources = reactive(
-            apiResponse.data
-          );
+      const notificationStore = useNotificationStore();
+      try {
+        if (project && project.id && project.slug) {
+          const apiResponse = await ProjectApi.projectGetResources(project.id);
+          this.visitedProjects[project.slug].resources = apiResponse.data;
         } else {
-          // Handle other Status Codes
+          console.error("Selected project is null or its ID is undefined.");
         }
-      } else {
-        console.error("Selected project is null or its ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveQuotas(project: ProjectObject | null) {
-      if (project && project.id && project.slug) {
-        const apiResponse = await ProjectApi.projectQuotas(project.id);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project && project.id && project.slug) {
+          const apiResponse = await ProjectApi.projectQuotas(project.id);
           this.visitedProjects[project.slug].quotas = apiResponse.data;
         } else {
-          // Handle other Status Codes
+          console.error("Selected project is null or its ID is undefined.");
         }
-      } else {
-        console.error("Selected project is null or its ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
@@ -285,8 +300,22 @@ export const useProjectStore = defineStore({
       resourceType: ResourceTypeInformation,
       quota: UpdateProjectQuotaObject
     ) {
-      if (project.id && resourceType.id) {
-        await ProjectApi.projectUpdateQuota(project.id, resourceType.id, quota);
+      const notificationStore = useNotificationStore();
+      try {
+        if (project.id && resourceType.id) {
+          await ProjectApi.projectUpdateQuota(
+            project.id,
+            resourceType.id,
+            quota
+          );
+        } else {
+          console.error(
+            "Selected project's or the selected resource type's ID is undefined."
+          );
+        }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
@@ -294,38 +323,44 @@ export const useProjectStore = defineStore({
       project: ProjectObject,
       resourceType: ResourceTypeInformation
     ): Promise<ResourceQuota[] | undefined> {
-      if (project.id && resourceType.id) {
-        const apiResponse = await QuotaApi.quotaGetResourceQuotas(
-          project.id,
-          resourceType.id
-        );
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project.id && resourceType.id) {
+          const apiResponse = await QuotaApi.quotaGetResourceQuotas(
+            project.id,
+            resourceType.id
+          );
           return apiResponse.data;
         } else {
-          // Handle other Status Codes
+          console.error(
+            "Selected project's or resource types' ID is undefined."
+          );
         }
-      } else {
-        console.error("Selected project's or resource types' ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
-
-    // ToDo: Consider removing if unused in coscine/issues#2003
     async getResourceTypeQuota(
       project: ProjectObject,
       resourceType: ResourceTypeInformation
     ): Promise<ProjectQuotaReturnObject | undefined> {
-      if (project.id && resourceType.id) {
-        const apiResponse = await ProjectApi.projectQuota(
-          project.id,
-          resourceType.id
-        );
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project.id && resourceType.id) {
+          const apiResponse = await ProjectApi.projectQuota(
+            project.id,
+            resourceType.id
+          );
           return apiResponse.data;
         } else {
-          // Handle other Status Codes
+          console.error(
+            "Selected project's or resource types' ID is undefined."
+          );
         }
-      } else {
-        console.error("Selected project's or resource types' ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
@@ -333,97 +368,125 @@ export const useProjectStore = defineStore({
       resourceQuotaObject: ResourceQuota,
       quota: UpdateResourceObject
     ) {
-      if (resourceQuotaObject.id) {
-        await QuotaApi.quotaUpdateResourceQuota(resourceQuotaObject.id, quota);
+      const notificationStore = useNotificationStore();
+      try {
+        if (resourceQuotaObject.id) {
+          await QuotaApi.quotaUpdateResourceQuota(
+            resourceQuotaObject.id,
+            quota
+          );
+        } else {
+          console.error("Selected resource quota is undefined.");
+        }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveOrganizationByURL(
       url: string
     ): Promise<OrganizationObject[] | null> {
-      const apiResponse = await OrganizationApi.organizationGetOrganization(
-        url
-      );
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await OrganizationApi.organizationGetOrganization(
+          url
+        );
         return apiResponse.data.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return null;
       }
     },
 
     async retrieveOrganizations(filter = "") {
-      const apiResponse = await OrganizationApi.organizationGetROR(filter);
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await OrganizationApi.organizationGetROR(filter);
         this.organizations = apiResponse.data.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async isMemberOfOrganization(rorUrl: string): Promise<boolean> {
-      const apiResponse = await OrganizationApi.organizationIsMember(rorUrl);
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await OrganizationApi.organizationIsMember(rorUrl);
         return apiResponse.data.isMember as boolean;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return false;
       }
     },
 
     async retrieveVisibilities() {
-      const apiResponse = await VisibilityApi.visibilityIndex();
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await VisibilityApi.visibilityIndex();
         this.visibilities = apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveLicenses() {
-      const apiResponse = await LicenseApi.licenseIndex();
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await LicenseApi.licenseIndex();
         this.licenses = apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveDisciplines() {
-      const apiResponse = await DisciplineApi.disciplineIndex();
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await DisciplineApi.disciplineIndex();
         this.disciplines = apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveRoles() {
-      const apiResponse = await RoleApi.roleIndex();
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await RoleApi.roleIndex();
         this.roles = apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async resolveInvitation() {
-      // .../?invitationToken=<token>
-      const invitationToken = this.router.currentRoute.query.invitationToken;
-      if (invitationToken) {
-        // ToDo: Modals and project refreshing handling!
-        const apiResponse = await ProjectApi.projectResolveInvitation(
-          invitationToken.toString()
-        );
-        if (apiResponse.status === StatusCodes.OK) {
-          // remove invitationToken from the URL
+      const notificationStore = useNotificationStore();
+      try {
+        // .../?invitationToken=<token>
+        const invitationToken = this.router.currentRoute.query.invitationToken;
+        if (invitationToken) {
+          await ProjectApi.projectResolveInvitation(invitationToken.toString());
+          this.refreshProjectInformation();
           removeQueryParameterFromUrl(
             this.router.currentRoute,
             "invitationToken"
           );
-        } else {
-          // Handle other Status Codes
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+        removeQueryParameterFromUrl(
+          this.router.currentRoute,
+          "invitationToken"
+        );
       }
     },
 
@@ -447,47 +510,54 @@ export const useProjectStore = defineStore({
     },
 
     async createProject(project: ProjectObject): Promise<ProjectObject | null> {
-      const apiResponse = await ProjectApi.projectStore(project);
-      if (apiResponse.status === StatusCodes.OK) {
-        const createdProject: ProjectObject = apiResponse.data;
-        return createdProject;
-      } else {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await ProjectApi.projectStore(project);
+        return apiResponse.data as ProjectObject;
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return null;
       }
     },
 
     async updateProject(project: ProjectObject): Promise<boolean> {
-      if (project.id) {
-        const apiResponse = await ProjectApi.projectUpdate(project.id, project);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project.id) {
+          await ProjectApi.projectUpdate(project.id, project);
           return true;
         } else {
-          // Handle other Status Codes
+          console.error("Selected project's ID is undefined.");
           return false;
         }
-      } else {
-        console.error("Selected project's ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return false;
       }
     },
 
     async deleteProject(project: ProjectObject): Promise<boolean> {
-      if (project.id) {
-        const apiResponse = await ProjectApi.projectDelete(project.id);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project.id) {
+          await ProjectApi.projectDelete(project.id);
           return true;
         } else {
-          // Handle other Status Codes
+          console.error("Selected project's ID is undefined.");
           return false;
         }
-      } else {
-        console.error("Selected project's ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return false;
       }
     },
 
-    async refreshProjectInformation(parentProject: ProjectObject | null) {
+    async refreshProjectInformation(
+      parentProject: ProjectObject | null = null
+    ) {
       await Promise.all([
         this.retrieveAllProjects(),
         this.retrieveTopLevelProjects(),
@@ -524,86 +594,122 @@ export const useProjectStore = defineStore({
       }
     },
 
-    async getProjectRoles(projectId: string) {
-      const apiResponse = await ProjectRoleApi.projectRoleIndex(projectId);
-      return apiResponse.data;
+    async getProjectRoles(projectId: string): Promise<ProjectRoleObject[]> {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await ProjectRoleApi.projectRoleIndex(projectId);
+        return apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+      }
+      return [];
     },
 
     async retrieveProjectRoles(project: ProjectObject | null) {
-      if (project && project.slug && project.id) {
-        const apiResponse = await ProjectRoleApi.projectRoleIndex(project.id);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project && project.slug && project.id) {
+          const apiResponse = await ProjectRoleApi.projectRoleIndex(project.id);
           this.visitedProjects[project.slug].roles = apiResponse.data;
         } else {
-          // Handle other Status Codes
+          console.error("Selected project is null or its ID is undefined.");
         }
-      } else {
-        console.error("Selected project is null or its ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async deleteProjectRole(projectRole: ProjectRoleObject): Promise<boolean> {
-      if (
-        projectRole.projectId &&
-        projectRole.user &&
-        projectRole.user.id &&
-        projectRole.role &&
-        projectRole.role.id
-      ) {
-        try {
+      const notificationStore = useNotificationStore();
+      try {
+        if (
+          projectRole.projectId &&
+          projectRole.user &&
+          projectRole.user.id &&
+          projectRole.role &&
+          projectRole.role.id
+        ) {
           await ProjectRoleApi.projectRoleDelete(
             projectRole.projectId,
             projectRole.user.id,
             projectRole.role.id
           );
           return true;
-        } catch {
+        } else {
+          console.error("There was a problem with the project role.");
           return false;
         }
-      } else {
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return false;
       }
     },
 
     async storeProjectRole(projectRole: ProjectRoleObject) {
-      await ProjectRoleApi.projectRoleSet({
-        data: projectRole,
-      });
+      const notificationStore = useNotificationStore();
+      try {
+        await ProjectRoleApi.projectRoleSet({
+          data: projectRole,
+        });
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+      }
     },
 
     async createApplicationProfileAnalytics(project: ProjectObject | null) {
-      if (project && project.id) {
-        await ProjectApi.projectCreateApplicationProfile(project.id);
-      } else {
-        console.error("Selected project is null or its ID is undefined.");
+      const notificationStore = useNotificationStore();
+      try {
+        if (project && project.id) {
+          await ProjectApi.projectCreateApplicationProfile(project.id);
+        } else {
+          console.error("Selected project is null or its ID is undefined.");
+        }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async deleteInvitation(invitationId: string) {
+      const notificationStore = useNotificationStore();
       try {
         await ProjectApi.projectDeleteInvitation(invitationId);
         return true;
-      } catch {
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return false;
       }
     },
 
     async storeInvitation(invitation: SendInvitationObject) {
-      await ProjectApi.projectSendInvitation(invitation);
+      const notificationStore = useNotificationStore();
+      try {
+        await ProjectApi.projectSendInvitation(invitation);
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+      }
     },
 
     async leaveProject(project: ProjectObject | null) {
-      if (project && project.slug && project.id) {
-        const apiResponse = await ProjectRoleApi.projectRoleDelete2(project.id);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (project && project.slug && project.id) {
+          await ProjectRoleApi.projectRoleDelete2(project.id);
           this.visitedProjects[project.slug].roles = null;
           this.refreshProjectInformation(this.currentProject);
           this.router.push({ name: "list-projects" });
         } else {
-          // Handle other Status Codes
+          console.error("Selected project is null or its ID is undefined.");
         }
-      } else {
-        console.error("Selected project is null or its ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
   },
diff --git a/src/modules/project/types.d.ts b/src/modules/project/types.ts
similarity index 100%
rename from src/modules/project/types.d.ts
rename to src/modules/project/types.ts
diff --git a/src/modules/resource/ResourceModule.vue b/src/modules/resource/ResourceModule.vue
index d1d2f808b5d5719e2dd4ba9bf8f695ce51352529..3706aaf754df1e8e45c9c3b16d26888f53270eb6 100644
--- a/src/modules/resource/ResourceModule.vue
+++ b/src/modules/resource/ResourceModule.vue
@@ -18,8 +18,13 @@ import type { VisitedResourceObject } from "./types";
 import type { ResourceTypeInformation } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
 import VueI18n from "vue-i18n";
 import { cloneDeep } from "lodash";
+import type { Route } from "vue-router";
 
 export default defineComponent({
+  beforeRouteUpdate(to, from, next) {
+    this.apiFetch(to);
+    next();
+  },
   setup() {
     const mainStore = useMainStore();
     const resourceStore = useResourceStore();
@@ -28,10 +33,6 @@ export default defineComponent({
     return { mainStore, resourceStore, projectStore };
   },
 
-  created() {
-    this.initialize();
-  },
-
   computed: {
     resource(): VisitedResourceObject | null {
       return this.resourceStore.currentResource;
@@ -56,13 +57,18 @@ export default defineComponent({
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
+      await this.apiFetch(this.$router.currentRoute);
+    },
+
+    async apiFetch(route: Route) {
       // Resource may be unset (e.g. when entering from a direct link)
-      await this.resourceStore.handleUnsetResource(
-        this.resource,
-        this.$router.currentRoute
-      );
+      await this.resourceStore.handleUnsetResource(this.resource, route);
       if (this.resource) {
         if (!this.resourceStore.currentFullApplicationProfile) {
           this.resourceStore.retrieveApplicationProfile(this.resource);
diff --git a/src/modules/resource/components/create-resource/Configuration.vue b/src/modules/resource/components/create-resource/Configuration.vue
index 621822ffbc3ba4f888a35d5f884a4bb127c6a6c3..81e44b85d53c89df1cf7bea0eed11ceda96f6fb6 100644
--- a/src/modules/resource/components/create-resource/Configuration.vue
+++ b/src/modules/resource/components/create-resource/Configuration.vue
@@ -4,16 +4,15 @@
     <div v-if="resourceTypes && resourceTypes.length > 0">
       <coscine-form-group
         :mandatory="true"
-        labelFor="ResourceTypes"
+        label-for="ResourceTypes"
         :label="$t('page.createResource.configuration.labels.resourceType')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
       >
         <multiselect
           v-if="resourceTypes.length > 1"
           id="ResourceTypes"
           v-model="selectedResourceType"
           :options="resourceTypes"
-          @input="setSelectedResourceTypeInformation"
           :multiple="false"
           :hide-selected="false"
           label="iDisplayName"
@@ -24,6 +23,7 @@
           select-label=""
           selected-label=""
           deselect-label=""
+          @input="setSelectedResourceTypeInformation"
         >
           <span slot="noResult">{{
             $t("page.createResource.multiselect.noResults")
@@ -57,9 +57,9 @@
     <!-- Button Next (wrapper needed for Popover) -->
     <div id="divButtonNext" class="float-right">
       <b-button
-        @click.prevent="next"
         variant="outline-primary"
         :disabled="!valid"
+        @click.prevent="next"
         >{{ $t("buttons.next") }}
       </b-button>
     </div>
@@ -105,6 +105,24 @@ import type {
 import type { LabeledResourceObject, ResourceTypeOption } from "../../types";
 
 export default defineComponent({
+  components: {
+    ConfigurationSizeSlider,
+  },
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+    isLoading: {
+      default: false,
+      type: Boolean,
+    },
+  },
+  emits: {
+    valid: (_: boolean) => null,
+    next: null,
+    input: (_: ResourceObject) => null,
+  },
   setup() {
     const mainStore = useMainStore();
     const projectStore = useProjectStore();
@@ -113,10 +131,6 @@ export default defineComponent({
     return { mainStore, projectStore, resourceStore };
   },
 
-  components: {
-    ConfigurationSizeSlider,
-  },
-
   data() {
     return {
       resource: this.value,
@@ -124,17 +138,6 @@ export default defineComponent({
     };
   },
 
-  props: {
-    value: {
-      type: Object as PropType<ResourceObject>,
-      required: true,
-    },
-    isLoading: {
-      default: false,
-      type: Boolean,
-    },
-  },
-
   computed: {
     isOwner(): boolean | undefined {
       return this.projectStore.currentUserRoleIsOwner;
@@ -269,12 +272,6 @@ export default defineComponent({
       }
     },
   },
-
-  emits: {
-    valid: (_: boolean) => null,
-    next: null,
-    input: (_: ResourceObject) => null,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/components/create-resource/ConfigurationSizeSlider.vue b/src/modules/resource/components/create-resource/ConfigurationSizeSlider.vue
index 8ef0793a2db2e0d530d28002ff63171b0d577f65..1b77506fb82437c04fb03596f80f01f5188b6b70 100644
--- a/src/modules/resource/components/create-resource/ConfigurationSizeSlider.vue
+++ b/src/modules/resource/components/create-resource/ConfigurationSizeSlider.vue
@@ -8,11 +8,11 @@
       <b-form-input
         id="slider"
         :disabled="!sliderValue || max < min"
-        @change="update"
         type="range"
         :min="min"
         :max="max"
         :value="sliderValue"
+        @change="update"
       />
       <div>
         {{ sliderText }}
@@ -35,6 +35,15 @@ import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.
 import { ResourceTypeOption } from "../../types";
 
 export default defineComponent({
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+  },
+  emits: {
+    input: (_: ResourceObject) => null,
+  },
   setup() {
     const projectStore = useProjectStore();
 
@@ -50,13 +59,6 @@ export default defineComponent({
     };
   },
 
-  props: {
-    value: {
-      type: Object as PropType<ResourceObject>,
-      required: true,
-    },
-  },
-
   computed: {
     project(): ProjectObject | null {
       return this.projectStore.currentProject;
@@ -152,10 +154,6 @@ export default defineComponent({
       this.$set(this.resource.resourceTypeOption, "Size", size);
     },
   },
-
-  emits: {
-    input: (_: ResourceObject) => null,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/components/create-resource/General.vue b/src/modules/resource/components/create-resource/General.vue
index 6f7c98c1227a4192ed1e1b28d5f905b2483c311a..76ac82f649338d79787b962f943a8f2399819964 100644
--- a/src/modules/resource/components/create-resource/General.vue
+++ b/src/modules/resource/components/create-resource/General.vue
@@ -5,14 +5,13 @@
       <!-- Resource Name -->
       <coscine-form-group
         :mandatory="true"
-        labelFor="ResourceName"
+        label-for="ResourceName"
         :label="$t('form.resource.resourceNameLabel')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
       >
         <b-form-input
           id="ResourceName"
           v-model="$v.resourceForm.resourceName.$model"
-          @input="translateResourceNameToDisplayName"
           :state="
             $v.resourceForm.resourceName.$dirty
               ? !$v.resourceForm.resourceName.$error
@@ -22,6 +21,7 @@
           :maxlength="maxLengthFromValidation($v.resourceForm.resourceName)"
           required
           :readonly="readonly"
+          @input="translateResourceNameToDisplayName"
         />
         <div class="invalid-tooltip">
           {{
@@ -35,14 +35,13 @@
       <!-- Display Name -->
       <coscine-form-group
         :mandatory="true"
-        labelFor="DisplayName"
+        label-for="DisplayName"
         :label="$t('form.resource.displayNameLabel')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
       >
         <b-form-input
           id="DisplayName"
           v-model="$v.resourceForm.displayName.$model"
-          @input="isLockedDisplayName = true"
           :state="
             $v.resourceForm.displayName.$dirty
               ? !$v.resourceForm.displayName.$error
@@ -52,6 +51,7 @@
           :maxlength="maxLengthFromValidation($v.resourceForm.displayName)"
           required
           :readonly="readonly"
+          @input="isLockedDisplayName = true"
         />
         <div class="invalid-tooltip">
           {{
@@ -65,9 +65,9 @@
       <!-- Description -->
       <coscine-form-group
         :mandatory="true"
-        labelFor="Description"
+        label-for="Description"
         :label="$t('form.resource.resourceDescriptionLabel')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
       >
         <b-form-textarea
           id="Description"
@@ -94,9 +94,9 @@
       <!-- Discipline -->
       <coscine-form-group
         :mandatory="true"
-        labelFor="Discipline"
+        label-for="Discipline"
         :label="$t('form.resource.resourceDisciplineLabel')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
       >
         <multiselect
           id="Discipline"
@@ -124,9 +124,9 @@
 
       <!-- Keywords -->
       <coscine-form-group
-        labelFor="Keywords"
+        label-for="Keywords"
         :label="$t('form.resource.resourceKeywordsLabel')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
       >
         <multiselect
           id="Keywords"
@@ -137,9 +137,9 @@
           :taggable="true"
           :max="limitKeywords(selectedKeyword)"
           :tag-placeholder="$t('form.resource.tagPlaceholder')"
+          :disabled="readonly"
           @tag="addTag"
           @remove="$v.resourceForm.keywords.$touch()"
-          :disabled="readonly"
         >
           <template #maxElements>
             {{
@@ -161,27 +161,27 @@
       <!-- Visibility -->
       <coscine-form-group
         :mandatory="true"
-        labelFor="Visibility"
+        label-for="Visibility"
         :label="$t('form.resource.resourceMetadataVisibilityLabel')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
       >
         <b-form-radio-group
-          name="radios-stacked"
           v-model="selectedVisibility"
-          @change="setVisibility(selectedVisibility)"
+          name="radios-stacked"
           :options="visibilities"
           text-field="displayName"
           value-field="id"
           stacked
           :disabled="readonly"
+          @change="setVisibility(selectedVisibility)"
         />
       </coscine-form-group>
 
       <!-- License -->
       <coscine-form-group
-        labelFor="ResourceLicense"
+        label-for="ResourceLicense"
         :label="$t('form.resource.resourceLicenseLabel')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
         :info="true"
       >
         <template #popover>
@@ -195,7 +195,6 @@
         <b-form-select
           id="ResourceLicense"
           v-model="selectedLicense"
-          @change="setLicense(selectedLicense)"
           :options="licenses"
           text-field="displayName"
           value-field="id"
@@ -206,6 +205,7 @@
           "
           :placeholder="$t('form.resource.resourceLicense')"
           :disabled="readonly"
+          @change="setLicense(selectedLicense)"
         >
           <template #first>
             <option :value="null" disabled>
@@ -217,9 +217,9 @@
 
       <!-- Internal Rules for Reuse -->
       <coscine-form-group
-        labelFor="InternalRulesForReuse"
+        label-for="InternalRulesForReuse"
         :label="$t('form.resource.resourceReuseLabel')"
-        :isLoading="isLoading"
+        :is-loading="isLoading"
         :info="true"
       >
         <template #popover>
@@ -274,6 +274,26 @@ import type {
 import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 
 export default defineComponent({
+  mixins: [validationMixin],
+  props: {
+    value: {
+      type: Object as PropType<ResourceObject>,
+      required: true,
+    },
+    isLoading: {
+      default: false,
+      type: Boolean,
+    },
+    readonly: {
+      default: false,
+      type: Boolean,
+    },
+  },
+  emits: {
+    valid: (_: boolean) => null,
+    validation: (_: Validation) => null,
+    input: (_: ResourceObject) => null,
+  },
   setup() {
     const mainStore = useMainStore();
     const projectStore = useProjectStore();
@@ -282,8 +302,6 @@ export default defineComponent({
     return { mainStore, projectStore, resourceStore };
   },
 
-  mixins: [validationMixin],
-
   validations: {
     resourceForm: {
       resourceName: {
@@ -314,21 +332,6 @@ export default defineComponent({
     },
   },
 
-  props: {
-    value: {
-      type: Object as PropType<ResourceObject>,
-      required: true,
-    },
-    isLoading: {
-      default: false,
-      type: Boolean,
-    },
-    readonly: {
-      default: false,
-      type: Boolean,
-    },
-  },
-
   data() {
     return {
       resourceForm: this.value,
@@ -514,12 +517,6 @@ export default defineComponent({
       }
     },
   },
-
-  emits: {
-    valid: (_: boolean) => null,
-    validation: (_: Validation) => null,
-    input: (_: ResourceObject) => null,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/components/create-resource/Metadata.vue b/src/modules/resource/components/create-resource/Metadata.vue
index 02887dd7a69638e8527df7038599e563c50e1a53..10cce526ec77b80570e1f3098903319e47bea2cb 100644
--- a/src/modules/resource/components/create-resource/Metadata.vue
+++ b/src/modules/resource/components/create-resource/Metadata.vue
@@ -3,7 +3,7 @@
     <div>
       <!-- Application Profile Dropdown -->
       <coscine-form-group
-        labelFor="ApplicationProfiles"
+        label-for="ApplicationProfiles"
         :mandatory="true"
         :label="$t('page.createResource.metadata.applicationProfileLabel')"
       >
@@ -12,10 +12,10 @@
             id="ApplicationProfiles"
             v-model="selectedApplicationProfile"
             :options="applicationProfileList"
-            @change="notifyFormGenerator"
             :placeholder="
               $t('page.createResource.metadata.selectApplicationProfile')
             "
+            @change="notifyFormGenerator"
           >
             <template #first>
               <b-form-select-option :value="null" disabled>
@@ -71,13 +71,13 @@
     <FormGenerator
       v-else
       :key="resource.applicationProfile"
-      :fixedValueMode="fixedValueMode"
-      :fixedValues="resource.fixedValues"
-      :applicationProfileId="resource.applicationProfile"
-      :SHACLDefinition="applicationProfileString"
-      :classReceiver="receiveClass"
-      :userReceiver="async () => user"
-      mimeType="application/ld+json"
+      :fixed-value-mode="fixedValueMode"
+      :fixed-values="resource.fixedValues"
+      :application-profile-id="resource.applicationProfile"
+      :s-h-a-c-l-definition="applicationProfileString"
+      :class-receiver="receiveClass"
+      :user-receiver="async () => user"
+      mime-type="application/ld+json"
     />
   </div>
 </template>
@@ -95,17 +95,9 @@ import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api
 import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
 
 export default defineComponent({
-  setup() {
-    const resourceStore = useResourceStore();
-    const userStore = useUserStore();
-
-    return { resourceStore, userStore };
-  },
-
   components: {
     CreateAPModal,
   },
-
   props: {
     value: {
       type: Object as PropType<ResourceObject>,
@@ -124,6 +116,16 @@ export default defineComponent({
       required: true,
     },
   },
+  emits: {
+    valid: (_: boolean) => null,
+    input: (_: ResourceObject) => null,
+  },
+  setup() {
+    const resourceStore = useResourceStore();
+    const userStore = useUserStore();
+
+    return { resourceStore, userStore };
+  },
 
   data() {
     return {
@@ -191,11 +193,6 @@ export default defineComponent({
       );
     },
   },
-
-  emits: {
-    valid: (_: boolean) => null,
-    input: (_: ResourceObject) => null,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/components/create-resource/Overview.vue b/src/modules/resource/components/create-resource/Overview.vue
index 4911072f22f59bce641024b95af6e5ad4b1f6acf..6eb9af95d287e4d2f10487dc9ea54623c2efb7c9 100644
--- a/src/modules/resource/components/create-resource/Overview.vue
+++ b/src/modules/resource/components/create-resource/Overview.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="overview">
     <!-- Resource Configuration -->
-    <b-card @click.prevent="toTab(tabs[0])" class="my-2">
+    <b-card class="my-2" @click.prevent="toTab(tabs[0])">
       <CoscineHeadline :headline="$t('form.steps.first')" h="h5" />
 
       <coscine-form-group
@@ -27,7 +27,7 @@
     </b-card>
 
     <!-- General Information -->
-    <b-card @click.prevent="toTab(tabs[1])" class="my-2">
+    <b-card class="my-2" @click.prevent="toTab(tabs[1])">
       <CoscineHeadline :headline="$t('form.steps.second')" h="h5" />
 
       <!-- General -->
@@ -35,7 +35,7 @@
     </b-card>
 
     <!-- Metadata -->
-    <b-card @click.prevent="toTab(tabs[2])" class="my-2 p-0">
+    <b-card class="my-2 p-0" @click.prevent="toTab(tabs[2])">
       <CoscineHeadline :headline="$t('form.steps.third')" h="h5" />
 
       <!-- Form Generator -->
@@ -45,31 +45,31 @@
       <FormGenerator
         v-else
         :key="resource.applicationProfile"
-        :projectId="project.id"
-        :fixedValueMode="fixedValueMode"
-        :fixedValues="resource.fixedValues"
-        :applicationProfileId="resource.applicationProfile"
-        :disabledMode="true"
-        :SHACLDefinition="applicationProfileString"
-        :classReceiver="receiveClass"
-        :userReceiver="async () => user"
-        mimeType="application/ld+json"
+        :project-id="project.id"
+        :fixed-value-mode="fixedValueMode"
+        :fixed-values="resource.fixedValues"
+        :application-profile-id="resource.applicationProfile"
+        :disabled-mode="true"
+        :s-h-a-c-l-definition="applicationProfileString"
+        :class-receiver="receiveClass"
+        :user-receiver="async () => user"
+        mime-type="application/ld+json"
       />
     </b-card>
 
     <!-- Buttons -->
     <b-form-group>
       <!-- Button Back -->
-      <b-button @click.prevent="back" variant="outline-primary"
+      <b-button variant="outline-primary" @click.prevent="back"
         >{{ $t("buttons.back") }}
       </b-button>
 
       <!-- Button Confirm -->
       <b-button
-        @click.prevent="clickSave"
         :disabled="isUploadInProgress || isLoadingFormGenerator"
         class="float-right"
         variant="outline-primary"
+        @click.prevent="clickSave"
         >{{ $t("buttons.confirm") }}
       </b-button>
     </b-form-group>
@@ -90,25 +90,10 @@ import type { ResourceCreationTab, ResourceTypeOption } from "../../types";
 import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api.Metadata";
 import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
+import useNotificationStore from "@/store/notification";
 
 export default defineComponent({
   components: { General },
-  setup() {
-    const projectStore = useProjectStore();
-    const resourceStore = useResourceStore();
-    const userStore = useUserStore();
-
-    return { projectStore, resourceStore, userStore };
-  },
-
-  data() {
-    return {
-      resource: this.value,
-      fixedValueMode: true,
-      isUploadInProgress: false,
-    };
-  },
-
   props: {
     value: {
       type: Object as PropType<ResourceObject>,
@@ -127,6 +112,28 @@ export default defineComponent({
       required: true,
     },
   },
+  emits: {
+    back: null,
+    toTab: (_: ResourceCreationTab) => null,
+    waitingForResponse: (_: boolean) => null,
+    input: (_: ResourceObject) => null,
+  },
+  setup() {
+    const projectStore = useProjectStore();
+    const resourceStore = useResourceStore();
+    const userStore = useUserStore();
+    const notificationStore = useNotificationStore();
+
+    return { projectStore, resourceStore, userStore, notificationStore };
+  },
+
+  data() {
+    return {
+      resource: this.value,
+      fixedValueMode: true,
+      isUploadInProgress: false,
+    };
+  },
 
   computed: {
     project(): ProjectObject | null {
@@ -186,37 +193,16 @@ export default defineComponent({
         } else {
           this.$emit("waitingForResponse", false);
           // On Failure
-          this.makeToast(
-            this.$t("toast.onSave.failure.message").toString(),
-            this.$t("toast.onSave.failure.title").toString(),
-            "danger"
-          );
+          this.notificationStore.postNotification({
+            title: this.$t("toast.onSave.failure.title").toString(),
+            body: this.$t("toast.onSave.failure.message").toString(),
+            variant: "danger",
+          });
         }
 
         this.isUploadInProgress = false;
       }
     },
-
-    makeToast(
-      text = "Message",
-      givenTitle = "Title",
-      variant: string | undefined = undefined
-    ) {
-      this.$root.$bvToast.toast(text, {
-        title: givenTitle,
-        autoHideDelay: 5000,
-        toaster: "b-toaster-bottom-right",
-        variant: variant,
-        noCloseButton: true,
-      });
-    },
-  },
-
-  emits: {
-    back: null,
-    toTab: (_: ResourceCreationTab) => null,
-    waitingForResponse: (_: boolean) => null,
-    input: (_: ResourceObject) => null,
   },
 });
 </script>
diff --git a/src/modules/resource/components/resource-page/FilesView.vue b/src/modules/resource/components/resource-page/FilesView.vue
index 3f96e72dbcff8b47a5a81b2a08177235f7f49780..3743e07f4be3cf652978139c96cbffe4a4a51a63 100644
--- a/src/modules/resource/components/resource-page/FilesView.vue
+++ b/src/modules/resource/components/resource-page/FilesView.vue
@@ -1,13 +1,14 @@
 <template>
   <div class="DataSource">
     <FilesViewHeader
-      @clickFileSelect="clickFileSelect"
-      :isUploading="isUploading"
       v-model="filter"
+      :is-uploading="isUploading"
+      @clickFileSelect="clickFileSelect"
     />
     <b-row>
       <b-table
         id="resourceViewTable"
+        ref="adaptTable"
         :fields="headers"
         :items="folderContents"
         :busy="isBusy"
@@ -23,11 +24,10 @@
         responsive
         head-variant="dark"
         class="adaptTable"
-        ref="adaptTable"
-        @row-selected="onRowSelected"
         show-empty
         :empty-text="$t('page.resource.emptyTableText')"
         :empty-filtered-text="$t('page.resource.emptyFilterText')"
+        @row-selected="onRowSelected"
       >
         <div slot="table-busy" class="text-center text-danger my-2">
           <b-spinner class="align-middle"></b-spinner>
@@ -35,17 +35,17 @@
             $t("page.resource.loading")
           }}</strong>
         </div>
-        <template v-slot:head(name)="row">
+        <template #head(name)="row">
           <b-form-checkbox
             v-model="selectAll"
             @change="allSelect(row)"
           ></b-form-checkbox>
           <span>{{ $t("page.resource.fileName") }}</span>
         </template>
-        <template v-slot:head(lastModified)="row">
+        <template #head(lastModified)="row">
           <span>{{ row.label }}</span>
         </template>
-        <template v-slot:head()="row">
+        <template #head()="row">
           <template v-if="visibleColumns.includes(row.field.key)">
             <span>{{ row.label }}</span>
           </template>
@@ -56,15 +56,15 @@
             </span>
           </template>
         </template>
-        <template v-slot:head(addColumn)>
-          <b-dropdown size="sm" right :no-caret="true" id="addColumnDropDown">
-            <template v-slot:button-content>
+        <template #head(addColumn)>
+          <b-dropdown id="addColumnDropDown" size="sm" right :no-caret="true">
+            <template #button-content>
               <b-icon icon="arrow-down" />
             </template>
             <b-form-checkbox
               v-for="column in columns"
-              v-model="column.active"
               :key="column.value"
+              v-model="column.active"
               :value="column.value"
               stacked
             >
@@ -72,11 +72,11 @@
             </b-form-checkbox>
           </b-dropdown>
         </template>
-        <template v-slot:cell(name)="row">
+        <template #cell(name)="row">
           <span class="checkFile">
             <b-form-checkbox
-              class="tableCheck"
               v-model="row.rowSelected"
+              class="tableCheck"
               @change="select(row)"
             />
             <b-icon
@@ -102,7 +102,7 @@
             :no-caret="true"
             :disabled="editableDataUrl && resource.archived"
           >
-            <template v-slot:button-content> ... </template>
+            <template #button-content> ... </template>
             <b-dropdown-item
               v-if="!editableDataUrl"
               @click="
@@ -113,16 +113,16 @@
               }}</b-dropdown-item
             >
             <b-dropdown-item
-              @click="deleteFile(row.item)"
               :disabled="resource.archived"
+              @click="deleteFile(row.item)"
               >{{ $t("buttons.delete") }}</b-dropdown-item
             >
           </b-dropdown>
         </template>
-        <template v-slot:cell(size)="row">
+        <template #cell(size)="row">
           {{ renderSize(row.item) }}
         </template>
-        <template v-slot:cell(lastModified)="row">
+        <template #cell(lastModified)="row">
           {{ renderDate(row.item) }}
         </template>
       </b-table>
@@ -169,6 +169,28 @@ interface CustomTableField extends BvTableField {
 }
 
 export default defineComponent({
+  components: {
+    FilesViewHeader,
+  },
+  props: {
+    folderContents: {
+      default() {
+        return [];
+      },
+      type: Array as PropType<FolderContent[]>,
+    },
+    currentFolder: {
+      default: "/",
+      type: String,
+    },
+    fileListEdit: {
+      default() {
+        return [];
+      },
+      type: Array as PropType<FolderContent[]>,
+    },
+    isUploading: Boolean,
+  },
   setup() {
     const mainStore = useMainStore();
     const resourceStore = useResourceStore();
@@ -176,6 +198,36 @@ export default defineComponent({
 
     return { mainStore, resourceStore, projectStore };
   },
+  data() {
+    return {
+      defaultHeaders: [
+        {
+          label: this.$t("page.resource.fileName").toString(),
+          key: "name",
+          sortable: true,
+          active: true,
+        },
+        {
+          label: this.$t("page.resource.lastModified").toString(),
+          key: "lastModified",
+          sortable: true,
+          active: true,
+        },
+        {
+          label: this.$t("page.resource.size").toString(),
+          key: "size",
+          sortable: true,
+          active: true,
+        },
+      ] as Array<CustomTableField>,
+      columns: [] as CustomTableField[],
+      isBusy: true,
+      selectAll: false,
+      filter: "",
+      folderPath: [] as string[],
+      selectableFiles: [] as FolderContent[],
+    };
+  },
 
   computed: {
     applicationProfile(): ApplicationProfile | null {
@@ -245,58 +297,6 @@ export default defineComponent({
       return visibleColumns;
     },
   },
-  data() {
-    return {
-      defaultHeaders: [
-        {
-          label: this.$t("page.resource.fileName").toString(),
-          key: "name",
-          sortable: true,
-          active: true,
-        },
-        {
-          label: this.$parent.$t("page.resource.lastModified").toString(),
-          key: "lastModified",
-          sortable: true,
-          active: true,
-        },
-        {
-          label: this.$t("page.resource.size").toString(),
-          key: "size",
-          sortable: true,
-          active: true,
-        },
-      ] as Array<CustomTableField>,
-      columns: [] as CustomTableField[],
-      isBusy: true,
-      selectAll: false,
-      filter: "",
-      folderPath: [] as string[],
-      selectableFiles: [] as FolderContent[],
-    };
-  },
-  components: {
-    FilesViewHeader,
-  },
-  props: {
-    folderContents: {
-      default() {
-        return [];
-      },
-      type: Array as PropType<FolderContent[]>,
-    },
-    currentFolder: {
-      default: "/",
-      type: String,
-    },
-    fileListEdit: {
-      default() {
-        return [];
-      },
-      type: Array as PropType<FolderContent[]>,
-    },
-    isUploading: Boolean,
-  },
   watch: {
     applicationProfile() {
       this.getColumns();
@@ -395,7 +395,7 @@ export default defineComponent({
     getData() {
       // Doesn't end with '/' => Probably a file
       let currentFolder = this.currentFolder;
-      if (!currentFolder.endsWith("/")) {
+      if (!currentFolder.endsWith("/") && currentFolder !== "") {
         // TODO: Change to open modal
         this.openFile({
           id: uuidv4(),
@@ -479,12 +479,15 @@ export default defineComponent({
       // (Other workaround would be to keep the editing files open)
       this.$emit("fileListEdit", []);
 
+      const absolutePath =
+        folder.absolutePath !== "" ? folder.absolutePath : "/";
+
       // Show location change
-      window.location.hash = folder.absolutePath;
+      window.location.hash = absolutePath;
 
       const response = await this.resourceStore.getMetadata(
         this.resource,
-        folder.absolutePath
+        absolutePath
       );
 
       const tmpFolder: FolderContent[] = [];
@@ -492,9 +495,9 @@ export default defineComponent({
         this.$emit("currentFolder", this.folderPath.pop());
       } else if (this.currentFolder !== "") {
         this.folderPath.push(this.currentFolder);
-        this.$emit("currentFolder", folder.absolutePath);
+        this.$emit("currentFolder", absolutePath);
       } else {
-        this.$emit("currentFolder", folder.absolutePath);
+        this.$emit("currentFolder", absolutePath);
       }
 
       if (this.folderPath.length > 0) {
diff --git a/src/modules/resource/components/resource-page/FilesViewHeader.vue b/src/modules/resource/components/resource-page/FilesViewHeader.vue
index 61a580dc994932133d67a0cec166a20b82d42e4f..40141d254e19652e54cded2f8c92d7fa06aad649 100644
--- a/src/modules/resource/components/resource-page/FilesViewHeader.vue
+++ b/src/modules/resource/components/resource-page/FilesViewHeader.vue
@@ -3,13 +3,13 @@
     <div class="col-sm-7 file-view-header">
       <span>
         <p
-          class="h4"
           v-if="
             resource &&
             resource.type &&
             resource.type.displayName &&
             resource.displayName
           "
+          class="h4"
         >
           {{
             $t("resourceTypes." + resource.type.displayName + ".displayName")
@@ -29,7 +29,7 @@
         triggers="hover focus"
         placement="bottom"
       >
-        <template v-slot:title
+        <template #title
           ><b>{{ resource.displayName }}</b></template
         >
         <div v-if="resource.displayName">
@@ -53,10 +53,7 @@
             ><b>{{ $t("page.resource.disciplines") }}: </b>
           </span>
           <ul>
-            <li
-              v-for="discipline in resource.disciplines"
-              v-bind:key="discipline.id"
-            >
+            <li v-for="discipline in resource.disciplines" :key="discipline.id">
               <div v-if="$i18n.locale === 'de'">
                 {{ discipline.displayNameDe }}
               </div>
@@ -71,7 +68,7 @@
             ><b>{{ $t("page.resource.keywords") }}: </b> </span
           ><br />
           <ul>
-            <li v-for="keyword in resource.keywords" v-bind:key="keyword">
+            <li v-for="keyword in resource.keywords" :key="keyword">
               {{ keyword }}
             </li>
           </ul>
@@ -96,18 +93,18 @@
         </div>
       </b-popover>
       <b-button
-        @click="edit"
+        v-if="canEditResource"
         :title="$t('page.resource.edit')"
         class="btn btn-sm"
-        v-if="canEditResource"
+        @click="edit"
       >
         <b-icon icon="pencil-fill" :title="$t('page.resource.edit')" />
       </b-button>
       <b-button
-        @click="upload"
         :title="$t('page.resource.upload')"
         class="btn btn-sm"
         :disabled="isUploading || readOnly || (resource && resource.archived)"
+        @click="upload"
       >
         <b-icon icon="plus" :title="$t('page.resource.upload')" />
       </b-button>
@@ -142,8 +139,8 @@
     <div class="col-sm-2 searchColumn">
       <b-input-group>
         <b-form-input
-          type="search"
           id="filterInput"
+          type="search"
           :placeholder="$t('page.resource.typeToSearch')"
           :value="value"
           @input="$emit('input', $event)"
@@ -175,6 +172,14 @@ import type { ResourceTypeInformation } from "@coscine/api-client/dist/types/Cos
 import type { VisitedResourceObject } from "../../types";
 
 export default defineComponent({
+  name: "Header",
+  props: {
+    isUploading: Boolean,
+    value: {
+      default: "",
+      type: String,
+    },
+  },
   setup() {
     const mainStore = useMainStore();
     const resourceStore = useResourceStore();
@@ -235,12 +240,6 @@ export default defineComponent({
       return undefined;
     },
   },
-
-  name: "Header",
-  props: {
-    isUploading: Boolean,
-    value: String,
-  },
   methods: {
     edit() {
       if (
diff --git a/src/modules/resource/components/resource-page/MetadataManager.vue b/src/modules/resource/components/resource-page/MetadataManager.vue
index c9a221543194bf9769f91f6db06043638aec460a..f456b4a222206cf0708e7fc2c2e379095c292974 100644
--- a/src/modules/resource/components/resource-page/MetadataManager.vue
+++ b/src/modules/resource/components/resource-page/MetadataManager.vue
@@ -2,23 +2,23 @@
   <b-container id="detail-view">
     <MetadataManagerHeader
       v-if="resource"
-      :editableDataUrl="editableDataUrl"
-      :isUploading="isUploading"
-      :readOnly="readOnly"
+      :editable-data-url="editableDataUrl"
+      :is-uploading="isUploading"
+      :read-only="readOnly"
       :resource="resource"
-      :showDetail="showDetail"
-      :shownFiles="shownFiles"
+      :show-detail="showDetail"
+      :shown-files="shownFiles"
       @download="download"
       @selectFiles="selectFiles"
       @showModalDeleteFolderContents="showModalDeleteFolderContents"
     />
     <MetadataManagerTable
-      :currentFileId="currentFileId"
-      :currentFolderContent="currentFolderContent"
-      :editableDataUrl="editableDataUrl"
-      :editableKey="editableKey"
-      :showDetail="showDetail"
-      :shownFiles="shownFiles"
+      :current-file-id="currentFileId"
+      :current-folder-content="currentFolderContent"
+      :editable-data-url="editableDataUrl"
+      :editable-key="editableKey"
+      :show-detail="showDetail"
+      :shown-files="shownFiles"
       @changeMetadata="changeMetadata"
       @loadAllFilesTab="loadAllFilesTab"
       @removeElement="removeElement"
@@ -32,8 +32,8 @@
             currentFileId >= 0 &&
             currentFileId < fileListEdit.length
           "
-          :currentFileId="currentFileId"
-          :fileListEdit="fileListEdit"
+          :current-file-id="currentFileId"
+          :file-list-edit="fileListEdit"
         />
         <MetadataManagerSpecialProperties
           v-if="
@@ -42,10 +42,10 @@
             resource &&
             currentFolderContent
           "
-          :currentFolderContent="currentFolderContent"
-          :editableDataUrl="editableDataUrl"
-          :editableKey="editableKey"
-          :readOnly="readOnly"
+          :current-folder-content="currentFolderContent"
+          :editable-data-url="editableDataUrl"
+          :editable-key="editableKey"
+          :read-only="readOnly"
           :resource="resource"
         />
         <span
@@ -53,44 +53,44 @@
           class="generatedFormSpan"
         >
           <FormGenerator
-            class="generatedForm"
             :key="formGeneratorKey"
-            :applicationProfileId="resource.applicationProfile"
-            :fixedValues="resource.fixedValues"
-            :formData="currentMetadata"
-            :SHACLDefinition="applicationProfileString"
-            :disabledMode="resource.archived"
-            :classReceiver="receiveClass"
-            :userReceiver="async () => user"
-            mimeType="application/ld+json"
+            class="generatedForm"
+            :application-profile-id="resource.applicationProfile"
+            :fixed-values="resource.fixedValues"
+            :form-data="currentMetadata"
+            :s-h-a-c-l-definition="applicationProfileString"
+            :disabled-mode="resource.archived"
+            :class-receiver="receiveClass"
+            :user-receiver="async () => user"
+            mime-type="application/ld+json"
             @isValid="isValid"
           />
         </span>
       </b-col>
     </b-row>
     <MetadataManagerFooter
-      :isUploading="isUploading"
-      :numberOfCurrentlyProcessedFiles="numberOfCurrentlyProcessedFiles"
-      :progressStatus="progressStatus"
-      :saveButtonDisabled="saveButtonDisabled"
-      :showDetail="showDetail"
-      :totalNumberOfCurrentlyProcessedFiles="
+      :is-uploading="isUploading"
+      :number-of-currently-processed-files="numberOfCurrentlyProcessedFiles"
+      :progress-status="progressStatus"
+      :save-button-disabled="saveButtonDisabled"
+      :show-detail="showDetail"
+      :total-number-of-currently-processed-files="
         totalNumberOfCurrentlyProcessedFiles
       "
       @update="update"
       @uploadPreparation="uploadPreparation"
     />
-    <ValidationPopover :valid="valid" :validationResults="validationResults" />
+    <ValidationPopover :valid="valid" :validation-results="validationResults" />
     <SaveDuplicateFilesModal
       :visible="saveDuplicateFilesModalVisible"
-      :uploadFileListReplaceFiles="uploadFileListReplaceFiles"
+      :upload-file-list-replace-files="uploadFileListReplaceFiles"
       @close="hideModalSaveDuplicateFiles"
       @skip="skipModalSaveDuplicateFiles"
       @ok="overwriteModalSaveDuplicateFiles"
     />
     <DeleteFolderContentsModal
       :visible="deleteFolderContentsModalVisible"
-      :shownFiles="shownFiles"
+      :shown-files="shownFiles"
       @close="hideModalDeleteFolderContents"
       @ok="deleteModalDeleteFolderContents"
     />
@@ -98,7 +98,7 @@
 </template>
 
 <script lang="ts">
-import { defineComponent, PropType, VNode } from "vue-demi";
+import { defineComponent, PropType } from "vue-demi";
 
 // import the store for current module
 import useResourceStore from "../../store";
@@ -141,16 +141,9 @@ import type ValidationReport from "rdf-validate-shacl/src/validation-report";
 import { v4 as uuidv4 } from "uuid";
 import type { ValidationResult } from "rdf-validate-shacl/src/validation-report";
 import type { ApplicationProfile, Metadata } from "../../types";
+import useNotificationStore from "@/store/notification";
 
 export default defineComponent({
-  setup() {
-    const mainStore = useMainStore();
-    const resourceStore = useResourceStore();
-    const projectStore = useProjectStore();
-    const userStore = useUserStore();
-
-    return { mainStore, resourceStore, projectStore, userStore };
-  },
   components: {
     MetadataManagerHeader,
     MetadataManagerTable,
@@ -162,6 +155,64 @@ export default defineComponent({
     SaveDuplicateFilesModal,
     ValidationPopover,
   },
+  props: {
+    showDetail: Boolean,
+    isUploading: Boolean,
+    fileListEdit: {
+      default() {
+        return [];
+      },
+      type: Array as PropType<FolderContent[]>,
+    },
+    fileListUpload: {
+      default() {
+        return [];
+      },
+      type: Array as PropType<FileInformation[]>,
+    },
+    folderContents: {
+      default() {
+        return [];
+      },
+      type: Array as PropType<FolderContent[]>,
+    },
+    currentFolder: {
+      default: "/",
+      type: String,
+    },
+  },
+  setup() {
+    const mainStore = useMainStore();
+    const resourceStore = useResourceStore();
+    const projectStore = useProjectStore();
+    const userStore = useUserStore();
+    const notificationStore = useNotificationStore();
+
+    return {
+      mainStore,
+      resourceStore,
+      projectStore,
+      userStore,
+      notificationStore,
+    };
+  },
+  data() {
+    return {
+      numberOfCurrentlyProcessedFiles: 0,
+      totalNumberOfCurrentlyProcessedFiles: 0,
+      uploadDuplicates: true,
+      currentFileId: -1,
+      uploadFileListNewFiles: [] as FileInformation[],
+      uploadFileListReplaceFiles: [] as FileInformation[],
+      fileListError: [] as FolderContent[],
+      progressStatus: 0,
+      valid: false,
+      validationResults: [] as ValidationResult[],
+
+      deleteFolderContentsModalVisible: false,
+      saveDuplicateFilesModalVisible: false,
+    };
+  },
   computed: {
     applicationProfile(): ApplicationProfile | null {
       return this.resourceStore.currentFullApplicationProfile;
@@ -265,52 +316,6 @@ export default defineComponent({
       return shownFiles;
     },
   },
-  data() {
-    return {
-      numberOfCurrentlyProcessedFiles: 0,
-      totalNumberOfCurrentlyProcessedFiles: 0,
-      uploadDuplicates: true,
-      currentFileId: -1,
-      uploadFileListNewFiles: [] as FileInformation[],
-      uploadFileListReplaceFiles: [] as FileInformation[],
-      fileListError: [] as FolderContent[],
-      progressStatus: 0,
-      valid: false,
-      validationResults: [] as ValidationResult[],
-
-      deleteFolderContentsModalVisible: false,
-      saveDuplicateFilesModalVisible: false,
-    };
-  },
-  props: {
-    showDetail: Boolean,
-    isUploading: Boolean,
-    fileListEdit: {
-      default() {
-        return [];
-      },
-      type: Array as PropType<FolderContent[]>,
-    },
-    fileListUpload: {
-      default() {
-        return [];
-      },
-      type: Array as PropType<FileInformation[]>,
-    },
-    folderContents: {
-      default() {
-        return [];
-      },
-      type: Array as PropType<FolderContent[]>,
-    },
-    currentFolder: {
-      default: "/",
-      type: String,
-    },
-  },
-  created() {
-    this.getOptions();
-  },
   watch: {
     fileListUpload() {
       this.getOptions();
@@ -319,6 +324,9 @@ export default defineComponent({
       this.getOptions();
     },
   },
+  created() {
+    this.getOptions();
+  },
   methods: {
     async receiveClass(className: string): Promise<BilingualLabels> {
       return await this.resourceStore.getClass(className);
@@ -396,7 +404,7 @@ export default defineComponent({
             const h = this.$createElement;
             const content = [];
             content.push(
-              "" + this.$t("page.resource.toastSavingFailedBodyTop")
+              this.$t("page.resource.toastSavingFailedBodyTop").toString()
             );
             content.push(h("br"));
 
@@ -406,23 +414,25 @@ export default defineComponent({
             }
 
             content.push(
-              "" + this.$t("page.resource.toastSavingFailedBodyBottom")
+              this.$t("page.resource.toastSavingFailedBodyBottom").toString()
             );
 
             const vNodesMsg = h("span", {}, content);
-            this.makeToast(
-              "" + this.$t("page.resource.toastSavingFailedTitle"),
-              vNodesMsg,
-              true
-            );
+            this.notificationStore.postNotification({
+              title: this.$t("page.resource.toastSavingFailedTitle").toString(),
+              body: vNodesMsg,
+              variant: "warning",
+            });
           }
           if (numberOfSuccessfulUploadedFiles > 0) {
-            this.makeToast(
-              "" + this.$t("page.resource.toastSavingSuccessfulTitle"),
-              "" +
-                this.$t("page.resource.toastSavingSuccessfulBody") +
-                numberOfSuccessfulUploadedFiles
-            );
+            this.notificationStore.postNotification({
+              title: this.$t(
+                "page.resource.toastSavingSuccessfulTitle"
+              ).toString(),
+              body: this.$t("page.resource.toastSavingSuccessfulBody", {
+                number: numberOfSuccessfulUploadedFiles,
+              }).toString(),
+            });
           }
         }
       }
@@ -666,26 +676,6 @@ export default defineComponent({
     cleanup() {
       this.$emit("emptyFileLists");
     },
-    makeToast(
-      givenTitle = "Title",
-      text: string | VNode | VNode[] = "Message",
-      error = false
-    ) {
-      if (error) {
-        this.$bvToast.toast(text, {
-          title: givenTitle,
-          noAutoHide: true,
-          variant: "warning",
-          toaster: "b-toaster-bottom-right",
-        });
-      } else {
-        this.$bvToast.toast(text, {
-          title: givenTitle,
-          toaster: "b-toaster-bottom-right",
-          noCloseButton: true,
-        });
-      }
-    },
     showModalDeleteFolderContents() {
       this.deleteFolderContentsModalVisible = true;
     },
diff --git a/src/modules/resource/components/resource-page/metadata/MetadataManagerFooter.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerFooter.vue
index e3c3e7f5e2a11841e13c23e3212ae3d1ff36d1f9..67de1e7edf4b7a75783f374bdb20f6fa43aacfda 100644
--- a/src/modules/resource/components/resource-page/metadata/MetadataManagerFooter.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerFooter.vue
@@ -1,6 +1,6 @@
 <template>
   <b-row id="metadataManagerButtonRowBottom">
-    <span class="processStatement" v-if="isUploading"
+    <span v-if="isUploading" class="processStatement"
       >{{
         totalNumberOfCurrentlyProcessedFiles - numberOfCurrentlyProcessedFiles
       }}/{{ totalNumberOfCurrentlyProcessedFiles }}</span
@@ -24,6 +24,7 @@
           id="metadataManagerButtonRowBottomSave"
           class="metadataManagerButtonRowBottomSave"
           variant="primary"
+          :disabled="saveButtonDisabled"
           @click="
             isUploading
               ? undefined
@@ -31,8 +32,7 @@
               ? $emit('uploadPreparation')
               : $emit('update')
           "
-          :disabled="saveButtonDisabled"
-          ><b-spinner label="Spinning" v-show="isUploading"></b-spinner
+          ><b-spinner v-show="isUploading" label="Spinning"></b-spinner
           >{{
             isUploading
               ? $t("page.resource.metadataManagerBtnSaving")
diff --git a/src/modules/resource/components/resource-page/metadata/MetadataManagerHeader.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerHeader.vue
index 7d13b717768a380e040ce9a8638ebe13092c3a46..8f4ce1c2bd804868f544f826adbcbff9ddc5cce9 100644
--- a/src/modules/resource/components/resource-page/metadata/MetadataManagerHeader.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerHeader.vue
@@ -4,19 +4,19 @@
       <b-button
         id="buttonSelectFiles"
         variant="secondary"
-        @click="$emit('selectFiles')"
         :placeholder="$t('page.resource.metadataManagerBtnSelectFiles')"
         :disabled="isUploading || readOnly || (resource && resource.archived)"
         autofocus
+        @click="$emit('selectFiles')"
         >{{ $t("page.resource.metadataManagerBtnSelectFiles") }}
       </b-button>
     </b-col>
     <b-col>
       <b-input-group id="metadataManagerDropDownMenu" class="float-right">
         <b-dropdown
+          id="addColumnDropDown"
           size="sm"
           right
-          id="addColumnDropDown"
           :disabled="
             !showDetail ||
             readOnly ||
@@ -32,8 +32,8 @@
         </b-dropdown>
         <b-button
           v-if="!editableDataUrl"
-          @click="$emit('download')"
           :disabled="!showDetail || shownFiles.length === 0"
+          @click="$emit('download')"
           >{{ $t("page.resource.metadataManagerBtnDownload") }}</b-button
         >
       </b-input-group>
diff --git a/src/modules/resource/components/resource-page/metadata/MetadataManagerSpecialProperties.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerSpecialProperties.vue
index 680b65b57ee87720f93b8be8591099558527b14a..11c11da9a9bafbe83d861b44f75c5273a3c02c6f 100644
--- a/src/modules/resource/components/resource-page/metadata/MetadataManagerSpecialProperties.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerSpecialProperties.vue
@@ -3,18 +3,18 @@
     <span v-if="editableDataUrl">
       <coscine-form-group
         :mandatory="true"
-        labelFor="dataUrl"
+        label-for="dataUrl"
         :label="$t('page.resource.dataUrl')"
       >
         <b-input-group>
           <b-form-input
             id="dataUrl"
-            @input="updateDataUrl(currentFolderContent, $event)"
             :value="currentFolderContent.dataUrl"
             :placeholder="$t('page.resource.dataUrl')"
             :disabled="resource.archived || readOnly"
+            @input="updateDataUrl(currentFolderContent, $event)"
           />
-          <b-button id="URLBtn" @click="openURL" :disabled="!isValidUrl"
+          <b-button id="URLBtn" :disabled="!isValidUrl" @click="openURL"
             ><b-icon-link-45deg />
           </b-button>
         </b-input-group>
@@ -23,14 +23,14 @@
     <span v-if="editableKey">
       <coscine-form-group
         :mandatory="true"
-        labelFor="metadataKey"
+        label-for="metadataKey"
         :label="$t('page.resource.metadataKey')"
       >
         <b-form-input
-          @change="updateAbsolutePath(currentFolderContent, $event)"
           :value="currentFolderContent.name"
           :placeholder="$t('page.resource.metadataKey')"
           :disabled="resource.archived || readOnly"
+          @change="updateAbsolutePath(currentFolderContent, $event)"
         />
       </coscine-form-group>
     </span>
@@ -47,6 +47,28 @@ import type {
 import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources";
 
 export default defineComponent({
+  props: {
+    currentFolderContent: {
+      required: true,
+      type: [Object] as PropType<FolderContent>,
+    },
+    editableDataUrl: {
+      required: true,
+      type: Boolean,
+    },
+    editableKey: {
+      required: true,
+      type: Boolean,
+    },
+    readOnly: {
+      required: true,
+      type: Boolean,
+    },
+    resource: {
+      required: true,
+      type: [Object] as PropType<ResourceObject>,
+    },
+  },
   computed: {
     isValidUrl(): boolean {
       if (
@@ -74,28 +96,6 @@ export default defineComponent({
       return validUrl.test(url.toString());
     },
   },
-  props: {
-    currentFolderContent: {
-      required: true,
-      type: [Object] as PropType<FolderContent>,
-    },
-    editableDataUrl: {
-      required: true,
-      type: Boolean,
-    },
-    editableKey: {
-      required: true,
-      type: Boolean,
-    },
-    readOnly: {
-      required: true,
-      type: Boolean,
-    },
-    resource: {
-      required: true,
-      type: [Object] as PropType<ResourceObject>,
-    },
-  },
   methods: {
     openURL() {
       if (
diff --git a/src/modules/resource/components/resource-page/metadata/MetadataManagerTable.vue b/src/modules/resource/components/resource-page/metadata/MetadataManagerTable.vue
index abc8293c7b6fc0e1e1c2018b43b0d23d310116b9..557689da3d75b262a4e68ad5268482e6725d3eb1 100644
--- a/src/modules/resource/components/resource-page/metadata/MetadataManagerTable.vue
+++ b/src/modules/resource/components/resource-page/metadata/MetadataManagerTable.vue
@@ -1,41 +1,41 @@
 <template>
   <div>
     <b-row
-      id="metadataManagerShownFilesTable"
       v-show="showDetail || !editableDataUrl || !editableKey"
+      id="metadataManagerShownFilesTable"
     >
       <b-col>
         <b-input-group v-for="(item, index) in shownFiles" :key="index">
           <b-button
-            @click="$emit('changeMetadata', index)"
             variant="outline-secondary"
             :pressed="currentFileId === index"
+            @click="$emit('changeMetadata', index)"
             >{{ index + 1 }}</b-button
           >
           <b-button
-            @click="$emit('changeMetadata', index)"
             class="metadataManagerFileListFileName"
             :pressed="false"
             variant="outline-secondary"
+            @click="$emit('changeMetadata', index)"
             >{{ item.name
             }}<b-spinner v-show="item.uploading" label="Spinning"></b-spinner
           ></b-button>
           <b-button
             class="deleteFolderContentFromList"
-            @click="$emit('removeElement', index)"
             variant="outline-secondary"
             :disabled="item.uploading"
+            @click="$emit('removeElement', index)"
             >X</b-button
           >
         </b-input-group>
       </b-col>
     </b-row>
-    <b-row id="metadataManagerQuickAccess" v-show="shownFiles.length > 1">
+    <b-row v-show="shownFiles.length > 1" id="metadataManagerQuickAccess">
       <b-col>
         <b-button
-          @click="$emit('loadAllFilesTab')"
           :pressed="currentFileId === -1"
           variant="outline-secondary"
+          @click="$emit('loadAllFilesTab')"
           >{{ $t("page.resource.allFiles") }}</b-button
         >
         <span v-if="shownFiles.length > 1 && shownFiles.length <= 10">
@@ -43,9 +43,9 @@
             v-for="(item, index) in shownFiles"
             :key="index"
             :pressed="currentFileId === index"
-            @click="$emit('changeMetadata', index)"
             variant="outline-secondary"
             class="metadataTabButton"
+            @click="$emit('changeMetadata', index)"
             >{{ index + 1 }}</b-button
           >
         </span>
@@ -54,12 +54,12 @@
     <b-row id="metadataManagerFileName" class="text-center">
       <b-col>
         <span
-          class="showSpaces"
           v-if="
             currentFileId >= 0 &&
             currentFileId < shownFiles.length &&
             currentFolderContent
           "
+          class="showSpaces"
         >
           {{ currentFolderContent.name }}
         </span>
@@ -83,6 +83,7 @@ export default defineComponent({
       type: Number,
     },
     currentFolderContent: {
+      default: undefined,
       type: [Object, undefined] as PropType<FolderContent | undefined>,
     },
     editableDataUrl: {
diff --git a/src/modules/resource/components/resource-page/modals/DeleteFolderContentsModal.vue b/src/modules/resource/components/resource-page/modals/DeleteFolderContentsModal.vue
index 066826c37f0d4bafa49e33086eb05e195c97273d..b2276a0dda715d128f882725a1078d7f262c74eb 100644
--- a/src/modules/resource/components/resource-page/modals/DeleteFolderContentsModal.vue
+++ b/src/modules/resource/components/resource-page/modals/DeleteFolderContentsModal.vue
@@ -24,8 +24,8 @@
     <br />
     <b-button
       class="float-left"
-      @click="$emit('close', $event.target.value)"
       autofocus
+      @click="$emit('close', $event.target.value)"
       >{{ $t("buttons.cancel") }}</b-button
     >
     <b-button
diff --git a/src/modules/resource/components/resource-page/modals/SaveDuplicateFilesModal.vue b/src/modules/resource/components/resource-page/modals/SaveDuplicateFilesModal.vue
index c8e42d4612089fe16aa4b10ca97e7ead38b95185..ddeb6207bf34eb404fdef4ab1231a28f2c64c4e8 100644
--- a/src/modules/resource/components/resource-page/modals/SaveDuplicateFilesModal.vue
+++ b/src/modules/resource/components/resource-page/modals/SaveDuplicateFilesModal.vue
@@ -25,8 +25,8 @@
     <div>
       <b-button
         class="float-left"
-        @click="$emit('close', $event.target.value)"
         autofocus
+        @click="$emit('close', $event.target.value)"
         >{{ $t("page.resource.modalSaveDuplicateFilesBtnCancel") }}</b-button
       >
       <b-button
diff --git a/src/modules/resource/components/resource-page/popovers/ValidationPopover.vue b/src/modules/resource/components/resource-page/popovers/ValidationPopover.vue
index 5a3c5e4308a20bd144f1edff823be47e29808eac..cc7b813d021eefc77dbc01845f3cdf629610ccad 100644
--- a/src/modules/resource/components/resource-page/popovers/ValidationPopover.vue
+++ b/src/modules/resource/components/resource-page/popovers/ValidationPopover.vue
@@ -7,7 +7,7 @@
     triggers="hover focus"
     placement="top"
   >
-    <template v-slot:title
+    <template #title
       ><b>{{ $t("page.resource.validationErrors") }}</b></template
     >
     <div>
diff --git a/src/modules/resource/components/settings/Actions.vue b/src/modules/resource/components/settings/Actions.vue
index ff0aeed9fd8044668ab4e5415f8441d2a8880772..b725b2b36a66f117ac638d49cd4671f6259a627e 100644
--- a/src/modules/resource/components/settings/Actions.vue
+++ b/src/modules/resource/components/settings/Actions.vue
@@ -2,26 +2,26 @@
   <div>
     <!-- Archive -->
     <coscine-form-group
-      labelFor="Archive"
+      label-for="Archive"
       :label="$t('page.settings.actions.resourceArchiveLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       class="d-flex align-items-center"
     >
       <b-form-checkbox
         id="Archive"
         v-model="resourceForm.archived"
         :disabled="!(isOwner || isResourceCreator) || !resourceForm"
-        @click.native.prevent="isArchiveModalVisible = true"
         switch
         size="lg"
+        @click.native.prevent="isArchiveModalVisible = true"
       />
     </coscine-form-group>
 
     <!-- Delete Resource -->
     <coscine-form-group
-      labelFor="DeleteResource"
+      label-for="DeleteResource"
       :label="$t('page.settings.actions.resourceDeleteLabel')"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       class="d-flex align-items-center"
     >
       <!-- Delete Button -->
@@ -47,7 +47,7 @@
     <!-- Delete Resource Modal -->
     <DeleteResourceModal
       :open="isDeleteModalVisible"
-      :displayName="resourceForm.displayName"
+      :display-name="resourceForm.displayName"
       @close="isDeleteModalVisible = false"
       @clickDelete="clickDelete"
     />
@@ -64,18 +64,10 @@ import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.
 import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
 
 export default defineComponent({
-  setup() {
-    const projectStore = useProjectStore();
-    const userStore = useUserStore();
-
-    return { projectStore, userStore };
-  },
-
   components: {
     ArchiveResourceModal,
     DeleteResourceModal,
   },
-
   props: {
     value: {
       type: Object as PropType<ResourceObject>,
@@ -86,6 +78,17 @@ export default defineComponent({
       type: Boolean,
     },
   },
+  emits: {
+    toggleArchive: null,
+    clickDelete: null,
+    input: (_: ResourceObject) => null,
+  },
+  setup() {
+    const projectStore = useProjectStore();
+    const userStore = useUserStore();
+
+    return { projectStore, userStore };
+  },
 
   data() {
     return {
@@ -131,12 +134,6 @@ export default defineComponent({
       this.isDeleteModalVisible = false;
     },
   },
-
-  emits: {
-    toggleArchive: null,
-    clickDelete: null,
-    input: (_: ResourceObject) => null,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/components/settings/Configuration.vue b/src/modules/resource/components/settings/Configuration.vue
index 35a7866020c55ae83dbc2980139178210ffe3077..147ea2cd6301e8e9597df23e9631bcd20bade285 100644
--- a/src/modules/resource/components/settings/Configuration.vue
+++ b/src/modules/resource/components/settings/Configuration.vue
@@ -12,7 +12,7 @@
         <!-- Field Definition -->
         <coscine-form-group
           v-if="resourceOption !== 'Id'"
-          :labelFor="resourceOption"
+          :label-for="resourceOption"
           :label="
             $t(
               'page.settings.configuration.resource' + resourceOption + 'Label'
@@ -74,14 +74,13 @@ import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.
 import type { ResourceTypeOption } from "../../types";
 
 export default defineComponent({
+  components: {},
   setup() {
     const resourceStore = useResourceStore();
 
     return { resourceStore };
   },
 
-  components: {},
-
   data() {
     return {
       readonly: true,
diff --git a/src/modules/resource/components/settings/Metadata.vue b/src/modules/resource/components/settings/Metadata.vue
index 87a7d3e0ab2b403f963c1b9eff9d50cd40d9d6ab..a279fe238917192c5ed49d136b8e84601102457a 100644
--- a/src/modules/resource/components/settings/Metadata.vue
+++ b/src/modules/resource/components/settings/Metadata.vue
@@ -7,14 +7,14 @@
     <FormGenerator
       v-else
       :key="resourceForm.applicationProfile"
-      :disabledMode="!isOwner || resource.archived"
-      :fixedValueMode="true"
-      :fixedValues="resourceForm.fixedValues"
-      :applicationProfileId="resourceForm.applicationProfile"
-      :SHACLDefinition="applicationProfileString"
-      :classReceiver="receiveClass"
-      :userReceiver="async () => user"
-      mimeType="application/ld+json"
+      :disabled-mode="!isOwner || resource.archived"
+      :fixed-value-mode="true"
+      :fixed-values="resourceForm.fixedValues"
+      :application-profile-id="resourceForm.applicationProfile"
+      :s-h-a-c-l-definition="applicationProfileString"
+      :class-receiver="receiveClass"
+      :user-receiver="async () => user"
+      mime-type="application/ld+json"
     />
   </div>
 </template>
@@ -31,14 +31,6 @@ import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api
 import type { UserObject } from "@coscine/api-client/dist/types/Coscine.Api.User";
 
 export default defineComponent({
-  setup() {
-    const resourceStore = useResourceStore();
-    const projectStore = useProjectStore();
-    const userStore = useUserStore();
-
-    return { resourceStore, projectStore, userStore };
-  },
-
   props: {
     value: {
       type: Object as PropType<ResourceObject>,
@@ -54,6 +46,18 @@ export default defineComponent({
     },
   },
 
+  emits: {
+    input: (_: ResourceObject) => null,
+  },
+
+  setup() {
+    const resourceStore = useResourceStore();
+    const projectStore = useProjectStore();
+    const userStore = useUserStore();
+
+    return { resourceStore, projectStore, userStore };
+  },
+
   data() {
     return {
       resourceForm: this.value,
@@ -86,10 +90,6 @@ export default defineComponent({
       return await this.resourceStore.getClass(className);
     },
   },
-
-  emits: {
-    input: (_: ResourceObject) => null,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/components/settings/Overview.vue b/src/modules/resource/components/settings/Overview.vue
index d01f1079a4cf884edae201a373ef46466969e2af..65d6b658c8247954a57c40732f61c8fe16de09dc 100644
--- a/src/modules/resource/components/settings/Overview.vue
+++ b/src/modules/resource/components/settings/Overview.vue
@@ -5,9 +5,9 @@
       <!-- Project -->
       <b-col>
         <coscine-form-group
-          labelFor="ProjectName"
+          label-for="ProjectName"
           :label="$t('form.project.projectNameLabel')"
-          :isLoading="!project"
+          :is-loading="!project"
           type="input"
         >
           <b-form-input
@@ -23,9 +23,9 @@
       <!-- Resource Dropdown -->
       <b-col>
         <coscine-form-group
-          labelFor="Resource"
+          label-for="Resource"
           :label="$t('page.settings.overview.resourceLabel')"
-          :isLoading="!resource"
+          :is-loading="!resource"
         >
           <b-form-select
             v-if="resource"
@@ -51,9 +51,9 @@
       <!-- Display Name -->
       <b-col>
         <coscine-form-group
-          labelFor="DisplayName"
+          label-for="DisplayName"
           :label="$t('form.resource.resourceNameLabel')"
-          :isLoading="!resource"
+          :is-loading="!resource"
         >
           <b-form-input
             v-if="resource"
@@ -68,9 +68,9 @@
       <!-- Persistent ID -->
       <b-col>
         <coscine-form-group
-          labelFor="PersistentId"
+          label-for="PersistentId"
           :label="$t('page.settings.overview.persistentIdLabel')"
-          :isLoading="!resource"
+          :is-loading="!resource"
         >
           <b-button-group class="w-100">
             <!-- Text Field -->
@@ -110,9 +110,9 @@
       <!-- Resource Type -->
       <b-col>
         <coscine-form-group
-          labelFor="ResourceType"
+          label-for="ResourceType"
           :label="$t('page.settings.overview.resourceTypeLabel')"
-          :isLoading="!resource"
+          :is-loading="!resource"
           type="input"
         >
           <b-form-input
@@ -131,9 +131,11 @@
       <b-col>
         <coscine-form-group
           v-if="resource && resource.resourceTypeOption.Size"
-          labelFor="Quota"
+          label-for="Quota"
           :label="$t('page.settings.overview.quotaLabel')"
-          :isLoading="!(resource && quotaCurrent >= 0 && quotaCurrent !== null)"
+          :is-loading="
+            !(resource && quotaCurrent >= 0 && quotaCurrent !== null)
+          "
         >
           <b-button-group class="progressContainer h-100 w-100">
             <!-- Progress Bar -->
@@ -175,7 +177,7 @@
 </template>
 
 <script lang="ts">
-import { defineComponent, PropType } from "vue-demi";
+import { defineComponent } from "vue-demi";
 // import the store for current module
 import useResourceStore from "../../store";
 import useProjectStore from "@/modules/project/store";
@@ -185,6 +187,7 @@ import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.P
 import type { RawLocation } from "vue-router";
 
 export default defineComponent({
+  components: {},
   setup() {
     const resourceStore = useResourceStore();
     const projectStore = useProjectStore();
@@ -192,15 +195,6 @@ export default defineComponent({
     return { resourceStore, projectStore };
   },
 
-  components: {},
-
-  props: {
-    value: {
-      type: Object as PropType<ResourceObject>,
-      required: false,
-    },
-  },
-
   data() {
     return {
       readonly: true,
@@ -209,11 +203,6 @@ export default defineComponent({
     };
   },
 
-  created() {
-    // Fill the resource form
-    this.onResourceLoaded();
-  },
-
   computed: {
     project(): ProjectObject | null {
       return this.projectStore.currentProject;
@@ -245,6 +234,11 @@ export default defineComponent({
     },
   },
 
+  created() {
+    // Fill the resource form
+    this.onResourceLoaded();
+  },
+
   methods: {
     onResourceLoaded() {
       if (this.resource) {
diff --git a/src/modules/resource/components/settings/modals/ArchiveResourceModal.vue b/src/modules/resource/components/settings/modals/ArchiveResourceModal.vue
index fcbe449b46fe7f03f1fd7f5fb4f12e2a73a3955f..3c50d7714f4b33df5154064f20fb64bf7f4a5cf5 100644
--- a/src/modules/resource/components/settings/modals/ArchiveResourceModal.vue
+++ b/src/modules/resource/components/settings/modals/ArchiveResourceModal.vue
@@ -1,6 +1,6 @@
 <template>
   <!-- Archive Resource Modal -->
-  <b-modal v-model="isOpen" @close="close" @hidden="hidden" :hide-footer="true">
+  <b-modal v-model="isOpen" :hide-footer="true" @close="close" @hidden="hidden">
     <!-- Title -->
     <template #modal-title>
       <span class="h6">
@@ -17,14 +17,12 @@
       <template #br><br /></template>
     </i18n>
 
-    <template>
-      <!-- Modal Cancel Button -->
-      <b-button @click="close">{{ $t("buttons.cancel") }}</b-button>
-      <!-- Modal Delete Button -->
-      <b-button @click="toggleArchive" variant="primary" class="float-right">
-        {{ $t(`buttons.${action}`) }}
-      </b-button>
-    </template>
+    <!-- Modal Cancel Button -->
+    <b-button @click="close">{{ $t("buttons.cancel") }}</b-button>
+    <!-- Modal Delete Button -->
+    <b-button variant="primary" class="float-right" @click="toggleArchive">
+      {{ $t(`buttons.${action}`) }}
+    </b-button>
   </b-modal>
 </template>
 
@@ -44,6 +42,11 @@ export default defineComponent({
     },
   },
 
+  emits: {
+    toggleArchive: null,
+    close: null,
+  },
+
   data() {
     return {
       isOpen: false,
@@ -76,11 +79,6 @@ export default defineComponent({
       this.$emit("toggleArchive");
     },
   },
-
-  emits: {
-    toggleArchive: null,
-    close: null,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/components/settings/modals/DeleteResourceModal.vue b/src/modules/resource/components/settings/modals/DeleteResourceModal.vue
index 4da11940a68ad0d677419f97e661f2c292bcf902..27f82f8411121b7faad1e747e61ecab11972350d 100644
--- a/src/modules/resource/components/settings/modals/DeleteResourceModal.vue
+++ b/src/modules/resource/components/settings/modals/DeleteResourceModal.vue
@@ -1,6 +1,6 @@
 <template>
   <!-- Delete Resource Modal -->
-  <b-modal v-model="isOpen" @close="close" @hidden="hidden" :hide-footer="true">
+  <b-modal v-model="isOpen" :hide-footer="true" @close="close" @hidden="hidden">
     <!-- Title -->
     <template #modal-title>
       <span class="h6"> {{ $t(titleKey) }} </span>
@@ -29,18 +29,16 @@
       </div>
     </b-form-group>
 
-    <template>
-      <!-- Modal Cancel Button -->
-      <b-button @click="close">{{ $t("buttons.cancel") }}</b-button>
-      <!-- Modal Delete Button -->
-      <b-button
-        @click="clickDelete"
-        variant="danger"
-        class="float-right"
-        :disabled="!nameValid"
-        >{{ $t("buttons.delete") }}</b-button
-      >
-    </template>
+    <!-- Modal Cancel Button -->
+    <b-button @click="close">{{ $t("buttons.cancel") }}</b-button>
+    <!-- Modal Delete Button -->
+    <b-button
+      variant="danger"
+      class="float-right"
+      :disabled="!nameValid"
+      @click="clickDelete"
+      >{{ $t("buttons.delete") }}</b-button
+    >
   </b-modal>
 </template>
 
@@ -68,6 +66,11 @@ export default defineComponent({
     },
   },
 
+  emits: {
+    clickDelete: null,
+    close: null,
+  },
+
   data() {
     return {
       isOpen: false,
@@ -104,11 +107,6 @@ export default defineComponent({
       }
     },
   },
-
-  emits: {
-    clickDelete: null,
-    close: null,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/i18n/de.ts b/src/modules/resource/i18n/de.ts
index 83cbe6ddd81ba0b82c2960994df8407d982edab4..41b6b02b58a0a25664c85b7f3f072c3e8340b954 100644
--- a/src/modules/resource/i18n/de.ts
+++ b/src/modules/resource/i18n/de.ts
@@ -152,7 +152,8 @@ export default {
       modalLeavingPageBtnLeave: "SEITE VERLASSEN",
 
       toastSavingSuccessfulTitle: "Speichern erfolgreich",
-      toastSavingSuccessfulBody: "Zahl der erfolgreich gespeicherten Dateien: ",
+      toastSavingSuccessfulBody:
+        "Zahl der erfolgreich gespeicherten Dateien: {number}",
 
       toastSavingFailedTitle: "Speichern fehlgeschlagen",
       toastSavingFailedBodyTop:
@@ -319,7 +320,7 @@ export default {
 
           toastSavingSuccessfulTitle: "Speichern erfolgreich",
           toastSavingSuccessfulBody:
-            "Zahl der erfolgreich gespeicherten Einträge: ",
+            "Zahl der erfolgreich gespeicherten Einträge: {number}",
 
           toastSavingFailedTitle: "Speichern fehlgeschlagen",
           toastSavingFailedBodyTop:
diff --git a/src/modules/resource/i18n/en.ts b/src/modules/resource/i18n/en.ts
index 39c2f3ae188dff91c0087bd79d417076d708705c..5993f65775556c82f9fd1139a65d35c9076799c6 100644
--- a/src/modules/resource/i18n/en.ts
+++ b/src/modules/resource/i18n/en.ts
@@ -149,11 +149,11 @@ export default {
       modalLeavingPageBtnLeave: "LEAVE CURRENT PAGE",
 
       toastSavingSuccessfulTitle: "Saving file(s) successful",
-      toastSavingSuccessfulBody: "Number of files saved: ",
+      toastSavingSuccessfulBody: "Number of files saved: {number}",
 
       toastSavingFailedTitle: "Saving file(s) failed",
       toastSavingFailedBodyTop:
-        "An error occured while saving the following files:",
+        "An error occurred while saving the following files:",
       toastSavingFailedBodyBottom: "Please try again.",
 
       dataUrl: "Data URL",
@@ -311,11 +311,11 @@ export default {
           modalLeavingPageBodyTop: "These entries are currently saving:",
 
           toastSavingSuccessfulTitle: "Saving entries(s) successful",
-          toastSavingSuccessfulBody: "Number of entries saved: ",
+          toastSavingSuccessfulBody: "Number of entries saved: {number}",
 
           toastSavingFailedTitle: "Saving entry(s) failed",
           toastSavingFailedBodyTop:
-            "An error occured while saving the following entries:",
+            "An error occurred while saving the following entries:",
         },
       },
     },
diff --git a/src/modules/resource/pages/CreateResource.vue b/src/modules/resource/pages/CreateResource.vue
index b2e8f0aa14b480ff8661fb8240f28b8832a0ea1d..0e21d5639c3c01b7628103afa6ab22e6090ba789 100644
--- a/src/modules/resource/pages/CreateResource.vue
+++ b/src/modules/resource/pages/CreateResource.vue
@@ -3,13 +3,13 @@
     <CoscineHeadline :headline="$t('page.createResource.title')" />
 
     <!-- Navigation Tabs -->
-    <b-tabs justified v-model="currentTab" class="mb-4">
+    <b-tabs v-model="currentTab" justified class="mb-4">
       <b-tab
         v-for="(tab, index) in tabs"
         :key="index"
         :disabled="!tab.active"
-        @click.prevent="toTab(tab)"
         :title="tab.title"
+        @click.prevent="toTab(tab)"
       />
     </b-tabs>
 
@@ -20,31 +20,31 @@
         <Configuration
           v-if="currentTab === 0"
           v-model="resource"
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           @valid="setNextTab"
           @next="next"
         />
         <General
           v-else-if="currentTab === 1"
           v-model="resource"
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           :readonly="false"
           @valid="setNextTab"
         />
         <Metadata
           v-else-if="currentTab === 2"
           v-model="resource"
-          :applicationProfileList="groupedAPList"
-          :applicationProfileString="applicationProfileString"
-          :isLoadingFormGenerator="isLoadingFormGenerator"
+          :application-profile-list="groupedAPList"
+          :application-profile-string="applicationProfileString"
+          :is-loading-form-generator="isLoadingFormGenerator"
           @valid="setNextTab"
         />
         <Overview
           v-else-if="currentTab === 3"
           v-model="resource"
           :tabs="tabs"
-          :applicationProfileString="applicationProfileString"
-          :isLoadingFormGenerator="isLoadingFormGenerator"
+          :application-profile-string="applicationProfileString"
+          :is-loading-form-generator="isLoadingFormGenerator"
           @back="back"
           @toTab="toTab"
           @waitingForResponse="isWaitingForResponse = $event"
@@ -52,16 +52,16 @@
 
         <b-form-group v-if="currentTab > 0 && currentTab < tabs.length - 1">
           <!-- Button Back -->
-          <b-button @click.prevent="back" variant="outline-primary"
+          <b-button variant="outline-primary" @click.prevent="back"
             >{{ $t("buttons.back") }}
           </b-button>
 
           <!-- Button Next -->
           <b-button
-            @click.prevent="next"
             class="float-right"
             variant="outline-primary"
             :disabled="!tabs[currentTab + 1].active"
+            @click.prevent="next"
             >{{ $t("buttons.next") }}
           </b-button>
         </b-form-group>
@@ -70,7 +70,7 @@
     </b-row>
 
     <!-- Loading Spinner on Submit -->
-    <LoadingSpinner :isWaitingForResponse="isWaitingForResponse" />
+    <LoadingSpinner :is-waiting-for-response="isWaitingForResponse" />
   </div>
 </template>
 
diff --git a/src/modules/resource/pages/ResourcePage.vue b/src/modules/resource/pages/ResourcePage.vue
index 2817eaf19ed6e31ce1d9f75650ba9c8bb150b0eb..8808567aabf2e48292ab9f18ee097b6ff4c600b3 100644
--- a/src/modules/resource/pages/ResourcePage.vue
+++ b/src/modules/resource/pages/ResourcePage.vue
@@ -7,7 +7,7 @@
     @dragover.prevent=""
     @drop.prevent="uploadDrop"
   >
-    <div class="droppable" v-if="showDroppable && fileAddable">
+    <div v-if="showDroppable && fileAddable" class="droppable">
       <p class="droppableText">{{ $t("page.resource.canDropFile") }}</p>
     </div>
     <coscine-headline
@@ -17,19 +17,19 @@
     <b-form-file
       ref="fileTrigger"
       multiple
-      @input="fileListUploadSelected"
       class="mt-3"
       plain
+      @input="fileListUploadSelected"
     ></b-form-file>
     <span id="filesViewSpan">
       <div id="filesViewCard" :class="isFullscreen == false ? 'card' : ''">
         <div :class="isFullscreen == false ? 'card-body' : ''">
           <FilesView
             ref="filesView"
-            :folderContents="folderContents"
-            :currentFolder="currentFolder"
-            :isUploading="isUploading"
-            :fileListEdit="fileListEdit"
+            :folder-contents="folderContents"
+            :current-folder="currentFolder"
+            :is-uploading="isUploading"
+            :file-list-edit="fileListEdit"
             @showDetail="setShowDetail"
             @currentFolder="setCurrentFolder"
             @folderContents="setFolder"
@@ -46,20 +46,20 @@
     >
       <b-button
         v-show="isFullscreen"
-        squared
         id="metadataManagerToggleFullscreen"
+        squared
         @click="toggleMenu()"
         ><span>{{ $t("page.resource.metadataManager") }}</span></b-button
       >
       <div class="card">
         <div class="card-body">
           <MetadataManager
-            :showDetail="showDetail"
-            :fileListEdit="fileListEdit"
-            :fileListUpload="fileListUpload"
-            :folderContents="folderContents"
-            :currentFolder="currentFolder"
-            :isUploading="isUploading"
+            :show-detail="showDetail"
+            :file-list-edit="fileListEdit"
+            :file-list-upload="fileListUpload"
+            :folder-contents="folderContents"
+            :current-folder="currentFolder"
+            :is-uploading="isUploading"
             @emptyFileLists="emptyFileLists"
             @folderContents="setFolder"
             @removeElement="removeElement"
@@ -93,7 +93,7 @@
         </div>
       </div>
     </div>
-    <LoadingSpinner :isWaitingForResponse="isWaitingForResponse" />
+    <LoadingSpinner :is-waiting-for-response="isWaitingForResponse" />
   </div>
 </template>
 
@@ -126,6 +126,10 @@ import type {
 import type { BFormFile, BTable } from "bootstrap-vue";
 
 export default defineComponent({
+  components: {
+    FilesView,
+    MetadataManager,
+  },
   setup() {
     const mainStore = useMainStore();
     const resourceStore = useResourceStore();
@@ -134,6 +138,25 @@ export default defineComponent({
     return { mainStore, resourceStore, projectStore };
   },
 
+  data() {
+    return {
+      isWaitingForResponse: false,
+      fileListEdit: [] as FolderContent[],
+      showDetail: false,
+      fileListUpload: [] as FileInformation[],
+      folderContents: [] as FolderContent[],
+      currentFolder:
+        window.location.hash.indexOf("#") !== -1
+          ? window.location.hash.substring(1)
+          : "/",
+      dragCounter: 0,
+
+      isFullscreen: false,
+      isMetadataManagerHidden: false,
+      isUploading: false,
+    };
+  },
+
   computed: {
     project(): null | ProjectObject {
       return this.projectStore.currentProject;
@@ -160,25 +183,6 @@ export default defineComponent({
       return this.dragCounter > 0;
     },
   },
-
-  data() {
-    return {
-      isWaitingForResponse: false,
-      fileListEdit: [] as FolderContent[],
-      showDetail: false,
-      fileListUpload: [] as FileInformation[],
-      folderContents: [] as FolderContent[],
-      currentFolder:
-        window.location.hash.indexOf("#") !== -1
-          ? window.location.hash.substring(1)
-          : "/",
-      dragCounter: 0,
-
-      isFullscreen: false,
-      isMetadataManagerHidden: false,
-      isUploading: false,
-    };
-  },
   watch: {
     resourceTypeInformation() {
       this.emptyFileLists();
@@ -343,10 +347,6 @@ export default defineComponent({
       }
     },
   },
-  components: {
-    FilesView,
-    MetadataManager,
-  },
 });
 </script>
 
diff --git a/src/modules/resource/pages/Settings.vue b/src/modules/resource/pages/Settings.vue
index de0b6837c685ea748f9cc23bd3644a9bb349cb32..529d9b35e3c7291b0f10973057d522db7ca13cf0 100644
--- a/src/modules/resource/pages/Settings.vue
+++ b/src/modules/resource/pages/Settings.vue
@@ -6,13 +6,13 @@
     <Overview />
 
     <!-- Navigation Tabs -->
-    <b-tabs justified v-model="currentTab" class="my-4" v-if="resource">
+    <b-tabs v-if="resource" v-model="currentTab" justified class="my-4">
       <b-tab
         v-for="(tab, index) in tabs"
         :key="index"
         :disabled="!tab.active"
-        @click.prevent="toTab(tab)"
         :title="tab.title"
+        @click.prevent="toTab(tab)"
       />
     </b-tabs>
     <b-row v-else align-h="center" class="my-4">
@@ -26,7 +26,7 @@
     <General
       v-show="tabs[currentTab].step === 'general'"
       v-model="resourceForm"
-      :isLoading="isLoading"
+      :is-loading="isLoading"
       :readonly="false"
       @validation="validation = $event"
     />
@@ -35,8 +35,8 @@
     <Metadata
       v-show="tabs[currentTab].step === 'metadata'"
       v-model="resourceForm"
-      :applicationProfileString="applicationProfileString"
-      :isLoadingFormGenerator="isLoading"
+      :application-profile-string="applicationProfileString"
+      :is-loading-form-generator="isLoading"
       @clickSave="clickSave"
     />
 
@@ -53,17 +53,17 @@
     <b-form-group>
       <b-button
         v-if="confirmButtonVisibility"
-        @click.prevent="clickSave"
         :disabled="!validResourceForm"
         class="float-right"
         variant="primary"
+        @click.prevent="clickSave"
       >
         {{ $t("buttons.confirm") }}
       </b-button>
     </b-form-group>
 
     <!-- Loading Spinner on Submit -->
-    <LoadingSpinner :isWaitingForResponse="isWaitingForResponse" />
+    <LoadingSpinner :is-waiting-for-response="isWaitingForResponse" />
   </div>
 </template>
 
@@ -86,15 +86,9 @@ import type {
 import type { ResourceCreationTab, ResourceTypeOption } from "../types";
 import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 import type { Validation } from "vuelidate";
+import useNotificationStore from "@/store/notification";
 
 export default defineComponent({
-  setup() {
-    const resourceStore = useResourceStore();
-    const projectStore = useProjectStore();
-
-    return { resourceStore, projectStore };
-  },
-
   components: {
     Overview,
     Configuration,
@@ -102,6 +96,13 @@ export default defineComponent({
     Metadata,
     Actions,
   },
+  setup() {
+    const resourceStore = useResourceStore();
+    const projectStore = useProjectStore();
+    const notificationStore = useNotificationStore();
+
+    return { resourceStore, projectStore, notificationStore };
+  },
 
   data() {
     return {
@@ -239,20 +240,6 @@ export default defineComponent({
       }
     },
 
-    makeToast(
-      text = "Message",
-      givenTitle = "Title",
-      variant: string | undefined = undefined
-    ) {
-      this.$root.$bvToast.toast(text, {
-        title: givenTitle,
-        autoHideDelay: 5000,
-        toaster: "b-toaster-bottom-right",
-        variant: variant,
-        noCloseButton: true,
-      });
-    },
-
     async clickSave() {
       this.isWaitingForResponse = true;
       const success = await this.resourceStore.updateResource(
@@ -265,17 +252,17 @@ export default defineComponent({
         if (this.resource && this.resource.id) {
           await this.resourceStore.retrieveResource(this.resource.id);
         }
-        this.makeToast(
-          this.$t("toast.onSave.success.message").toString(),
-          this.$t("toast.onSave.success.title").toString()
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("toast.onSave.success.title").toString(),
+          body: this.$t("toast.onSave.success.message").toString(),
+        });
       } else {
         // On Failure
-        this.makeToast(
-          this.$t("toast.onSave.failure.message").toString(),
-          this.$t("toast.onSave.failure.title").toString(),
-          "danger"
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("toast.onSave.failure.title").toString(),
+          body: this.$t("toast.onSave.failure.message").toString(),
+          variant: "danger",
+        });
       }
       this.isWaitingForResponse = false;
     },
@@ -295,17 +282,21 @@ export default defineComponent({
             await this.resourceStore.retrieveResource(this.resource.id);
           }
           const action = !this.resource.archived ? "unarchive" : "archive";
-          this.makeToast(
-            this.$t(`page.settings.actions.${action}.toast.body`).toString(),
-            this.$t(`page.settings.actions.${action}.toast.title`).toString()
-          );
+          this.notificationStore.postNotification({
+            title: this.$t(
+              `page.settings.actions.${action}.toast.title`
+            ).toString(),
+            body: this.$t(
+              `page.settings.actions.${action}.toast.body`
+            ).toString(),
+          });
         } else {
           // On Failure
-          this.makeToast(
-            this.$t("toast.onSave.failure.message").toString(),
-            this.$t("toast.onSave.failure.title").toString(),
-            "danger"
-          );
+          this.notificationStore.postNotification({
+            title: this.$t("toast.onSave.failure.title").toString(),
+            body: this.$t("toast.onSave.failure.message").toString(),
+            variant: "danger",
+          });
         }
         this.isWaitingForResponse = false;
       }
@@ -321,18 +312,18 @@ export default defineComponent({
         const parentProject = this.project;
         // Refresh the project information in the store
         await this.projectStore.refreshProjectInformation(parentProject);
-        this.makeToast(
-          this.$t("toast.onDelete.success.message").toString(),
-          this.$t("toast.onDelete.success.title").toString()
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("toast.onDelete.success.title").toString(),
+          body: this.$t("toast.onDelete.success.message").toString(),
+        });
         navigateToProject(parentProject);
       } else {
         // On Failure
-        this.makeToast(
-          this.$t("toast.onDelete.failure.message").toString(),
-          this.$t("toast.onDelete.failure.title").toString(),
-          "danger"
-        );
+        this.notificationStore.postNotification({
+          title: this.$t("toast.onDelete.failure.title").toString(),
+          body: this.$t("toast.onDelete.failure.message").toString(),
+          variant: "danger",
+        });
       }
       this.isWaitingForResponse = false;
     },
diff --git a/src/modules/resource/store.ts b/src/modules/resource/store.ts
index 4725aaeaac3d348e10e4c8b366e98ff95c3a8c6a..8f9ed9e686158c52e77ed658dfeaceb18da9b3bc 100644
--- a/src/modules/resource/store.ts
+++ b/src/modules/resource/store.ts
@@ -4,7 +4,6 @@ import type {
   ResourceState,
   VisitedResourceObject,
 } from "./types";
-import { StatusCodes } from "http-status-codes";
 import { reactive } from "vue-demi";
 
 import {
@@ -20,6 +19,8 @@ import { useLocalStorage } from "@vueuse/core";
 import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api.Metadata";
 import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
 import { updatedDiff } from "deep-object-diff";
+import useNotificationStore from "@/store/notification";
+import type { AxiosError } from "axios";
 /*  
   Store variable name is "this.<id>Store"
     id: "resource" --> this.resourceStore
@@ -85,69 +86,84 @@ export const useResourceStore = defineStore({
   */
   actions: {
     async retrieveResource(id: string) {
-      const apiResponse = await ResourceApi.resourceGet(id);
-      if (apiResponse.status === StatusCodes.OK) {
-        const resource: ResourceObject = apiResponse.data;
-        this.addResourceAsVisited(resource);
-      } else {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await ResourceApi.resourceGet(id);
+        this.addResourceAsVisited(apiResponse.data as ResourceObject);
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveApplicationProfile(resource: VisitedResourceObject) {
-      if (resource.applicationProfile) {
-        const apiResponse = await MetadataApi.metadataGetProfile(
-          resource.applicationProfile
-        );
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource.applicationProfile) {
+          const apiResponse = await MetadataApi.metadataGetProfile(
+            resource.applicationProfile
+          );
           resource.fullApplicationProfile = apiResponse.data;
         } else {
-          // Handle other Status Codes
+          console.error("Resource's application profile may be undefined.");
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async getApplicationProfile(
       applicationProfile: string
     ): Promise<ApplicationProfile> {
-      const apiResponse = await MetadataApi.metadataGetProfile(
-        applicationProfile
-      );
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await MetadataApi.metadataGetProfile(
+          applicationProfile
+        );
         return apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return [];
       }
     },
 
     async getApplicationProfilesList(): Promise<string[] | undefined> {
-      const apiResponse = await MetadataApi.metadataGetProfiles();
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await MetadataApi.metadataGetProfiles();
         return apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveUsedQuota(resource: VisitedResourceObject) {
-      if (resource.id) {
-        const apiResponse = await BlobApi.blobGetQuota(resource.id);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource.id) {
+          const apiResponse = await BlobApi.blobGetQuota(resource.id);
           resource.usedQuota = Number(apiResponse.data.data.usedSizeByte);
         } else {
-          // Handle other Status Codes
+          console.error("Selected resource's ID is undefined.");
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
     async retrieveResourceTypes() {
-      const apiResponse =
-        await ResourceTypeApi.resourceTypeGetEnabledResourceTypes();
-      if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse =
+          await ResourceTypeApi.resourceTypeGetEnabledResourceTypes();
         this.resourceTypes = apiResponse.data;
-      } else {
+      } catch (error) {
         // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
 
@@ -155,38 +171,38 @@ export const useResourceStore = defineStore({
       project: ProjectObject,
       resource: ResourceObject
     ): Promise<ResourceObject | null> {
-      if (project.id) {
-        const apiResponse = await ResourceApi.resourceStoreToProject(
-          project.id,
-          resource
-        );
-        if (apiResponse.status === StatusCodes.OK) {
-          const createdResource: ResourceObject = apiResponse.data;
-          return createdResource;
+      const notificationStore = useNotificationStore();
+      try {
+        if (project.id) {
+          const apiResponse = await ResourceApi.resourceStoreToProject(
+            project.id,
+            resource
+          );
+          return apiResponse.data as ResourceObject;
         } else {
-          // Handle other Status Codes
+          console.error("Selected project's ID is undefined.");
           return null;
         }
-      } else {
-        console.error("Selected project's ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return null;
       }
     },
 
     async updateResource(resource: ResourceObject): Promise<boolean> {
-      if (resource.id) {
-        const apiResponse = await ResourceApi.resourceUpdate(
-          resource.id,
-          resource
-        );
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource.id) {
+          await ResourceApi.resourceUpdate(resource.id, resource);
           return true;
         } else {
-          // Handle other Status Codes
+          console.error("Selected resource's ID is undefined.");
           return false;
         }
-      } else {
-        console.error("Selected resource's ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return false;
       }
     },
@@ -195,34 +211,35 @@ export const useResourceStore = defineStore({
       resource: ResourceObject,
       status: boolean
     ): Promise<boolean> {
-      if (resource.id) {
-        const apiResponse = await ResourceApi.resourceSetResourceReadonly(
-          resource.id,
-          status
-        );
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource.id) {
+          await ResourceApi.resourceSetResourceReadonly(resource.id, status);
           return true;
         } else {
-          // Handle other Status Codes
+          console.error("Selected resource's ID is undefined.");
           return false;
         }
-      } else {
-        console.error("Selected resource's ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return false;
       }
     },
 
     async deleteResource(resource: ResourceObject): Promise<boolean> {
-      if (resource.id) {
-        const apiResponse = await ResourceApi.resourceDelete(resource.id);
-        if (apiResponse.status === StatusCodes.OK) {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource.id) {
+          await ResourceApi.resourceDelete(resource.id);
           return true;
         } else {
-          // Handle other Status Codes
+          console.error("Selected resource's ID is undefined.");
           return false;
         }
-      } else {
-        console.error("Selected resource's ID is undefined.");
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
         return false;
       }
     },
@@ -275,32 +292,40 @@ export const useResourceStore = defineStore({
       resource: ResourceObject | null,
       absoluteFilePath: string
     ) {
-      if (resource && resource.id) {
-        try {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource && resource.id) {
           await BlobApi.blobDeleteFileWithParameter(
             resource.id,
             absoluteFilePath
           );
           return true;
-        } catch {
+        } else {
+          console.error("Selected resource or its ID is undefined.");
           return false;
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+        return false;
       }
-      return false;
     },
 
     async getClass(className: string): Promise<BilingualLabels> {
-      if (!this.classes[className]) {
-        try {
+      const notificationStore = useNotificationStore();
+      try {
+        if (!this.classes[className]) {
           const response = await MetadataApi.metadataGetClassInstances(
             className
           );
           this.classes[className] = response.data;
-        } catch {
-          return {};
         }
+        return this.classes[className];
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+        return {};
       }
-      return this.classes[className];
     },
 
     async getFile(
@@ -308,8 +333,9 @@ export const useResourceStore = defineStore({
       absoluteFilePath: string,
       asBlob = false
     ) {
-      if (resource && resource.id) {
-        try {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource && resource.id) {
           const response = await BlobApi.blobGetFileWithParameter(
             resource.id,
             absoluteFilePath,
@@ -320,29 +346,38 @@ export const useResourceStore = defineStore({
               : undefined
           );
           return response.data;
-        } catch {
+        } else {
+          console.error("Selected resource or its ID is undefined.");
           return null;
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+        return null;
       }
-      return null;
     },
 
     async getMetadata(
       resource: ResourceObject | null,
       absoluteFilePath: string
     ) {
-      if (resource && resource.id) {
-        try {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource && resource.id) {
           const response = await TreeApi.treeGetMetadataWithParameter(
             resource.id,
             absoluteFilePath
           );
           return response.data;
-        } catch {
+        } else {
+          console.error("Selected resource or its ID is undefined.");
           return null;
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+        return null;
       }
-      return null;
     },
 
     async storeFile(
@@ -351,8 +386,9 @@ export const useResourceStore = defineStore({
       files: Blob[],
       options?: unknown
     ) {
-      if (resource && resource.id) {
-        try {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource && resource.id) {
           await BlobApi.blobUploadFileWithParameter(
             resource.id,
             absoluteFilePath,
@@ -360,11 +396,15 @@ export const useResourceStore = defineStore({
             options
           );
           return true;
-        } catch {
+        } else {
+          console.error("Selected resource or its ID is undefined.");
           return false;
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+        return false;
       }
-      return false;
     },
 
     async storeMetadata(
@@ -372,19 +412,24 @@ export const useResourceStore = defineStore({
       absoluteFilePath: string,
       body: unknown
     ) {
-      if (resource && resource.id) {
-        try {
+      const notificationStore = useNotificationStore();
+      try {
+        if (resource && resource.id) {
           await TreeApi.treeStoreMetadataForFileWithParameter(
             resource.id,
             absoluteFilePath,
             { data: body }
           );
           return true;
-        } catch {
+        } else {
+          console.error("Selected resource or its ID is undefined.");
           return false;
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+        return false;
       }
-      return false;
     },
   },
 });
diff --git a/src/modules/search/SearchModule.vue b/src/modules/search/SearchModule.vue
index 1f4cb8d196f3a365d1c5439d6a2d32b84f6ebd84..f72415930c27a674fad16ee283fd9adb2261c0f9 100644
--- a/src/modules/search/SearchModule.vue
+++ b/src/modules/search/SearchModule.vue
@@ -1,6 +1,9 @@
 <template>
   <div>
     <router-view v-if="moduleIsReady" />
+    <b-row v-else align-h="center" class="my-4">
+      <b-spinner variant="secondary" />
+    </b-row>
   </div>
 </template>
 
@@ -20,16 +23,16 @@ export default defineComponent({
     return { mainStore, searchStore };
   },
 
-  created() {
-    this.initialize();
-  },
-
   computed: {
     moduleIsReady(): boolean {
       return true;
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
       // do initialization stuff (e.g. API calls, element loading, etc.)
diff --git a/src/modules/search/pages/Search.vue b/src/modules/search/pages/Search.vue
index c6c0de5cd8499d7a8af720ab11e0a6428b184af8..444fa78ce18188b59478c17066f952f1f59638e2 100644
--- a/src/modules/search/pages/Search.vue
+++ b/src/modules/search/pages/Search.vue
@@ -16,7 +16,7 @@
               :placeholder="$t('page.search.search')"
             ></b-form-input>
           </b-col>
-          <b-col sm="2" id="selectProjCol" align-self="center" class="pl-0">
+          <b-col id="selectProjCol" sm="2" align-self="center" class="pl-0">
             <b-form-select v-model="selectProjValue">
               <template #first>
                 <b-form-select-option :value="null" disabled
@@ -25,7 +25,7 @@
               </template>
             </b-form-select>
           </b-col>
-          <b-col sm="2" id="selectResCol" align-self="center" class="pl-0">
+          <b-col id="selectResCol" sm="2" align-self="center" class="pl-0">
             <b-form-select v-model="selectResValue">
               <template #first>
                 <b-form-select-option :value="null" disabled
@@ -64,16 +64,16 @@
               no-outer-focus
               class="border-0 bg-transparent"
             >
-              <template v-slot="{ tags, removeTag }">
+              <template #default="{ tags, removeTag }">
                 <div>
                   <b-form-tag
                     v-for="tag in tags"
-                    @remove="removeTag(tag)"
                     :key="tag"
                     :title="tag"
                     variant="primary"
                     pill
                     class="mr-1"
+                    @remove="removeTag(tag)"
                     >{{ tag }}
                   </b-form-tag>
                 </div>
@@ -188,6 +188,10 @@ import type {
 import type { SearchResult } from "@coscine/api-client/dist/types/Coscine.Api.Search";
 
 export default defineComponent({
+  components: {
+    Result,
+    Sidebar,
+  },
   setup() {
     const mainStore = useMainStore();
     const searchStore = useSearchStore();
@@ -212,11 +216,6 @@ export default defineComponent({
     };
   },
 
-  components: {
-    Result,
-    Sidebar,
-  },
-
   computed: {
     paginationTotalRows(): number {
       if (this.searchResults !== null) {
diff --git a/src/modules/search/pages/components/Result.vue b/src/modules/search/pages/components/Result.vue
index e161120c4077e5aa066f2ab9720b3a9d8fbdee20..c3a42483b29ba9fe9850503e21c56d64fb8bd449 100644
--- a/src/modules/search/pages/components/Result.vue
+++ b/src/modules/search/pages/components/Result.vue
@@ -40,6 +40,12 @@ import type {
 } from "../../types";
 
 export default defineComponent({
+  props: {
+    result: {
+      required: true,
+      type: Object as PropType<EnhancedOldSearchResult | EnhancedSearchResult>,
+    },
+  },
   setup() {
     const mainStore = useMainStore();
     const searchStore = useSearchStore();
@@ -49,12 +55,6 @@ export default defineComponent({
   data() {
     return {};
   },
-  props: {
-    result: {
-      required: true,
-      type: Object as PropType<EnhancedOldSearchResult | EnhancedSearchResult>,
-    },
-  },
   computed: {
     archived(): boolean {
       // We don't get this information currently without specifically querying it
diff --git a/src/modules/search/routes.ts b/src/modules/search/routes.ts
index a34aa3d1cbb4ce43d267845252c6b3a4d7182e08..1ca3d091f51089e447a439a41368c9459ab46a6a 100644
--- a/src/modules/search/routes.ts
+++ b/src/modules/search/routes.ts
@@ -10,7 +10,6 @@ export const SearchRoutes: RouteConfig[] = [
     path: "/search",
     component: SearchModule,
     meta: {
-      breadCrumb: "search",
       i18n: SearchI18nMessages,
     },
     children: [
@@ -18,6 +17,9 @@ export const SearchRoutes: RouteConfig[] = [
         path: "/",
         name: "search",
         component: Search,
+        meta: {
+          breadCrumb: "search",
+        },
       },
     ],
   },
diff --git a/src/modules/user/UserModule.vue b/src/modules/user/UserModule.vue
index d8ae5577583f500ea49272bc22496c17934f8764..bb0697aec4e730be386ebf20e29ac3087189d036 100644
--- a/src/modules/user/UserModule.vue
+++ b/src/modules/user/UserModule.vue
@@ -1,6 +1,9 @@
 <template>
   <div>
     <router-view v-if="moduleIsReady" />
+    <b-row v-else align-h="center" class="my-4">
+      <b-spinner variant="secondary" />
+    </b-row>
   </div>
 </template>
 
@@ -11,17 +14,15 @@ import { defineComponent } from "vue-demi";
 import useUserStore from "./store";
 // import the main store
 import useMainStore from "@/store/index";
+import useProjectStore from "../project/store";
 
 export default defineComponent({
   setup() {
     const mainStore = useMainStore();
+    const projectStore = useProjectStore();
     const userStore = useUserStore();
 
-    return { mainStore, userStore };
-  },
-
-  created() {
-    this.initialize();
+    return { mainStore, projectStore, userStore };
   },
 
   computed: {
@@ -36,6 +37,10 @@ export default defineComponent({
     },
   },
 
+  created() {
+    this.initialize();
+  },
+
   methods: {
     async initialize() {
       await Promise.all([
diff --git a/src/modules/user/i18n/de.ts b/src/modules/user/i18n/de.ts
index 55ed3ed95eca881a48c9def8bf875dd3b1349717..5034c8a12a65ac37bf2e7606dbbaa1fefd5dfc56 100644
--- a/src/modules/user/i18n/de.ts
+++ b/src/modules/user/i18n/de.ts
@@ -98,7 +98,7 @@ export default {
         },
 
         userPreferences: {
-          header: "Benutzer Voreinstellungen",
+          header: "Nutzerpräferenzen",
           language: "Sprache",
 
           labels: {
diff --git a/src/modules/user/pages/UserProfile.vue b/src/modules/user/pages/UserProfile.vue
index 399a70cd1c8bd368c6b4f487f3a8f728771fe089..53d07a4e2e329d4ec8094dc39e973c991545863c 100644
--- a/src/modules/user/pages/UserProfile.vue
+++ b/src/modules/user/pages/UserProfile.vue
@@ -9,11 +9,11 @@
         />
         <!-- Title -->
         <coscine-form-group
-          labelFor="title"
+          label-for="title"
           :label="
             $t('page.userprofile.form.personalInformation.labels.titleLabel')
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="input"
         >
           <multiselect
@@ -28,7 +28,7 @@
                 'page.userprofile.form.personalInformation.multiselect.placeholderTitle'
               )
             "
-            :selectLabel="
+            :select-label="
               $t(
                 'page.userprofile.form.personalInformation.multiselect.selectEnter'
               )
@@ -49,13 +49,13 @@
         <!-- Given Name -->
         <coscine-form-group
           :mandatory="true"
-          labelFor="givenname"
+          label-for="givenname"
           :label="
             $t(
               'page.userprofile.form.personalInformation.labels.givenNameLabel'
             )
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="input"
         >
           <b-form-input
@@ -70,11 +70,11 @@
         <!-- Surname -->
         <coscine-form-group
           :mandatory="true"
-          labelFor="surname"
+          label-for="surname"
           :label="
             $t('page.userprofile.form.personalInformation.labels.surnameLabel')
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="input"
         >
           <b-form-input
@@ -89,11 +89,11 @@
         <!-- Email -->
         <coscine-form-group
           :mandatory="true"
-          labelFor="Email"
+          label-for="Email"
           :label="
             $t('page.userprofile.form.personalInformation.labels.emailLabel')
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="input"
         >
           <b-form-input
@@ -109,13 +109,13 @@
         <!-- Organization -->
         <coscine-form-group
           :mandatory="true"
-          labelFor="organization"
+          label-for="organization"
           :label="
             $t(
               'page.userprofile.form.personalInformation.labels.organizationLabel'
             )
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="input"
         >
           <multiselect
@@ -166,13 +166,13 @@
         <!-- Institute -->
         <coscine-form-group
           :mandatory="true"
-          labelFor="institute"
+          label-for="institute"
           :label="
             $t(
               'page.userprofile.form.personalInformation.labels.instituteLabel'
             )
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="input"
         >
           <b-form-input
@@ -203,13 +203,13 @@
         <!-- Discipline -->
         <coscine-form-group
           :mandatory="true"
-          labelFor="Discipline"
+          label-for="Discipline"
           :label="
             $t(
               'page.userprofile.form.personalInformation.labels.disciplineLabel'
             )
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="input"
         >
           <multiselect
@@ -248,27 +248,23 @@
         />
         <coscine-form-group
           :mandatory="true"
-          labelFor="language"
+          label-for="language"
           :label="
             $t('page.userprofile.form.userPreferences.labels.languageLabel')
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="button"
         >
           <b-form-radio-group
-            class="bv-no-focus-ring"
             id="language"
-            @change="
-              ($event) => (this.$v.form.language.$model = { id: $event })
-            "
-            :checked="
-              this.form.language !== undefined ? this.form.language.id : false
-            "
+            class="bv-no-focus-ring"
+            :checked="form.language !== undefined ? form.language.id : false"
             :options="languages"
             name="radios-stacked"
             text-field="displayName"
             value-field="id"
             stacked
+            @change="($event) => ($v.form.language.$model = { id: $event })"
           ></b-form-radio-group>
         </coscine-form-group>
 
@@ -282,15 +278,15 @@
           :label="
             $t('page.userprofile.form.connectedAccounts.labels.orcidLabel')
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="button"
         >
           <b-button
             variant="secondary"
             class="float-left"
             name="orcidConnect"
-            @click.prevent="clickConnect('orcid')"
             :disabled="orcidConnected"
+            @click.prevent="clickConnect('orcid')"
             >{{
               orcidConnected ? $t("buttons.connected") : $t("buttons.connect")
             }}</b-button
@@ -301,15 +297,15 @@
           :label="
             $t('page.userprofile.form.connectedAccounts.labels.shibbolethLabel')
           "
-          :isLoading="isLoading"
+          :is-loading="isLoading"
           type="button"
         >
           <b-button
             variant="secondary"
             class="float-left"
             name="shibbolethConnect"
-            @click.prevent="clickConnect('shibboleth')"
             :disabled="shibbolethConnected"
+            @click.prevent="clickConnect('shibboleth')"
             >{{
               shibbolethConnected
                 ? $t("buttons.connected")
@@ -321,17 +317,17 @@
         <!-- Save Button -->
         <coscine-form-group>
           <b-button
+            ref="saveBtn"
             type="submit"
             variant="primary"
             class="float-right"
             name="save"
-            ref="saveBtn"
-            @click.prevent="clickSave"
             :disabled="$v.form.$invalid || savingProfile || !$v.form.$anyDirty"
+            @click.prevent="clickSave"
           >
             <b-iconstack
-              animation="spin"
               v-if="savingProfile"
+              animation="spin"
               aria-hidden="true"
             >
               <b-icon
@@ -374,9 +370,9 @@ import { defineComponent } from "vue-demi";
 import { validationMixin } from "vuelidate";
 import { required, email } from "vuelidate/lib/validators";
 import { clone } from "lodash";
-import CoscineFormGroup from "@/components/CoscineFormGroup.vue";
+import CoscineFormGroup from "@/components/coscine/CoscineFormGroup.vue";
 import AccessToken from "./components/AccessToken.vue";
-import CoscineHeadline from "@/components/CoscineHeadline.vue";
+import CoscineHeadline from "@/components/coscine/CoscineHeadline.vue";
 
 import "@/plugins/deprecated/vue-multiselect";
 
@@ -392,20 +388,22 @@ import type {
   UserObject,
 } from "@coscine/api-client/dist/types/Coscine.Api.User";
 import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Project";
+import useNotificationStore from "@/store/notification";
 
 export default defineComponent({
-  setup() {
-    const mainStore = useMainStore();
-    const userStore = useUserStore();
-
-    return { mainStore, userStore };
-  },
   components: {
     AccessToken,
     CoscineFormGroup,
     CoscineHeadline,
   },
   mixins: [validationMixin],
+  setup() {
+    const mainStore = useMainStore();
+    const userStore = useUserStore();
+    const notificationStore = useNotificationStore();
+
+    return { mainStore, userStore, notificationStore };
+  },
   validations: {
     form: {
       title: {},
@@ -448,15 +446,13 @@ export default defineComponent({
     },
     emailHint(): string {
       if (!this.form.emailAddress) {
-        return this.$parent
-          .$t("page.userprofile.form.personalInformation.emailChange.noAddress")
-          .toString();
+        return this.$t(
+          "page.userprofile.form.personalInformation.emailChange.noAddress"
+        ).toString();
       } else if (this.contactChange !== null && this.contactChange.length > 0) {
-        return this.$parent
-          .$t(
-            "page.userprofile.form.personalInformation.emailChange.pendingConfirmation"
-          )
-          .toString();
+        return this.$t(
+          "page.userprofile.form.personalInformation.emailChange.pendingConfirmation"
+        ).toString();
       }
       return "";
     },
@@ -560,44 +556,33 @@ export default defineComponent({
             this.userStore.retrieveContactChange(),
             this.userStore.retrieveUser(),
           ]);
-          this.makeToast(
-            this.$parent
-              .$t(
-                "page.userprofile.form.personalInformation.emailChange.changedMessage"
-              )
-              .toString(),
-            this.$parent
-              .$t(
-                "page.userprofile.form.personalInformation.emailChange.changedTitle"
-              )
-              .toString()
-          );
+          this.notificationStore.postNotification({
+            title: this.$t(
+              "page.userprofile.form.personalInformation.emailChange.changedTitle"
+            ).toString(),
+            body: this.$t(
+              "page.userprofile.form.personalInformation.emailChange.changedMessage"
+            ).toString(),
+          });
         }
         try {
           await this.userStore.updateUser(this.form);
           this.$v.form.$reset();
-          this.makeToast(
-            this.$t("toast.onSave.success.message").toString(),
-            this.$t("toast.onSave.success.title").toString()
-          );
+          this.notificationStore.postNotification({
+            title: this.$t("toast.onSave.success.title").toString(),
+            body: this.$t("toast.onSave.success.message").toString(),
+          });
         } catch {
-          this.makeToast(
-            this.$t("toast.onSave.failure.message").toString(),
-            this.$t("toast.onSave.failure.title").toString()
-          );
+          this.notificationStore.postNotification({
+            title: this.$t("toast.onSave.failure.title").toString(),
+            body: this.$t("toast.onSave.failure.message").toString(),
+            variant: "danger",
+          });
         } finally {
           this.savingProfile = false;
         }
       }
     },
-    makeToast(text = "Message", givenTitle = "title") {
-      this.$root.$bvToast.toast(text, {
-        title: givenTitle,
-        autoHideDelay: 5000,
-        toaster: "b-toaster-bottom-right",
-        noCloseButton: true,
-      });
-    },
     triggerFetchOptions(search: string) {
       clearTimeout(this.queryTimer);
       if (search.length < 3) {
diff --git a/src/modules/user/pages/components/AccessToken.vue b/src/modules/user/pages/components/AccessToken.vue
index d05e76b06d70e0297dc90cda3d456bace04ce301..4d4f77d5cdbbce2c4ba7ead21426fca82ef4c590 100644
--- a/src/modules/user/pages/components/AccessToken.vue
+++ b/src/modules/user/pages/components/AccessToken.vue
@@ -13,14 +13,16 @@
             v-model="$v.token.AccessToken.$model"
             :readonly="true"
           />
-          <b-button id="copyButton" @click="copyToken" style="margin: inherit"
-            ><b-icon-clipboard
-          /></b-button>
-          <b-tooltip ref="tooltip" target="copyButton" triggers="focus">{{
-            $t(
-              "page.userprofile.form.accessToken.modal.createToken.copyToClipboard"
-            )
-          }}</b-tooltip>
+          <b-button id="copyButton" style="margin: inherit" @click="copyToken">
+            <b-icon-clipboard />
+          </b-button>
+          <b-tooltip ref="tooltip" target="copyButton" triggers="focus">
+            {{
+              $t(
+                "page.userprofile.form.accessToken.modal.createToken.copyToClipboard"
+              )
+            }}
+          </b-tooltip>
         </b-button-group>
       </div>
       <template #buttons>
@@ -40,16 +42,15 @@
     >
       <br />
       <div class="revoke-modal-content">{{ selectedTokenName }}</div>
-      <br />
       <template #buttons>
-        <b-button name="close" @click="isRevokeModalVisible = false">{{
-          $t("buttons.cancel")
-        }}</b-button>
+        <b-button name="close" @click="isRevokeModalVisible = false">
+          {{ $t("buttons.cancel") }}
+        </b-button>
         <b-button
           name="deleteToken"
-          @click="confirmRevoke"
           variant="danger"
           style="float: right"
+          @click="confirmRevoke"
           >{{ $t("buttons.revoke") }}</b-button
         >
       </template>
@@ -66,6 +67,7 @@
         {{ $t("page.userprofile.form.accessToken.bodyText") }}
       </b-form-text>
     </b-form-group>
+
     <!-- Token Name -->
     <b-form-group
       class="mandatory"
@@ -104,8 +106,8 @@
         class="float-right"
         name="create-token"
         style="margin-right: 0px"
-        @click.prevent="createToken"
         :disabled="$v.token.$invalid"
+        @click.prevent="createToken"
         >{{ $t("buttons.tokenCreate") }}</b-button
       >
     </b-form-group>
@@ -153,9 +155,9 @@
           </template>
           <template #cell(actions)="selectedToken">
             <b-button
-              v-on:click="revokeToken(selectedToken.item)"
               size="sm"
               variant="danger"
+              @click="revokeToken(selectedToken.item)"
               >{{ $t("buttons.revoke") }}</b-button
             >
           </template>
@@ -172,8 +174,6 @@ import { validationMixin } from "vuelidate";
 import { required } from "vuelidate/lib/validators";
 import { BIconClipboard } from "bootstrap-vue";
 
-import CoscineModal from "@/components/CoscineModal.vue";
-
 // import the main store
 import useMainStore from "@/store/index";
 // import the store for current module
@@ -193,18 +193,16 @@ interface TokenValidityBoundDates {
 }
 
 export default defineComponent({
+  components: {
+    BIconClipboard,
+  },
+  mixins: [validationMixin],
   setup() {
     const mainStore = useMainStore();
     const userStore = useUserStore();
 
     return { mainStore, userStore };
   },
-  mixins: [validationMixin],
-  name: "accesstoken",
-  components: {
-    CoscineModal,
-    BIconClipboard,
-  },
   validations: {
     token: {
       TokenExpirationDate: {},
@@ -255,8 +253,6 @@ export default defineComponent({
         TokenName: "",
         AccessToken: "" as string,
       },
-      languages: [] as Record<string, unknown>[],
-      Language: [] as Record<string, unknown>[],
     };
   },
 
diff --git a/src/modules/user/store.ts b/src/modules/user/store.ts
index 8762e4e3071a4673e226bdeedfb77d7f58ee6acd..f43b2885e465a82f588f687f64eaedd89c79cac2 100644
--- a/src/modules/user/store.ts
+++ b/src/modules/user/store.ts
@@ -14,6 +14,8 @@ import type { UserState } from "./types";
 
 // import the main store
 import useMainStore from "@/store/index";
+import useNotificationStore from "@/store/notification";
+import type { AxiosError } from "axios";
 
 /*  
   Store variable name is "this.<id>Store"
@@ -63,108 +65,172 @@ export const useUserStore = defineStore({
       @click = "this.userStore.<action_name>();
   */
   actions: {
-    async queryUser(searchString: string, projectId: string) {
-      return (await UserApi.userQuery(searchString, projectId)).data;
+    async getUser(searchString: string, projectId: string) {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await UserApi.userQuery(searchString, projectId);
+        return apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+      }
     },
+
     async retrieveContactChange() {
+      const notificationStore = useNotificationStore();
       try {
-        this.userProfile.contactChange = (
-          await ContactChangeApi.contactChangeConfirmationStatus()
-        ).data;
-      } catch {
-        console.error("Could not fetch contact changes");
-        // TODO: Handle error
+        const apiResponse =
+          await ContactChangeApi.contactChangeConfirmationStatus();
+        this.userProfile.contactChange = apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async retrieveDisciplines() {
+      const notificationStore = useNotificationStore();
       try {
-        this.userProfile.disciplines = (
-          await DisciplineApi.disciplineIndex()
-        ).data;
-      } catch {
-        console.error("Could not fetch disciplines");
-        // TODO: Handle error
+        const apiResponse = await DisciplineApi.disciplineIndex();
+        this.userProfile.disciplines = apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async retrieveLanguages() {
+      const notificationStore = useNotificationStore();
       try {
-        this.userProfile.languages = (await LanguageApi.languageIndex()).data;
-      } catch {
-        console.error("Could not fetch languages");
-        // TODO: Handle error
+        const apiResponse = await LanguageApi.languageIndex();
+        this.userProfile.languages = apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async retrieveMemberOrganizations() {
+      const notificationStore = useNotificationStore();
       try {
-        this.userProfile.memberOrganizations = (
-          await OrganizationApi.organizationIsMember2()
-        ).data.data;
-      } catch {
-        console.error("Could not fetch member organizations");
-        // TODO: Handle error
+        const apiResponse = await OrganizationApi.organizationIsMember2();
+        this.userProfile.memberOrganizations = apiResponse.data.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async retrieveOrganizations(filter = "") {
+      const notificationStore = useNotificationStore();
       try {
-        this.userProfile.organizations = (
-          await OrganizationApi.organizationGetROR(filter)
-        ).data.data;
-      } catch {
-        console.error("Could not fetch organizations");
-        // TODO: Handle error
+        const apiResponse = await OrganizationApi.organizationGetROR(filter);
+        this.userProfile.organizations = apiResponse.data.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async retrieveTitles() {
+      const notificationStore = useNotificationStore();
       try {
-        this.userProfile.titles = (await TitleApi.titleIndex()).data;
-      } catch {
-        console.error("Could not fetch titles");
-        // TODO: Handle error
+        const apiResponse = await TitleApi.titleIndex();
+        this.userProfile.titles = apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async retrieveTokens() {
+      const notificationStore = useNotificationStore();
       try {
-        this.userProfile.tokens = (await TokenApi.tokenGetUserTokens()).data;
-      } catch {
-        console.error("Could not fetch user tokens");
-        // TODO: Handle error
+        const apiResponse = await TokenApi.tokenGetUserTokens();
+        this.userProfile.tokens = apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async retrieveTokenValidityBounds() {
+      const notificationStore = useNotificationStore();
       try {
-        this.tokenValidityBounds = (
-          await TokenApi.tokenGetTokenValidityBounds()
-        ).data;
-      } catch {
-        console.error("Could not fetch token validity bounds");
-        // TODO: Handle error
+        const apiResponse = await TokenApi.tokenGetTokenValidityBounds();
+        this.tokenValidityBounds = apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async retrieveUser(loggedIn = true) {
-      if (loggedIn) {
-        try {
-          this.user = (await UserApi.userGetUser()).data;
-        } catch {
-          console.error("Could not fetch user");
-          // TODO: Handle error
+      const notificationStore = useNotificationStore();
+      try {
+        if (loggedIn) {
+          const apiResponse = await UserApi.userGetUser();
+          this.user = apiResponse.data;
         }
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
       }
     },
+
     async revokeToken(tokenId: string) {
-      await TokenApi.tokenRevokeToken(tokenId);
+      const notificationStore = useNotificationStore();
+      try {
+        await TokenApi.tokenRevokeToken(tokenId);
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+      }
     },
-    async setMergeToken(provider: string) {
-      return (await UserApi.userSetAndReturnMergeToken(provider)).data;
+
+    async setMergeToken(provider: string): Promise<string> {
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await UserApi.userSetAndReturnMergeToken(provider);
+        return apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+        return "";
+      }
     },
+
     async submitToken(token: AddApiTokenParameter) {
-      return (await TokenApi.tokenAddToken(token)).data;
+      const notificationStore = useNotificationStore();
+      try {
+        const apiResponse = await TokenApi.tokenAddToken(token);
+        return apiResponse.data;
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+      }
     },
+
     async updateEmail(emailAddress: string) {
-      await ContactChangeApi.contactChangeChangeContactEmail(emailAddress);
+      const notificationStore = useNotificationStore();
+      try {
+        await ContactChangeApi.contactChangeChangeContactEmail(emailAddress);
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+      }
     },
+
     async updateUser(user: UserObject) {
-      await UserApi.userUpdateUser(user);
+      const notificationStore = useNotificationStore();
+      try {
+        await UserApi.userUpdateUser(user);
+      } catch (error) {
+        // Handle other Status Codes
+        notificationStore.postApiErrorNotification(error as AxiosError);
+      }
     },
+
     setUserLanguagePreference() {
       if (this.user && this.user.language && this.user.language?.abbreviation) {
         const mainStore = useMainStore();
diff --git a/src/modules/user/types.d.ts b/src/modules/user/types.ts
similarity index 100%
rename from src/modules/user/types.d.ts
rename to src/modules/user/types.ts
diff --git a/src/plugins/deprecated/vue-multiselect.ts b/src/plugins/deprecated/vue-multiselect.ts
index f70df74337b447505e064d6fa6e9e5cf3a1ce939..ecc9f129bd1a993088c972cd61bc9f85a888dc15 100644
--- a/src/plugins/deprecated/vue-multiselect.ts
+++ b/src/plugins/deprecated/vue-multiselect.ts
@@ -3,4 +3,4 @@ import Vue from "vue";
 import Multiselect from "vue-multiselect";
 import "vue-multiselect/dist/vue-multiselect.min.css";
 
-Vue.component("multiselect", Multiselect);
+Vue.component("Multiselect", Multiselect);
diff --git a/src/router/index.ts b/src/router/index.ts
index c94909883cddb38dbc65ce3bcfaecd73d6b358ba..e6863e4a760b5e435e745cc69328669278f9faa2 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -96,12 +96,12 @@ export const removeQueryParameterFromUrl = function (
   const newQuery = route.query;
   if (newQuery[param] !== null && newQuery[param] !== undefined) {
     delete newQuery[param];
+    const routeNew = {
+      ...route,
+      query: newQuery,
+    } as RawLocation;
+    router.replace(routeNew);
   }
-  const routeNew = {
-    ...route,
-    query: newQuery,
-  } as RawLocation;
-  router.replace(routeNew);
 };
 
 export const navigateToProject = function (project: ProjectObject | null) {
diff --git a/src/store/index.ts b/src/store/index.ts
index f9ff652165f12941e6b70d08b64b6c784d735971..5a01e5b7ad0ff1b36f2c3398875676e749c96ccf 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -6,7 +6,6 @@ import { v4 as uuidv4 } from "uuid";
 
 import { removeQueryParameterFromUrl } from "@/router";
 import { NoticeApi } from "@coscine/api-client";
-import { StatusCodes } from "http-status-codes";
 
 import useLoginStore from "@/modules/login/store";
 
@@ -113,10 +112,7 @@ export const useMainStore = defineStore({
 
     async getMaintenance() {
       const apiResponse = await NoticeApi.noticeGetMaintenance();
-      if (
-        apiResponse.status === StatusCodes.OK &&
-        apiResponse.data.startsDate
-      ) {
+      if (apiResponse.data.startsDate) {
         const now = new Date(Date.now());
         const startDate = new Date(apiResponse.data.startsDate);
         const endDate = apiResponse.data.endsDate;
@@ -125,8 +121,6 @@ export const useMainStore = defineStore({
             apiResponse.data.startsDate + apiResponse.data.endsDate;
           this.coscine.banner.maintenance = apiResponse.data;
         }
-      } else {
-        // Handle other Status Codes
       }
     },
   },
diff --git a/src/store/notification.ts b/src/store/notification.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2dfd607f2850ccf832d516e00c53c6a4c92ed8eb
--- /dev/null
+++ b/src/store/notification.ts
@@ -0,0 +1,96 @@
+import { defineStore } from "pinia";
+import { NotificationState, NotificationToast } from "./types";
+import i18n from "@/plugins/vue-i18n";
+import { getReasonPhrase } from "http-status-codes";
+import type { AxiosError } from "axios";
+
+/*  
+  Store variable name is "this.<id>Store"
+    id: "notification" --> this.notificationStore
+  Important! The id must be unique for every store.
+*/
+export const useNotificationStore = defineStore({
+  id: "notification",
+  /*  
+    --------------------------------------------------------------------------------------
+    STATES
+    --------------------------------------------------------------------------------------
+  */
+  state: (): NotificationState => ({
+    notificationQueue: [] as NotificationToast[],
+  }),
+
+  /*  
+    --------------------------------------------------------------------------------------
+    GETTERS
+    --------------------------------------------------------------------------------------
+    Synchronous code only.
+    
+    In a component use as e.g.:
+      :label = "this.notificationStore.<getter_name>;
+  */
+  getters: {},
+  /*  
+    --------------------------------------------------------------------------------------
+    ACTIONS
+    --------------------------------------------------------------------------------------
+    Asynchronous & Synchronous code comes here (e.g. API calls and VueX mutations).
+    To change a state use an action.
+
+    In a component use as e.g.:
+      @click = "this.notificationStore.<action_name>();
+  */
+  actions: {
+    postApiErrorNotification(error: AxiosError) {
+      let notification: NotificationToast;
+      if (error.response) {
+        // The request was made and the server responded with a status code that falls out of the range of 2xx
+        const notificationBody = i18n
+          .t("toast.apiError.specific.body", {
+            error: `(${error.response.status}: ${getReasonPhrase(
+              error.response.status
+            )})`,
+          })
+          .toString();
+        notification = {
+          title: i18n.t("toast.apiError.specific.title").toString(),
+          body: notificationBody,
+          variant: error.response.status >= 500 ? "danger" : "warning",
+          noAutoHide: true,
+          appendToast: false,
+        };
+      } else {
+        // Something happened in setting up the request that triggered an Error
+        notification = {
+          title: i18n.t("toast.apiError.general.title").toString(),
+          body: i18n.t("toast.apiError.general.body").toString(),
+          variant: "danger",
+        };
+      }
+      this.postNotification(notification);
+    },
+
+    postGeneralApiWarningNotification(body: string) {
+      // Something happened in setting up the request that triggered an Error
+      const notification = {
+        title: i18n.t("toast.apiError.general.title").toString(),
+        body: i18n
+          .t("toast.apiError.specific.body", { error: body })
+          .toString(),
+        variant: "warning",
+      } as NotificationToast;
+      this.postNotification(notification);
+    },
+
+    postNotification(toast: NotificationToast) {
+      this.notificationQueue.push(toast); // Weird typescript error because of dissolved object
+    },
+
+    deleteNotification(toast: NotificationToast) {
+      const index = this.notificationQueue.indexOf(toast); // Weird typescript error because of dissolved object
+      this.notificationQueue.splice(index);
+    },
+  },
+});
+
+export default useNotificationStore;
diff --git a/src/store/types.d.ts b/src/store/types.ts
similarity index 60%
rename from src/store/types.d.ts
rename to src/store/types.ts
index 67edb2d70657d329d27911e38e4c080920eeddfb..03d17b9aa0089aa7865b4bd1926277249ade6e22 100644
--- a/src/store/types.d.ts
+++ b/src/store/types.ts
@@ -1,5 +1,12 @@
 import type { RemovableRef } from "@vueuse/core";
 import type { MaintenanceReturnObject } from "@coscine/api-client/dist/types/Coscine.Api.Notices";
+import type { VNode } from "vue-demi";
+import type { BvToastOptions } from "bootstrap-vue";
+
+export interface NotificationToast extends BvToastOptions {
+  body: string | VNode | VNode[];
+  variant?: "danger" | "warning" | "success" | "info" | "primary" | "secondary";
+}
 
 export interface MainState {
   /*  
@@ -27,3 +34,12 @@ export interface MainState {
   };
   sidebarActive: RemovableRef<boolean>;
 }
+
+export interface NotificationState {
+  /*  
+    --------------------------------------------------------------------------------------
+    STATE TYPE DEFINITION
+    --------------------------------------------------------------------------------------
+  */
+  notificationQueue: NotificationToast[];
+}
diff --git a/yarn.lock-workspace b/yarn.lock-workspace
index 9db12784957cc91a3d0fe25da263ba5b66380d96..6fbaf58a66a3a03b334f0073de96216e73df84ec 100644
--- a/yarn.lock-workspace
+++ b/yarn.lock-workspace
@@ -2,7 +2,7 @@
 # Manual changes might be lost - proceed with caution!
 
 __metadata:
-  version: 5
+  version: 6
   cacheKey: 8
 
 "@achrinza/node-ipc@npm:9.2.2":
@@ -17,11 +17,12 @@ __metadata:
   linkType: hard
 
 "@ampproject/remapping@npm:^2.1.0":
-  version: 2.1.2
-  resolution: "@ampproject/remapping@npm:2.1.2"
+  version: 2.2.0
+  resolution: "@ampproject/remapping@npm:2.2.0"
   dependencies:
-    "@jridgewell/trace-mapping": ^0.3.0
-  checksum: e023f92cdd9723f3042cde3b4d922adfeef0e198aa73486b0b6c034ad36af5f96e5c0cc72b335b30b2eb9852d907efc92af6bfcd3f4b4d286177ee32a189cf92
+    "@jridgewell/gen-mapping": ^0.1.0
+    "@jridgewell/trace-mapping": ^0.3.9
+  checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292
   languageName: node
   linkType: hard
 
@@ -34,10 +35,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@antfu/utils@npm:^0.5.0":
-  version: 0.5.0
-  resolution: "@antfu/utils@npm:0.5.0"
-  checksum: a5b39b556fe9e53fbc985235ea429badbacc3cd2932cce64dfe8b843b19778f0dec34db3c0d101d2364670eeacbb2bf1858149803b2eb7315cfe55737a58c9e6
+"@antfu/utils@npm:^0.5.1":
+  version: 0.5.1
+  resolution: "@antfu/utils@npm:0.5.1"
+  checksum: 54a64a1a7d451d07be2ead39dee534281f0cca35db2e72b995f4d81baedfe4c8889f428e46ebefe32c7f4444fc2d5389a5a52223fe8cef01cc98415c8ffc9491
   languageName: node
   linkType: hard
 
@@ -50,55 +51,44 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/compat-data@npm:^7.17.7":
-  version: 7.17.7
-  resolution: "@babel/compat-data@npm:7.17.7"
-  checksum: bf13476676884ce9afc199747ff82f3bcd6d42a9cfb01ce91bdb762b83ea11ec619b6ec532d1a80469ab14f191f33b5d4b9f8796fa8be3bc728d42b0c5e737e3
+"@babel/compat-data@npm:^7.17.10":
+  version: 7.17.10
+  resolution: "@babel/compat-data@npm:7.17.10"
+  checksum: e85051087cd4690de5061909a2dd2d7f8b6434a3c2e30be6c119758db2027ae1845bcd75a81127423dd568b706ac6994a1a3d7d701069a23bf5cfe900728290b
   languageName: node
   linkType: hard
 
 "@babel/core@npm:^7.16.10":
-  version: 7.17.8
-  resolution: "@babel/core@npm:7.17.8"
+  version: 7.17.10
+  resolution: "@babel/core@npm:7.17.10"
   dependencies:
     "@ampproject/remapping": ^2.1.0
     "@babel/code-frame": ^7.16.7
-    "@babel/generator": ^7.17.7
-    "@babel/helper-compilation-targets": ^7.17.7
+    "@babel/generator": ^7.17.10
+    "@babel/helper-compilation-targets": ^7.17.10
     "@babel/helper-module-transforms": ^7.17.7
-    "@babel/helpers": ^7.17.8
-    "@babel/parser": ^7.17.8
+    "@babel/helpers": ^7.17.9
+    "@babel/parser": ^7.17.10
     "@babel/template": ^7.16.7
-    "@babel/traverse": ^7.17.3
-    "@babel/types": ^7.17.0
+    "@babel/traverse": ^7.17.10
+    "@babel/types": ^7.17.10
     convert-source-map: ^1.7.0
     debug: ^4.1.0
     gensync: ^1.0.0-beta.2
-    json5: ^2.1.2
+    json5: ^2.2.1
     semver: ^6.3.0
-  checksum: 0e686b1be444d25494424065238931f2b3df908bf072b72bab973acfd6d27a481fc280c9cd8a3c6fe2c46beee50e0d2307468d8b15b64dc4036f025e75f6609d
-  languageName: node
-  linkType: hard
-
-"@babel/generator@npm:^7.17.3":
-  version: 7.17.3
-  resolution: "@babel/generator@npm:7.17.3"
-  dependencies:
-    "@babel/types": ^7.17.0
-    jsesc: ^2.5.1
-    source-map: ^0.5.0
-  checksum: ddf70e3489976018dfc2da8b9f43ec8c582cac2da681ed4a6227c53b26a9626223e4dca90098b3d3afe43bc67f20160856240e826c56b48e577f34a5a7e22b9f
+  checksum: 2545fb24b4090c1e9ead0daad4713ae6fe779df0843e6e286509146f4dd09958bd067d80995f2cc09fdb01fd0dc936f42cdd6f70b3d058de48e124cd9a3cc93e
   languageName: node
   linkType: hard
 
-"@babel/generator@npm:^7.17.7":
-  version: 7.17.7
-  resolution: "@babel/generator@npm:7.17.7"
+"@babel/generator@npm:^7.17.10":
+  version: 7.17.10
+  resolution: "@babel/generator@npm:7.17.10"
   dependencies:
-    "@babel/types": ^7.17.0
+    "@babel/types": ^7.17.10
+    "@jridgewell/gen-mapping": ^0.1.0
     jsesc: ^2.5.1
-    source-map: ^0.5.0
-  checksum: e7344b9b4559115f2754ecc2ae9508412ea6a8f617544cd3d3f17cabc727bd30630765f96c8a4ebc8901ded1492a3a6c23d695a4f1e8f3042f860b30c891985c
+  checksum: 9ec596a6ffec7bec239133a4ba79d4f834e6c894019accb1c70a7a5affbec9d0912d3baef200edd9d48e553d4ef72abcbffbc73cfb7d75f327c24186e887f79c
   languageName: node
   linkType: hard
 
@@ -111,34 +101,34 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-compilation-targets@npm:^7.17.7":
-  version: 7.17.7
-  resolution: "@babel/helper-compilation-targets@npm:7.17.7"
+"@babel/helper-compilation-targets@npm:^7.17.10":
+  version: 7.17.10
+  resolution: "@babel/helper-compilation-targets@npm:7.17.10"
   dependencies:
-    "@babel/compat-data": ^7.17.7
+    "@babel/compat-data": ^7.17.10
     "@babel/helper-validator-option": ^7.16.7
-    browserslist: ^4.17.5
+    browserslist: ^4.20.2
     semver: ^6.3.0
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 24bf851539d5ec8e73779304b5d1ad5b0be09a74459ecc7d9baee9a0fa38ad016e9eaf4b5704504ae8da32f91ce0e31857bbbd9686854caeffd38f58226d3760
+  checksum: 5f547c7ebd372e90fa72c2aaea867e7193166e9f469dec5acde4f0e18a78b80bdca8e02a0f641f3e998be984fb5b802c729a9034faaee8b1a9ef6670cb76f120
   languageName: node
   linkType: hard
 
-"@babel/helper-create-class-features-plugin@npm:^7.16.7, @babel/helper-create-class-features-plugin@npm:^7.17.6":
-  version: 7.17.6
-  resolution: "@babel/helper-create-class-features-plugin@npm:7.17.6"
+"@babel/helper-create-class-features-plugin@npm:^7.16.7, @babel/helper-create-class-features-plugin@npm:^7.17.9":
+  version: 7.17.9
+  resolution: "@babel/helper-create-class-features-plugin@npm:7.17.9"
   dependencies:
     "@babel/helper-annotate-as-pure": ^7.16.7
     "@babel/helper-environment-visitor": ^7.16.7
-    "@babel/helper-function-name": ^7.16.7
-    "@babel/helper-member-expression-to-functions": ^7.16.7
+    "@babel/helper-function-name": ^7.17.9
+    "@babel/helper-member-expression-to-functions": ^7.17.7
     "@babel/helper-optimise-call-expression": ^7.16.7
     "@babel/helper-replace-supers": ^7.16.7
     "@babel/helper-split-export-declaration": ^7.16.7
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: d85a5b3f9a18a661372d77462e6ea2a6a03f1083f8b3055ed165284214af9ea6ad677f6bcc4b5ce215da27f95fa93064580d4b6723b578c480ecf17dd31a4307
+  checksum: db7be8852096084883dbbd096f925976695e5b34919a888fded9fd359d75d9994960e459f4eeb51ff6700109f83be6c1359e57809deb3fe36fc589b2a208b6d7
   languageName: node
   linkType: hard
 
@@ -151,23 +141,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-function-name@npm:^7.16.7":
-  version: 7.16.7
-  resolution: "@babel/helper-function-name@npm:7.16.7"
+"@babel/helper-function-name@npm:^7.17.9":
+  version: 7.17.9
+  resolution: "@babel/helper-function-name@npm:7.17.9"
   dependencies:
-    "@babel/helper-get-function-arity": ^7.16.7
     "@babel/template": ^7.16.7
-    "@babel/types": ^7.16.7
-  checksum: fc77cbe7b10cfa2a262d7a37dca575c037f20419dfe0c5d9317f589599ca24beb5f5c1057748011159149eaec47fe32338c6c6412376fcded68200df470161e1
-  languageName: node
-  linkType: hard
-
-"@babel/helper-get-function-arity@npm:^7.16.7":
-  version: 7.16.7
-  resolution: "@babel/helper-get-function-arity@npm:7.16.7"
-  dependencies:
-    "@babel/types": ^7.16.7
-  checksum: 25d969fb207ff2ad5f57a90d118f6c42d56a0171022e200aaa919ba7dc95ae7f92ec71cdea6c63ef3629a0dc962ab4c78e09ca2b437185ab44539193f796e0c3
+    "@babel/types": ^7.17.0
+  checksum: a59b2e5af56d8f43b9b0019939a43774754beb7cb01a211809ca8031c71890999d07739e955343135ec566c4d8ff725435f1f60fb0af3bb546837c1f9f84f496
   languageName: node
   linkType: hard
 
@@ -180,7 +160,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-member-expression-to-functions@npm:^7.16.7":
+"@babel/helper-member-expression-to-functions@npm:^7.16.7, @babel/helper-member-expression-to-functions@npm:^7.17.7":
   version: 7.17.7
   resolution: "@babel/helper-member-expression-to-functions@npm:7.17.7"
   dependencies:
@@ -261,13 +241,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-validator-identifier@npm:^7.14.9":
-  version: 7.14.9
-  resolution: "@babel/helper-validator-identifier@npm:7.14.9"
-  checksum: 58552531a7674363e74672434c312ddaf1545b8a43308e1a7f38db58bf79c796c095a6dab6a6105eb0d783b97441f6cbb525bb887f29a35f232fcdbd8cb240dc
-  languageName: node
-  linkType: hard
-
 "@babel/helper-validator-identifier@npm:^7.16.7":
   version: 7.16.7
   resolution: "@babel/helper-validator-identifier@npm:7.16.7"
@@ -282,52 +255,34 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helpers@npm:^7.17.8":
-  version: 7.17.8
-  resolution: "@babel/helpers@npm:7.17.8"
+"@babel/helpers@npm:^7.17.9":
+  version: 7.17.9
+  resolution: "@babel/helpers@npm:7.17.9"
   dependencies:
     "@babel/template": ^7.16.7
-    "@babel/traverse": ^7.17.3
+    "@babel/traverse": ^7.17.9
     "@babel/types": ^7.17.0
-  checksum: 463dad58119fefebf2d0201bfa53ec9607aa00356908895640fc07589747fb3c2e0dfee4019f3e8c9781e57c9aa5dff4c72ec8d1b031c4ed8349f90b6aefe99d
+  checksum: 3c6db861e4c82fff2de3efb4ad12e32658c50c29920597cd0979390659b202e5849acd9542e0e2453167a52ccc30156ee4455d64d0e330f020d991d7551566f8
   languageName: node
   linkType: hard
 
 "@babel/highlight@npm:^7.16.7":
-  version: 7.16.7
-  resolution: "@babel/highlight@npm:7.16.7"
+  version: 7.17.9
+  resolution: "@babel/highlight@npm:7.17.9"
   dependencies:
     "@babel/helper-validator-identifier": ^7.16.7
     chalk: ^2.0.0
     js-tokens: ^4.0.0
-  checksum: f7e04e7e03b83c2cca984f4d3e180c9b018784f45d03367e94daf983861229ddc47264045f3b58dfeb0007f9c67bc2a76c4de1693bad90e5394876ef55ece5bb
-  languageName: node
-  linkType: hard
-
-"@babel/parser@npm:^7.16.10, @babel/parser@npm:^7.17.8":
-  version: 7.17.8
-  resolution: "@babel/parser@npm:7.17.8"
-  bin:
-    parser: ./bin/babel-parser.js
-  checksum: 1771808491982cc47baa888a997aef6b58308e3844c8c00f730f8fd97defe57d32cdbf46075cd49aaee310fa31f3d2c80a0d41b41a4ee0ff336ee09e2ff6c222
-  languageName: node
-  linkType: hard
-
-"@babel/parser@npm:^7.16.7":
-  version: 7.16.7
-  resolution: "@babel/parser@npm:7.16.7"
-  bin:
-    parser: ./bin/babel-parser.js
-  checksum: e664ff1edda164ab3f3c97fc1dd1a8930b0fba9981cbf873d3f25a22d16d50e2efcfaf81daeefa978bff2c4f268d34832f6817c8bc4e03594c3f43beba92fb68
+  checksum: 7bdf10228f2e4d18f48f114411ed584380d356e7c168d7582c14abd8df9909b2fc09e0a7cd334f47c3eb0bc17e639e0c8d9688c6afd5d09a2bdbf0ac193b11fd
   languageName: node
   linkType: hard
 
-"@babel/parser@npm:^7.17.3":
-  version: 7.17.3
-  resolution: "@babel/parser@npm:7.17.3"
+"@babel/parser@npm:^7.16.10, @babel/parser@npm:^7.16.7, @babel/parser@npm:^7.17.10":
+  version: 7.17.10
+  resolution: "@babel/parser@npm:7.17.10"
   bin:
     parser: ./bin/babel-parser.js
-  checksum: 311869baef97c7630ac3b3c4600da18229b95aa2785b2daab2044384745fe0653070916ade28749fb003f7369a081111ada53e37284ba48d6b5858cbb9e411d1
+  checksum: a9493d9fb8625e0904a178703866c8ee4d3a6003f0954b08df9f772b54dae109c69376812b74732e0c3e1a7f1d5b30915577a1db12e5e16b0abee083539df574
   languageName: node
   linkType: hard
 
@@ -344,17 +299,18 @@ __metadata:
   linkType: hard
 
 "@babel/plugin-proposal-decorators@npm:^7.16.7":
-  version: 7.17.8
-  resolution: "@babel/plugin-proposal-decorators@npm:7.17.8"
+  version: 7.17.9
+  resolution: "@babel/plugin-proposal-decorators@npm:7.17.9"
   dependencies:
-    "@babel/helper-create-class-features-plugin": ^7.17.6
+    "@babel/helper-create-class-features-plugin": ^7.17.9
     "@babel/helper-plugin-utils": ^7.16.7
     "@babel/helper-replace-supers": ^7.16.7
+    "@babel/helper-split-export-declaration": ^7.16.7
     "@babel/plugin-syntax-decorators": ^7.17.0
     charcodes: ^0.2.0
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 8687de0ef0d671bc0c7e2ae0a7970055f8f6a0c8a50dcf81fe54bad85ffb59447ad7d75169f891244ef4a5a7bc2d146d753b7077635597fd998a44db632481ae
+  checksum: a3d177b88843bf73d798e4b21c1b8146bd33fd19ab56e5ab379d6670db84e172570e73bcf5a4e5a83193cfea49fed3db0015454e78f30f46d25d256c6e65a7b3
   languageName: node
   linkType: hard
 
@@ -381,13 +337,13 @@ __metadata:
   linkType: hard
 
 "@babel/plugin-syntax-typescript@npm:^7.16.7":
-  version: 7.16.7
-  resolution: "@babel/plugin-syntax-typescript@npm:7.16.7"
+  version: 7.17.10
+  resolution: "@babel/plugin-syntax-typescript@npm:7.17.10"
   dependencies:
     "@babel/helper-plugin-utils": ^7.16.7
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 661e636060609ede9a402e22603b01784c21fabb0a637e65f561c8159351fe0130bbc11fdefe31902107885e3332fc34d95eb652ac61d3f61f2d61f5da20609e
+  checksum: 43e908acf4a1e267f7bd86dc2fcb015b1fbcc364da43b125289d6a91bd32eeed41e5d9870051f7a3e4e2da9eeff7655f7988b6f27beac06bcb60c054aa5bac6d
   languageName: node
   linkType: hard
 
@@ -415,51 +371,38 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/traverse@npm:^7.16.7, @babel/traverse@npm:^7.17.3":
-  version: 7.17.3
-  resolution: "@babel/traverse@npm:7.17.3"
+"@babel/traverse@npm:^7.16.7, @babel/traverse@npm:^7.17.10, @babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.17.9":
+  version: 7.17.10
+  resolution: "@babel/traverse@npm:7.17.10"
   dependencies:
     "@babel/code-frame": ^7.16.7
-    "@babel/generator": ^7.17.3
+    "@babel/generator": ^7.17.10
     "@babel/helper-environment-visitor": ^7.16.7
-    "@babel/helper-function-name": ^7.16.7
+    "@babel/helper-function-name": ^7.17.9
     "@babel/helper-hoist-variables": ^7.16.7
     "@babel/helper-split-export-declaration": ^7.16.7
-    "@babel/parser": ^7.17.3
-    "@babel/types": ^7.17.0
+    "@babel/parser": ^7.17.10
+    "@babel/types": ^7.17.10
     debug: ^4.1.0
     globals: ^11.1.0
-  checksum: 780d7ecf711758174989794891af08d378f81febdb8932056c0d9979524bf0298e28f8e7708a872d7781151506c28f56c85c63ea3f1f654662c2fcb8a3eb9fdc
-  languageName: node
-  linkType: hard
-
-"@babel/types@npm:^7.16.7":
-  version: 7.16.7
-  resolution: "@babel/types@npm:7.16.7"
-  dependencies:
-    "@babel/helper-validator-identifier": ^7.16.7
-    to-fast-properties: ^2.0.0
-  checksum: df9210723259df9faea8c7e5674a59e57ead82664aab9f54daae887db5a50a956f30f57ed77a2d6cbb89b908d520cf8d883267c4e9098e31bc74649f2f714654
+  checksum: 44ec0a59aa274b59464d52b1796eb6e54c67ae0f946de0d608068e28b1ab7065bdf53c0169d9102854cb00aa01944c83e722f08aeab96d9cc6bf56f8aede70fd
   languageName: node
   linkType: hard
 
-"@babel/types@npm:^7.17.0":
-  version: 7.17.0
-  resolution: "@babel/types@npm:7.17.0"
+"@babel/types@npm:^7.16.7, @babel/types@npm:^7.17.0, @babel/types@npm:^7.17.10, @babel/types@npm:^7.8.3":
+  version: 7.17.10
+  resolution: "@babel/types@npm:7.17.10"
   dependencies:
     "@babel/helper-validator-identifier": ^7.16.7
     to-fast-properties: ^2.0.0
-  checksum: 12e5a287986fe557188e87b2c5202223f1dc83d9239a196ab936fdb9f8c1eb0be717ff19f934b5fad4e29a75586d5798f74bed209bccea1c20376b9952056f0e
+  checksum: 40cfc3f43a3ab7374df8ee6844793f804c65e7bea0fd1b090886b425106ba26e16e8fa698ae4b2caf2746083fe3e62f03f12997a5982e0d131700f17cbdcfca1
   languageName: node
   linkType: hard
 
-"@babel/types@npm:^7.8.3":
-  version: 7.15.4
-  resolution: "@babel/types@npm:7.15.4"
-  dependencies:
-    "@babel/helper-validator-identifier": ^7.14.9
-    to-fast-properties: ^2.0.0
-  checksum: dac7d733edf2102e97f197929693fae6025161f3edda5a0f621f69e9d0741b8596c6f2152492bef869b55d0205e214867e8730f389283e85432b8f093e295c4b
+"@colors/colors@npm:1.5.0":
+  version: 1.5.0
+  resolution: "@colors/colors@npm:1.5.0"
+  checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425
   languageName: node
   linkType: hard
 
@@ -707,16 +650,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@coscine/api-client@npm:^1.5.0":
-  version: 1.5.1
-  resolution: "@coscine/api-client@npm:1.5.1"
-  dependencies:
-    axios: ^0.21.1
-  checksum: e17dc39bc8c5fcc3eb0ef9647556cb9e17cba59567f9e63f8ce821202363b45fcde122c651c37515b317c83930dda399afacd020ce5e8a83603e84b5b2a3fe81
-  languageName: node
-  linkType: hard
-
-"@coscine/api-client@npm:^1.5.2":
+"@coscine/api-client@npm:^1.5.0, @coscine/api-client@npm:^1.5.2":
   version: 1.5.2
   resolution: "@coscine/api-client@npm:1.5.2"
   dependencies:
@@ -746,9 +680,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@eslint/eslintrc@npm:^1.2.1":
-  version: 1.2.1
-  resolution: "@eslint/eslintrc@npm:1.2.1"
+"@eslint/eslintrc@npm:^1.2.2":
+  version: 1.2.2
+  resolution: "@eslint/eslintrc@npm:1.2.2"
   dependencies:
     ajv: ^6.12.4
     debug: ^4.3.2
@@ -759,14 +693,7 @@ __metadata:
     js-yaml: ^4.1.0
     minimatch: ^3.0.4
     strip-json-comments: ^3.1.1
-  checksum: 1f797b9f94d71b965992cf6c44e3bcb574643014fd1e3d4862d25056bd5568f59c488461a7e9a1c1758ca7f0def5d3cb69c3d8b38581bcf4a53af74371243797
-  languageName: node
-  linkType: hard
-
-"@gar/promisify@npm:^1.0.1":
-  version: 1.1.2
-  resolution: "@gar/promisify@npm:1.1.2"
-  checksum: d05081e0887a49c178b75ee3067bd6ee086f73c154d121b854fb2e044e8a89cb1cbb6de3a0dd93a519b80f0531fda68b099dd7256205f7fbb3490324342f2217
+  checksum: d891036bbffb0efec1462aa4a603ed6e349d546b1632dde7d474ddd15c2a8b6895671b25293f1d3ba10ff629c24a3649ad049373fe695a0e44b612537088563c
   languageName: node
   linkType: hard
 
@@ -844,27 +771,44 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@jridgewell/gen-mapping@npm:^0.1.0":
+  version: 0.1.1
+  resolution: "@jridgewell/gen-mapping@npm:0.1.1"
+  dependencies:
+    "@jridgewell/set-array": ^1.0.0
+    "@jridgewell/sourcemap-codec": ^1.4.10
+  checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc
+  languageName: node
+  linkType: hard
+
 "@jridgewell/resolve-uri@npm:^3.0.3":
-  version: 3.0.4
-  resolution: "@jridgewell/resolve-uri@npm:3.0.4"
-  checksum: 799bcba2730280a42f11b4d41a5d34d68ce72cb1bd23186bd3356607c93b62765b2b050e5dfb67f04ce4e817f882bfc10a4d1c43fe2d8eeb38371c98d71217b4
+  version: 3.0.6
+  resolution: "@jridgewell/resolve-uri@npm:3.0.6"
+  checksum: e57cc08d2aaea6bd55e77e7a124beb2fcca87be28c0db6c2d69b7cb2cb4e14109bbef1d57ae6250bf5f4a4ad950f094ed99c8925adaf82336b66dab0ad6906e6
+  languageName: node
+  linkType: hard
+
+"@jridgewell/set-array@npm:^1.0.0":
+  version: 1.1.0
+  resolution: "@jridgewell/set-array@npm:1.1.0"
+  checksum: 86ddd72ce7d2f7756dfb69804b35d0e760a85dcef30ed72e8610bf2c5e843f8878d977a0c77c4fdfa6a0e3d5b18e5bde4a1f1dd73fd2db06b200c998e9b5a6c5
   languageName: node
   linkType: hard
 
 "@jridgewell/sourcemap-codec@npm:^1.4.10":
-  version: 1.4.10
-  resolution: "@jridgewell/sourcemap-codec@npm:1.4.10"
-  checksum: 247229218edbe165dcf0a5ae0c4b81bff1b5438818bb09221f756681fe158597fdf25c2a803f9260453b299c98c7e01ddebeb1555cda3157d987cd22c08605ef
+  version: 1.4.12
+  resolution: "@jridgewell/sourcemap-codec@npm:1.4.12"
+  checksum: a179bd442e74e5e3880d5a603bb63292ba3d55b3adf64ab9f1ea8c466bb32808e8fff032362dccb1157268574db99999bf4c3e6919d69a41f1951f1a534f2f77
   languageName: node
   linkType: hard
 
-"@jridgewell/trace-mapping@npm:^0.3.0":
-  version: 0.3.4
-  resolution: "@jridgewell/trace-mapping@npm:0.3.4"
+"@jridgewell/trace-mapping@npm:^0.3.9":
+  version: 0.3.9
+  resolution: "@jridgewell/trace-mapping@npm:0.3.9"
   dependencies:
     "@jridgewell/resolve-uri": ^3.0.3
     "@jridgewell/sourcemap-codec": ^1.4.10
-  checksum: ab8bce84bbbc8c34f3ba8325ed926f8f2d3098983c10442a80c55764c4eb6e47d5b92d8ff20a0dd868c3e76a3535651fd8a0138182c290dbfc8396195685c37b
+  checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef
   languageName: node
   linkType: hard
 
@@ -921,74 +865,32 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@npmcli/arborist@npm:*, @npmcli/arborist@npm:^4.0.0":
-  version: 4.2.0
-  resolution: "@npmcli/arborist@npm:4.2.0"
-  dependencies:
-    "@isaacs/string-locale-compare": ^1.1.0
-    "@npmcli/installed-package-contents": ^1.0.7
-    "@npmcli/map-workspaces": ^2.0.0
-    "@npmcli/metavuln-calculator": ^2.0.0
-    "@npmcli/move-file": ^1.1.0
-    "@npmcli/name-from-folder": ^1.0.1
-    "@npmcli/node-gyp": ^1.0.3
-    "@npmcli/package-json": ^1.0.1
-    "@npmcli/run-script": ^2.0.0
-    bin-links: ^2.3.0
-    cacache: ^15.0.3
-    common-ancestor-path: ^1.0.1
-    json-parse-even-better-errors: ^2.3.1
-    json-stringify-nice: ^1.1.4
-    mkdirp: ^1.0.4
-    mkdirp-infer-owner: ^2.0.0
-    npm-install-checks: ^4.0.0
-    npm-package-arg: ^8.1.5
-    npm-pick-manifest: ^6.1.0
-    npm-registry-fetch: ^11.0.0
-    pacote: ^12.0.2
-    parse-conflict-json: ^2.0.1
-    proc-log: ^1.0.0
-    promise-all-reject-late: ^1.0.0
-    promise-call-limit: ^1.0.1
-    read-package-json-fast: ^2.0.2
-    readdir-scoped-modules: ^1.1.0
-    rimraf: ^3.0.2
-    semver: ^7.3.5
-    ssri: ^8.0.1
-    treeverse: ^1.0.4
-    walk-up-path: ^1.0.0
-  bin:
-    arborist: bin/index.js
-  checksum: 31188be8ca264e49440ad1efe5d99330d986d571d8715907a3b04ed8ddc22f8fa36bffce055dd759514d9ee36c24413be7b96f944cb1e1c7b094f7c07bf4c195
-  languageName: node
-  linkType: hard
-
-"@npmcli/arborist@npm:^5.0.0, @npmcli/arborist@npm:^5.0.3":
-  version: 5.0.3
-  resolution: "@npmcli/arborist@npm:5.0.3"
+"@npmcli/arborist@npm:*, @npmcli/arborist@npm:^5.0.0, @npmcli/arborist@npm:^5.0.4":
+  version: 5.1.1
+  resolution: "@npmcli/arborist@npm:5.1.1"
   dependencies:
     "@isaacs/string-locale-compare": ^1.1.0
     "@npmcli/installed-package-contents": ^1.0.7
-    "@npmcli/map-workspaces": ^2.0.0
+    "@npmcli/map-workspaces": ^2.0.3
     "@npmcli/metavuln-calculator": ^3.0.1
-    "@npmcli/move-file": ^1.1.0
+    "@npmcli/move-file": ^2.0.0
     "@npmcli/name-from-folder": ^1.0.1
-    "@npmcli/node-gyp": ^1.0.3
-    "@npmcli/package-json": ^1.0.1
+    "@npmcli/node-gyp": ^2.0.0
+    "@npmcli/package-json": ^2.0.0
     "@npmcli/run-script": ^3.0.0
     bin-links: ^3.0.0
-    cacache: ^16.0.0
+    cacache: ^16.0.6
     common-ancestor-path: ^1.0.1
     json-parse-even-better-errors: ^2.3.1
     json-stringify-nice: ^1.1.4
     mkdirp: ^1.0.4
     mkdirp-infer-owner: ^2.0.0
     nopt: ^5.0.0
-    npm-install-checks: ^4.0.0
+    npm-install-checks: ^5.0.0
     npm-package-arg: ^9.0.0
     npm-pick-manifest: ^7.0.0
     npm-registry-fetch: ^13.0.0
-    npmlog: ^6.0.1
+    npmlog: ^6.0.2
     pacote: ^13.0.5
     parse-conflict-json: ^2.0.1
     proc-log: ^2.0.0
@@ -997,75 +899,45 @@ __metadata:
     read-package-json-fast: ^2.0.2
     readdir-scoped-modules: ^1.1.0
     rimraf: ^3.0.2
-    semver: ^7.3.5
-    ssri: ^8.0.1
-    treeverse: ^1.0.4
+    semver: ^7.3.7
+    ssri: ^9.0.0
+    treeverse: ^2.0.0
     walk-up-path: ^1.0.0
   bin:
     arborist: bin/index.js
-  checksum: 97569978e568668cb1658d286a02450e8002817554246aa672fa65a7234ef4088bffa8a92a06a1eac72792c684b3961bb741553fde08f36fdb510efdf365d70b
-  languageName: node
-  linkType: hard
-
-"@npmcli/ci-detect@npm:*, @npmcli/ci-detect@npm:^1.3.0":
-  version: 1.4.0
-  resolution: "@npmcli/ci-detect@npm:1.4.0"
-  checksum: c262fc86dd543efb8a721dec39ab333f99861abff5850136c2dcbee58610ccb1f5e66c3c669903b1bcf0668084c1fe6c443a90490fba771223fb6db137e9bfc5
+  checksum: e6a989d3743d47444405aad943abcbb87d075184afd394cd968cc1abfe59ab0fad737f2c2417ceebf40b98d640309e8eb94c1e0fb72a6db88a52c4ff5c123ca7
   languageName: node
   linkType: hard
 
-"@npmcli/ci-detect@npm:^2.0.0":
+"@npmcli/ci-detect@npm:*, @npmcli/ci-detect@npm:^2.0.0":
   version: 2.0.0
   resolution: "@npmcli/ci-detect@npm:2.0.0"
   checksum: 26e964eca908706c1a612915cbc5614860ac7dbfacbb07870396c82b1377794f123a7aaa821c4a68575b67ff7e3ad170e296d3aa6a5e03dbab9b3f1e61491812
   languageName: node
   linkType: hard
 
-"@npmcli/config@npm:*":
-  version: 2.4.0
-  resolution: "@npmcli/config@npm:2.4.0"
-  dependencies:
-    ini: ^2.0.0
-    mkdirp-infer-owner: ^2.0.0
-    nopt: ^5.0.0
-    semver: ^7.3.4
-    walk-up-path: ^1.0.0
-  checksum: 46373eaeedff91b6d6450954d64f440bd325f49c49caa6c3378f2aaa44b3b27305693db82d1a59d861712b70286a114db519147e368e66905f72504c7ffaf897
-  languageName: node
-  linkType: hard
-
-"@npmcli/config@npm:^4.0.1":
-  version: 4.0.1
-  resolution: "@npmcli/config@npm:4.0.1"
+"@npmcli/config@npm:*, @npmcli/config@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "@npmcli/config@npm:4.1.0"
   dependencies:
-    "@npmcli/map-workspaces": ^2.0.1
-    ini: ^2.0.0
+    "@npmcli/map-workspaces": ^2.0.2
+    ini: ^3.0.0
     mkdirp-infer-owner: ^2.0.0
     nopt: ^5.0.0
     proc-log: ^2.0.0
     read-package-json-fast: ^2.0.3
     semver: ^7.3.5
     walk-up-path: ^1.0.0
-  checksum: a7fd2011b2c1725acef36ebfa1e1c6ef253a70adcea889a2b8a76810cfdbda5c6bb5fb153c0860cd0c65afedd097470e066e8732e4d6a2abe9f4361611df633f
+  checksum: ec0f8947e7695d246dafde2fb5bb0cb20c3cab55bbee4326468f51a3a811bfb3677517bf5f66185a10cca258938d15be0c7f30ae69f45ca6e62c938d5e309843
   languageName: node
   linkType: hard
 
-"@npmcli/disparity-colors@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "@npmcli/disparity-colors@npm:1.0.1"
+"@npmcli/disparity-colors@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "@npmcli/disparity-colors@npm:2.0.0"
   dependencies:
     ansi-styles: ^4.3.0
-  checksum: 20aa252b2d66694050e867da92d8479192a864288c5f47443392ea34d990f6785cc4c0c5f6e89b8c297b1c2765614fc8ffe928050909f1353394d414b9b1115f
-  languageName: node
-  linkType: hard
-
-"@npmcli/fs@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "@npmcli/fs@npm:1.0.0"
-  dependencies:
-    "@gar/promisify": ^1.0.1
-    semver: ^7.3.5
-  checksum: f2b4990107dd2a5b18794c89aaff6f62f3a67883d49a20602fdfc353cbc7f8c5fd50edeffdc769e454900e01b8b8e43d0b9eb524d00963d69f3c829be1a2e8ac
+  checksum: 2e85d371bb2a705c119b0eb350beab0a67ff84f13097719f20bacae7fe6d3187b9aec33b7f27553d0774a209937c5f587f049e1a5274b3288a8456357fd2a795
   languageName: node
   linkType: hard
 
@@ -1079,28 +951,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@npmcli/git@npm:^2.0.7, @npmcli/git@npm:^2.1.0":
-  version: 2.1.0
-  resolution: "@npmcli/git@npm:2.1.0"
-  dependencies:
-    "@npmcli/promise-spawn": ^1.3.2
-    lru-cache: ^6.0.0
-    mkdirp: ^1.0.4
-    npm-pick-manifest: ^6.1.1
-    promise-inflight: ^1.0.1
-    promise-retry: ^2.0.1
-    semver: ^7.3.5
-    which: ^2.0.2
-  checksum: 1f89752df7b836f378b8828423c6ae344fe59399915b9460acded19686e2d0626246251a3cd4cc411ed21c1be6fe7f0c2195c17f392e88748581262ee806dc33
-  languageName: node
-  linkType: hard
-
 "@npmcli/git@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "@npmcli/git@npm:3.0.0"
+  version: 3.0.1
+  resolution: "@npmcli/git@npm:3.0.1"
   dependencies:
-    "@npmcli/promise-spawn": ^1.3.2
-    lru-cache: ^7.3.1
+    "@npmcli/promise-spawn": ^3.0.0
+    lru-cache: ^7.4.4
     mkdirp: ^1.0.4
     npm-pick-manifest: ^7.0.0
     proc-log: ^2.0.0
@@ -1108,11 +964,11 @@ __metadata:
     promise-retry: ^2.0.1
     semver: ^7.3.5
     which: ^2.0.2
-  checksum: 3978020d439fd2cd9a7b00ebdbbefbbe8a81b99399ac9ecdd1984d1a236f1a75fb1292f30f6a94a8f576e34419b7e240954424e68d9d8d9cde49fb8a77a16a1d
+  checksum: 0e289d11e2d6034652993f2d05f68396d8377603a1c1f983b2d0893e7591a22bcf3896a43c7dfbcc43f03c308a110f0b9ec37e0191e48b0bd1d236e0f57a3ec6
   languageName: node
   linkType: hard
 
-"@npmcli/installed-package-contents@npm:^1.0.6, @npmcli/installed-package-contents@npm:^1.0.7":
+"@npmcli/installed-package-contents@npm:^1.0.7":
   version: 1.0.7
   resolution: "@npmcli/installed-package-contents@npm:1.0.7"
   dependencies:
@@ -1124,61 +980,37 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@npmcli/map-workspaces@npm:*, @npmcli/map-workspaces@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "@npmcli/map-workspaces@npm:2.0.0"
-  dependencies:
-    "@npmcli/name-from-folder": ^1.0.1
-    glob: ^7.1.6
-    minimatch: ^3.0.4
-    read-package-json-fast: ^2.0.1
-  checksum: 33707f80cc556aca2d748e228bbe62b6d7ae4a6e95b18b94ca64dd72e9c071ace29e7dd140bce4c2f96a238e40030212ee0ac00dda6026c7b2e23b2f173d75c8
-  languageName: node
-  linkType: hard
-
-"@npmcli/map-workspaces@npm:^2.0.1, @npmcli/map-workspaces@npm:^2.0.2":
-  version: 2.0.2
-  resolution: "@npmcli/map-workspaces@npm:2.0.2"
+"@npmcli/map-workspaces@npm:*, @npmcli/map-workspaces@npm:^2.0.2, @npmcli/map-workspaces@npm:^2.0.3":
+  version: 2.0.3
+  resolution: "@npmcli/map-workspaces@npm:2.0.3"
   dependencies:
     "@npmcli/name-from-folder": ^1.0.1
-    glob: ^7.2.0
+    glob: ^8.0.1
     minimatch: ^5.0.1
     read-package-json-fast: ^2.0.3
-  checksum: 0de1c757c0067eda1d0ab7ee71749d9066b7c8159ec631ed38cd0fe444e984255fb24c412e3a592724feb823fd40d5caffe28165139fcca93b504c33b50c2bc0
-  languageName: node
-  linkType: hard
-
-"@npmcli/metavuln-calculator@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "@npmcli/metavuln-calculator@npm:2.0.0"
-  dependencies:
-    cacache: ^15.0.5
-    json-parse-even-better-errors: ^2.3.1
-    pacote: ^12.0.0
-    semver: ^7.3.2
-  checksum: bf88115e7c52a5fcf9d3f06d47eeb18acb6077327ee035661b6e4c26102b5e963aa3461679a50fb54427ff4526284a8fdebc743689dd7d71d8ee3814e8f341ee
+  checksum: c9878a22168d3f2d8df9e339ed0799628db3ea8502bd623b5bbe7b0dfcac065b3310e4093df94667a4a28ef2c54c02ce6956467a8aaa2e150305f2fe1cd64f9d
   languageName: node
   linkType: hard
 
 "@npmcli/metavuln-calculator@npm:^3.0.1":
-  version: 3.0.1
-  resolution: "@npmcli/metavuln-calculator@npm:3.0.1"
+  version: 3.1.0
+  resolution: "@npmcli/metavuln-calculator@npm:3.1.0"
   dependencies:
     cacache: ^16.0.0
     json-parse-even-better-errors: ^2.3.1
     pacote: ^13.0.3
     semver: ^7.3.5
-  checksum: 9f139806ed20d3c46d010ec512c339380d88d3774130dbc0067b5b3fd2b39649bb05c87c55d325e26c8f21e58b16d2b20c9ff1fbaa54d22422ab76e64ce594c5
+  checksum: 39fb474e239d3f221178f0c2f6089cd4a2fce8183343b7f52f8f9fe0b3cb0a98b386b15c9afe63a0b0dc2ae5302497d00eb2de2f4b3431953dbf05e69d613c9a
   languageName: node
   linkType: hard
 
-"@npmcli/move-file@npm:^1.0.1, @npmcli/move-file@npm:^1.1.0, @npmcli/move-file@npm:^1.1.2":
-  version: 1.1.2
-  resolution: "@npmcli/move-file@npm:1.1.2"
+"@npmcli/move-file@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "@npmcli/move-file@npm:2.0.0"
   dependencies:
     mkdirp: ^1.0.4
     rimraf: ^3.0.2
-  checksum: c96381d4a37448ea280951e46233f7e541058cf57a57d4094dd4bdcaae43fa5872b5f2eb6bfb004591a68e29c5877abe3cdc210cb3588cbf20ab2877f31a7de7
+  checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0
   languageName: node
   linkType: hard
 
@@ -1189,52 +1021,40 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@npmcli/node-gyp@npm:^1.0.2, @npmcli/node-gyp@npm:^1.0.3":
-  version: 1.0.3
-  resolution: "@npmcli/node-gyp@npm:1.0.3"
-  checksum: 496d5eef2e90e34bb07e96adbcbbce3dba5370ae87e8c46ff5b28570848f35470c8e008b8f69e50863632783e0a9190e6f55b2e4b049c537142821153942d26a
+"@npmcli/node-gyp@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "@npmcli/node-gyp@npm:2.0.0"
+  checksum: b6bbf0015000f9b64d31aefdc30f244b0348c57adb64017667e0304e96c38644d83da46a4581252652f5d606268df49118f9c9993b41d8020f62b7b15dd2c8d8
   languageName: node
   linkType: hard
 
-"@npmcli/package-json@npm:*, @npmcli/package-json@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "@npmcli/package-json@npm:1.0.1"
+"@npmcli/package-json@npm:*, @npmcli/package-json@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "@npmcli/package-json@npm:2.0.0"
   dependencies:
     json-parse-even-better-errors: ^2.3.1
-  checksum: 08b66c8ddb1d6b678975a83006d2fe5070b3013bcb68ea9d54c0142538a614596ddfd1143183fbb8f82c5cecf477d98f3c4e473ef34df3bbf3814e97e37e18d3
+  checksum: 7a598e42d2778654ec87438ebfafbcbafbe5a5f5e89ed2ca1db6ca3f94ef14655e304aa41f77632a2a3f5c66b6bd5960bd9370e0ceb4902ea09346720364f9e4
   languageName: node
   linkType: hard
 
-"@npmcli/promise-spawn@npm:^1.2.0, @npmcli/promise-spawn@npm:^1.3.2":
-  version: 1.3.2
-  resolution: "@npmcli/promise-spawn@npm:1.3.2"
+"@npmcli/promise-spawn@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "@npmcli/promise-spawn@npm:3.0.0"
   dependencies:
     infer-owner: ^1.0.4
-  checksum: 543b7c1e26230499b4100b10d45efa35b1077e8f25595050f34930ca3310abe9524f7387279fe4330139e0f28a0207595245503439276fd4b686cca2b6503080
-  languageName: node
-  linkType: hard
-
-"@npmcli/run-script@npm:*, @npmcli/run-script@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "@npmcli/run-script@npm:2.0.0"
-  dependencies:
-    "@npmcli/node-gyp": ^1.0.2
-    "@npmcli/promise-spawn": ^1.3.2
-    node-gyp: ^8.2.0
-    read-package-json-fast: ^2.0.1
-  checksum: c016ea9411e434d84e9bb9c30814c2868eee3ff32625f3e1af4671c3abfe0768739ffb2dba5520da926ae44315fc5f507b744f0626a80bc9461f2f19760e5fa0
+  checksum: 3454465a2731cea5875ba51f80873e2205e5bd878c31517286b0ede4ea931c7bf3de895382287e906d03710fff6f9e44186bd0eee068ce578901c5d3b58e7692
   languageName: node
   linkType: hard
 
-"@npmcli/run-script@npm:^3.0.0, @npmcli/run-script@npm:^3.0.1":
-  version: 3.0.1
-  resolution: "@npmcli/run-script@npm:3.0.1"
+"@npmcli/run-script@npm:*, @npmcli/run-script@npm:^3.0.0, @npmcli/run-script@npm:^3.0.1":
+  version: 3.0.2
+  resolution: "@npmcli/run-script@npm:3.0.2"
   dependencies:
-    "@npmcli/node-gyp": ^1.0.3
-    "@npmcli/promise-spawn": ^1.3.2
+    "@npmcli/node-gyp": ^2.0.0
+    "@npmcli/promise-spawn": ^3.0.0
     node-gyp: ^9.0.0
     read-package-json-fast: ^2.0.3
-  checksum: 81fd97182ef84d976f3e808f6aac0cec0ec4096fcfad59f606f4068aa1b4f79d510354804459467c1f98c453a5739937f88e1141a30450d4379bf175f23d46a1
+  checksum: b874637640b6a025611eb46de45f0df6b599bb97925370b81430a3fc0f900e1b0d31510b6d75a4b3821d41a6915912be1102afe7fef5028f15a35a447e9d2005
   languageName: node
   linkType: hard
 
@@ -1261,17 +1081,17 @@ __metadata:
   linkType: hard
 
 "@octokit/core@npm:^3.5.1":
-  version: 3.5.1
-  resolution: "@octokit/core@npm:3.5.1"
+  version: 3.6.0
+  resolution: "@octokit/core@npm:3.6.0"
   dependencies:
     "@octokit/auth-token": ^2.4.4
     "@octokit/graphql": ^4.5.8
-    "@octokit/request": ^5.6.0
+    "@octokit/request": ^5.6.3
     "@octokit/request-error": ^2.0.5
     "@octokit/types": ^6.0.3
     before-after-hook: ^2.2.0
     universal-user-agent: ^6.0.0
-  checksum: 67179739fc9712b201f2400f132287a2c56a18506e00900bc9d2a3f742b74f1ba69ad998e42f28f3964c0bd1d5478232c1ec7b485c97702b821fbe22b76afa90
+  checksum: f81160129037bd8555d47db60cd5381637b7e3602ad70735a7bdf8f3d250c7b7114a666bb12ef7a8746a326a5d72ed30a1b8f8a5a170007f7285c8e217bef1f0
   languageName: node
   linkType: hard
 
@@ -1347,17 +1167,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@octokit/request@npm:^5.6.0":
-  version: 5.6.2
-  resolution: "@octokit/request@npm:5.6.2"
+"@octokit/request@npm:^5.6.0, @octokit/request@npm:^5.6.3":
+  version: 5.6.3
+  resolution: "@octokit/request@npm:5.6.3"
   dependencies:
     "@octokit/endpoint": ^6.0.1
     "@octokit/request-error": ^2.1.0
     "@octokit/types": ^6.16.1
     is-plain-object: ^5.0.0
-    node-fetch: ^2.6.1
+    node-fetch: ^2.6.7
     universal-user-agent: ^6.0.0
-  checksum: 51ef3ad244b3d89ffd6d997fa0ed3e13a7a93b4c868ce5c53b0fcc93a654965135528e62d0720ebfeb7dfd586448a4a45d08fd75ba2e170cfa19d37834e49f1f
+  checksum: c0b4542eb4baaf880d673c758d3e0b5c4a625a4ae30abf40df5548b35f1ff540edaac74625192b1aff42a79ac661e774da4ab7d5505f1cb4ef81239b1e8510c5
   languageName: node
   linkType: hard
 
@@ -1446,12 +1266,12 @@ __metadata:
   linkType: hard
 
 "@rollup/pluginutils@npm:^4.1.1":
-  version: 4.2.0
-  resolution: "@rollup/pluginutils@npm:4.2.0"
+  version: 4.2.1
+  resolution: "@rollup/pluginutils@npm:4.2.1"
   dependencies:
     estree-walker: ^2.0.1
     picomatch: ^2.2.2
-  checksum: 2e86d9bfb95919727bcba0bbbdbedc98e25a1e51fe3047f18ec6d85e0743d1c73e1c0de3f9fdbd2ff6b90c32f30d4b2706c9e794f3c2e7a80156980081558e2e
+  checksum: 6bc41f22b1a0f1efec3043899e4d3b6b1497b3dea4d94292d8f83b4cf07a1073ecbaedd562a22d11913ff7659f459677b01b09e9598a98936e746780ecc93a12
   languageName: node
   linkType: hard
 
@@ -1505,8 +1325,8 @@ __metadata:
   linkType: hard
 
 "@semantic-release/github@npm:^8.0.0":
-  version: 8.0.2
-  resolution: "@semantic-release/github@npm:8.0.2"
+  version: 8.0.4
+  resolution: "@semantic-release/github@npm:8.0.4"
   dependencies:
     "@octokit/rest": ^18.0.0
     "@semantic-release/error": ^2.2.0
@@ -1526,7 +1346,7 @@ __metadata:
     url-join: ^4.0.0
   peerDependencies:
     semantic-release: ">=18.0.0-beta.1"
-  checksum: 260ecf3fc0aaf2dad87ba85aadf779083015b8c413f8526c28cf10a9cc0c0faa72ddc742ea1170c848985f33d5f3adfe67c2a171e658c13d3819253e701a9231
+  checksum: e344b26f12891fe7ba157473d1c9c4ceebe2165cc0ba64fef36e20bc857694afe5e9c4bf196301b7b6fea2686c6a995949dc30d35d52120a8b6fef6016d76714
   languageName: node
   linkType: hard
 
@@ -1634,13 +1454,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@tootallnate/once@npm:1":
-  version: 1.1.2
-  resolution: "@tootallnate/once@npm:1.1.2"
-  checksum: e1fb1bbbc12089a0cb9433dc290f97bddd062deadb6178ce9bcb93bb7c1aecde5e60184bc7065aec42fe1663622a213493c48bbd4972d931aae48315f18e1be9
-  languageName: node
-  linkType: hard
-
 "@tootallnate/once@npm:2":
   version: 2.0.0
   resolution: "@tootallnate/once@npm:2.0.0"
@@ -1661,11 +1474,11 @@ __metadata:
   linkType: hard
 
 "@types/clownface@npm:*":
-  version: 1.2.6
-  resolution: "@types/clownface@npm:1.2.6"
+  version: 1.5.0
+  resolution: "@types/clownface@npm:1.5.0"
   dependencies:
     rdf-js: ^4.0.2
-  checksum: 6bd310f8395fe1d3e16afbe4faa2be67e00ee3823764aa8f8a8b61b8c5805fd5afe5c8ba1a2665c431f94fc68143e4dd5434e712eaa1238e9fd07eafe049d2da
+  checksum: 2270532edf6d27adce48bda7edf8e019cf585e4dddc47d7f207a619c01aa481885f26ed217d35f73aa8c23bc93f53edfebda7db3f1b556564041579e48b0d39c
   languageName: node
   linkType: hard
 
@@ -1702,10 +1515,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/json-buffer@npm:~3.0.0":
+  version: 3.0.0
+  resolution: "@types/json-buffer@npm:3.0.0"
+  checksum: 6b0a371dd603f0eec9d00874574bae195382570e832560dadf2193ee0d1062b8e0694bbae9798bc758632361c227b1e3b19e3bd914043b498640470a2da38b77
+  languageName: node
+  linkType: hard
+
 "@types/json-schema@npm:^7.0.9":
-  version: 7.0.10
-  resolution: "@types/json-schema@npm:7.0.10"
-  checksum: 369f12207298e3c8931100ab86c9c60d9217ab930a8ae0b851495f4f30695d3f0eb431eedc8e8d9c69357869899ea0fe6f9d65ddde5ea70415d67ef340dfdd1f
+  version: 7.0.11
+  resolution: "@types/json-schema@npm:7.0.11"
+  checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d
   languageName: node
   linkType: hard
 
@@ -1717,18 +1537,18 @@ __metadata:
   linkType: hard
 
 "@types/keyv@npm:*":
-  version: 3.1.3
-  resolution: "@types/keyv@npm:3.1.3"
+  version: 3.1.4
+  resolution: "@types/keyv@npm:3.1.4"
   dependencies:
     "@types/node": "*"
-  checksum: b5f8aa592cc21c16d99e69aec0976f12b893b055e4456d90148a610a6b6088e297b2ba5f38f8c8280cef006cfd8f9ec99e069905020882619dc5fc8aa46f5f27
+  checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d
   languageName: node
   linkType: hard
 
 "@types/lodash@npm:^4.14.178":
-  version: 4.14.180
-  resolution: "@types/lodash@npm:4.14.180"
-  checksum: fc42ae3473695cac6e91553f832fef8eb51a31c1c0381cafa81b00dc3efe18e279786bdda77caf0b90a8340ba2ba7aa46ae6541d69870565f775d04c89128bc1
+  version: 4.14.182
+  resolution: "@types/lodash@npm:4.14.182"
+  checksum: 7dd137aa9dbabd632408bd37009d984655164fa1ecc3f2b6eb94afe35bf0a5852cbab6183148d883e9c73a958b7fec9a9bcf7c8e45d41195add6a18c34958209
   languageName: node
   linkType: hard
 
@@ -1757,9 +1577,9 @@ __metadata:
   linkType: hard
 
 "@types/node@npm:*":
-  version: 17.0.7
-  resolution: "@types/node@npm:17.0.7"
-  checksum: 3cb3024f8c12152f609fabadd66d55e1b02f2a1fd61ae859755d493f01f0e15e66f71784e2f1dac57133415083a426effd12210eb4ed4f2a35d190836eb789ae
+  version: 17.0.31
+  resolution: "@types/node@npm:17.0.31"
+  checksum: 704618350f8420d5c47db0f7778398e821b7724369946f5c441a7e6b9343295553936400eb8309f0b07d5e39c240988ab3456b983712ca86265dabc9aee4ad3d
   languageName: node
   linkType: hard
 
@@ -1819,10 +1639,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/retry@npm:^0.12.0":
-  version: 0.12.1
-  resolution: "@types/retry@npm:0.12.1"
-  checksum: 5f46b2556053655f78262bb33040dc58417c900457cc63ff37d6c35349814471453ef511af0cec76a540c601296cd2b22f64bab1ab649c0dacc0223765ba876c
+"@types/retry@npm:0.12.0":
+  version: 0.12.0
+  resolution: "@types/retry@npm:0.12.0"
+  checksum: 61a072c7639f6e8126588bf1eb1ce8835f2cb9c2aba795c4491cf6310e013267b0c8488039857c261c387e9728c1b43205099223f160bb6a76b4374f741b5603
   languageName: node
   linkType: hard
 
@@ -1868,12 +1688,12 @@ __metadata:
   linkType: hard
 
 "@typescript-eslint/eslint-plugin@npm:^5.15.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/eslint-plugin@npm:5.16.0"
+  version: 5.22.0
+  resolution: "@typescript-eslint/eslint-plugin@npm:5.22.0"
   dependencies:
-    "@typescript-eslint/scope-manager": 5.16.0
-    "@typescript-eslint/type-utils": 5.16.0
-    "@typescript-eslint/utils": 5.16.0
+    "@typescript-eslint/scope-manager": 5.22.0
+    "@typescript-eslint/type-utils": 5.22.0
+    "@typescript-eslint/utils": 5.22.0
     debug: ^4.3.2
     functional-red-black-tree: ^1.0.1
     ignore: ^5.1.8
@@ -1886,53 +1706,42 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 4007cc1599503424037300e7401fb969ca441b122ef8a8f2fc8d70f84d656fdf7ab7b0d00e506a3aaf702871616c3756da17eb1508ff315dfb25170f2d28a904
-  languageName: node
-  linkType: hard
-
-"@typescript-eslint/experimental-utils@npm:^5.0.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/experimental-utils@npm:5.16.0"
-  dependencies:
-    "@typescript-eslint/utils": 5.16.0
-  peerDependencies:
-    eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-  checksum: 2e51aac3ebcfb781b0899f1068b686fd425270218ae63d719af053595cf047b6d97c575a62ad51da8836779690a37c3b62ecd5e7f00ab1e693d65c7fbfab03aa
+  checksum: 3b083f7003f091c3ef7b3970dca9cfd507ab8c52a9b8a52259c630010adf765e9766f0e6fd9c901fc0e807319a4e8c003e12287b1f12a4b9eb4d7222e8d6db83
   languageName: node
   linkType: hard
 
 "@typescript-eslint/parser@npm:^5.15.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/parser@npm:5.16.0"
+  version: 5.22.0
+  resolution: "@typescript-eslint/parser@npm:5.22.0"
   dependencies:
-    "@typescript-eslint/scope-manager": 5.16.0
-    "@typescript-eslint/types": 5.16.0
-    "@typescript-eslint/typescript-estree": 5.16.0
+    "@typescript-eslint/scope-manager": 5.22.0
+    "@typescript-eslint/types": 5.22.0
+    "@typescript-eslint/typescript-estree": 5.22.0
     debug: ^4.3.2
   peerDependencies:
     eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 40006578e9ac451c80dc4b4b7e29af97b53fb9e9ea660d6ca17fb98b5c9858c648f9b17523c9de9b9b9e4155af17b65435e6163f02c4a2dfacf48274f45cba21
+  checksum: 28a7d4b73154fc97336be9a4efd5ffdc659f748232c82479909e86ed87ed8a78d23280b3aaf532ca4e735caaffac43d9576e6af2dfd11865e30a9d70c8a3f275
   languageName: node
   linkType: hard
 
-"@typescript-eslint/scope-manager@npm:5.16.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/scope-manager@npm:5.16.0"
+"@typescript-eslint/scope-manager@npm:5.22.0":
+  version: 5.22.0
+  resolution: "@typescript-eslint/scope-manager@npm:5.22.0"
   dependencies:
-    "@typescript-eslint/types": 5.16.0
-    "@typescript-eslint/visitor-keys": 5.16.0
-  checksum: 008a6607d3e6ebcc59a9b28cddcc25703f39a88e27a96c69a6d988acc50a1ea7dbf50963c165ffa5b85a101209a0da3a7ec6832633a162ca4ecc78c0e54acd9f
+    "@typescript-eslint/types": 5.22.0
+    "@typescript-eslint/visitor-keys": 5.22.0
+  checksum: ebf2ad44f4e5a4dfd55225419804f81f68056086c20f1549adbcca4236634eac3aae461e30d6cab6539ce6f42346ed6e1fbbb2710d2cc058a3283ef91a0fe174
   languageName: node
   linkType: hard
 
-"@typescript-eslint/type-utils@npm:5.16.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/type-utils@npm:5.16.0"
+"@typescript-eslint/type-utils@npm:5.22.0":
+  version: 5.22.0
+  resolution: "@typescript-eslint/type-utils@npm:5.22.0"
   dependencies:
-    "@typescript-eslint/utils": 5.16.0
+    "@typescript-eslint/utils": 5.22.0
     debug: ^4.3.2
     tsutils: ^3.21.0
   peerDependencies:
@@ -1940,23 +1749,23 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 86d9f1dff6a096c8465453b8c7d0cc667b87a769f19073bfa9bbd36f8baa772c0384ec396b1132052383846bbbcf0d051345ed7d373260c1b506ed27100b383d
+  checksum: 7128085bfbeca3a9646a795a34730cdfeca110bc00240569f6a7b3dc0854680afa56e015715675a78198b414de869339bd6036cc33cb14903919780a60321a95
   languageName: node
   linkType: hard
 
-"@typescript-eslint/types@npm:5.16.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/types@npm:5.16.0"
-  checksum: 0450125741c3eef9581da0b75b4a987a633d77009cfb03507c3db29885b790ee80e3c0efc4f9a0dd3376ba758b49c7829722676153472616a57bb04bce5cc4fa
+"@typescript-eslint/types@npm:5.22.0":
+  version: 5.22.0
+  resolution: "@typescript-eslint/types@npm:5.22.0"
+  checksum: 74f822c5a3b96bba05229eea4ed370c4bd48b17f475c37f08d6ba708adf65c3aa026bb544f1d0308c96e043b30015e396fd53b1e8e4e9fbb6dc9c92d2ccc0a15
   languageName: node
   linkType: hard
 
-"@typescript-eslint/typescript-estree@npm:5.16.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/typescript-estree@npm:5.16.0"
+"@typescript-eslint/typescript-estree@npm:5.22.0":
+  version: 5.22.0
+  resolution: "@typescript-eslint/typescript-estree@npm:5.22.0"
   dependencies:
-    "@typescript-eslint/types": 5.16.0
-    "@typescript-eslint/visitor-keys": 5.16.0
+    "@typescript-eslint/types": 5.22.0
+    "@typescript-eslint/visitor-keys": 5.22.0
     debug: ^4.3.2
     globby: ^11.0.4
     is-glob: ^4.0.3
@@ -1965,33 +1774,33 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 930ead4655712c3bd40885fb6b2074cd3c10fb03da864dd7a7dd2e43abfd330bb07e505f0aec8b4846178bff8befbb017f9f3370c67e9c717e4cb8d3df6e16ef
+  checksum: 2797a79d7d32a9a547b7f1de77a353d8e8c8519791f865f5e061bfc4918d12cdaddec51afa015f5aac5d068ef525c92bd65afc83b84dc9e52e697303acf0873a
   languageName: node
   linkType: hard
 
-"@typescript-eslint/utils@npm:5.16.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/utils@npm:5.16.0"
+"@typescript-eslint/utils@npm:5.22.0, @typescript-eslint/utils@npm:^5.10.2":
+  version: 5.22.0
+  resolution: "@typescript-eslint/utils@npm:5.22.0"
   dependencies:
     "@types/json-schema": ^7.0.9
-    "@typescript-eslint/scope-manager": 5.16.0
-    "@typescript-eslint/types": 5.16.0
-    "@typescript-eslint/typescript-estree": 5.16.0
+    "@typescript-eslint/scope-manager": 5.22.0
+    "@typescript-eslint/types": 5.22.0
+    "@typescript-eslint/typescript-estree": 5.22.0
     eslint-scope: ^5.1.1
     eslint-utils: ^3.0.0
   peerDependencies:
     eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-  checksum: 46749091a204d7cf80d81b04704e23a86903a142a7e35cc5068a821c147c3bf098a7eff99af2b0e2ea7310013ca90300db9bab33ae5e3b5f773ed1d2961a5ed4
+  checksum: 5019485e76d754a7a60c042545fd884dc666fddf9d4223ff706bbf0c275f19ea25a6b210fb5cf7ed368b019fe538fd854a925e9c6f12007d51b1731a29d95cc1
   languageName: node
   linkType: hard
 
-"@typescript-eslint/visitor-keys@npm:5.16.0":
-  version: 5.16.0
-  resolution: "@typescript-eslint/visitor-keys@npm:5.16.0"
+"@typescript-eslint/visitor-keys@npm:5.22.0":
+  version: 5.22.0
+  resolution: "@typescript-eslint/visitor-keys@npm:5.22.0"
   dependencies:
-    "@typescript-eslint/types": 5.16.0
+    "@typescript-eslint/types": 5.22.0
     eslint-visitor-keys: ^3.0.0
-  checksum: b587bf3b0da95bb58ff877b75fefcee6472222de1e3ec76aa4b94cae66078b62a372c7d0343374a16aab15cdcbae3f9e019624028b35827f68ef6559389f7fd0
+  checksum: d30dfa98dcce75da49a6a204a0132d42e63228c35681cb9b3643e47a0a24a633e259832d48d101265bd85b8eb5a9f2b4858f9447646c1d3df6a2ac54258dfe8f
   languageName: node
   linkType: hard
 
@@ -2167,18 +1976,18 @@ __metadata:
   linkType: hard
 
 "@vue/composition-api@npm:^1.4.5":
-  version: 1.4.9
-  resolution: "@vue/composition-api@npm:1.4.9"
+  version: 1.6.0
+  resolution: "@vue/composition-api@npm:1.6.0"
   peerDependencies:
     vue: ">= 2.5 < 3"
-  checksum: 08853aee4326804f9b8e53d7abc53bbcfc44e1b9df260644656ae39803b4c3427d5deeb87821413a1e82737704447743cf573315f3f4f038c2b29c7cf6cd5910
+  checksum: ffbd1ba769e58f8ab69ef94fbe9fb956924c5cb3d5fac5ecb2991595348f9d0e15456d0a971bdaf547ed9f6cd5690082ff2705d2439cf7569165a648837fe308
   languageName: node
   linkType: hard
 
-"@vue/devtools-api@npm:^6.1.0":
-  version: 6.1.3
-  resolution: "@vue/devtools-api@npm:6.1.3"
-  checksum: 1ed9171ef889eb94ab69715ecb5c03c3d5df4639c02aac9ae35f880e186de2fdc7dfe1d1efd945878131871815fc88aeeaf64dac58ec31e09a96ec5f5e484bf9
+"@vue/devtools-api@npm:^6.1.4":
+  version: 6.1.4
+  resolution: "@vue/devtools-api@npm:6.1.4"
+  checksum: 027bb138b03ec7147dd15e5d0ef28d5b72c822530396cc8a86bc6fdb049dc6850314b9e897e497064e3ed47fad229a18141f56b8b8ca3d41092a576dc5b6538d
   languageName: node
   linkType: hard
 
@@ -2425,29 +2234,29 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@windicss/config@npm:1.8.3":
-  version: 1.8.3
-  resolution: "@windicss/config@npm:1.8.3"
+"@windicss/config@npm:1.8.4":
+  version: 1.8.4
+  resolution: "@windicss/config@npm:1.8.4"
   dependencies:
-    debug: ^4.3.3
+    debug: ^4.3.4
     jiti: ^1.13.0
     windicss: ^3.5.1
-  checksum: e60cbb3eff1a5a5a02b302af2bed3f1fbadf82ab25821db05b950befee85e55df8bb24cdc54bf70a0e402781c958af4b009bc9ed4938a9e00c545b69e2658463
+  checksum: 2913d34ce205c6d337b0bc3d2f138260811b16df5dbb0a54a067a29b87d1067a8be0d2575a18a077445629d0589a8c9a22b3df7dac81f880154dd859436f9a72
   languageName: node
   linkType: hard
 
-"@windicss/plugin-utils@npm:1.8.3":
-  version: 1.8.3
-  resolution: "@windicss/plugin-utils@npm:1.8.3"
+"@windicss/plugin-utils@npm:1.8.4":
+  version: 1.8.4
+  resolution: "@windicss/plugin-utils@npm:1.8.4"
   dependencies:
-    "@antfu/utils": ^0.5.0
-    "@windicss/config": 1.8.3
-    debug: ^4.3.3
+    "@antfu/utils": ^0.5.1
+    "@windicss/config": 1.8.4
+    debug: ^4.3.4
     fast-glob: ^3.2.11
-    magic-string: ^0.25.7
-    micromatch: ^4.0.4
+    magic-string: ^0.26.1
+    micromatch: ^4.0.5
     windicss: ^3.5.1
-  checksum: 9af4cd77b0efd38d671cb64a26ba18c4995d884e5ed31d2fab49170d565cfb5d0efd59525ef1d98dc756872da5b4eff424ccd99b04cf2735280723545789a246
+  checksum: 1fdd8b50b73d4e0dd5efd733acc53d94158c5ecce671386e0703bc9415a495e6a7e16682c18dd05f99c4677af97e041c79b3268ccc912ccbb6ecec895c2dcfd3
   languageName: node
   linkType: hard
 
@@ -2511,12 +2320,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"acorn@npm:^8.7.0":
-  version: 8.7.0
-  resolution: "acorn@npm:8.7.0"
+"acorn@npm:^8.5.0, acorn@npm:^8.7.0":
+  version: 8.7.1
+  resolution: "acorn@npm:8.7.1"
   bin:
     acorn: bin/acorn
-  checksum: e0f79409d68923fbf1aa6d4166f3eedc47955320d25c89a20cc822e6ba7c48c5963d5bc657bc242d68f7a4ac9faf96eef033e8f73656da6c640d4219935fdfd0
+  checksum: aca0aabf98826717920ac2583fdcad0a6fbe4e583fdb6e843af2594e907455aeafe30b1e14f1757cd83ce1776773cf8296ffc3a4acf13f0bd3dfebcf1db6ae80
   languageName: node
   linkType: hard
 
@@ -2529,17 +2338,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"agentkeepalive@npm:^4.1.3":
-  version: 4.1.4
-  resolution: "agentkeepalive@npm:4.1.4"
-  dependencies:
-    debug: ^4.1.0
-    depd: ^1.1.2
-    humanize-ms: ^1.2.1
-  checksum: d49c24d4b333e9507119385895a583872f4f53d62764a89be165926e824056a126955bae4a6d3c6f7cd26f4089621a40f7b27675f7868214d82118f744b9e82d
-  languageName: node
-  linkType: hard
-
 "agentkeepalive@npm:^4.2.1":
   version: 4.2.1
   resolution: "agentkeepalive@npm:4.2.1"
@@ -2609,24 +2407,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ansi-regex@npm:^2.0.0":
-  version: 2.1.1
-  resolution: "ansi-regex@npm:2.1.1"
-  checksum: 190abd03e4ff86794f338a31795d262c1dfe8c91f7e01d04f13f646f1dcb16c5800818f886047876f1272f065570ab86b24b99089f8b68a0e11ff19aed4ca8f1
-  languageName: node
-  linkType: hard
-
-"ansi-regex@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "ansi-regex@npm:3.0.0"
-  checksum: 2ad11c416f81c39f5c65eafc88cf1d71aa91d76a2f766e75e457c2a3c43e8a003aadbf2966b61c497aa6a6940a36412486c975b3270cdfc3f413b69826189ec3
-  languageName: node
-  linkType: hard
-
 "ansi-regex@npm:^4.1.0":
-  version: 4.1.0
-  resolution: "ansi-regex@npm:4.1.0"
-  checksum: 97aa4659538d53e5e441f5ef2949a3cffcb838e57aeaad42c4194e9d7ddb37246a6526c4ca85d3940a9d1e19b11cc2e114530b54c9d700c8baf163c31779baf8
+  version: 4.1.1
+  resolution: "ansi-regex@npm:4.1.1"
+  checksum: b1a6ee44cb6ecdabaa770b2ed500542714d4395d71c7e5c25baa631f680fb2ad322eb9ba697548d498a6fd366949fc8b5bfcf48d49a32803611f648005b01888
   languageName: node
   linkType: hard
 
@@ -2676,7 +2460,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ansistyles@npm:*, ansistyles@npm:~0.1.3":
+"ansistyles@npm:*":
   version: 0.1.3
   resolution: "ansistyles@npm:0.1.3"
   checksum: 0072507f97e46cc3cb71439f1c0935ceec5c8bca812ebb5034b9f8f6a9ee7d65cdc150c375b8d56643fc8305a08542f6df3a1cd6c80e32eba0b27c4e72da4efd
@@ -2710,7 +2494,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"aproba@npm:^1.0.3, aproba@npm:^1.1.1":
+"aproba@npm:^1.1.1":
   version: 1.2.0
   resolution: "aproba@npm:1.2.0"
   checksum: 0fca141966559d195072ed047658b6e6c4fe92428c385dd38e288eacfc55807e7b4989322f030faff32c0f46bb0bc10f1e0ac32ec22d25315a1e5bbc0ebb76dc
@@ -2724,16 +2508,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"are-we-there-yet@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "are-we-there-yet@npm:2.0.0"
-  dependencies:
-    delegates: ^1.0.0
-    readable-stream: ^3.6.0
-  checksum: 6c80b4fd04ecee6ba6e737e0b72a4b41bdc64b7d279edfc998678567ff583c8df27e27523bc789f2c99be603ffa9eaa612803da1d886962d2086e7ff6fa90c7c
-  languageName: node
-  linkType: hard
-
 "are-we-there-yet@npm:^3.0.0":
   version: 3.0.0
   resolution: "are-we-there-yet@npm:3.0.0"
@@ -2744,16 +2518,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"are-we-there-yet@npm:~1.1.2":
-  version: 1.1.7
-  resolution: "are-we-there-yet@npm:1.1.7"
-  dependencies:
-    delegates: ^1.0.0
-    readable-stream: ^2.0.6
-  checksum: 70d251719c969b2745bfe5ddf3ebaefa846a636e90a6d5212573676af5d6670e15457761d4725731e19cbebdce42c4ab0cbedf23ab047f2a08274985aa10a3c7
-  languageName: node
-  linkType: hard
-
 "argparse@npm:^2.0.1":
   version: 2.0.1
   resolution: "argparse@npm:2.0.1"
@@ -2797,15 +2561,15 @@ __metadata:
   linkType: hard
 
 "array-includes@npm:^3.1.4":
-  version: 3.1.4
-  resolution: "array-includes@npm:3.1.4"
+  version: 3.1.5
+  resolution: "array-includes@npm:3.1.5"
   dependencies:
     call-bind: ^1.0.2
-    define-properties: ^1.1.3
-    es-abstract: ^1.19.1
+    define-properties: ^1.1.4
+    es-abstract: ^1.19.5
     get-intrinsic: ^1.1.1
     is-string: ^1.0.7
-  checksum: 69967c38c52698f84b50a7aed5554aadc89c6ac6399b6d92ad061a5952f8423b4bba054c51d40963f791dfa294d7247cdd7988b6b1f2c5861477031c6386e1c0
+  checksum: f6f24d834179604656b7bec3e047251d5cc87e9e87fab7c175c61af48e80e75acd296017abcde21fb52292ab6a2a449ab2ee37213ee48c8709f004d75983f9c5
   languageName: node
   linkType: hard
 
@@ -2847,13 +2611,14 @@ __metadata:
   linkType: hard
 
 "array.prototype.flat@npm:^1.2.5":
-  version: 1.2.5
-  resolution: "array.prototype.flat@npm:1.2.5"
+  version: 1.3.0
+  resolution: "array.prototype.flat@npm:1.3.0"
   dependencies:
     call-bind: ^1.0.2
     define-properties: ^1.1.3
-    es-abstract: ^1.19.0
-  checksum: 9cc6414b111abfc7717e39546e4887b1e5ec74df8f1618d83425deaa95752bf05d475d1d241253b4d88d4a01f8e1bc84845ad5b7cc2047f8db2f614512acd40e
+    es-abstract: ^1.19.2
+    es-shim-unscopables: ^1.0.0
+  checksum: 2a652b3e8dc0bebb6117e42a5ab5738af0203a14c27341d7bb2431467bdb4b348e2c5dc555dfcda8af0a5e4075c400b85311ded73861c87290a71a17c3e0a257
   languageName: node
   linkType: hard
 
@@ -3044,31 +2809,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"bin-links@npm:^2.3.0":
-  version: 2.3.0
-  resolution: "bin-links@npm:2.3.0"
-  dependencies:
-    cmd-shim: ^4.0.1
-    mkdirp-infer-owner: ^2.0.0
-    npm-normalize-package-bin: ^1.0.0
-    read-cmd-shim: ^2.0.0
-    rimraf: ^3.0.0
-    write-file-atomic: ^3.0.3
-  checksum: ec02b9b3fa50a8179baa656801de980023f25a71c1a39491fc5672277f0d76d2ae6330ecedf8f9c279ea3751664c46e5ed9a9e1be67c3c5792fa94b31000626f
-  languageName: node
-  linkType: hard
-
 "bin-links@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "bin-links@npm:3.0.0"
+  version: 3.0.1
+  resolution: "bin-links@npm:3.0.1"
   dependencies:
-    cmd-shim: ^4.0.1
+    cmd-shim: ^5.0.0
     mkdirp-infer-owner: ^2.0.0
     npm-normalize-package-bin: ^1.0.0
-    read-cmd-shim: ^2.0.0
+    read-cmd-shim: ^3.0.0
     rimraf: ^3.0.0
     write-file-atomic: ^4.0.0
-  checksum: 61cec54a913bf1897c29db1ac277c022cc97a7189a55b2ed7343e75955800e4ec149e76b134f9c685947e37196282d652bf1f9fa893919283827b61ca289b170
+  checksum: c608f0746c5851f259f7578ae5157d24fb019b00792d246bade6255136e5fbd41df43219a50d53f844c562afb6e41092a5f2b0be1bd890e08ff023d330327380
   languageName: node
   linkType: hard
 
@@ -3116,6 +2867,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"boolbase@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "boolbase@npm:1.0.0"
+  checksum: 3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0
+  languageName: node
+  linkType: hard
+
 "bootstrap-icons@npm:^1.8.1":
   version: 1.8.1
   resolution: "bootstrap-icons@npm:1.8.1"
@@ -3123,20 +2881,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"bootstrap-vue@npm:^2.20.1":
-  version: 2.21.2
-  resolution: "bootstrap-vue@npm:2.21.2"
-  dependencies:
-    "@nuxt/opencollective": ^0.3.2
-    bootstrap: ">=4.5.3 <5.0.0"
-    popper.js: ^1.16.1
-    portal-vue: ^2.1.7
-    vue-functional-data-merge: ^3.1.0
-  checksum: cf49df1a38917d9fcfca7f015f2660880c11cae8b36da612cb485c995af3823ec9da9620b65f9f5a8dfaa1c88d8bf03dfeb4a7501a6c2c52abc92c6c3af97319
-  languageName: node
-  linkType: hard
-
-"bootstrap-vue@npm:^2.22.0":
+"bootstrap-vue@npm:^2.20.1, bootstrap-vue@npm:^2.22.0":
   version: 2.22.0
   resolution: "bootstrap-vue@npm:2.22.0"
   dependencies:
@@ -3149,7 +2894,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"bootstrap@npm:>=4.5.3 <5.0.0, bootstrap@npm:^4.6.1":
+"bootstrap@npm:^4.6.1":
   version: 4.6.1
   resolution: "bootstrap@npm:4.6.1"
   peerDependencies:
@@ -3203,7 +2948,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"braces@npm:^3.0.1, braces@npm:~3.0.2":
+"braces@npm:^3.0.2, braces@npm:~3.0.2":
   version: 3.0.2
   resolution: "braces@npm:3.0.2"
   dependencies:
@@ -3292,18 +3037,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"browserslist@npm:^4.17.5":
-  version: 4.18.1
-  resolution: "browserslist@npm:4.18.1"
+"browserslist@npm:^4.20.2":
+  version: 4.20.3
+  resolution: "browserslist@npm:4.20.3"
   dependencies:
-    caniuse-lite: ^1.0.30001280
-    electron-to-chromium: ^1.3.896
+    caniuse-lite: ^1.0.30001332
+    electron-to-chromium: ^1.4.118
     escalade: ^3.1.1
-    node-releases: ^2.0.1
+    node-releases: ^2.0.3
     picocolors: ^1.0.0
   bin:
     browserslist: cli.js
-  checksum: ae58322deef15960fc2e601d71bc081b571cfab6705999a3d24db5325b9cfadf5f676615f4460207a93e600549c33d60d37b4502007fe9e737b3cc19e20575d5
+  checksum: 1e4b719ac2ca0fe235218a606e8b8ef16b8809e0973b924158c39fbc435a0b0fe43437ea52dd6ef5ad2efcb83fcb07431244e472270177814217f7c563651f7d
   languageName: node
   linkType: hard
 
@@ -3339,36 +3084,38 @@ __metadata:
   languageName: node
   linkType: hard
 
-"builtins@npm:^1.0.3":
-  version: 1.0.3
-  resolution: "builtins@npm:1.0.3"
-  checksum: 47ce94f7eee0e644969da1f1a28e5f29bd2e48b25b2bbb61164c345881086e29464ccb1fb88dbc155ea26e8b1f5fc8a923b26c8c1ed0935b67b644d410674513
+"builtins@npm:^5.0.0":
+  version: 5.0.1
+  resolution: "builtins@npm:5.0.1"
+  dependencies:
+    semver: ^7.0.0
+  checksum: 66d204657fe36522822a95b288943ad11b58f5eaede235b11d8c4edaa28ce4800087d44a2681524c340494aadb120a0068011acabe99d30e8f11a7d826d83515
   languageName: node
   linkType: hard
 
-"cacache@npm:*, cacache@npm:^15.0.3, cacache@npm:^15.0.5, cacache@npm:^15.2.0":
-  version: 15.3.0
-  resolution: "cacache@npm:15.3.0"
+"cacache@npm:*, cacache@npm:^16.0.0, cacache@npm:^16.0.2, cacache@npm:^16.0.6":
+  version: 16.0.7
+  resolution: "cacache@npm:16.0.7"
   dependencies:
-    "@npmcli/fs": ^1.0.0
-    "@npmcli/move-file": ^1.0.1
+    "@npmcli/fs": ^2.1.0
+    "@npmcli/move-file": ^2.0.0
     chownr: ^2.0.0
-    fs-minipass: ^2.0.0
-    glob: ^7.1.4
+    fs-minipass: ^2.1.0
+    glob: ^8.0.1
     infer-owner: ^1.0.4
-    lru-cache: ^6.0.0
-    minipass: ^3.1.1
+    lru-cache: ^7.7.1
+    minipass: ^3.1.6
     minipass-collect: ^1.0.2
     minipass-flush: ^1.0.5
-    minipass-pipeline: ^1.2.2
-    mkdirp: ^1.0.3
+    minipass-pipeline: ^1.2.4
+    mkdirp: ^1.0.4
     p-map: ^4.0.0
     promise-inflight: ^1.0.1
     rimraf: ^3.0.2
-    ssri: ^8.0.1
-    tar: ^6.0.2
+    ssri: ^9.0.0
+    tar: ^6.1.11
     unique-filename: ^1.1.1
-  checksum: a07327c27a4152c04eb0a831c63c00390d90f94d51bb80624a66f4e14a6b6360bbf02a84421267bd4d00ca73ac9773287d8d7169e8d2eafe378d2ce140579db8
+  checksum: 2155b099b7e0f0369fb1155ca4673532ca7efe2ebdbec63acca8743580b8446b5d4fd7184626b1cb059001af77b981cdc67035c7855544d365d4f048eafca2ca
   languageName: node
   linkType: hard
 
@@ -3395,32 +3142,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cacache@npm:^16.0.0, cacache@npm:^16.0.2":
-  version: 16.0.3
-  resolution: "cacache@npm:16.0.3"
-  dependencies:
-    "@npmcli/fs": ^2.1.0
-    "@npmcli/move-file": ^1.1.2
-    chownr: ^2.0.0
-    fs-minipass: ^2.1.0
-    glob: ^7.2.0
-    infer-owner: ^1.0.4
-    lru-cache: ^7.7.1
-    minipass: ^3.1.6
-    minipass-collect: ^1.0.2
-    minipass-flush: ^1.0.5
-    minipass-pipeline: ^1.2.4
-    mkdirp: ^1.0.4
-    p-map: ^4.0.0
-    promise-inflight: ^1.0.1
-    rimraf: ^3.0.2
-    ssri: ^8.0.1
-    tar: ^6.1.11
-    unique-filename: ^1.1.1
-  checksum: 9bb9a0bd1b8bee3284c6fa9dcb4b28a62b528dd181f7cd482319611b5d6df295a3594dcefc24d1a4f16162bac50d6facc183ed21935f3d09af6d16f620ea54d3
-  languageName: node
-  linkType: hard
-
 "cache-base@npm:^1.0.1":
   version: 1.0.1
   resolution: "cache-base@npm:1.0.1"
@@ -3502,10 +3223,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"caniuse-lite@npm:^1.0.30001280":
-  version: 1.0.30001282
-  resolution: "caniuse-lite@npm:1.0.30001282"
-  checksum: 62797fd756e88bfa01f0f983bea9de7814293b209456e8f0b20596b03d2880246f63dc90f947a1fa63f92806ebefbb86fc7811dbecb7839927886d07996938be
+"caniuse-lite@npm:^1.0.30001332":
+  version: 1.0.30001335
+  resolution: "caniuse-lite@npm:1.0.30001335"
+  checksum: fe08b49ec6cb76cc69958ff001cf89d0a8ef9f35e0c8028b65981585046384f76e007d64dea372a34ca56d91caa83cc614c00779fe2b4d378aa0e68696374f67
   languageName: node
   linkType: hard
 
@@ -3535,10 +3256,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"chalk@npm:*":
-  version: 5.0.0
-  resolution: "chalk@npm:5.0.0"
-  checksum: 6eba7c518b9aa5fe882ae6d14a1ffa58c418d72a3faa7f72af56641f1bbef51b645fca1d6e05d42357b7d3c846cd504c0b7b64d12309cdd07867e3b4411e0d01
+"chalk@npm:*, chalk@npm:^5.0.0":
+  version: 5.0.1
+  resolution: "chalk@npm:5.0.1"
+  checksum: 7b45300372b908f0471fbf7389ce2f5de8d85bb949026fd51a1b95b10d0ed32c7ed5aab36dd5e9d2bf3191867909b4404cef75c5f4d2d1daeeacd301dd280b76
   languageName: node
   linkType: hard
 
@@ -3563,13 +3284,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"chalk@npm:^5.0.0":
-  version: 5.0.1
-  resolution: "chalk@npm:5.0.1"
-  checksum: 7b45300372b908f0471fbf7389ce2f5de8d85bb949026fd51a1b95b10d0ed32c7ed5aab36dd5e9d2bf3191867909b4404cef75c5f4d2d1daeeacd301dd280b76
-  languageName: node
-  linkType: hard
-
 "charcodes@npm:^0.2.0":
   version: 0.2.0
   resolution: "charcodes@npm:0.2.0"
@@ -3727,16 +3441,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cli-table3@npm:*, cli-table3@npm:^0.6.1":
-  version: 0.6.1
-  resolution: "cli-table3@npm:0.6.1"
+"cli-table3@npm:*, cli-table3@npm:^0.6.1, cli-table3@npm:^0.6.2":
+  version: 0.6.2
+  resolution: "cli-table3@npm:0.6.2"
   dependencies:
-    colors: 1.4.0
+    "@colors/colors": 1.5.0
     string-width: ^4.2.0
   dependenciesMeta:
-    colors:
+    "@colors/colors":
       optional: true
-  checksum: 956e175f8eb019c26465b9f1e51121c08d8978e2aab04be7f8520ea8a4e67906fcbd8516dfb77e386ae3730ef0281aa21a65613dffbfa3d62969263252bd25a9
+  checksum: 2f82391698b8a2a2a5e45d2adcfea5d93e557207f90455a8d4c1aac688e9b18a204d9eb4ba1d322fa123b17d64ea3dc5e11de8b005529f3c3e7dbeb27cb4d9be
   languageName: node
   linkType: hard
 
@@ -3795,28 +3509,21 @@ __metadata:
   linkType: hard
 
 "clownface@npm:^1.0.0, clownface@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "clownface@npm:1.4.0"
+  version: 1.5.1
+  resolution: "clownface@npm:1.5.1"
   dependencies:
     "@rdfjs/data-model": ^1.1.0
     "@rdfjs/namespace": ^1.0.0
-  checksum: 97d01895f82e6fbc911f61b1f3cb8a56b7e693c07d6caa3adb291e91e63f219e4d52ecbb304459443dc3b54d9ea09be5a87f22606257d6c8c049e137c94d02b0
+  checksum: 2515b54e2874390b5d212fca824f2e9e57cdc87fe271a980d3fa5aaf9f511ca184e71806bd4ed0902858accdafab933c7e28d8afca36a68e2a49a1562d68c81b
   languageName: node
   linkType: hard
 
-"cmd-shim@npm:^4.0.1":
-  version: 4.1.0
-  resolution: "cmd-shim@npm:4.1.0"
+"cmd-shim@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "cmd-shim@npm:5.0.0"
   dependencies:
     mkdirp-infer-owner: ^2.0.0
-  checksum: d25bb57a8accab681bcfc632e085573b9395cdc60aed8d0ce479f988f9ced16720c89732aef81020140e43fd223b6573c22402e5a1c0cbd0149443104df88d68
-  languageName: node
-  linkType: hard
-
-"code-point-at@npm:^1.0.0":
-  version: 1.1.0
-  resolution: "code-point-at@npm:1.1.0"
-  checksum: 17d5666611f9b16d64fdf48176d9b7fb1c7d1c1607a189f7e600040a11a6616982876af148230336adb7d8fe728a559f743a4e29db3747e3b1a32fa7f4529681
+  checksum: 83d2a46cdf4adbb38d3d3184364b2df0e4c001ac770f5ca94373825d7a48838b4cb8a59534ef48f02b0d556caa047728589ca65c640c17c0b417b3afb34acfbb
   languageName: node
   linkType: hard
 
@@ -3862,7 +3569,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"color-support@npm:^1.1.2":
+"color-support@npm:^1.1.3":
   version: 1.1.3
   resolution: "color-support@npm:1.1.3"
   bin:
@@ -3878,24 +3585,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"colors@npm:1.4.0":
-  version: 1.4.0
-  resolution: "colors@npm:1.4.0"
-  checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec
-  languageName: node
-  linkType: hard
-
-"columnify@npm:*":
-  version: 1.5.4
-  resolution: "columnify@npm:1.5.4"
-  dependencies:
-    strip-ansi: ^3.0.0
-    wcwidth: ^1.0.0
-  checksum: f0693937412ec41d387f8ae89ff8cd5811a07ad636f753f0276ba8394fd76c0f610621ebeb379d6adcb30d98696919546dbbf93a28bd4e546efc7e30d905edc2
-  languageName: node
-  linkType: hard
-
-"columnify@npm:^1.6.0":
+"columnify@npm:*, columnify@npm:^1.6.0":
   version: 1.6.0
   resolution: "columnify@npm:1.6.0"
   dependencies:
@@ -3972,6 +3662,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"compress-brotli@npm:^1.3.6":
+  version: 1.3.6
+  resolution: "compress-brotli@npm:1.3.6"
+  dependencies:
+    "@types/json-buffer": ~3.0.0
+    json-buffer: ~3.0.1
+  checksum: 9db8e082a3286bd6a0da2b6b2929c62a827c5a1bee8f0d1c777cccfcef14c9e751d93ae46329f1529bfbfab9b6f241465e3a1c895be235c6e923f5017d952d00
+  languageName: node
+  linkType: hard
+
 "concat-map@npm:0.0.1":
   version: 0.0.1
   resolution: "concat-map@npm:0.0.1"
@@ -4005,7 +3705,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0, console-control-strings@npm:~1.1.0":
+"console-control-strings@npm:^1.1.0":
   version: 1.1.0
   resolution: "console-control-strings@npm:1.1.0"
   checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed
@@ -4132,9 +3832,9 @@ __metadata:
   linkType: hard
 
 "core-js@npm:^3.21.1":
-  version: 3.21.1
-  resolution: "core-js@npm:3.21.1"
-  checksum: d68eddd831340ad5b24ac29c72fda022a43b17f194c4278b6b875a843283d316502cb4abd07f28631d6ebc4387f66aa06e2b1b3c8fd7e08096a751b5c63f6889
+  version: 3.22.4
+  resolution: "core-js@npm:3.22.4"
+  checksum: 1d031597a61d11266343c7f9a788ad620bb8e1a15207c8ff41ee77183789f1d6592d7cbaf4931d74773be08739871c6ae1a59090a7e03f0bc5131d4443cc04d2
   languageName: node
   linkType: hard
 
@@ -4311,15 +4011,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1":
-  version: 4.3.2
-  resolution: "debug@npm:4.3.2"
+"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
+  version: 4.3.4
+  resolution: "debug@npm:4.3.4"
   dependencies:
     ms: 2.1.2
   peerDependenciesMeta:
     supports-color:
       optional: true
-  checksum: 820ea160e267e23c953c9ed87e7ad93494d8cda2f7349af5e7e3bb236d23707ee3022f477d5a7d2ee86ef2bf7d60aa9ab22d1f58080d7deb9dccd073585e1e43
+  checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
   languageName: node
   linkType: hard
 
@@ -4341,30 +4041,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"debug@npm:^4.0.0, debug@npm:^4.3.1":
-  version: 4.3.3
-  resolution: "debug@npm:4.3.3"
-  dependencies:
-    ms: 2.1.2
-  peerDependenciesMeta:
-    supports-color:
-      optional: true
-  checksum: 14472d56fe4a94dbcfaa6dbed2dd3849f1d72ba78104a1a328047bb564643ca49df0224c3a17fa63533fd11dd3d4c8636cd861191232a2c6735af00cc2d4de16
-  languageName: node
-  linkType: hard
-
-"debug@npm:^4.3.2, debug@npm:^4.3.3":
-  version: 4.3.4
-  resolution: "debug@npm:4.3.4"
-  dependencies:
-    ms: 2.1.2
-  peerDependenciesMeta:
-    supports-color:
-      optional: true
-  checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
-  languageName: node
-  linkType: hard
-
 "debuglog@npm:^1.0.1":
   version: 1.0.1
   resolution: "debuglog@npm:1.0.1"
@@ -4426,12 +4102,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"deepmerge-ts@npm:^2.0.1":
-  version: 2.0.1
-  resolution: "deepmerge-ts@npm:2.0.1"
+"deepmerge-ts@npm:^4.0.3":
+  version: 4.0.3
+  resolution: "deepmerge-ts@npm:4.0.3"
   dependencies:
     is-plain-object: ^5.0.0
-  checksum: 9dca78c3c2aedcedb2e863c951c4c34b095317c33c408422b4741c6f12fb51eb645dc55633f5992ade70bdd9421cc6804a6c638ae14e85de8945cfcd121a28f3
+  checksum: 4973705394bcbf13f896942491366b16b9776a1484c60f827e56fd2fa2327dc1f9634d00a5ac321a17c8099427890dcfb406fa216ba406644107281ed79a1e86
   languageName: node
   linkType: hard
 
@@ -4451,12 +4127,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"define-properties@npm:^1.1.3":
-  version: 1.1.3
-  resolution: "define-properties@npm:1.1.3"
+"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4":
+  version: 1.1.4
+  resolution: "define-properties@npm:1.1.4"
   dependencies:
-    object-keys: ^1.0.12
-  checksum: da80dba55d0cd76a5a7ab71ef6ea0ebcb7b941f803793e4e0257b384cb772038faa0c31659d244e82c4342edef841c1a1212580006a05a5068ee48223d787317
+    has-property-descriptors: ^1.0.0
+    object-keys: ^1.1.1
+  checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b
   languageName: node
   linkType: hard
 
@@ -4543,12 +4220,12 @@ __metadata:
   linkType: hard
 
 "dezalgo@npm:^1.0.0":
-  version: 1.0.3
-  resolution: "dezalgo@npm:1.0.3"
+  version: 1.0.4
+  resolution: "dezalgo@npm:1.0.4"
   dependencies:
     asap: ^2.0.0
     wrappy: 1
-  checksum: 8b26238db91423b2702a7a6d9629d0019c37c415e7b6e75d4b3e8d27e9464e21cac3618dd145f4d4ee96c70cc6ff034227b5b8a0e9c09015a8bdbe6dace3cfb9
+  checksum: 895389c6aead740d2ab5da4d3466d20fa30f738010a4d3f4dcccc9fc645ca31c9d10b7e1804ae489b1eb02c7986f9f1f34ba132d409b043082a86d9a4e745624
   languageName: node
   linkType: hard
 
@@ -4607,13 +4284,13 @@ __metadata:
   linkType: hard
 
 "dom-serializer@npm:^1.0.1":
-  version: 1.3.2
-  resolution: "dom-serializer@npm:1.3.2"
+  version: 1.4.1
+  resolution: "dom-serializer@npm:1.4.1"
   dependencies:
     domelementtype: ^2.0.1
     domhandler: ^4.2.0
     entities: ^2.0.0
-  checksum: bff48714944d67b160db71ba244fb0f3fe72e77ef2ec8414e2eeb56f2d926e404a13456b8b83a5392e217ba47dec2ec0c368801b31481813e94d185276c3e964
+  checksum: fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22
   languageName: node
   linkType: hard
 
@@ -4625,9 +4302,9 @@ __metadata:
   linkType: hard
 
 "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0":
-  version: 2.2.0
-  resolution: "domelementtype@npm:2.2.0"
-  checksum: 24cb386198640cd58aa36f8c987f2ea61859929106d06ffcc8f547e70cb2ed82a6dc56dcb8252b21fba1f1ea07df6e4356d60bfe57f77114ca1aed6828362629
+  version: 2.3.0
+  resolution: "domelementtype@npm:2.3.0"
+  checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6
   languageName: node
   linkType: hard
 
@@ -4705,10 +4382,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"electron-to-chromium@npm:^1.3.896":
-  version: 1.3.904
-  resolution: "electron-to-chromium@npm:1.3.904"
-  checksum: 51cd8de455721c921ab5522e868071f7ea53eeff20938b7186283b50f3c5aad98ff10c9d6b991d98d0bef09db8206bfab63d0458adba33b25104ead9bcd395de
+"electron-to-chromium@npm:^1.4.118":
+  version: 1.4.132
+  resolution: "electron-to-chromium@npm:1.4.132"
+  checksum: 133be125d1fa9693ce1d2f83d3f03a79ee19059fb95c203af87c4f833e661b7185ddb918fc53e272a7c8ff4169907cf1879790d1681011c6035c5c4f66b2848a
   languageName: node
   linkType: hard
 
@@ -4748,7 +4425,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"encoding@npm:^0.1.12, encoding@npm:^0.1.13":
+"encoding@npm:^0.1.13":
   version: 0.1.13
   resolution: "encoding@npm:0.1.13"
   dependencies:
@@ -4829,9 +4506,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1":
-  version: 1.19.1
-  resolution: "es-abstract@npm:1.19.1"
+"es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5":
+  version: 1.19.5
+  resolution: "es-abstract@npm:1.19.5"
   dependencies:
     call-bind: ^1.0.2
     es-to-primitive: ^1.2.1
@@ -4839,21 +4516,30 @@ __metadata:
     get-intrinsic: ^1.1.1
     get-symbol-description: ^1.0.0
     has: ^1.0.3
-    has-symbols: ^1.0.2
+    has-symbols: ^1.0.3
     internal-slot: ^1.0.3
     is-callable: ^1.2.4
-    is-negative-zero: ^2.0.1
+    is-negative-zero: ^2.0.2
     is-regex: ^1.1.4
-    is-shared-array-buffer: ^1.0.1
+    is-shared-array-buffer: ^1.0.2
     is-string: ^1.0.7
-    is-weakref: ^1.0.1
-    object-inspect: ^1.11.0
+    is-weakref: ^1.0.2
+    object-inspect: ^1.12.0
     object-keys: ^1.1.1
     object.assign: ^4.1.2
     string.prototype.trimend: ^1.0.4
     string.prototype.trimstart: ^1.0.4
     unbox-primitive: ^1.0.1
-  checksum: b6be8410672c5364db3fb01eb786e30c7b4bb32b4af63d381c08840f4382c4a168e7855cd338bf59d4f1a1a1138f4d748d1fd40ec65aaa071876f9e9fbfed949
+  checksum: 55199b0f179a12b3b0ec9c9f2e3a27a7561686e4f88d46f9ef32c836448a336e367c14d8f792612fc83a64113896e478259e4dffbbcffb3efdd06650f6360324
+  languageName: node
+  linkType: hard
+
+"es-shim-unscopables@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "es-shim-unscopables@npm:1.0.0"
+  dependencies:
+    has: ^1.0.3
+  checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1
   languageName: node
   linkType: hard
 
@@ -4868,170 +4554,170 @@ __metadata:
   languageName: node
   linkType: hard
 
-"esbuild-android-64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-android-64@npm:0.14.27"
+"esbuild-android-64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-android-64@npm:0.14.38"
   conditions: os=android & cpu=x64
   languageName: node
   linkType: hard
 
-"esbuild-android-arm64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-android-arm64@npm:0.14.27"
+"esbuild-android-arm64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-android-arm64@npm:0.14.38"
   conditions: os=android & cpu=arm64
   languageName: node
   linkType: hard
 
-"esbuild-darwin-64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-darwin-64@npm:0.14.27"
+"esbuild-darwin-64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-darwin-64@npm:0.14.38"
   conditions: os=darwin & cpu=x64
   languageName: node
   linkType: hard
 
-"esbuild-darwin-arm64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-darwin-arm64@npm:0.14.27"
+"esbuild-darwin-arm64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-darwin-arm64@npm:0.14.38"
   conditions: os=darwin & cpu=arm64
   languageName: node
   linkType: hard
 
-"esbuild-freebsd-64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-freebsd-64@npm:0.14.27"
+"esbuild-freebsd-64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-freebsd-64@npm:0.14.38"
   conditions: os=freebsd & cpu=x64
   languageName: node
   linkType: hard
 
-"esbuild-freebsd-arm64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-freebsd-arm64@npm:0.14.27"
+"esbuild-freebsd-arm64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-freebsd-arm64@npm:0.14.38"
   conditions: os=freebsd & cpu=arm64
   languageName: node
   linkType: hard
 
-"esbuild-linux-32@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-linux-32@npm:0.14.27"
+"esbuild-linux-32@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-linux-32@npm:0.14.38"
   conditions: os=linux & cpu=ia32
   languageName: node
   linkType: hard
 
-"esbuild-linux-64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-linux-64@npm:0.14.27"
+"esbuild-linux-64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-linux-64@npm:0.14.38"
   conditions: os=linux & cpu=x64
   languageName: node
   linkType: hard
 
-"esbuild-linux-arm64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-linux-arm64@npm:0.14.27"
+"esbuild-linux-arm64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-linux-arm64@npm:0.14.38"
   conditions: os=linux & cpu=arm64
   languageName: node
   linkType: hard
 
-"esbuild-linux-arm@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-linux-arm@npm:0.14.27"
+"esbuild-linux-arm@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-linux-arm@npm:0.14.38"
   conditions: os=linux & cpu=arm
   languageName: node
   linkType: hard
 
-"esbuild-linux-mips64le@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-linux-mips64le@npm:0.14.27"
+"esbuild-linux-mips64le@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-linux-mips64le@npm:0.14.38"
   conditions: os=linux & cpu=mips64el
   languageName: node
   linkType: hard
 
-"esbuild-linux-ppc64le@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-linux-ppc64le@npm:0.14.27"
+"esbuild-linux-ppc64le@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-linux-ppc64le@npm:0.14.38"
   conditions: os=linux & cpu=ppc64
   languageName: node
   linkType: hard
 
-"esbuild-linux-riscv64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-linux-riscv64@npm:0.14.27"
+"esbuild-linux-riscv64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-linux-riscv64@npm:0.14.38"
   conditions: os=linux & cpu=riscv64
   languageName: node
   linkType: hard
 
-"esbuild-linux-s390x@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-linux-s390x@npm:0.14.27"
+"esbuild-linux-s390x@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-linux-s390x@npm:0.14.38"
   conditions: os=linux & cpu=s390x
   languageName: node
   linkType: hard
 
-"esbuild-netbsd-64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-netbsd-64@npm:0.14.27"
+"esbuild-netbsd-64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-netbsd-64@npm:0.14.38"
   conditions: os=netbsd & cpu=x64
   languageName: node
   linkType: hard
 
-"esbuild-openbsd-64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-openbsd-64@npm:0.14.27"
+"esbuild-openbsd-64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-openbsd-64@npm:0.14.38"
   conditions: os=openbsd & cpu=x64
   languageName: node
   linkType: hard
 
-"esbuild-sunos-64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-sunos-64@npm:0.14.27"
+"esbuild-sunos-64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-sunos-64@npm:0.14.38"
   conditions: os=sunos & cpu=x64
   languageName: node
   linkType: hard
 
-"esbuild-windows-32@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-windows-32@npm:0.14.27"
+"esbuild-windows-32@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-windows-32@npm:0.14.38"
   conditions: os=win32 & cpu=ia32
   languageName: node
   linkType: hard
 
-"esbuild-windows-64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-windows-64@npm:0.14.27"
+"esbuild-windows-64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-windows-64@npm:0.14.38"
   conditions: os=win32 & cpu=x64
   languageName: node
   linkType: hard
 
-"esbuild-windows-arm64@npm:0.14.27":
-  version: 0.14.27
-  resolution: "esbuild-windows-arm64@npm:0.14.27"
+"esbuild-windows-arm64@npm:0.14.38":
+  version: 0.14.38
+  resolution: "esbuild-windows-arm64@npm:0.14.38"
   conditions: os=win32 & cpu=arm64
   languageName: node
   linkType: hard
 
-"esbuild@npm:^0.14.14":
-  version: 0.14.27
-  resolution: "esbuild@npm:0.14.27"
-  dependencies:
-    esbuild-android-64: 0.14.27
-    esbuild-android-arm64: 0.14.27
-    esbuild-darwin-64: 0.14.27
-    esbuild-darwin-arm64: 0.14.27
-    esbuild-freebsd-64: 0.14.27
-    esbuild-freebsd-arm64: 0.14.27
-    esbuild-linux-32: 0.14.27
-    esbuild-linux-64: 0.14.27
-    esbuild-linux-arm: 0.14.27
-    esbuild-linux-arm64: 0.14.27
-    esbuild-linux-mips64le: 0.14.27
-    esbuild-linux-ppc64le: 0.14.27
-    esbuild-linux-riscv64: 0.14.27
-    esbuild-linux-s390x: 0.14.27
-    esbuild-netbsd-64: 0.14.27
-    esbuild-openbsd-64: 0.14.27
-    esbuild-sunos-64: 0.14.27
-    esbuild-windows-32: 0.14.27
-    esbuild-windows-64: 0.14.27
-    esbuild-windows-arm64: 0.14.27
+"esbuild@npm:^0.14.27":
+  version: 0.14.38
+  resolution: "esbuild@npm:0.14.38"
+  dependencies:
+    esbuild-android-64: 0.14.38
+    esbuild-android-arm64: 0.14.38
+    esbuild-darwin-64: 0.14.38
+    esbuild-darwin-arm64: 0.14.38
+    esbuild-freebsd-64: 0.14.38
+    esbuild-freebsd-arm64: 0.14.38
+    esbuild-linux-32: 0.14.38
+    esbuild-linux-64: 0.14.38
+    esbuild-linux-arm: 0.14.38
+    esbuild-linux-arm64: 0.14.38
+    esbuild-linux-mips64le: 0.14.38
+    esbuild-linux-ppc64le: 0.14.38
+    esbuild-linux-riscv64: 0.14.38
+    esbuild-linux-s390x: 0.14.38
+    esbuild-netbsd-64: 0.14.38
+    esbuild-openbsd-64: 0.14.38
+    esbuild-sunos-64: 0.14.38
+    esbuild-windows-32: 0.14.38
+    esbuild-windows-64: 0.14.38
+    esbuild-windows-arm64: 0.14.38
   dependenciesMeta:
     esbuild-android-64:
       optional: true
@@ -5075,7 +4761,7 @@ __metadata:
       optional: true
   bin:
     esbuild: bin/esbuild
-  checksum: 19386ba13536ca69845989c981a44e006cf4aa79cf8186fe2af6fdb8f43f7b7ca708c443360fe18b455b4da71b473ad135bc3bc20b892485b2a27455d2287555
+  checksum: d7523a36bd28016c010829c527386dbc0c6b9f514920abf5ac8003f346665161aa61026fd6822c5091fc1c1af52fe26c9281a81740fc06f2994cdbb7c2880297
   languageName: node
   linkType: hard
 
@@ -5146,7 +4832,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint-module-utils@npm:^2.7.2":
+"eslint-module-utils@npm:^2.7.3":
   version: 2.7.3
   resolution: "eslint-module-utils@npm:2.7.3"
   dependencies:
@@ -5169,11 +4855,11 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-functional@npm:^4.2.0":
-  version: 4.2.0
-  resolution: "eslint-plugin-functional@npm:4.2.0"
+  version: 4.2.1
+  resolution: "eslint-plugin-functional@npm:4.2.1"
   dependencies:
-    "@typescript-eslint/experimental-utils": ^5.0.0
-    deepmerge-ts: ^2.0.1
+    "@typescript-eslint/utils": ^5.10.2
+    deepmerge-ts: ^4.0.3
     escape-string-regexp: ^4.0.0
   peerDependencies:
     eslint: ^8.0.0
@@ -5184,30 +4870,30 @@ __metadata:
       optional: true
     typescript:
       optional: true
-  checksum: 6bc4e90377b3b2ffb28b3322cedc0e765a99d4566cf9d1ca52d20ca1fe139d8ab55f3e2e472dabc2b3d27b19bbdce40cdbd333aabb209a0ffb6ca66127324f65
+  checksum: 8369efc98c69b602d73b19ff3d8cab029483de84c2c3a7299dd542a434e2c07b22abb503c38e988320bec5291f87b9e24bbbd138cd9d37ecbbcb4886671ef300
   languageName: node
   linkType: hard
 
 "eslint-plugin-import@npm:^2.25.4":
-  version: 2.25.4
-  resolution: "eslint-plugin-import@npm:2.25.4"
+  version: 2.26.0
+  resolution: "eslint-plugin-import@npm:2.26.0"
   dependencies:
     array-includes: ^3.1.4
     array.prototype.flat: ^1.2.5
     debug: ^2.6.9
     doctrine: ^2.1.0
     eslint-import-resolver-node: ^0.3.6
-    eslint-module-utils: ^2.7.2
+    eslint-module-utils: ^2.7.3
     has: ^1.0.3
-    is-core-module: ^2.8.0
+    is-core-module: ^2.8.1
     is-glob: ^4.0.3
-    minimatch: ^3.0.4
+    minimatch: ^3.1.2
     object.values: ^1.1.5
-    resolve: ^1.20.0
-    tsconfig-paths: ^3.12.0
+    resolve: ^1.22.0
+    tsconfig-paths: ^3.14.1
   peerDependencies:
     eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
-  checksum: 0af24f5c7c6ca692f42e3947127f0ae7dfe44f1e02740f7cbe988b510a9c52bab0065d7df04e2d953dcc88a4595a00cbdcf14018acf8cd75cfd47b72efcbb734
+  checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655
   languageName: node
   linkType: hard
 
@@ -5227,16 +4913,18 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-vue@npm:^8.5.0":
-  version: 8.5.0
-  resolution: "eslint-plugin-vue@npm:8.5.0"
+  version: 8.7.1
+  resolution: "eslint-plugin-vue@npm:8.7.1"
   dependencies:
     eslint-utils: ^3.0.0
     natural-compare: ^1.4.0
+    nth-check: ^2.0.1
+    postcss-selector-parser: ^6.0.9
     semver: ^7.3.5
     vue-eslint-parser: ^8.0.1
   peerDependencies:
     eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
-  checksum: 2edc956debe3bf22d0daab04b5d59609185799c76dc24ce0c899035ecf64de07a526accc96e8622bccd368b6848f185980e9d6e395d4d14068e89a77e0010119
+  checksum: c3aefb226dea126db32cab4c570f17f4b4047d609f4f5748e8dc410e929fbbfacdc07af1421c0f7773398513e9363de4480694714bc85fa2188ca50d1d19cfbc
   languageName: node
   linkType: hard
 
@@ -5303,10 +4991,10 @@ __metadata:
   linkType: hard
 
 "eslint@npm:^8.11.0":
-  version: 8.11.0
-  resolution: "eslint@npm:8.11.0"
+  version: 8.14.0
+  resolution: "eslint@npm:8.14.0"
   dependencies:
-    "@eslint/eslintrc": ^1.2.1
+    "@eslint/eslintrc": ^1.2.2
     "@humanwhocodes/config-array": ^0.9.2
     ajv: ^6.10.0
     chalk: ^4.0.0
@@ -5343,7 +5031,7 @@ __metadata:
     v8-compile-cache: ^2.0.3
   bin:
     eslint: bin/eslint.js
-  checksum: a06a2ea37002d6c0a4f462fe31b4411185dc3da7857fafb896eb392ba95a1289cc3538056474b2f44f08012f265bede01a39d46df4ac39ebc6d7be90e2c8f9fa
+  checksum: 87d2e3e5eb93216d4ab36006e7b8c0bfad02f40b0a0f193f1d42754512cd3a9d8244152f1c69df5db2e135b3c4f1c10d0ed2f0881fe8a8c01af55465968174c1
   languageName: node
   linkType: hard
 
@@ -5405,9 +5093,9 @@ __metadata:
   linkType: hard
 
 "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0":
-  version: 5.2.0
-  resolution: "estraverse@npm:5.2.0"
-  checksum: ec11b70d946bf5d7f76f91db38ef6f08109ac1b36cda293a26e678e58df4719f57f67b9ec87042afdd1f0267cee91865be3aa48d2161765a93defab5431be7b8
+  version: 5.3.0
+  resolution: "estraverse@npm:5.3.0"
+  checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b
   languageName: node
   linkType: hard
 
@@ -5649,11 +5337,11 @@ __metadata:
   linkType: hard
 
 "fastq@npm:^1.6.0":
-  version: 1.12.0
-  resolution: "fastq@npm:1.12.0"
+  version: 1.13.0
+  resolution: "fastq@npm:1.13.0"
   dependencies:
     reusify: ^1.0.4
-  checksum: 486db511686b5ab28b1d87170f05c3fa6c8d769cde6861ed34cf3756cdf356950ba9c7dde0bc976ad4308b85aa9ef6214c685887f9f724be72c054a7becb642a
+  checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b
   languageName: node
   linkType: hard
 
@@ -5829,23 +5517,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"follow-redirects@npm:^1.14.0":
-  version: 1.14.7
-  resolution: "follow-redirects@npm:1.14.7"
-  peerDependenciesMeta:
-    debug:
-      optional: true
-  checksum: f6d03e5e30877431065bca0d1b2e3db93949eb799d368a5c07ea8a4b71205f0349a3f8f0191bf13a07c93885522834dca1dc8e527dc99a772c6911fba24edc5f
-  languageName: node
-  linkType: hard
-
-"follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.5.1":
-  version: 1.14.9
-  resolution: "follow-redirects@npm:1.14.9"
+"follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.5.1":
+  version: 1.15.0
+  resolution: "follow-redirects@npm:1.15.0"
   peerDependenciesMeta:
     debug:
       optional: true
-  checksum: f5982e0eb481818642492d3ca35a86989c98af1128b8e1a62911a3410621bc15d2b079e8170b35b19d3bdee770b73ed431a257ed86195af773771145baa57845
+  checksum: eaec81c3e0ae57aae2422e38ad3539d0e7279b3a63f9681eeea319bb683dea67502c4e097136b8ce9721542b4e236e092b6b49e34e326cdd7733c274f0a3f378
   languageName: node
   linkType: hard
 
@@ -5912,13 +5590,13 @@ __metadata:
   linkType: hard
 
 "fs-extra@npm:^10.0.0":
-  version: 10.0.0
-  resolution: "fs-extra@npm:10.0.0"
+  version: 10.1.0
+  resolution: "fs-extra@npm:10.1.0"
   dependencies:
     graceful-fs: ^4.2.0
     jsonfile: ^6.0.1
     universalify: ^2.0.0
-  checksum: 5285a3d8f34b917cf2b66af8c231a40c1623626e9d701a20051d3337be16c6d7cac94441c8b3732d47a92a2a027886ca93c69b6a4ae6aee3c89650d2a8880c0a
+  checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50
   languageName: node
   linkType: hard
 
@@ -5973,6 +5651,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fsevents@npm:~2.3.2":
+  version: 2.3.2
+  resolution: "fsevents@npm:2.3.2"
+  dependencies:
+    node-gyp: latest
+  checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f
+  conditions: os=darwin
+  languageName: node
+  linkType: hard
+
 "fsevents@patch:fsevents@^1.2.7#~builtin<compat/fsevents>":
   version: 1.2.13
   resolution: "fsevents@patch:fsevents@npm%3A1.2.13#~builtin<compat/fsevents>::version=1.2.13&hash=18f3a7"
@@ -5992,16 +5680,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-fsevents@~2.3.2:
-  version: 2.3.2
-  resolution: "fsevents@npm:2.3.2"
-  dependencies:
-    node-gyp: latest
-  checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f
-  conditions: os=darwin
-  languageName: node
-  linkType: hard
-
 "function-bind@npm:^1.1.1":
   version: 1.1.1
   resolution: "function-bind@npm:1.1.1"
@@ -6016,36 +5694,19 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"gauge@npm:^4.0.0":
-  version: 4.0.0
-  resolution: "gauge@npm:4.0.0"
+"gauge@npm:^4.0.3":
+  version: 4.0.4
+  resolution: "gauge@npm:4.0.4"
   dependencies:
-    ansi-regex: ^5.0.1
     aproba: ^1.0.3 || ^2.0.0
-    color-support: ^1.1.2
-    console-control-strings: ^1.0.0
+    color-support: ^1.1.3
+    console-control-strings: ^1.1.0
     has-unicode: ^2.0.1
-    signal-exit: ^3.0.0
+    signal-exit: ^3.0.7
     string-width: ^4.2.3
     strip-ansi: ^6.0.1
-    wide-align: ^1.1.2
-  checksum: 637b34c84f518defa89319dbef68211a24e9302182ad2a619e3be1be5b7dcf2a962c8359e889294af667440f4722e7e6e61671859e00bd8ec280a136ded89b25
-  languageName: node
-  linkType: hard
-
-"gauge@npm:~2.7.3":
-  version: 2.7.4
-  resolution: "gauge@npm:2.7.4"
-  dependencies:
-    aproba: ^1.0.3
-    console-control-strings: ^1.0.0
-    has-unicode: ^2.0.0
-    object-assign: ^4.1.0
-    signal-exit: ^3.0.0
-    string-width: ^1.0.1
-    strip-ansi: ^3.0.1
-    wide-align: ^1.1.0
-  checksum: a89b53cee65579b46832e050b5f3a79a832cc422c190de79c6b8e2e15296ab92faddde6ddf2d376875cbba2b043efa99b9e1ed8124e7365f61b04e3cee9d40ee
+    wide-align: ^1.1.5
+  checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d
   languageName: node
   linkType: hard
 
@@ -6188,23 +5849,23 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"glob@npm:*, glob@npm:^7.1.1, glob@npm:^7.1.6, glob@npm:^7.2.0":
-  version: 7.2.0
-  resolution: "glob@npm:7.2.0"
+"glob@npm:*, glob@npm:^8.0.1":
+  version: 8.0.1
+  resolution: "glob@npm:8.0.1"
   dependencies:
     fs.realpath: ^1.0.0
     inflight: ^1.0.4
     inherits: 2
-    minimatch: ^3.0.4
+    minimatch: ^5.0.1
     once: ^1.3.0
     path-is-absolute: ^1.0.0
-  checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134
+  checksum: 7ac782f3ef1c08005884447479e68ceb0ad56997eb2003e1e9aefae71bad3cb48eb7c49190d3d6736f2ffcd8af4985d53a46831b3d5e0052cc5756822a38b61a
   languageName: node
   linkType: hard
 
 "glob@npm:^7.1.3, glob@npm:^7.1.4":
-  version: 7.1.7
-  resolution: "glob@npm:7.1.7"
+  version: 7.2.0
+  resolution: "glob@npm:7.2.0"
   dependencies:
     fs.realpath: ^1.0.0
     inflight: ^1.0.4
@@ -6212,7 +5873,7 @@ fsevents@~2.3.2:
     minimatch: ^3.0.4
     once: ^1.3.0
     path-is-absolute: ^1.0.0
-  checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8
+  checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134
   languageName: node
   linkType: hard
 
@@ -6224,11 +5885,11 @@ fsevents@~2.3.2:
   linkType: hard
 
 "globals@npm:^13.6.0, globals@npm:^13.9.0":
-  version: 13.12.1
-  resolution: "globals@npm:13.12.1"
+  version: 13.13.0
+  resolution: "globals@npm:13.13.0"
   dependencies:
     type-fest: ^0.20.2
-  checksum: cf7877629c8f2a293b0a7d09d1dcce7f2d426ec2528600c481c5b3f3d070b0a120eb2499439ac0404990fb8a5742c0165b1bf1f52603364001ddc89bea3dda24
+  checksum: c55ea8fd3afecb72567bac41605577e19e68476993dfb0ca4c49b86075af5f0ae3f0f5502525f69010f7c5ea5db6a1c540a80a4f80ebdfb2f686d87b0f05d7e9
   languageName: node
   linkType: hard
 
@@ -6281,17 +5942,10 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"graceful-fs@npm:*, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.9":
-  version: 4.2.9
-  resolution: "graceful-fs@npm:4.2.9"
-  checksum: 68ea4e07ff2c041ada184f9278b830375f8e0b75154e3f080af6b70f66172fabb4108d19b3863a96b53fc068a310b9b6493d86d1291acc5f3861eb4b79d26ad6
-  languageName: node
-  linkType: hard
-
-"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6":
-  version: 4.2.8
-  resolution: "graceful-fs@npm:4.2.8"
-  checksum: 5d224c8969ad0581d551dfabdb06882706b31af2561bd5e2034b4097e67cc27d05232849b8643866585fd0a41c7af152950f8776f4dd5579e9853733f31461c6
+"graceful-fs@npm:*, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6":
+  version: 4.2.10
+  resolution: "graceful-fs@npm:4.2.10"
+  checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da
   languageName: node
   linkType: hard
 
@@ -6337,10 +5991,10 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"has-bigints@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "has-bigints@npm:1.0.1"
-  checksum: 44ab55868174470065d2e0f8f6def1c990d12b82162a8803c679699fa8a39f966e336f2a33c185092fe8aea7e8bf2e85f1c26add5f29d98f2318bd270096b183
+"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2":
+  version: 1.0.2
+  resolution: "has-bigints@npm:1.0.2"
+  checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b
   languageName: node
   linkType: hard
 
@@ -6365,10 +6019,19 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2":
-  version: 1.0.2
-  resolution: "has-symbols@npm:1.0.2"
-  checksum: 2309c426071731be792b5be43b3da6fb4ed7cbe8a9a6bcfca1862587709f01b33d575ce8f5c264c1eaad09fca2f9a8208c0a2be156232629daa2dd0c0740976b
+"has-property-descriptors@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "has-property-descriptors@npm:1.0.0"
+  dependencies:
+    get-intrinsic: ^1.1.1
+  checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb
+  languageName: node
+  linkType: hard
+
+"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3":
+  version: 1.0.3
+  resolution: "has-symbols@npm:1.0.3"
+  checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410
   languageName: node
   linkType: hard
 
@@ -6381,7 +6044,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"has-unicode@npm:^2.0.0, has-unicode@npm:^2.0.1":
+"has-unicode@npm:^2.0.1":
   version: 2.0.1
   resolution: "has-unicode@npm:2.0.1"
   checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400
@@ -6498,12 +6161,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"hosted-git-info@npm:*, hosted-git-info@npm:^4.0.0, hosted-git-info@npm:^4.0.1":
-  version: 4.1.0
-  resolution: "hosted-git-info@npm:4.1.0"
+"hosted-git-info@npm:*, hosted-git-info@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "hosted-git-info@npm:5.0.0"
   dependencies:
-    lru-cache: ^6.0.0
-  checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461
+    lru-cache: ^7.5.1
+  checksum: 515e69463d123635f70d70656c5ec648951ffc1987f92a87cb4a038e1794bfed833cf87569b358b137ebbc75d992c073ed0408d420c9e5b717c2b4f0a291490c
   languageName: node
   linkType: hard
 
@@ -6514,12 +6177,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"hosted-git-info@npm:^5.0.0":
-  version: 5.0.0
-  resolution: "hosted-git-info@npm:5.0.0"
+"hosted-git-info@npm:^4.0.0, hosted-git-info@npm:^4.0.1":
+  version: 4.1.0
+  resolution: "hosted-git-info@npm:4.1.0"
   dependencies:
-    lru-cache: ^7.5.1
-  checksum: 515e69463d123635f70d70656c5ec648951ffc1987f92a87cb4a038e1794bfed833cf87569b358b137ebbc75d992c073ed0408d420c9e5b717c2b4f0a291490c
+    lru-cache: ^6.0.0
+  checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461
   languageName: node
   linkType: hard
 
@@ -6556,17 +6219,6 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"http-proxy-agent@npm:^4.0.1":
-  version: 4.0.1
-  resolution: "http-proxy-agent@npm:4.0.1"
-  dependencies:
-    "@tootallnate/once": 1
-    agent-base: 6
-    debug: 4
-  checksum: c6a5da5a1929416b6bbdf77b1aca13888013fe7eb9d59fc292e25d18e041bb154a8dfada58e223fc7b76b9b2d155a87e92e608235201f77d34aa258707963a82
-  languageName: node
-  linkType: hard
-
 "http-proxy-agent@npm:^5.0.0":
   version: 5.0.0
   resolution: "http-proxy-agent@npm:5.0.0"
@@ -6614,12 +6266,12 @@ fsevents@~2.3.2:
   linkType: hard
 
 "https-proxy-agent@npm:^5.0.0":
-  version: 5.0.0
-  resolution: "https-proxy-agent@npm:5.0.0"
+  version: 5.0.1
+  resolution: "https-proxy-agent@npm:5.0.1"
   dependencies:
     agent-base: 6
     debug: 4
-  checksum: 165bfb090bd26d47693597661298006841ab733d0c7383a8cb2f17373387a94c903a3ac687090aa739de05e379ab6f868bae84ab4eac288ad85c328cd1ec9e53
+  checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765
   languageName: node
   linkType: hard
 
@@ -6671,12 +6323,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"ignore-walk@npm:^4.0.1":
-  version: 4.0.1
-  resolution: "ignore-walk@npm:4.0.1"
+"ignore-walk@npm:^5.0.1":
+  version: 5.0.1
+  resolution: "ignore-walk@npm:5.0.1"
   dependencies:
-    minimatch: ^3.0.4
-  checksum: 903cd5cb68d57b2e70fddb83d885aea55f137a44636254a29b08037797376d8d3e09d1c58935778f3a271bf6a2b41ecc54fc22260ac07190e09e1ec7253b49f3
+    minimatch: ^5.0.1
+  checksum: 1a4ef35174653a1aa6faab3d9f8781269166536aee36a04946f6e2b319b2475c1903a75ed42f04219274128242f49d0a10e20c4354ee60d9548e97031451150b
   languageName: node
   linkType: hard
 
@@ -6687,20 +6339,13 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"ignore@npm:^5.0.5, ignore@npm:^5.2.0":
+"ignore@npm:^5.0.5, ignore@npm:^5.1.8, ignore@npm:^5.2.0":
   version: 5.2.0
   resolution: "ignore@npm:5.2.0"
   checksum: 6b1f926792d614f64c6c83da3a1f9c83f6196c2839aa41e1e32dd7b8d174cef2e329d75caabb62cb61ce9dc432f75e67d07d122a037312db7caa73166a1bdb77
   languageName: node
   linkType: hard
 
-"ignore@npm:^5.1.8":
-  version: 5.1.9
-  resolution: "ignore@npm:5.1.9"
-  checksum: 6f6b2235f4e63648116c5814f76b2d3d63fae9c21b8a466862e865732f59e787c9938a9042f9457091db6f0d811508ea3c8c6a60f35bafc4ceea08bbe8f96fd5
-  languageName: node
-  linkType: hard
-
 "immutable@npm:^3.8.2":
   version: 3.8.2
   resolution: "immutable@npm:3.8.2"
@@ -6784,10 +6429,10 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"ini@npm:*, ini@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "ini@npm:2.0.0"
-  checksum: e7aadc5fb2e4aefc666d74ee2160c073995a4061556b1b5b4241ecb19ad609243b9cceafe91bae49c219519394bbd31512516cb22a3b1ca6e66d869e0447e84e
+"ini@npm:*, ini@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "ini@npm:3.0.0"
+  checksum: e92b6b0835ac369e58c677e7faa8db6019ac667d7404887978fb86b181d658e50f1742ecbba7d81eb5ff917b3ae4d63a48e1ef3a9f8a0527bd7605fe1a9995d4
   languageName: node
   linkType: hard
 
@@ -6798,33 +6443,18 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"init-package-json@npm:*":
-  version: 2.0.5
-  resolution: "init-package-json@npm:2.0.5"
-  dependencies:
-    npm-package-arg: ^8.1.5
-    promzard: ^0.3.0
-    read: ~1.0.1
-    read-package-json: ^4.1.1
-    semver: ^7.3.5
-    validate-npm-package-license: ^3.0.4
-    validate-npm-package-name: ^3.0.0
-  checksum: cbd3e2e79156d6e8722699f571e509e0733dde31ac4cb58c0aadb63f7cef1a131037c6d549bd6af5757032a51252b1bdb86a70f68ed6c10f866f203e5fb4f9ba
-  languageName: node
-  linkType: hard
-
-"init-package-json@npm:^3.0.1":
-  version: 3.0.1
-  resolution: "init-package-json@npm:3.0.1"
+"init-package-json@npm:*, init-package-json@npm:^3.0.2":
+  version: 3.0.2
+  resolution: "init-package-json@npm:3.0.2"
   dependencies:
-    npm-package-arg: ^9.0.0
+    npm-package-arg: ^9.0.1
     promzard: ^0.3.0
     read: ^1.0.7
     read-package-json: ^5.0.0
     semver: ^7.3.5
     validate-npm-package-license: ^3.0.4
-    validate-npm-package-name: ^3.0.0
-  checksum: b554ddb4833d511294ece4b5eb980d106316951207cb899df1e6583f38e67a182557b0bfe79ecc22033bc387eda1cd5b4771ef56534d9c21cdedbd998069145c
+    validate-npm-package-name: ^4.0.0
+  checksum: e027f60e4a1564809eee790d5a842341c784888fd7c7ace5f9a34ea76224c0adb6f3ab3bf205cf1c9c877a6e1a76c68b00847a984139f60813125d7b42a23a13
   languageName: node
   linkType: hard
 
@@ -6981,20 +6611,11 @@ fsevents@~2.3.2:
   linkType: hard
 
 "is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1":
-  version: 2.8.1
-  resolution: "is-core-module@npm:2.8.1"
-  dependencies:
-    has: ^1.0.3
-  checksum: 418b7bc10768a73c41c7ef497e293719604007f88934a6ffc5f7c78702791b8528102fb4c9e56d006d69361549b3d9519440214a74aefc7e0b79e5e4411d377f
-  languageName: node
-  linkType: hard
-
-"is-core-module@npm:^2.8.0":
-  version: 2.8.0
-  resolution: "is-core-module@npm:2.8.0"
+  version: 2.9.0
+  resolution: "is-core-module@npm:2.9.0"
   dependencies:
     has: ^1.0.3
-  checksum: f8b52714891e1a6c6577fcb8d5e057bab064a7a30954aab6beb5092e311473eb8da57afd334de4981dc32409ffca998412efc3a2edceb9e397cef6098d21dd91
+  checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce
   languageName: node
   linkType: hard
 
@@ -7070,22 +6691,6 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"is-fullwidth-code-point@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "is-fullwidth-code-point@npm:1.0.0"
-  dependencies:
-    number-is-nan: ^1.0.0
-  checksum: 4d46a7465a66a8aebcc5340d3b63a56602133874af576a9ca42c6f0f4bd787a743605771c5f246db77da96605fefeffb65fc1dbe862dcc7328f4b4d03edf5a57
-  languageName: node
-  linkType: hard
-
-"is-fullwidth-code-point@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "is-fullwidth-code-point@npm:2.0.0"
-  checksum: eef9c6e15f68085fec19ff6a978a6f1b8f48018fd1265035552078ee945573594933b09bbd6f562553e2a241561439f1ef5339276eba68d272001343084cfab8
-  languageName: node
-  linkType: hard
-
 "is-fullwidth-code-point@npm:^3.0.0":
   version: 3.0.0
   resolution: "is-fullwidth-code-point@npm:3.0.0"
@@ -7109,16 +6714,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1":
-  version: 4.0.1
-  resolution: "is-glob@npm:4.0.1"
-  dependencies:
-    is-extglob: ^2.1.1
-  checksum: 84627cad11b4e745f5db5a163f32c47b711585a5ff6e14f8f8d026db87f4cdd3e2c95f6fa1f94ad22e469f36d819ae2814f03f9c668b164422ac3354a94672d3
-  languageName: node
-  linkType: hard
-
-"is-glob@npm:^4.0.3, is-glob@npm:~4.0.1":
+"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1":
   version: 4.0.3
   resolution: "is-glob@npm:4.0.3"
   dependencies:
@@ -7134,7 +6730,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"is-negative-zero@npm:^2.0.1":
+"is-negative-zero@npm:^2.0.2":
   version: 2.0.2
   resolution: "is-negative-zero@npm:2.0.2"
   checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a
@@ -7142,11 +6738,11 @@ fsevents@~2.3.2:
   linkType: hard
 
 "is-number-object@npm:^1.0.4":
-  version: 1.0.6
-  resolution: "is-number-object@npm:1.0.6"
+  version: 1.0.7
+  resolution: "is-number-object@npm:1.0.7"
   dependencies:
     has-tostringtag: ^1.0.0
-  checksum: c697704e8fc2027fc41cb81d29805de4e8b6dc9c3efee93741dbf126a8ecc8443fef85adbc581415ae7e55d325e51d0a942324ae35c829131748cce39cba55f3
+  checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7
   languageName: node
   linkType: hard
 
@@ -7220,10 +6816,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"is-shared-array-buffer@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "is-shared-array-buffer@npm:1.0.1"
-  checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90
+"is-shared-array-buffer@npm:^1.0.2":
+  version: 1.0.2
+  resolution: "is-shared-array-buffer@npm:1.0.2"
+  dependencies:
+    call-bind: ^1.0.2
+  checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a
   languageName: node
   linkType: hard
 
@@ -7277,14 +6875,14 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0":
+"is-typedarray@npm:~1.0.0":
   version: 1.0.0
   resolution: "is-typedarray@npm:1.0.0"
   checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7
   languageName: node
   linkType: hard
 
-"is-weakref@npm:^1.0.1":
+"is-weakref@npm:^1.0.2":
   version: 1.0.2
   resolution: "is-weakref@npm:1.0.2"
   dependencies:
@@ -7381,9 +6979,9 @@ fsevents@~2.3.2:
   linkType: hard
 
 "jose@npm:^4.6.0":
-  version: 4.6.0
-  resolution: "jose@npm:4.6.0"
-  checksum: 7f48cb030c9e8586e825ad5cc71e792f7b71b420afd3c45913e0719fd4abe6a756179c732604d42fbbb53c64b63f78818669599eeef11c988c0c34dd1178fe43
+  version: 4.8.1
+  resolution: "jose@npm:4.8.1"
+  checksum: c3e239ccbb07863c28250aedea3e734e4a3b26abc1cbf6acf333381db5ef31e5d1eeced791299076f13b24f41b4b463a7a1e4eaa0079ae0febf9bfd60acb555a
   languageName: node
   linkType: hard
 
@@ -7435,7 +7033,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"json-buffer@npm:3.0.1":
+"json-buffer@npm:3.0.1, json-buffer@npm:~3.0.1":
   version: 3.0.1
   resolution: "json-buffer@npm:3.0.1"
   checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581
@@ -7502,14 +7100,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"json5@npm:^2.1.2":
-  version: 2.2.0
-  resolution: "json5@npm:2.2.0"
-  dependencies:
-    minimist: ^1.2.5
+"json5@npm:^2.2.1":
+  version: 2.2.1
+  resolution: "json5@npm:2.2.1"
   bin:
     json5: lib/cli.js
-  checksum: e88fc5274bb58fc99547baa777886b069d2dd96d9cfc4490b305fd16d711dabd5979e35a4f90873cefbeb552e216b041a304fe56702bedba76e19bc7845f208d
+  checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b
   languageName: node
   linkType: hard
 
@@ -7583,26 +7179,27 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"just-diff-apply@npm:^4.0.1":
-  version: 4.0.1
-  resolution: "just-diff-apply@npm:4.0.1"
-  checksum: fdb58c0c8da766943fb316158d823fe485058d6b31ec6c51f99076df76363fa1ca35d79fb23f53184bf5b7443ae470fe5f087b4a504e913a8f96474963907e2e
+"just-diff-apply@npm:^5.2.0":
+  version: 5.2.0
+  resolution: "just-diff-apply@npm:5.2.0"
+  checksum: 5e63562665f7b3b279d286f5cd3d73af0e0ffadbdc02cb2c43a50370ad1a614b557842938d157de904be69a4bc6b2187cee3257add1440fdf1e4814de691b0af
   languageName: node
   linkType: hard
 
 "just-diff@npm:^5.0.1":
-  version: 5.0.1
-  resolution: "just-diff@npm:5.0.1"
-  checksum: efbdb652987ca109839dba385904ea152cc73ef4c165eebb4be0af261734cf91387e529fcd52aea5ba9567b4ef76c584ee6254ccf0030dc5d0ccdab3b890a085
+  version: 5.0.2
+  resolution: "just-diff@npm:5.0.2"
+  checksum: 1c7408432f53ff67ea4ce41adb5579c08a39f990956ddbf2e94f4161f3802a41179d7412538573972433ce9f50e371afdca019964e51cf500577bf1aa732b842
   languageName: node
   linkType: hard
 
 "keyv@npm:^4.0.0":
-  version: 4.0.5
-  resolution: "keyv@npm:4.0.5"
+  version: 4.2.2
+  resolution: "keyv@npm:4.2.2"
   dependencies:
+    compress-brotli: ^1.3.6
     json-buffer: 3.0.1
-  checksum: 968ec062e66a660bd1c403b2932f602948ea76b17f8419bb04166491c1f186da1c3b39db4ccd1fdb6a19a4dcb374334455dd3ac31e13a70000c81e2daa866117
+  checksum: 1d03674145339cb6d7509fd7791a2ea93c0a9b7ec10e475d621f4443b8bf877c21dc391ae1002dd1bade4f44e2093f850f1da81d08c03812b4592cd5ff028db7
   languageName: node
   linkType: hard
 
@@ -7665,84 +7262,37 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"libnpmaccess@npm:*":
-  version: 5.0.0
-  resolution: "libnpmaccess@npm:5.0.0"
-  dependencies:
-    aproba: ^2.0.0
-    minipass: ^3.1.1
-    npm-package-arg: ^8.1.2
-    npm-registry-fetch: ^11.0.0
-  checksum: d6eb8bc053ff5252c38808afd9bcd08241db7a19b0817f4c0671bf29b21c82e482a2ff7851e5e7c35c72db714bbb8a1c5051594473422bfb67843b1b94695d79
-  languageName: node
-  linkType: hard
-
-"libnpmaccess@npm:^6.0.2":
-  version: 6.0.2
-  resolution: "libnpmaccess@npm:6.0.2"
+"libnpmaccess@npm:*, libnpmaccess@npm:^6.0.2":
+  version: 6.0.3
+  resolution: "libnpmaccess@npm:6.0.3"
   dependencies:
     aproba: ^2.0.0
     minipass: ^3.1.1
     npm-package-arg: ^9.0.1
     npm-registry-fetch: ^13.0.0
-  checksum: ffc910cda1ca39c509a3e89455d3cc70f3059cea8d7624b46acfa7f42f3ae20c446246dd5176b50c536e73fcf81f29b49b6dc2182b323a875745435dc65c10e4
-  languageName: node
-  linkType: hard
-
-"libnpmdiff@npm:*":
-  version: 3.0.0
-  resolution: "libnpmdiff@npm:3.0.0"
-  dependencies:
-    "@npmcli/disparity-colors": ^1.0.1
-    "@npmcli/installed-package-contents": ^1.0.7
-    binary-extensions: ^2.2.0
-    diff: ^5.0.0
-    minimatch: ^3.0.4
-    npm-package-arg: ^8.1.4
-    pacote: ^12.0.0
-    tar: ^6.1.0
-  checksum: 43123aee687e9c8a0db0ba40cd7fe10fbd351cf1952b71c377f833d019cf6dcc777a08af52a2654cfba49c6f2d079ce40ffb72342128d229b580faf290334177
+  checksum: 4a437390d52bd5e6145164210cfab4cdbc824c4f4a62e11cf186cad9c159a7c8f0c1b6e37346db1cc675bcdf1508e92ed64d47ac1a9bcf838a670bb4741a50c9
   languageName: node
   linkType: hard
 
-"libnpmdiff@npm:^4.0.2":
-  version: 4.0.2
-  resolution: "libnpmdiff@npm:4.0.2"
+"libnpmdiff@npm:*, libnpmdiff@npm:^4.0.2":
+  version: 4.0.3
+  resolution: "libnpmdiff@npm:4.0.3"
   dependencies:
-    "@npmcli/disparity-colors": ^1.0.1
+    "@npmcli/disparity-colors": ^2.0.0
     "@npmcli/installed-package-contents": ^1.0.7
     binary-extensions: ^2.2.0
     diff: ^5.0.0
-    minimatch: ^3.0.4
+    minimatch: ^5.0.1
     npm-package-arg: ^9.0.1
     pacote: ^13.0.5
     tar: ^6.1.0
-  checksum: 85843bff4ace753494096c85fc4e8e52ad9d1370cb6e274f2eb814d70a36fce33c99493dd2a2a8f60f2b65aef244fe040d10a85d7d9d7f9853c90921e95a647a
+  checksum: 415a8d40f2d746b1d66f155f818b5581c510d975201250f6d1e4d94888905a660b513a87ca01a59994b5afa78a1def4ebbfce35542b992927cdbfc286fe5b6ae
   languageName: node
   linkType: hard
 
-"libnpmexec@npm:*":
-  version: 3.0.2
-  resolution: "libnpmexec@npm:3.0.2"
-  dependencies:
-    "@npmcli/arborist": ^4.0.0
-    "@npmcli/ci-detect": ^1.3.0
-    "@npmcli/run-script": ^2.0.0
-    chalk: ^4.1.0
-    mkdirp-infer-owner: ^2.0.0
-    npm-package-arg: ^8.1.2
-    pacote: ^12.0.0
-    proc-log: ^1.0.0
-    read: ^1.0.7
-    read-package-json-fast: ^2.0.2
-    walk-up-path: ^1.0.0
-  checksum: 997257242ec5f39fd791f4ad8f2099c3cf992b0afec0f464803c91a4756df70a6618115a4299b005b053ff36b1d03f0d4a5e5b1fd6d1cb4af09c6b73c8773952
-  languageName: node
-  linkType: hard
-
-"libnpmexec@npm:^4.0.2":
-  version: 4.0.2
-  resolution: "libnpmexec@npm:4.0.2"
+"libnpmexec@npm:*, libnpmexec@npm:^4.0.2":
+  version: 4.0.5
+  resolution: "libnpmexec@npm:4.0.5"
   dependencies:
     "@npmcli/arborist": ^5.0.0
     "@npmcli/ci-detect": ^2.0.0
@@ -7750,184 +7300,98 @@ fsevents@~2.3.2:
     chalk: ^4.1.0
     mkdirp-infer-owner: ^2.0.0
     npm-package-arg: ^9.0.1
-    npmlog: ^6.0.1
+    npmlog: ^6.0.2
     pacote: ^13.0.5
     proc-log: ^2.0.0
     read: ^1.0.7
     read-package-json-fast: ^2.0.2
     walk-up-path: ^1.0.0
-  checksum: dfa657c94a2f29d79e1805ff3d6a1821f8433132a7a9815c082e6baca4532c97dbcb1c128231f0a9ef2c87b5e3963c2be64bcd898b70cff8a2eea7aca7f585f2
-  languageName: node
-  linkType: hard
-
-"libnpmfund@npm:*":
-  version: 2.0.2
-  resolution: "libnpmfund@npm:2.0.2"
-  dependencies:
-    "@npmcli/arborist": ^4.0.0
-  checksum: 833461f2b1c888489fbe888d015bfbd91f5086c2111f9e7e4f52ad33d9b98cba8e994baa837f4ae2c1f5ddc2226b7760ba665676958e0ca4973549b49d6f2fec
+  checksum: 46c248211a7a3534e1e9a3eaac5fab9d8ecc59828508f04eec8862a02d281d72e47bd8102b18e06526b1bed3905759640b410cda9a56321a0a8e04a69824766f
   languageName: node
   linkType: hard
 
-"libnpmfund@npm:^3.0.1":
-  version: 3.0.1
-  resolution: "libnpmfund@npm:3.0.1"
+"libnpmfund@npm:*, libnpmfund@npm:^3.0.1":
+  version: 3.0.2
+  resolution: "libnpmfund@npm:3.0.2"
   dependencies:
     "@npmcli/arborist": ^5.0.0
-  checksum: e29b1eba7899edfc7a751336dc4b3041cabea0a2905825c3e15921326fd2eeb1a2e774b01e4555e88bd292b70b6b8ffcea0ecb1a2a60acdcdf7594a419c88a29
+  checksum: 9c25bed2c5207007a509f0dff97d6d9712c0648b58bb96617b652e6803d14252203751a83298c257446e8e7b58556c9b519b5b0d5ac9a6d29453576aeb9ee20e
   languageName: node
   linkType: hard
 
-"libnpmhook@npm:*":
-  version: 7.0.0
-  resolution: "libnpmhook@npm:7.0.0"
-  dependencies:
-    aproba: ^2.0.0
-    npm-registry-fetch: ^11.0.0
-  checksum: 9831fc2dc3d2fac4c7e1400623d691bed169f5e2fa3376077aff4af05d08b400604dcd9584bb07d2a965bdcb1aacb3772e19e4de7e035088d980edd87eca64dc
-  languageName: node
-  linkType: hard
-
-"libnpmhook@npm:^8.0.2":
-  version: 8.0.2
-  resolution: "libnpmhook@npm:8.0.2"
+"libnpmhook@npm:*, libnpmhook@npm:^8.0.2":
+  version: 8.0.3
+  resolution: "libnpmhook@npm:8.0.3"
   dependencies:
     aproba: ^2.0.0
     npm-registry-fetch: ^13.0.0
-  checksum: 18299d0f6f4b2077bc976aa8f7b2766c0b76ea9d780f9e5a6c79c9b76cd707f9899ddce3e010a73709a832a15391c01a9382c2a8d2acd93ac28ab1dc8ab69634
-  languageName: node
-  linkType: hard
-
-"libnpmorg@npm:*":
-  version: 3.0.0
-  resolution: "libnpmorg@npm:3.0.0"
-  dependencies:
-    aproba: ^2.0.0
-    npm-registry-fetch: ^11.0.0
-  checksum: a180a73b8548530833779c9ea8f83aca3e7f8dfe722fb8e47e8b35f4cc1c35d8aed5ce2005d3be6dac89cd8cf43de022a8580e13bc220b14646ca047dc112b22
+  checksum: 99d031d102d62a78672a94965208c2716a0b1d9ca413f7f45dc55b571f6b77f8ac293810fd8dd3445a6196c92a2219095f85ce430bb82c5ce200e7e0e1a83064
   languageName: node
   linkType: hard
 
-"libnpmorg@npm:^4.0.2":
-  version: 4.0.2
-  resolution: "libnpmorg@npm:4.0.2"
+"libnpmorg@npm:*, libnpmorg@npm:^4.0.2":
+  version: 4.0.3
+  resolution: "libnpmorg@npm:4.0.3"
   dependencies:
     aproba: ^2.0.0
     npm-registry-fetch: ^13.0.0
-  checksum: afc122c9c10341b9e934dd3e587157aabaab462debaf6b56928c9a6adf1250b22804499a54a81fed2d978d499bab918528fe24a782f2547b2fba146c8e4141db
-  languageName: node
-  linkType: hard
-
-"libnpmpack@npm:*":
-  version: 3.0.1
-  resolution: "libnpmpack@npm:3.0.1"
-  dependencies:
-    "@npmcli/run-script": ^2.0.0
-    npm-package-arg: ^8.1.0
-    pacote: ^12.0.0
-  checksum: c6d206a128be9c95509cbe9098924ca26ac4fad48dc9672f01f834d37422244a71092611deb4195a03baae48291c66809fecb60950c21b2f821d10035c71a909
+  checksum: 6b54c8f8216b0d98dda2fdedd8a38fbe36f5f98da94c3613efc00789bfce334b2996037f0a0839af37d5d2dc52378ca8fdae5dee932202d8d2235d05b4563861
   languageName: node
   linkType: hard
 
-"libnpmpack@npm:^4.0.2":
-  version: 4.0.2
-  resolution: "libnpmpack@npm:4.0.2"
+"libnpmpack@npm:*, libnpmpack@npm:^4.0.2":
+  version: 4.0.3
+  resolution: "libnpmpack@npm:4.0.3"
   dependencies:
     "@npmcli/run-script": ^3.0.0
     npm-package-arg: ^9.0.1
     pacote: ^13.0.5
-  checksum: 401286a540189535bc7b6c37334260c54460d34651c51efa8329122135a69979733e250f8e8e8543c1533536f013d66d3234f6ab7e8c067b46b1398b29e8b263
-  languageName: node
-  linkType: hard
-
-"libnpmpublish@npm:*":
-  version: 5.0.0
-  resolution: "libnpmpublish@npm:5.0.0"
-  dependencies:
-    normalize-package-data: ^3.0.2
-    npm-package-arg: ^8.1.2
-    npm-registry-fetch: ^11.0.0
-    semver: ^7.1.3
-    ssri: ^8.0.1
-  checksum: 172eaefab2d2ebc4e0516d24f12d04914dbad2dbaeadeabd7e168c8b80f0638b787c4d1921d0ce5fe83dc6966a6f36e72c10f054cef57eb0d67fe13827426db6
+  checksum: 41fdc65e2cf78a85f32bf4ef18de7941827a668c9865d59d02dbb4508d5c0e27bc0c1c59f450f9c7e1297c42ea902713f4b4697837fcf5ed002f04056a224bff
   languageName: node
   linkType: hard
 
-"libnpmpublish@npm:^6.0.2":
-  version: 6.0.2
-  resolution: "libnpmpublish@npm:6.0.2"
+"libnpmpublish@npm:*, libnpmpublish@npm:^6.0.2":
+  version: 6.0.4
+  resolution: "libnpmpublish@npm:6.0.4"
   dependencies:
     normalize-package-data: ^4.0.0
     npm-package-arg: ^9.0.1
     npm-registry-fetch: ^13.0.0
-    semver: ^7.1.3
-    ssri: ^8.0.1
-  checksum: 6b8c8dee06f3ba184d6afbc2e8f4a345e89f23b3417e78372b562a245588d058aa600ea52ac3eaaeb6f390169cc27caa53c4cc8aca69727b40f07c441144632f
-  languageName: node
-  linkType: hard
-
-"libnpmsearch@npm:*":
-  version: 4.0.0
-  resolution: "libnpmsearch@npm:4.0.0"
-  dependencies:
-    npm-registry-fetch: ^11.0.0
-  checksum: bcb9e07090e69a90e76a59c1e6c60d7de949c41a83af5a4a452e79eb051de2dd174d226d7d2f675caf505344e6a514785ef015d939703ea6f620ded7ad86f3c1
+    semver: ^7.3.7
+    ssri: ^9.0.0
+  checksum: d653e0d9be0b01011c020f8252f480ca68105b56fde575a6c4fda650f6b5ff33a51fda43897ba817d2955579cc096910561e60e26628c59f5ac2d031157551d1
   languageName: node
   linkType: hard
 
-"libnpmsearch@npm:^5.0.2":
-  version: 5.0.2
-  resolution: "libnpmsearch@npm:5.0.2"
+"libnpmsearch@npm:*, libnpmsearch@npm:^5.0.2":
+  version: 5.0.3
+  resolution: "libnpmsearch@npm:5.0.3"
   dependencies:
     npm-registry-fetch: ^13.0.0
-  checksum: 984012a5c1504fdefbc9609ea86825efd91dbe525a5bd6ff2a54a06b3282358add01662b9e3771bee2a7f76a9fd1aef14bee7de3604b81677f6f32b8ea473228
+  checksum: c346d1656bfa46c52e25d71d44d2127961c1dd87d1cc99eabffcd4d6593fbd59071047bb0d28323f914387e3ccf9a8ed8e249f8ca563a2e70d3c5be954707442
   languageName: node
   linkType: hard
 
-"libnpmteam@npm:*":
-  version: 3.0.0
-  resolution: "libnpmteam@npm:3.0.0"
-  dependencies:
-    aproba: ^2.0.0
-    npm-registry-fetch: ^11.0.0
-  checksum: e425e2dddaabed7f052ae7226311ab63d109ad03cd767b3cfd1abc2aec468b507fdef27df4eb42444cd34fb591c911cbbf745de3ae0fe1533bc131af327eed18
-  languageName: node
-  linkType: hard
-
-"libnpmteam@npm:^4.0.2":
-  version: 4.0.2
-  resolution: "libnpmteam@npm:4.0.2"
+"libnpmteam@npm:*, libnpmteam@npm:^4.0.2":
+  version: 4.0.3
+  resolution: "libnpmteam@npm:4.0.3"
   dependencies:
     aproba: ^2.0.0
     npm-registry-fetch: ^13.0.0
-  checksum: 13698ffce7b5e2a74cd2b71246bea9d8f0daa4b463eaa7d8c774462ac51f62e95df8698fd91d0f762566a9c652a67cbfe79bf9428408048e8494edbbda490d3c
+  checksum: 0c2a1fd55ade169d0d623cacfbd01fc420fb37cd157947eeda8a2be5affbff71069912c04a896c4a69569e23c16b0aa101a6cbaf4b07264514519cb7061569fb
   languageName: node
   linkType: hard
 
-"libnpmversion@npm:*":
-  version: 2.0.2
-  resolution: "libnpmversion@npm:2.0.2"
-  dependencies:
-    "@npmcli/git": ^2.0.7
-    "@npmcli/run-script": ^2.0.0
-    json-parse-even-better-errors: ^2.3.1
-    semver: ^7.3.5
-    stringify-package: ^1.0.1
-  checksum: 515cfe798692abcc2ebcccc3d6e622f5358a22d77b8170f9a7dddfbacfbb1ec8e890544e04605eb2de2815439c5fd35b18775040e2d64dabb085431ed64efc49
-  languageName: node
-  linkType: hard
-
-"libnpmversion@npm:^3.0.1":
-  version: 3.0.1
-  resolution: "libnpmversion@npm:3.0.1"
+"libnpmversion@npm:*, libnpmversion@npm:^3.0.1":
+  version: 3.0.4
+  resolution: "libnpmversion@npm:3.0.4"
   dependencies:
     "@npmcli/git": ^3.0.0
     "@npmcli/run-script": ^3.0.0
     json-parse-even-better-errors: ^2.3.1
     proc-log: ^2.0.0
-    semver: ^7.3.5
-    stringify-package: ^1.0.1
-  checksum: ab3e09f7037e40552e88611234fdd6f2b3829f3729344578474f9444a4bd9aa39ecb29472302aa45813e50ae25435ab18357294d93c1f116bcd09778e4c1f984
+    semver: ^7.3.7
+  checksum: ac0820826ffb1efec4e34813b9f567975b9a580b788ddcfd13e45b42468612001b61bc411b789b0fc611d4d9e61d0a4083b38660342a4fd4a85e3cc7f37054ac
   languageName: node
   linkType: hard
 
@@ -7946,8 +7410,8 @@ fsevents@~2.3.2:
   linkType: hard
 
 "lint-staged@npm:^12.3.5":
-  version: 12.3.7
-  resolution: "lint-staged@npm:12.3.7"
+  version: 12.4.1
+  resolution: "lint-staged@npm:12.4.1"
   dependencies:
     cli-truncate: ^3.1.0
     colorette: ^2.0.16
@@ -7965,7 +7429,7 @@ fsevents@~2.3.2:
     yaml: ^1.10.2
   bin:
     lint-staged: bin/lint-staged.js
-  checksum: b595097556880eb2ab7ce2cf105047f6f22525ccfd608fbdc63ab243259aa36a26949576fadff673748fb885e7cb37ad3f4471d964ad54c1205d57a58999ba24
+  checksum: b57183b537064cda6caef6679918bf271903145f7c28d09567e918b8b13094048b579f8df808ea590dbd7ea2ec332327c5e372cf3d77e85b7b0254f6541ce4c3
   languageName: node
   linkType: hard
 
@@ -8194,10 +7658,10 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"lru-cache@npm:^7.3.1, lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1":
-  version: 7.7.1
-  resolution: "lru-cache@npm:7.7.1"
-  checksum: f362c5a2cfa8ad6fe557ec43dc1b7a9695cce84a5652a43ff813609f782f5da576631e7dfad41878bf19a7a69438f38375178635ee80de269aa314280ca2f59e
+"lru-cache@npm:^7.4.4, lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1":
+  version: 7.9.0
+  resolution: "lru-cache@npm:7.9.0"
+  checksum: c91a293a103d11ea4f07de4122ba4f73d8203d0de51852fb612b1764296aebf623a3e11dddef1b3aefdc8d71af97d52b222dad5459dcb967713bbab9a19fed7d
   languageName: node
   linkType: hard
 
@@ -8210,6 +7674,15 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
+"magic-string@npm:^0.26.1":
+  version: 0.26.1
+  resolution: "magic-string@npm:0.26.1"
+  dependencies:
+    sourcemap-codec: ^1.4.8
+  checksum: 23f21f5734346ddfbabd7b9834e3ecda3521e3e1db81166c1513b45b729489bbed1eafa8cd052c7db7fdc7c68ebc5c03bc00dd5a23697edda15dbecaf8c98397
+  languageName: node
+  linkType: hard
+
 "make-dir@npm:^2.0.0":
   version: 2.1.0
   resolution: "make-dir@npm:2.1.0"
@@ -8220,33 +7693,9 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"make-fetch-happen@npm:*, make-fetch-happen@npm:^9.0.1, make-fetch-happen@npm:^9.1.0":
-  version: 9.1.0
-  resolution: "make-fetch-happen@npm:9.1.0"
-  dependencies:
-    agentkeepalive: ^4.1.3
-    cacache: ^15.2.0
-    http-cache-semantics: ^4.1.0
-    http-proxy-agent: ^4.0.1
-    https-proxy-agent: ^5.0.0
-    is-lambda: ^1.0.1
-    lru-cache: ^6.0.0
-    minipass: ^3.1.3
-    minipass-collect: ^1.0.2
-    minipass-fetch: ^1.3.2
-    minipass-flush: ^1.0.5
-    minipass-pipeline: ^1.2.4
-    negotiator: ^0.6.2
-    promise-retry: ^2.0.1
-    socks-proxy-agent: ^6.0.0
-    ssri: ^8.0.0
-  checksum: 0eb371c85fdd0b1584fcfdf3dc3c62395761b3c14658be02620c310305a9a7ecf1617a5e6fb30c1d081c5c8aaf177fa133ee225024313afabb7aa6a10f1e3d04
-  languageName: node
-  linkType: hard
-
-"make-fetch-happen@npm:^10.0.3, make-fetch-happen@npm:^10.0.6":
-  version: 10.1.0
-  resolution: "make-fetch-happen@npm:10.1.0"
+"make-fetch-happen@npm:*, make-fetch-happen@npm:^10.0.3, make-fetch-happen@npm:^10.0.6, make-fetch-happen@npm:^10.1.2":
+  version: 10.1.2
+  resolution: "make-fetch-happen@npm:10.1.2"
   dependencies:
     agentkeepalive: ^4.2.1
     cacache: ^16.0.2
@@ -8263,31 +7712,8 @@ fsevents@~2.3.2:
     negotiator: ^0.6.3
     promise-retry: ^2.0.1
     socks-proxy-agent: ^6.1.1
-    ssri: ^8.0.1
-  checksum: fae1c2f255f6467bf6731344c2c04dd0e1f1899d8ae4698d98e2c86131ba899a418746ebc564493b85d1651d43c93b49f7825a2773edda4285a1c4c5e5ba9168
-  languageName: node
-  linkType: hard
-
-"make-fetch-happen@npm:^8.0.14":
-  version: 8.0.14
-  resolution: "make-fetch-happen@npm:8.0.14"
-  dependencies:
-    agentkeepalive: ^4.1.3
-    cacache: ^15.0.5
-    http-cache-semantics: ^4.1.0
-    http-proxy-agent: ^4.0.1
-    https-proxy-agent: ^5.0.0
-    is-lambda: ^1.0.1
-    lru-cache: ^6.0.0
-    minipass: ^3.1.3
-    minipass-collect: ^1.0.2
-    minipass-fetch: ^1.3.2
-    minipass-flush: ^1.0.5
-    minipass-pipeline: ^1.2.4
-    promise-retry: ^2.0.1
-    socks-proxy-agent: ^5.0.0
-    ssri: ^8.0.0
-  checksum: 326fefde1aec1f1314e548be74baaaa322208718d1b51c9688a326f73dea70f57767b4f5423230e39408cfe7c6dcf7adcf86ca4798c919c3ea78f54532910434
+    ssri: ^9.0.0
+  checksum: 42825d119a7e4f5b1a8e7048a86d328cd36bb1ff875d155ce7079d9a0afdd310c198fb310096af358cfa9ecdf643cecf960380686792457dccb36e17efe89eb0
   languageName: node
   linkType: hard
 
@@ -8338,11 +7764,11 @@ fsevents@~2.3.2:
   linkType: hard
 
 "marked@npm:^4.0.10":
-  version: 4.0.12
-  resolution: "marked@npm:4.0.12"
+  version: 4.0.15
+  resolution: "marked@npm:4.0.15"
   bin:
     marked: bin/marked.js
-  checksum: 7575117f85a8986652f3ac8b8a7b95056c4c5fce01a1fc76dc4c7960412cb4c9bd9da8133487159b6b3ff84f52b543dfe9a36f826a5f358892b5ec4b6824f192
+  checksum: 8992c37669b872846a226f90dc5a8fa1e5d56bba6e32fa36270fd3d327dd9e11fedc5b47b68de611dcdce1573d30fbadf61bf23f86c1a679e5385424d7b9d9f3
   languageName: node
   linkType: hard
 
@@ -8452,13 +7878,13 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4":
-  version: 4.0.4
-  resolution: "micromatch@npm:4.0.4"
+"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5":
+  version: 4.0.5
+  resolution: "micromatch@npm:4.0.5"
   dependencies:
-    braces: ^3.0.1
-    picomatch: ^2.2.3
-  checksum: ef3d1c88e79e0a68b0e94a03137676f3324ac18a908c245a9e5936f838079fcc108ac7170a5fadc265a9c2596963462e402841406bda1a4bb7b68805601d631c
+    braces: ^3.0.2
+    picomatch: ^2.3.1
+  checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc
   languageName: node
   linkType: hard
 
@@ -8474,19 +7900,19 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"mime-db@npm:1.51.0":
-  version: 1.51.0
-  resolution: "mime-db@npm:1.51.0"
-  checksum: 613b1ac9d6e725cc24444600b124a7f1ce6c60b1baa654f39a3e260d0995a6dffc5693190217e271af7e2a5612dae19f2a73f3e316707d797a7391165f7ef423
+"mime-db@npm:1.52.0":
+  version: 1.52.0
+  resolution: "mime-db@npm:1.52.0"
+  checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f
   languageName: node
   linkType: hard
 
 "mime-types@npm:^2.1.12, mime-types@npm:~2.1.19":
-  version: 2.1.34
-  resolution: "mime-types@npm:2.1.34"
+  version: 2.1.35
+  resolution: "mime-types@npm:2.1.35"
   dependencies:
-    mime-db: 1.51.0
-  checksum: 67013de9e9d6799bde6d669d18785b7e18bcd212e710d3e04a4727f92f67a8ad4e74aee24be28b685adb794944814bde649119b58ee3282ffdbee58f9278d9f3
+    mime-db: 1.52.0
+  checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836
   languageName: node
   linkType: hard
 
@@ -8548,12 +7974,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"minimatch@npm:^3.0.4":
-  version: 3.0.4
-  resolution: "minimatch@npm:3.0.4"
+"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2":
+  version: 3.1.2
+  resolution: "minimatch@npm:3.1.2"
   dependencies:
     brace-expansion: ^1.1.7
-  checksum: 66ac295f8a7b59788000ea3749938b0970344c841750abd96694f80269b926ebcafad3deeb3f1da2522978b119e6ae3a5869b63b13a7859a456b3408bd18a078
+  checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a
   languageName: node
   linkType: hard
 
@@ -8577,14 +8003,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"minimist@npm:^1.2.0, minimist@npm:^1.2.5":
-  version: 1.2.5
-  resolution: "minimist@npm:1.2.5"
-  checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52
-  languageName: node
-  linkType: hard
-
-"minimist@npm:^1.2.6":
+"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6":
   version: 1.2.6
   resolution: "minimist@npm:1.2.6"
   checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb
@@ -8600,21 +8019,6 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"minipass-fetch@npm:^1.3.0, minipass-fetch@npm:^1.3.2":
-  version: 1.4.1
-  resolution: "minipass-fetch@npm:1.4.1"
-  dependencies:
-    encoding: ^0.1.12
-    minipass: ^3.1.0
-    minipass-sized: ^1.0.3
-    minizlib: ^2.0.0
-  dependenciesMeta:
-    encoding:
-      optional: true
-  checksum: ec93697bdb62129c4e6c0104138e681e30efef8c15d9429dd172f776f83898471bc76521b539ff913248cc2aa6d2b37b652c993504a51cc53282563640f29216
-  languageName: node
-  linkType: hard
-
 "minipass-fetch@npm:^2.0.3":
   version: 2.1.0
   resolution: "minipass-fetch@npm:2.1.0"
@@ -8649,7 +8053,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"minipass-pipeline@npm:*, minipass-pipeline@npm:^1.2.2, minipass-pipeline@npm:^1.2.4":
+"minipass-pipeline@npm:*, minipass-pipeline@npm:^1.2.4":
   version: 1.2.4
   resolution: "minipass-pipeline@npm:1.2.4"
   dependencies:
@@ -8667,7 +8071,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"minipass@npm:*, minipass@npm:^3.1.6":
+"minipass@npm:*, minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6":
   version: 3.1.6
   resolution: "minipass@npm:3.1.6"
   dependencies:
@@ -8676,16 +8080,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"minipass@npm:^3.0.0, minipass@npm:^3.1.0, minipass@npm:^3.1.1, minipass@npm:^3.1.3":
-  version: 3.1.3
-  resolution: "minipass@npm:3.1.3"
-  dependencies:
-    yallist: ^4.0.0
-  checksum: 74b623c1f996caafa66772301b66a1b634b20270f0d1a731ef86195d5a1a5f9984a773a1e88a6cecfd264d6c471c4c0fc8574cd96488f01c8f74c0b600021e55
-  languageName: node
-  linkType: hard
-
-"minizlib@npm:^2.0.0, minizlib@npm:^2.1.1, minizlib@npm:^2.1.2":
+"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2":
   version: 2.1.2
   resolution: "minizlib@npm:2.1.2"
   dependencies:
@@ -8744,13 +8139,13 @@ fsevents@~2.3.2:
   linkType: hard
 
 "mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3":
-  version: 0.5.5
-  resolution: "mkdirp@npm:0.5.5"
+  version: 0.5.6
+  resolution: "mkdirp@npm:0.5.6"
   dependencies:
-    minimist: ^1.2.5
+    minimist: ^1.2.6
   bin:
     mkdirp: bin/cmd.js
-  checksum: 3bce20ea525f9477befe458ab85284b0b66c8dc3812f94155af07c827175948cdd8114852ac6c6d82009b13c1048c37f6d98743eb019651ee25c39acc8aabe7d
+  checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2
   languageName: node
   linkType: hard
 
@@ -8762,9 +8157,9 @@ fsevents@~2.3.2:
   linkType: hard
 
 "moment@npm:^2.29.1":
-  version: 2.29.1
-  resolution: "moment@npm:2.29.1"
-  checksum: 1e14d5f422a2687996be11dd2d50c8de3bd577c4a4ca79ba5d02c397242a933e5b941655de6c8cb90ac18f01cc4127e55b4a12ae3c527a6c0a274e455979345e
+  version: 2.29.3
+  resolution: "moment@npm:2.29.3"
+  checksum: 2e780e36d9a1823c08a1b6313cbb08bd01ecbb2a9062095820a34f42c878991ccba53abaa6abb103fd5c01e763724f295162a8c50b7e95b4f1c992ef0772d3f0
   languageName: node
   linkType: hard
 
@@ -8811,12 +8206,12 @@ fsevents@~2.3.2:
   linkType: hard
 
 "n3@npm:^1.6.3":
-  version: 1.15.0
-  resolution: "n3@npm:1.15.0"
+  version: 1.16.1
+  resolution: "n3@npm:1.16.1"
   dependencies:
     queue-microtask: ^1.1.2
     readable-stream: ^3.6.0
-  checksum: 0e2bb4081c20e9c12dda4d696013925e31f4dbfc9fb38dbfd5b2ab9c7a9650da95c2aa617e67d22e6a8d2d1298179450b8e01c7f7ab67e0243c1c97ee0fb6389
+  checksum: 97519b77a57e5f019bc2bd52ab8e9304d0f35d9d2cf847870e1dcf9bd2453566c6373ec697377df6b05defad996b95f3a00df30914a707839dd1d1365387cbb8
   languageName: node
   linkType: hard
 
@@ -8829,12 +8224,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"nanoid@npm:^3.3.1":
-  version: 3.3.1
-  resolution: "nanoid@npm:3.3.1"
+"nanoid@npm:^3.3.3":
+  version: 3.3.4
+  resolution: "nanoid@npm:3.3.4"
   bin:
     nanoid: bin/nanoid.cjs
-  checksum: 4ef0969e1bbe866fc223eb32276cbccb0961900bfe79104fa5abe34361979dead8d0e061410a5c03bc3d47455685adf32c09d6f27790f4a6898fb51f7df7ec86
+  checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c
   languageName: node
   linkType: hard
 
@@ -8864,13 +8259,6 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"negotiator@npm:^0.6.2":
-  version: 0.6.2
-  resolution: "negotiator@npm:0.6.2"
-  checksum: dfddaff6c06792f1c4c3809e29a427b8daef8cd437c83b08dd51d7ee11bbd1c29d9512d66b801144d6c98e910ffd8723f2432e0cbf8b18d41d2a09599c975ab3
-  languageName: node
-  linkType: hard
-
 "negotiator@npm:^0.6.3":
   version: 0.6.3
   resolution: "negotiator@npm:0.6.3"
@@ -8908,48 +8296,21 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"node-fetch@npm:2.6.7":
-  version: 2.6.7
-  resolution: "node-fetch@npm:2.6.7"
-  dependencies:
-    whatwg-url: ^5.0.0
-  peerDependencies:
-    encoding: ^0.1.0
-  peerDependenciesMeta:
-    encoding:
-      optional: true
-  checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b
-  languageName: node
-  linkType: hard
-
-"node-fetch@npm:^2.6.1":
-  version: 2.6.2
-  resolution: "node-fetch@npm:2.6.2"
-  checksum: de367eae1dfbc0e12283c1cf92256ea7fba7eac8655e2e51ebb217727162396fc6cf24689ef9fc6accf075e3991e2ffaa061f7cfaa958215329649b2297ff06d
-  languageName: node
-  linkType: hard
-
-"node-gyp@npm:*, node-gyp@npm:^8.2.0":
-  version: 8.4.1
-  resolution: "node-gyp@npm:8.4.1"
-  dependencies:
-    env-paths: ^2.2.0
-    glob: ^7.1.4
-    graceful-fs: ^4.2.6
-    make-fetch-happen: ^9.1.0
-    nopt: ^5.0.0
-    npmlog: ^6.0.0
-    rimraf: ^3.0.2
-    semver: ^7.3.5
-    tar: ^6.1.2
-    which: ^2.0.2
-  bin:
-    node-gyp: bin/node-gyp.js
-  checksum: 341710b5da39d3660e6a886b37e210d33f8282047405c2e62c277bcc744c7552c5b8b972ebc3a7d5c2813794e60cc48c3ebd142c46d6e0321db4db6c92dd0355
+"node-fetch@npm:2.6.7, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7":
+  version: 2.6.7
+  resolution: "node-fetch@npm:2.6.7"
+  dependencies:
+    whatwg-url: ^5.0.0
+  peerDependencies:
+    encoding: ^0.1.0
+  peerDependenciesMeta:
+    encoding:
+      optional: true
+  checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b
   languageName: node
   linkType: hard
 
-"node-gyp@npm:^9.0.0":
+"node-gyp@npm:*, node-gyp@npm:^9.0.0, node-gyp@npm:latest":
   version: 9.0.0
   resolution: "node-gyp@npm:9.0.0"
   dependencies:
@@ -8969,26 +8330,6 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"node-gyp@npm:latest":
-  version: 8.2.0
-  resolution: "node-gyp@npm:8.2.0"
-  dependencies:
-    env-paths: ^2.2.0
-    glob: ^7.1.4
-    graceful-fs: ^4.2.6
-    make-fetch-happen: ^8.0.14
-    nopt: ^5.0.0
-    npmlog: ^4.1.2
-    rimraf: ^3.0.2
-    semver: ^7.3.5
-    tar: ^6.1.2
-    which: ^2.0.2
-  bin:
-    node-gyp: bin/node-gyp.js
-  checksum: 5e0e755eab8ca88647d20fc8aba4095560c3dd549686e86761b57b8489d93a1af68b0dccf881e5314bfce4d7ca290f8248e192915ccd3e18bf46571d72da6a9d
-  languageName: node
-  linkType: hard
-
 "node-libs-browser@npm:^2.2.1":
   version: 2.2.1
   resolution: "node-libs-browser@npm:2.2.1"
@@ -9020,10 +8361,10 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"node-releases@npm:^2.0.1":
-  version: 2.0.1
-  resolution: "node-releases@npm:2.0.1"
-  checksum: b20dd8d4bced11f75060f0387e05e76b9dc4a0451f7bb3516eade6f50499ea7768ba95d8a60d520c193402df1e58cb3fe301510cc1c1ad68949c3d57b5149866
+"node-releases@npm:^2.0.3":
+  version: 2.0.4
+  resolution: "node-releases@npm:2.0.4"
+  checksum: b32d6c2032c7b169ae3938b416fc50f123f5bd577d54a79b2ae201febf27b22846b01c803dd35ac8689afe840f8ba4e5f7154723db629b80f359836b6707b92f
   languageName: node
   linkType: hard
 
@@ -9050,7 +8391,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"normalize-package-data@npm:^3.0.0, normalize-package-data@npm:^3.0.2":
+"normalize-package-data@npm:^3.0.0":
   version: 3.0.3
   resolution: "normalize-package-data@npm:3.0.3"
   dependencies:
@@ -9104,12 +8445,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"npm-audit-report@npm:*, npm-audit-report@npm:^2.1.5":
-  version: 2.1.5
-  resolution: "npm-audit-report@npm:2.1.5"
+"npm-audit-report@npm:*, npm-audit-report@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "npm-audit-report@npm:3.0.0"
   dependencies:
     chalk: ^4.0.0
-  checksum: 9199c4331a29b478b7adbafe1bf463943f65cfd840f62ffe9e6263f0ae64d77725ea102126b3892ef3379a6770a6fe11e1f68ab4cb196c0045db2e1aeafc593d
+  checksum: 3927972c14e1d9fd21a6ab2d3c2d651e20346ff9a784ea2fcdc2b1e3b3e23994fc0e8961c3c9f4aea857e3a995a556a77f4f0250dbaf6238c481c609ed912a92
   languageName: node
   linkType: hard
 
@@ -9122,12 +8463,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"npm-install-checks@npm:*, npm-install-checks@npm:^4.0.0":
-  version: 4.0.0
-  resolution: "npm-install-checks@npm:4.0.0"
+"npm-install-checks@npm:*, npm-install-checks@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "npm-install-checks@npm:5.0.0"
   dependencies:
     semver: ^7.1.1
-  checksum: 8308ff48e61e0863d7f148f62543e1f6c832525a7d8002ea742d5e478efa8b29bf65a87f9fb82786e15232e4b3d0362b126c45afdceed4c051c0d3c227dd0ace
+  checksum: 0e7d1aae52b1fe9d3a0fd4a008850c7047931722dd49ee908afd13fd0297ac5ddb10964d9c59afcdaaa2ca04b51d75af2788f668c729ae71fec0e4cdac590ffc
   languageName: node
   linkType: hard
 
@@ -9138,130 +8479,56 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"npm-package-arg@npm:*, npm-package-arg@npm:^8.0.0, npm-package-arg@npm:^8.0.1, npm-package-arg@npm:^8.1.0, npm-package-arg@npm:^8.1.2, npm-package-arg@npm:^8.1.4, npm-package-arg@npm:^8.1.5":
-  version: 8.1.5
-  resolution: "npm-package-arg@npm:8.1.5"
-  dependencies:
-    hosted-git-info: ^4.0.1
-    semver: ^7.3.4
-    validate-npm-package-name: ^3.0.0
-  checksum: ae76afbcebb4ea8d0b849b8b18ed1b0491030fb04a0af5d75f1b8390cc50bec186ced9fbe60f47d939eab630c7c0db0919d879ac56a87d3782267dfe8eec60d3
-  languageName: node
-  linkType: hard
-
-"npm-package-arg@npm:^9.0.0, npm-package-arg@npm:^9.0.1":
-  version: 9.0.1
-  resolution: "npm-package-arg@npm:9.0.1"
+"npm-package-arg@npm:*, npm-package-arg@npm:^9.0.0, npm-package-arg@npm:^9.0.1, npm-package-arg@npm:^9.0.2":
+  version: 9.0.2
+  resolution: "npm-package-arg@npm:9.0.2"
   dependencies:
     hosted-git-info: ^5.0.0
     semver: ^7.3.5
-    validate-npm-package-name: ^3.0.0
-  checksum: 93c660a448dca688af27eec1b0a3c11e4ab58b817e3b157e90c2e9b22a93c74a4fab64b104d5c57119a2c44914252d43deab0ba5b10ef4c7f8055277e938dbbb
-  languageName: node
-  linkType: hard
-
-"npm-packlist@npm:^3.0.0":
-  version: 3.0.0
-  resolution: "npm-packlist@npm:3.0.0"
-  dependencies:
-    glob: ^7.1.6
-    ignore-walk: ^4.0.1
-    npm-bundled: ^1.1.1
-    npm-normalize-package-bin: ^1.0.1
-  bin:
-    npm-packlist: bin/index.js
-  checksum: 8550ecdec5feb2708aa8289e71c3e9ed72dd792642dd3d2c871955504c0e460bc1c2106483a164eb405b3cdfcfddf311315d4a647fca1a511f710654c015a91e
+    validate-npm-package-name: ^4.0.0
+  checksum: 07828f330f611214a0aa1e87f402b30b3dc90388671470ad8dc1551f28b0cb886f1f75fa7c37e894a9598640a555c05643642994ecacb9a6c68f655e571968f7
   languageName: node
   linkType: hard
 
-"npm-packlist@npm:^4.0.0":
-  version: 4.0.0
-  resolution: "npm-packlist@npm:4.0.0"
+"npm-packlist@npm:^5.0.0":
+  version: 5.0.2
+  resolution: "npm-packlist@npm:5.0.2"
   dependencies:
-    glob: ^7.2.0
-    ignore-walk: ^4.0.1
+    glob: ^8.0.1
+    ignore-walk: ^5.0.1
     npm-bundled: ^1.1.2
     npm-normalize-package-bin: ^1.0.1
   bin:
     npm-packlist: bin/index.js
-  checksum: 246e92415e7b9b963983d1aa372425b0c4ee77fde89ab5d9310033b3dd7768baf2b983c352c825a14743ae442b7ae457763417ef9d215b274992406a507c58ff
-  languageName: node
-  linkType: hard
-
-"npm-pick-manifest@npm:*, npm-pick-manifest@npm:^6.0.0, npm-pick-manifest@npm:^6.1.0, npm-pick-manifest@npm:^6.1.1":
-  version: 6.1.1
-  resolution: "npm-pick-manifest@npm:6.1.1"
-  dependencies:
-    npm-install-checks: ^4.0.0
-    npm-normalize-package-bin: ^1.0.1
-    npm-package-arg: ^8.1.2
-    semver: ^7.3.4
-  checksum: 7a7b9475ae95cf903d37471229efbd12a829a9a7a1020ba36e75768aaa35da4c3a087fde3f06070baf81ec6b2ea2b660f022a1172644e6e7188199d7c1d2954b
+  checksum: ff2c295dea161c800c5c2d4254d6b864126333786edec7e56387a9184e966864e8e46a77aa8121db13f210232b6439c7425098ead377fe2fc287ac316c888f4d
   languageName: node
   linkType: hard
 
-"npm-pick-manifest@npm:^7.0.0":
-  version: 7.0.0
-  resolution: "npm-pick-manifest@npm:7.0.0"
+"npm-pick-manifest@npm:*, npm-pick-manifest@npm:^7.0.0, npm-pick-manifest@npm:^7.0.1":
+  version: 7.0.1
+  resolution: "npm-pick-manifest@npm:7.0.1"
   dependencies:
-    npm-install-checks: ^4.0.0
+    npm-install-checks: ^5.0.0
     npm-normalize-package-bin: ^1.0.1
     npm-package-arg: ^9.0.0
     semver: ^7.3.5
-  checksum: 3ef8231429dd0785ca069b9a54066f49b879a9a487abcd04d4c67cbf858772ce441fd15aa530fb8dd53786c19f01c77d876b02e244a3f38e718353e96ac825db
-  languageName: node
-  linkType: hard
-
-"npm-profile@npm:*":
-  version: 5.0.4
-  resolution: "npm-profile@npm:5.0.4"
-  dependencies:
-    npm-registry-fetch: ^11.0.0
-  checksum: 38872ef916a40bf339e1be5a9dd286cc078214979b36787727b25ecf2ca60217e860e636a6ab85add82b4bc1667fef600fd7e28f3191add4c52054720d215909
+  checksum: 9a4a8e64d2214783b2b74a361845000f5d91bb40c7858e2a30af2ac7876d9296efc37f8cacf60335e96a45effee2035b033d9bdefb4889757cc60d85959accbb
   languageName: node
   linkType: hard
 
-"npm-profile@npm:^6.0.2":
-  version: 6.0.2
-  resolution: "npm-profile@npm:6.0.2"
+"npm-profile@npm:*, npm-profile@npm:^6.0.3":
+  version: 6.0.3
+  resolution: "npm-profile@npm:6.0.3"
   dependencies:
-    npm-registry-fetch: ^13.0.0
+    npm-registry-fetch: ^13.0.1
     proc-log: ^2.0.0
-  checksum: 15ed13a350c81a9b469cd7d7874c693edf7d427e65b76da8d4c40260275747d4f6d80c11b65a91159ff61ddecea517571da5ac8be197464f2fedab3a22177805
-  languageName: node
-  linkType: hard
-
-"npm-registry-fetch@npm:*":
-  version: 12.0.0
-  resolution: "npm-registry-fetch@npm:12.0.0"
-  dependencies:
-    make-fetch-happen: ^9.0.1
-    minipass: ^3.1.3
-    minipass-fetch: ^1.3.0
-    minipass-json-stream: ^1.0.1
-    minizlib: ^2.0.0
-    npm-package-arg: ^8.0.0
-  checksum: 71da707148567659d8e0fe43d9fb735efad6a4b0ca19747dee1d5b6995d3c0c96f430700c5d040f8249e2b6aa6dc6c91ec0ffe0d0d8770412c0ab372ed2f68df
-  languageName: node
-  linkType: hard
-
-"npm-registry-fetch@npm:^11.0.0":
-  version: 11.0.0
-  resolution: "npm-registry-fetch@npm:11.0.0"
-  dependencies:
-    make-fetch-happen: ^9.0.1
-    minipass: ^3.1.3
-    minipass-fetch: ^1.3.0
-    minipass-json-stream: ^1.0.1
-    minizlib: ^2.0.0
-    npm-package-arg: ^8.0.0
-  checksum: dda149cd86f8ee73db1b0a0302fbf59983ef03ad180051caa9aad1de9f1e099aaa77adcda3ca2c3bd9d98958e9e6593bd56ee21d3f660746b0a65fafbf5ae161
+  checksum: d2023c5a15bb70b87fec0144ddfa454af642d34debd49ad561041d7bb8a4a225f162352013096352f4d2f35b59c6b009c0a6f66ba838db8bac02e376fa754e47
   languageName: node
   linkType: hard
 
-"npm-registry-fetch@npm:^13.0.0, npm-registry-fetch@npm:^13.0.1":
-  version: 13.1.0
-  resolution: "npm-registry-fetch@npm:13.1.0"
+"npm-registry-fetch@npm:*, npm-registry-fetch@npm:^13.0.0, npm-registry-fetch@npm:^13.0.1, npm-registry-fetch@npm:^13.1.1":
+  version: 13.1.1
+  resolution: "npm-registry-fetch@npm:13.1.1"
   dependencies:
     make-fetch-happen: ^10.0.6
     minipass: ^3.1.6
@@ -9270,7 +8537,7 @@ fsevents@~2.3.2:
     minizlib: ^2.1.2
     npm-package-arg: ^9.0.1
     proc-log: ^2.0.0
-  checksum: 599f498f58f500c3ca57ce3566ca3298d1ad8e58ef913577f884578790a27100ce7a2bc9c9f127bc06efd41de89ca0cc71004e96884f9fccbaa62cf37e7d0085
+  checksum: e085faf5cdc1cfe9b8f825065a0823531b2a28799d84614b3971e344dde087f9089c0f0220360771a81f110c5444978c6f7309084ff7d7d396252b068148bb44
   languageName: node
   linkType: hard
 
@@ -9381,32 +8648,31 @@ fsevents@~2.3.2:
   linkType: hard
 
 "npm@npm:^8.3.0":
-  version: 8.5.5
-  resolution: "npm@npm:8.5.5"
+  version: 8.8.0
+  resolution: "npm@npm:8.8.0"
   dependencies:
     "@isaacs/string-locale-compare": ^1.1.0
-    "@npmcli/arborist": ^5.0.3
+    "@npmcli/arborist": ^5.0.4
     "@npmcli/ci-detect": ^2.0.0
-    "@npmcli/config": ^4.0.1
-    "@npmcli/map-workspaces": ^2.0.2
-    "@npmcli/package-json": ^1.0.1
+    "@npmcli/config": ^4.1.0
+    "@npmcli/fs": ^2.1.0
+    "@npmcli/map-workspaces": ^2.0.3
+    "@npmcli/package-json": ^2.0.0
     "@npmcli/run-script": ^3.0.1
     abbrev: ~1.1.1
-    ansicolors: ~0.3.2
-    ansistyles: ~0.1.3
     archy: ~1.0.0
-    cacache: ^16.0.2
+    cacache: ^16.0.6
     chalk: ^4.1.2
     chownr: ^2.0.0
     cli-columns: ^4.0.0
-    cli-table3: ^0.6.1
+    cli-table3: ^0.6.2
     columnify: ^1.6.0
     fastest-levenshtein: ^1.0.12
-    glob: ^7.2.0
-    graceful-fs: ^4.2.9
+    glob: ^8.0.1
+    graceful-fs: ^4.2.10
     hosted-git-info: ^5.0.0
-    ini: ^2.0.0
-    init-package-json: ^3.0.1
+    ini: ^3.0.0
+    init-package-json: ^3.0.2
     is-cidr: ^4.0.2
     json-parse-even-better-errors: ^2.3.1
     libnpmaccess: ^6.0.2
@@ -9420,7 +8686,7 @@ fsevents@~2.3.2:
     libnpmsearch: ^5.0.2
     libnpmteam: ^4.0.2
     libnpmversion: ^3.0.1
-    make-fetch-happen: ^10.0.6
+    make-fetch-happen: ^10.1.2
     minipass: ^3.1.6
     minipass-pipeline: ^1.2.4
     mkdirp: ^1.0.4
@@ -9428,80 +8694,58 @@ fsevents@~2.3.2:
     ms: ^2.1.2
     node-gyp: ^9.0.0
     nopt: ^5.0.0
-    npm-audit-report: ^2.1.5
-    npm-install-checks: ^4.0.0
-    npm-package-arg: ^9.0.1
-    npm-pick-manifest: ^7.0.0
-    npm-profile: ^6.0.2
-    npm-registry-fetch: ^13.0.1
+    npm-audit-report: ^3.0.0
+    npm-install-checks: ^5.0.0
+    npm-package-arg: ^9.0.2
+    npm-pick-manifest: ^7.0.1
+    npm-profile: ^6.0.3
+    npm-registry-fetch: ^13.1.1
     npm-user-validate: ^1.0.1
-    npmlog: ^6.0.1
+    npmlog: ^6.0.2
     opener: ^1.5.2
-    pacote: ^13.0.5
-    parse-conflict-json: ^2.0.1
-    proc-log: ^2.0.0
+    pacote: ^13.1.1
+    parse-conflict-json: ^2.0.2
+    proc-log: ^2.0.1
     qrcode-terminal: ^0.12.0
     read: ~1.0.7
-    read-package-json: ^5.0.0
+    read-package-json: ^5.0.1
     read-package-json-fast: ^2.0.3
     readdir-scoped-modules: ^1.1.0
     rimraf: ^3.0.2
-    semver: ^7.3.5
-    ssri: ^8.0.1
+    semver: ^7.3.7
+    ssri: ^9.0.0
     tar: ^6.1.11
     text-table: ~0.2.0
     tiny-relative-date: ^1.3.0
-    treeverse: ^1.0.4
-    validate-npm-package-name: ~3.0.0
+    treeverse: ^2.0.0
+    validate-npm-package-name: ^4.0.0
     which: ^2.0.2
     write-file-atomic: ^4.0.1
   bin:
     npm: bin/npm-cli.js
     npx: bin/npx-cli.js
-  checksum: f48fbac8c76a0afa709aaeb3ffeb2d6886b88577f6f7f54e91bc0d6169f6ec90f402bbd6ab7e643347970d95d43860f35b0dc0343664222def47cc6042ccf74a
-  languageName: node
-  linkType: hard
-
-"npmlog@npm:*, npmlog@npm:^6.0.0":
-  version: 6.0.0
-  resolution: "npmlog@npm:6.0.0"
-  dependencies:
-    are-we-there-yet: ^2.0.0
-    console-control-strings: ^1.1.0
-    gauge: ^4.0.0
-    set-blocking: ^2.0.0
-  checksum: 33d8a7fe3d63bf83b16655b6588ae7ba10b5f37b067a661e7cab6508660d7c3204ae716ee2c5ce4eb9626fd1489cf2fa7645d789bc3b704f8c3ccb04a532a50b
-  languageName: node
-  linkType: hard
-
-"npmlog@npm:^4.1.2":
-  version: 4.1.2
-  resolution: "npmlog@npm:4.1.2"
-  dependencies:
-    are-we-there-yet: ~1.1.2
-    console-control-strings: ~1.1.0
-    gauge: ~2.7.3
-    set-blocking: ~2.0.0
-  checksum: edbda9f95ec20957a892de1839afc6fb735054c3accf6fbefe767bac9a639fd5cea2baeac6bd2bcd50a85cb54924d57d9886c81c7fbc2332c2ddd19227504192
+  checksum: ece9941f5e3fe1cdeeb80030bd17512ee3f6ea3fd4c9efd7cc682e0170356cd39350de814cb0a6ba4dd3ed993b1e51c3edbcf16a440b3719994e510c3eba654b
   languageName: node
   linkType: hard
 
-"npmlog@npm:^6.0.1":
-  version: 6.0.1
-  resolution: "npmlog@npm:6.0.1"
+"npmlog@npm:*, npmlog@npm:^6.0.0, npmlog@npm:^6.0.2":
+  version: 6.0.2
+  resolution: "npmlog@npm:6.0.2"
   dependencies:
     are-we-there-yet: ^3.0.0
     console-control-strings: ^1.1.0
-    gauge: ^4.0.0
+    gauge: ^4.0.3
     set-blocking: ^2.0.0
-  checksum: f1a4078a73ebc89896a832bbf869f491c32ecb12e0434b9a7499878ce8f29f22e72befe3c53cd8cdc9dbf4b4057297e783ab0b6746a8b067734de6205af4d538
+  checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a
   languageName: node
   linkType: hard
 
-"number-is-nan@npm:^1.0.0":
-  version: 1.0.1
-  resolution: "number-is-nan@npm:1.0.1"
-  checksum: 13656bc9aa771b96cef209ffca31c31a03b507ca6862ba7c3f638a283560620d723d52e626d57892c7fff475f4c36ac07f0600f14544692ff595abff214b9ffb
+"nth-check@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "nth-check@npm:2.0.1"
+  dependencies:
+    boolbase: ^1.0.0
+  checksum: 5386d035c48438ff304fe687704d93886397349d1bed136de97aeae464caba10e8ffac55a04b215b86b3bc8897f33e0a5aa1045a9d8b2f251ae61b2a3ad3e450
   languageName: node
   linkType: hard
 
@@ -9512,7 +8756,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1":
+"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1":
   version: 4.1.1
   resolution: "object-assign@npm:4.1.1"
   checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
@@ -9537,14 +8781,14 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"object-inspect@npm:^1.11.0, object-inspect@npm:^1.12.0, object-inspect@npm:^1.9.0":
+"object-inspect@npm:^1.12.0, object-inspect@npm:^1.9.0":
   version: 1.12.0
   resolution: "object-inspect@npm:1.12.0"
   checksum: 2b36d4001a9c921c6b342e2965734519c9c58c355822243c3207fbf0aac271f8d44d30d2d570d450b2cc6f0f00b72bcdba515c37827d2560e5f22b1899a31cf4
   languageName: node
   linkType: hard
 
-"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1":
+"object-keys@npm:^1.1.1":
   version: 1.1.1
   resolution: "object-keys@npm:1.1.1"
   checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a
@@ -9785,12 +9029,12 @@ fsevents@~2.3.2:
   linkType: hard
 
 "p-retry@npm:^4.0.0":
-  version: 4.6.1
-  resolution: "p-retry@npm:4.6.1"
+  version: 4.6.2
+  resolution: "p-retry@npm:4.6.2"
   dependencies:
-    "@types/retry": ^0.12.0
+    "@types/retry": 0.12.0
     retry: ^0.13.1
-  checksum: e6d540413bb3d0b96e0db44f74a7af1dce41f5005e6e84d617960110b148348c86a3987be07797749e3ddd55817dd3a8ffd6eae3428758bc2994d987e48c3a70
+  checksum: 45c270bfddaffb4a895cea16cb760dcc72bdecb6cb45fef1971fa6ea2e91ddeafddefe01e444ac73e33b1b3d5d29fb0dd18a7effb294262437221ddc03ce0f2e
   languageName: node
   linkType: hard
 
@@ -9808,42 +9052,13 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"pacote@npm:*, pacote@npm:^12.0.0, pacote@npm:^12.0.2":
-  version: 12.0.2
-  resolution: "pacote@npm:12.0.2"
-  dependencies:
-    "@npmcli/git": ^2.1.0
-    "@npmcli/installed-package-contents": ^1.0.6
-    "@npmcli/promise-spawn": ^1.2.0
-    "@npmcli/run-script": ^2.0.0
-    cacache: ^15.0.5
-    chownr: ^2.0.0
-    fs-minipass: ^2.1.0
-    infer-owner: ^1.0.4
-    minipass: ^3.1.3
-    mkdirp: ^1.0.3
-    npm-package-arg: ^8.0.1
-    npm-packlist: ^3.0.0
-    npm-pick-manifest: ^6.0.0
-    npm-registry-fetch: ^11.0.0
-    promise-retry: ^2.0.1
-    read-package-json-fast: ^2.0.1
-    rimraf: ^3.0.2
-    ssri: ^8.0.1
-    tar: ^6.1.0
-  bin:
-    pacote: lib/bin.js
-  checksum: db2a338525d1074df2af55bccd4661949cb32343578d5ed052d516e3cb83b8c5b477437beba6bcbc59c9731eff73198a95f4ebfdfa533c726367519a70afe11e
-  languageName: node
-  linkType: hard
-
-"pacote@npm:^13.0.3, pacote@npm:^13.0.5":
-  version: 13.0.5
-  resolution: "pacote@npm:13.0.5"
+"pacote@npm:*, pacote@npm:^13.0.3, pacote@npm:^13.0.5, pacote@npm:^13.1.1":
+  version: 13.2.0
+  resolution: "pacote@npm:13.2.0"
   dependencies:
     "@npmcli/git": ^3.0.0
     "@npmcli/installed-package-contents": ^1.0.7
-    "@npmcli/promise-spawn": ^1.2.0
+    "@npmcli/promise-spawn": ^3.0.0
     "@npmcli/run-script": ^3.0.1
     cacache: ^16.0.0
     chownr: ^2.0.0
@@ -9852,7 +9067,7 @@ fsevents@~2.3.2:
     minipass: ^3.1.6
     mkdirp: ^1.0.4
     npm-package-arg: ^9.0.0
-    npm-packlist: ^4.0.0
+    npm-packlist: ^5.0.0
     npm-pick-manifest: ^7.0.0
     npm-registry-fetch: ^13.0.1
     proc-log: ^2.0.0
@@ -9860,11 +9075,11 @@ fsevents@~2.3.2:
     read-package-json: ^5.0.0
     read-package-json-fast: ^2.0.3
     rimraf: ^3.0.2
-    ssri: ^8.0.1
+    ssri: ^9.0.0
     tar: ^6.1.11
   bin:
     pacote: lib/bin.js
-  checksum: 9d187945debf6f32a9b4c1928f878fc95f601f33492e7beee2cdd87b85e735318fd67e255f111c50d3e69a81e759ec189316d546a48913706453c0b9a7b835ae
+  checksum: 5bd7c48a8ffddc52f1cace12a86eaf8755c42c9065945038986a16c626341e0f51cf22763b9546d957d3179726dc55703cd1f596ed81c59ff66fedaf6d4d071d
   languageName: node
   linkType: hard
 
@@ -9908,14 +9123,14 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"parse-conflict-json@npm:*, parse-conflict-json@npm:^2.0.1":
-  version: 2.0.1
-  resolution: "parse-conflict-json@npm:2.0.1"
+"parse-conflict-json@npm:*, parse-conflict-json@npm:^2.0.1, parse-conflict-json@npm:^2.0.2":
+  version: 2.0.2
+  resolution: "parse-conflict-json@npm:2.0.2"
   dependencies:
     json-parse-even-better-errors: ^2.3.1
     just-diff: ^5.0.1
-    just-diff-apply: ^4.0.1
-  checksum: 398728731f3b7330d2885075f1dad0abd6fb943fca6aaa5f0edf46ccf06fe72b3ae09327f19447e98052fdfbf8bcfeee3aa14d7eb843846ec158b871a7fc1bba
+    just-diff-apply: ^5.2.0
+  checksum: 076f65c958696586daefb153f59d575dfb59648be43116a21b74d5ff69ec63dd56f585a27cc2da56d8e64ca5abf0373d6619b8330c035131f8d1e990c8406378
   languageName: node
   linkType: hard
 
@@ -10093,20 +9308,13 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2":
+"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1":
   version: 2.3.1
   resolution: "picomatch@npm:2.3.1"
   checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf
   languageName: node
   linkType: hard
 
-"picomatch@npm:^2.2.3":
-  version: 2.3.0
-  resolution: "picomatch@npm:2.3.0"
-  checksum: 16818720ea7c5872b6af110760dee856c8e4cd79aed1c7a006d076b1cc09eff3ae41ca5019966694c33fbd2e1cc6ea617ab10e4adac6df06556168f13be3fca2
-  languageName: node
-  linkType: hard
-
 "pidtree@npm:^0.5.0":
   version: 0.5.0
   resolution: "pidtree@npm:0.5.0"
@@ -10131,10 +9339,10 @@ fsevents@~2.3.2:
   linkType: hard
 
 "pinia@npm:^2.0.12":
-  version: 2.0.12
-  resolution: "pinia@npm:2.0.12"
+  version: 2.0.13
+  resolution: "pinia@npm:2.0.13"
   dependencies:
-    "@vue/devtools-api": ^6.1.0
+    "@vue/devtools-api": ^6.1.4
     vue-demi: "*"
   peerDependencies:
     "@vue/composition-api": ^1.4.0
@@ -10145,7 +9353,7 @@ fsevents@~2.3.2:
       optional: true
     typescript:
       optional: true
-  checksum: 593233a40a242814c39aea7f94f66d91a0fe56873026b6a22700389e026c10beb155ad9b3e71a9b62f3ca782cd9ac62e48ad07506e569385cde27da119b3b610
+  checksum: e9f2be12996c4778409ff6757b6472948b493924aaba07dd5f35a3222166c4093a746a894f076a702436f3449363f2f535ce4f5347f332167518247105b2af3e
   languageName: node
   linkType: hard
 
@@ -10216,13 +9424,13 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"postcss-selector-parser@npm:^6.0.2":
-  version: 6.0.6
-  resolution: "postcss-selector-parser@npm:6.0.6"
+"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.9":
+  version: 6.0.10
+  resolution: "postcss-selector-parser@npm:6.0.10"
   dependencies:
     cssesc: ^3.0.0
     util-deprecate: ^1.0.2
-  checksum: 3602758798048bffbd6a97d6f009b32a993d6fd2cc70775bb59593e803d7fa8738822ecffb2fafc745edf7fad297dad53c30d2cfe78446a7d3f4a4a258cb15b2
+  checksum: 46afaa60e3d1998bd7adf6caa374baf857cc58d3ff944e29459c9a9e4680a7fe41597bd5b755fc81d7c388357e9bf67c0251d047c640a09f148e13606b8a8608
   languageName: node
   linkType: hard
 
@@ -10236,14 +9444,14 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"postcss@npm:^8.4.6":
-  version: 8.4.12
-  resolution: "postcss@npm:8.4.12"
+"postcss@npm:^8.4.13":
+  version: 8.4.13
+  resolution: "postcss@npm:8.4.13"
   dependencies:
-    nanoid: ^3.3.1
+    nanoid: ^3.3.3
     picocolors: ^1.0.0
     source-map-js: ^1.0.2
-  checksum: 248e3d0f9bbb8efaafcfda7f91627a29bdc9a19f456896886330beb28c5abea0e14c7901b35191928602e2eccbed496b1e94097d27a0b2a980854cd00c7a835f
+  checksum: 514fb3552805a5d039a2d6b4df3e73f657001716ca93c0d57e6067b0473abdea70276d80afc96005c9aaff82ed5d98062bd97724d3f47ca400fba0b5e9e436ed
   languageName: node
   linkType: hard
 
@@ -10263,35 +9471,19 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"prettier@npm:^1.18.2 || ^2.0.0":
-  version: 2.5.0
-  resolution: "prettier@npm:2.5.0"
-  bin:
-    prettier: bin-prettier.js
-  checksum: aad1b35b73e7c14596d389d90977a83dad0db689ba5802a0ef319c357b7867f55b885db197972aa6a56c30f53088c9f8e0d7f7930ae074c275a4e9cbe091d21d
-  languageName: node
-  linkType: hard
-
-"prettier@npm:^2.4.1, prettier@npm:^2.5.1":
-  version: 2.6.0
-  resolution: "prettier@npm:2.6.0"
+"prettier@npm:^1.18.2 || ^2.0.0, prettier@npm:^2.4.1, prettier@npm:^2.5.1":
+  version: 2.6.2
+  resolution: "prettier@npm:2.6.2"
   bin:
     prettier: bin-prettier.js
-  checksum: 3e527ad62279676778a8404d18174d7ca2365ada4caba6eebbcdd9907d1187afd3bc6ade5b4e5f5d4549bb9fb71e45ca8930d71500017635524f8fc05bc52e93
+  checksum: 48d08dde8e9fb1f5bccdd205baa7f192e9fc8bc98f86e1b97d919de804e28c806b0e6cc685e4a88211aa7987fa9668f30baae19580d87ced3ed0f2ec6572106f
   languageName: node
   linkType: hard
 
-"proc-log@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "proc-log@npm:1.0.0"
-  checksum: 249605d5b28bfa0499d70da24ab056ad1e082a301f0a46d0ace6e8049cf16aaa0e71d9ea5cab29b620ffb327c18af97f0e012d1db090673447e7c1d33239dd96
-  languageName: node
-  linkType: hard
-
-"proc-log@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "proc-log@npm:2.0.0"
-  checksum: 74ab7f7d47fee1fa81e068e9a7f4cdca7e20b6b14fe51fad1f595bf9d4ce5451c858922a25f447835021ec89192788b56700cd7740ede50966099c41ebe0c70c
+"proc-log@npm:^2.0.0, proc-log@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "proc-log@npm:2.0.1"
+  checksum: f6f23564ff759097db37443e6e2765af84979a703d2c52c1b9df506ee9f87caa101ba49d8fdc115c1a313ec78e37e8134704e9069e6a870f3499d98bb24c436f
   languageName: node
   linkType: hard
 
@@ -10667,13 +9859,13 @@ fsevents@~2.3.2:
   linkType: hard
 
 "rdf-terms@npm:^1.7.0":
-  version: 1.7.1
-  resolution: "rdf-terms@npm:1.7.1"
+  version: 1.8.2
+  resolution: "rdf-terms@npm:1.8.2"
   dependencies:
     "@rdfjs/types": "*"
     rdf-data-factory: ^1.1.0
     rdf-string: ^1.6.0
-  checksum: adad2adfda2c68afc5d33f90b10d5cda5666581824bca3c6879544665c1acf1afa022d20ba039657757475080895025f8464250046af195737cef241e3662f29
+  checksum: a5c678b9b6ebbe2ec0cc05d871b483140c075c459b0f8a3c36a9ce6e85b5150d43e9966c592542f7f453c92a68c53a34978a80ac8284ed689ec5c6915d2a0fc9
   languageName: node
   linkType: hard
 
@@ -10740,14 +9932,14 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"read-cmd-shim@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "read-cmd-shim@npm:2.0.0"
-  checksum: 024f0a092d3630ad344af63eb0539bce90978883dd06a93e7bfbb26913168ab034473eae4a85685ea76a982eb31b0e8e16dee9c1138dabb3a925e7c4757952bc
+"read-cmd-shim@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "read-cmd-shim@npm:3.0.0"
+  checksum: b518c6026f3320e30b692044f6ff5c4dc80f9c71261296da8994101b569b26b12b8e5df397bba2d4691dd3a3a2f770a1eca7be18a69ec202fac6dcfadc5016fd
   languageName: node
   linkType: hard
 
-"read-package-json-fast@npm:*, read-package-json-fast@npm:^2.0.1, read-package-json-fast@npm:^2.0.2, read-package-json-fast@npm:^2.0.3":
+"read-package-json-fast@npm:*, read-package-json-fast@npm:^2.0.2, read-package-json-fast@npm:^2.0.3":
   version: 2.0.3
   resolution: "read-package-json-fast@npm:2.0.3"
   dependencies:
@@ -10757,27 +9949,15 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"read-package-json@npm:*, read-package-json@npm:^4.1.1":
-  version: 4.1.1
-  resolution: "read-package-json@npm:4.1.1"
-  dependencies:
-    glob: ^7.1.1
-    json-parse-even-better-errors: ^2.3.0
-    normalize-package-data: ^3.0.0
-    npm-normalize-package-bin: ^1.0.0
-  checksum: d95f6e9747bcce9bdbfae8442a86c41cde3a73691a8a8cdc46e0711e7768718e1f0955a38cbde01a6e571f490bbdc9d6a83713a89eca85646a816e659a78f6f4
-  languageName: node
-  linkType: hard
-
-"read-package-json@npm:^5.0.0":
-  version: 5.0.0
-  resolution: "read-package-json@npm:5.0.0"
+"read-package-json@npm:*, read-package-json@npm:^5.0.0, read-package-json@npm:^5.0.1":
+  version: 5.0.1
+  resolution: "read-package-json@npm:5.0.1"
   dependencies:
-    glob: ^7.2.0
+    glob: ^8.0.1
     json-parse-even-better-errors: ^2.3.1
     normalize-package-data: ^4.0.0
     npm-normalize-package-bin: ^1.0.1
-  checksum: 9104dda32cb647e2f1a5244dd1f78f60c8eaa35bc4b3b1ed56373bc30fa8b7a80676a082c61c1a86cfac7c9643ac8c6bd535790a91f1a2c02bf535903902641b
+  checksum: e8c2ad72df1f17e71268feabdb9bb0153ed2c7d38a05b759c5c49cf368a754bdd3c0e8a279fbc8d707802ff91d2cf144a995e6ebd5534de2848d52ab2c14034d
   languageName: node
   linkType: hard
 
@@ -10804,7 +9984,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"read@npm:*, read@npm:1, read@npm:^1.0.7, read@npm:~1.0.1, read@npm:~1.0.7":
+"read@npm:*, read@npm:1, read@npm:^1.0.7, read@npm:~1.0.7":
   version: 1.0.7
   resolution: "read@npm:1.0.7"
   dependencies:
@@ -10820,7 +10000,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.6, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6":
+"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6":
   version: 2.3.7
   resolution: "readable-stream@npm:2.3.7"
   dependencies:
@@ -11014,20 +10194,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"resolve@npm:^1.10.0":
-  version: 1.21.0
-  resolution: "resolve@npm:1.21.0"
-  dependencies:
-    is-core-module: ^2.8.0
-    path-parse: ^1.0.7
-    supports-preserve-symlinks-flag: ^1.0.0
-  bin:
-    resolve: bin/resolve
-  checksum: d7d9092a5c04a048bea16c7e5a2eb605ac3e8363a0cc5644de1fde17d5028e8d5f4343aab1d99bd327b98e91a66ea83e242718150c64dfedcb96e5e7aad6c4f5
-  languageName: node
-  linkType: hard
-
-"resolve@npm:^1.20.0, resolve@npm:^1.22.0":
+"resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0":
   version: 1.22.0
   resolution: "resolve@npm:1.22.0"
   dependencies:
@@ -11040,20 +10207,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>":
-  version: 1.21.0
-  resolution: "resolve@patch:resolve@npm%3A1.21.0#~builtin<compat/resolve>::version=1.21.0&hash=07638b"
-  dependencies:
-    is-core-module: ^2.8.0
-    path-parse: ^1.0.7
-    supports-preserve-symlinks-flag: ^1.0.0
-  bin:
-    resolve: bin/resolve
-  checksum: a0a4d1f7409e73190f31f901f8a619960bb3bd4ae38ba3a54c7ea7e1c87758d28a73256bb8d6a35996a903d1bf14f53883f0dcac6c571c063cb8162d813ad26e
-  languageName: node
-  linkType: hard
-
-"resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.0#~builtin<compat/resolve>":
+"resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.0#~builtin<compat/resolve>":
   version: 1.22.0
   resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin<compat/resolve>::version=1.22.0&hash=07638b"
   dependencies:
@@ -11192,8 +10346,8 @@ fsevents@~2.3.2:
   linkType: hard
 
 "rollup@npm:^2.58.0, rollup@npm:^2.59.0":
-  version: 2.70.1
-  resolution: "rollup@npm:2.70.1"
+  version: 2.71.1
+  resolution: "rollup@npm:2.71.1"
   dependencies:
     fsevents: ~2.3.2
   dependenciesMeta:
@@ -11201,7 +10355,7 @@ fsevents@~2.3.2:
       optional: true
   bin:
     rollup: dist/bin/rollup
-  checksum: 06c62933e6e81a1c8c684d7d576e507081aabdb63cc0c91bca86b7348b66df03b77827068e4990b8b6c738bd3ef66dcc8c7ed7e0ea40b736068e7618f693133e
+  checksum: fe2b2fda7bf53c86e970f3b026b784c00e2237089b802755b3e43725db88f5d1869c1f81f8c5257e9b68b0fd1840dcbd3897d2f19768cce97a37c70e1a563dce
   languageName: node
   linkType: hard
 
@@ -11279,15 +10433,15 @@ fsevents@~2.3.2:
   linkType: hard
 
 "sass@npm:^1.49.9":
-  version: 1.49.9
-  resolution: "sass@npm:1.49.9"
+  version: 1.51.0
+  resolution: "sass@npm:1.51.0"
   dependencies:
     chokidar: ">=3.0.0 <4.0.0"
     immutable: ^4.0.0
     source-map-js: ">=0.6.2 <2.0.0"
   bin:
     sass: sass.js
-  checksum: e5653e3499274c5127dcb5c9e7c5f6930378fc61764d999a5d8965782e027181ed09714f94836dec74ef55e3a858107fe6c571954c0cab0ad0be5ab8e586829c
+  checksum: d674fd87be863961d5e5233a148e381a72b06ca1749ffd95a08be2c3f4aa8fc77e3e21840347a84d7d4542cbf97cd6f9bfae19ecb1f5eefa6c207a3d8f923dbc
   languageName: node
   linkType: hard
 
@@ -11363,14 +10517,14 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"semver@npm:*, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5":
-  version: 7.3.5
-  resolution: "semver@npm:7.3.5"
+"semver@npm:*, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7":
+  version: 7.3.7
+  resolution: "semver@npm:7.3.7"
   dependencies:
     lru-cache: ^6.0.0
   bin:
     semver: bin/semver.js
-  checksum: 5eafe6102bea2a7439897c1856362e31cc348ccf96efd455c8b5bc2c61e6f7e7b8250dc26b8828c1d76a56f818a7ee907a36ae9fb37a599d3d24609207001d60
+  checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232
   languageName: node
   linkType: hard
 
@@ -11401,7 +10555,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0":
+"set-blocking@npm:^2.0.0":
   version: 2.0.0
   resolution: "set-blocking@npm:2.0.0"
   checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02
@@ -11489,21 +10643,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.3":
-  version: 3.0.3
-  resolution: "signal-exit@npm:3.0.3"
-  checksum: f0169d3f1263d06df32ca072b0bf33b34c6f8f0341a7a1621558a2444dfbe8f5fec76b35537fcc6f0bc4944bdb5336fe0bdcf41a5422c4e45a1dba3f45475e6c
-  languageName: node
-  linkType: hard
-
-"signal-exit@npm:^3.0.2":
-  version: 3.0.6
-  resolution: "signal-exit@npm:3.0.6"
-  checksum: b819ac81ba757af559dad0804233ae31bf6f054591cd8a671e9cbcf09f21c72ec3076fe87d1e04861f5b33b47d63f0694b568de99c99cd733ee2060515beb6d5
-  languageName: node
-  linkType: hard
-
-"signal-exit@npm:^3.0.7":
+"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7":
   version: 3.0.7
   resolution: "signal-exit@npm:3.0.7"
   checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318
@@ -11567,7 +10707,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"smart-buffer@npm:^4.1.0":
+"smart-buffer@npm:^4.2.0":
   version: 4.2.0
   resolution: "smart-buffer@npm:4.2.0"
   checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b
@@ -11610,35 +10750,24 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"socks-proxy-agent@npm:^5.0.0":
-  version: 5.0.1
-  resolution: "socks-proxy-agent@npm:5.0.1"
-  dependencies:
-    agent-base: ^6.0.2
-    debug: 4
-    socks: ^2.3.3
-  checksum: 1b60c4977b2fef783f0fc4dc619cd2758aafdb43f3cf679f1e3627cb6c6e752811cee5513ebb4157ad26786033d2f85029440f197d321e8293b38cc5aab01e06
-  languageName: node
-  linkType: hard
-
-"socks-proxy-agent@npm:^6.0.0, socks-proxy-agent@npm:^6.1.1":
-  version: 6.1.1
-  resolution: "socks-proxy-agent@npm:6.1.1"
+"socks-proxy-agent@npm:^6.1.1":
+  version: 6.2.0
+  resolution: "socks-proxy-agent@npm:6.2.0"
   dependencies:
     agent-base: ^6.0.2
-    debug: ^4.3.1
-    socks: ^2.6.1
-  checksum: 9a8a4f791bba0060315cf7291ca6f9db37d6fc280fd0860d73d8887d3efe4c22e823aa25a8d5375f6079279f8dc91b50c075345179bf832bfe3c7c26d3582e3c
+    debug: ^4.3.3
+    socks: ^2.6.2
+  checksum: 6723fd64fb50334e2b340fd0a80fd8488ffc5bc43d85b7cf1d25612044f814dd7d6ea417fd47602159941236f7f4bd15669fa5d7e1f852598a31288e1a43967b
   languageName: node
   linkType: hard
 
-"socks@npm:^2.3.3, socks@npm:^2.6.1":
-  version: 2.6.1
-  resolution: "socks@npm:2.6.1"
+"socks@npm:^2.6.2":
+  version: 2.6.2
+  resolution: "socks@npm:2.6.2"
   dependencies:
     ip: ^1.1.5
-    smart-buffer: ^4.1.0
-  checksum: 2ca9d616e424f645838ebaabb04f85d94ea999e0f8393dc07f86c435af22ed88cb83958feeabd1bb7bc537c635ed47454255635502c6808a6df61af1f41af750
+    smart-buffer: ^4.2.0
+  checksum: dd9194293059d737759d5c69273850ad4149f448426249325c4bea0e340d1cf3d266c3b022694b0dcf5d31f759de23657244c481fc1e8322add80b7985c36b5e
   languageName: node
   linkType: hard
 
@@ -11686,7 +10815,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"source-map@npm:^0.5.0, source-map@npm:^0.5.6":
+"source-map@npm:^0.5.6":
   version: 0.5.7
   resolution: "source-map@npm:0.5.7"
   checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d
@@ -11848,12 +10977,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"ssri@npm:*, ssri@npm:^8.0.0, ssri@npm:^8.0.1":
-  version: 8.0.1
-  resolution: "ssri@npm:8.0.1"
+"ssri@npm:*, ssri@npm:^9.0.0":
+  version: 9.0.0
+  resolution: "ssri@npm:9.0.0"
   dependencies:
     minipass: ^3.1.1
-  checksum: bc447f5af814fa9713aa201ec2522208ae0f4d8f3bda7a1f445a797c7b929a02720436ff7c478fb5edc4045adb02b1b88d2341b436a80798734e2494f1067b36
+  checksum: bf33174232d07cc64e77ab1c51b55d28352273380c503d35642a19627e88a2c5f160039bb0a28608a353485075dda084dbf0390c7070f9f284559eb71d01b84b
   languageName: node
   linkType: hard
 
@@ -11966,27 +11095,6 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"string-width@npm:^1.0.1":
-  version: 1.0.2
-  resolution: "string-width@npm:1.0.2"
-  dependencies:
-    code-point-at: ^1.0.0
-    is-fullwidth-code-point: ^1.0.0
-    strip-ansi: ^3.0.0
-  checksum: 5c79439e95bc3bd7233a332c5f5926ab2ee90b23816ed4faa380ce3b2576d7800b0a5bb15ae88ed28737acc7ea06a518c2eef39142dd727adad0e45c776cd37e
-  languageName: node
-  linkType: hard
-
-"string-width@npm:^1.0.2 || 2":
-  version: 2.1.1
-  resolution: "string-width@npm:2.1.1"
-  dependencies:
-    is-fullwidth-code-point: ^2.0.0
-    strip-ansi: ^4.0.0
-  checksum: d6173abe088c615c8dffaf3861dc5d5906ed3dc2d6fd67ff2bd2e2b5dce7fd683c5240699cf0b1b8aa679a3b3bd6b28b5053c824cb89b813d7f6541d8f89064a
-  languageName: node
-  linkType: hard
-
 "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3":
   version: 4.2.3
   resolution: "string-width@npm:4.2.3"
@@ -12010,22 +11118,24 @@ fsevents@~2.3.2:
   linkType: hard
 
 "string.prototype.trimend@npm:^1.0.4":
-  version: 1.0.4
-  resolution: "string.prototype.trimend@npm:1.0.4"
+  version: 1.0.5
+  resolution: "string.prototype.trimend@npm:1.0.5"
   dependencies:
     call-bind: ^1.0.2
-    define-properties: ^1.1.3
-  checksum: 17e5aa45c3983f582693161f972c1c1fa4bbbdf22e70e582b00c91b6575f01680dc34e83005b98e31abe4d5d29e0b21fcc24690239c106c7b2315aade6a898ac
+    define-properties: ^1.1.4
+    es-abstract: ^1.19.5
+  checksum: d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc
   languageName: node
   linkType: hard
 
 "string.prototype.trimstart@npm:^1.0.4":
-  version: 1.0.4
-  resolution: "string.prototype.trimstart@npm:1.0.4"
+  version: 1.0.5
+  resolution: "string.prototype.trimstart@npm:1.0.5"
   dependencies:
     call-bind: ^1.0.2
-    define-properties: ^1.1.3
-  checksum: 3fb06818d3cccac5fa3f5f9873d984794ca0e9f6616fae6fcc745885d9efed4e17fe15f832515d9af5e16c279857fdbffdfc489ca4ed577811b017721b30302f
+    define-properties: ^1.1.4
+    es-abstract: ^1.19.5
+  checksum: a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048
   languageName: node
   linkType: hard
 
@@ -12047,31 +11157,6 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"stringify-package@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "stringify-package@npm:1.0.1"
-  checksum: 462036085a0cf7ae073d9b88a2bbf7efb3792e3df3e1fd436851f64196eb0234c8f8ffac436357e355687d6030b7af42e98af9515929e41a6a5c8653aa62a5aa
-  languageName: node
-  linkType: hard
-
-"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1":
-  version: 3.0.1
-  resolution: "strip-ansi@npm:3.0.1"
-  dependencies:
-    ansi-regex: ^2.0.0
-  checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465
-  languageName: node
-  linkType: hard
-
-"strip-ansi@npm:^4.0.0":
-  version: 4.0.0
-  resolution: "strip-ansi@npm:4.0.0"
-  dependencies:
-    ansi-regex: ^3.0.0
-  checksum: d9186e6c0cf78f25274f6750ee5e4a5725fb91b70fdd79aa5fe648eab092a0ec5b9621b22d69d4534a56319f75d8944efbd84e3afa8d4ad1b9a9491f12c84eca
-  languageName: node
-  linkType: hard
-
 "strip-ansi@npm:^5.2.0":
   version: 5.2.0
   resolution: "strip-ansi@npm:5.2.0"
@@ -12169,9 +11254,9 @@ fsevents@~2.3.2:
   linkType: hard
 
 "supports-color@npm:^9.2.1":
-  version: 9.2.1
-  resolution: "supports-color@npm:9.2.1"
-  checksum: 8a2bfeb64c1512d21a1a998c1f64acdaa85cf1f6a101627286548f19785524b329d7b28d567a28fc2d708fc7aba32f4c82a9b224f76b30a337a39d3e53418ff7
+  version: 9.2.2
+  resolution: "supports-color@npm:9.2.2"
+  checksum: 976d84877402fc38c1d43b1fde20b0a8dc0283273f21cfebe4ff7507d27543cdfbeec7db108a96b82d694465f06d64e8577562b05d0520b41710088e0a33cc50
   languageName: node
   linkType: hard
 
@@ -12206,7 +11291,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"tar@npm:*, tar@npm:^6.0.2, tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2":
+"tar@npm:*, tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2":
   version: 6.1.11
   resolution: "tar@npm:6.1.11"
   dependencies:
@@ -12415,10 +11500,10 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"treeverse@npm:*, treeverse@npm:^1.0.4":
-  version: 1.0.4
-  resolution: "treeverse@npm:1.0.4"
-  checksum: 712640acd811060ff552a3c761f700d18d22a4da544d31b4e290817ac4bbbfcfe33b58f85e7a5787e6ff7351d3a9100670721a289ca14eb87b36ad8a0c20ebd8
+"treeverse@npm:*, treeverse@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "treeverse@npm:2.0.0"
+  checksum: 3c6b2b890975a4d42c86b9a0f1eb932b4450db3fa874be5c301c4f5e306fd76330c6a490cf334b0937b3a44b049787ba5d98c88bc7b140f34fdb3ab1f83e5269
   languageName: node
   linkType: hard
 
@@ -12429,7 +11514,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"tsconfig-paths@npm:^3.12.0":
+"tsconfig-paths@npm:^3.14.1":
   version: 3.14.1
   resolution: "tsconfig-paths@npm:3.14.1"
   dependencies:
@@ -12449,9 +11534,9 @@ fsevents@~2.3.2:
   linkType: hard
 
 "tslib@npm:^2.1.0":
-  version: 2.3.1
-  resolution: "tslib@npm:2.3.1"
-  checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9
+  version: 2.4.0
+  resolution: "tslib@npm:2.4.0"
+  checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113
   languageName: node
   linkType: hard
 
@@ -12547,15 +11632,6 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"typedarray-to-buffer@npm:^3.1.5":
-  version: 3.1.5
-  resolution: "typedarray-to-buffer@npm:3.1.5"
-  dependencies:
-    is-typedarray: ^1.0.0
-  checksum: 99c11aaa8f45189fcfba6b8a4825fd684a321caa9bd7a76a27cf0c7732c174d198b99f449c52c3818107430b5f41c0ccbbfb75cb2ee3ca4a9451710986d61a60
-  languageName: node
-  linkType: hard
-
 "typedarray@npm:^0.0.6":
   version: 0.0.6
   resolution: "typedarray@npm:0.0.6"
@@ -12564,31 +11640,31 @@ fsevents@~2.3.2:
   linkType: hard
 
 "typescript@npm:^4.5.4":
-  version: 4.6.2
-  resolution: "typescript@npm:4.6.2"
+  version: 4.6.4
+  resolution: "typescript@npm:4.6.4"
   bin:
     tsc: bin/tsc
     tsserver: bin/tsserver
-  checksum: 8a44ed7e6f6c4cb1ebe8cf236ecda2fb119d84dcf0fbd77e707b2dfea1bbcfc4e366493a143513ce7f57203c75da9d4e20af6fe46de89749366351046be7577c
+  checksum: e7bfcc39cd4571a63a54e5ea21f16b8445268b9900bf55aee0e02ad981be576acc140eba24f1af5e3c1457767c96cea6d12861768fb386cf3ffb34013718631a
   languageName: node
   linkType: hard
 
 "typescript@patch:typescript@^4.5.4#~builtin<compat/typescript>":
-  version: 4.6.2
-  resolution: "typescript@patch:typescript@npm%3A4.6.2#~builtin<compat/typescript>::version=4.6.2&hash=ddd1e8"
+  version: 4.6.4
+  resolution: "typescript@patch:typescript@npm%3A4.6.4#~builtin<compat/typescript>::version=4.6.4&hash=bda367"
   bin:
     tsc: bin/tsc
     tsserver: bin/tsserver
-  checksum: efb83260a22ee49d4c8bdc59b3cefe54fdf51d6f563f5c3a35aa3d5e46fb12f3f1d33a36d6f9f64171e567ead1847e99cb612d0a9a74e7d44e16cad9d0bbc937
+  checksum: 1cb434fbc637d347be90e3a0c6cd05e33c38f941713c8786d3031faf1842c2c148ba91d2fac01e7276b0ae3249b8633f1660e32686cc7a8c6a8fd5361dc52c66
   languageName: node
   linkType: hard
 
 "uglify-js@npm:^3.1.4":
-  version: 3.14.5
-  resolution: "uglify-js@npm:3.14.5"
+  version: 3.15.4
+  resolution: "uglify-js@npm:3.15.4"
   bin:
     uglifyjs: bin/uglifyjs
-  checksum: 0330eb11a36f4181b6d9a00336355989bfad9dd2203049fc63a59454b0d12337612272ad011bc571b9a382bf74d829ca20409ebfe089e38edb26cfc06bfa2cc9
+  checksum: 5f673c5dd7f3b3dd15d1d26aebfe29bccbb1b896c4b5423ec70a2e8b9506c70b6fb6a53dec83df5ad65a717ec9a850adf08e0aedf9b1711eac5eb080216615fa
   languageName: node
   linkType: hard
 
@@ -12663,14 +11739,14 @@ fsevents@~2.3.2:
   linkType: soft
 
 "unbox-primitive@npm:^1.0.1":
-  version: 1.0.1
-  resolution: "unbox-primitive@npm:1.0.1"
+  version: 1.0.2
+  resolution: "unbox-primitive@npm:1.0.2"
   dependencies:
-    function-bind: ^1.1.1
-    has-bigints: ^1.0.1
-    has-symbols: ^1.0.2
+    call-bind: ^1.0.2
+    has-bigints: ^1.0.2
+    has-symbols: ^1.0.3
     which-boxed-primitive: ^1.0.2
-  checksum: 89d950e18fb45672bc6b3c961f1e72c07beb9640c7ceed847b571ba6f7d2af570ae1a2584cfee268b9d9ea1e3293f7e33e0bc29eaeb9f8e8a0bab057ff9e6bba
+  checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9
   languageName: node
   linkType: hard
 
@@ -12891,12 +11967,12 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"validate-npm-package-name@npm:*, validate-npm-package-name@npm:^3.0.0, validate-npm-package-name@npm:~3.0.0":
-  version: 3.0.0
-  resolution: "validate-npm-package-name@npm:3.0.0"
+"validate-npm-package-name@npm:*, validate-npm-package-name@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "validate-npm-package-name@npm:4.0.0"
   dependencies:
-    builtins: ^1.0.3
-  checksum: ce4c68207abfb22c05eedb09ff97adbcedc80304a235a0844f5344f1fd5086aa80e4dbec5684d6094e26e35065277b765c1caef68bcea66b9056761eddb22967
+    builtins: ^5.0.0
+  checksum: a32fd537bad17fcb59cfd58ae95a414d443866020d448ec3b22e8d40550cb585026582a57efbe1f132b882eea4da8ac38ee35f7be0dd72988a3cb55d305a20c1
   languageName: node
   linkType: hard
 
@@ -12912,8 +11988,8 @@ fsevents@~2.3.2:
   linkType: hard
 
 "vite-aliases@npm:^0.9.1":
-  version: 0.9.1
-  resolution: "vite-aliases@npm:0.9.1"
+  version: 0.9.2
+  resolution: "vite-aliases@npm:0.9.2"
   dependencies:
     chokidar: ^3.5.2
     comment-json: ^4.1.1
@@ -12921,7 +11997,7 @@ fsevents@~2.3.2:
     jsonc-parser: ^3.0.0
     lowdb: ^3.0.0
     vite: ^2.7.10
-  checksum: 5b7335d66cffeada1309479081c9c60539b9aa4f845e7d29ad1c9d7b66a44cb3a8d78bfe3ba744dd3abd5b856a3a2c373ee3aad578c4f43828fe8ad1e52c1f97
+  checksum: a0a373ef5c2ed050ef47ad1e912cad0471b7ee34758427958a69c0b49f527cab8489f756c1e39597ad4de270669f4ec8e912cf1005d5410391133e9b20a52ed2
   languageName: node
   linkType: hard
 
@@ -12957,26 +12033,26 @@ fsevents@~2.3.2:
   linkType: hard
 
 "vite-plugin-windicss@npm:^1.8.3":
-  version: 1.8.3
-  resolution: "vite-plugin-windicss@npm:1.8.3"
+  version: 1.8.4
+  resolution: "vite-plugin-windicss@npm:1.8.4"
   dependencies:
-    "@windicss/plugin-utils": 1.8.3
-    debug: ^4.3.3
+    "@windicss/plugin-utils": 1.8.4
+    debug: ^4.3.4
     kolorist: ^1.5.1
     windicss: ^3.5.1
   peerDependencies:
     vite: ^2.0.1
-  checksum: 73a565527956069b67a3a3213e5f9270673ff02bf79412da0d62fec526d854183d19a50fb23619478cf7b8cab3f42c87eed9e18e8156d91ec60a2c07d93a6523
+  checksum: 657b63b123c5e2696e409e140b1b56a7f02131908ec247dd7e1cf7439aabe707f2f2d1dff857001f8b9206c9771939fb79e5886175d243097d031887f3bd9fa8
   languageName: node
   linkType: hard
 
 "vite@npm:^2.7.10, vite@npm:^2.8.6":
-  version: 2.8.6
-  resolution: "vite@npm:2.8.6"
+  version: 2.9.7
+  resolution: "vite@npm:2.9.7"
   dependencies:
-    esbuild: ^0.14.14
+    esbuild: ^0.14.27
     fsevents: ~2.3.2
-    postcss: ^8.4.6
+    postcss: ^8.4.13
     resolve: ^1.22.0
     rollup: ^2.59.0
   peerDependencies:
@@ -12995,7 +12071,7 @@ fsevents@~2.3.2:
       optional: true
   bin:
     vite: bin/vite.js
-  checksum: 4b02d133892c98362c10214b7ad518d74b59745889197a2ba0b63260ed083fcef75a447e8fb58dbd2af8747386274b36017983d93031254df6ead38701950dcc
+  checksum: d3d2a86855709e037d244c3066e785d7b700e41bf59ceb776818ea06ee2ed579055c10596ca883dd56de46b3654ec82da53369062013a012a1a60819dbb7c0ee
   languageName: node
   linkType: hard
 
@@ -13007,8 +12083,8 @@ fsevents@~2.3.2:
   linkType: hard
 
 "vue-demi@npm:*, vue-demi@npm:^0.12.1":
-  version: 0.12.4
-  resolution: "vue-demi@npm:0.12.4"
+  version: 0.12.5
+  resolution: "vue-demi@npm:0.12.5"
   peerDependencies:
     "@vue/composition-api": ^1.0.0-rc.1
     vue: ^3.0.0-0 || ^2.6.0
@@ -13018,7 +12094,7 @@ fsevents@~2.3.2:
   bin:
     vue-demi-fix: bin/vue-demi-fix.js
     vue-demi-switch: bin/vue-demi-switch.js
-  checksum: cd715e008837c67aa7018e96f5556ffd4f26cbeed031116251c3983b777ff163550670af28b2b39bc650c5f7c4738976524e013cfc36aa17e26bc07fad70efc5
+  checksum: 40a0470caea8312e0d4df2541f141c36c768dfc7f2f7d41f0f28ba29df11d3119e2f09b94c815f13b7c7f3f45dbc247b0e9e0c02a1800e2823e241c1d771e39b
   languageName: node
   linkType: hard
 
@@ -13064,9 +12140,9 @@ fsevents@~2.3.2:
   linkType: hard
 
 "vue-i18n@npm:^8.22.2, vue-i18n@npm:^8.27.0":
-  version: 8.27.0
-  resolution: "vue-i18n@npm:8.27.0"
-  checksum: 6d5af73e3ef219fa2948f508b2fcbee5d669459293f2fab2a08bebaad80f93b6190b0fcae7b5f7b1aa7eab61c896e6b2d4a7e52483282d64f9f5e1d9d0d3af10
+  version: 8.27.1
+  resolution: "vue-i18n@npm:8.27.1"
+  checksum: ee712fcdd503d73d63c9de82bb7315962205b3cd4339c414e9183c5a7b760ce465d2e0bf285aaa3617e8edd37b5004904881b7c406492bde41762865228ce920
   languageName: node
   linkType: hard
 
@@ -13315,16 +12391,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"wide-align@npm:^1.1.0":
-  version: 1.1.3
-  resolution: "wide-align@npm:1.1.3"
-  dependencies:
-    string-width: ^1.0.2 || 2
-  checksum: d09c8012652a9e6cab3e82338d1874a4d7db2ad1bd19ab43eb744acf0b9b5632ec406bdbbbb970a8f4771a7d5ef49824d038ba70aa884e7723f5b090ab87134d
-  languageName: node
-  linkType: hard
-
-"wide-align@npm:^1.1.2":
+"wide-align@npm:^1.1.5":
   version: 1.1.5
   resolution: "wide-align@npm:1.1.5"
   dependencies:
@@ -13394,19 +12461,7 @@ fsevents@~2.3.2:
   languageName: node
   linkType: hard
 
-"write-file-atomic@npm:*, write-file-atomic@npm:^3.0.3":
-  version: 3.0.3
-  resolution: "write-file-atomic@npm:3.0.3"
-  dependencies:
-    imurmurhash: ^0.1.4
-    is-typedarray: ^1.0.0
-    signal-exit: ^3.0.2
-    typedarray-to-buffer: ^3.1.5
-  checksum: c55b24617cc61c3a4379f425fc62a386cc51916a9b9d993f39734d005a09d5a4bb748bc251f1304e7abd71d0a26d339996c275955f527a131b1dcded67878280
-  languageName: node
-  linkType: hard
-
-"write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.1":
+"write-file-atomic@npm:*, write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.1":
   version: 4.0.1
   resolution: "write-file-atomic@npm:4.0.1"
   dependencies: