From 5b6a526932b0bdc232fd8ac8a05f5c0da378f9c3 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 29 Jan 2024 15:12:30 +0100
Subject: [PATCH 01/54] refs #5509 feat: VnDms feat: EntryDms

---
 src/components/FormModel.vue       |  2 +-
 src/components/common/VnDms.vue    | 75 ++++++++++++++++++++++++++++++
 src/components/ui/VnRow.vue        |  8 +++-
 src/components/ui/VnSubToolbar.vue |  2 +-
 src/i18n/en/index.js               |  4 ++
 src/i18n/es/index.js               |  4 ++
 src/pages/Entry/Card/EntryDms.vue  |  6 +++
 src/router/modules/entry.js        | 11 ++++-
 8 files changed, 107 insertions(+), 5 deletions(-)
 create mode 100644 src/components/common/VnDms.vue
 create mode 100644 src/pages/Entry/Card/EntryDms.vue

diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
index 4ad566bf8..153c086bb 100644
--- a/src/components/FormModel.vue
+++ b/src/components/FormModel.vue
@@ -128,7 +128,7 @@ async function save() {
 
     try {
         const body = $props.mapper ? $props.mapper(formData.value) : formData.value;
-        let response
+        let response;
         if ($props.urlCreate) {
             response = await axios.post($props.urlCreate, body);
             notify('globals.dataCreated', 'positive');
diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
new file mode 100644
index 000000000..cdc54b786
--- /dev/null
+++ b/src/components/common/VnDms.vue
@@ -0,0 +1,75 @@
+<script setup>
+import { ref } from 'vue';
+import { useRoute } from 'vue-router';
+import { useI18n } from 'vue-i18n';
+
+import FetchData from 'components/FetchData.vue';
+import FormModel from 'components/FormModel.vue';
+import VnRow from 'components/ui/VnRow.vue';
+import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
+import VnInput from 'src/components/common/VnInput.vue';
+
+const route = useRoute();
+const { t } = useI18n();
+
+const warehouses = ref();
+const companies = ref();
+const dmsTypes = ref();
+</script>
+<template>
+    <FetchData url="Warehouses" @on-fetch="(data) => (warehouses = data)" auto-load />
+    <FetchData url="Companies" @on-fetch="(data) => (companies = data)" auto-load />
+    <FetchData url="DmsTypes" @on-fetch="(data) => (dmsTypes = data)" auto-load />
+    <FormModel
+        :url="`Dms/${route.params.id}`"
+        :url-update="`Claims/updateClaim/${route.params.id}`"
+        model="dms"
+    >
+        <template #form="{ data }">
+            <div class="q-gutter-y-ms">
+                <VnRow>
+                    <VnInput :label="t('Reference')" v-model="data.reference" />
+                    <VnSelectFilter
+                        :label="t('globals.company')"
+                        v-model="data.companyFk"
+                        :options="companies"
+                        option-value="id"
+                        option-label="code"
+                        input-debounce="0"
+                    />
+                </VnRow>
+                <VnRow>
+                    <VnSelectFilter
+                        :label="t('globals.warehouse')"
+                        v-model="data.warehouseFk"
+                        :options="warehouses"
+                        option-value="id"
+                        option-label="name"
+                        input-debounce="0"
+                    />
+                    <VnSelectFilter
+                        :label="t('globals.type')"
+                        v-model="data.dmsTypeFk"
+                        :options="dmsTypes"
+                        option-value="id"
+                        option-label="name"
+                        input-debounce="0"
+                    />
+                </VnRow>
+                <VnRow>
+                    <QInput
+                        :label="t('globals.description')"
+                        v-model="data.description"
+                        type="textarea"
+                    />
+                </VnRow>
+            </div>
+        </template>
+    </FormModel>
+</template>
+<style scoped>
+.q-gutter-y-ms {
+    display: grid;
+    row-gap: 20px;
+}
+</style>
diff --git a/src/components/ui/VnRow.vue b/src/components/ui/VnRow.vue
index c3c951528..e13730e62 100644
--- a/src/components/ui/VnRow.vue
+++ b/src/components/ui/VnRow.vue
@@ -1,12 +1,16 @@
 <template>
-    <div id="row">
+    <div id="row" class="q-gutter-md">
         <slot></slot>
     </div>
 </template>
 <style lang="scss" scopped>
+#row {
+    display: grid;
+    grid-template-columns: 1fr 1fr;
+}
 @media screen and (max-width: 800px) {
     #row {
-        flex-direction: column;
+        grid-template-columns: 1fr;
     }
 }
 </style>
diff --git a/src/components/ui/VnSubToolbar.vue b/src/components/ui/VnSubToolbar.vue
index 81a1820f1..b314716ce 100644
--- a/src/components/ui/VnSubToolbar.vue
+++ b/src/components/ui/VnSubToolbar.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { onMounted, onUnmounted, ref } from 'vue';
+import { onMounted, onUnmounted } from 'vue';
 import { useStateStore } from 'stores/useStateStore';
 const stateStore = useStateStore();
 
diff --git a/src/i18n/en/index.js b/src/i18n/en/index.js
index 1a7a4c27e..2f680280c 100644
--- a/src/i18n/en/index.js
+++ b/src/i18n/en/index.js
@@ -64,6 +64,9 @@ export default {
         markAll: 'Mark all',
         noResults: 'No results',
         system: 'System',
+        warehouse: 'Warehouse',
+        company: 'Company',
+        type: 'Type',
     },
     errors: {
         statusUnauthorized: 'Access denied',
@@ -265,6 +268,7 @@ export default {
             basicData: 'Basic data',
             buys: 'Buys',
             notes: 'Notes',
+            dms: 'File management',
             log: 'Log',
         },
         list: {
diff --git a/src/i18n/es/index.js b/src/i18n/es/index.js
index 83de42ee0..023c339a4 100644
--- a/src/i18n/es/index.js
+++ b/src/i18n/es/index.js
@@ -64,6 +64,9 @@ export default {
         markAll: 'Marcar todo',
         noResults: 'Sin resultados',
         system: 'Sistema',
+        warehouse: 'Almacén',
+        company: 'Empresa',
+        type: 'Tipo',
     },
     errors: {
         statusUnauthorized: 'Acceso denegado',
@@ -264,6 +267,7 @@ export default {
             basicData: 'Datos básicos',
             buys: 'Compras',
             notes: 'Notas',
+            dms: 'Gestión documental',
             log: 'Historial',
         },
         list: {
diff --git a/src/pages/Entry/Card/EntryDms.vue b/src/pages/Entry/Card/EntryDms.vue
new file mode 100644
index 000000000..57e6eff53
--- /dev/null
+++ b/src/pages/Entry/Card/EntryDms.vue
@@ -0,0 +1,6 @@
+<script setup>
+import VnDms from 'src/components/common/VnDms.vue';
+</script>
+<template>
+    <VnDms model="Entry" />
+</template>
diff --git a/src/router/modules/entry.js b/src/router/modules/entry.js
index 8d25a8e0c..3ac12d953 100644
--- a/src/router/modules/entry.js
+++ b/src/router/modules/entry.js
@@ -11,7 +11,7 @@ export default {
     redirect: { name: 'EntryMain' },
     menus: {
         main: ['EntryList'],
-        card: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryLog'],
+        card: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryDms', 'EntryLog'],
     },
     children: [
         {
@@ -86,6 +86,15 @@ export default {
                     },
                     component: () => import('src/pages/Entry/Card/EntryNotes.vue'),
                 },
+                {
+                    path: 'dms',
+                    name: 'EntryDms',
+                    meta: {
+                        title: 'dms',
+                        icon: 'cloud_upload',
+                    },
+                    component: () => import('src/pages/Entry/Card/EntryDms.vue'),
+                },
                 {
                     path: 'log',
                     name: 'EntryLog',

From 78877556cf5798dc17716c079a3af07d58ad4597 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Wed, 31 Jan 2024 12:52:50 +0100
Subject: [PATCH 02/54] refs #6763 click

---
 src/components/ui/VnTree.vue | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index c382ef9f2..3998135ca 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -1,7 +1,8 @@
 <script setup>
-import { ref } from 'vue';
+import { ref,computed, } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useRouter } from 'vue-router';
+import { useState } from 'src/composables/useState';
 import { useQuasar } from 'quasar';
 
 import CreateDepartmentChild from '../CreateDepartmentChild.vue';
@@ -13,6 +14,7 @@ const quasar = useQuasar();
 const { t } = useI18n();
 const router = useRouter();
 const { notify } = useNotify();
+const state = useState();
 
 const treeRef = ref(null);
 const showCreateNodeFormVal = ref(false);
@@ -22,6 +24,7 @@ const expanded = ref([]);
 const nodes = ref([{ id: null, name: t('Departments'), sons: true, children: [{}] }]);
 
 const fetchedChildrensSet = ref(new Set());
+const formData = computed(() => state.get('Tree'));
 
 const onNodeExpanded = (nodeKeysArray) => {
     // Verificar si el nodo ya fue expandido
@@ -29,6 +32,7 @@ const onNodeExpanded = (nodeKeysArray) => {
         fetchedChildrensSet.value.add(nodeKeysArray.at(-1));
         fetchNodeLeaves(nodeKeysArray.at(-1)); // Llamar a la función para obtener los nodos hijos
     }
+    state.set('Tree', nodeKeysArray.at(-1));
 };
 
 const fetchNodeLeaves = async (nodeKey) => {
@@ -105,9 +109,12 @@ const redirectToDepartmentSummary = (id) => {
                     class="row justify-between full-width q-pr-md cursor-pointer"
                     @click.stop="redirectToDepartmentSummary(node.id)"
                 >
-                    <span class="text-uppercase">
+                    <a
+                        :href="`#/department/department/${node.id}/summary`"
+                        color: inherit
+                    >
                         {{ node.name }}
-                    </span>
+                    </a>
                     <div class="row justify-between" style="max-width: max-content">
                         <QIcon
                             v-if="node.id"
@@ -149,6 +156,12 @@ const redirectToDepartmentSummary = (id) => {
     </QCard>
 </template>
 
+<style lang="scss" scoped>
+a {
+    color: inherit;
+    text-decoration: none;
+}
+</style>
 <i18n>
     es:
         Departments: Departamentos
@@ -157,3 +170,4 @@ const redirectToDepartmentSummary = (id) => {
         Are you sure you want to delete it?: ¿Seguro que quieres eliminarlo?
         Delete department: Eliminar departamento
 </i18n>
+

From 5450f948a3d2714ba011078efdcd0022c29a67c5 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Thu, 1 Feb 2024 12:35:20 +0100
Subject: [PATCH 03/54] refs #6763 fix tree

---
 src/components/ui/VnTree.vue | 57 +++++++++++++++++++++++++++++++-----
 1 file changed, 49 insertions(+), 8 deletions(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index 3998135ca..72972de66 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { ref,computed, } from 'vue';
+import { onMounted, ref,computed, watch, } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useRouter } from 'vue-router';
 import { useState } from 'src/composables/useState';
@@ -27,14 +27,45 @@ const fetchedChildrensSet = ref(new Set());
 const formData = computed(() => state.get('Tree'));
 
 const onNodeExpanded = (nodeKeysArray) => {
+    console.log('ENTRY',nodeKeysArray)
+
     // Verificar si el nodo ya fue expandido
     if (!fetchedChildrensSet.value.has(nodeKeysArray.at(-1))) {
         fetchedChildrensSet.value.add(nodeKeysArray.at(-1));
         fetchNodeLeaves(nodeKeysArray.at(-1)); // Llamar a la función para obtener los nodos hijos
     }
-    state.set('Tree', nodeKeysArray.at(-1));
+
+    console.log(expanded.value)
+    console.log(nodes.value)
+    console.log(nodes.value[0].children)
 };
 
+watch(
+    ()=> nodes.value,
+    async(n)  => {
+        console.log('ha entrado',n)
+        addTree({nodes: n});
+    },
+    {deep: true}
+)
+
+watch(
+    ()=> expanded.value,
+    async(n)  => {
+        console.log('ha entrado', n)
+        addTree({nodeKeys: n});
+    },
+    {deep: true}
+)
+
+function addTree(tree){
+    const currentTree = state.get('Tree');
+    console.log('current', currentTree)
+    Object.assign(currentTree ?? {}, tree)
+    console.log('current assign', currentTree)
+
+    state.set('Tree', tree);
+}
 const fetchNodeLeaves = async (nodeKey) => {
     try {
         const node = treeRef.value.getNodeByKey(nodeKey);
@@ -88,10 +119,19 @@ const onNodeCreated = async () => {
     await fetchNodeLeaves(creationNodeSelectedId.value);
 };
 
-const redirectToDepartmentSummary = (id) => {
-    if (!id) return;
-    router.push({ name: 'DepartmentSummary', params: { id } });
-};
+onMounted(async () => {
+    const tree = state.get('Tree')
+    if(tree) {
+        const {nodeKeys, nodes } = tree
+        console.log(tree, nodeKeys, nodes)
+        console.log('onMounted', Object.values(nodeKeys))
+        console.log('onMounted2', nodes)
+        nodes.value = nodes
+        onNodeExpanded(Object.values(nodeKeys))
+        expanded.value = nodeKeys
+    }
+});
+
 </script>
 
 <template>
@@ -105,12 +145,13 @@ const redirectToDepartmentSummary = (id) => {
             @update:expanded="onNodeExpanded($event)"
         >
             <template #default-header="{ node }">
+                {{ node }}
                 <div
                     class="row justify-between full-width q-pr-md cursor-pointer"
-                    @click.stop="redirectToDepartmentSummary(node.id)"
+                    @click.stop=""
                 >
                     <a
-                        :href="`#/department/department/${node.id}/summary`"
+                        :href="node.id && `#/department/department/${node.id}/summary`"
                         color: inherit
                     >
                         {{ node.name }}

From c6a9ec54152abf9508eabc39aa16ea1d8334c704 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Fri, 2 Feb 2024 09:55:38 +0100
Subject: [PATCH 04/54] refs #6763 fix changes

---
 src/components/ui/VnTree.vue | 49 ++++++------------------------------
 1 file changed, 8 insertions(+), 41 deletions(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index 72972de66..33d096453 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -16,7 +16,7 @@ const router = useRouter();
 const { notify } = useNotify();
 const state = useState();
 
-const treeRef = ref(null);
+const treeRef = ref();
 const showCreateNodeFormVal = ref(false);
 const creationNodeSelectedId = ref(null);
 const expanded = ref([]);
@@ -24,10 +24,9 @@ const expanded = ref([]);
 const nodes = ref([{ id: null, name: t('Departments'), sons: true, children: [{}] }]);
 
 const fetchedChildrensSet = ref(new Set());
-const formData = computed(() => state.get('Tree'));
+// const formData = computed(() => state.get('Tree'));
 
 const onNodeExpanded = (nodeKeysArray) => {
-    console.log('ENTRY',nodeKeysArray)
 
     // Verificar si el nodo ya fue expandido
     if (!fetchedChildrensSet.value.has(nodeKeysArray.at(-1))) {
@@ -35,40 +34,13 @@ const onNodeExpanded = (nodeKeysArray) => {
         fetchNodeLeaves(nodeKeysArray.at(-1)); // Llamar a la función para obtener los nodos hijos
     }
 
-    console.log(expanded.value)
-    console.log(nodes.value)
-    console.log(nodes.value[0].children)
+    state.set('Tree', nodeKeysArray);
 };
 
-watch(
-    ()=> nodes.value,
-    async(n)  => {
-        console.log('ha entrado',n)
-        addTree({nodes: n});
-    },
-    {deep: true}
-)
-
-watch(
-    ()=> expanded.value,
-    async(n)  => {
-        console.log('ha entrado', n)
-        addTree({nodeKeys: n});
-    },
-    {deep: true}
-)
-
-function addTree(tree){
-    const currentTree = state.get('Tree');
-    console.log('current', currentTree)
-    Object.assign(currentTree ?? {}, tree)
-    console.log('current assign', currentTree)
-
-    state.set('Tree', tree);
-}
 const fetchNodeLeaves = async (nodeKey) => {
     try {
         const node = treeRef.value.getNodeByKey(nodeKey);
+
         if (!node || node.sons === 0) return;
 
         const params = { parentId: node.id };
@@ -122,13 +94,10 @@ const onNodeCreated = async () => {
 onMounted(async () => {
     const tree = state.get('Tree')
     if(tree) {
-        const {nodeKeys, nodes } = tree
-        console.log(tree, nodeKeys, nodes)
-        console.log('onMounted', Object.values(nodeKeys))
-        console.log('onMounted2', nodes)
-        nodes.value = nodes
-        onNodeExpanded(Object.values(nodeKeys))
-        expanded.value = nodeKeys
+        for (let n of tree){
+            await fetchNodeLeaves(n)
+        }
+        expanded.value  = tree
     }
 });
 
@@ -145,10 +114,8 @@ onMounted(async () => {
             @update:expanded="onNodeExpanded($event)"
         >
             <template #default-header="{ node }">
-                {{ node }}
                 <div
                     class="row justify-between full-width q-pr-md cursor-pointer"
-                    @click.stop=""
                 >
                     <a
                         :href="node.id && `#/department/department/${node.id}/summary`"

From 64b7a07d4199353861e86fbd3e8bf119e2a77fea Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 5 Feb 2024 15:04:13 +0100
Subject: [PATCH 05/54] refs #5509 feat: VnDms FormModel

---
 src/components/FetchData.vue      |  7 ---
 src/components/FormModel.vue      |  9 +++-
 src/components/common/VnDms.vue   | 89 ++++++++++++++++++++++++++-----
 src/pages/Entry/Card/EntryDms.vue |  3 +-
 4 files changed, 86 insertions(+), 22 deletions(-)

diff --git a/src/components/FetchData.vue b/src/components/FetchData.vue
index 4f5d7a57d..5b3dcbea7 100644
--- a/src/components/FetchData.vue
+++ b/src/components/FetchData.vue
@@ -59,11 +59,4 @@ async function fetch(fetchFilter = {}) {
         //
     }
 }
-
-const render = () => {
-    return h('div', []);
-};
 </script>
-<template>
-    <render />
-</template>
diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
index 594780220..c3ca8fe98 100644
--- a/src/components/FormModel.vue
+++ b/src/components/FormModel.vue
@@ -59,6 +59,10 @@ const $props = defineProps({
         type: Function,
         default: null,
     },
+    updateType: {
+        type: String,
+        default: 'patch',
+    },
 });
 
 const emit = defineEmits(['onFetch', 'onDataSaved']);
@@ -136,7 +140,10 @@ async function save() {
             response = await axios.post($props.urlCreate, body);
             notify('globals.dataCreated', 'positive');
         } else {
-            response = await axios.patch($props.urlUpdate || $props.url, body);
+            response = await axios[$props.updateType](
+                $props.urlUpdate || $props.url,
+                body
+            );
         }
         emit('onDataSaved', formData.value, response?.data);
         originalData.value = JSON.parse(JSON.stringify(formData.value));
diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
index cdc54b786..a3a5dab21 100644
--- a/src/components/common/VnDms.vue
+++ b/src/components/common/VnDms.vue
@@ -12,26 +12,58 @@ import VnInput from 'src/components/common/VnInput.vue';
 const route = useRoute();
 const { t } = useI18n();
 
+const props = defineProps({
+    model: {
+        type: String,
+        required: true,
+    },
+});
+
 const warehouses = ref();
 const companies = ref();
 const dmsTypes = ref();
+const allowedContentTypes = ref();
+const dms = ref({});
+
+function onFileChange(files) {
+    dms.value.hasFileAttached = !!files;
+    dms.value.file = files?.name;
+}
+
+function parseDms(data) {
+    const defaultDms = {};
+
+    for (let prop in data) {
+        if (prop.endsWith('Fk')) data[prop.replace('Fk', 'Id')] = data[prop];
+    }
+    console.log(data);
+    dms.value = data;
+}
 </script>
 <template>
     <FetchData url="Warehouses" @on-fetch="(data) => (warehouses = data)" auto-load />
     <FetchData url="Companies" @on-fetch="(data) => (companies = data)" auto-load />
     <FetchData url="DmsTypes" @on-fetch="(data) => (dmsTypes = data)" auto-load />
+    <FetchData
+        url="DmsContainers/allowedContentTypes"
+        @on-fetch="(data) => (allowedContentTypes = data.join(','))"
+        auto-load
+    />
     <FormModel
         :url="`Dms/${route.params.id}`"
-        :url-update="`Claims/updateClaim/${route.params.id}`"
+        update-type="post"
+        :url-update="`${props.model}/${route.params.id}/uploadFile`"
+        @on-fetch="parseDms"
         model="dms"
+        :auto-load="!!route.params.id"
     >
-        <template #form="{ data }">
+        <template #form>
             <div class="q-gutter-y-ms">
                 <VnRow>
-                    <VnInput :label="t('Reference')" v-model="data.reference" />
+                    <VnInput :label="t('Reference')" v-model="dms.reference" />
                     <VnSelectFilter
                         :label="t('globals.company')"
-                        v-model="data.companyFk"
+                        v-model="dms.companyFk"
                         :options="companies"
                         option-value="id"
                         option-label="code"
@@ -41,7 +73,7 @@ const dmsTypes = ref();
                 <VnRow>
                     <VnSelectFilter
                         :label="t('globals.warehouse')"
-                        v-model="data.warehouseFk"
+                        v-model="dms.warehouseFk"
                         :options="warehouses"
                         option-value="id"
                         option-label="name"
@@ -49,20 +81,44 @@ const dmsTypes = ref();
                     />
                     <VnSelectFilter
                         :label="t('globals.type')"
-                        v-model="data.dmsTypeFk"
+                        v-model="dms.dmsTypeFk"
                         :options="dmsTypes"
                         option-value="id"
                         option-label="name"
                         input-debounce="0"
                     />
                 </VnRow>
-                <VnRow>
-                    <QInput
-                        :label="t('globals.description')"
-                        v-model="data.description"
-                        type="textarea"
-                    />
-                </VnRow>
+                <QInput
+                    :label="t('globals.description')"
+                    v-model="dms.description"
+                    type="textarea"
+                />
+                <QFile
+                    :label="t('entry.buys.file')"
+                    v-model="dms.files"
+                    :multiple="false"
+                    accept=".json"
+                    @update:model-value="onFileChange(dms.files)"
+                    class="required"
+                    :display-value="dms.file"
+                >
+                    <template #prepend>
+                        <QIcon name="vn:attach" class="cursor-pointer">
+                            <QTooltip>{{ t('Select a file') }}</QTooltip>
+                        </QIcon>
+                    </template>
+                    <template #append>
+                        <QIcon name="info" class="cursor-pointer">
+                            <QTooltip>{{
+                                t('contentTypesInfo', { allowedContentTypes })
+                            }}</QTooltip>
+                        </QIcon>
+                    </template>
+                </QFile>
+                <QCheckbox
+                    v-model="dms.hasFile"
+                    :label="t('Generate identifier for original file')"
+                />
             </div>
         </template>
     </FormModel>
@@ -73,3 +129,10 @@ const dmsTypes = ref();
     row-gap: 20px;
 }
 </style>
+<i18n>
+en:
+    contentTypesInfo: Allowed file types {allowedContentTypes}
+es:
+    contentTypesInfo: Tipos de archivo permitidos {allowedContentTypes}
+    Generate identifier for original file: Generar identificador para archivo original
+</i18n>
diff --git a/src/pages/Entry/Card/EntryDms.vue b/src/pages/Entry/Card/EntryDms.vue
index 57e6eff53..696c49a34 100644
--- a/src/pages/Entry/Card/EntryDms.vue
+++ b/src/pages/Entry/Card/EntryDms.vue
@@ -2,5 +2,6 @@
 import VnDms from 'src/components/common/VnDms.vue';
 </script>
 <template>
-    <VnDms model="Entry" />
+    <VnDms model="Clients" />
+    <!-- CHANGE ME-->
 </template>

From 7175c50bd6ca46830801bfc3a6016de57f69c7a4 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Tue, 6 Feb 2024 09:50:18 +0100
Subject: [PATCH 06/54] refs #6763 popup fix click

---
 src/components/ui/VnTree.vue                  |  9 +++++-
 .../Card/DepartmentDescriptorProxy.vue        | 21 ++++++++++++++
 .../Card/DepartmentSummaryDialog.vue          | 29 +++++++++++++++++++
 3 files changed, 58 insertions(+), 1 deletion(-)
 create mode 100644 src/pages/Department/Card/DepartmentDescriptorProxy.vue
 create mode 100644 src/pages/Department/Card/DepartmentSummaryDialog.vue

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index 33d096453..631b501b6 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -4,7 +4,8 @@ import { useI18n } from 'vue-i18n';
 import { useRouter } from 'vue-router';
 import { useState } from 'src/composables/useState';
 import { useQuasar } from 'quasar';
-
+import DepartmentSummaryDialog from 'src/pages/Department/Card/DepartmentSummaryDialog.vue';
+import DepartmentDescriptorProxy from 'src/pages/Department/Card/DepartmentDescriptorProxy.vue';
 import CreateDepartmentChild from '../CreateDepartmentChild.vue';
 
 import axios from 'axios';
@@ -116,13 +117,19 @@ onMounted(async () => {
             <template #default-header="{ node }">
                 <div
                     class="row justify-between full-width q-pr-md cursor-pointer"
+
                 >
                     <a
                         :href="node.id && `#/department/department/${node.id}/summary`"
                         color: inherit
+                        @click.stop.exact="`#/department/department/${node.id}/summary`"
+                        @click.ctrl.stop="`#/department/department/${node.id}/summary`"
                     >
                         {{ node.name }}
+
                     </a>
+                    <DepartmentSummaryDialog :id="node.id" />
+
                     <div class="row justify-between" style="max-width: max-content">
                         <QIcon
                             v-if="node.id"
diff --git a/src/pages/Department/Card/DepartmentDescriptorProxy.vue b/src/pages/Department/Card/DepartmentDescriptorProxy.vue
new file mode 100644
index 000000000..07a6b6af1
--- /dev/null
+++ b/src/pages/Department/Card/DepartmentDescriptorProxy.vue
@@ -0,0 +1,21 @@
+<script setup>
+import DepartmentDescriptor from './DepartmentDescriptor.vue';
+import DepartmentSummaryDialog from './DepartmentSummaryDialog.vue';
+
+const $props = defineProps({
+    id: {
+        type: Number,
+        required: true,
+    },
+});
+</script>
+
+<template>
+    <QPopupProxy>
+        <DepartmentDescriptor
+            v-if="$props.id"
+            :id="$props.id"
+            :summary="DepartmentSummaryDialog"
+        />
+    </QPopupProxy>
+</template>
diff --git a/src/pages/Department/Card/DepartmentSummaryDialog.vue b/src/pages/Department/Card/DepartmentSummaryDialog.vue
new file mode 100644
index 000000000..3bf4d7a26
--- /dev/null
+++ b/src/pages/Department/Card/DepartmentSummaryDialog.vue
@@ -0,0 +1,29 @@
+<script setup>
+import { useDialogPluginComponent } from 'quasar';
+import DepartmentSummary from './DepartmentSummary.vue';
+
+const $props = defineProps({
+    id: {
+        type: Number,
+        required: true,
+    },
+});
+
+defineEmits([...useDialogPluginComponent.emits]);
+
+const { dialogRef, onDialogHide } = useDialogPluginComponent();
+</script>
+
+<template>
+    <QDialog ref="dialogRef" @hide="onDialogHide">
+        <DepartmentSummary v-if="$props.id" :id="$props.id" />
+    </QDialog>
+</template>
+
+<style lang="scss">
+.q-dialog .summary .header {
+    position: sticky;
+    z-index: $z-max;
+    top: 0;
+}
+</style>

From 18b76e5e129f7bb1b4a510640868d2b713947820 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Thu, 8 Feb 2024 07:25:23 +0100
Subject: [PATCH 07/54] refs #5509 feat: VnDmsList

---
 src/components/common/VnDms.vue     |  33 ++++-
 src/components/common/VnDmsList.vue | 181 ++++++++++++++++++++++++++++
 src/pages/Entry/Card/EntryDms.vue   |   4 +-
 3 files changed, 215 insertions(+), 3 deletions(-)
 create mode 100644 src/components/common/VnDmsList.vue

diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
index a3a5dab21..169356152 100644
--- a/src/components/common/VnDms.vue
+++ b/src/components/common/VnDms.vue
@@ -17,12 +17,17 @@ const props = defineProps({
         type: String,
         required: true,
     },
+    defaultDmsCode: {
+        type: String,
+        required: true,
+    },
 });
 
 const warehouses = ref();
 const companies = ref();
 const dmsTypes = ref();
 const allowedContentTypes = ref();
+const config = ref({});
 const dms = ref({});
 
 function onFileChange(files) {
@@ -39,6 +44,25 @@ function parseDms(data) {
     console.log(data);
     dms.value = data;
 }
+
+function mapperDms(data) {
+    const formData = new FormData();
+    const { files } = data;
+    if (files) formData.append(files?.name, files);
+    console.log('data', data);
+    delete data.files;
+
+    const dms = {
+        hasFile: false,
+        hasFileAttached: false,
+        reference: data.id,
+        warehouseId: config.value.warehouseFk,
+        companyId: config.value.companyFk,
+        dmsTypeId: data.dmsTypeFk,
+        description: 'ASD',
+    };
+    return [formData, { params: dms }];
+}
 </script>
 <template>
     <FetchData url="Warehouses" @on-fetch="(data) => (warehouses = data)" auto-load />
@@ -49,6 +73,11 @@ function parseDms(data) {
         @on-fetch="(data) => (allowedContentTypes = data.join(','))"
         auto-load
     />
+    <FetchData
+        url="UserConfigs/getUserConfig"
+        @on-fetch="(data) => (config = data)"
+        auto-load
+    />
     <FormModel
         :url="`Dms/${route.params.id}`"
         update-type="post"
@@ -56,6 +85,7 @@ function parseDms(data) {
         @on-fetch="parseDms"
         model="dms"
         :auto-load="!!route.params.id"
+        :mapper="mapperDms"
     >
         <template #form>
             <div class="q-gutter-y-ms">
@@ -93,11 +123,12 @@ function parseDms(data) {
                     v-model="dms.description"
                     type="textarea"
                 />
+                {{ allowedContentTypes }}
                 <QFile
                     :label="t('entry.buys.file')"
                     v-model="dms.files"
                     :multiple="false"
-                    accept=".json"
+                    :accept="allowedContentTypes"
                     @update:model-value="onFileChange(dms.files)"
                     class="required"
                     :display-value="dms.file"
diff --git a/src/components/common/VnDmsList.vue b/src/components/common/VnDmsList.vue
new file mode 100644
index 000000000..06078ef17
--- /dev/null
+++ b/src/components/common/VnDmsList.vue
@@ -0,0 +1,181 @@
+<script setup>
+import { ref, computed } from 'vue';
+import { useRoute } from 'vue-router';
+import { useI18n } from 'vue-i18n';
+
+import FetchData from 'components/FetchData.vue';
+import FormModel from 'components/FormModel.vue';
+import VnRow from 'components/ui/VnRow.vue';
+import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
+import VnInput from 'src/components/common/VnInput.vue';
+import { QCheckbox, QBtn } from 'quasar';
+
+const route = useRoute();
+const { t } = useI18n();
+const rows = ref();
+
+const $props = defineProps({
+    model: {
+        type: String,
+        required: true,
+    },
+    defaultDmsCode: {
+        type: String,
+        required: true,
+    },
+    entity: {
+        type: String,
+        default: 'entryFk',
+    },
+});
+
+const dmsFilter = {
+    include: {
+        relation: 'dms',
+        scope: {
+            fields: [
+                'dmsTypeFk',
+                'reference',
+                'hardCopyNumber',
+                'workerFk',
+                'description',
+                'hasFile',
+                'file',
+                'created',
+            ],
+            include: [
+                {
+                    relation: 'dmsType',
+                    scope: {
+                        fields: ['name'],
+                    },
+                },
+                {
+                    relation: 'worker',
+                    scope: {
+                        fields: ['id'],
+                        include: {
+                            relation: 'user',
+                            scope: {
+                                fields: ['name'],
+                            },
+                        },
+                    },
+                },
+            ],
+        },
+    },
+};
+
+const columns = computed(() => [
+    {
+        align: 'left',
+        field: 'id',
+        label: t('id'),
+        name: 'id',
+        component: 'span',
+    },
+    {
+        align: 'left',
+        field: 'type',
+        label: t('type'),
+        name: 'type',
+        component: 'span',
+    },
+    {
+        align: 'left',
+        field: 'order',
+        label: t('order'),
+        name: 'order',
+        component: 'span',
+    },
+    {
+        align: 'left',
+        field: 'reference',
+        label: t('reference'),
+        name: 'reference',
+        component: 'span',
+    },
+    {
+        align: 'left',
+        field: 'description',
+        label: t('description'),
+        name: 'description',
+        component: 'span',
+    },
+    {
+        align: 'left',
+        field: 'hasFile',
+        label: t('hasFile'),
+        name: 'hasFile',
+        component: QCheckbox,
+    },
+    {
+        align: 'left',
+        field: 'file',
+        label: t('file'),
+        name: 'file',
+        component: 'span',
+    },
+    {
+        align: 'center',
+        field: 'options',
+        name: 'options',
+    },
+]);
+
+function setData(data) {
+    const newData = data.map((value) => value.dms);
+    console.log(newData);
+    rows.value = newData;
+}
+</script>
+<template>
+    <FetchData
+        :url="$props.model"
+        :where="{ [$props.entity]: route.params.id }"
+        :filter="dmsFilter"
+        @on-fetch="setData"
+        auto-load
+    />
+    <QTable
+        :columns="columns"
+        :pagination="{ rowsPerPage: 0 }"
+        :rows="rows"
+        class="full-width q-mt-md"
+        hide-bottom
+        row-key="clientFk"
+        selection="multiple"
+        v-model:selected="selected"
+    >
+        <template #body-cell="props">
+            <QTd :props="props">
+                <QTr :props="props" class="cursor-pointer">
+                    <component
+                        v-if="props.col.component"
+                        :is="props.col.component"
+                        v-bind="props.col.props && props.col.props(props)"
+                        @click="props.col.event(props)"
+                    >
+                        {{ props.value }}
+                        <!-- <QBtn -->
+                    </component>
+                </QTr>
+            </QTd>
+        </template>
+        asd
+    </QTable>
+</template>
+<style scoped>
+.q-gutter-y-ms {
+    display: grid;
+    row-gap: 20px;
+}
+</style>
+<i18n>
+en:
+    contentTypesInfo: Allowed file types {allowedContentTypes}
+es:
+    contentTypesInfo: Tipos de archivo permitidos {allowedContentTypes}
+    Generate identifier for original file: Generar identificador para archivo original
+</i18n>
diff --git a/src/pages/Entry/Card/EntryDms.vue b/src/pages/Entry/Card/EntryDms.vue
index 696c49a34..a26811630 100644
--- a/src/pages/Entry/Card/EntryDms.vue
+++ b/src/pages/Entry/Card/EntryDms.vue
@@ -1,7 +1,7 @@
 <script setup>
-import VnDms from 'src/components/common/VnDms.vue';
+import VnDmsList from 'src/components/common/VnDmsList.vue';
 </script>
 <template>
-    <VnDms model="Clients" />
+    <VnDmsList model="EntryDms" default-dms-code="entry" />
     <!-- CHANGE ME-->
 </template>

From aa4d5bffc36d6c9610de549f4e1d76d591b65b26 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 12 Feb 2024 15:06:20 +0100
Subject: [PATCH 08/54] refs #5509 feat: VnDms & VnDmsList

---
 src/components/CrudModel.vue                  |  17 +-
 src/components/FormModel.vue                  |  24 +--
 src/components/common/VnDms.vue               |  98 +++++++----
 src/components/common/VnDmsList.vue           | 166 +++++++++++++++---
 src/i18n/en/index.js                          |  17 +-
 src/i18n/es/index.js                          |  17 +-
 src/pages/Claim/ClaimList.vue                 |   2 +-
 src/pages/Entry/Card/EntryBuysImport.vue      |   2 +-
 src/pages/Entry/Card/EntryDms.vue             |  17 +-
 src/pages/Entry/Card/EntryNotes.vue           |   2 +-
 src/pages/Entry/EntryLatestBuys.vue           |   4 +-
 src/pages/Order/Card/OrderSummary.vue         |   4 +-
 src/pages/Route/Card/RouteSummary.vue         |   2 +-
 src/pages/Ticket/Card/TicketSummary.vue       |   4 +-
 .../Travel/Card/TravelThermographsForm.vue    |   2 +-
 15 files changed, 258 insertions(+), 120 deletions(-)

diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue
index 9bb05d439..c8fa5809c 100644
--- a/src/components/CrudModel.vue
+++ b/src/components/CrudModel.vue
@@ -176,8 +176,8 @@ async function remove(data) {
             .dialog({
                 component: VnConfirm,
                 componentProps: {
-                    title: t('confirmDeletion'),
-                    message: t('confirmDeletionMessage'),
+                    title: t('globals.confirmDeletion'),
+                    message: t('globals.confirmDeletionMessage'),
                     newData,
                     ids,
                 },
@@ -317,16 +317,3 @@ watch(formUrl, async () => {
         color="primary"
     />
 </template>
-
-<i18n>
-    {
-        "en": {
-            "confirmDeletion": "Confirm deletion",
-            "confirmDeletionMessage": "Are you sure you want to delete this?"
-        },
-        "es": {
-            "confirmDeletion": "Confirmar eliminación",
-            "confirmDeletionMessage": "Seguro que quieres eliminar?"
-        }
-    }
-</i18n>
diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
index 0c669902f..c33835438 100644
--- a/src/components/FormModel.vue
+++ b/src/components/FormModel.vue
@@ -59,9 +59,9 @@ const $props = defineProps({
         type: Function,
         default: null,
     },
-    updateType: {
-        type: String,
-        default: 'patch',
+    saveFn: {
+        type: Function,
+        default: null,
     },
 });
 
@@ -79,8 +79,8 @@ onMounted(async () => {
     });
 
     // Podemos enviarle al form la estructura de data inicial sin necesidad de fetchearla
-    if ($props.formInitialData && !$props.autoLoad) {
-        state.set($props.model, $props.formInitialData);
+    if ($props.formInitialData || !$props.autoLoad) {
+        state.set($props.model, $props.formInitialData ?? {});
     } else {
         await fetch();
     }
@@ -142,19 +142,19 @@ async function save() {
     try {
         const body = $props.mapper ? $props.mapper(formData.value) : formData.value;
         let response;
-        if ($props.urlCreate) {
-            response = await axios.post($props.urlCreate, body);
-            notify('globals.dataCreated', 'positive');
-        } else {
-            response = await axios[$props.updateType](
-                $props.urlUpdate || $props.url,
+        if ($props.saveFn) response = await $props.saveFn(body);
+        else
+            response = await axios[$props.urlCreate ? 'post' : 'patch'](
+                $props.urlCreate || $props.urlUpdate || $props.url,
                 body
             );
-        }
+        if ($props.urlCreate) notify('globals.dataCreated', 'positive');
+
         emit('onDataSaved', formData.value, response?.data);
         originalData.value = JSON.parse(JSON.stringify(formData.value));
         hasChanges.value = false;
     } catch (err) {
+        console.error(err);
         notify('errors.create', 'negative');
     }
     isLoading.value = false;
diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
index 169356152..6cdca22c5 100644
--- a/src/components/common/VnDms.vue
+++ b/src/components/common/VnDms.vue
@@ -1,25 +1,35 @@
 <script setup>
-import { ref } from 'vue';
+import { ref, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
+import axios from 'axios';
 
 import FetchData from 'components/FetchData.vue';
-import FormModel from 'components/FormModel.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
 import VnInput from 'src/components/common/VnInput.vue';
+import FormModelPopup from 'components/FormModelPopup.vue';
 
 const route = useRoute();
 const { t } = useI18n();
+const emit = defineEmits(['onDataSaved']);
 
-const props = defineProps({
+const $props = defineProps({
     model: {
         type: String,
         required: true,
     },
     defaultDmsCode: {
         type: String,
-        required: true,
+        default: null,
+    },
+    formInitialData: {
+        type: Object,
+        default: null,
+    },
+    description: {
+        type: Function,
+        default: null,
     },
 });
 
@@ -27,47 +37,67 @@ const warehouses = ref();
 const companies = ref();
 const dmsTypes = ref();
 const allowedContentTypes = ref();
-const config = ref({});
 const dms = ref({});
 
+onMounted(() => defaultData());
 function onFileChange(files) {
     dms.value.hasFileAttached = !!files;
     dms.value.file = files?.name;
 }
 
-function parseDms(data) {
-    const defaultDms = {};
-
-    for (let prop in data) {
-        if (prop.endsWith('Fk')) data[prop.replace('Fk', 'Id')] = data[prop];
-    }
-    console.log(data);
-    dms.value = data;
-}
-
 function mapperDms(data) {
     const formData = new FormData();
     const { files } = data;
     if (files) formData.append(files?.name, files);
-    console.log('data', data);
     delete data.files;
 
     const dms = {
-        hasFile: false,
-        hasFileAttached: false,
-        reference: data.id,
-        warehouseId: config.value.warehouseFk,
-        companyId: config.value.companyFk,
+        hasFile: !!data.hasFile,
+        hasFileAttached: data.hasFileAttached,
+        reference: data.reference,
+        warehouseId: data.warehouseFk,
+        companyId: data.companyFk,
         dmsTypeId: data.dmsTypeFk,
-        description: 'ASD',
+        description: data.description,
     };
     return [formData, { params: dms }];
 }
+
+function getUrl() {
+    if ($props.formInitialData) return 'dms/' + $props.formInitialData.id + '/updateFile';
+    return `${$props.model}/${route.params.id}/uploadFile`;
+}
+
+async function save() {
+    const body = mapperDms(dms.value);
+    await axios.post(getUrl(), body[0], body[1]);
+    emit('onDataSaved', body[1].params);
+}
+
+function defaultData() {
+    if ($props.formInitialData) return (dms.value = $props.formInitialData);
+    return addDefaultData({
+        reference: route.params.id,
+        description: $props.description && $props.description(dms.value),
+    });
+}
+
+function setDmsTypes(data) {
+    dmsTypes.value = data;
+    if (!$props.formInitialData && $props.defaultDmsCode) {
+        const { id } = data.find((dmsType) => dmsType.code == $props.defaultDmsCode);
+        addDefaultData({ dmsTypeFk: id });
+    }
+}
+
+function addDefaultData(data) {
+    Object.assign(dms.value, data);
+}
 </script>
 <template>
     <FetchData url="Warehouses" @on-fetch="(data) => (warehouses = data)" auto-load />
     <FetchData url="Companies" @on-fetch="(data) => (companies = data)" auto-load />
-    <FetchData url="DmsTypes" @on-fetch="(data) => (dmsTypes = data)" auto-load />
+    <FetchData url="DmsTypes" @on-fetch="setDmsTypes" auto-load />
     <FetchData
         url="DmsContainers/allowedContentTypes"
         @on-fetch="(data) => (allowedContentTypes = data.join(','))"
@@ -75,19 +105,16 @@ function mapperDms(data) {
     />
     <FetchData
         url="UserConfigs/getUserConfig"
-        @on-fetch="(data) => (config = data)"
-        auto-load
+        @on-fetch="addDefaultData"
+        :auto-load="!$props.formInitialData"
     />
-    <FormModel
-        :url="`Dms/${route.params.id}`"
-        update-type="post"
-        :url-update="`${props.model}/${route.params.id}/uploadFile`"
-        @on-fetch="parseDms"
+    <FormModelPopup
+        :title="t('create')"
         model="dms"
-        :auto-load="!!route.params.id"
-        :mapper="mapperDms"
+        :form-initial-data="formInitialData"
+        :save-fn="save"
     >
-        <template #form>
+        <template #form-inputs>
             <div class="q-gutter-y-ms">
                 <VnRow>
                     <VnInput :label="t('Reference')" v-model="dms.reference" />
@@ -123,7 +150,6 @@ function mapperDms(data) {
                     v-model="dms.description"
                     type="textarea"
                 />
-                {{ allowedContentTypes }}
                 <QFile
                     :label="t('entry.buys.file')"
                     v-model="dms.files"
@@ -152,7 +178,7 @@ function mapperDms(data) {
                 />
             </div>
         </template>
-    </FormModel>
+    </FormModelPopup>
 </template>
 <style scoped>
 .q-gutter-y-ms {
@@ -164,6 +190,6 @@ function mapperDms(data) {
 en:
     contentTypesInfo: Allowed file types {allowedContentTypes}
 es:
-    contentTypesInfo: Tipos de archivo permitidos {allowedContentTypes}
     Generate identifier for original file: Generar identificador para archivo original
+    contentTypesInfo: Tipos de archivo permitidos {allowedContentTypes}
 </i18n>
diff --git a/src/components/common/VnDmsList.vue b/src/components/common/VnDmsList.vue
index 06078ef17..f746fa041 100644
--- a/src/components/common/VnDmsList.vue
+++ b/src/components/common/VnDmsList.vue
@@ -1,31 +1,43 @@
 <script setup>
 import { ref, computed } from 'vue';
-import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
+import { useRoute } from 'vue-router';
 
 import FetchData from 'components/FetchData.vue';
-import FormModel from 'components/FormModel.vue';
-import VnRow from 'components/ui/VnRow.vue';
-import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
-import VnInput from 'src/components/common/VnInput.vue';
-import { QCheckbox, QBtn } from 'quasar';
+import VnDms from 'src/components/common/VnDms.vue';
+import { downloadFile } from 'src/composables/downloadFile';
+import VnConfirm from 'components/ui/VnConfirm.vue';
+import axios from 'axios';
+import { QCheckbox, QBtn, QInput } from 'quasar';
+import { useQuasar } from 'quasar';
 
 const route = useRoute();
+const quasar = useQuasar();
 const { t } = useI18n();
 const rows = ref();
+const dmsRef = ref();
+const formDialog = ref({});
 
 const $props = defineProps({
     model: {
         type: String,
         required: true,
     },
+    updateModel: {
+        type: String,
+        default: null,
+    },
     defaultDmsCode: {
         type: String,
         required: true,
     },
-    entity: {
+    filter: {
         type: String,
-        default: 'entryFk',
+        required: true,
+    },
+    description: {
+        type: Function,
+        required: true,
     },
 });
 
@@ -42,6 +54,8 @@ const dmsFilter = {
                 'hasFile',
                 'file',
                 'created',
+                'companyFk',
+                'warehouseFk',
             ],
             include: [
                 {
@@ -65,60 +79,69 @@ const dmsFilter = {
             ],
         },
     },
+    order: ['dmsFk DESC'],
 };
 
 const columns = computed(() => [
     {
         align: 'left',
         field: 'id',
-        label: t('id'),
+        label: t('globals.id'),
         name: 'id',
         component: 'span',
     },
     {
         align: 'left',
         field: 'type',
-        label: t('type'),
+        label: t('globals.type'),
         name: 'type',
-        component: 'span',
+        component: QInput,
+        props: (prop) => ({
+            readonly: true,
+            borderless: true,
+            'model-value': prop.row.dmsType.name,
+        }),
     },
     {
         align: 'left',
         field: 'order',
-        label: t('order'),
+        label: t('globals.order'),
         name: 'order',
         component: 'span',
     },
     {
         align: 'left',
         field: 'reference',
-        label: t('reference'),
+        label: t('globals.reference'),
         name: 'reference',
         component: 'span',
     },
     {
         align: 'left',
         field: 'description',
-        label: t('description'),
+        label: t('globals.description'),
         name: 'description',
         component: 'span',
     },
     {
         align: 'left',
         field: 'hasFile',
-        label: t('hasFile'),
+        label: t('globals.original'),
         name: 'hasFile',
         component: QCheckbox,
+        props: (prop) => ({
+            disable: true,
+            'model-value': Boolean(prop.value),
+        }),
     },
     {
         align: 'left',
         field: 'file',
-        label: t('file'),
+        label: t('globals.file'),
         name: 'file',
         component: 'span',
     },
     {
-        align: 'center',
         field: 'options',
         name: 'options',
     },
@@ -126,15 +149,46 @@ const columns = computed(() => [
 
 function setData(data) {
     const newData = data.map((value) => value.dms);
-    console.log(newData);
     rows.value = newData;
 }
+
+function deleteDms(dmsFk) {
+    quasar
+        .dialog({
+            component: VnConfirm,
+            componentProps: {
+                title: t('globals.confirmDeletion'),
+                message: t('globals.confirmDeletionMessage'),
+            },
+        })
+        .onOk(async () => {
+            await axios.post(`${$props.model}/${dmsFk}/removeFile`);
+            const index = rows.value.findIndex((row) => row.id == dmsFk);
+            rows.value.splice(index, 1);
+        });
+}
+
+function showFormDialog(dms) {
+    if (dms) dms = parseDms(dms);
+    formDialog.value = {
+        show: true,
+        dms,
+    };
+}
+
+function parseDms(data) {
+    for (let prop in data) {
+        if (prop.endsWith('Fk')) data[prop.replace('Fk', 'Id')] = data[prop];
+    }
+    return data;
+}
 </script>
 <template>
     <FetchData
+        ref="dmsRef"
         :url="$props.model"
-        :where="{ [$props.entity]: route.params.id }"
         :filter="dmsFilter"
+        :where="{ [$props.filter]: route.params.id }"
         @on-fetch="setData"
         auto-load
     />
@@ -145,26 +199,86 @@ function setData(data) {
         class="full-width q-mt-md"
         hide-bottom
         row-key="clientFk"
-        selection="multiple"
-        v-model:selected="selected"
+        :grid="$q.screen.lt.md"
     >
         <template #body-cell="props">
             <QTd :props="props">
-                <QTr :props="props" class="cursor-pointer">
+                <QTr :props="props">
                     <component
                         v-if="props.col.component"
                         :is="props.col.component"
                         v-bind="props.col.props && props.col.props(props)"
-                        @click="props.col.event(props)"
                     >
-                        {{ props.value }}
-                        <!-- <QBtn -->
+                        <span v-if="props.col.component == 'span'">{{
+                            props.value
+                        }}</span>
                     </component>
                 </QTr>
+
+                <div class="flex justify-center" v-if="props.col.name == 'options'">
+                    <QBtn
+                        icon="cloud_download"
+                        flat
+                        color="primary"
+                        @click="downloadFile(props.row.id)"
+                    />
+                    <QBtn
+                        icon="edit"
+                        flat
+                        color="primary"
+                        @click="showFormDialog(props.row)"
+                    />
+                    <QBtn
+                        icon="delete"
+                        flat
+                        color="primary"
+                        @click="deleteDms(props.row.id)"
+                    />
+                </div>
             </QTd>
         </template>
-        asd
+        <template #item="props">
+            <div class="q-pa-xs col-xs-12 col-sm-6 grid-style-transition">
+                <QCard
+                    bordered
+                    flat
+                    @keyup.ctrl.enter.stop="claimDevelopmentForm?.saveChanges()"
+                >
+                    <QCardSection>
+                        <QCheckbox v-model="props.selected" dense />
+                    </QCardSection>
+                    <QSeparator />
+                    <QList dense>
+                        <QItem v-for="col in props.cols" :key="col.name">
+                            <QItemSection>
+                                <component
+                                    v-if="col.component"
+                                    :is="col.component"
+                                    v-bind="col.props && col.props(props)"
+                                >
+                                    <span v-if="col.component == 'span'">{{
+                                        `${col.label}:${col.value}`
+                                    }}</span>
+                                </component>
+                            </QItemSection>
+                        </QItem>
+                    </QList>
+                </QCard>
+            </div>
+        </template>
     </QTable>
+    <QDialog v-model="formDialog.show">
+        <VnDms
+            :model="updateModel ?? model"
+            :default-dms-code="defaultDmsCode"
+            :form-initial-data="formDialog.dms"
+            @on-data-saved="dmsRef.fetch()"
+            :description="$props.description"
+        />
+    </QDialog>
+    <QPageSticky position="bottom-right" :offset="[25, 25]">
+        <QBtn fab color="primary" icon="add" @click="showFormDialog()" />
+    </QPageSticky>
 </template>
 <style scoped>
 .q-gutter-y-ms {
diff --git a/src/i18n/en/index.js b/src/i18n/en/index.js
index bd13f7b1d..b8b979961 100644
--- a/src/i18n/en/index.js
+++ b/src/i18n/en/index.js
@@ -64,7 +64,7 @@ export default {
         markAll: 'Mark all',
         requiredField: 'Required field',
         class: 'clase',
-        type: 'type',
+        type: 'Type',
         reason: 'reason',
         noResults: 'No results',
         system: 'System',
@@ -72,6 +72,13 @@ export default {
         company: 'Company',
         fieldRequired: 'Field required',
         allowedFilesText: 'Allowed file types: { allowedContentTypes }',
+        confirmDeletion: 'Confirm deletion',
+        confirmDeletionMessage: 'Are you sure you want to delete this?',
+        description: 'Description',
+        id: 'Id',
+        order: 'Order',
+        original: 'Original',
+        file: 'File',
     },
     errors: {
         statusUnauthorized: 'Access denied',
@@ -347,7 +354,6 @@ export default {
             reference: 'Reference',
             observations: 'Observations',
             item: 'Item',
-            description: 'Description',
             size: 'Size',
             packing: 'Packing',
             grouping: 'Grouping',
@@ -362,7 +368,6 @@ export default {
         },
         notes: {
             observationType: 'Observation type',
-            description: 'Description',
         },
         descriptor: {
             agency: 'Agency',
@@ -375,7 +380,6 @@ export default {
             packing: 'Packing',
             grouping: 'Grouping',
             quantity: 'Quantity',
-            description: 'Description',
             size: 'Size',
             tags: 'Tags',
             type: 'Type',
@@ -461,7 +465,6 @@ export default {
             visible: 'Visible',
             available: 'Available',
             quantity: 'Quantity',
-            description: 'Description',
             price: 'Price',
             discount: 'Discount',
             packing: 'Packing',
@@ -534,7 +537,6 @@ export default {
             landed: 'Landed',
             quantity: 'Quantity',
             claimed: 'Claimed',
-            description: 'Description',
             price: 'Price',
             discount: 'Discount',
             total: 'Total',
@@ -795,7 +797,6 @@ export default {
             orderTicketList: 'Order Ticket List',
             details: 'Details',
             item: 'Item',
-            description: 'Description',
             quantity: 'Quantity',
             price: 'Price',
             amount: 'Amount',
@@ -1140,7 +1141,6 @@ export default {
             warehouse: 'Warehouse',
             travelFileDescription: 'Travel id { travelId }',
             file: 'File',
-            description: 'Description',
         },
     },
     item: {
@@ -1174,7 +1174,6 @@ export default {
             clone: 'Clone',
             openCard: 'View',
             openSummary: 'Summary',
-            viewDescription: 'Description',
         },
         cardDescriptor: {
             mainList: 'Main list',
diff --git a/src/i18n/es/index.js b/src/i18n/es/index.js
index a171e8e2c..1ac6e535c 100644
--- a/src/i18n/es/index.js
+++ b/src/i18n/es/index.js
@@ -64,7 +64,7 @@ export default {
         markAll: 'Marcar todo',
         requiredField: 'Campo obligatorio',
         class: 'clase',
-        type: 'tipo',
+        type: 'Tipo',
         reason: 'motivo',
         noResults: 'Sin resultados',
         system: 'Sistema',
@@ -72,6 +72,13 @@ export default {
         company: 'Empresa',
         fieldRequired: 'Campo requerido',
         allowedFilesText: 'Tipos de archivo permitidos: { allowedContentTypes }',
+        confirmDeletion: 'Confirmar eliminación',
+        confirmDeletionMessage: '¿Seguro que quieres eliminar?',
+        description: 'Descripción',
+        id: 'Id',
+        order: 'Orden',
+        original: 'Original',
+        file: 'Fichero',
     },
     errors: {
         statusUnauthorized: 'Acceso denegado',
@@ -346,7 +353,6 @@ export default {
             reference: 'Referencia',
             observations: 'Observaciónes',
             item: 'Artículo',
-            description: 'Descripción',
             size: 'Medida',
             packing: 'Packing',
             grouping: 'Grouping',
@@ -361,7 +367,6 @@ export default {
         },
         notes: {
             observationType: 'Tipo de observación',
-            description: 'Descripción',
         },
         descriptor: {
             agency: 'Agencia',
@@ -374,7 +379,6 @@ export default {
             packing: 'Packing',
             grouping: 'Grouping',
             quantity: 'Cantidad',
-            description: 'Descripción',
             size: 'Medida',
             tags: 'Etiquetas',
             type: 'Tipo',
@@ -460,7 +464,6 @@ export default {
             visible: 'Visible',
             available: 'Disponible',
             quantity: 'Cantidad',
-            description: 'Descripción',
             price: 'Precio',
             discount: 'Descuento',
             packing: 'Encajado',
@@ -533,7 +536,6 @@ export default {
             landed: 'Entregado',
             quantity: 'Cantidad',
             claimed: 'Reclamado',
-            description: 'Descripción',
             price: 'Precio',
             discount: 'Descuento',
             total: 'Total',
@@ -703,7 +705,6 @@ export default {
             orderTicketList: 'Tickets del pedido',
             details: 'Detalles',
             item: 'Item',
-            description: 'Descripción',
             quantity: 'Cantidad',
             price: 'Precio',
             amount: 'Monto',
@@ -1140,7 +1141,6 @@ export default {
             warehouse: 'Almacén',
             travelFileDescription: 'Id envío { travelId }',
             file: 'Fichero',
-            description: 'Descripción',
         },
     },
     item: {
@@ -1174,7 +1174,6 @@ export default {
             clone: 'Clonar',
             openCard: 'Ficha',
             openSummary: 'Detalles',
-            viewDescription: 'Descripción',
         },
         cardDescriptor: {
             mainList: 'Listado principal',
diff --git a/src/pages/Claim/ClaimList.vue b/src/pages/Claim/ClaimList.vue
index e9462e7a9..acb7ec3fd 100644
--- a/src/pages/Claim/ClaimList.vue
+++ b/src/pages/Claim/ClaimList.vue
@@ -116,7 +116,7 @@ function navigate(id) {
                                 outline
                             />
                             <QBtn
-                                :label="t('components.smartCard.viewDescription')"
+                                :label="t('globals.description')"
                                 @click.stop
                                 class="bg-vn-dark"
                                 outline
diff --git a/src/pages/Entry/Card/EntryBuysImport.vue b/src/pages/Entry/Card/EntryBuysImport.vue
index 21f0beada..5783826ec 100644
--- a/src/pages/Entry/Card/EntryBuysImport.vue
+++ b/src/pages/Entry/Card/EntryBuysImport.vue
@@ -44,7 +44,7 @@ const columns = computed(() => [
         align: 'left',
     },
     {
-        label: t('entry.buys.description'),
+        label: t('globals.description'),
         name: 'description',
         field: 'description',
         align: 'left',
diff --git a/src/pages/Entry/Card/EntryDms.vue b/src/pages/Entry/Card/EntryDms.vue
index a26811630..5e4d66c0c 100644
--- a/src/pages/Entry/Card/EntryDms.vue
+++ b/src/pages/Entry/Card/EntryDms.vue
@@ -2,6 +2,19 @@
 import VnDmsList from 'src/components/common/VnDmsList.vue';
 </script>
 <template>
-    <VnDmsList model="EntryDms" default-dms-code="entry" />
-    <!-- CHANGE ME-->
+    <VnDmsList
+        model="EntryDms"
+        update-model="EntryDms"
+        default-dms-code="entry"
+        filter="entryFk"
+        :description="
+            (data) => t('description', { reference: data.reference, id: data.id })
+        "
+    />
 </template>
+<i18n>
+    en:
+        description: Reference {reference} id {id}
+    es:
+        description: Referencia {reference} id {id}
+</i18n>
diff --git a/src/pages/Entry/Card/EntryNotes.vue b/src/pages/Entry/Card/EntryNotes.vue
index f56e59253..0d2e5e51a 100644
--- a/src/pages/Entry/Card/EntryNotes.vue
+++ b/src/pages/Entry/Card/EntryNotes.vue
@@ -63,7 +63,7 @@ onMounted(() => {
                     </div>
                     <div class="col">
                         <VnInput
-                            :label="t('entry.notes.description')"
+                            :label="t('globals.description')"
                             v-model="row.description"
                             :rules="validate('EntryObservation.description')"
                         />
diff --git a/src/pages/Entry/EntryLatestBuys.vue b/src/pages/Entry/EntryLatestBuys.vue
index f4a423f3b..09a6a2f27 100644
--- a/src/pages/Entry/EntryLatestBuys.vue
+++ b/src/pages/Entry/EntryLatestBuys.vue
@@ -59,7 +59,7 @@ const columns = computed(() => [
         align: 'left',
     },
     {
-        label: t('entry.latestBuys.description'),
+        label: t('globals.description'),
         field: 'description',
         name: 'description',
         align: 'left',
@@ -214,7 +214,7 @@ const editTableCellFormFieldsOptions = [
     { field: 'grouping', label: t('entry.latestBuys.grouping') },
     { field: 'packageValue', label: t('entry.latestBuys.packageValue') },
     { field: 'weight', label: t('entry.latestBuys.weight') },
-    { field: 'description', label: t('entry.latestBuys.description') },
+    { field: 'description', label: t('globals.description') },
     { field: 'size', label: t('entry.latestBuys.size') },
     { field: 'weightByPiece', label: t('entry.latestBuys.weightByPiece') },
     { field: 'packingOut', label: t('entry.latestBuys.packingOut') },
diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue
index 9b26891a1..f9704a480 100644
--- a/src/pages/Order/Card/OrderSummary.vue
+++ b/src/pages/Order/Card/OrderSummary.vue
@@ -31,7 +31,7 @@ const detailsColumns = ref([
     },
     {
         name: 'description',
-        label: t('order.summary.description'),
+        label: t('globals.description'),
         field: (row) => row?.item?.name,
     },
     {
@@ -167,7 +167,7 @@ const detailsColumns = ref([
                         <template #header="props">
                             <QTr :props="props">
                                 <QTh auto-width>{{ t('order.summary.item') }}</QTh>
-                                <QTh>{{ t('order.summary.description') }}</QTh>
+                                <QTh>{{ t('globals.description') }}</QTh>
                                 <QTh auto-width>{{ t('order.summary.quantity') }}</QTh>
                                 <QTh auto-width>{{ t('order.summary.price') }}</QTh>
                                 <QTh auto-width>{{ t('order.summary.amount') }}</QTh>
diff --git a/src/pages/Route/Card/RouteSummary.vue b/src/pages/Route/Card/RouteSummary.vue
index a10ca088e..df4495d3a 100644
--- a/src/pages/Route/Card/RouteSummary.vue
+++ b/src/pages/Route/Card/RouteSummary.vue
@@ -199,7 +199,7 @@ const openBuscaman = async (route, ticket) => {
                 </QCard>
                 <QCard class="vn-one">
                     <div class="header">
-                        {{ t('route.summary.description') }}
+                        {{ t('globals.description') }}
                     </div>
                     <p>
                         {{ dashIfEmpty(entity?.route?.description) }}
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index fe7dcee9a..f3e01d06b 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -270,7 +270,7 @@ async function changeState(value) {
                             <QTh auto-width>{{ t('ticket.summary.visible') }}</QTh>
                             <QTh auto-width>{{ t('ticket.summary.available') }}</QTh>
                             <QTh auto-width>{{ t('ticket.summary.quantity') }}</QTh>
-                            <QTh auto-width>{{ t('ticket.summary.description') }}</QTh>
+                            <QTh auto-width>{{ t('globals.description') }}</QTh>
                             <QTh auto-width>{{ t('ticket.summary.price') }}</QTh>
                             <QTh auto-width>{{ t('ticket.summary.discount') }}</QTh>
                             <QTh auto-width>{{ t('globals.amount') }}</QTh>
@@ -425,7 +425,7 @@ async function changeState(value) {
                     <template #header="props">
                         <QTr :props="props">
                             <QTh auto-width>{{ t('ticket.summary.quantity') }}</QTh>
-                            <QTh auto-width>{{ t('ticket.summary.description') }}</QTh>
+                            <QTh auto-width>{{ t('globals.description') }}</QTh>
                             <QTh auto-width>{{ t('ticket.summary.price') }}</QTh>
                             <QTh auto-width>{{ t('ticket.summary.taxClass') }}</QTh>
                             <QTh auto-width>{{ t('globals.amount') }}</QTh>
diff --git a/src/pages/Travel/Card/TravelThermographsForm.vue b/src/pages/Travel/Card/TravelThermographsForm.vue
index 6758cb6ff..4462846cb 100644
--- a/src/pages/Travel/Card/TravelThermographsForm.vue
+++ b/src/pages/Travel/Card/TravelThermographsForm.vue
@@ -300,7 +300,7 @@ const onThermographCreated = async (data) => {
                 <VnRow v-if="viewAction === 'edit'" class="row q-gutter-md q-mb-md">
                     <div class="col">
                         <QInput
-                            :label="t('travel.thermographs.description')"
+                            :label="t('globals.description')"
                             type="textarea"
                             v-model="thermographForm.description"
                             fill-input

From c2675bfe56e3115efa6c8f3c374aa9c89dc8eca3 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Tue, 13 Feb 2024 11:31:33 +0100
Subject: [PATCH 09/54] refs #6763 fix descriptor

---
 src/components/ui/VnTree.vue | 21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index 631b501b6..f57456ebd 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -1,19 +1,15 @@
 <script setup>
-import { onMounted, ref,computed, watch, } from 'vue';
+import { onMounted, ref } from 'vue';
 import { useI18n } from 'vue-i18n';
-import { useRouter } from 'vue-router';
 import { useState } from 'src/composables/useState';
 import { useQuasar } from 'quasar';
-import DepartmentSummaryDialog from 'src/pages/Department/Card/DepartmentSummaryDialog.vue';
 import DepartmentDescriptorProxy from 'src/pages/Department/Card/DepartmentDescriptorProxy.vue';
 import CreateDepartmentChild from '../CreateDepartmentChild.vue';
-
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
 
 const quasar = useQuasar();
 const { t } = useI18n();
-const router = useRouter();
 const { notify } = useNotify();
 const state = useState();
 
@@ -117,19 +113,16 @@ onMounted(async () => {
             <template #default-header="{ node }">
                 <div
                     class="row justify-between full-width q-pr-md cursor-pointer"
-
+                    @click.stop.exact="`#/department/department/${node.id}/summary`"
+                    @click.ctrl.stop="`#/department/department/${node.id}/summary`"
+                    :href="node.id && `#/department/department/${node.id}/summary`"
+                    color: inherit
                 >
-                    <a
-                        :href="node.id && `#/department/department/${node.id}/summary`"
-                        color: inherit
-                        @click.stop.exact="`#/department/department/${node.id}/summary`"
-                        @click.ctrl.stop="`#/department/department/${node.id}/summary`"
-                    >
+                    <a>
+                        <DepartmentDescriptorProxy :id="node.id" />
                         {{ node.name }}
 
                     </a>
-                    <DepartmentSummaryDialog :id="node.id" />
-
                     <div class="row justify-between" style="max-width: max-content">
                         <QIcon
                             v-if="node.id"

From 43154084529399c6e0c21132fbfb97213396dbd6 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 13 Feb 2024 15:01:24 +0100
Subject: [PATCH 10/54] refs #5509 feat: VnDms description

---
 src/components/common/VnDms.vue               | 26 +++--
 src/components/common/VnDmsList.vue           | 99 +++++++++++--------
 src/pages/Entry/Card/EntryDms.vue             |  9 --
 .../integration/entry/entryDms.spec.js        | 13 +++
 4 files changed, 88 insertions(+), 59 deletions(-)
 create mode 100644 test/cypress/integration/entry/entryDms.spec.js

diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
index 6cdca22c5..99056556d 100644
--- a/src/components/common/VnDms.vue
+++ b/src/components/common/VnDms.vue
@@ -27,19 +27,20 @@ const $props = defineProps({
         type: Object,
         default: null,
     },
-    description: {
-        type: Function,
-        default: null,
-    },
 });
 
 const warehouses = ref();
 const companies = ref();
 const dmsTypes = ref();
 const allowedContentTypes = ref();
+const inputFileRef = ref();
 const dms = ref({});
 
-onMounted(() => defaultData());
+onMounted(() => {
+    defaultData();
+    if (!$props.formInitialData)
+        dms.value.description = t($props.model + 'Description', dms.value);
+});
 function onFileChange(files) {
     dms.value.hasFileAttached = !!files;
     dms.value.file = files?.name;
@@ -78,7 +79,6 @@ function defaultData() {
     if ($props.formInitialData) return (dms.value = $props.formInitialData);
     return addDefaultData({
         reference: route.params.id,
-        description: $props.description && $props.description(dms.value),
     });
 }
 
@@ -151,6 +151,7 @@ function addDefaultData(data) {
                     type="textarea"
                 />
                 <QFile
+                    ref="inputFileRef"
                     :label="t('entry.buys.file')"
                     v-model="dms.files"
                     :multiple="false"
@@ -159,12 +160,14 @@ function addDefaultData(data) {
                     class="required"
                     :display-value="dms.file"
                 >
-                    <template #prepend>
-                        <QIcon name="vn:attach" class="cursor-pointer">
+                    <template #append>
+                        <QIcon
+                            name="vn:attach"
+                            class="cursor-pointer"
+                            @click="inputFileRef.pickFiles()"
+                        >
                             <QTooltip>{{ t('Select a file') }}</QTooltip>
                         </QIcon>
-                    </template>
-                    <template #append>
                         <QIcon name="info" class="cursor-pointer">
                             <QTooltip>{{
                                 t('contentTypesInfo', { allowedContentTypes })
@@ -189,7 +192,10 @@ function addDefaultData(data) {
 <i18n>
 en:
     contentTypesInfo: Allowed file types {allowedContentTypes}
+    EntryDmsDescription: Reference {reference}
 es:
     Generate identifier for original file: Generar identificador para archivo original
     contentTypesInfo: Tipos de archivo permitidos {allowedContentTypes}
+    EntryDmsDescription: Referencia {reference}
+
 </i18n>
diff --git a/src/components/common/VnDmsList.vue b/src/components/common/VnDmsList.vue
index f746fa041..b7e683da9 100644
--- a/src/components/common/VnDmsList.vue
+++ b/src/components/common/VnDmsList.vue
@@ -2,14 +2,13 @@
 import { ref, computed } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useRoute } from 'vue-router';
+import { useQuasar, QCheckbox, QBtn, QInput } from 'quasar';
+import axios from 'axios';
 
 import FetchData from 'components/FetchData.vue';
 import VnDms from 'src/components/common/VnDms.vue';
-import { downloadFile } from 'src/composables/downloadFile';
 import VnConfirm from 'components/ui/VnConfirm.vue';
-import axios from 'axios';
-import { QCheckbox, QBtn, QInput } from 'quasar';
-import { useQuasar } from 'quasar';
+import { downloadFile } from 'src/composables/downloadFile';
 
 const route = useRoute();
 const quasar = useQuasar();
@@ -35,10 +34,6 @@ const $props = defineProps({
         type: String,
         required: true,
     },
-    description: {
-        type: Function,
-        required: true,
-    },
 });
 
 const dmsFilter = {
@@ -144,6 +139,35 @@ const columns = computed(() => [
     {
         field: 'options',
         name: 'options',
+        components: [
+            {
+                component: QBtn,
+                props: () => ({
+                    icon: 'cloud_download',
+                    flat: true,
+                    color: 'primary',
+                }),
+                click: (prop) => downloadFile(prop.row.id),
+            },
+            {
+                component: QBtn,
+                props: () => ({
+                    icon: 'edit',
+                    flat: true,
+                    color: 'primary',
+                }),
+                click: (prop) => showFormDialog(prop.row),
+            },
+            {
+                component: QBtn,
+                props: () => ({
+                    icon: 'delete',
+                    flat: true,
+                    color: 'primary',
+                }),
+                click: (prop) => deleteDms(prop.row.id),
+            },
+        ],
     },
 ]);
 
@@ -199,7 +223,7 @@ function parseDms(data) {
         class="full-width q-mt-md"
         hide-bottom
         row-key="clientFk"
-        :grid="$q.screen.lt.md"
+        :grid="$q.screen.lt.sm"
     >
         <template #body-cell="props">
             <QTd :props="props">
@@ -216,24 +240,13 @@ function parseDms(data) {
                 </QTr>
 
                 <div class="flex justify-center" v-if="props.col.name == 'options'">
-                    <QBtn
-                        icon="cloud_download"
-                        flat
-                        color="primary"
-                        @click="downloadFile(props.row.id)"
-                    />
-                    <QBtn
-                        icon="edit"
-                        flat
-                        color="primary"
-                        @click="showFormDialog(props.row)"
-                    />
-                    <QBtn
-                        icon="delete"
-                        flat
-                        color="primary"
-                        @click="deleteDms(props.row.id)"
-                    />
+                    <div v-for="button of props.col.components" :key="button.id">
+                        <component
+                            :is="button.component"
+                            v-bind="button.props(props)"
+                            @click="button.click(props)"
+                        />
+                    </div>
                 </div>
             </QTd>
         </template>
@@ -244,23 +257,26 @@ function parseDms(data) {
                     flat
                     @keyup.ctrl.enter.stop="claimDevelopmentForm?.saveChanges()"
                 >
-                    <QCardSection>
-                        <QCheckbox v-model="props.selected" dense />
-                    </QCardSection>
                     <QSeparator />
                     <QList dense>
                         <QItem v-for="col in props.cols" :key="col.name">
-                            <QItemSection>
-                                <component
-                                    v-if="col.component"
-                                    :is="col.component"
-                                    v-bind="col.props && col.props(props)"
+                            <div v-if="col.name != 'options'" class="row">
+                                <span class="labelColor">{{ col.label }}:</span>
+                                <span>{{ col.value }}</span>
+                            </div>
+                            <div v-if="col.name == 'options'" class="row">
+                                <div
+                                    v-for="button of col.components"
+                                    :key="button.id"
+                                    class="row"
                                 >
-                                    <span v-if="col.component == 'span'">{{
-                                        `${col.label}:${col.value}`
-                                    }}</span>
-                                </component>
-                            </QItemSection>
+                                    <component
+                                        :is="button.component"
+                                        v-bind="button.props(col)"
+                                        @click="button.click(col)"
+                                    />
+                                </div>
+                            </div>
                         </QItem>
                     </QList>
                 </QCard>
@@ -285,6 +301,9 @@ function parseDms(data) {
     display: grid;
     row-gap: 20px;
 }
+.labelColor {
+    color: var(--vn-label);
+}
 </style>
 <i18n>
 en:
diff --git a/src/pages/Entry/Card/EntryDms.vue b/src/pages/Entry/Card/EntryDms.vue
index 5e4d66c0c..bab1ea6c2 100644
--- a/src/pages/Entry/Card/EntryDms.vue
+++ b/src/pages/Entry/Card/EntryDms.vue
@@ -7,14 +7,5 @@ import VnDmsList from 'src/components/common/VnDmsList.vue';
         update-model="EntryDms"
         default-dms-code="entry"
         filter="entryFk"
-        :description="
-            (data) => t('description', { reference: data.reference, id: data.id })
-        "
     />
 </template>
-<i18n>
-    en:
-        description: Reference {reference} id {id}
-    es:
-        description: Referencia {reference} id {id}
-</i18n>
diff --git a/test/cypress/integration/entry/entryDms.spec.js b/test/cypress/integration/entry/entryDms.spec.js
new file mode 100644
index 000000000..d9f1d77c0
--- /dev/null
+++ b/test/cypress/integration/entry/entryDms.spec.js
@@ -0,0 +1,13 @@
+describe('WagonTypeCreate', () => {
+    const entryId = 1;
+    beforeEach(() => {
+        cy.viewport(1920, 1080);
+        cy.login('developer');
+        cy.visit(`/#/entry/${entryId}/dms`);
+
+    });
+
+    it('should create and delete a new wagon type', () => {
+        cy.addCard()
+    });
+});

From 926395a7e75c26123fe16667a5705deb62cfb02d Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Wed, 14 Feb 2024 15:31:53 +0100
Subject: [PATCH 11/54] refs #6763 fix tree descriptor

---
 src/components/ui/VnTree.vue | 87 ++++++++++++++++++++++++++----------
 1 file changed, 63 insertions(+), 24 deletions(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index f57456ebd..8cdba7c2b 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -7,11 +7,13 @@ import DepartmentDescriptorProxy from 'src/pages/Department/Card/DepartmentDescr
 import CreateDepartmentChild from '../CreateDepartmentChild.vue';
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
+import { useRouter } from 'vue-router';
 
 const quasar = useQuasar();
 const { t } = useI18n();
 const { notify } = useNotify();
 const state = useState();
+const router = useRouter();
 
 const treeRef = ref();
 const showCreateNodeFormVal = ref(false);
@@ -24,7 +26,10 @@ const fetchedChildrensSet = ref(new Set());
 // const formData = computed(() => state.get('Tree'));
 
 const onNodeExpanded = (nodeKeysArray) => {
-
+    const lastStateTree = state.get('TreeState');
+    if (lastStateTree && lastStateTree) {
+        !nodeKeysArray.includes(lastStateTree) && nodeKeysArray.push(lastStateTree);
+    }
     // Verificar si el nodo ya fue expandido
     if (!fetchedChildrensSet.value.has(nodeKeysArray.at(-1))) {
         fetchedChildrensSet.value.add(nodeKeysArray.at(-1));
@@ -35,9 +40,11 @@ const onNodeExpanded = (nodeKeysArray) => {
 };
 
 const fetchNodeLeaves = async (nodeKey) => {
+    console.log('nodeKey: ', nodeKey);
     try {
         const node = treeRef.value.getNodeByKey(nodeKey);
 
+        console.log(node);
         if (!node || node.sons === 0) return;
 
         const params = { parentId: node.id };
@@ -47,11 +54,13 @@ const fetchNodeLeaves = async (nodeKey) => {
         if (response.data) {
             node.children = response.data;
             node.children.forEach((node) => {
-                if (node.sons) node.children = [{}];
+                node.children = node.sons > 0 ? [{}] : null;
             });
         }
+
+        state.set('Tree', node);
     } catch (err) {
-        console.error('Error fetching department leaves');
+        console.error('Error fetching department leaves', err);
         throw new Error();
     }
 };
@@ -88,16 +97,46 @@ const onNodeCreated = async () => {
     await fetchNodeLeaves(creationNodeSelectedId.value);
 };
 
-onMounted(async () => {
-    const tree = state.get('Tree')
-    if(tree) {
-        for (let n of tree){
-            await fetchNodeLeaves(n)
-        }
-        expanded.value  = tree
-    }
-});
+onMounted(async (n) => {
+    const tree = state.get('Tree');
+    if (tree) {
+        console.log('tree: ', tree);
 
+        for (let n of tree) {
+            console.log('n', n);
+            // setTimeout(async () => {
+            //     await fetchNodeLeaves(n);
+            // }, 1000);
+            await fetchNodeLeaves(n);
+        }
+        expanded.value = tree;
+        console.log('expanded.value', expanded.value);
+    }
+    treeRef.value.expandAll();
+});
+function handleClick(event, node) {
+    state.set('TreeState', node.parentFk);
+    node.id && router.push({ path: `/department/department/${node.id}/summary` });
+}
+function handleTab(event, node) {
+    state.set('TreeState', node.parentFk);
+    node.id && window.open(`#/department/department/${node.id}/summary`, '_blank');
+}
+
+function handleRow(event, node) {
+    switch (event.currentTarget.nodeName.toLowerCase()) {
+        case 'div':
+            node.id &&
+                router.push({ path: `#/department/department/${node.id}/summary` });
+            break;
+
+        case 'span':
+            break;
+
+        default:
+            break;
+    }
+}
 </script>
 
 <template>
@@ -109,20 +148,20 @@ onMounted(async () => {
             label-key="name"
             v-model:expanded="expanded"
             @update:expanded="onNodeExpanded($event)"
+            :default-expand-all="true"
         >
             <template #default-header="{ node }">
-                <div
-                    class="row justify-between full-width q-pr-md cursor-pointer"
-                    @click.stop.exact="`#/department/department/${node.id}/summary`"
-                    @click.ctrl.stop="`#/department/department/${node.id}/summary`"
-                    :href="node.id && `#/department/department/${node.id}/summary`"
-                    color: inherit
-                >
-                    <a>
+                <!-- @click="node.id && router.push({path:`#/department/department/${node.id}/summary`})" -->
+                <div class="row justify-between full-width q-pr-md cursor-pointer">
+                    <div>
+                        <span @click="handleRow($event, node)"> {{ node.name }} </span>
                         <DepartmentDescriptorProxy :id="node.id" />
-                        {{ node.name }}
-
-                    </a>
+                    </div>
+                    <div
+                        @click.stop.exact="handleClick($event, node)"
+                        @click.ctrl.stop="handleTab($event, node)"
+                        style="flex-grow: 1; width: 10px"
+                    ></div>
                     <div class="row justify-between" style="max-width: max-content">
                         <QIcon
                             v-if="node.id"
@@ -151,6 +190,7 @@ onMounted(async () => {
                 </div>
             </template>
         </QTree>
+        <!-- <DepartmentDescriptorProxy :id="node.id" /> -->
         <QDialog
             v-model="showCreateNodeFormVal"
             transition-show="scale"
@@ -178,4 +218,3 @@ a {
         Are you sure you want to delete it?: ¿Seguro que quieres eliminarlo?
         Delete department: Eliminar departamento
 </i18n>
-

From b3e554d99eef52524bc7e8acc902e970d8278b93 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Thu, 15 Feb 2024 15:00:30 +0100
Subject: [PATCH 12/54] refs #5509 feat: add e2e

---
 .../integration/entry/entryDms.spec.js        | 32 +++++++++++++++++--
 test/cypress/support/commands.js              | 11 +++++--
 2 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/test/cypress/integration/entry/entryDms.spec.js b/test/cypress/integration/entry/entryDms.spec.js
index d9f1d77c0..79a9c5162 100644
--- a/test/cypress/integration/entry/entryDms.spec.js
+++ b/test/cypress/integration/entry/entryDms.spec.js
@@ -1,5 +1,6 @@
 describe('WagonTypeCreate', () => {
     const entryId = 1;
+
     beforeEach(() => {
         cy.viewport(1920, 1080);
         cy.login('developer');
@@ -7,7 +8,34 @@ describe('WagonTypeCreate', () => {
 
     });
 
-    it('should create and delete a new wagon type', () => {
-        cy.addCard()
+    it('should create edit and remove new dms', () => {
+        cy.addRow();
+        cy.get('.icon-attach').click()
+        cy.get('.q-file').selectFile('test/cypress/fixtures/image.jpg', {
+            force: true,
+        });
+
+        cy.get("tbody > tr").then((value) => {
+            //Create and check if exist new row
+            let newFileTd = Cypress.$(value).length;
+            cy.get('.q-btn--standard > .q-btn__content > .block').click();
+            expect(value).to.have.length(newFileTd++);
+            const newRowSelector = `tbody > :nth-child(${newFileTd})`
+            cy.waitForElement(newRowSelector);
+
+            //Edit new dms
+            const u = undefined;
+            cy.validateRow(newRowSelector, [u,u,u,u,'ENTRADA ID 1'])
+            cy.get(`tbody :nth-child(${newFileTd}) > .text-right > .flex > :nth-child(2) > .q-btn > .q-btn__content > .q-icon`).click();
+        })
+        // cy.log('newFileTd', newFileTd)
+
+        // //Create and check if exist new row
+        // cy.log('newFileTd:', newFileTd);
+        // cy.get(`tbody :nth-child(${newFileTd}) > .text-right > .flex > :nth-child(2) > .q-btn > .q-btn__content > .q-icon`).click()
+
+        // cy.get(`tbody :nth-child(${newFileTd}) > :nth-child(5) > .q-tr > :nth-child(1) > span`).then((value) => {
+        //     cy.log(value)
+        // });
     });
 });
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index 6d627e631..a8b4a86f0 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -42,7 +42,7 @@ Cypress.Commands.add('login', (user) => {
 });
 
 Cypress.Commands.add('waitForElement', (element) => {
-    cy.get(element, { timeout: 2000 }).should('be.visible');
+    cy.get(element, { timeout: 5000 }).should('be.visible');
 });
 
 Cypress.Commands.add('getValue', (selector) => {
@@ -57,6 +57,12 @@ Cypress.Commands.add('getValue', (selector) => {
                     '> .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > input'
             );
         }
+        // Si es un QSelect
+        if ($el.find('span').length) {
+            return cy.get(
+                selector + ' span'
+            );
+        }
         // Puedes añadir un log o lanzar un error si el elemento no es reconocido
         cy.log('Elemento no soportado');
     });
@@ -126,12 +132,13 @@ Cypress.Commands.add('validateRow', (rowSelector, expectedValues) => {
     cy.get(rowSelector).within(() => {
         for (const [index, value] of expectedValues.entries()) {
             cy.log('CHECKING ', index, value);
+            if(value === undefined) continue
             if (typeof value == 'boolean') {
                 const prefix = value ? '' : 'not.';
                 cy.getValue(`:nth-child(${index + 1})`).should(`${prefix}be.checked`);
                 continue;
             }
-            cy.getValue(`:nth-child(${index + 1})`).should('have.value', value);
+            cy.getValue(`:nth-child(${index + 1})`).invoke('text').should('have.value', value)
         }
     });
 });

From fddc66972963abedebc1028b0bea22a981ab88c3 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Mon, 19 Feb 2024 05:51:35 +0100
Subject: [PATCH 13/54] refs #6763 feat: fix features

---
 src/components/ui/VnTree.vue | 90 +++++++++++++++++++++++++++---------
 1 file changed, 67 insertions(+), 23 deletions(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index 8cdba7c2b..12bfb5531 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -26,23 +26,27 @@ const fetchedChildrensSet = ref(new Set());
 // const formData = computed(() => state.get('Tree'));
 
 const onNodeExpanded = (nodeKeysArray) => {
-    const lastStateTree = state.get('TreeState');
-    if (lastStateTree && lastStateTree) {
-        !nodeKeysArray.includes(lastStateTree) && nodeKeysArray.push(lastStateTree);
-    }
     // Verificar si el nodo ya fue expandido
     if (!fetchedChildrensSet.value.has(nodeKeysArray.at(-1))) {
         fetchedChildrensSet.value.add(nodeKeysArray.at(-1));
         fetchNodeLeaves(nodeKeysArray.at(-1)); // Llamar a la función para obtener los nodos hijos
     }
-
+    // if (nodeKeysArray.length >= 2) {
+    //     const lastStateTree = state.get('TreeState');
+    //     if (lastStateTree && lastStateTree) {
+    //         !nodeKeysArray.includes(lastStateTree) && nodeKeysArray.push(lastStateTree);
+    //     }
+    //     fetchNodeLeaves(nodeKeysArray.at(-1));
+    // } else {
+    // fetchNodeLeaves(1); // Llamar a la función para obtener los nodos hijos
+    // }
     state.set('Tree', nodeKeysArray);
 };
 
 const fetchNodeLeaves = async (nodeKey) => {
     console.log('nodeKey: ', nodeKey);
     try {
-        const node = treeRef.value.getNodeByKey(nodeKey);
+        const node = treeRef.value?.getNodeByKey(nodeKey);
 
         console.log(node);
         if (!node || node.sons === 0) return;
@@ -98,10 +102,11 @@ const onNodeCreated = async () => {
 };
 
 onMounted(async (n) => {
-    const tree = state.get('Tree');
+    const tree = [...state.get('Tree'), 1];
+    const lastStateTree = state.get('TreeState');
     if (tree) {
         console.log('tree: ', tree);
-
+        if (lastStateTree) tree.push(lastStateTree);
         for (let n of tree) {
             console.log('n', n);
             // setTimeout(async () => {
@@ -112,17 +117,51 @@ onMounted(async (n) => {
         expanded.value = tree;
         console.log('expanded.value', expanded.value);
     }
-    treeRef.value.expandAll();
-});
-function handleClick(event, node) {
-    state.set('TreeState', node.parentFk);
-    node.id && router.push({ path: `/department/department/${node.id}/summary` });
-}
-function handleTab(event, node) {
-    state.set('TreeState', node.parentFk);
-    node.id && window.open(`#/department/department/${node.id}/summary`, '_blank');
-}
 
+    // const lastStateTree = state.get('TreeState');
+    // if (lastStateTree && lastStateTree) {
+    //     fetchNodeLeaves(lastStateTree);
+    //     !treeRef.value.expanded.includes(lastStateTree) &&
+    //         treeRef.value.expanded.push(lastStateTree);
+    // }
+    // treeRef.value.expandAll();
+    setTimeout(() => {
+        if (lastStateTree) {
+            const xx = treeRef.value.getNodeByKey(lastStateTree);
+            console.log(xx);
+            document.getElementById(lastStateTree).scrollIntoView();
+        }
+    }, 1000);
+});
+// function handleClick(event, node) {
+
+// }
+// function handleTab(event, node) {
+
+// }
+
+function handleEvent(type, event, node) {
+    const isParent = node.sons > 0;
+    const lastId = isParent ? node.id : node.parentFk;
+
+    switch (type) {
+        case 'path':
+            state.set('TreeState', lastId);
+            node.id && router.push({ path: `/department/department/${node.id}/summary` });
+            break;
+
+        case 'tab':
+            state.set('TreeState', lastId);
+            node.id &&
+                window.open(`#/department/department/${node.id}/summary`, '_blank');
+            break;
+
+        default:
+            node.id &&
+                router.push({ path: `#/department/department/${node.id}/summary` });
+            break;
+    }
+}
 function handleRow(event, node) {
     switch (event.currentTarget.nodeName.toLowerCase()) {
         case 'div':
@@ -152,14 +191,19 @@ function handleRow(event, node) {
         >
             <template #default-header="{ node }">
                 <!-- @click="node.id && router.push({path:`#/department/department/${node.id}/summary`})" -->
-                <div class="row justify-between full-width q-pr-md cursor-pointer">
+                <div
+                    :id="node.id"
+                    class="row justify-between full-width q-pr-md cursor-pointer"
+                >
                     <div>
-                        <span @click="handleRow($event, node)"> {{ node.name }} </span>
-                        <DepartmentDescriptorProxy :id="node.id" />
+                        <span @click="handleEvent('row', $event, node)">
+                            {{ node.name }}
+                            <DepartmentDescriptorProxy :id="node.id" />
+                        </span>
                     </div>
                     <div
-                        @click.stop.exact="handleClick($event, node)"
-                        @click.ctrl.stop="handleTab($event, node)"
+                        @click.stop.exact="handleEvent('path', $event, node)"
+                        @click.ctrl.stop="handleEvent('tab', $event, node)"
                         style="flex-grow: 1; width: 10px"
                     ></div>
                     <div class="row justify-between" style="max-width: max-content">

From 3a48d09080529b02e1179bc5650d0b498653f471 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Mon, 19 Feb 2024 10:26:05 +0100
Subject: [PATCH 14/54] refs #6763 refactor node

---
 src/components/ui/VnTree.vue | 80 +++++++++---------------------------
 1 file changed, 19 insertions(+), 61 deletions(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index 12bfb5531..265d3eb6a 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -23,42 +23,31 @@ const expanded = ref([]);
 const nodes = ref([{ id: null, name: t('Departments'), sons: true, children: [{}] }]);
 
 const fetchedChildrensSet = ref(new Set());
-// const formData = computed(() => state.get('Tree'));
 
 const onNodeExpanded = (nodeKeysArray) => {
-    // Verificar si el nodo ya fue expandido
     if (!fetchedChildrensSet.value.has(nodeKeysArray.at(-1))) {
         fetchedChildrensSet.value.add(nodeKeysArray.at(-1));
-        fetchNodeLeaves(nodeKeysArray.at(-1)); // Llamar a la función para obtener los nodos hijos
+        fetchNodeLeaves(nodeKeysArray.at(-1));
     }
-    // if (nodeKeysArray.length >= 2) {
-    //     const lastStateTree = state.get('TreeState');
-    //     if (lastStateTree && lastStateTree) {
-    //         !nodeKeysArray.includes(lastStateTree) && nodeKeysArray.push(lastStateTree);
-    //     }
-    //     fetchNodeLeaves(nodeKeysArray.at(-1));
-    // } else {
-    // fetchNodeLeaves(1); // Llamar a la función para obtener los nodos hijos
-    // }
+
     state.set('Tree', nodeKeysArray);
 };
 
 const fetchNodeLeaves = async (nodeKey) => {
-    console.log('nodeKey: ', nodeKey);
     try {
         const node = treeRef.value?.getNodeByKey(nodeKey);
 
-        console.log(node);
         if (!node || node.sons === 0) return;
 
         const params = { parentId: node.id };
         const response = await axios.get('/departments/getLeaves', { params });
-
-        // Si hay datos en la respuesta y tiene hijos, agregarlos al nodo actual
         if (response.data) {
-            node.children = response.data;
-            node.children.forEach((node) => {
-                node.children = node.sons > 0 ? [{}] : null;
+            node.children = response.data.map((n) => {
+                const hasChildrens = n.sons > 0;
+
+                n.children = hasChildrens ? [{}] : null;
+                n.clickable = true;
+                return n;
             });
         }
 
@@ -105,40 +94,22 @@ onMounted(async (n) => {
     const tree = [...state.get('Tree'), 1];
     const lastStateTree = state.get('TreeState');
     if (tree) {
-        console.log('tree: ', tree);
-        if (lastStateTree) tree.push(lastStateTree);
         for (let n of tree) {
-            console.log('n', n);
-            // setTimeout(async () => {
-            //     await fetchNodeLeaves(n);
-            // }, 1000);
             await fetchNodeLeaves(n);
         }
         expanded.value = tree;
-        console.log('expanded.value', expanded.value);
-    }
 
-    // const lastStateTree = state.get('TreeState');
-    // if (lastStateTree && lastStateTree) {
-    //     fetchNodeLeaves(lastStateTree);
-    //     !treeRef.value.expanded.includes(lastStateTree) &&
-    //         treeRef.value.expanded.push(lastStateTree);
-    // }
-    // treeRef.value.expandAll();
+        if (lastStateTree) {
+            tree.push(lastStateTree);
+            await fetchNodeLeaves(lastStateTree);
+        }
+    }
     setTimeout(() => {
         if (lastStateTree) {
-            const xx = treeRef.value.getNodeByKey(lastStateTree);
-            console.log(xx);
             document.getElementById(lastStateTree).scrollIntoView();
         }
     }, 1000);
 });
-// function handleClick(event, node) {
-
-// }
-// function handleTab(event, node) {
-
-// }
 
 function handleEvent(type, event, node) {
     const isParent = node.sons > 0;
@@ -162,20 +133,6 @@ function handleEvent(type, event, node) {
             break;
     }
 }
-function handleRow(event, node) {
-    switch (event.currentTarget.nodeName.toLowerCase()) {
-        case 'div':
-            node.id &&
-                router.push({ path: `#/department/department/${node.id}/summary` });
-            break;
-
-        case 'span':
-            break;
-
-        default:
-            break;
-    }
-}
 </script>
 
 <template>
@@ -190,10 +147,9 @@ function handleRow(event, node) {
             :default-expand-all="true"
         >
             <template #default-header="{ node }">
-                <!-- @click="node.id && router.push({path:`#/department/department/${node.id}/summary`})" -->
                 <div
                     :id="node.id"
-                    class="row justify-between full-width q-pr-md cursor-pointer"
+                    class="qtr row justify-between full-width q-pr-md cursor-pointer"
                 >
                     <div>
                         <span @click="handleEvent('row', $event, node)">
@@ -249,9 +205,11 @@ function handleRow(event, node) {
 </template>
 
 <style lang="scss" scoped>
-a {
-    color: inherit;
-    text-decoration: none;
+span {
+    color: $primary;
+}
+.hover-shadow:hover {
+    background-color: #9e9e9e;
 }
 </style>
 <i18n>

From 01850c66702e77bf395b2493a204fff518493333 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Mon, 19 Feb 2024 11:24:49 +0100
Subject: [PATCH 15/54] refs #6763 pointer

---
 src/components/ui/VnTree.vue | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index 265d3eb6a..302c22b8e 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -152,7 +152,10 @@ function handleEvent(type, event, node) {
                     class="qtr row justify-between full-width q-pr-md cursor-pointer"
                 >
                     <div>
-                        <span @click="handleEvent('row', $event, node)">
+                        <span
+                            @click="handleEvent('row', $event, node)"
+                            class="cursor-pointer"
+                        >
                             {{ node.name }}
                             <DepartmentDescriptorProxy :id="node.id" />
                         </span>

From 7397f074638ac64c552e12b096f2b6142b2acad7 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Mon, 19 Feb 2024 11:29:30 +0100
Subject: [PATCH 16/54] refs #6763 remove

---
 src/components/ui/VnTree.vue | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index 302c22b8e..c3752b938 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -211,9 +211,6 @@ function handleEvent(type, event, node) {
 span {
     color: $primary;
 }
-.hover-shadow:hover {
-    background-color: #9e9e9e;
-}
 </style>
 <i18n>
     es:

From 5cc23841493e91cff8ba0e14828ff2d84b702360 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Mon, 19 Feb 2024 11:30:04 +0100
Subject: [PATCH 17/54] refs #6763 remove

---
 src/components/ui/VnTree.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/components/ui/VnTree.vue b/src/components/ui/VnTree.vue
index c3752b938..9a99124c6 100644
--- a/src/components/ui/VnTree.vue
+++ b/src/components/ui/VnTree.vue
@@ -193,7 +193,6 @@ function handleEvent(type, event, node) {
                 </div>
             </template>
         </QTree>
-        <!-- <DepartmentDescriptorProxy :id="node.id" /> -->
         <QDialog
             v-model="showCreateNodeFormVal"
             transition-show="scale"

From 71f2c173cc129f2fc8aab44932bdeff85ab7e086 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 12:04:55 +0100
Subject: [PATCH 18/54] refs #6797 feat(jenkins) deploy dev-lilium

---
 Jenkinsfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 6fa70c8fb..c30a3d26f 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -89,7 +89,7 @@ pipeline {
             }
             steps {
                 sh 'quasar build'
-                // dockerBuild()
+                dockerBuild()
             }
         }
         stage('Deploy') {

From 30b8e25a7477471efd778b26a465d4a890ec48af Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 12:08:49 +0100
Subject: [PATCH 19/54] refs #6797 feat(jenkins) deploy dev-lilium

---
 Jenkinsfile | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Jenkinsfile b/Jenkinsfile
index c30a3d26f..0d673301e 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -89,6 +89,10 @@ pipeline {
             }
             steps {
                 sh 'quasar build'
+                script {
+                    def packageJson = readJSON file: 'package.json'
+                    env.VERSION = packageJson.version
+                }
                 dockerBuild()
             }
         }

From 1bb0d0db94f1c3be22dd10edc33b99003db5b392 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 12:15:16 +0100
Subject: [PATCH 20/54] refs #6797 feat(Dockerfile) use bun

---
 Dockerfile | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index d121dfcfd..f42bf0e75 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,4 @@
-FROM node:stretch-slim
-RUN curl -fsSL https://bun.sh/install | bash
+FROM oven/bun:1
 RUN bun install -g @quasar/cli
 WORKDIR /app
 COPY dist/spa ./

From 96734477926958323059a23ee1ae31e6858bf8b4 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Wed, 21 Feb 2024 12:21:24 +0100
Subject: [PATCH 21/54] refs #6768 location consignee create

---
 .../components/CustomerConsigneeCreate.vue    | 118 +++---------------
 1 file changed, 16 insertions(+), 102 deletions(-)

diff --git a/src/pages/Customer/components/CustomerConsigneeCreate.vue b/src/pages/Customer/components/CustomerConsigneeCreate.vue
index ef01879c2..d9765d50d 100644
--- a/src/pages/Customer/components/CustomerConsigneeCreate.vue
+++ b/src/pages/Customer/components/CustomerConsigneeCreate.vue
@@ -4,7 +4,7 @@ import { useI18n } from 'vue-i18n';
 import { useRoute, useRouter } from 'vue-router';
 
 import axios from 'axios';
-
+import VnLocation from 'src/components/common/VnLocation.vue';
 import FetchData from 'components/FetchData.vue';
 import FormModel from 'components/FormModel.vue';
 import VnRow from 'components/ui/VnRow.vue';
@@ -20,13 +20,9 @@ const router = useRouter();
 
 const formInitialData = reactive({ isDefaultAddress: false });
 
-const townsFetchDataRef = ref(null);
-const postcodeFetchDataRef = ref(null);
 const urlCreate = ref('');
 
 const postcodesOptions = ref([]);
-const citiesLocationOptions = ref([]);
-const provincesLocationOptions = ref([]);
 const agencyModes = ref([]);
 const incoterms = ref([]);
 const customsAgents = ref([]);
@@ -36,14 +32,6 @@ onBeforeMount(() => {
     getCustomsAgents();
 });
 
-const onPostcodeCreated = async ({ code, provinceFk, townFk }, formData) => {
-    await postcodeFetchDataRef.value.fetch();
-    await townsFetchDataRef.value.fetch();
-    formData.postalCode = code;
-    formData.provinceFk = provinceFk;
-    formData.city = citiesLocationOptions.value.find((town) => town.id === townFk).name;
-};
-
 const getCustomsAgents = async () => {
     const { data } = await axios.get('CustomsAgents');
     customsAgents.value = data;
@@ -61,26 +49,18 @@ const toCustomerConsignees = () => {
         },
     });
 };
+function handleLocation(data, location) {
+    const { town, code, provinceFk, countryFk } = location ?? {};
+    data.postcode = code;
+    data.city = town;
+    data.provinceFk = provinceFk;
+    data.countryFk = countryFk;
+    console.log('data', data);
+}
+console.log('handleLocation: ', handleLocation);
 </script>
 
 <template>
-    <FetchData
-        @on-fetch="(data) => (postcodesOptions = data)"
-        auto-load
-        ref="postcodeFetchDataRef"
-        url="Postcodes/location"
-    />
-    <FetchData
-        @on-fetch="(data) => (citiesLocationOptions = data)"
-        auto-load
-        ref="townsFetchDataRef"
-        url="Towns/location"
-    />
-    <FetchData
-        @on-fetch="(data) => (provincesLocationOptions = data)"
-        auto-load
-        url="Provinces/location"
-    />
     <fetch-data
         @on-fetch="(data) => (agencyModes = data)"
         auto-load
@@ -113,83 +93,17 @@ const toCustomerConsignees = () => {
 
             <VnRow class="row q-gutter-md q-mb-md">
                 <div class="col">
-                    <VnSelectDialog
-                        :label="t('Postcode')"
-                        :options="postcodesOptions"
-                        :roles-allowed-to-create="['deliveryAssistant']"
+                    <VnLocation
                         :rules="validate('Worker.postcode')"
-                        hide-selected
-                        option-label="code"
-                        option-value="code"
-                        v-model="data.postalCode"
-                    >
-                        <template #form>
-                            <CustomerCreateNewPostcode
-                                @on-data-saved="onPostcodeCreated($event, data)"
-                            />
-                        </template>
-                        <template #option="scope">
-                            <QItem v-bind="scope.itemProps">
-                                <QItemSection v-if="scope.opt">
-                                    <QItemLabel>{{ scope.opt.code }}</QItemLabel>
-                                    <QItemLabel caption>
-                                        {{ scope.opt.code }} -
-                                        {{ scope.opt.town.name }}
-                                        ({{ scope.opt.town.province.name }},
-                                        {{ scope.opt.town.province.country.country }})
-                                    </QItemLabel>
-                                </QItemSection>
-                            </QItem>
-                        </template>
-                    </VnSelectDialog>
-                </div>
-                <div class="col">
-                    <!-- ciudades -->
-                    <VnSelectFilter
-                        :label="t('City')"
-                        :options="citiesLocationOptions"
-                        hide-selected
-                        option-label="name"
-                        option-value="name"
-                        v-model="data.city"
-                    >
-                        <template #option="scope">
-                            <QItem v-bind="scope.itemProps">
-                                <QItemSection>
-                                    <QItemLabel>{{ scope.opt.name }}</QItemLabel>
-                                    <QItemLabel caption>
-                                        {{
-                                            `${scope.opt.name}, ${scope.opt.province.name} (${scope.opt.province.country.country})`
-                                        }}
-                                    </QItemLabel>
-                                </QItemSection>
-                            </QItem>
-                        </template>
-                    </VnSelectFilter>
+                        :roles-allowed-to-create="['deliveryAssistant']"
+                        :options="postcodesOptions"
+                        v-model="data.location"
+                        @update:model-value="(location) => handleLocation(data, location)"
+                    ></VnLocation>
                 </div>
             </VnRow>
 
             <VnRow class="row q-gutter-md q-mb-md">
-                <div class="col">
-                    <VnSelectFilter
-                        :label="t('Province')"
-                        :options="provincesLocationOptions"
-                        hide-selected
-                        option-label="name"
-                        option-value="id"
-                        v-model="data.provinceFk"
-                    >
-                        <template #option="scope">
-                            <QItem v-bind="scope.itemProps">
-                                <QItemSection>
-                                    <QItemLabel>{{
-                                        `${scope.opt.name} (${scope.opt.country.country})`
-                                    }}</QItemLabel>
-                                </QItemSection>
-                            </QItem>
-                        </template>
-                    </VnSelectFilter>
-                </div>
                 <div class="col">
                     <VnSelectFilter
                         :label="t('Agency')"

From 841544767e1e0198d3464f1d0bef24086a388300 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:14:04 +0100
Subject: [PATCH 22/54] refs #6797 feat(jenkins) use pnpm

---
 Dockerfile     |    5 +-
 Jenkinsfile    |   32 +-
 bun.lockb      |  Bin 300062 -> 316734 bytes
 package.json   |   18 +-
 pnpm-lock.yaml | 5806 ++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 5831 insertions(+), 30 deletions(-)
 create mode 100644 pnpm-lock.yaml

diff --git a/Dockerfile b/Dockerfile
index f42bf0e75..1906dc920 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,6 @@
-FROM oven/bun:1
-RUN bun install -g @quasar/cli
+FROM node:stretch-slim
+RUN corepack enable pnpm
+RUN pnpm install -g @quasar/cli
 WORKDIR /app
 COPY dist/spa ./
 CMD ["quasar", "serve", "./", "--history", "--hostname", "0.0.0.0"]
diff --git a/Jenkinsfile b/Jenkinsfile
index 0d673301e..fee06c567 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -62,7 +62,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'bun install --no-audit --prefer-offline'
+                sh 'pnpm install --no-audit --prefer-offline'
             }
         }
         stage('Test') {
@@ -72,10 +72,18 @@ pipeline {
             environment {
                 NODE_ENV = ""
             }
-            parallel {
-                stage('Frontend') {
-                    steps {
-                        sh 'bun run test:unit:ci'
+            steps {
+                sh 'pnpm run test:unit:ci'
+            }
+            post {
+                always {
+                    script {
+                        try {
+                            junit 'junitresults.xml'
+                            junit 'junit.xml'
+                        } catch (e) {
+                            echo e.toString()
+                        }
                     }
                 }
             }
@@ -112,18 +120,4 @@ pipeline {
             }
         }
     }
-    post {
-        always {
-            script {
-                if (!PROTECTED_BRANCH) {
-                    try {
-                        junit 'junitresults.xml'
-                        junit 'junit.xml'
-                    } catch (e) {
-                        echo e.toString()
-                    }
-                }
-            }
-        }
-    }
 }
diff --git a/bun.lockb b/bun.lockb
index a192865c4a6c3df4e100617199ba75e9b5fe9a2c..fd74f4f9e885cebbcb8d67ba3abf90f1e29deecf 100755
GIT binary patch
delta 51549
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

delta 41922
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

diff --git a/package.json b/package.json
index 7beb22e55..3708007f2 100644
--- a/package.json
+++ b/package.json
@@ -16,12 +16,12 @@
     },
     "dependencies": {
         "@quasar/cli": "^2.3.0",
-        "@quasar/extras": "^1.16.4",
+        "@quasar/extras": "^1.16.9",
         "axios": "^1.4.0",
         "chromium": "^3.0.3",
         "croppie": "^2.6.5",
         "pinia": "^2.1.3",
-        "quasar": "^2.12.0",
+        "quasar": "^2.14.5",
         "validator": "^13.9.0",
         "vue": "^3.3.4",
         "vue-i18n": "^9.2.2",
@@ -30,9 +30,9 @@
     "devDependencies": {
         "@intlify/unplugin-vue-i18n": "^0.8.1",
         "@pinia/testing": "^0.1.2",
-        "@quasar/app-vite": "^1.4.3",
-        "@quasar/quasar-app-extension-testing-unit-vitest": "^0.3.0",
-        "@vue/test-utils": "^2.3.2",
+        "@quasar/app-vite": "^1.7.3",
+        "@quasar/quasar-app-extension-testing-unit-vitest": "^0.4.0",
+        "@vue/test-utils": "^2.4.4",
         "autoprefixer": "^10.4.14",
         "cypress": "^12.13.0",
         "eslint": "^8.41.0",
@@ -41,7 +41,7 @@
         "eslint-plugin-vue": "^9.14.1",
         "postcss": "^8.4.23",
         "prettier": "^2.8.8",
-        "vitest": "^0.31.1"
+        "vitest": "^1.3.1"
     },
     "engines": {
         "node": "^20 || ^18 || ^16",
@@ -50,8 +50,8 @@
         "bun": ">= 1.0.25"
     },
     "overrides": {
-        "@vitejs/plugin-vue": "^4.0.0",
-        "vite": "^4.3.5",
-        "vitest": "^0.31.1"
+        "@vitejs/plugin-vue": "^5.0.4",
+        "vite": "^5.1.4",
+        "vitest": "^1.3.1"
     }
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 000000000..5ef5b94c9
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,5806 @@
+lockfileVersion: '6.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+dependencies:
+  '@quasar/cli':
+    specifier: ^2.3.0
+    version: 2.3.0
+  '@quasar/extras':
+    specifier: ^1.16.9
+    version: 1.16.9
+  axios:
+    specifier: ^1.4.0
+    version: 1.6.7
+  chromium:
+    specifier: ^3.0.3
+    version: 3.0.3
+  croppie:
+    specifier: ^2.6.5
+    version: 2.6.5
+  pinia:
+    specifier: ^2.1.3
+    version: 2.1.7(vue@3.4.19)
+  quasar:
+    specifier: ^2.14.5
+    version: 2.14.5
+  validator:
+    specifier: ^13.9.0
+    version: 13.11.0
+  vue:
+    specifier: ^3.3.4
+    version: 3.4.19
+  vue-i18n:
+    specifier: ^9.2.2
+    version: 9.9.1(vue@3.4.19)
+  vue-router:
+    specifier: ^4.2.1
+    version: 4.2.5(vue@3.4.19)
+
+devDependencies:
+  '@intlify/unplugin-vue-i18n':
+    specifier: ^0.8.1
+    version: 0.8.2(vue-i18n@9.9.1)
+  '@pinia/testing':
+    specifier: ^0.1.2
+    version: 0.1.3(pinia@2.1.7)(vue@3.4.19)
+  '@quasar/app-vite':
+    specifier: ^1.7.3
+    version: 1.7.3(eslint@8.56.0)(pinia@2.1.7)(quasar@2.14.5)(vue-router@4.2.5)(vue@3.4.19)
+  '@quasar/quasar-app-extension-testing-unit-vitest':
+    specifier: ^0.4.0
+    version: 0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(vite@5.1.4)(vitest@1.3.1)(vue@3.4.19)
+  '@vue/test-utils':
+    specifier: ^2.4.4
+    version: 2.4.4(vue@3.4.19)
+  autoprefixer:
+    specifier: ^10.4.14
+    version: 10.4.17(postcss@8.4.35)
+  cypress:
+    specifier: ^12.13.0
+    version: 12.17.4
+  eslint:
+    specifier: ^8.41.0
+    version: 8.56.0
+  eslint-config-prettier:
+    specifier: ^8.8.0
+    version: 8.10.0(eslint@8.56.0)
+  eslint-plugin-cypress:
+    specifier: ^2.13.3
+    version: 2.15.1(eslint@8.56.0)
+  eslint-plugin-vue:
+    specifier: ^9.14.1
+    version: 9.21.1(eslint@8.56.0)
+  postcss:
+    specifier: ^8.4.23
+    version: 8.4.35
+  prettier:
+    specifier: ^2.8.8
+    version: 2.8.8
+  vitest:
+    specifier: ^1.3.1
+    version: 1.3.1
+
+packages:
+
+  /@aashutoshrathi/word-wrap@1.2.6:
+    resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /@babel/helper-string-parser@7.23.4:
+    resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
+    engines: {node: '>=6.9.0'}
+
+  /@babel/helper-validator-identifier@7.22.20:
+    resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+    engines: {node: '>=6.9.0'}
+
+  /@babel/parser@7.23.9:
+    resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+    dependencies:
+      '@babel/types': 7.23.9
+
+  /@babel/types@7.23.9:
+    resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-string-parser': 7.23.4
+      '@babel/helper-validator-identifier': 7.22.20
+      to-fast-properties: 2.0.0
+
+  /@colors/colors@1.5.0:
+    resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+    engines: {node: '>=0.1.90'}
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@cush/relative@1.0.0:
+    resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==}
+    dev: true
+
+  /@cypress/request@2.88.12:
+    resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==}
+    engines: {node: '>= 6'}
+    dependencies:
+      aws-sign2: 0.7.0
+      aws4: 1.12.0
+      caseless: 0.12.0
+      combined-stream: 1.0.8
+      extend: 3.0.2
+      forever-agent: 0.6.1
+      form-data: 2.3.3
+      http-signature: 1.3.6
+      is-typedarray: 1.0.0
+      isstream: 0.1.2
+      json-stringify-safe: 5.0.1
+      mime-types: 2.1.35
+      performance-now: 2.1.0
+      qs: 6.10.4
+      safe-buffer: 5.2.1
+      tough-cookie: 4.1.3
+      tunnel-agent: 0.6.0
+      uuid: 8.3.2
+    dev: true
+
+  /@cypress/xvfb@1.2.4(supports-color@8.1.1):
+    resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==}
+    dependencies:
+      debug: 3.2.7(supports-color@8.1.1)
+      lodash.once: 4.1.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@esbuild/aix-ppc64@0.19.12:
+    resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm64@0.19.12:
+    resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.19.12:
+    resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64@0.19.12:
+    resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.19.12:
+    resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.19.12:
+    resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.19.12:
+    resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.19.12:
+    resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.19.12:
+    resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.19.12:
+    resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.19.12:
+    resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.19.12:
+    resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-mips64el@0.19.12:
+    resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.19.12:
+    resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.19.12:
+    resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.19.12:
+    resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.19.12:
+    resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.19.12:
+    resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.19.12:
+    resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.19.12:
+    resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.19.12:
+    resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.19.12:
+    resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.19.12:
+    resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
+    resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+    dependencies:
+      eslint: 8.56.0
+      eslint-visitor-keys: 3.4.3
+    dev: true
+
+  /@eslint-community/regexpp@4.10.0:
+    resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+    dev: true
+
+  /@eslint/eslintrc@2.1.4:
+    resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      ajv: 6.12.6
+      debug: 4.3.4(supports-color@8.1.1)
+      espree: 9.6.1
+      globals: 13.24.0
+      ignore: 5.3.1
+      import-fresh: 3.3.0
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@eslint/js@8.56.0:
+    resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dev: true
+
+  /@humanwhocodes/config-array@0.11.14:
+    resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
+    engines: {node: '>=10.10.0'}
+    dependencies:
+      '@humanwhocodes/object-schema': 2.0.2
+      debug: 4.3.4(supports-color@8.1.1)
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@humanwhocodes/module-importer@1.0.1:
+    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+    engines: {node: '>=12.22'}
+    dev: true
+
+  /@humanwhocodes/object-schema@2.0.2:
+    resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==}
+    dev: true
+
+  /@intlify/bundle-utils@4.0.0(vue-i18n@9.9.1):
+    resolution: {integrity: sha512-klXrYT9VXyKEXsD6UY3pShg0O5MPC07n0TZ5RrSs5ry6T1eZVolIFGJi9c3qcDrh1qjJxgikRnPBmD7qGDqbjw==}
+    engines: {node: '>= 12'}
+    peerDependencies:
+      petite-vue-i18n: '*'
+      vue-i18n: '*'
+    peerDependenciesMeta:
+      petite-vue-i18n:
+        optional: true
+      vue-i18n:
+        optional: true
+    dependencies:
+      '@intlify/message-compiler': 9.4.1
+      '@intlify/shared': 9.4.1
+      jsonc-eslint-parser: 1.4.1
+      source-map: 0.6.1
+      vue-i18n: 9.9.1(vue@3.4.19)
+      yaml-eslint-parser: 0.3.2
+    dev: true
+
+  /@intlify/core-base@9.9.1:
+    resolution: {integrity: sha512-qsV15dg7jNX2faBRyKMgZS8UcFJViWEUPLdzZ9UR0kQZpFVeIpc0AG7ZOfeP7pX2T9SQ5jSiorq/tii9nkkafA==}
+    engines: {node: '>= 16'}
+    dependencies:
+      '@intlify/message-compiler': 9.9.1
+      '@intlify/shared': 9.9.1
+
+  /@intlify/message-compiler@9.4.1:
+    resolution: {integrity: sha512-aN2N+dUx320108QhH51Ycd2LEpZ+NKbzyQ2kjjhqMcxhHdxtOnkgdx+MDBhOy/CObwBmhC3Nygzc6hNlfKvPNw==}
+    engines: {node: '>= 16'}
+    dependencies:
+      '@intlify/shared': 9.4.1
+      source-map-js: 1.0.2
+    dev: true
+
+  /@intlify/message-compiler@9.9.1:
+    resolution: {integrity: sha512-zTvP6X6HeumHOXuAE1CMMsV6tTX+opKMOxO1OHTCg5N5Sm/F7d8o2jdT6W6L5oHUsJ/vvkGefHIs7Q3hfowmsA==}
+    engines: {node: '>= 16'}
+    dependencies:
+      '@intlify/shared': 9.9.1
+      source-map-js: 1.0.2
+
+  /@intlify/shared@9.4.1:
+    resolution: {integrity: sha512-A51elBmZWf1FS80inf/32diO9DeXoqg9GR9aUDHFcfHoNDuT46Q+fpPOdj8jiJnSHSBh8E1E+6qWRhAZXdK3Ng==}
+    engines: {node: '>= 16'}
+    dev: true
+
+  /@intlify/shared@9.9.1:
+    resolution: {integrity: sha512-b3Pta1nwkz5rGq434v0psHwEwHGy1pYCttfcM22IE//K9owbpkEvFptx9VcuRAxjQdrO2If249cmDDjBu5wMDA==}
+    engines: {node: '>= 16'}
+
+  /@intlify/unplugin-vue-i18n@0.8.2(vue-i18n@9.9.1):
+    resolution: {integrity: sha512-cRnzPqSEZQOmTD+p4pwc3RTS9HxreLqfID0keoqZDZweCy/CGRMLLTNd15S4TUf1vSBhPF03DItEFDr1F+8MDA==}
+    engines: {node: '>= 14.16'}
+    peerDependencies:
+      petite-vue-i18n: '*'
+      vue-i18n: '*'
+      vue-i18n-bridge: '*'
+    peerDependenciesMeta:
+      petite-vue-i18n:
+        optional: true
+      vue-i18n:
+        optional: true
+      vue-i18n-bridge:
+        optional: true
+    dependencies:
+      '@intlify/bundle-utils': 4.0.0(vue-i18n@9.9.1)
+      '@intlify/shared': 9.4.1
+      '@rollup/pluginutils': 4.2.1
+      '@vue/compiler-sfc': 3.4.19
+      debug: 4.3.4(supports-color@8.1.1)
+      fast-glob: 3.3.2
+      js-yaml: 4.1.0
+      json5: 2.2.3
+      pathe: 1.1.2
+      picocolors: 1.0.0
+      source-map: 0.6.1
+      unplugin: 1.7.1
+      vue-i18n: 9.9.1(vue@3.4.19)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@isaacs/cliui@8.0.2:
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+    dependencies:
+      string-width: 5.1.2
+      string-width-cjs: /string-width@4.2.3
+      strip-ansi: 7.1.0
+      strip-ansi-cjs: /strip-ansi@6.0.1
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: /wrap-ansi@7.0.0
+    dev: true
+
+  /@jest/schemas@29.6.3:
+    resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@sinclair/typebox': 0.27.8
+    dev: true
+
+  /@jridgewell/gen-mapping@0.3.3:
+    resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      '@jridgewell/set-array': 1.1.2
+      '@jridgewell/sourcemap-codec': 1.4.15
+      '@jridgewell/trace-mapping': 0.3.22
+    dev: true
+
+  /@jridgewell/resolve-uri@3.1.2:
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+    dev: true
+
+  /@jridgewell/set-array@1.1.2:
+    resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+    engines: {node: '>=6.0.0'}
+    dev: true
+
+  /@jridgewell/sourcemap-codec@1.4.15:
+    resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+  /@jridgewell/trace-mapping@0.3.22:
+    resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==}
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.4.15
+    dev: true
+
+  /@nodelib/fs.scandir@2.1.5:
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+    dev: true
+
+  /@nodelib/fs.stat@2.0.5:
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+    dev: true
+
+  /@nodelib/fs.walk@1.2.8:
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.17.1
+    dev: true
+
+  /@one-ini/wasm@0.1.1:
+    resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
+    dev: true
+
+  /@pinia/testing@0.1.3(pinia@2.1.7)(vue@3.4.19):
+    resolution: {integrity: sha512-D2Ds2s69kKFaRf2KCcP1NhNZEg5+we59aRyQalwRm7ygWfLM25nDH66267U3hNvRUOTx8ofL24GzodZkOmB5xw==}
+    peerDependencies:
+      pinia: '>=2.1.5'
+    dependencies:
+      pinia: 2.1.7(vue@3.4.19)
+      vue-demi: 0.14.7(vue@3.4.19)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+    dev: true
+
+  /@pkgjs/parseargs@0.11.0:
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    engines: {node: '>=14'}
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@pnpm/config.env-replace@1.1.0:
+    resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+    engines: {node: '>=12.22.0'}
+    dev: false
+
+  /@pnpm/network.ca-file@1.0.2:
+    resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+    engines: {node: '>=12.22.0'}
+    dependencies:
+      graceful-fs: 4.2.10
+    dev: false
+
+  /@pnpm/npm-conf@2.2.2:
+    resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==}
+    engines: {node: '>=12'}
+    dependencies:
+      '@pnpm/config.env-replace': 1.1.0
+      '@pnpm/network.ca-file': 1.0.2
+      config-chain: 1.1.13
+    dev: false
+
+  /@quasar/app-vite@1.7.3(eslint@8.56.0)(pinia@2.1.7)(quasar@2.14.5)(vue-router@4.2.5)(vue@3.4.19):
+    resolution: {integrity: sha512-pnDInCFP9M1d7lJzS8UkiFq8bGWdekLz8Gu+NLI9UAxruIM9QVlSD4hUmWptTQXaVEvYlDnqfW3LOr57B8eVtw==}
+    engines: {node: ^24 || ^22 || ^20 || ^18 || ^16 || ^14.19, npm: '>= 6.14.12', yarn: '>= 1.17.3'}
+    hasBin: true
+    peerDependencies:
+      electron-builder: '>= 22'
+      electron-packager: '>= 15'
+      eslint: ^8.11.0
+      pinia: ^2.0.0
+      quasar: ^2.14.0
+      vue: ^3.2.29
+      vue-router: ^4.0.12
+      vuex: ^4.0.0
+      workbox-build: '>= 6'
+    peerDependenciesMeta:
+      electron-builder:
+        optional: true
+      electron-packager:
+        optional: true
+      eslint:
+        optional: true
+      pinia:
+        optional: true
+      vuex:
+        optional: true
+      workbox-build:
+        optional: true
+    dependencies:
+      '@quasar/render-ssr-error': 1.0.3
+      '@quasar/vite-plugin': 1.6.0(@vitejs/plugin-vue@2.3.4)(quasar@2.14.5)(vite@2.9.17)(vue@3.4.19)
+      '@rollup/pluginutils': 4.2.1
+      '@types/chrome': 0.0.208
+      '@types/compression': 1.7.5
+      '@types/cordova': 0.0.34
+      '@types/express': 4.17.21
+      '@vitejs/plugin-vue': 2.3.4(vite@5.1.4)(vue@3.4.19)
+      archiver: 5.3.2
+      chokidar: 3.6.0
+      ci-info: 3.9.0
+      compression: 1.7.4
+      cross-spawn: 7.0.3
+      dot-prop: 6.0.1
+      elementtree: 0.1.7
+      esbuild: 0.14.51
+      eslint: 8.56.0
+      express: 4.18.2
+      fast-glob: 3.2.12
+      fs-extra: 11.2.0
+      html-minifier: 4.0.0
+      inquirer: 8.2.6
+      isbinaryfile: 5.0.2
+      kolorist: 1.8.0
+      lodash: 4.17.21
+      minimist: 1.2.8
+      open: 8.4.2
+      pinia: 2.1.7(vue@3.4.19)
+      quasar: 2.14.5
+      register-service-worker: 1.7.2
+      rollup-plugin-visualizer: 5.12.0
+      sass: 1.71.1
+      semver: 7.6.0
+      serialize-javascript: 6.0.2
+      table: 6.8.1
+      vite: 2.9.17(sass@1.71.1)
+      vue: 3.4.19
+      vue-router: 4.2.5(vue@3.4.19)
+      webpack-merge: 5.10.0
+    transitivePeerDependencies:
+      - less
+      - rollup
+      - stylus
+      - supports-color
+    dev: true
+
+  /@quasar/cli@2.3.0:
+    resolution: {integrity: sha512-DNFDemicj3jXe5+Ib+5w9Bwj1U3yoHQkqn0bU/qysIl/p0MmGA1yqOfUF0V4fw/5or1dfCvStIA/oZxUcC+2pQ==}
+    engines: {node: '>= 16', npm: '>= 5.6.0', yarn: '>= 1.6.0'}
+    hasBin: true
+    dependencies:
+      '@quasar/ssl-certificate': 1.0.0
+      ci-info: 3.9.0
+      compression: 1.7.4
+      connect-history-api-fallback: 2.0.0
+      cors: 2.8.5
+      cross-spawn: 7.0.3
+      express: 4.18.2
+      fs-extra: 11.2.0
+      http-proxy-middleware: 2.0.6
+      kolorist: 1.8.0
+      minimist: 1.2.8
+      open: 9.1.0
+      route-cache: 0.5.0
+      selfsigned: 2.4.1
+      update-notifier: 6.0.2
+    transitivePeerDependencies:
+      - '@types/express'
+      - debug
+      - supports-color
+    dev: false
+
+  /@quasar/extras@1.16.9:
+    resolution: {integrity: sha512-SlOhwzXyPQHWgQIS2ncyDdYdksCJvUYNtgsDQqzAKEG3r3d/ejOxvThle79HTK3Q6HB+gQWFG21Ux00Osr5XSw==}
+    dev: false
+
+  /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(vite@5.1.4)(vitest@1.3.1)(vue@3.4.19):
+    resolution: {integrity: sha512-eyzdUdmZiCueNS+5nedjMmzdbpCetSrtdGIwW6KplW1dTzRbLiNvYUjpBOxQGmJCgEhWy9zuswJ7MZ/bTql24Q==}
+    engines: {node: '>= 12.22.1', npm: '>= 6.14.12', yarn: '>= 1.17.3'}
+    peerDependencies:
+      '@vitest/ui': ^0.34.0
+      '@vue/test-utils': ^2.4.1
+      quasar: ^2.12.7
+      vitest: ^0.34.0
+      vue: ^3.3.4
+    peerDependenciesMeta:
+      '@vitest/ui':
+        optional: true
+    dependencies:
+      '@vue/test-utils': 2.4.4(vue@3.4.19)
+      happy-dom: 11.2.0
+      lodash-es: 4.17.21
+      quasar: 2.14.5
+      vite-jsconfig-paths: 2.0.1(vite@5.1.4)
+      vite-tsconfig-paths: 4.3.1(vite@5.1.4)
+      vitest: 1.3.1
+      vue: 3.4.19
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+      - vite
+    dev: true
+
+  /@quasar/render-ssr-error@1.0.3:
+    resolution: {integrity: sha512-A8RF99q6/sOSe1Ighnh5syEIbliD3qUYEJd2HyfFyBPSMF+WYGXon5dmzg4nUoK662NgOggInevkDyBDJcZugg==}
+    engines: {node: '>= 16'}
+    dependencies:
+      stack-trace: 1.0.0-pre2
+    dev: true
+
+  /@quasar/ssl-certificate@1.0.0:
+    resolution: {integrity: sha512-RhZF7rO76T7Ywer1/5lCe7xl3CIiXxSAH1xgwOj0wcHTityDxJqIN/5YIj6BxMvlFw8XkJDoB1udEQafoVFA4g==}
+    engines: {node: '>= 16'}
+    dependencies:
+      fs-extra: 11.2.0
+      selfsigned: 2.4.1
+    dev: false
+
+  /@quasar/vite-plugin@1.6.0(@vitejs/plugin-vue@2.3.4)(quasar@2.14.5)(vite@2.9.17)(vue@3.4.19):
+    resolution: {integrity: sha512-LmbV76G1CwWZbrEQhqyZpkRQTJyO3xpW55aXY1zWN+JhyUeG77CcMCEWteBVnJ6I6ehUPFDC9ONd2+WlwH6rNQ==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      '@vitejs/plugin-vue': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-beta.0
+      quasar: ^2.8.0
+      vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-beta.0
+      vue: ^3.0.0
+    dependencies:
+      '@vitejs/plugin-vue': 2.3.4(vite@5.1.4)(vue@3.4.19)
+      quasar: 2.14.5
+      vite: 2.9.17(sass@1.71.1)
+      vue: 3.4.19
+    dev: true
+
+  /@rollup/pluginutils@4.2.1:
+    resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+    engines: {node: '>= 8.0.0'}
+    dependencies:
+      estree-walker: 2.0.2
+      picomatch: 2.3.1
+    dev: true
+
+  /@rollup/rollup-android-arm-eabi@4.12.0:
+    resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-android-arm64@4.12.0:
+    resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-arm64@4.12.0:
+    resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-x64@4.12.0:
+    resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm-gnueabihf@4.12.0:
+    resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-gnu@4.12.0:
+    resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-musl@4.12.0:
+    resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-riscv64-gnu@4.12.0:
+    resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-gnu@4.12.0:
+    resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-musl@4.12.0:
+    resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-arm64-msvc@4.12.0:
+    resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-ia32-msvc@4.12.0:
+    resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-x64-msvc@4.12.0:
+    resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@sinclair/typebox@0.27.8:
+    resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+    dev: true
+
+  /@sindresorhus/is@4.6.0:
+    resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /@sindresorhus/is@5.6.0:
+    resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
+    engines: {node: '>=14.16'}
+    dev: false
+
+  /@szmarczak/http-timer@4.0.6:
+    resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
+    engines: {node: '>=10'}
+    dependencies:
+      defer-to-connect: 2.0.1
+    dev: false
+
+  /@szmarczak/http-timer@5.0.1:
+    resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      defer-to-connect: 2.0.1
+    dev: false
+
+  /@types/body-parser@1.19.5:
+    resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
+    dependencies:
+      '@types/connect': 3.4.38
+      '@types/node': 20.11.19
+    dev: true
+
+  /@types/cacheable-request@6.0.3:
+    resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
+    dependencies:
+      '@types/http-cache-semantics': 4.0.4
+      '@types/keyv': 3.1.4
+      '@types/node': 20.11.19
+      '@types/responselike': 1.0.3
+    dev: false
+
+  /@types/chrome@0.0.208:
+    resolution: {integrity: sha512-VDU/JnXkF5qaI7WBz14Azpa2VseZTgML0ia/g/B1sr9OfdOnHiH/zZ7P7qCDqxSlkqJh76/bPc8jLFcx8rHJmw==}
+    dependencies:
+      '@types/filesystem': 0.0.35
+      '@types/har-format': 1.2.15
+    dev: true
+
+  /@types/compression@1.7.5:
+    resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==}
+    dependencies:
+      '@types/express': 4.17.21
+    dev: true
+
+  /@types/connect@3.4.38:
+    resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+    dependencies:
+      '@types/node': 20.11.19
+    dev: true
+
+  /@types/cordova@0.0.34:
+    resolution: {integrity: sha512-rkiiTuf/z2wTd4RxFOb+clE7PF4AEJU0hsczbUdkHHBtkUmpWQpEddynNfJYKYtZFJKbq4F+brfekt1kx85IZA==}
+    dev: true
+
+  /@types/estree@1.0.5:
+    resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+    dev: true
+
+  /@types/express-serve-static-core@4.17.43:
+    resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==}
+    dependencies:
+      '@types/node': 20.11.19
+      '@types/qs': 6.9.11
+      '@types/range-parser': 1.2.7
+      '@types/send': 0.17.4
+    dev: true
+
+  /@types/express@4.17.21:
+    resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
+    dependencies:
+      '@types/body-parser': 1.19.5
+      '@types/express-serve-static-core': 4.17.43
+      '@types/qs': 6.9.11
+      '@types/serve-static': 1.15.5
+    dev: true
+
+  /@types/filesystem@0.0.35:
+    resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==}
+    dependencies:
+      '@types/filewriter': 0.0.33
+    dev: true
+
+  /@types/filewriter@0.0.33:
+    resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==}
+    dev: true
+
+  /@types/har-format@1.2.15:
+    resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==}
+    dev: true
+
+  /@types/http-cache-semantics@4.0.4:
+    resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
+    dev: false
+
+  /@types/http-errors@2.0.4:
+    resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
+    dev: true
+
+  /@types/http-proxy@1.17.14:
+    resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==}
+    dependencies:
+      '@types/node': 20.11.19
+    dev: false
+
+  /@types/json5@0.0.29:
+    resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+    dev: true
+
+  /@types/keyv@3.1.4:
+    resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
+    dependencies:
+      '@types/node': 20.11.19
+    dev: false
+
+  /@types/mime@1.3.5:
+    resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+    dev: true
+
+  /@types/mime@3.0.4:
+    resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==}
+    dev: true
+
+  /@types/node-forge@1.3.11:
+    resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
+    dependencies:
+      '@types/node': 20.11.19
+    dev: false
+
+  /@types/node@16.18.82:
+    resolution: {integrity: sha512-pcDZtkx9z8XYV+ius2P3Ot2VVrcYOfXffBQUBuiszrlUzKSmoDYqo+mV+IoL8iIiIjjtOMvNSmH1hwJ+Q+f96Q==}
+    dev: true
+
+  /@types/node@20.11.19:
+    resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==}
+    dependencies:
+      undici-types: 5.26.5
+
+  /@types/qs@6.9.11:
+    resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==}
+    dev: true
+
+  /@types/range-parser@1.2.7:
+    resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+    dev: true
+
+  /@types/responselike@1.0.3:
+    resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
+    dependencies:
+      '@types/node': 20.11.19
+    dev: false
+
+  /@types/send@0.17.4:
+    resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
+    dependencies:
+      '@types/mime': 1.3.5
+      '@types/node': 20.11.19
+    dev: true
+
+  /@types/serve-static@1.15.5:
+    resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==}
+    dependencies:
+      '@types/http-errors': 2.0.4
+      '@types/mime': 3.0.4
+      '@types/node': 20.11.19
+    dev: true
+
+  /@types/sinonjs__fake-timers@8.1.1:
+    resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==}
+    dev: true
+
+  /@types/sizzle@2.3.8:
+    resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==}
+    dev: true
+
+  /@types/yauzl@2.10.3:
+    resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
+    requiresBuild: true
+    dependencies:
+      '@types/node': 16.18.82
+    dev: true
+    optional: true
+
+  /@ungap/structured-clone@1.2.0:
+    resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+    dev: true
+
+  /@vitejs/plugin-vue@2.3.4(vite@5.1.4)(vue@3.4.19):
+    resolution: {integrity: sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      vite: ^2.5.10
+      vue: ^3.2.25
+    dependencies:
+      vite: 5.1.4
+      vue: 3.4.19
+    dev: true
+
+  /@vitest/expect@1.3.1:
+    resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==}
+    dependencies:
+      '@vitest/spy': 1.3.1
+      '@vitest/utils': 1.3.1
+      chai: 4.4.1
+    dev: true
+
+  /@vitest/runner@1.3.1:
+    resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==}
+    dependencies:
+      '@vitest/utils': 1.3.1
+      p-limit: 5.0.0
+      pathe: 1.1.2
+    dev: true
+
+  /@vitest/snapshot@1.3.1:
+    resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==}
+    dependencies:
+      magic-string: 0.30.7
+      pathe: 1.1.2
+      pretty-format: 29.7.0
+    dev: true
+
+  /@vitest/spy@1.3.1:
+    resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==}
+    dependencies:
+      tinyspy: 2.2.1
+    dev: true
+
+  /@vitest/utils@1.3.1:
+    resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==}
+    dependencies:
+      diff-sequences: 29.6.3
+      estree-walker: 3.0.3
+      loupe: 2.3.7
+      pretty-format: 29.7.0
+    dev: true
+
+  /@vue/compiler-core@3.4.19:
+    resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==}
+    dependencies:
+      '@babel/parser': 7.23.9
+      '@vue/shared': 3.4.19
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.0.2
+
+  /@vue/compiler-dom@3.4.19:
+    resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==}
+    dependencies:
+      '@vue/compiler-core': 3.4.19
+      '@vue/shared': 3.4.19
+
+  /@vue/compiler-sfc@3.4.19:
+    resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==}
+    dependencies:
+      '@babel/parser': 7.23.9
+      '@vue/compiler-core': 3.4.19
+      '@vue/compiler-dom': 3.4.19
+      '@vue/compiler-ssr': 3.4.19
+      '@vue/shared': 3.4.19
+      estree-walker: 2.0.2
+      magic-string: 0.30.7
+      postcss: 8.4.35
+      source-map-js: 1.0.2
+
+  /@vue/compiler-ssr@3.4.19:
+    resolution: {integrity: sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==}
+    dependencies:
+      '@vue/compiler-dom': 3.4.19
+      '@vue/shared': 3.4.19
+
+  /@vue/devtools-api@6.6.1:
+    resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==}
+
+  /@vue/reactivity@3.4.19:
+    resolution: {integrity: sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==}
+    dependencies:
+      '@vue/shared': 3.4.19
+
+  /@vue/runtime-core@3.4.19:
+    resolution: {integrity: sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==}
+    dependencies:
+      '@vue/reactivity': 3.4.19
+      '@vue/shared': 3.4.19
+
+  /@vue/runtime-dom@3.4.19:
+    resolution: {integrity: sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==}
+    dependencies:
+      '@vue/runtime-core': 3.4.19
+      '@vue/shared': 3.4.19
+      csstype: 3.1.3
+
+  /@vue/server-renderer@3.4.19(vue@3.4.19):
+    resolution: {integrity: sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==}
+    peerDependencies:
+      vue: 3.4.19
+    dependencies:
+      '@vue/compiler-ssr': 3.4.19
+      '@vue/shared': 3.4.19
+      vue: 3.4.19
+
+  /@vue/shared@3.4.19:
+    resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==}
+
+  /@vue/test-utils@2.4.4(vue@3.4.19):
+    resolution: {integrity: sha512-8jkRxz8pNhClAf4Co4ZrpAoFISdvT3nuSkUlY6Ys6rmTpw3DMWG/X3mw3gQ7QJzgCZO9f+zuE2kW57fi09MW7Q==}
+    peerDependencies:
+      '@vue/server-renderer': ^3.0.1
+      vue: ^3.0.1
+    peerDependenciesMeta:
+      '@vue/server-renderer':
+        optional: true
+    dependencies:
+      js-beautify: 1.15.1
+      vue: 3.4.19
+      vue-component-type-helpers: 1.8.27
+    dev: true
+
+  /abbrev@2.0.0:
+    resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+    dev: true
+
+  /accepts@1.3.8:
+    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      mime-types: 2.1.35
+      negotiator: 0.6.3
+
+  /acorn-jsx@5.3.2(acorn@7.4.1):
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      acorn: 7.4.1
+    dev: true
+
+  /acorn-jsx@5.3.2(acorn@8.11.3):
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      acorn: 8.11.3
+    dev: true
+
+  /acorn-walk@8.3.2:
+    resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==}
+    engines: {node: '>=0.4.0'}
+    dev: true
+
+  /acorn@7.4.1:
+    resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+    dev: true
+
+  /acorn@8.11.3:
+    resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+    dev: true
+
+  /aggregate-error@3.1.0:
+    resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+    engines: {node: '>=8'}
+    dependencies:
+      clean-stack: 2.2.0
+      indent-string: 4.0.0
+    dev: true
+
+  /ajv@6.12.6:
+    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-json-stable-stringify: 2.1.0
+      json-schema-traverse: 0.4.1
+      uri-js: 4.4.1
+    dev: true
+
+  /ajv@8.12.0:
+    resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+    dependencies:
+      fast-deep-equal: 3.1.3
+      json-schema-traverse: 1.0.0
+      require-from-string: 2.0.2
+      uri-js: 4.4.1
+    dev: true
+
+  /ansi-align@3.0.1:
+    resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+    dependencies:
+      string-width: 4.2.3
+    dev: false
+
+  /ansi-colors@4.1.3:
+    resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /ansi-escapes@4.3.2:
+    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      type-fest: 0.21.3
+    dev: true
+
+  /ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  /ansi-regex@6.0.1:
+    resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+    engines: {node: '>=12'}
+
+  /ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+    dependencies:
+      color-convert: 2.0.1
+    dev: true
+
+  /ansi-styles@5.2.0:
+    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /ansi-styles@6.2.1:
+    resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+    engines: {node: '>=12'}
+
+  /any-promise@1.3.0:
+    resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+    dev: true
+
+  /anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+    dev: true
+
+  /arch@2.2.0:
+    resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
+    dev: true
+
+  /archiver-utils@2.1.0:
+    resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==}
+    engines: {node: '>= 6'}
+    dependencies:
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      lazystream: 1.0.1
+      lodash.defaults: 4.2.0
+      lodash.difference: 4.5.0
+      lodash.flatten: 4.4.0
+      lodash.isplainobject: 4.0.6
+      lodash.union: 4.6.0
+      normalize-path: 3.0.0
+      readable-stream: 2.3.8
+    dev: true
+
+  /archiver-utils@3.0.4:
+    resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==}
+    engines: {node: '>= 10'}
+    dependencies:
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      lazystream: 1.0.1
+      lodash.defaults: 4.2.0
+      lodash.difference: 4.5.0
+      lodash.flatten: 4.4.0
+      lodash.isplainobject: 4.0.6
+      lodash.union: 4.6.0
+      normalize-path: 3.0.0
+      readable-stream: 3.6.2
+    dev: true
+
+  /archiver@5.3.2:
+    resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==}
+    engines: {node: '>= 10'}
+    dependencies:
+      archiver-utils: 2.1.0
+      async: 3.2.5
+      buffer-crc32: 0.2.13
+      readable-stream: 3.6.2
+      readdir-glob: 1.1.3
+      tar-stream: 2.2.0
+      zip-stream: 4.1.1
+    dev: true
+
+  /argparse@2.0.1:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+    dev: true
+
+  /array-flatten@1.1.1:
+    resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+  /asn1@0.2.6:
+    resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
+    dependencies:
+      safer-buffer: 2.1.2
+    dev: true
+
+  /assert-plus@1.0.0:
+    resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
+    engines: {node: '>=0.8'}
+    dev: true
+
+  /assertion-error@1.1.0:
+    resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+    dev: true
+
+  /astral-regex@2.0.0:
+    resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /async@3.2.5:
+    resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
+    dev: true
+
+  /asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+  /at-least-node@1.0.0:
+    resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+    engines: {node: '>= 4.0.0'}
+    dev: true
+
+  /autoprefixer@10.4.17(postcss@8.4.35):
+    resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==}
+    engines: {node: ^10 || ^12 || >=14}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      browserslist: 4.23.0
+      caniuse-lite: 1.0.30001588
+      fraction.js: 4.3.7
+      normalize-range: 0.1.2
+      picocolors: 1.0.0
+      postcss: 8.4.35
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /aws-sign2@0.7.0:
+    resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
+    dev: true
+
+  /aws4@1.12.0:
+    resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
+    dev: true
+
+  /axios@1.6.7:
+    resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==}
+    dependencies:
+      follow-redirects: 1.15.5
+      form-data: 4.0.0
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
+  /balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  /base64-js@1.5.1:
+    resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+    dev: true
+
+  /bcrypt-pbkdf@1.0.2:
+    resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
+    dependencies:
+      tweetnacl: 0.14.5
+    dev: true
+
+  /big-integer@1.6.52:
+    resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
+    engines: {node: '>=0.6'}
+    dev: false
+
+  /binary-extensions@2.2.0:
+    resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /bl@4.1.0:
+    resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+    dependencies:
+      buffer: 5.7.1
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+    dev: true
+
+  /blob-util@2.0.2:
+    resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
+    dev: true
+
+  /bluebird@3.7.2:
+    resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+    dev: true
+
+  /body-parser@1.20.1:
+    resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+    dependencies:
+      bytes: 3.1.2
+      content-type: 1.0.5
+      debug: 2.6.9
+      depd: 2.0.0
+      destroy: 1.2.0
+      http-errors: 2.0.0
+      iconv-lite: 0.4.24
+      on-finished: 2.4.1
+      qs: 6.11.0
+      raw-body: 2.5.1
+      type-is: 1.6.18
+      unpipe: 1.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  /boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+    dev: true
+
+  /boxen@7.1.1:
+    resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      ansi-align: 3.0.1
+      camelcase: 7.0.1
+      chalk: 5.3.0
+      cli-boxes: 3.0.0
+      string-width: 5.1.2
+      type-fest: 2.19.0
+      widest-line: 4.0.1
+      wrap-ansi: 8.1.0
+    dev: false
+
+  /bplist-parser@0.2.0:
+    resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
+    engines: {node: '>= 5.10.0'}
+    dependencies:
+      big-integer: 1.6.52
+    dev: false
+
+  /brace-expansion@1.1.11:
+    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+    dependencies:
+      balanced-match: 1.0.2
+      concat-map: 0.0.1
+
+  /brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+    dependencies:
+      balanced-match: 1.0.2
+    dev: true
+
+  /braces@3.0.2:
+    resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+    engines: {node: '>=8'}
+    dependencies:
+      fill-range: 7.0.1
+
+  /browserslist@4.23.0:
+    resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+    dependencies:
+      caniuse-lite: 1.0.30001588
+      electron-to-chromium: 1.4.677
+      node-releases: 2.0.14
+      update-browserslist-db: 1.0.13(browserslist@4.23.0)
+    dev: true
+
+  /buffer-crc32@0.2.13:
+    resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+
+  /buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+    dev: false
+
+  /buffer@5.7.1:
+    resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+    dev: true
+
+  /bundle-name@3.0.0:
+    resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
+    engines: {node: '>=12'}
+    dependencies:
+      run-applescript: 5.0.0
+    dev: false
+
+  /bytes@3.0.0:
+    resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
+    engines: {node: '>= 0.8'}
+
+  /bytes@3.1.2:
+    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+    engines: {node: '>= 0.8'}
+
+  /cac@6.7.14:
+    resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /cacheable-lookup@5.0.4:
+    resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
+    engines: {node: '>=10.6.0'}
+    dev: false
+
+  /cacheable-lookup@7.0.0:
+    resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
+    engines: {node: '>=14.16'}
+    dev: false
+
+  /cacheable-request@10.2.14:
+    resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      '@types/http-cache-semantics': 4.0.4
+      get-stream: 6.0.1
+      http-cache-semantics: 4.1.1
+      keyv: 4.5.4
+      mimic-response: 4.0.0
+      normalize-url: 8.0.0
+      responselike: 3.0.0
+    dev: false
+
+  /cacheable-request@7.0.4:
+    resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
+    engines: {node: '>=8'}
+    dependencies:
+      clone-response: 1.0.3
+      get-stream: 5.2.0
+      http-cache-semantics: 4.1.1
+      keyv: 4.5.4
+      lowercase-keys: 2.0.0
+      normalize-url: 6.1.0
+      responselike: 2.0.1
+    dev: false
+
+  /cachedir@2.4.0:
+    resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
+    engines: {node: '>=6'}
+
+  /call-bind@1.0.7:
+    resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      es-define-property: 1.0.0
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.2.4
+      set-function-length: 1.2.1
+
+  /callsites@3.1.0:
+    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /camel-case@3.0.0:
+    resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==}
+    dependencies:
+      no-case: 2.3.2
+      upper-case: 1.1.3
+    dev: true
+
+  /camelcase@7.0.1:
+    resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
+    engines: {node: '>=14.16'}
+    dev: false
+
+  /caniuse-lite@1.0.30001588:
+    resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==}
+    dev: true
+
+  /caseless@0.12.0:
+    resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
+    dev: true
+
+  /chai@4.4.1:
+    resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
+    engines: {node: '>=4'}
+    dependencies:
+      assertion-error: 1.1.0
+      check-error: 1.0.3
+      deep-eql: 4.1.3
+      get-func-name: 2.0.2
+      loupe: 2.3.7
+      pathval: 1.1.1
+      type-detect: 4.0.8
+    dev: true
+
+  /chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+    dev: true
+
+  /chalk@5.3.0:
+    resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+    engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+    dev: false
+
+  /chardet@0.7.0:
+    resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+    dev: true
+
+  /check-error@1.0.3:
+    resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+    dependencies:
+      get-func-name: 2.0.2
+    dev: true
+
+  /check-more-types@2.24.0:
+    resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
+    engines: {node: '>= 0.8.0'}
+    dev: true
+
+  /chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.2
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
+  /chromium@3.0.3:
+    resolution: {integrity: sha512-TfbzP/3t38Us5xrbb9x87M/y5I/j3jx0zeJhhQ72gjp6dwJuhVP6hBZnBH4wEg7512VVXk9zCfTuPFOdw7bQqg==}
+    os: [darwin, linux, win32]
+    requiresBuild: true
+    dependencies:
+      cachedir: 2.4.0
+      debug: 4.3.4(supports-color@8.1.1)
+      extract-zip: 1.7.0
+      got: 11.8.6
+      progress: 2.0.3
+      rimraf: 2.7.1
+      tmp: 0.0.33
+      tunnel: 0.0.6
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
+  /ci-info@3.9.0:
+    resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+    engines: {node: '>=8'}
+
+  /clean-css@4.2.4:
+    resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==}
+    engines: {node: '>= 4.0'}
+    dependencies:
+      source-map: 0.6.1
+    dev: true
+
+  /clean-stack@2.2.0:
+    resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /cli-boxes@3.0.0:
+    resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /cli-cursor@3.1.0:
+    resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+    engines: {node: '>=8'}
+    dependencies:
+      restore-cursor: 3.1.0
+    dev: true
+
+  /cli-spinners@2.9.2:
+    resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /cli-table3@0.6.3:
+    resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==}
+    engines: {node: 10.* || >= 12.*}
+    dependencies:
+      string-width: 4.2.3
+    optionalDependencies:
+      '@colors/colors': 1.5.0
+    dev: true
+
+  /cli-truncate@2.1.0:
+    resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
+    engines: {node: '>=8'}
+    dependencies:
+      slice-ansi: 3.0.0
+      string-width: 4.2.3
+    dev: true
+
+  /cli-width@3.0.0:
+    resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+    engines: {node: '>= 10'}
+    dev: true
+
+  /cliui@8.0.1:
+    resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+    dev: true
+
+  /clone-deep@4.0.1:
+    resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
+    engines: {node: '>=6'}
+    dependencies:
+      is-plain-object: 2.0.4
+      kind-of: 6.0.3
+      shallow-clone: 3.0.1
+    dev: true
+
+  /clone-response@1.0.3:
+    resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
+    dependencies:
+      mimic-response: 1.0.1
+    dev: false
+
+  /clone@1.0.4:
+    resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+    engines: {node: '>=0.8'}
+    dev: true
+
+  /color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+    dependencies:
+      color-name: 1.1.4
+    dev: true
+
+  /color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+    dev: true
+
+  /colorette@2.0.20:
+    resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+    dev: true
+
+  /combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      delayed-stream: 1.0.0
+
+  /commander@10.0.1:
+    resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+    engines: {node: '>=14'}
+    dev: true
+
+  /commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+    dev: true
+
+  /commander@4.1.1:
+    resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /commander@6.2.1:
+    resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /common-tags@1.8.2:
+    resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
+    engines: {node: '>=4.0.0'}
+    dev: true
+
+  /compress-commons@4.1.2:
+    resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==}
+    engines: {node: '>= 10'}
+    dependencies:
+      buffer-crc32: 0.2.13
+      crc32-stream: 4.0.3
+      normalize-path: 3.0.0
+      readable-stream: 3.6.2
+    dev: true
+
+  /compressible@2.0.18:
+    resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      mime-db: 1.52.0
+
+  /compression@1.7.4:
+    resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      accepts: 1.3.8
+      bytes: 3.0.0
+      compressible: 2.0.18
+      debug: 2.6.9
+      on-headers: 1.0.2
+      safe-buffer: 5.1.2
+      vary: 1.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  /concat-map@0.0.1:
+    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+  /concat-stream@1.6.2:
+    resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
+    engines: {'0': node >= 0.8}
+    dependencies:
+      buffer-from: 1.1.2
+      inherits: 2.0.4
+      readable-stream: 2.3.8
+      typedarray: 0.0.6
+    dev: false
+
+  /config-chain@1.1.13:
+    resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+    dependencies:
+      ini: 1.3.8
+      proto-list: 1.2.4
+
+  /configstore@6.0.0:
+    resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==}
+    engines: {node: '>=12'}
+    dependencies:
+      dot-prop: 6.0.1
+      graceful-fs: 4.2.11
+      unique-string: 3.0.0
+      write-file-atomic: 3.0.3
+      xdg-basedir: 5.1.0
+    dev: false
+
+  /connect-history-api-fallback@2.0.0:
+    resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==}
+    engines: {node: '>=0.8'}
+    dev: false
+
+  /content-disposition@0.5.4:
+    resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      safe-buffer: 5.2.1
+
+  /content-type@1.0.5:
+    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+    engines: {node: '>= 0.6'}
+
+  /cookie-signature@1.0.6:
+    resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+  /cookie@0.5.0:
+    resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+    engines: {node: '>= 0.6'}
+
+  /core-util-is@1.0.2:
+    resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
+    dev: true
+
+  /core-util-is@1.0.3:
+    resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+  /cors@2.8.5:
+    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+    engines: {node: '>= 0.10'}
+    dependencies:
+      object-assign: 4.1.1
+      vary: 1.1.2
+    dev: false
+
+  /crc-32@1.2.2:
+    resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
+    engines: {node: '>=0.8'}
+    hasBin: true
+    dev: true
+
+  /crc32-stream@4.0.3:
+    resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==}
+    engines: {node: '>= 10'}
+    dependencies:
+      crc-32: 1.2.2
+      readable-stream: 3.6.2
+    dev: true
+
+  /croppie@2.6.5:
+    resolution: {integrity: sha512-IlChnVUGG5T3w2gRZIaQgBtlvyuYnlUWs2YZIXXR3H9KrlO1PtBT3j+ykxvy9eZIWhk+V5SpBmhCQz5UXKrEKQ==}
+    dev: false
+
+  /cross-spawn@7.0.3:
+    resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+    engines: {node: '>= 8'}
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  /crypto-random-string@4.0.0:
+    resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==}
+    engines: {node: '>=12'}
+    dependencies:
+      type-fest: 1.4.0
+    dev: false
+
+  /css.escape@1.5.1:
+    resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+    dev: true
+
+  /cssesc@3.0.0:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+    dev: true
+
+  /csstype@3.1.3:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+  /cypress@12.17.4:
+    resolution: {integrity: sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==}
+    engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0}
+    hasBin: true
+    requiresBuild: true
+    dependencies:
+      '@cypress/request': 2.88.12
+      '@cypress/xvfb': 1.2.4(supports-color@8.1.1)
+      '@types/node': 16.18.82
+      '@types/sinonjs__fake-timers': 8.1.1
+      '@types/sizzle': 2.3.8
+      arch: 2.2.0
+      blob-util: 2.0.2
+      bluebird: 3.7.2
+      buffer: 5.7.1
+      cachedir: 2.4.0
+      chalk: 4.1.2
+      check-more-types: 2.24.0
+      cli-cursor: 3.1.0
+      cli-table3: 0.6.3
+      commander: 6.2.1
+      common-tags: 1.8.2
+      dayjs: 1.11.10
+      debug: 4.3.4(supports-color@8.1.1)
+      enquirer: 2.4.1
+      eventemitter2: 6.4.7
+      execa: 4.1.0
+      executable: 4.1.1
+      extract-zip: 2.0.1(supports-color@8.1.1)
+      figures: 3.2.0
+      fs-extra: 9.1.0
+      getos: 3.2.1
+      is-ci: 3.0.1
+      is-installed-globally: 0.4.0
+      lazy-ass: 1.6.0
+      listr2: 3.14.0(enquirer@2.4.1)
+      lodash: 4.17.21
+      log-symbols: 4.1.0
+      minimist: 1.2.8
+      ospath: 1.2.2
+      pretty-bytes: 5.6.0
+      process: 0.11.10
+      proxy-from-env: 1.0.0
+      request-progress: 3.0.0
+      semver: 7.6.0
+      supports-color: 8.1.1
+      tmp: 0.2.1
+      untildify: 4.0.0
+      yauzl: 2.10.0
+    dev: true
+
+  /dashdash@1.14.1:
+    resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
+    engines: {node: '>=0.10'}
+    dependencies:
+      assert-plus: 1.0.0
+    dev: true
+
+  /dayjs@1.11.10:
+    resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
+    dev: true
+
+  /debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dependencies:
+      ms: 2.0.0
+
+  /debug@3.1.0:
+    resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dependencies:
+      ms: 2.0.0
+    dev: false
+
+  /debug@3.2.7(supports-color@8.1.1):
+    resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dependencies:
+      ms: 2.1.3
+      supports-color: 8.1.1
+    dev: true
+
+  /debug@4.3.4(supports-color@8.1.1):
+    resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dependencies:
+      ms: 2.1.2
+      supports-color: 8.1.1
+
+  /decompress-response@6.0.0:
+    resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      mimic-response: 3.1.0
+    dev: false
+
+  /deep-eql@4.1.3:
+    resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
+    engines: {node: '>=6'}
+    dependencies:
+      type-detect: 4.0.8
+    dev: true
+
+  /deep-extend@0.6.0:
+    resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+    engines: {node: '>=4.0.0'}
+    dev: false
+
+  /deep-is@0.1.4:
+    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+    dev: true
+
+  /default-browser-id@3.0.0:
+    resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
+    engines: {node: '>=12'}
+    dependencies:
+      bplist-parser: 0.2.0
+      untildify: 4.0.0
+    dev: false
+
+  /default-browser@4.0.0:
+    resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      bundle-name: 3.0.0
+      default-browser-id: 3.0.0
+      execa: 7.2.0
+      titleize: 3.0.0
+    dev: false
+
+  /defaults@1.0.4:
+    resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+    dependencies:
+      clone: 1.0.4
+    dev: true
+
+  /defer-to-connect@2.0.1:
+    resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      es-define-property: 1.0.0
+      es-errors: 1.3.0
+      gopd: 1.0.1
+
+  /define-lazy-prop@2.0.0:
+    resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /define-lazy-prop@3.0.0:
+    resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+    engines: {node: '>=12'}
+    dev: false
+
+  /delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+
+  /depd@2.0.0:
+    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+    engines: {node: '>= 0.8'}
+
+  /destroy@1.2.0:
+    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+  /diff-sequences@29.6.3:
+    resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dev: true
+
+  /doctrine@3.0.0:
+    resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      esutils: 2.0.3
+    dev: true
+
+  /dot-prop@6.0.1:
+    resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
+    engines: {node: '>=10'}
+    dependencies:
+      is-obj: 2.0.0
+
+  /eastasianwidth@0.2.0:
+    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+  /ecc-jsbn@0.1.2:
+    resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
+    dependencies:
+      jsbn: 0.1.1
+      safer-buffer: 2.1.2
+    dev: true
+
+  /editorconfig@1.0.4:
+    resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
+    engines: {node: '>=14'}
+    hasBin: true
+    dependencies:
+      '@one-ini/wasm': 0.1.1
+      commander: 10.0.1
+      minimatch: 9.0.1
+      semver: 7.6.0
+    dev: true
+
+  /ee-first@1.1.1:
+    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+  /electron-to-chromium@1.4.677:
+    resolution: {integrity: sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==}
+    dev: true
+
+  /elementtree@0.1.7:
+    resolution: {integrity: sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==}
+    engines: {node: '>= 0.4.0'}
+    dependencies:
+      sax: 1.1.4
+    dev: true
+
+  /emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  /emoji-regex@9.2.2:
+    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+  /encodeurl@1.0.2:
+    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+    engines: {node: '>= 0.8'}
+
+  /end-of-stream@1.4.4:
+    resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+    dependencies:
+      once: 1.4.0
+
+  /enquirer@2.4.1:
+    resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
+    engines: {node: '>=8.6'}
+    dependencies:
+      ansi-colors: 4.1.3
+      strip-ansi: 6.0.1
+    dev: true
+
+  /entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  /es-define-property@1.0.0:
+    resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      get-intrinsic: 1.2.4
+
+  /es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+
+  /esbuild-android-64@0.14.51:
+    resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-android-arm64@0.14.51:
+    resolution: {integrity: sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-darwin-64@0.14.51:
+    resolution: {integrity: sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-darwin-arm64@0.14.51:
+    resolution: {integrity: sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-freebsd-64@0.14.51:
+    resolution: {integrity: sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-freebsd-arm64@0.14.51:
+    resolution: {integrity: sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-32@0.14.51:
+    resolution: {integrity: sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-64@0.14.51:
+    resolution: {integrity: sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-arm64@0.14.51:
+    resolution: {integrity: sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-arm@0.14.51:
+    resolution: {integrity: sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-mips64le@0.14.51:
+    resolution: {integrity: sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-ppc64le@0.14.51:
+    resolution: {integrity: sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-riscv64@0.14.51:
+    resolution: {integrity: sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-s390x@0.14.51:
+    resolution: {integrity: sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-netbsd-64@0.14.51:
+    resolution: {integrity: sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-openbsd-64@0.14.51:
+    resolution: {integrity: sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-sunos-64@0.14.51:
+    resolution: {integrity: sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-32@0.14.51:
+    resolution: {integrity: sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-64@0.14.51:
+    resolution: {integrity: sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-arm64@0.14.51:
+    resolution: {integrity: sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild@0.14.51:
+    resolution: {integrity: sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      esbuild-android-64: 0.14.51
+      esbuild-android-arm64: 0.14.51
+      esbuild-darwin-64: 0.14.51
+      esbuild-darwin-arm64: 0.14.51
+      esbuild-freebsd-64: 0.14.51
+      esbuild-freebsd-arm64: 0.14.51
+      esbuild-linux-32: 0.14.51
+      esbuild-linux-64: 0.14.51
+      esbuild-linux-arm: 0.14.51
+      esbuild-linux-arm64: 0.14.51
+      esbuild-linux-mips64le: 0.14.51
+      esbuild-linux-ppc64le: 0.14.51
+      esbuild-linux-riscv64: 0.14.51
+      esbuild-linux-s390x: 0.14.51
+      esbuild-netbsd-64: 0.14.51
+      esbuild-openbsd-64: 0.14.51
+      esbuild-sunos-64: 0.14.51
+      esbuild-windows-32: 0.14.51
+      esbuild-windows-64: 0.14.51
+      esbuild-windows-arm64: 0.14.51
+    dev: true
+
+  /esbuild@0.19.12:
+    resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.19.12
+      '@esbuild/android-arm': 0.19.12
+      '@esbuild/android-arm64': 0.19.12
+      '@esbuild/android-x64': 0.19.12
+      '@esbuild/darwin-arm64': 0.19.12
+      '@esbuild/darwin-x64': 0.19.12
+      '@esbuild/freebsd-arm64': 0.19.12
+      '@esbuild/freebsd-x64': 0.19.12
+      '@esbuild/linux-arm': 0.19.12
+      '@esbuild/linux-arm64': 0.19.12
+      '@esbuild/linux-ia32': 0.19.12
+      '@esbuild/linux-loong64': 0.19.12
+      '@esbuild/linux-mips64el': 0.19.12
+      '@esbuild/linux-ppc64': 0.19.12
+      '@esbuild/linux-riscv64': 0.19.12
+      '@esbuild/linux-s390x': 0.19.12
+      '@esbuild/linux-x64': 0.19.12
+      '@esbuild/netbsd-x64': 0.19.12
+      '@esbuild/openbsd-x64': 0.19.12
+      '@esbuild/sunos-x64': 0.19.12
+      '@esbuild/win32-arm64': 0.19.12
+      '@esbuild/win32-ia32': 0.19.12
+      '@esbuild/win32-x64': 0.19.12
+    dev: true
+
+  /escalade@3.1.2:
+    resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /escape-goat@4.0.0:
+    resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==}
+    engines: {node: '>=12'}
+    dev: false
+
+  /escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+  /escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+    dev: true
+
+  /escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /eslint-config-prettier@8.10.0(eslint@8.56.0):
+    resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+    hasBin: true
+    peerDependencies:
+      eslint: '>=7.0.0'
+    dependencies:
+      eslint: 8.56.0
+    dev: true
+
+  /eslint-plugin-cypress@2.15.1(eslint@8.56.0):
+    resolution: {integrity: sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==}
+    peerDependencies:
+      eslint: '>= 3.2.1'
+    dependencies:
+      eslint: 8.56.0
+      globals: 13.24.0
+    dev: true
+
+  /eslint-plugin-vue@9.21.1(eslint@8.56.0):
+    resolution: {integrity: sha512-XVtI7z39yOVBFJyi8Ljbn7kY9yHzznKXL02qQYn+ta63Iy4A9JFBw6o4OSB9hyD2++tVT+su9kQqetUyCCwhjw==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+      eslint: 8.56.0
+      natural-compare: 1.4.0
+      nth-check: 2.1.1
+      postcss-selector-parser: 6.0.15
+      semver: 7.6.0
+      vue-eslint-parser: 9.4.2(eslint@8.56.0)
+      xml-name-validator: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint-scope@7.2.2:
+    resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
+    dev: true
+
+  /eslint-utils@2.1.0:
+    resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
+    engines: {node: '>=6'}
+    dependencies:
+      eslint-visitor-keys: 1.3.0
+    dev: true
+
+  /eslint-visitor-keys@1.3.0:
+    resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /eslint-visitor-keys@3.4.3:
+    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dev: true
+
+  /eslint@8.56.0:
+    resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    hasBin: true
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+      '@eslint-community/regexpp': 4.10.0
+      '@eslint/eslintrc': 2.1.4
+      '@eslint/js': 8.56.0
+      '@humanwhocodes/config-array': 0.11.14
+      '@humanwhocodes/module-importer': 1.0.1
+      '@nodelib/fs.walk': 1.2.8
+      '@ungap/structured-clone': 1.2.0
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.3
+      debug: 4.3.4(supports-color@8.1.1)
+      doctrine: 3.0.0
+      escape-string-regexp: 4.0.0
+      eslint-scope: 7.2.2
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      esquery: 1.5.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 6.0.1
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      globals: 13.24.0
+      graphemer: 1.4.0
+      ignore: 5.3.1
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      is-path-inside: 3.0.3
+      js-yaml: 4.1.0
+      json-stable-stringify-without-jsonify: 1.0.1
+      levn: 0.4.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.3
+      strip-ansi: 6.0.1
+      text-table: 0.2.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /espree@6.2.1:
+    resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      acorn: 7.4.1
+      acorn-jsx: 5.3.2(acorn@7.4.1)
+      eslint-visitor-keys: 1.3.0
+    dev: true
+
+  /espree@9.6.1:
+    resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      acorn: 8.11.3
+      acorn-jsx: 5.3.2(acorn@8.11.3)
+      eslint-visitor-keys: 3.4.3
+    dev: true
+
+  /esquery@1.5.0:
+    resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+    engines: {node: '>=0.10'}
+    dependencies:
+      estraverse: 5.3.0
+    dev: true
+
+  /esrecurse@4.3.0:
+    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+    engines: {node: '>=4.0'}
+    dependencies:
+      estraverse: 5.3.0
+    dev: true
+
+  /estraverse@5.3.0:
+    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+    engines: {node: '>=4.0'}
+    dev: true
+
+  /estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  /estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+    dependencies:
+      '@types/estree': 1.0.5
+    dev: true
+
+  /esutils@2.0.3:
+    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+
+  /eventemitter2@6.4.7:
+    resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
+    dev: true
+
+  /eventemitter3@4.0.7:
+    resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+    dev: false
+
+  /execa@4.1.0:
+    resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
+    engines: {node: '>=10'}
+    dependencies:
+      cross-spawn: 7.0.3
+      get-stream: 5.2.0
+      human-signals: 1.1.1
+      is-stream: 2.0.1
+      merge-stream: 2.0.0
+      npm-run-path: 4.0.1
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+      strip-final-newline: 2.0.0
+    dev: true
+
+  /execa@5.1.1:
+    resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+    engines: {node: '>=10'}
+    dependencies:
+      cross-spawn: 7.0.3
+      get-stream: 6.0.1
+      human-signals: 2.1.0
+      is-stream: 2.0.1
+      merge-stream: 2.0.0
+      npm-run-path: 4.0.1
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+      strip-final-newline: 2.0.0
+    dev: false
+
+  /execa@7.2.0:
+    resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
+    engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
+    dependencies:
+      cross-spawn: 7.0.3
+      get-stream: 6.0.1
+      human-signals: 4.3.1
+      is-stream: 3.0.0
+      merge-stream: 2.0.0
+      npm-run-path: 5.2.0
+      onetime: 6.0.0
+      signal-exit: 3.0.7
+      strip-final-newline: 3.0.0
+    dev: false
+
+  /execa@8.0.1:
+    resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+    engines: {node: '>=16.17'}
+    dependencies:
+      cross-spawn: 7.0.3
+      get-stream: 8.0.1
+      human-signals: 5.0.0
+      is-stream: 3.0.0
+      merge-stream: 2.0.0
+      npm-run-path: 5.2.0
+      onetime: 6.0.0
+      signal-exit: 4.1.0
+      strip-final-newline: 3.0.0
+    dev: true
+
+  /executable@4.1.1:
+    resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
+    engines: {node: '>=4'}
+    dependencies:
+      pify: 2.3.0
+    dev: true
+
+  /express@4.18.2:
+    resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
+    engines: {node: '>= 0.10.0'}
+    dependencies:
+      accepts: 1.3.8
+      array-flatten: 1.1.1
+      body-parser: 1.20.1
+      content-disposition: 0.5.4
+      content-type: 1.0.5
+      cookie: 0.5.0
+      cookie-signature: 1.0.6
+      debug: 2.6.9
+      depd: 2.0.0
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      etag: 1.8.1
+      finalhandler: 1.2.0
+      fresh: 0.5.2
+      http-errors: 2.0.0
+      merge-descriptors: 1.0.1
+      methods: 1.1.2
+      on-finished: 2.4.1
+      parseurl: 1.3.3
+      path-to-regexp: 0.1.7
+      proxy-addr: 2.0.7
+      qs: 6.11.0
+      range-parser: 1.2.1
+      safe-buffer: 5.2.1
+      send: 0.18.0
+      serve-static: 1.15.0
+      setprototypeof: 1.2.0
+      statuses: 2.0.1
+      type-is: 1.6.18
+      utils-merge: 1.0.1
+      vary: 1.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  /extend@3.0.2:
+    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+    dev: true
+
+  /external-editor@3.1.0:
+    resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+    engines: {node: '>=4'}
+    dependencies:
+      chardet: 0.7.0
+      iconv-lite: 0.4.24
+      tmp: 0.0.33
+    dev: true
+
+  /extract-zip@1.7.0:
+    resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==}
+    hasBin: true
+    dependencies:
+      concat-stream: 1.6.2
+      debug: 2.6.9
+      mkdirp: 0.5.6
+      yauzl: 2.10.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
+  /extract-zip@2.0.1(supports-color@8.1.1):
+    resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
+    engines: {node: '>= 10.17.0'}
+    hasBin: true
+    dependencies:
+      debug: 4.3.4(supports-color@8.1.1)
+      get-stream: 5.2.0
+      yauzl: 2.10.0
+    optionalDependencies:
+      '@types/yauzl': 2.10.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /extsprintf@1.3.0:
+    resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
+    engines: {'0': node >=0.6.0}
+    dev: true
+
+  /fast-deep-equal@3.1.3:
+    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+    dev: true
+
+  /fast-glob@3.2.12:
+    resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
+    engines: {node: '>=8.6.0'}
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.5
+    dev: true
+
+  /fast-glob@3.3.2:
+    resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+    engines: {node: '>=8.6.0'}
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.5
+    dev: true
+
+  /fast-json-stable-stringify@2.1.0:
+    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+    dev: true
+
+  /fast-levenshtein@2.0.6:
+    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+    dev: true
+
+  /fastq@1.17.1:
+    resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+    dependencies:
+      reusify: 1.0.4
+    dev: true
+
+  /fd-slicer@1.1.0:
+    resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+    dependencies:
+      pend: 1.2.0
+
+  /figures@3.2.0:
+    resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+    engines: {node: '>=8'}
+    dependencies:
+      escape-string-regexp: 1.0.5
+    dev: true
+
+  /file-entry-cache@6.0.1:
+    resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    dependencies:
+      flat-cache: 3.2.0
+    dev: true
+
+  /fill-range@7.0.1:
+    resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      to-regex-range: 5.0.1
+
+  /finalhandler@1.2.0:
+    resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      debug: 2.6.9
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      on-finished: 2.4.1
+      parseurl: 1.3.3
+      statuses: 2.0.1
+      unpipe: 1.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  /find-up@5.0.0:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+    dependencies:
+      locate-path: 6.0.0
+      path-exists: 4.0.0
+    dev: true
+
+  /flat-cache@3.2.0:
+    resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    dependencies:
+      flatted: 3.3.1
+      keyv: 4.5.4
+      rimraf: 3.0.2
+    dev: true
+
+  /flat@5.0.2:
+    resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+    hasBin: true
+    dev: true
+
+  /flatted@3.3.1:
+    resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+    dev: true
+
+  /follow-redirects@1.15.5:
+    resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+    dev: false
+
+  /foreground-child@3.1.1:
+    resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
+    engines: {node: '>=14'}
+    dependencies:
+      cross-spawn: 7.0.3
+      signal-exit: 4.1.0
+    dev: true
+
+  /forever-agent@0.6.1:
+    resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
+    dev: true
+
+  /form-data-encoder@2.1.4:
+    resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
+    engines: {node: '>= 14.17'}
+    dev: false
+
+  /form-data@2.3.3:
+    resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
+    engines: {node: '>= 0.12'}
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      mime-types: 2.1.35
+    dev: true
+
+  /form-data@4.0.0:
+    resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+    engines: {node: '>= 6'}
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      mime-types: 2.1.35
+    dev: false
+
+  /forwarded@0.2.0:
+    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+    engines: {node: '>= 0.6'}
+
+  /fraction.js@4.3.7:
+    resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+    dev: true
+
+  /fresh@0.5.2:
+    resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+    engines: {node: '>= 0.6'}
+
+  /fs-constants@1.0.0:
+    resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+    dev: true
+
+  /fs-extra@11.2.0:
+    resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+    engines: {node: '>=14.14'}
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.1
+
+  /fs-extra@9.1.0:
+    resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      at-least-node: 1.0.0
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.1
+    dev: true
+
+  /fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+  /fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+  /get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+    dev: true
+
+  /get-func-name@2.0.2:
+    resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+    dev: true
+
+  /get-intrinsic@1.2.4:
+    resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      has-proto: 1.0.3
+      has-symbols: 1.0.3
+      hasown: 2.0.1
+
+  /get-stream@5.2.0:
+    resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+    engines: {node: '>=8'}
+    dependencies:
+      pump: 3.0.0
+
+  /get-stream@6.0.1:
+    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /get-stream@8.0.1:
+    resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+    engines: {node: '>=16'}
+    dev: true
+
+  /getos@3.2.1:
+    resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
+    dependencies:
+      async: 3.2.5
+    dev: true
+
+  /getpass@0.1.7:
+    resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
+    dependencies:
+      assert-plus: 1.0.0
+    dev: true
+
+  /glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+    dependencies:
+      is-glob: 4.0.3
+    dev: true
+
+  /glob-parent@6.0.2:
+    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+    engines: {node: '>=10.13.0'}
+    dependencies:
+      is-glob: 4.0.3
+    dev: true
+
+  /glob-regex@0.3.2:
+    resolution: {integrity: sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==}
+    dev: true
+
+  /glob@10.3.10:
+    resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    hasBin: true
+    dependencies:
+      foreground-child: 3.1.1
+      jackspeak: 2.3.6
+      minimatch: 9.0.3
+      minipass: 7.0.4
+      path-scurry: 1.10.1
+    dev: true
+
+  /glob@7.2.3:
+    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    dependencies:
+      fs.realpath: 1.0.0
+      inflight: 1.0.6
+      inherits: 2.0.4
+      minimatch: 3.1.2
+      once: 1.4.0
+      path-is-absolute: 1.0.1
+
+  /global-dirs@3.0.1:
+    resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
+    engines: {node: '>=10'}
+    dependencies:
+      ini: 2.0.0
+
+  /globals@13.24.0:
+    resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      type-fest: 0.20.2
+    dev: true
+
+  /globrex@0.1.2:
+    resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+    dev: true
+
+  /gopd@1.0.1:
+    resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+    dependencies:
+      get-intrinsic: 1.2.4
+
+  /got@11.8.6:
+    resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
+    engines: {node: '>=10.19.0'}
+    dependencies:
+      '@sindresorhus/is': 4.6.0
+      '@szmarczak/http-timer': 4.0.6
+      '@types/cacheable-request': 6.0.3
+      '@types/responselike': 1.0.3
+      cacheable-lookup: 5.0.4
+      cacheable-request: 7.0.4
+      decompress-response: 6.0.0
+      http2-wrapper: 1.0.3
+      lowercase-keys: 2.0.0
+      p-cancelable: 2.1.1
+      responselike: 2.0.1
+    dev: false
+
+  /got@12.6.1:
+    resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      '@sindresorhus/is': 5.6.0
+      '@szmarczak/http-timer': 5.0.1
+      cacheable-lookup: 7.0.0
+      cacheable-request: 10.2.14
+      decompress-response: 6.0.0
+      form-data-encoder: 2.1.4
+      get-stream: 6.0.1
+      http2-wrapper: 2.2.1
+      lowercase-keys: 3.0.0
+      p-cancelable: 3.0.0
+      responselike: 3.0.0
+    dev: false
+
+  /graceful-fs@4.2.10:
+    resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+    dev: false
+
+  /graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  /graphemer@1.4.0:
+    resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+    dev: true
+
+  /happy-dom@11.2.0:
+    resolution: {integrity: sha512-z4PshcYIIH6SkymSNRcDFwYUJOENe+FOQDx5BbHgg/wQUgxF5p9I9/BN45Jff34bbhXV8yJgkC5N99eyOzXK3w==}
+    dependencies:
+      css.escape: 1.5.1
+      entities: 4.5.0
+      iconv-lite: 0.6.3
+      webidl-conversions: 7.0.0
+      whatwg-encoding: 2.0.0
+      whatwg-mimetype: 3.0.0
+    dev: true
+
+  /has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  /has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+    dependencies:
+      es-define-property: 1.0.0
+
+  /has-proto@1.0.3:
+    resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+    engines: {node: '>= 0.4'}
+
+  /has-symbols@1.0.3:
+    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+    engines: {node: '>= 0.4'}
+
+  /has-yarn@3.0.0:
+    resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: false
+
+  /hasown@2.0.1:
+    resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      function-bind: 1.1.2
+
+  /he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+    dev: true
+
+  /html-minifier@4.0.0:
+    resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==}
+    engines: {node: '>=6'}
+    hasBin: true
+    dependencies:
+      camel-case: 3.0.0
+      clean-css: 4.2.4
+      commander: 2.20.3
+      he: 1.2.0
+      param-case: 2.1.1
+      relateurl: 0.2.7
+      uglify-js: 3.17.4
+    dev: true
+
+  /http-cache-semantics@4.1.1:
+    resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+    dev: false
+
+  /http-errors@2.0.0:
+    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      depd: 2.0.0
+      inherits: 2.0.4
+      setprototypeof: 1.2.0
+      statuses: 2.0.1
+      toidentifier: 1.0.1
+
+  /http-proxy-middleware@2.0.6:
+    resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      '@types/express': ^4.17.13
+    peerDependenciesMeta:
+      '@types/express':
+        optional: true
+    dependencies:
+      '@types/http-proxy': 1.17.14
+      http-proxy: 1.18.1
+      is-glob: 4.0.3
+      is-plain-obj: 3.0.0
+      micromatch: 4.0.5
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
+  /http-proxy@1.18.1:
+    resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
+    engines: {node: '>=8.0.0'}
+    dependencies:
+      eventemitter3: 4.0.7
+      follow-redirects: 1.15.5
+      requires-port: 1.0.0
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
+  /http-signature@1.3.6:
+    resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==}
+    engines: {node: '>=0.10'}
+    dependencies:
+      assert-plus: 1.0.0
+      jsprim: 2.0.2
+      sshpk: 1.18.0
+    dev: true
+
+  /http2-wrapper@1.0.3:
+    resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
+    engines: {node: '>=10.19.0'}
+    dependencies:
+      quick-lru: 5.1.1
+      resolve-alpn: 1.2.1
+    dev: false
+
+  /http2-wrapper@2.2.1:
+    resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
+    engines: {node: '>=10.19.0'}
+    dependencies:
+      quick-lru: 5.1.1
+      resolve-alpn: 1.2.1
+    dev: false
+
+  /human-signals@1.1.1:
+    resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
+    engines: {node: '>=8.12.0'}
+    dev: true
+
+  /human-signals@2.1.0:
+    resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+    engines: {node: '>=10.17.0'}
+    dev: false
+
+  /human-signals@4.3.1:
+    resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
+    engines: {node: '>=14.18.0'}
+    dev: false
+
+  /human-signals@5.0.0:
+    resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+    engines: {node: '>=16.17.0'}
+    dev: true
+
+  /iconv-lite@0.4.24:
+    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      safer-buffer: 2.1.2
+
+  /iconv-lite@0.6.3:
+    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      safer-buffer: 2.1.2
+    dev: true
+
+  /ieee754@1.2.1:
+    resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+    dev: true
+
+  /ignore@5.3.1:
+    resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
+    engines: {node: '>= 4'}
+    dev: true
+
+  /immutable@4.3.5:
+    resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==}
+    dev: true
+
+  /import-fresh@3.3.0:
+    resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+    engines: {node: '>=6'}
+    dependencies:
+      parent-module: 1.0.1
+      resolve-from: 4.0.0
+    dev: true
+
+  /import-lazy@4.0.0:
+    resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+    engines: {node: '>=8'}
+    dev: false
+
+  /imurmurhash@0.1.4:
+    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+    engines: {node: '>=0.8.19'}
+
+  /indent-string@4.0.0:
+    resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /inflight@1.0.6:
+    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    dependencies:
+      once: 1.4.0
+      wrappy: 1.0.2
+
+  /inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  /ini@1.3.8:
+    resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+  /ini@2.0.0:
+    resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
+    engines: {node: '>=10'}
+
+  /inquirer@8.2.6:
+    resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+    engines: {node: '>=12.0.0'}
+    dependencies:
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      cli-cursor: 3.1.0
+      cli-width: 3.0.0
+      external-editor: 3.1.0
+      figures: 3.2.0
+      lodash: 4.17.21
+      mute-stream: 0.0.8
+      ora: 5.4.1
+      run-async: 2.4.1
+      rxjs: 7.8.1
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      through: 2.3.8
+      wrap-ansi: 6.2.0
+    dev: true
+
+  /ipaddr.js@1.9.1:
+    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+    engines: {node: '>= 0.10'}
+
+  /is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+    dependencies:
+      binary-extensions: 2.2.0
+    dev: true
+
+  /is-ci@3.0.1:
+    resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
+    hasBin: true
+    dependencies:
+      ci-info: 3.9.0
+
+  /is-core-module@2.13.1:
+    resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+    dependencies:
+      hasown: 2.0.1
+    dev: true
+
+  /is-docker@2.2.1:
+    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  /is-docker@3.0.0:
+    resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    hasBin: true
+    dev: false
+
+  /is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  /is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  /is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      is-extglob: 2.1.1
+
+  /is-inside-container@1.0.0:
+    resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+    engines: {node: '>=14.16'}
+    hasBin: true
+    dependencies:
+      is-docker: 3.0.0
+    dev: false
+
+  /is-installed-globally@0.4.0:
+    resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      global-dirs: 3.0.1
+      is-path-inside: 3.0.3
+
+  /is-interactive@1.0.0:
+    resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /is-npm@6.0.0:
+    resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: false
+
+  /is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  /is-obj@2.0.0:
+    resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+    engines: {node: '>=8'}
+
+  /is-path-inside@3.0.3:
+    resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+    engines: {node: '>=8'}
+
+  /is-plain-obj@3.0.0:
+    resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /is-plain-object@2.0.4:
+    resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      isobject: 3.0.1
+    dev: true
+
+  /is-stream@2.0.1:
+    resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+    engines: {node: '>=8'}
+
+  /is-stream@3.0.0:
+    resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  /is-typedarray@1.0.0:
+    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+
+  /is-unicode-supported@0.1.0:
+    resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
+    dependencies:
+      is-docker: 2.2.1
+
+  /is-yarn-global@0.4.1:
+    resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==}
+    engines: {node: '>=12'}
+    dev: false
+
+  /isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+  /isbinaryfile@5.0.2:
+    resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==}
+    engines: {node: '>= 18.0.0'}
+    dev: true
+
+  /isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  /isobject@3.0.1:
+    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /isstream@0.1.2:
+    resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
+    dev: true
+
+  /jackspeak@2.3.6:
+    resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
+    engines: {node: '>=14'}
+    dependencies:
+      '@isaacs/cliui': 8.0.2
+    optionalDependencies:
+      '@pkgjs/parseargs': 0.11.0
+    dev: true
+
+  /js-beautify@1.15.1:
+    resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==}
+    engines: {node: '>=14'}
+    hasBin: true
+    dependencies:
+      config-chain: 1.1.13
+      editorconfig: 1.0.4
+      glob: 10.3.10
+      js-cookie: 3.0.5
+      nopt: 7.2.0
+    dev: true
+
+  /js-cookie@3.0.5:
+    resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+    engines: {node: '>=14'}
+    dev: true
+
+  /js-tokens@8.0.3:
+    resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==}
+    dev: true
+
+  /js-yaml@4.1.0:
+    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+    hasBin: true
+    dependencies:
+      argparse: 2.0.1
+    dev: true
+
+  /jsbn@0.1.1:
+    resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
+    dev: true
+
+  /json-buffer@3.0.1:
+    resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+  /json-schema-traverse@0.4.1:
+    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+    dev: true
+
+  /json-schema-traverse@1.0.0:
+    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+    dev: true
+
+  /json-schema@0.4.0:
+    resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+    dev: true
+
+  /json-stable-stringify-without-jsonify@1.0.1:
+    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+    dev: true
+
+  /json-stringify-safe@5.0.1:
+    resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+    dev: true
+
+  /json5@1.0.2:
+    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+    hasBin: true
+    dependencies:
+      minimist: 1.2.8
+    dev: true
+
+  /json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+    dev: true
+
+  /jsonc-eslint-parser@1.4.1:
+    resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==}
+    engines: {node: '>=8.10.0'}
+    dependencies:
+      acorn: 7.4.1
+      eslint-utils: 2.1.0
+      eslint-visitor-keys: 1.3.0
+      espree: 6.2.1
+      semver: 6.3.1
+    dev: true
+
+  /jsonc-parser@3.2.1:
+    resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
+    dev: true
+
+  /jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+    dependencies:
+      universalify: 2.0.1
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
+  /jsprim@2.0.2:
+    resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==}
+    engines: {'0': node >=0.6.0}
+    dependencies:
+      assert-plus: 1.0.0
+      extsprintf: 1.3.0
+      json-schema: 0.4.0
+      verror: 1.10.0
+    dev: true
+
+  /keyv@4.5.4:
+    resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+    dependencies:
+      json-buffer: 3.0.1
+
+  /kind-of@6.0.3:
+    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /kolorist@1.8.0:
+    resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+  /latest-version@7.0.0:
+    resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      package-json: 8.1.1
+    dev: false
+
+  /lazy-ass@1.6.0:
+    resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
+    engines: {node: '> 0.8'}
+    dev: true
+
+  /lazystream@1.0.1:
+    resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
+    engines: {node: '>= 0.6.3'}
+    dependencies:
+      readable-stream: 2.3.8
+    dev: true
+
+  /levn@0.4.1:
+    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+    dev: true
+
+  /lines-and-columns@1.2.4:
+    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+    dev: true
+
+  /listr2@3.14.0(enquirer@2.4.1):
+    resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      enquirer: '>= 2.3.0 < 3'
+    peerDependenciesMeta:
+      enquirer:
+        optional: true
+    dependencies:
+      cli-truncate: 2.1.0
+      colorette: 2.0.20
+      enquirer: 2.4.1
+      log-update: 4.0.0
+      p-map: 4.0.0
+      rfdc: 1.3.1
+      rxjs: 7.8.1
+      through: 2.3.8
+      wrap-ansi: 7.0.0
+    dev: true
+
+  /local-pkg@0.5.0:
+    resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+    engines: {node: '>=14'}
+    dependencies:
+      mlly: 1.5.0
+      pkg-types: 1.0.3
+    dev: true
+
+  /locate-path@6.0.0:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+    dependencies:
+      p-locate: 5.0.0
+    dev: true
+
+  /lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+    dev: true
+
+  /lodash.defaults@4.2.0:
+    resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
+    dev: true
+
+  /lodash.difference@4.5.0:
+    resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
+    dev: true
+
+  /lodash.flatten@4.4.0:
+    resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
+    dev: true
+
+  /lodash.isplainobject@4.0.6:
+    resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+    dev: true
+
+  /lodash.merge@4.6.2:
+    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+    dev: true
+
+  /lodash.once@4.1.1:
+    resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
+    dev: true
+
+  /lodash.truncate@4.4.2:
+    resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+    dev: true
+
+  /lodash.union@4.6.0:
+    resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
+    dev: true
+
+  /lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+    dev: true
+
+  /log-symbols@4.1.0:
+    resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+    engines: {node: '>=10'}
+    dependencies:
+      chalk: 4.1.2
+      is-unicode-supported: 0.1.0
+    dev: true
+
+  /log-update@4.0.0:
+    resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
+    engines: {node: '>=10'}
+    dependencies:
+      ansi-escapes: 4.3.2
+      cli-cursor: 3.1.0
+      slice-ansi: 4.0.0
+      wrap-ansi: 6.2.0
+    dev: true
+
+  /loupe@2.3.7:
+    resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+    dependencies:
+      get-func-name: 2.0.2
+    dev: true
+
+  /lower-case@1.1.4:
+    resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==}
+    dev: true
+
+  /lowercase-keys@2.0.0:
+    resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
+    engines: {node: '>=8'}
+    dev: false
+
+  /lowercase-keys@3.0.0:
+    resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: false
+
+  /lru-cache@10.2.0:
+    resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
+    engines: {node: 14 || >=16.14}
+    dev: true
+
+  /lru-cache@4.0.1:
+    resolution: {integrity: sha512-MX0ZnRoVTWXBiNe9dysqKXjvhmQgHsOirh/2rerIVJ8sbQeMxc5OPj0HDpVV3bYjdE6GTHrPf8BEHJqWHFkjHA==}
+    dependencies:
+      pseudomap: 1.0.2
+      yallist: 2.1.2
+    dev: false
+
+  /lru-cache@6.0.0:
+    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+    engines: {node: '>=10'}
+    dependencies:
+      yallist: 4.0.0
+
+  /magic-string@0.30.7:
+    resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==}
+    engines: {node: '>=12'}
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.4.15
+
+  /media-typer@0.3.0:
+    resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+    engines: {node: '>= 0.6'}
+
+  /merge-descriptors@1.0.1:
+    resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
+
+  /merge-stream@2.0.0:
+    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+  /merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+    dev: true
+
+  /methods@1.1.2:
+    resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+    engines: {node: '>= 0.6'}
+
+  /micromatch@4.0.5:
+    resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+    engines: {node: '>=8.6'}
+    dependencies:
+      braces: 3.0.2
+      picomatch: 2.3.1
+
+  /mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  /mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      mime-db: 1.52.0
+
+  /mime@1.6.0:
+    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  /mimic-fn@2.1.0:
+    resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+    engines: {node: '>=6'}
+
+  /mimic-fn@4.0.0:
+    resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+    engines: {node: '>=12'}
+
+  /mimic-response@1.0.1:
+    resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+    engines: {node: '>=4'}
+    dev: false
+
+  /mimic-response@3.1.0:
+    resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /mimic-response@4.0.0:
+    resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: false
+
+  /minimatch@3.1.2:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+    dependencies:
+      brace-expansion: 1.1.11
+
+  /minimatch@5.1.6:
+    resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+    engines: {node: '>=10'}
+    dependencies:
+      brace-expansion: 2.0.1
+    dev: true
+
+  /minimatch@9.0.1:
+    resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dependencies:
+      brace-expansion: 2.0.1
+    dev: true
+
+  /minimatch@9.0.3:
+    resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dependencies:
+      brace-expansion: 2.0.1
+    dev: true
+
+  /minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+  /minipass@7.0.4:
+    resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dev: true
+
+  /mkdirp@0.5.6:
+    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+    hasBin: true
+    dependencies:
+      minimist: 1.2.8
+    dev: false
+
+  /mlly@1.5.0:
+    resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==}
+    dependencies:
+      acorn: 8.11.3
+      pathe: 1.1.2
+      pkg-types: 1.0.3
+      ufo: 1.4.0
+    dev: true
+
+  /ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+  /ms@2.1.2:
+    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+  /ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  /mute-stream@0.0.8:
+    resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+    dev: true
+
+  /mz@2.7.0:
+    resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+    dependencies:
+      any-promise: 1.3.0
+      object-assign: 4.1.1
+      thenify-all: 1.6.0
+    dev: true
+
+  /nanoid@3.3.7:
+    resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  /natural-compare@1.4.0:
+    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+    dev: true
+
+  /negotiator@0.6.3:
+    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+    engines: {node: '>= 0.6'}
+
+  /no-case@2.3.2:
+    resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==}
+    dependencies:
+      lower-case: 1.1.4
+    dev: true
+
+  /node-forge@1.3.1:
+    resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
+    engines: {node: '>= 6.13.0'}
+    dev: false
+
+  /node-releases@2.0.14:
+    resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+    dev: true
+
+  /nopt@7.2.0:
+    resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+    hasBin: true
+    dependencies:
+      abbrev: 2.0.0
+    dev: true
+
+  /normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /normalize-range@0.1.2:
+    resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /normalize-url@6.1.0:
+    resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /normalize-url@8.0.0:
+    resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
+    engines: {node: '>=14.16'}
+    dev: false
+
+  /npm-run-path@4.0.1:
+    resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+    engines: {node: '>=8'}
+    dependencies:
+      path-key: 3.1.1
+
+  /npm-run-path@5.2.0:
+    resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dependencies:
+      path-key: 4.0.0
+
+  /nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+    dependencies:
+      boolbase: 1.0.0
+    dev: true
+
+  /object-assign@4.1.1:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
+
+  /object-inspect@1.13.1:
+    resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
+
+  /on-finished@2.4.1:
+    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      ee-first: 1.1.1
+
+  /on-headers@1.0.2:
+    resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
+    engines: {node: '>= 0.8'}
+
+  /once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+    dependencies:
+      wrappy: 1.0.2
+
+  /onetime@5.1.2:
+    resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+    engines: {node: '>=6'}
+    dependencies:
+      mimic-fn: 2.1.0
+
+  /onetime@6.0.0:
+    resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      mimic-fn: 4.0.0
+
+  /open@8.4.2:
+    resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      define-lazy-prop: 2.0.0
+      is-docker: 2.2.1
+      is-wsl: 2.2.0
+    dev: true
+
+  /open@9.1.0:
+    resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      default-browser: 4.0.0
+      define-lazy-prop: 3.0.0
+      is-inside-container: 1.0.0
+      is-wsl: 2.2.0
+    dev: false
+
+  /optionator@0.9.3:
+    resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      '@aashutoshrathi/word-wrap': 1.2.6
+      deep-is: 0.1.4
+      fast-levenshtein: 2.0.6
+      levn: 0.4.1
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+    dev: true
+
+  /ora@5.4.1:
+    resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      bl: 4.1.0
+      chalk: 4.1.2
+      cli-cursor: 3.1.0
+      cli-spinners: 2.9.2
+      is-interactive: 1.0.0
+      is-unicode-supported: 0.1.0
+      log-symbols: 4.1.0
+      strip-ansi: 6.0.1
+      wcwidth: 1.0.1
+    dev: true
+
+  /os-tmpdir@1.0.2:
+    resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+    engines: {node: '>=0.10.0'}
+
+  /ospath@1.2.2:
+    resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
+    dev: true
+
+  /p-cancelable@2.1.1:
+    resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
+    engines: {node: '>=8'}
+    dev: false
+
+  /p-cancelable@3.0.0:
+    resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
+    engines: {node: '>=12.20'}
+    dev: false
+
+  /p-limit@3.1.0:
+    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      yocto-queue: 0.1.0
+    dev: true
+
+  /p-limit@5.0.0:
+    resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
+    engines: {node: '>=18'}
+    dependencies:
+      yocto-queue: 1.0.0
+    dev: true
+
+  /p-locate@5.0.0:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+    dependencies:
+      p-limit: 3.1.0
+    dev: true
+
+  /p-map@4.0.0:
+    resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      aggregate-error: 3.1.0
+    dev: true
+
+  /package-json@8.1.1:
+    resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      got: 12.6.1
+      registry-auth-token: 5.0.2
+      registry-url: 6.0.1
+      semver: 7.6.0
+    dev: false
+
+  /param-case@2.1.1:
+    resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==}
+    dependencies:
+      no-case: 2.3.2
+    dev: true
+
+  /parent-module@1.0.1:
+    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+    engines: {node: '>=6'}
+    dependencies:
+      callsites: 3.1.0
+    dev: true
+
+  /parseurl@1.3.3:
+    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+    engines: {node: '>= 0.8'}
+
+  /path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /path-is-absolute@1.0.1:
+    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+    engines: {node: '>=0.10.0'}
+
+  /path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  /path-key@4.0.0:
+    resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+    engines: {node: '>=12'}
+
+  /path-parse@1.0.7:
+    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+    dev: true
+
+  /path-scurry@1.10.1:
+    resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dependencies:
+      lru-cache: 10.2.0
+      minipass: 7.0.4
+    dev: true
+
+  /path-to-regexp@0.1.7:
+    resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
+
+  /pathe@1.1.2:
+    resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+    dev: true
+
+  /pathval@1.1.1:
+    resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+    dev: true
+
+  /pend@1.2.0:
+    resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+
+  /performance-now@2.1.0:
+    resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+    dev: true
+
+  /picocolors@1.0.0:
+    resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+  /picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  /pify@2.3.0:
+    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /pinia@2.1.7(vue@3.4.19):
+    resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==}
+    peerDependencies:
+      '@vue/composition-api': ^1.4.0
+      typescript: '>=4.4.4'
+      vue: ^2.6.14 || ^3.3.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+      typescript:
+        optional: true
+    dependencies:
+      '@vue/devtools-api': 6.6.1
+      vue: 3.4.19
+      vue-demi: 0.14.7(vue@3.4.19)
+
+  /pirates@4.0.6:
+    resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /pkg-types@1.0.3:
+    resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+    dependencies:
+      jsonc-parser: 3.2.1
+      mlly: 1.5.0
+      pathe: 1.1.2
+    dev: true
+
+  /postcss-selector-parser@6.0.15:
+    resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==}
+    engines: {node: '>=4'}
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+    dev: true
+
+  /postcss-value-parser@4.2.0:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+    dev: true
+
+  /postcss@8.4.35:
+    resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.7
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
+
+  /prelude-ls@1.2.1:
+    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+    engines: {node: '>= 0.8.0'}
+    dev: true
+
+  /prettier@2.8.8:
+    resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    dev: true
+
+  /pretty-bytes@5.6.0:
+    resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /pretty-format@29.7.0:
+    resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/schemas': 29.6.3
+      ansi-styles: 5.2.0
+      react-is: 18.2.0
+    dev: true
+
+  /process-nextick-args@2.0.1:
+    resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+  /process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+    dev: true
+
+  /progress@2.0.3:
+    resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+    engines: {node: '>=0.4.0'}
+    dev: false
+
+  /proto-list@1.2.4:
+    resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
+  /proxy-addr@2.0.7:
+    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+    engines: {node: '>= 0.10'}
+    dependencies:
+      forwarded: 0.2.0
+      ipaddr.js: 1.9.1
+
+  /proxy-from-env@1.0.0:
+    resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
+    dev: true
+
+  /proxy-from-env@1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+    dev: false
+
+  /pseudomap@1.0.2:
+    resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
+    dev: false
+
+  /psl@1.9.0:
+    resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
+    dev: true
+
+  /pump@3.0.0:
+    resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+    dependencies:
+      end-of-stream: 1.4.4
+      once: 1.4.0
+
+  /punycode@2.3.1:
+    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /pupa@3.1.0:
+    resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==}
+    engines: {node: '>=12.20'}
+    dependencies:
+      escape-goat: 4.0.0
+    dev: false
+
+  /qs@6.10.4:
+    resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==}
+    engines: {node: '>=0.6'}
+    dependencies:
+      side-channel: 1.0.5
+    dev: true
+
+  /qs@6.11.0:
+    resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+    engines: {node: '>=0.6'}
+    dependencies:
+      side-channel: 1.0.5
+
+  /quasar@2.14.5:
+    resolution: {integrity: sha512-N+iRYoby09P9l+R5nKfA0tCPXdXJJHCPifjP8CkL/JASX5yHEjuwh7KoNiWzYLZPbsYXVuQKqwtDy0qXuXTv2g==}
+    engines: {node: '>= 10.18.1', npm: '>= 6.13.4', yarn: '>= 1.21.1'}
+
+  /querystringify@2.2.0:
+    resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+    dev: true
+
+  /queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+    dev: true
+
+  /quick-lru@5.1.1:
+    resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /randombytes@2.1.0:
+    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+    dependencies:
+      safe-buffer: 5.2.1
+    dev: true
+
+  /range-parser@1.2.1:
+    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+    engines: {node: '>= 0.6'}
+
+  /raw-body@2.5.1:
+    resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      bytes: 3.1.2
+      http-errors: 2.0.0
+      iconv-lite: 0.4.24
+      unpipe: 1.0.0
+
+  /rc@1.2.8:
+    resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+    hasBin: true
+    dependencies:
+      deep-extend: 0.6.0
+      ini: 1.3.8
+      minimist: 1.2.8
+      strip-json-comments: 2.0.1
+    dev: false
+
+  /react-is@18.2.0:
+    resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+    dev: true
+
+  /readable-stream@2.3.8:
+    resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+    dependencies:
+      core-util-is: 1.0.3
+      inherits: 2.0.4
+      isarray: 1.0.0
+      process-nextick-args: 2.0.1
+      safe-buffer: 5.1.2
+      string_decoder: 1.1.1
+      util-deprecate: 1.0.2
+
+  /readable-stream@3.6.2:
+    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+    engines: {node: '>= 6'}
+    dependencies:
+      inherits: 2.0.4
+      string_decoder: 1.3.0
+      util-deprecate: 1.0.2
+    dev: true
+
+  /readdir-glob@1.1.3:
+    resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
+    dependencies:
+      minimatch: 5.1.6
+    dev: true
+
+  /readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+    dependencies:
+      picomatch: 2.3.1
+    dev: true
+
+  /recrawl-sync@2.2.3:
+    resolution: {integrity: sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==}
+    dependencies:
+      '@cush/relative': 1.0.0
+      glob-regex: 0.3.2
+      slash: 3.0.0
+      sucrase: 3.35.0
+      tslib: 1.14.1
+    dev: true
+
+  /register-service-worker@1.7.2:
+    resolution: {integrity: sha512-CiD3ZSanZqcMPRhtfct5K9f7i3OLCcBBWsJjLh1gW9RO/nS94sVzY59iS+fgYBOBqaBpf4EzfqUF3j9IG+xo8A==}
+    dev: true
+
+  /registry-auth-token@5.0.2:
+    resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==}
+    engines: {node: '>=14'}
+    dependencies:
+      '@pnpm/npm-conf': 2.2.2
+    dev: false
+
+  /registry-url@6.0.1:
+    resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==}
+    engines: {node: '>=12'}
+    dependencies:
+      rc: 1.2.8
+    dev: false
+
+  /relateurl@0.2.7:
+    resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
+    engines: {node: '>= 0.10'}
+    dev: true
+
+  /request-progress@3.0.0:
+    resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==}
+    dependencies:
+      throttleit: 1.0.1
+    dev: true
+
+  /require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /require-from-string@2.0.2:
+    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /requires-port@1.0.0:
+    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+
+  /resolve-alpn@1.2.1:
+    resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
+    dev: false
+
+  /resolve-from@4.0.0:
+    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /resolve@1.22.8:
+    resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+    hasBin: true
+    dependencies:
+      is-core-module: 2.13.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+    dev: true
+
+  /responselike@2.0.1:
+    resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
+    dependencies:
+      lowercase-keys: 2.0.0
+    dev: false
+
+  /responselike@3.0.0:
+    resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      lowercase-keys: 3.0.0
+    dev: false
+
+  /restore-cursor@3.1.0:
+    resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+    engines: {node: '>=8'}
+    dependencies:
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+    dev: true
+
+  /reusify@1.0.4:
+    resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+    dev: true
+
+  /rfdc@1.3.1:
+    resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==}
+    dev: true
+
+  /rimraf@2.7.1:
+    resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+    hasBin: true
+    dependencies:
+      glob: 7.2.3
+    dev: false
+
+  /rimraf@3.0.2:
+    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+    hasBin: true
+    dependencies:
+      glob: 7.2.3
+    dev: true
+
+  /rollup-plugin-visualizer@5.12.0:
+    resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==}
+    engines: {node: '>=14'}
+    hasBin: true
+    peerDependencies:
+      rollup: 2.x || 3.x || 4.x
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+    dependencies:
+      open: 8.4.2
+      picomatch: 2.3.1
+      source-map: 0.7.4
+      yargs: 17.7.2
+    dev: true
+
+  /rollup@2.77.3:
+    resolution: {integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==}
+    engines: {node: '>=10.0.0'}
+    hasBin: true
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
+  /rollup@4.12.0:
+    resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+    dependencies:
+      '@types/estree': 1.0.5
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.12.0
+      '@rollup/rollup-android-arm64': 4.12.0
+      '@rollup/rollup-darwin-arm64': 4.12.0
+      '@rollup/rollup-darwin-x64': 4.12.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.12.0
+      '@rollup/rollup-linux-arm64-gnu': 4.12.0
+      '@rollup/rollup-linux-arm64-musl': 4.12.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.12.0
+      '@rollup/rollup-linux-x64-gnu': 4.12.0
+      '@rollup/rollup-linux-x64-musl': 4.12.0
+      '@rollup/rollup-win32-arm64-msvc': 4.12.0
+      '@rollup/rollup-win32-ia32-msvc': 4.12.0
+      '@rollup/rollup-win32-x64-msvc': 4.12.0
+      fsevents: 2.3.3
+    dev: true
+
+  /route-cache@0.5.0:
+    resolution: {integrity: sha512-7FzV+1O4q7XeerbyG8aEeDH+1bk/Vxp2sDJdEZE0KcbTP0C6IucKSQUCTwB3F0IkhpF4rYluLLENEfUQ6LH/ng==}
+    dependencies:
+      debug: 3.1.0
+      lru-cache: 4.0.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
+  /run-applescript@5.0.0:
+    resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
+    engines: {node: '>=12'}
+    dependencies:
+      execa: 5.1.1
+    dev: false
+
+  /run-async@2.4.1:
+    resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+    engines: {node: '>=0.12.0'}
+    dev: true
+
+  /run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+    dependencies:
+      queue-microtask: 1.2.3
+    dev: true
+
+  /rxjs@7.8.1:
+    resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+    dependencies:
+      tslib: 2.6.2
+    dev: true
+
+  /safe-buffer@5.1.2:
+    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+  /safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  /safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+  /sass@1.71.1:
+    resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+    dependencies:
+      chokidar: 3.6.0
+      immutable: 4.3.5
+      source-map-js: 1.0.2
+    dev: true
+
+  /sax@1.1.4:
+    resolution: {integrity: sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==}
+    dev: true
+
+  /selfsigned@2.4.1:
+    resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==}
+    engines: {node: '>=10'}
+    dependencies:
+      '@types/node-forge': 1.3.11
+      node-forge: 1.3.1
+    dev: false
+
+  /semver-diff@4.0.0:
+    resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==}
+    engines: {node: '>=12'}
+    dependencies:
+      semver: 7.6.0
+    dev: false
+
+  /semver@6.3.1:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+    dev: true
+
+  /semver@7.6.0:
+    resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
+    engines: {node: '>=10'}
+    hasBin: true
+    dependencies:
+      lru-cache: 6.0.0
+
+  /send@0.18.0:
+    resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      debug: 2.6.9
+      depd: 2.0.0
+      destroy: 1.2.0
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      etag: 1.8.1
+      fresh: 0.5.2
+      http-errors: 2.0.0
+      mime: 1.6.0
+      ms: 2.1.3
+      on-finished: 2.4.1
+      range-parser: 1.2.1
+      statuses: 2.0.1
+    transitivePeerDependencies:
+      - supports-color
+
+  /serialize-javascript@6.0.2:
+    resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+    dependencies:
+      randombytes: 2.1.0
+    dev: true
+
+  /serve-static@1.15.0:
+    resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      parseurl: 1.3.3
+      send: 0.18.0
+    transitivePeerDependencies:
+      - supports-color
+
+  /set-function-length@1.2.1:
+    resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.2.4
+      gopd: 1.0.1
+      has-property-descriptors: 1.0.2
+
+  /setprototypeof@1.2.0:
+    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+  /shallow-clone@3.0.1:
+    resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
+    engines: {node: '>=8'}
+    dependencies:
+      kind-of: 6.0.3
+    dev: true
+
+  /shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+    dependencies:
+      shebang-regex: 3.0.0
+
+  /shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  /side-channel@1.0.5:
+    resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.7
+      es-errors: 1.3.0
+      get-intrinsic: 1.2.4
+      object-inspect: 1.13.1
+
+  /siginfo@2.0.0:
+    resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+    dev: true
+
+  /signal-exit@3.0.7:
+    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+  /signal-exit@4.1.0:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+    dev: true
+
+  /slash@3.0.0:
+    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /slice-ansi@3.0.0:
+    resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-styles: 4.3.0
+      astral-regex: 2.0.0
+      is-fullwidth-code-point: 3.0.0
+    dev: true
+
+  /slice-ansi@4.0.0:
+    resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      ansi-styles: 4.3.0
+      astral-regex: 2.0.0
+      is-fullwidth-code-point: 3.0.0
+    dev: true
+
+  /source-map-js@1.0.2:
+    resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+    engines: {node: '>=0.10.0'}
+
+  /source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /source-map@0.7.4:
+    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+    engines: {node: '>= 8'}
+    dev: true
+
+  /sshpk@1.18.0:
+    resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+    dependencies:
+      asn1: 0.2.6
+      assert-plus: 1.0.0
+      bcrypt-pbkdf: 1.0.2
+      dashdash: 1.14.1
+      ecc-jsbn: 0.1.2
+      getpass: 0.1.7
+      jsbn: 0.1.1
+      safer-buffer: 2.1.2
+      tweetnacl: 0.14.5
+    dev: true
+
+  /stack-trace@1.0.0-pre2:
+    resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==}
+    engines: {node: '>=16'}
+    dev: true
+
+  /stackback@0.0.2:
+    resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+    dev: true
+
+  /statuses@2.0.1:
+    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+    engines: {node: '>= 0.8'}
+
+  /std-env@3.7.0:
+    resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
+    dev: true
+
+  /string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  /string-width@5.1.2:
+    resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+    engines: {node: '>=12'}
+    dependencies:
+      eastasianwidth: 0.2.0
+      emoji-regex: 9.2.2
+      strip-ansi: 7.1.0
+
+  /string_decoder@1.1.1:
+    resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+    dependencies:
+      safe-buffer: 5.1.2
+
+  /string_decoder@1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+    dependencies:
+      safe-buffer: 5.2.1
+    dev: true
+
+  /strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-regex: 5.0.1
+
+  /strip-ansi@7.1.0:
+    resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      ansi-regex: 6.0.1
+
+  /strip-bom@3.0.0:
+    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /strip-final-newline@2.0.0:
+    resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+    engines: {node: '>=6'}
+
+  /strip-final-newline@3.0.0:
+    resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+    engines: {node: '>=12'}
+
+  /strip-json-comments@2.0.1:
+    resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+    engines: {node: '>=0.10.0'}
+    dev: false
+
+  /strip-json-comments@3.1.1:
+    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /strip-literal@2.0.0:
+    resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==}
+    dependencies:
+      js-tokens: 8.0.3
+    dev: true
+
+  /sucrase@3.35.0:
+    resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    hasBin: true
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.3
+      commander: 4.1.1
+      glob: 10.3.10
+      lines-and-columns: 1.2.4
+      mz: 2.7.0
+      pirates: 4.0.6
+      ts-interface-checker: 0.1.13
+    dev: true
+
+  /supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+    dependencies:
+      has-flag: 4.0.0
+    dev: true
+
+  /supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+    dependencies:
+      has-flag: 4.0.0
+
+  /supports-preserve-symlinks-flag@1.0.0:
+    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /table@6.8.1:
+    resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==}
+    engines: {node: '>=10.0.0'}
+    dependencies:
+      ajv: 8.12.0
+      lodash.truncate: 4.4.2
+      slice-ansi: 4.0.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+    dev: true
+
+  /tar-stream@2.2.0:
+    resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
+    engines: {node: '>=6'}
+    dependencies:
+      bl: 4.1.0
+      end-of-stream: 1.4.4
+      fs-constants: 1.0.0
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+    dev: true
+
+  /text-table@0.2.0:
+    resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+    dev: true
+
+  /thenify-all@1.6.0:
+    resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+    engines: {node: '>=0.8'}
+    dependencies:
+      thenify: 3.3.1
+    dev: true
+
+  /thenify@3.3.1:
+    resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+    dependencies:
+      any-promise: 1.3.0
+    dev: true
+
+  /throttleit@1.0.1:
+    resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==}
+    dev: true
+
+  /through@2.3.8:
+    resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+    dev: true
+
+  /tinybench@2.6.0:
+    resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==}
+    dev: true
+
+  /tinypool@0.8.2:
+    resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==}
+    engines: {node: '>=14.0.0'}
+    dev: true
+
+  /tinyspy@2.2.1:
+    resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
+    engines: {node: '>=14.0.0'}
+    dev: true
+
+  /titleize@3.0.0:
+    resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
+    engines: {node: '>=12'}
+    dev: false
+
+  /tmp@0.0.33:
+    resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+    engines: {node: '>=0.6.0'}
+    dependencies:
+      os-tmpdir: 1.0.2
+
+  /tmp@0.2.1:
+    resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
+    engines: {node: '>=8.17.0'}
+    dependencies:
+      rimraf: 3.0.2
+    dev: true
+
+  /to-fast-properties@2.0.0:
+    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+    engines: {node: '>=4'}
+
+  /to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+    dependencies:
+      is-number: 7.0.0
+
+  /toidentifier@1.0.1:
+    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+    engines: {node: '>=0.6'}
+
+  /tough-cookie@4.1.3:
+    resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==}
+    engines: {node: '>=6'}
+    dependencies:
+      psl: 1.9.0
+      punycode: 2.3.1
+      universalify: 0.2.0
+      url-parse: 1.5.10
+    dev: true
+
+  /ts-interface-checker@0.1.13:
+    resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+    dev: true
+
+  /tsconfck@3.0.2:
+    resolution: {integrity: sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==}
+    engines: {node: ^18 || >=20}
+    hasBin: true
+    peerDependencies:
+      typescript: ^5.0.0
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dev: true
+
+  /tsconfig-paths@3.15.0:
+    resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+    dependencies:
+      '@types/json5': 0.0.29
+      json5: 1.0.2
+      minimist: 1.2.8
+      strip-bom: 3.0.0
+    dev: true
+
+  /tslib@1.14.1:
+    resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+    dev: true
+
+  /tslib@2.6.2:
+    resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+    dev: true
+
+  /tunnel-agent@0.6.0:
+    resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+    dependencies:
+      safe-buffer: 5.2.1
+    dev: true
+
+  /tunnel@0.0.6:
+    resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
+    engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
+    dev: false
+
+  /tweetnacl@0.14.5:
+    resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
+    dev: true
+
+  /type-check@0.4.0:
+    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      prelude-ls: 1.2.1
+    dev: true
+
+  /type-detect@4.0.8:
+    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /type-fest@0.20.2:
+    resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /type-fest@0.21.3:
+    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /type-fest@1.4.0:
+    resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /type-fest@2.19.0:
+    resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+    engines: {node: '>=12.20'}
+    dev: false
+
+  /type-is@1.6.18:
+    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      media-typer: 0.3.0
+      mime-types: 2.1.35
+
+  /typedarray-to-buffer@3.1.5:
+    resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+    dependencies:
+      is-typedarray: 1.0.0
+    dev: false
+
+  /typedarray@0.0.6:
+    resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+    dev: false
+
+  /ufo@1.4.0:
+    resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==}
+    dev: true
+
+  /uglify-js@3.17.4:
+    resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
+    engines: {node: '>=0.8.0'}
+    hasBin: true
+    dev: true
+
+  /undici-types@5.26.5:
+    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+  /unique-string@3.0.0:
+    resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      crypto-random-string: 4.0.0
+    dev: false
+
+  /universalify@0.2.0:
+    resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+    engines: {node: '>= 4.0.0'}
+    dev: true
+
+  /universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  /unpipe@1.0.0:
+    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+    engines: {node: '>= 0.8'}
+
+  /unplugin@1.7.1:
+    resolution: {integrity: sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw==}
+    dependencies:
+      acorn: 8.11.3
+      chokidar: 3.6.0
+      webpack-sources: 3.2.3
+      webpack-virtual-modules: 0.6.1
+    dev: true
+
+  /untildify@4.0.0:
+    resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
+    engines: {node: '>=8'}
+
+  /update-browserslist-db@1.0.13(browserslist@4.23.0):
+    resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+    dependencies:
+      browserslist: 4.23.0
+      escalade: 3.1.2
+      picocolors: 1.0.0
+    dev: true
+
+  /update-notifier@6.0.2:
+    resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      boxen: 7.1.1
+      chalk: 5.3.0
+      configstore: 6.0.0
+      has-yarn: 3.0.0
+      import-lazy: 4.0.0
+      is-ci: 3.0.1
+      is-installed-globally: 0.4.0
+      is-npm: 6.0.0
+      is-yarn-global: 0.4.1
+      latest-version: 7.0.0
+      pupa: 3.1.0
+      semver: 7.6.0
+      semver-diff: 4.0.0
+      xdg-basedir: 5.1.0
+    dev: false
+
+  /upper-case@1.1.3:
+    resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==}
+    dev: true
+
+  /uri-js@4.4.1:
+    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+    dependencies:
+      punycode: 2.3.1
+    dev: true
+
+  /url-parse@1.5.10:
+    resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+    dependencies:
+      querystringify: 2.2.0
+      requires-port: 1.0.0
+    dev: true
+
+  /util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  /utils-merge@1.0.1:
+    resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+    engines: {node: '>= 0.4.0'}
+
+  /uuid@8.3.2:
+    resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+    hasBin: true
+    dev: true
+
+  /validator@13.11.0:
+    resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==}
+    engines: {node: '>= 0.10'}
+    dev: false
+
+  /vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+
+  /verror@1.10.0:
+    resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
+    engines: {'0': node >=0.6.0}
+    dependencies:
+      assert-plus: 1.0.0
+      core-util-is: 1.0.2
+      extsprintf: 1.3.0
+    dev: true
+
+  /vite-jsconfig-paths@2.0.1(vite@5.1.4):
+    resolution: {integrity: sha512-rabcTTfKs0MdAsQWcZjbIMo5fcp6jthZce7uFEPgVPgpSY+RNOwjzIJOPES6cB/GJZLSoLGfHM9kt5HNmJvp7A==}
+    peerDependencies:
+      vite: '>2.0.0-0'
+    dependencies:
+      debug: 4.3.4(supports-color@8.1.1)
+      globrex: 0.1.2
+      recrawl-sync: 2.2.3
+      tsconfig-paths: 3.15.0
+      vite: 5.1.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /vite-node@1.3.1:
+    resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    dependencies:
+      cac: 6.7.14
+      debug: 4.3.4(supports-color@8.1.1)
+      pathe: 1.1.2
+      picocolors: 1.0.0
+      vite: 5.1.4
+    transitivePeerDependencies:
+      - '@types/node'
+      - less
+      - lightningcss
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: true
+
+  /vite-tsconfig-paths@4.3.1(vite@5.1.4):
+    resolution: {integrity: sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==}
+    peerDependencies:
+      vite: '*'
+    peerDependenciesMeta:
+      vite:
+        optional: true
+    dependencies:
+      debug: 4.3.4(supports-color@8.1.1)
+      globrex: 0.1.2
+      tsconfck: 3.0.2
+      vite: 5.1.4
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /vite@2.9.17(sass@1.71.1):
+    resolution: {integrity: sha512-XxcRzra6d7xrKXH66jZUgb+srThoPu+TLJc06GifUyKq9JmjHkc1Numc8ra0h56rju2jfVWw3B3fs5l3OFMvUw==}
+    engines: {node: '>=12.2.0'}
+    hasBin: true
+    peerDependencies:
+      less: '*'
+      sass: '*'
+      stylus: '*'
+    peerDependenciesMeta:
+      less:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+    dependencies:
+      esbuild: 0.14.51
+      postcss: 8.4.35
+      resolve: 1.22.8
+      rollup: 2.77.3
+      sass: 1.71.1
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
+  /vite@5.1.4:
+    resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': ^18.0.0 || >=20.0.0
+      less: '*'
+      lightningcss: ^1.21.0
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      esbuild: 0.19.12
+      postcss: 8.4.35
+      rollup: 4.12.0
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
+  /vitest@1.3.1:
+    resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    peerDependencies:
+      '@edge-runtime/vm': '*'
+      '@types/node': ^18.0.0 || >=20.0.0
+      '@vitest/browser': 1.3.1
+      '@vitest/ui': 1.3.1
+      happy-dom: '*'
+      jsdom: '*'
+    peerDependenciesMeta:
+      '@edge-runtime/vm':
+        optional: true
+      '@types/node':
+        optional: true
+      '@vitest/browser':
+        optional: true
+      '@vitest/ui':
+        optional: true
+      happy-dom:
+        optional: true
+      jsdom:
+        optional: true
+    dependencies:
+      '@vitest/expect': 1.3.1
+      '@vitest/runner': 1.3.1
+      '@vitest/snapshot': 1.3.1
+      '@vitest/spy': 1.3.1
+      '@vitest/utils': 1.3.1
+      acorn-walk: 8.3.2
+      chai: 4.4.1
+      debug: 4.3.4(supports-color@8.1.1)
+      execa: 8.0.1
+      local-pkg: 0.5.0
+      magic-string: 0.30.7
+      pathe: 1.1.2
+      picocolors: 1.0.0
+      std-env: 3.7.0
+      strip-literal: 2.0.0
+      tinybench: 2.6.0
+      tinypool: 0.8.2
+      vite: 5.1.4
+      vite-node: 1.3.1
+      why-is-node-running: 2.2.2
+    transitivePeerDependencies:
+      - less
+      - lightningcss
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: true
+
+  /vue-component-type-helpers@1.8.27:
+    resolution: {integrity: sha512-0vOfAtI67UjeO1G6UiX5Kd76CqaQ67wrRZiOe7UAb9Jm6GzlUr/fC7CV90XfwapJRjpCMaZFhv1V0ajWRmE9Dg==}
+    dev: true
+
+  /vue-demi@0.14.7(vue@3.4.19):
+    resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^3.0.0-0 || ^2.6.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+    dependencies:
+      vue: 3.4.19
+
+  /vue-eslint-parser@9.4.2(eslint@8.56.0):
+    resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+    dependencies:
+      debug: 4.3.4(supports-color@8.1.1)
+      eslint: 8.56.0
+      eslint-scope: 7.2.2
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      esquery: 1.5.0
+      lodash: 4.17.21
+      semver: 7.6.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /vue-i18n@9.9.1(vue@3.4.19):
+    resolution: {integrity: sha512-xyQ4VspLdNSPTKBFBPWa1tvtj+9HuockZwgFeD2OhxxXuC2CWeNvV4seu2o9+vbQOyQbhAM5Ez56oxUrrnTWdw==}
+    engines: {node: '>= 16'}
+    peerDependencies:
+      vue: ^3.0.0
+    dependencies:
+      '@intlify/core-base': 9.9.1
+      '@intlify/shared': 9.9.1
+      '@vue/devtools-api': 6.6.1
+      vue: 3.4.19
+
+  /vue-router@4.2.5(vue@3.4.19):
+    resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==}
+    peerDependencies:
+      vue: ^3.2.0
+    dependencies:
+      '@vue/devtools-api': 6.6.1
+      vue: 3.4.19
+
+  /vue@3.4.19:
+    resolution: {integrity: sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@vue/compiler-dom': 3.4.19
+      '@vue/compiler-sfc': 3.4.19
+      '@vue/runtime-dom': 3.4.19
+      '@vue/server-renderer': 3.4.19(vue@3.4.19)
+      '@vue/shared': 3.4.19
+
+  /wcwidth@1.0.1:
+    resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+    dependencies:
+      defaults: 1.0.4
+    dev: true
+
+  /webidl-conversions@7.0.0:
+    resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /webpack-merge@5.10.0:
+    resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==}
+    engines: {node: '>=10.0.0'}
+    dependencies:
+      clone-deep: 4.0.1
+      flat: 5.0.2
+      wildcard: 2.0.1
+    dev: true
+
+  /webpack-sources@3.2.3:
+    resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+    engines: {node: '>=10.13.0'}
+    dev: true
+
+  /webpack-virtual-modules@0.6.1:
+    resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==}
+    dev: true
+
+  /whatwg-encoding@2.0.0:
+    resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
+    engines: {node: '>=12'}
+    dependencies:
+      iconv-lite: 0.6.3
+    dev: true
+
+  /whatwg-mimetype@3.0.0:
+    resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+    dependencies:
+      isexe: 2.0.0
+
+  /why-is-node-running@2.2.2:
+    resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==}
+    engines: {node: '>=8'}
+    hasBin: true
+    dependencies:
+      siginfo: 2.0.0
+      stackback: 0.0.2
+    dev: true
+
+  /widest-line@4.0.1:
+    resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
+    engines: {node: '>=12'}
+    dependencies:
+      string-width: 5.1.2
+    dev: false
+
+  /wildcard@2.0.1:
+    resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==}
+    dev: true
+
+  /wrap-ansi@6.2.0:
+    resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+    dev: true
+
+  /wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+    dev: true
+
+  /wrap-ansi@8.1.0:
+    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      ansi-styles: 6.2.1
+      string-width: 5.1.2
+      strip-ansi: 7.1.0
+
+  /wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+  /write-file-atomic@3.0.3:
+    resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+    dependencies:
+      imurmurhash: 0.1.4
+      is-typedarray: 1.0.0
+      signal-exit: 3.0.7
+      typedarray-to-buffer: 3.1.5
+    dev: false
+
+  /xdg-basedir@5.1.0:
+    resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==}
+    engines: {node: '>=12'}
+    dev: false
+
+  /xml-name-validator@4.0.0:
+    resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /yallist@2.1.2:
+    resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
+    dev: false
+
+  /yallist@4.0.0:
+    resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+  /yaml-eslint-parser@0.3.2:
+    resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==}
+    dependencies:
+      eslint-visitor-keys: 1.3.0
+      lodash: 4.17.21
+      yaml: 1.10.2
+    dev: true
+
+  /yaml@1.10.2:
+    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /yargs-parser@21.1.1:
+    resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /yargs@17.7.2:
+    resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+    engines: {node: '>=12'}
+    dependencies:
+      cliui: 8.0.1
+      escalade: 3.1.2
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 21.1.1
+    dev: true
+
+  /yauzl@2.10.0:
+    resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+    dependencies:
+      buffer-crc32: 0.2.13
+      fd-slicer: 1.1.0
+
+  /yocto-queue@0.1.0:
+    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /yocto-queue@1.0.0:
+    resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
+    engines: {node: '>=12.20'}
+    dev: true
+
+  /zip-stream@4.1.1:
+    resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}
+    engines: {node: '>= 10'}
+    dependencies:
+      archiver-utils: 3.0.4
+      compress-commons: 4.1.2
+      readable-stream: 3.6.2
+    dev: true

From b75afd6ec59487eccc480e8405a4681a71f708fb Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:16:59 +0100
Subject: [PATCH 23/54] refs #6797 fix(jenkins) use pnpm

---
 Jenkinsfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index fee06c567..0027e1cbe 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -62,7 +62,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'pnpm install --no-audit --prefer-offline'
+                sh 'pnpm install --prefer-offline'
             }
         }
         stage('Test') {

From f0b29790668a9d065be9888e3b69e9ae39807dd6 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Wed, 21 Feb 2024 13:19:28 +0100
Subject: [PATCH 24/54] refs #6768 create consignee

---
 src/pages/Customer/components/CustomerConsigneeCreate.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Customer/components/CustomerConsigneeCreate.vue b/src/pages/Customer/components/CustomerConsigneeCreate.vue
index d9765d50d..580dba6e3 100644
--- a/src/pages/Customer/components/CustomerConsigneeCreate.vue
+++ b/src/pages/Customer/components/CustomerConsigneeCreate.vue
@@ -51,7 +51,7 @@ const toCustomerConsignees = () => {
 };
 function handleLocation(data, location) {
     const { town, code, provinceFk, countryFk } = location ?? {};
-    data.postcode = code;
+    data.postalCode = code;
     data.city = town;
     data.provinceFk = provinceFk;
     data.countryFk = countryFk;

From 74c4a7157bf89ebb84add35c5bd622e35e41742e Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:21:31 +0100
Subject: [PATCH 25/54] refs #6797 fix(jenkins) remove chormium

---
 package.json   |   1 -
 pnpm-lock.yaml | 212 +++++++------------------------------------------
 2 files changed, 30 insertions(+), 183 deletions(-)

diff --git a/package.json b/package.json
index 3708007f2..d985c7268 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,6 @@
         "@quasar/cli": "^2.3.0",
         "@quasar/extras": "^1.16.9",
         "axios": "^1.4.0",
-        "chromium": "^3.0.3",
         "croppie": "^2.6.5",
         "pinia": "^2.1.3",
         "quasar": "^2.14.5",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5ef5b94c9..7a6dc9ee8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,9 +14,6 @@ dependencies:
   axios:
     specifier: ^1.4.0
     version: 1.6.7
-  chromium:
-    specifier: ^3.0.3
-    version: 3.0.3
   croppie:
     specifier: ^2.6.5
     version: 2.6.5
@@ -894,23 +891,11 @@ packages:
     resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
     dev: true
 
-  /@sindresorhus/is@4.6.0:
-    resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
-    engines: {node: '>=10'}
-    dev: false
-
   /@sindresorhus/is@5.6.0:
     resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
     engines: {node: '>=14.16'}
     dev: false
 
-  /@szmarczak/http-timer@4.0.6:
-    resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
-    engines: {node: '>=10'}
-    dependencies:
-      defer-to-connect: 2.0.1
-    dev: false
-
   /@szmarczak/http-timer@5.0.1:
     resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
     engines: {node: '>=14.16'}
@@ -925,15 +910,6 @@ packages:
       '@types/node': 20.11.19
     dev: true
 
-  /@types/cacheable-request@6.0.3:
-    resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
-    dependencies:
-      '@types/http-cache-semantics': 4.0.4
-      '@types/keyv': 3.1.4
-      '@types/node': 20.11.19
-      '@types/responselike': 1.0.3
-    dev: false
-
   /@types/chrome@0.0.208:
     resolution: {integrity: sha512-VDU/JnXkF5qaI7WBz14Azpa2VseZTgML0ia/g/B1sr9OfdOnHiH/zZ7P7qCDqxSlkqJh76/bPc8jLFcx8rHJmw==}
     dependencies:
@@ -1011,12 +987,6 @@ packages:
     resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
     dev: true
 
-  /@types/keyv@3.1.4:
-    resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
-    dependencies:
-      '@types/node': 20.11.19
-    dev: false
-
   /@types/mime@1.3.5:
     resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
     dev: true
@@ -1048,12 +1018,6 @@ packages:
     resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
     dev: true
 
-  /@types/responselike@1.0.3:
-    resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
-    dependencies:
-      '@types/node': 20.11.19
-    dev: false
-
   /@types/send@0.17.4:
     resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
     dependencies:
@@ -1469,6 +1433,7 @@ packages:
 
   /balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+    dev: true
 
   /base64-js@1.5.1:
     resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -1555,6 +1520,7 @@ packages:
     dependencies:
       balanced-match: 1.0.2
       concat-map: 0.0.1
+    dev: true
 
   /brace-expansion@2.0.1:
     resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
@@ -1581,10 +1547,7 @@ packages:
 
   /buffer-crc32@0.2.13:
     resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
-
-  /buffer-from@1.1.2:
-    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-    dev: false
+    dev: true
 
   /buffer@5.7.1:
     resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
@@ -1613,11 +1576,6 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
-  /cacheable-lookup@5.0.4:
-    resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
-    engines: {node: '>=10.6.0'}
-    dev: false
-
   /cacheable-lookup@7.0.0:
     resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
     engines: {node: '>=14.16'}
@@ -1636,22 +1594,10 @@ packages:
       responselike: 3.0.0
     dev: false
 
-  /cacheable-request@7.0.4:
-    resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
-    engines: {node: '>=8'}
-    dependencies:
-      clone-response: 1.0.3
-      get-stream: 5.2.0
-      http-cache-semantics: 4.1.1
-      keyv: 4.5.4
-      lowercase-keys: 2.0.0
-      normalize-url: 6.1.0
-      responselike: 2.0.1
-    dev: false
-
   /cachedir@2.4.0:
     resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
     engines: {node: '>=6'}
+    dev: true
 
   /call-bind@1.0.7:
     resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
@@ -1744,23 +1690,6 @@ packages:
       fsevents: 2.3.3
     dev: true
 
-  /chromium@3.0.3:
-    resolution: {integrity: sha512-TfbzP/3t38Us5xrbb9x87M/y5I/j3jx0zeJhhQ72gjp6dwJuhVP6hBZnBH4wEg7512VVXk9zCfTuPFOdw7bQqg==}
-    os: [darwin, linux, win32]
-    requiresBuild: true
-    dependencies:
-      cachedir: 2.4.0
-      debug: 4.3.4(supports-color@8.1.1)
-      extract-zip: 1.7.0
-      got: 11.8.6
-      progress: 2.0.3
-      rimraf: 2.7.1
-      tmp: 0.0.33
-      tunnel: 0.0.6
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
   /ci-info@3.9.0:
     resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
     engines: {node: '>=8'}
@@ -1834,12 +1763,6 @@ packages:
       shallow-clone: 3.0.1
     dev: true
 
-  /clone-response@1.0.3:
-    resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
-    dependencies:
-      mimic-response: 1.0.1
-    dev: false
-
   /clone@1.0.4:
     resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
     engines: {node: '>=0.8'}
@@ -1922,16 +1845,7 @@ packages:
 
   /concat-map@0.0.1:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
-  /concat-stream@1.6.2:
-    resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
-    engines: {'0': node >= 0.8}
-    dependencies:
-      buffer-from: 1.1.2
-      inherits: 2.0.4
-      readable-stream: 2.3.8
-      typedarray: 0.0.6
-    dev: false
+    dev: true
 
   /config-chain@1.1.13:
     resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
@@ -1978,6 +1892,7 @@ packages:
 
   /core-util-is@1.0.3:
     resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+    dev: true
 
   /cors@2.8.5:
     resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
@@ -2139,6 +2054,7 @@ packages:
     dependencies:
       ms: 2.1.2
       supports-color: 8.1.1
+    dev: true
 
   /decompress-response@6.0.0:
     resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
@@ -2289,6 +2205,7 @@ packages:
     resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
     dependencies:
       once: 1.4.0
+    dev: true
 
   /enquirer@2.4.1:
     resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
@@ -2863,18 +2780,6 @@ packages:
       tmp: 0.0.33
     dev: true
 
-  /extract-zip@1.7.0:
-    resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==}
-    hasBin: true
-    dependencies:
-      concat-stream: 1.6.2
-      debug: 2.6.9
-      mkdirp: 0.5.6
-      yauzl: 2.10.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
   /extract-zip@2.0.1(supports-color@8.1.1):
     resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
     engines: {node: '>= 10.17.0'}
@@ -2938,6 +2843,7 @@ packages:
     resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
     dependencies:
       pend: 1.2.0
+    dev: true
 
   /figures@3.2.0:
     resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
@@ -3080,6 +2986,7 @@ packages:
 
   /fs.realpath@1.0.0:
     resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+    dev: true
 
   /fsevents@2.3.3:
     resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
@@ -3116,6 +3023,7 @@ packages:
     engines: {node: '>=8'}
     dependencies:
       pump: 3.0.0
+    dev: true
 
   /get-stream@6.0.1:
     resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
@@ -3178,6 +3086,7 @@ packages:
       minimatch: 3.1.2
       once: 1.4.0
       path-is-absolute: 1.0.1
+    dev: true
 
   /global-dirs@3.0.1:
     resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
@@ -3201,23 +3110,6 @@ packages:
     dependencies:
       get-intrinsic: 1.2.4
 
-  /got@11.8.6:
-    resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
-    engines: {node: '>=10.19.0'}
-    dependencies:
-      '@sindresorhus/is': 4.6.0
-      '@szmarczak/http-timer': 4.0.6
-      '@types/cacheable-request': 6.0.3
-      '@types/responselike': 1.0.3
-      cacheable-lookup: 5.0.4
-      cacheable-request: 7.0.4
-      decompress-response: 6.0.0
-      http2-wrapper: 1.0.3
-      lowercase-keys: 2.0.0
-      p-cancelable: 2.1.1
-      responselike: 2.0.1
-    dev: false
-
   /got@12.6.1:
     resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==}
     engines: {node: '>=14.16'}
@@ -3260,6 +3152,7 @@ packages:
   /has-flag@4.0.0:
     resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
     engines: {node: '>=8'}
+    dev: true
 
   /has-property-descriptors@1.0.2:
     resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
@@ -3356,14 +3249,6 @@ packages:
       sshpk: 1.18.0
     dev: true
 
-  /http2-wrapper@1.0.3:
-    resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
-    engines: {node: '>=10.19.0'}
-    dependencies:
-      quick-lru: 5.1.1
-      resolve-alpn: 1.2.1
-    dev: false
-
   /http2-wrapper@2.2.1:
     resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
     engines: {node: '>=10.19.0'}
@@ -3445,6 +3330,7 @@ packages:
     dependencies:
       once: 1.4.0
       wrappy: 1.0.2
+    dev: true
 
   /inherits@2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -3603,6 +3489,7 @@ packages:
 
   /isarray@1.0.0:
     resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+    dev: true
 
   /isbinaryfile@5.0.2:
     resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==}
@@ -3877,11 +3764,6 @@ packages:
     resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==}
     dev: true
 
-  /lowercase-keys@2.0.0:
-    resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
-    engines: {node: '>=8'}
-    dev: false
-
   /lowercase-keys@3.0.0:
     resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -3960,11 +3842,6 @@ packages:
     resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
     engines: {node: '>=12'}
 
-  /mimic-response@1.0.1:
-    resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
-    engines: {node: '>=4'}
-    dev: false
-
   /mimic-response@3.1.0:
     resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
     engines: {node: '>=10'}
@@ -3979,6 +3856,7 @@ packages:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
     dependencies:
       brace-expansion: 1.1.11
+    dev: true
 
   /minimatch@5.1.6:
     resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
@@ -4009,13 +3887,6 @@ packages:
     engines: {node: '>=16 || 14 >=14.17'}
     dev: true
 
-  /mkdirp@0.5.6:
-    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
-    hasBin: true
-    dependencies:
-      minimist: 1.2.8
-    dev: false
-
   /mlly@1.5.0:
     resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==}
     dependencies:
@@ -4030,6 +3901,7 @@ packages:
 
   /ms@2.1.2:
     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+    dev: true
 
   /ms@2.1.3:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -4092,11 +3964,6 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /normalize-url@6.1.0:
-    resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
-    engines: {node: '>=10'}
-    dev: false
-
   /normalize-url@8.0.0:
     resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
     engines: {node: '>=14.16'}
@@ -4141,6 +4008,7 @@ packages:
     resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
     dependencies:
       wrappy: 1.0.2
+    dev: true
 
   /onetime@5.1.2:
     resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
@@ -4203,16 +4071,12 @@ packages:
   /os-tmpdir@1.0.2:
     resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
     engines: {node: '>=0.10.0'}
+    dev: true
 
   /ospath@1.2.2:
     resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
     dev: true
 
-  /p-cancelable@2.1.1:
-    resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
-    engines: {node: '>=8'}
-    dev: false
-
   /p-cancelable@3.0.0:
     resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
     engines: {node: '>=12.20'}
@@ -4281,6 +4145,7 @@ packages:
   /path-is-absolute@1.0.1:
     resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
     engines: {node: '>=0.10.0'}
+    dev: true
 
   /path-key@3.1.1:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
@@ -4315,6 +4180,7 @@ packages:
 
   /pend@1.2.0:
     resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+    dev: true
 
   /performance-now@2.1.0:
     resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
@@ -4408,17 +4274,13 @@ packages:
 
   /process-nextick-args@2.0.1:
     resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+    dev: true
 
   /process@0.11.10:
     resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
     engines: {node: '>= 0.6.0'}
     dev: true
 
-  /progress@2.0.3:
-    resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
-    engines: {node: '>=0.4.0'}
-    dev: false
-
   /proto-list@1.2.4:
     resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
 
@@ -4450,6 +4312,7 @@ packages:
     dependencies:
       end-of-stream: 1.4.4
       once: 1.4.0
+    dev: true
 
   /punycode@2.3.1:
     resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
@@ -4536,6 +4399,7 @@ packages:
       safe-buffer: 5.1.2
       string_decoder: 1.1.1
       util-deprecate: 1.0.2
+    dev: true
 
   /readable-stream@3.6.2:
     resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
@@ -4629,12 +4493,6 @@ packages:
       supports-preserve-symlinks-flag: 1.0.0
     dev: true
 
-  /responselike@2.0.1:
-    resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
-    dependencies:
-      lowercase-keys: 2.0.0
-    dev: false
-
   /responselike@3.0.0:
     resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
     engines: {node: '>=14.16'}
@@ -4659,13 +4517,6 @@ packages:
     resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==}
     dev: true
 
-  /rimraf@2.7.1:
-    resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
-    hasBin: true
-    dependencies:
-      glob: 7.2.3
-    dev: false
-
   /rimraf@3.0.2:
     resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
     hasBin: true
@@ -4982,6 +4833,7 @@ packages:
     resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
     dependencies:
       safe-buffer: 5.1.2
+    dev: true
 
   /string_decoder@1.3.0:
     resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
@@ -5056,6 +4908,7 @@ packages:
     engines: {node: '>=10'}
     dependencies:
       has-flag: 4.0.0
+    dev: true
 
   /supports-preserve-symlinks-flag@1.0.0:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
@@ -5133,6 +4986,7 @@ packages:
     engines: {node: '>=0.6.0'}
     dependencies:
       os-tmpdir: 1.0.2
+    dev: true
 
   /tmp@0.2.1:
     resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
@@ -5203,11 +5057,6 @@ packages:
       safe-buffer: 5.2.1
     dev: true
 
-  /tunnel@0.0.6:
-    resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
-    engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
-    dev: false
-
   /tweetnacl@0.14.5:
     resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
     dev: true
@@ -5257,10 +5106,6 @@ packages:
       is-typedarray: 1.0.0
     dev: false
 
-  /typedarray@0.0.6:
-    resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
-    dev: false
-
   /ufo@1.4.0:
     resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==}
     dev: true
@@ -5357,6 +5202,7 @@ packages:
 
   /util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+    dev: true
 
   /utils-merge@1.0.1:
     resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
@@ -5717,6 +5563,7 @@ packages:
 
   /wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+    dev: true
 
   /write-file-atomic@3.0.3:
     resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
@@ -5785,6 +5632,7 @@ packages:
     dependencies:
       buffer-crc32: 0.2.13
       fd-slicer: 1.1.0
+    dev: true
 
   /yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}

From 6d3bed2db60d7cb5979be46b6148e5b411ef3eee Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:34:31 +0100
Subject: [PATCH 26/54] refs #6797 fix(jenkins) momentarily

---
 Dockerfile | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 1906dc920..b601875f6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,5 @@
 FROM node:stretch-slim
-RUN corepack enable pnpm
-RUN pnpm install -g @quasar/cli
+RUN npm install -g @quasar/cli
 WORKDIR /app
 COPY dist/spa ./
 CMD ["quasar", "serve", "./", "--history", "--hostname", "0.0.0.0"]

From 4ac9dc3148cd3122a845a3699269d23692b91cde Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:35:33 +0100
Subject: [PATCH 27/54] refs #6797 fix(jenkins) momentarily

---
 package.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/package.json b/package.json
index d985c7268..3708007f2 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,7 @@
         "@quasar/cli": "^2.3.0",
         "@quasar/extras": "^1.16.9",
         "axios": "^1.4.0",
+        "chromium": "^3.0.3",
         "croppie": "^2.6.5",
         "pinia": "^2.1.3",
         "quasar": "^2.14.5",

From ed17fa067035f115e4c52da3962801a2351466d5 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:36:47 +0100
Subject: [PATCH 28/54] refs #6797 fix(jenkins) momentarily use npm

---
 Jenkinsfile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 0027e1cbe..be20b1021 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -62,7 +62,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'pnpm install --prefer-offline'
+                sh 'npm install --prefer-offline'
             }
         }
         stage('Test') {
@@ -73,7 +73,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'pnpm run test:unit:ci'
+                sh 'npm run test:unit:ci'
             }
             post {
                 always {

From 4059f168f6462da11b0740f2959b8ccc0b131cca Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:37:33 +0100
Subject: [PATCH 29/54] refs #6797 fix(jenkins) momentarily use bun

---
 Jenkinsfile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index be20b1021..5ed1cab81 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -62,7 +62,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'npm install --prefer-offline'
+                sh 'bun install --prefer-offline'
             }
         }
         stage('Test') {
@@ -73,7 +73,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'npm run test:unit:ci'
+                sh 'bun run test:unit:ci'
             }
             post {
                 always {

From d1e1a8e1fa18b95755a21f6256ff28f4c2daf55e Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:41:41 +0100
Subject: [PATCH 30/54] refs #6797 fix(jenkins) momentarily old package.json

---
 package.json | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/package.json b/package.json
index 3708007f2..148fbe369 100644
--- a/package.json
+++ b/package.json
@@ -16,12 +16,11 @@
     },
     "dependencies": {
         "@quasar/cli": "^2.3.0",
-        "@quasar/extras": "^1.16.9",
+        "@quasar/extras": "^1.16.4",
         "axios": "^1.4.0",
         "chromium": "^3.0.3",
-        "croppie": "^2.6.5",
         "pinia": "^2.1.3",
-        "quasar": "^2.14.5",
+        "quasar": "^2.12.0",
         "validator": "^13.9.0",
         "vue": "^3.3.4",
         "vue-i18n": "^9.2.2",
@@ -30,9 +29,9 @@
     "devDependencies": {
         "@intlify/unplugin-vue-i18n": "^0.8.1",
         "@pinia/testing": "^0.1.2",
-        "@quasar/app-vite": "^1.7.3",
-        "@quasar/quasar-app-extension-testing-unit-vitest": "^0.4.0",
-        "@vue/test-utils": "^2.4.4",
+        "@quasar/app-vite": "^1.4.3",
+        "@quasar/quasar-app-extension-testing-unit-vitest": "^0.3.0",
+        "@vue/test-utils": "^2.3.2",
         "autoprefixer": "^10.4.14",
         "cypress": "^12.13.0",
         "eslint": "^8.41.0",
@@ -41,17 +40,16 @@
         "eslint-plugin-vue": "^9.14.1",
         "postcss": "^8.4.23",
         "prettier": "^2.8.8",
-        "vitest": "^1.3.1"
+        "vitest": "^0.31.1"
     },
     "engines": {
         "node": "^20 || ^18 || ^16",
         "npm": ">= 8.1.2",
-        "yarn": ">= 1.21.1",
-        "bun": ">= 1.0.25"
+        "yarn": ">= 1.21.1"
     },
     "overrides": {
-        "@vitejs/plugin-vue": "^5.0.4",
-        "vite": "^5.1.4",
-        "vitest": "^1.3.1"
+        "@vitejs/plugin-vue": "^4.0.0",
+        "vite": "^4.3.5",
+        "vitest": "^0.31.1"
     }
 }

From cda05112470aa235b1e0f1d3b29313d7b2d8c779 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 13:43:33 +0100
Subject: [PATCH 31/54] refs #6797 fix(jenkins) momentarily old package.json

---
 Jenkinsfile  | 4 ++--
 package.json | 4 +++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 5ed1cab81..be20b1021 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -62,7 +62,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'bun install --prefer-offline'
+                sh 'npm install --prefer-offline'
             }
         }
         stage('Test') {
@@ -73,7 +73,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'bun run test:unit:ci'
+                sh 'npm run test:unit:ci'
             }
             post {
                 always {
diff --git a/package.json b/package.json
index 148fbe369..7beb22e55 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
         "@quasar/extras": "^1.16.4",
         "axios": "^1.4.0",
         "chromium": "^3.0.3",
+        "croppie": "^2.6.5",
         "pinia": "^2.1.3",
         "quasar": "^2.12.0",
         "validator": "^13.9.0",
@@ -45,7 +46,8 @@
     "engines": {
         "node": "^20 || ^18 || ^16",
         "npm": ">= 8.1.2",
-        "yarn": ">= 1.21.1"
+        "yarn": ">= 1.21.1",
+        "bun": ">= 1.0.25"
     },
     "overrides": {
         "@vitejs/plugin-vue": "^4.0.0",

From 5e5c2e640b5ea31ca0584c65e813ae8d1b2e700a Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Wed, 21 Feb 2024 13:48:48 +0100
Subject: [PATCH 32/54] refs #6768 consignee

---
 .../components/CustomerConsigneeCreate.vue    |   2 -
 .../components/CustomerConsigneeEdit.vue      | 117 +++---------------
 .../Supplier/Card/SupplierAddressesCreate.vue |  84 +++----------
 3 files changed, 29 insertions(+), 174 deletions(-)

diff --git a/src/pages/Customer/components/CustomerConsigneeCreate.vue b/src/pages/Customer/components/CustomerConsigneeCreate.vue
index 580dba6e3..e4302ed65 100644
--- a/src/pages/Customer/components/CustomerConsigneeCreate.vue
+++ b/src/pages/Customer/components/CustomerConsigneeCreate.vue
@@ -55,9 +55,7 @@ function handleLocation(data, location) {
     data.city = town;
     data.provinceFk = provinceFk;
     data.countryFk = countryFk;
-    console.log('data', data);
 }
-console.log('handleLocation: ', handleLocation);
 </script>
 
 <template>
diff --git a/src/pages/Customer/components/CustomerConsigneeEdit.vue b/src/pages/Customer/components/CustomerConsigneeEdit.vue
index 98996e479..afa6afa5d 100644
--- a/src/pages/Customer/components/CustomerConsigneeEdit.vue
+++ b/src/pages/Customer/components/CustomerConsigneeEdit.vue
@@ -4,7 +4,7 @@ import { useI18n } from 'vue-i18n';
 import { useRoute } from 'vue-router';
 
 import axios from 'axios';
-
+import VnLocation from 'src/components/common/VnLocation.vue';
 import FetchData from 'components/FetchData.vue';
 import FormModel from 'components/FormModel.vue';
 import VnRow from 'components/ui/VnRow.vue';
@@ -17,13 +17,8 @@ import CustomsNewCustomsAgent from 'src/pages/Customer/components/CustomerNewCus
 const { t } = useI18n();
 const route = useRoute();
 
-const townsFetchDataRef = ref(null);
-const postcodeFetchDataRef = ref(null);
 const urlUpdate = ref('');
-
 const postcodesOptions = ref([]);
-const citiesLocationOptions = ref([]);
-const provincesLocationOptions = ref([]);
 const agencyModes = ref([]);
 const incoterms = ref([]);
 const customsAgents = ref([]);
@@ -34,14 +29,6 @@ onBeforeMount(() => {
     urlUpdate.value = `Clients/${route.params.id}/updateAddress/${route.params.consigneeId}`;
 });
 
-const onPostcodeCreated = async ({ code, provinceFk, townFk }, formData) => {
-    await postcodeFetchDataRef.value.fetch();
-    await townsFetchDataRef.value.fetch();
-    formData.postalCode = code;
-    formData.provinceFk = provinceFk;
-    formData.city = citiesLocationOptions.value.find((town) => town.id === townFk).name;
-};
-
 const getData = async (observations) => {
     observationTypes.value = observations;
 
@@ -97,26 +84,16 @@ const onDataSaved = () => {
     };
     axios.post('AddressObservations/crud', payload);
 };
+function handleLocation(data, location) {
+    const { town, code, provinceFk, countryFk } = location ?? {};
+    data.postalCode = code;
+    data.city = town;
+    data.provinceFk = provinceFk;
+    data.countryFk = countryFk;
+}
 </script>
 
 <template>
-    <FetchData
-        ref="postcodeFetchDataRef"
-        @on-fetch="(data) => (postcodesOptions = data)"
-        auto-load
-        url="Postcodes/location"
-    />
-    <FetchData
-        ref="townsFetchDataRef"
-        @on-fetch="(data) => (citiesLocationOptions = data)"
-        auto-load
-        url="Towns/location"
-    />
-    <FetchData
-        @on-fetch="(data) => (provincesLocationOptions = data)"
-        auto-load
-        url="Provinces/location"
-    />
     <fetch-data
         @on-fetch="(data) => (agencyModes = data)"
         auto-load
@@ -168,83 +145,17 @@ const onDataSaved = () => {
 
             <VnRow class="row q-gutter-md q-mb-md">
                 <div class="col">
-                    <VnSelectDialog
-                        :label="t('Postcode')"
-                        :options="postcodesOptions"
-                        :roles-allowed-to-create="['deliveryAssistant']"
+                    <VnLocation
                         :rules="validate('Worker.postcode')"
-                        hide-selected
-                        option-label="code"
-                        option-value="code"
-                        v-model="data.postalCode"
-                    >
-                        <template #form>
-                            <CustomerCreateNewPostcode
-                                @on-data-saved="onPostcodeCreated($event, data)"
-                            />
-                        </template>
-                        <template #option="scope">
-                            <QItem v-bind="scope.itemProps">
-                                <QItemSection v-if="scope.opt">
-                                    <QItemLabel>{{ scope.opt.code }}</QItemLabel>
-                                    <QItemLabel caption>
-                                        {{ scope.opt.code }} -
-                                        {{ scope.opt.town.name }}
-                                        ({{ scope.opt.town.province.name }},
-                                        {{ scope.opt.town.province.country.country }})
-                                    </QItemLabel>
-                                </QItemSection>
-                            </QItem>
-                        </template>
-                    </VnSelectDialog>
-                </div>
-                <div class="col">
-                    <!-- ciudades -->
-                    <VnSelectFilter
-                        :label="t('City')"
-                        :options="citiesLocationOptions"
-                        hide-selected
-                        option-label="name"
-                        option-value="name"
-                        v-model="data.city"
-                    >
-                        <template #option="scope">
-                            <QItem v-bind="scope.itemProps">
-                                <QItemSection>
-                                    <QItemLabel>{{ scope.opt.name }}</QItemLabel>
-                                    <QItemLabel caption>
-                                        {{
-                                            `${scope.opt.name}, ${scope.opt.province.name} (${scope.opt.province.country.country})`
-                                        }}
-                                    </QItemLabel>
-                                </QItemSection>
-                            </QItem>
-                        </template>
-                    </VnSelectFilter>
+                        :roles-allowed-to-create="['deliveryAssistant']"
+                        :options="postcodesOptions"
+                        v-model="data.location"
+                        @update:model-value="(location) => handleLocation(data, location)"
+                    ></VnLocation>
                 </div>
             </VnRow>
 
             <VnRow class="row q-gutter-md q-mb-md">
-                <div class="col">
-                    <VnSelectFilter
-                        :label="t('Province')"
-                        :options="provincesLocationOptions"
-                        hide-selected
-                        option-label="name"
-                        option-value="id"
-                        v-model="data.provinceFk"
-                    >
-                        <template #option="scope">
-                            <QItem v-bind="scope.itemProps">
-                                <QItemSection>
-                                    <QItemLabel>{{
-                                        `${scope.opt.name} (${scope.opt.country.country})`
-                                    }}</QItemLabel>
-                                </QItemSection>
-                            </QItem>
-                        </template>
-                    </VnSelectFilter>
-                </div>
                 <div class="col">
                     <VnSelectFilter
                         :label="t('Agency')"
diff --git a/src/pages/Supplier/Card/SupplierAddressesCreate.vue b/src/pages/Supplier/Card/SupplierAddressesCreate.vue
index 21c0cd61a..69c180e0a 100644
--- a/src/pages/Supplier/Card/SupplierAddressesCreate.vue
+++ b/src/pages/Supplier/Card/SupplierAddressesCreate.vue
@@ -10,6 +10,7 @@ import VnInput from 'src/components/common/VnInput.vue';
 import VnSelectDialog from 'src/components/common/VnSelectDialog.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import CustomerCreateNewPostcode from 'src/components/CreateNewPostcodeForm.vue';
+import VnLocation from 'src/components/common/VnLocation.vue';
 
 const { t } = useI18n();
 const route = useRoute();
@@ -55,27 +56,16 @@ onMounted(() => {
         updateAddressForm(addressData);
     }
 });
+function handleLocation(data, location) {
+    const { town, code, provinceFk, countryFk } = location ?? {};
+    data.postalCode = code;
+    data.city = town;
+    data.provinceFk = provinceFk;
+    data.countryFk = countryFk;
+}
 </script>
 
 <template>
-    <FetchData
-        ref="postcodeFetchDataRef"
-        url="Postcodes/location"
-        @on-fetch="(data) => (postcodesOptions = data)"
-        auto-load
-    />
-    <FetchData
-        ref="provincesFetchDataRef"
-        @on-fetch="(data) => (provincesOptions = data)"
-        auto-load
-        url="Provinces"
-    />
-    <FetchData
-        ref="townsFetchDataRef"
-        @on-fetch="(data) => (townsLocationOptions = data)"
-        auto-load
-        url="Towns/location"
-    />
     <QPage>
         <FormModel
             model="supplierAddresses"
@@ -104,59 +94,15 @@ onMounted(() => {
                 </VnRow>
                 <VnRow class="row q-gutter-md q-mb-md">
                     <div class="col">
-                        <VnSelectDialog
-                            v-model="data.postalCode"
-                            :label="t('supplier.addresses.postcode')"
-                            :rules="validate('supplierAddress.postcode')"
+                        <VnLocation
+                            :rules="validate('Worker.postcode')"
                             :roles-allowed-to-create="['deliveryAssistant']"
                             :options="postcodesOptions"
-                            option-label="code"
-                            option-value="code"
-                            hide-selected
-                        >
-                            <template #form>
-                                <CustomerCreateNewPostcode
-                                    @on-data-saved="onPostcodeCreated($event)"
-                                />
-                            </template>
-                            <template #option="scope">
-                                <QItem v-bind="scope.itemProps">
-                                    <QItemSection v-if="scope.opt">
-                                        <QItemLabel>{{ scope.opt.code }}</QItemLabel>
-                                        <QItemLabel caption
-                                            >{{ scope.opt.code }} -
-                                            {{ scope.opt.town.name }} ({{
-                                                scope.opt.town.province.name
-                                            }},
-                                            {{
-                                                scope.opt.town.province.country.country
-                                            }})</QItemLabel
-                                        >
-                                    </QItemSection>
-                                </QItem>
-                            </template>
-                        </VnSelectDialog>
-                    </div>
-                    <div class="col">
-                        <VnSelectFilter
-                            :label="t('supplier.addresses.city')"
-                            :options="townsLocationOptions"
-                            v-model="data.city"
-                            hide-selected
-                            option-label="name"
-                            option-value="id"
-                        />
-                    </div>
-                    <div class="col">
-                        <VnSelectFilter
-                            :label="t('supplier.addresses.province')"
-                            :options="provincesOptions"
-                            hide-selected
-                            map-options
-                            option-label="name"
-                            option-value="id"
-                            v-model="data.provinceFk"
-                        />
+                            v-model="data.location"
+                            @update:model-value="
+                                (location) => handleLocation(data, location)
+                            "
+                        ></VnLocation>
                     </div>
                 </VnRow>
                 <VnRow class="row q-gutter-md q-mb-md">

From 33eef88825c33bbce5661a165a7c8d94364a9597 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 21 Feb 2024 14:00:52 +0100
Subject: [PATCH 33/54] refs #5509 fix: e2e

---
 test/cypress/integration/claim/claimDevelopment.spec.js     | 4 ++--
 .../integration/invoiceIn/invoiceInIntrastat.spec.js        | 2 +-
 test/cypress/integration/invoiceIn/invoiceInVat.spec.js     | 2 +-
 test/cypress/support/commands.js                            | 6 +++---
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/test/cypress/integration/claim/claimDevelopment.spec.js b/test/cypress/integration/claim/claimDevelopment.spec.js
index 88ccbfab8..26c7ee196 100755
--- a/test/cypress/integration/claim/claimDevelopment.spec.js
+++ b/test/cypress/integration/claim/claimDevelopment.spec.js
@@ -13,7 +13,7 @@ describe('ClaimDevelopment', () => {
     it('should reset line', () => {
         cy.selectOption(firstLineReason, 'Novato');
         cy.resetCard();
-        cy.getValue(firstLineReason).should('have.value', 'Prisas');
+        cy.getValue(firstLineReason).should('equal', 'Prisas');
     });
 
     it('should edit line', () => {
@@ -23,7 +23,7 @@ describe('ClaimDevelopment', () => {
         cy.login('developer');
         cy.visit(`/#/claim/${claimId}/development`);
 
-        cy.getValue(firstLineReason).should('have.value', 'Novato');
+        cy.getValue(firstLineReason).should('equal', 'Novato');
 
         //Restart data
         cy.selectOption(firstLineReason, 'Prisas');
diff --git a/test/cypress/integration/invoiceIn/invoiceInIntrastat.spec.js b/test/cypress/integration/invoiceIn/invoiceInIntrastat.spec.js
index 5024b2f1c..306c0b8c0 100644
--- a/test/cypress/integration/invoiceIn/invoiceInIntrastat.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInIntrastat.spec.js
@@ -18,7 +18,7 @@ describe('InvoiceInIntrastat', () => {
         cy.visit(`/#/invoice-in/1/intrastat`);
 
         cy.getValue(firstLineCode).should(
-            'have.value',
+            'equal',
             'Plantas vivas: Esqueje/injerto, Vid'
         );
     });
diff --git a/test/cypress/integration/invoiceIn/invoiceInVat.spec.js b/test/cypress/integration/invoiceIn/invoiceInVat.spec.js
index 26c7750ad..811374b98 100644
--- a/test/cypress/integration/invoiceIn/invoiceInVat.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInVat.spec.js
@@ -21,7 +21,7 @@ describe('InvoiceInVat', () => {
         cy.saveCard();
         cy.visit(`/#/invoice-in/1/vat`);
 
-        cy.getValue(firstLineVat).should('have.value', 'H.P. IVA 21% CEE');
+        cy.getValue(firstLineVat).should('equal', 'H.P. IVA 21% CEE');
     });
 
     it('should add a new row', () => {
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index a8b4a86f0..f075d500f 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -55,13 +55,13 @@ Cypress.Commands.add('getValue', (selector) => {
             return cy.get(
                 selector +
                     '> .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > input'
-            );
+            ).invoke('val')
         }
         // Si es un QSelect
         if ($el.find('span').length) {
             return cy.get(
                 selector + ' span'
-            );
+            ).then(($span) => { return $span[0].innerText })
         }
         // Puedes añadir un log o lanzar un error si el elemento no es reconocido
         cy.log('Elemento no soportado');
@@ -138,7 +138,7 @@ Cypress.Commands.add('validateRow', (rowSelector, expectedValues) => {
                 cy.getValue(`:nth-child(${index + 1})`).should(`${prefix}be.checked`);
                 continue;
             }
-            cy.getValue(`:nth-child(${index + 1})`).invoke('text').should('have.value', value)
+            cy.getValue(`:nth-child(${index + 1})`).should('equal', value)
         }
     });
 });

From 00bed4fd619652d44bcdd4df8ff0ee4f73e62259 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Thu, 22 Feb 2024 10:20:44 +0100
Subject: [PATCH 34/54] refs #5509 fix(FormModel): autoLoad && formInitalData

---
 src/components/FormModel.vue                    | 5 ++---
 src/pages/InvoiceIn/Card/InvoiceInBasicData.vue | 7 ++++++-
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
index c33835438..504a7acd6 100644
--- a/src/components/FormModel.vue
+++ b/src/components/FormModel.vue
@@ -79,9 +79,8 @@ onMounted(async () => {
     });
 
     // Podemos enviarle al form la estructura de data inicial sin necesidad de fetchearla
-    if ($props.formInitialData || !$props.autoLoad) {
-        state.set($props.model, $props.formInitialData ?? {});
-    } else {
+    state.set($props.model, $props.formInitialData ?? {});
+    if ($props.autoLoad && !$props.formInitialData) {
         await fetch();
     }
 
diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
index 2a29a3d0e..306220dd3 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
@@ -174,7 +174,12 @@ async function upsert() {
         @on-fetch="(data) => (userConfig = data)"
         auto-load
     />
-    <FormModel v-if="invoiceIn" :url="`InvoiceIns/${route.params.id}`" model="invoiceIn">
+    <FormModel
+        v-if="invoiceIn"
+        :url="`InvoiceIns/${route.params.id}`"
+        model="invoiceIn"
+        :auto-load="true"
+    >
         <template #form="{ data }">
             <div class="row q-gutter-md q-mb-md">
                 <div class="col">

From de184e9cf829a60d328946c2a669624096d9ab1e Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Thu, 22 Feb 2024 10:57:11 +0100
Subject: [PATCH 35/54] refs #5509 feat(DMS): change icon

---
 src/router/modules/entry.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/router/modules/entry.js b/src/router/modules/entry.js
index 339feaa0c..2f6c8cb4c 100644
--- a/src/router/modules/entry.js
+++ b/src/router/modules/entry.js
@@ -100,7 +100,7 @@ export default {
                     name: 'EntryDms',
                     meta: {
                         title: 'dms',
-                        icon: 'cloud_upload',
+                        icon: 'smb_share',
                     },
                     component: () => import('src/pages/Entry/Card/EntryDms.vue'),
                 },

From 3316aa02ff3be9c719d671fa72d9c1e3f9134dfe Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Fri, 23 Feb 2024 13:28:30 +0100
Subject: [PATCH 36/54] refs #6768 fix postalCode

---
 src/pages/Supplier/Card/SupplierFiscalData.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Supplier/Card/SupplierFiscalData.vue b/src/pages/Supplier/Card/SupplierFiscalData.vue
index b26582065..becf6d818 100644
--- a/src/pages/Supplier/Card/SupplierFiscalData.vue
+++ b/src/pages/Supplier/Card/SupplierFiscalData.vue
@@ -21,7 +21,7 @@ const postcodesOptions = ref([]);
 
 function handleLocation(data, location) {
     const { town, code, provinceFk, countryFk } = location ?? {};
-    data.postcode = code;
+    data.postCode = code;
     data.city = town;
     data.provinceFk = provinceFk;
     data.countryFk = countryFk;

From e859fc29c858477659aeab175445a8987ec6327c Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Mon, 26 Feb 2024 08:33:17 +0100
Subject: [PATCH 37/54] refs #6935 feat: remove width, add text-align and label
 :

---
 src/components/ui/CardDescriptor.vue | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue
index 241937a4e..345c8d088 100644
--- a/src/components/ui/CardDescriptor.vue
+++ b/src/components/ui/CardDescriptor.vue
@@ -188,16 +188,18 @@ const emit = defineEmits(['onFetch']);
         .label {
             color: var(--vn-label);
             font-size: 12px;
-            width: 47%;
+            ::after {
+                content: ':';
+            }
         }
         .value {
             color: var(--vn-text);
             font-size: 14px;
             margin-left: 12px;
-            width: 47%;
             overflow: hidden;
             text-overflow: ellipsis;
             white-space: nowrap;
+            text-align: left;
         }
         .info {
             margin-left: 5px;

From d3d73b985e724def3d7b1735127920ea0a7c7ccb Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 26 Feb 2024 09:16:37 +0100
Subject: [PATCH 38/54] refs #6336 fix(claimSummary): loadPhoto, ItemDescriptor

---
 src/pages/Claim/Card/ClaimSummary.vue       | 17 ++++++++++++-----
 src/pages/Item/Card/ItemDescriptor.vue      | 20 ++++++++++++++++++--
 src/pages/Item/Card/ItemDescriptorProxy.vue |  5 +++++
 3 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue
index cdc1f15be..b93cbbd81 100644
--- a/src/pages/Claim/Card/ClaimSummary.vue
+++ b/src/pages/Claim/Card/ClaimSummary.vue
@@ -35,7 +35,6 @@ const claimDmsFilter = ref({
             relation: 'dms',
         },
     ],
-    where: { claimFk: entityId.value },
 });
 
 onMounted(async () => {
@@ -141,6 +140,11 @@ const claimDms = ref([]);
 const multimediaDialog = ref();
 const multimediaSlide = ref();
 
+async function getClaimDms() {
+    claimDmsFilter.value.where = { claimFk: entityId.value };
+    await claimDmsRef.value.fetch();
+}
+
 function setClaimDms(data) {
     claimDms.value = [];
     data.forEach((media) => {
@@ -163,10 +167,13 @@ function openDialog(dmsId) {
         url="ClaimDms"
         :filter="claimDmsFilter"
         @on-fetch="(data) => setClaimDms(data)"
-        limit="20"
         ref="claimDmsRef"
     />
-    <CardSummary ref="summary" :url="`Claims/${entityId}/getSummary`">
+    <CardSummary
+        ref="summary"
+        :url="`Claims/${entityId}/getSummary`"
+        @on-fetch="getClaimDms"
+    >
         <template #header="{ entity: { claim } }">
             {{ claim.id }} - {{ claim.client.name }}
         </template>
@@ -252,7 +259,8 @@ function openDialog(dmsId) {
                                 >
                                 <ItemDescriptorProxy
                                     v-if="col.name == 'description'"
-                                    :id="2"
+                                    :id="props.row.id"
+                                    :sale-fk="props.row.saleFk"
                                 ></ItemDescriptorProxy>
                             </QTh>
                         </QTr>
@@ -274,7 +282,6 @@ function openDialog(dmsId) {
                     </template>
                 </QTable>
             </QCard>
-
             <QCard class="vn-max" v-if="claimDms.length > 0">
                 <a class="header" :href="`#/claim/${entityId}/photos`">
                     {{ t('claim.summary.photos') }}
diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue
index 362fcfc67..8c986e627 100644
--- a/src/pages/Item/Card/ItemDescriptor.vue
+++ b/src/pages/Item/Card/ItemDescriptor.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { computed, ref, onMounted, onUnmounted } from 'vue';
+import { computed, ref, onMounted } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { useQuasar } from 'quasar';
@@ -14,6 +14,7 @@ import EditPictureForm from 'components/EditPictureForm.vue';
 import { useState } from 'src/composables/useState';
 import useCardDescription from 'src/composables/useCardDescription';
 import { useSession } from 'src/composables/useSession';
+import { getUrl } from 'src/composables/getUrl';
 import axios from 'axios';
 
 const $props = defineProps({
@@ -30,6 +31,10 @@ const $props = defineProps({
         type: String,
         default: null,
     },
+    saleFk: {
+        type: Number,
+        default: null,
+    },
 });
 
 const quasar = useQuasar();
@@ -51,6 +56,7 @@ const available = ref(null);
 const visible = ref(null);
 const _warehouseFk = ref(null);
 const warehouseText = ref(null);
+const salixUrl = ref();
 const warehouseFk = computed({
     get() {
         return _warehouseFk.value;
@@ -69,6 +75,7 @@ const showEditPhotoForm = ref(false);
 onMounted(async () => {
     await getItemAvatar();
     warehouseFk.value = user.value.warehouseFk;
+    salixUrl.value = await getUrl('');
 });
 
 const getItemAvatar = async () => {
@@ -276,7 +283,16 @@ const openCloneDialog = async () => {
         <template #actions="{}">
             <QCardActions class="row justify-center">
                 <QBtn
-                    :to="{ name: 'ItemDiary' }"
+                    :href="
+                        salixUrl +
+                        'item/' +
+                        entityId +
+                        '/diary?' +
+                        'warehouseFk=' +
+                        warehouseFk +
+                        '&lineFk=' +
+                        $props.saleFk
+                    "
                     size="md"
                     icon="vn:transaction"
                     color="primary"
diff --git a/src/pages/Item/Card/ItemDescriptorProxy.vue b/src/pages/Item/Card/ItemDescriptorProxy.vue
index 5ddf434d5..2b7b39a65 100644
--- a/src/pages/Item/Card/ItemDescriptorProxy.vue
+++ b/src/pages/Item/Card/ItemDescriptorProxy.vue
@@ -11,6 +11,10 @@ const $props = defineProps({
         type: String,
         default: null,
     },
+    saleFk: {
+        type: Number,
+        default: null,
+    },
 });
 </script>
 
@@ -21,6 +25,7 @@ const $props = defineProps({
             :id="$props.id"
             :summary="ItemSummary"
             :dated="dated"
+            :sale-fk="saleFk"
         />
     </QPopupProxy>
 </template>

From fa80586fdd1079bb6730d94a74bb5c3bdc6875b9 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 26 Feb 2024 12:33:06 +0100
Subject: [PATCH 39/54] refs #6797 deploy: use pnpm

---
 Dockerfile     |   3 +-
 Jenkinsfile    |   4 +-
 package.json   |  19 ++---
 pnpm-lock.yaml | 212 ++++++++++++++++++++++++++++++++++++++++++-------
 4 files changed, 196 insertions(+), 42 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index b601875f6..1906dc920 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,6 @@
 FROM node:stretch-slim
-RUN npm install -g @quasar/cli
+RUN corepack enable pnpm
+RUN pnpm install -g @quasar/cli
 WORKDIR /app
 COPY dist/spa ./
 CMD ["quasar", "serve", "./", "--history", "--hostname", "0.0.0.0"]
diff --git a/Jenkinsfile b/Jenkinsfile
index be20b1021..0027e1cbe 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -62,7 +62,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'npm install --prefer-offline'
+                sh 'pnpm install --prefer-offline'
             }
         }
         stage('Test') {
@@ -73,7 +73,7 @@ pipeline {
                 NODE_ENV = ""
             }
             steps {
-                sh 'npm run test:unit:ci'
+                sh 'pnpm run test:unit:ci'
             }
             post {
                 always {
diff --git a/package.json b/package.json
index 7beb22e55..2bc3b661a 100644
--- a/package.json
+++ b/package.json
@@ -5,6 +5,7 @@
     "productName": "Salix",
     "author": "Verdnatura",
     "private": true,
+    "packageManager": "pnpm@8.15.1",
     "scripts": {
         "lint": "eslint --ext .js,.vue ./",
         "format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
@@ -16,12 +17,12 @@
     },
     "dependencies": {
         "@quasar/cli": "^2.3.0",
-        "@quasar/extras": "^1.16.4",
+        "@quasar/extras": "^1.16.9",
         "axios": "^1.4.0",
         "chromium": "^3.0.3",
         "croppie": "^2.6.5",
         "pinia": "^2.1.3",
-        "quasar": "^2.12.0",
+        "quasar": "^2.14.5",
         "validator": "^13.9.0",
         "vue": "^3.3.4",
         "vue-i18n": "^9.2.2",
@@ -30,9 +31,9 @@
     "devDependencies": {
         "@intlify/unplugin-vue-i18n": "^0.8.1",
         "@pinia/testing": "^0.1.2",
-        "@quasar/app-vite": "^1.4.3",
-        "@quasar/quasar-app-extension-testing-unit-vitest": "^0.3.0",
-        "@vue/test-utils": "^2.3.2",
+        "@quasar/app-vite": "^1.7.3",
+        "@quasar/quasar-app-extension-testing-unit-vitest": "^0.4.0",
+        "@vue/test-utils": "^2.4.4",
         "autoprefixer": "^10.4.14",
         "cypress": "^12.13.0",
         "eslint": "^8.41.0",
@@ -41,7 +42,7 @@
         "eslint-plugin-vue": "^9.14.1",
         "postcss": "^8.4.23",
         "prettier": "^2.8.8",
-        "vitest": "^0.31.1"
+        "vitest": "^1.3.1"
     },
     "engines": {
         "node": "^20 || ^18 || ^16",
@@ -50,8 +51,8 @@
         "bun": ">= 1.0.25"
     },
     "overrides": {
-        "@vitejs/plugin-vue": "^4.0.0",
-        "vite": "^4.3.5",
-        "vitest": "^0.31.1"
+        "@vitejs/plugin-vue": "^5.0.4",
+        "vite": "^5.1.4",
+        "vitest": "^1.3.1"
     }
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7a6dc9ee8..5ef5b94c9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,6 +14,9 @@ dependencies:
   axios:
     specifier: ^1.4.0
     version: 1.6.7
+  chromium:
+    specifier: ^3.0.3
+    version: 3.0.3
   croppie:
     specifier: ^2.6.5
     version: 2.6.5
@@ -891,11 +894,23 @@ packages:
     resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
     dev: true
 
+  /@sindresorhus/is@4.6.0:
+    resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+    engines: {node: '>=10'}
+    dev: false
+
   /@sindresorhus/is@5.6.0:
     resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
     engines: {node: '>=14.16'}
     dev: false
 
+  /@szmarczak/http-timer@4.0.6:
+    resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
+    engines: {node: '>=10'}
+    dependencies:
+      defer-to-connect: 2.0.1
+    dev: false
+
   /@szmarczak/http-timer@5.0.1:
     resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
     engines: {node: '>=14.16'}
@@ -910,6 +925,15 @@ packages:
       '@types/node': 20.11.19
     dev: true
 
+  /@types/cacheable-request@6.0.3:
+    resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
+    dependencies:
+      '@types/http-cache-semantics': 4.0.4
+      '@types/keyv': 3.1.4
+      '@types/node': 20.11.19
+      '@types/responselike': 1.0.3
+    dev: false
+
   /@types/chrome@0.0.208:
     resolution: {integrity: sha512-VDU/JnXkF5qaI7WBz14Azpa2VseZTgML0ia/g/B1sr9OfdOnHiH/zZ7P7qCDqxSlkqJh76/bPc8jLFcx8rHJmw==}
     dependencies:
@@ -987,6 +1011,12 @@ packages:
     resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
     dev: true
 
+  /@types/keyv@3.1.4:
+    resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
+    dependencies:
+      '@types/node': 20.11.19
+    dev: false
+
   /@types/mime@1.3.5:
     resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
     dev: true
@@ -1018,6 +1048,12 @@ packages:
     resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
     dev: true
 
+  /@types/responselike@1.0.3:
+    resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
+    dependencies:
+      '@types/node': 20.11.19
+    dev: false
+
   /@types/send@0.17.4:
     resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
     dependencies:
@@ -1433,7 +1469,6 @@ packages:
 
   /balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-    dev: true
 
   /base64-js@1.5.1:
     resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -1520,7 +1555,6 @@ packages:
     dependencies:
       balanced-match: 1.0.2
       concat-map: 0.0.1
-    dev: true
 
   /brace-expansion@2.0.1:
     resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
@@ -1547,7 +1581,10 @@ packages:
 
   /buffer-crc32@0.2.13:
     resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
-    dev: true
+
+  /buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+    dev: false
 
   /buffer@5.7.1:
     resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
@@ -1576,6 +1613,11 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /cacheable-lookup@5.0.4:
+    resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
+    engines: {node: '>=10.6.0'}
+    dev: false
+
   /cacheable-lookup@7.0.0:
     resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
     engines: {node: '>=14.16'}
@@ -1594,10 +1636,22 @@ packages:
       responselike: 3.0.0
     dev: false
 
+  /cacheable-request@7.0.4:
+    resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
+    engines: {node: '>=8'}
+    dependencies:
+      clone-response: 1.0.3
+      get-stream: 5.2.0
+      http-cache-semantics: 4.1.1
+      keyv: 4.5.4
+      lowercase-keys: 2.0.0
+      normalize-url: 6.1.0
+      responselike: 2.0.1
+    dev: false
+
   /cachedir@2.4.0:
     resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
     engines: {node: '>=6'}
-    dev: true
 
   /call-bind@1.0.7:
     resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
@@ -1690,6 +1744,23 @@ packages:
       fsevents: 2.3.3
     dev: true
 
+  /chromium@3.0.3:
+    resolution: {integrity: sha512-TfbzP/3t38Us5xrbb9x87M/y5I/j3jx0zeJhhQ72gjp6dwJuhVP6hBZnBH4wEg7512VVXk9zCfTuPFOdw7bQqg==}
+    os: [darwin, linux, win32]
+    requiresBuild: true
+    dependencies:
+      cachedir: 2.4.0
+      debug: 4.3.4(supports-color@8.1.1)
+      extract-zip: 1.7.0
+      got: 11.8.6
+      progress: 2.0.3
+      rimraf: 2.7.1
+      tmp: 0.0.33
+      tunnel: 0.0.6
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /ci-info@3.9.0:
     resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
     engines: {node: '>=8'}
@@ -1763,6 +1834,12 @@ packages:
       shallow-clone: 3.0.1
     dev: true
 
+  /clone-response@1.0.3:
+    resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
+    dependencies:
+      mimic-response: 1.0.1
+    dev: false
+
   /clone@1.0.4:
     resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
     engines: {node: '>=0.8'}
@@ -1845,7 +1922,16 @@ packages:
 
   /concat-map@0.0.1:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-    dev: true
+
+  /concat-stream@1.6.2:
+    resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
+    engines: {'0': node >= 0.8}
+    dependencies:
+      buffer-from: 1.1.2
+      inherits: 2.0.4
+      readable-stream: 2.3.8
+      typedarray: 0.0.6
+    dev: false
 
   /config-chain@1.1.13:
     resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
@@ -1892,7 +1978,6 @@ packages:
 
   /core-util-is@1.0.3:
     resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
-    dev: true
 
   /cors@2.8.5:
     resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
@@ -2054,7 +2139,6 @@ packages:
     dependencies:
       ms: 2.1.2
       supports-color: 8.1.1
-    dev: true
 
   /decompress-response@6.0.0:
     resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
@@ -2205,7 +2289,6 @@ packages:
     resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
     dependencies:
       once: 1.4.0
-    dev: true
 
   /enquirer@2.4.1:
     resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
@@ -2780,6 +2863,18 @@ packages:
       tmp: 0.0.33
     dev: true
 
+  /extract-zip@1.7.0:
+    resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==}
+    hasBin: true
+    dependencies:
+      concat-stream: 1.6.2
+      debug: 2.6.9
+      mkdirp: 0.5.6
+      yauzl: 2.10.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /extract-zip@2.0.1(supports-color@8.1.1):
     resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
     engines: {node: '>= 10.17.0'}
@@ -2843,7 +2938,6 @@ packages:
     resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
     dependencies:
       pend: 1.2.0
-    dev: true
 
   /figures@3.2.0:
     resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
@@ -2986,7 +3080,6 @@ packages:
 
   /fs.realpath@1.0.0:
     resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-    dev: true
 
   /fsevents@2.3.3:
     resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
@@ -3023,7 +3116,6 @@ packages:
     engines: {node: '>=8'}
     dependencies:
       pump: 3.0.0
-    dev: true
 
   /get-stream@6.0.1:
     resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
@@ -3086,7 +3178,6 @@ packages:
       minimatch: 3.1.2
       once: 1.4.0
       path-is-absolute: 1.0.1
-    dev: true
 
   /global-dirs@3.0.1:
     resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
@@ -3110,6 +3201,23 @@ packages:
     dependencies:
       get-intrinsic: 1.2.4
 
+  /got@11.8.6:
+    resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
+    engines: {node: '>=10.19.0'}
+    dependencies:
+      '@sindresorhus/is': 4.6.0
+      '@szmarczak/http-timer': 4.0.6
+      '@types/cacheable-request': 6.0.3
+      '@types/responselike': 1.0.3
+      cacheable-lookup: 5.0.4
+      cacheable-request: 7.0.4
+      decompress-response: 6.0.0
+      http2-wrapper: 1.0.3
+      lowercase-keys: 2.0.0
+      p-cancelable: 2.1.1
+      responselike: 2.0.1
+    dev: false
+
   /got@12.6.1:
     resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==}
     engines: {node: '>=14.16'}
@@ -3152,7 +3260,6 @@ packages:
   /has-flag@4.0.0:
     resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
     engines: {node: '>=8'}
-    dev: true
 
   /has-property-descriptors@1.0.2:
     resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
@@ -3249,6 +3356,14 @@ packages:
       sshpk: 1.18.0
     dev: true
 
+  /http2-wrapper@1.0.3:
+    resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
+    engines: {node: '>=10.19.0'}
+    dependencies:
+      quick-lru: 5.1.1
+      resolve-alpn: 1.2.1
+    dev: false
+
   /http2-wrapper@2.2.1:
     resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
     engines: {node: '>=10.19.0'}
@@ -3330,7 +3445,6 @@ packages:
     dependencies:
       once: 1.4.0
       wrappy: 1.0.2
-    dev: true
 
   /inherits@2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -3489,7 +3603,6 @@ packages:
 
   /isarray@1.0.0:
     resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
-    dev: true
 
   /isbinaryfile@5.0.2:
     resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==}
@@ -3764,6 +3877,11 @@ packages:
     resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==}
     dev: true
 
+  /lowercase-keys@2.0.0:
+    resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
+    engines: {node: '>=8'}
+    dev: false
+
   /lowercase-keys@3.0.0:
     resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -3842,6 +3960,11 @@ packages:
     resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
     engines: {node: '>=12'}
 
+  /mimic-response@1.0.1:
+    resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+    engines: {node: '>=4'}
+    dev: false
+
   /mimic-response@3.1.0:
     resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
     engines: {node: '>=10'}
@@ -3856,7 +3979,6 @@ packages:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
     dependencies:
       brace-expansion: 1.1.11
-    dev: true
 
   /minimatch@5.1.6:
     resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
@@ -3887,6 +4009,13 @@ packages:
     engines: {node: '>=16 || 14 >=14.17'}
     dev: true
 
+  /mkdirp@0.5.6:
+    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+    hasBin: true
+    dependencies:
+      minimist: 1.2.8
+    dev: false
+
   /mlly@1.5.0:
     resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==}
     dependencies:
@@ -3901,7 +4030,6 @@ packages:
 
   /ms@2.1.2:
     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-    dev: true
 
   /ms@2.1.3:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -3964,6 +4092,11 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
+  /normalize-url@6.1.0:
+    resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
+    engines: {node: '>=10'}
+    dev: false
+
   /normalize-url@8.0.0:
     resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
     engines: {node: '>=14.16'}
@@ -4008,7 +4141,6 @@ packages:
     resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
     dependencies:
       wrappy: 1.0.2
-    dev: true
 
   /onetime@5.1.2:
     resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
@@ -4071,12 +4203,16 @@ packages:
   /os-tmpdir@1.0.2:
     resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
     engines: {node: '>=0.10.0'}
-    dev: true
 
   /ospath@1.2.2:
     resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
     dev: true
 
+  /p-cancelable@2.1.1:
+    resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
+    engines: {node: '>=8'}
+    dev: false
+
   /p-cancelable@3.0.0:
     resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
     engines: {node: '>=12.20'}
@@ -4145,7 +4281,6 @@ packages:
   /path-is-absolute@1.0.1:
     resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
     engines: {node: '>=0.10.0'}
-    dev: true
 
   /path-key@3.1.1:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
@@ -4180,7 +4315,6 @@ packages:
 
   /pend@1.2.0:
     resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
-    dev: true
 
   /performance-now@2.1.0:
     resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
@@ -4274,13 +4408,17 @@ packages:
 
   /process-nextick-args@2.0.1:
     resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
-    dev: true
 
   /process@0.11.10:
     resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
     engines: {node: '>= 0.6.0'}
     dev: true
 
+  /progress@2.0.3:
+    resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+    engines: {node: '>=0.4.0'}
+    dev: false
+
   /proto-list@1.2.4:
     resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
 
@@ -4312,7 +4450,6 @@ packages:
     dependencies:
       end-of-stream: 1.4.4
       once: 1.4.0
-    dev: true
 
   /punycode@2.3.1:
     resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
@@ -4399,7 +4536,6 @@ packages:
       safe-buffer: 5.1.2
       string_decoder: 1.1.1
       util-deprecate: 1.0.2
-    dev: true
 
   /readable-stream@3.6.2:
     resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
@@ -4493,6 +4629,12 @@ packages:
       supports-preserve-symlinks-flag: 1.0.0
     dev: true
 
+  /responselike@2.0.1:
+    resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
+    dependencies:
+      lowercase-keys: 2.0.0
+    dev: false
+
   /responselike@3.0.0:
     resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
     engines: {node: '>=14.16'}
@@ -4517,6 +4659,13 @@ packages:
     resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==}
     dev: true
 
+  /rimraf@2.7.1:
+    resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+    hasBin: true
+    dependencies:
+      glob: 7.2.3
+    dev: false
+
   /rimraf@3.0.2:
     resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
     hasBin: true
@@ -4833,7 +4982,6 @@ packages:
     resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
     dependencies:
       safe-buffer: 5.1.2
-    dev: true
 
   /string_decoder@1.3.0:
     resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
@@ -4908,7 +5056,6 @@ packages:
     engines: {node: '>=10'}
     dependencies:
       has-flag: 4.0.0
-    dev: true
 
   /supports-preserve-symlinks-flag@1.0.0:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
@@ -4986,7 +5133,6 @@ packages:
     engines: {node: '>=0.6.0'}
     dependencies:
       os-tmpdir: 1.0.2
-    dev: true
 
   /tmp@0.2.1:
     resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
@@ -5057,6 +5203,11 @@ packages:
       safe-buffer: 5.2.1
     dev: true
 
+  /tunnel@0.0.6:
+    resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
+    engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
+    dev: false
+
   /tweetnacl@0.14.5:
     resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
     dev: true
@@ -5106,6 +5257,10 @@ packages:
       is-typedarray: 1.0.0
     dev: false
 
+  /typedarray@0.0.6:
+    resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+    dev: false
+
   /ufo@1.4.0:
     resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==}
     dev: true
@@ -5202,7 +5357,6 @@ packages:
 
   /util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-    dev: true
 
   /utils-merge@1.0.1:
     resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
@@ -5563,7 +5717,6 @@ packages:
 
   /wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-    dev: true
 
   /write-file-atomic@3.0.3:
     resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
@@ -5632,7 +5785,6 @@ packages:
     dependencies:
       buffer-crc32: 0.2.13
       fd-slicer: 1.1.0
-    dev: true
 
   /yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}

From b6d84a5fc6e5a39844d35a610196963b2a674d49 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Mon, 26 Feb 2024 14:17:02 +0100
Subject: [PATCH 40/54] fix: refs #6904 VnLv icon, customer summary &
 extendedList

---
 src/components/ui/VnLv.vue                    | 23 +++--
 src/i18n/en/index.js                          |  5 +-
 src/i18n/es/index.js                          |  5 +-
 src/pages/Customer/Card/CustomerSummary.vue   | 28 +++++-
 .../ExtendedList/CustomerExtendedList.vue     | 85 ++++++++++---------
 5 files changed, 96 insertions(+), 50 deletions(-)

diff --git a/src/components/ui/VnLv.vue b/src/components/ui/VnLv.vue
index 0e4a055eb..72c05ae6a 100644
--- a/src/components/ui/VnLv.vue
+++ b/src/components/ui/VnLv.vue
@@ -1,8 +1,9 @@
 <script setup>
 import { computed } from 'vue';
 import { dashIfEmpty } from 'src/filters';
-
+import { useI18n } from 'vue-i18n';
 import { useClipboard } from 'src/composables/useClipboard';
+
 const $props = defineProps({
     label: { type: String, default: null },
     value: {
@@ -13,8 +14,9 @@ const $props = defineProps({
     dash: { type: Boolean, default: true },
     copy: { type: Boolean, default: false },
 });
-const isBooleanValue = computed(() => typeof $props.value === 'boolean');
 
+const { t } = useI18n();
+const isBooleanValue = computed(() => typeof $props.value === 'boolean');
 const { copyText } = useClipboard();
 
 function copyValueText() {
@@ -54,22 +56,29 @@ function copyValueText() {
             </slot>
         </div>
         <div class="info" v-if="$props.info">
-            <QIcon name="info">
+            <QIcon name="info" class="cursor-pointer" size="xs" color="grey">
                 <QTooltip class="bg-dark text-white shadow-4" :offset="[10, 10]">
                     {{ $props.info }}
                 </QTooltip>
             </QIcon>
         </div>
         <div class="copy" v-if="$props.copy && $props.value" @click="copyValueText()">
-            <QIcon name="Content_Copy" color="primary" />
+            <QIcon name="Content_Copy" color="primary">
+                <QTooltip>{{ t('globals.copyClipboard') }}</QTooltip>
+            </QIcon>
         </div>
     </div>
 </template>
 
 <style lang="scss" scoped>
+.vn-label-value:hover .copy {
+    visibility: visible;
+    cursor: pointer;
+}
 .copy {
-    &:hover {
-        cursor: pointer;
-    }
+    visibility: hidden;
+}
+.info {
+    margin-left: 5px;
 }
 </style>
diff --git a/src/i18n/en/index.js b/src/i18n/en/index.js
index 9e0ad7c9b..298720027 100644
--- a/src/i18n/en/index.js
+++ b/src/i18n/en/index.js
@@ -70,6 +70,7 @@ export default {
         system: 'System',
         fieldRequired: 'Field required',
         allowedFilesText: 'Allowed file types: { allowedContentTypes }',
+        copyClipboard: 'Copy on clipboard',
     },
     errors: {
         statusUnauthorized: 'Access denied',
@@ -166,7 +167,7 @@ export default {
             fiscalAddress: 'Fiscal address',
             fiscalData: 'Fiscal data',
             billingData: 'Billing data',
-            consignee: 'Consignee',
+            consignee: 'Default consignee',
             businessData: 'Business data',
             financialData: 'Financial data',
             customerId: 'Customer ID',
@@ -219,6 +220,8 @@ export default {
             recoverySince: 'Recovery since',
             businessType: 'Business Type',
             city: 'City',
+            rating: 'Rating',
+            recommendCredit: 'Recommended credit',
         },
         basicData: {
             socialName: 'Fiscal name',
diff --git a/src/i18n/es/index.js b/src/i18n/es/index.js
index 6083dfad7..2fe197304 100644
--- a/src/i18n/es/index.js
+++ b/src/i18n/es/index.js
@@ -70,6 +70,7 @@ export default {
         system: 'Sistema',
         fieldRequired: 'Campo requerido',
         allowedFilesText: 'Tipos de archivo permitidos: { allowedContentTypes }',
+        copyClipboard: 'Copiar en portapapeles',
     },
     errors: {
         statusUnauthorized: 'Acceso denegado',
@@ -165,7 +166,7 @@ export default {
             fiscalAddress: 'Dirección fiscal',
             fiscalData: 'Datos fiscales',
             billingData: 'Datos de facturación',
-            consignee: 'Consignatario',
+            consignee: 'Consignatario pred.',
             businessData: 'Datos comerciales',
             financialData: 'Datos financieros',
             customerId: 'ID cliente',
@@ -218,6 +219,8 @@ export default {
             recoverySince: 'Recobro desde',
             businessType: 'Tipo de negocio',
             city: 'Población',
+            rating: 'Clasificación',
+            recommendCredit: 'Crédito recomendado',
         },
         basicData: {
             socialName: 'Nombre fiscal',
diff --git a/src/pages/Customer/Card/CustomerSummary.vue b/src/pages/Customer/Card/CustomerSummary.vue
index c46b8a8de..5591fd15c 100644
--- a/src/pages/Customer/Card/CustomerSummary.vue
+++ b/src/pages/Customer/Card/CustomerSummary.vue
@@ -122,7 +122,7 @@ const creditWarning = computed(() => {
             </QCard>
             <QCard class="vn-one">
                 <a class="header link" :href="clientUrl + `fiscal-data`" link>
-                    {{ t('customer.summary.fiscalAddress') }}
+                    {{ t('customer.summary.fiscalData') }}
                     <QIcon name="open_in_new" color="primary" />
                 </a>
                 <VnLv
@@ -235,7 +235,8 @@ const creditWarning = computed(() => {
                     link
                 >
                     {{ t('customer.summary.financialData') }}
-                    <QIcon name="vn:grafana" color="primary" />
+                    <QIcon name="open_in_new" color="primary" />
+                    <!-- Pendiente de añadir el icono <QIcon name="vn:grafana" color="primary" /> -->
                 </a>
                 <VnLv
                     :label="t('customer.summary.risk')"
@@ -276,7 +277,30 @@ const creditWarning = computed(() => {
                     :label="t('customer.summary.recoverySince')"
                     :value="toDate(entity.recovery.started)"
                 />
+                <VnLv
+                    :label="t('customer.summary.rating')"
+                    :value="entity.rating"
+                    :info="t('valueInfo', { min: 1, max: 20 })"
+                />
+
+                <VnLv
+                    :label="t('customer.summary.recommendCredit')"
+                    :value="entity.recommendedCredit"
+                />
             </QCard>
         </template>
     </CardSummary>
 </template>
+<style lang="scss" scoped>
+@media (min-width: $breakpoint-md) {
+    .summary .vn-one {
+        min-width: 300px;
+    }
+}
+</style>
+<i18n>
+en:
+    valueInfo: Value from {min} to {max}. The higher the better value
+es:
+    valueInfo: Valor de {min} a {max}. Cuanto más alto, mejor valor
+</i18n>
diff --git a/src/pages/Customer/ExtendedList/CustomerExtendedList.vue b/src/pages/Customer/ExtendedList/CustomerExtendedList.vue
index 69effe88e..9d98f479c 100644
--- a/src/pages/Customer/ExtendedList/CustomerExtendedList.vue
+++ b/src/pages/Customer/ExtendedList/CustomerExtendedList.vue
@@ -13,7 +13,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
 
 import { useArrayData } from 'composables/useArrayData';
 import { useStateStore } from 'stores/useStateStore';
-import { dashIfEmpty, toDate } from 'src/filters';
+import { toDate } from 'src/filters';
 
 const { t } = useI18n();
 const router = useRouter();
@@ -477,17 +477,11 @@ const stopEventPropagation = (event, col) => {
     event.stopPropagation();
 };
 
-const navigateToTravelId = (id) => {
-    router.push({ path: `/customer/${id}` });
-};
+const navigateToTravelId = (id) => router.push({ path: `/customer/${id}` });
 
-const selectCustomerId = (id) => {
-    selectedCustomerId.value = id;
-};
+const selectCustomerId = (id) => (selectedCustomerId.value = id);
 
-const selectSalesPersonId = (id) => {
-    selectedSalesPersonId.value = id;
-};
+const selectSalesPersonId = (id) => (selectedSalesPersonId.value = id);
 </script>
 
 <template>
@@ -521,37 +515,50 @@ const selectSalesPersonId = (id) => {
             class="full-width q-mt-md"
             row-key="id"
             :visible-columns="visibleColumns"
+            @row-click="(evt, row, id) => navigateToTravelId(row.id)"
         >
-            <template #body="props">
-                <QTr
-                    :props="props"
-                    @click="navigateToTravelId(props.row.id)"
-                    class="cursor-pointer"
-                >
-                    <QTd
-                        v-for="col in props.cols"
-                        :key="col.name"
-                        :props="props"
-                        @click="stopEventPropagation($event, col)"
+            <template #body-cell="{ col, value }">
+                <QTd @click="stopEventPropagation($event, col)">
+                    {{ value }}
+                </QTd>
+            </template>
+            <template #body-cell-id="props">
+                <QTd @click="stopEventPropagation($event, props.col)">
+                    <component
+                        :is="tableColumnComponents[props.col.name].component"
+                        class="col-content"
+                        v-bind="tableColumnComponents[props.col.name].props(props)"
+                        @click="tableColumnComponents[props.col.name].event(props)"
                     >
-                        <component
-                            :is="tableColumnComponents[col.name].component"
-                            class="col-content"
-                            v-bind="tableColumnComponents[col.name].props(props)"
-                            @click="tableColumnComponents[col.name].event(props)"
-                        >
-                            {{ dashIfEmpty(col.value) }}
-                            <WorkerDescriptorProxy
-                                v-if="props.row.salesPersonFk"
-                                :id="selectedSalesPersonId"
-                            />
-                            <CustomerDescriptorProxy
-                                v-if="props.row.id"
-                                :id="selectedCustomerId"
-                            />
-                        </component>
-                    </QTd>
-                </QTr>
+                        <CustomerDescriptorProxy :id="props.row.id" />
+                        {{ props.row.id }}
+                    </component>
+                </QTd>
+            </template>
+            <template #body-cell-salesPersonFk="props">
+                <QTd @click="stopEventPropagation($event, props.col)">
+                    <component
+                        v-if="props.row.salesPerson"
+                        class="col-content"
+                        :is="tableColumnComponents[props.col.name].component"
+                        v-bind="tableColumnComponents[props.col.name].props(props)"
+                        @click="tableColumnComponents[props.col.name].event(props)"
+                    >
+                        <WorkerDescriptorProxy :id="props.row.salesPersonFk" />
+                        {{ props.row.salesPerson }}
+                    </component>
+                    <span class="col-content" v-else>-</span>
+                </QTd>
+            </template>
+            <template #body-cell-actions="props">
+                <QTd @click="stopEventPropagation($event, props.col)">
+                    <component
+                        :is="tableColumnComponents[props.col.name].component"
+                        class="col-content"
+                        v-bind="tableColumnComponents[props.col.name].props(props)"
+                        @click="tableColumnComponents[props.col.name].event(props)"
+                    />
+                </QTd>
             </template>
         </QTable>
     </QPage>

From 4988df882c653d54f814c7218c31840b6b134e8f Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 26 Feb 2024 15:06:49 +0100
Subject: [PATCH 41/54] refs #5509 fix: transaltions

---
 src/components/EditPictureForm.vue              | 2 +-
 src/components/common/VnDms.vue                 | 6 +++---
 src/i18n/en/index.js                            | 2 ++
 src/i18n/es/index.js                            | 2 ++
 src/pages/Entry/Card/EntryBuysImport.vue        | 4 ++--
 src/pages/InvoiceIn/Card/InvoiceInBasicData.vue | 5 ++---
 6 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/components/EditPictureForm.vue b/src/components/EditPictureForm.vue
index 9f69896b5..3d7f3615b 100644
--- a/src/components/EditPictureForm.vue
+++ b/src/components/EditPictureForm.vue
@@ -272,7 +272,7 @@ const makeRequest = async () => {
                                         class="cursor-pointer q-mr-sm"
                                         @click="openInputFile()"
                                     >
-                                        <!-- <QTooltip>{{ t('Select a file') }}</QTooltip> -->
+                                        <!-- <QTooltip>{{ t('globals.selectFile') }}</QTooltip> -->
                                     </QIcon>
                                     <QIcon name="info" class="cursor-pointer">
                                         <QTooltip>{{
diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
index 99056556d..d2651f5d8 100644
--- a/src/components/common/VnDms.vue
+++ b/src/components/common/VnDms.vue
@@ -109,7 +109,7 @@ function addDefaultData(data) {
         :auto-load="!$props.formInitialData"
     />
     <FormModelPopup
-        :title="t('create')"
+        :title="formInitialData ? t('globals.edit') : t('globals.create')"
         model="dms"
         :form-initial-data="formInitialData"
         :save-fn="save"
@@ -117,7 +117,7 @@ function addDefaultData(data) {
         <template #form-inputs>
             <div class="q-gutter-y-ms">
                 <VnRow>
-                    <VnInput :label="t('Reference')" v-model="dms.reference" />
+                    <VnInput :label="t('globals.reference')" v-model="dms.reference" />
                     <VnSelectFilter
                         :label="t('globals.company')"
                         v-model="dms.companyFk"
@@ -166,7 +166,7 @@ function addDefaultData(data) {
                             class="cursor-pointer"
                             @click="inputFileRef.pickFiles()"
                         >
-                            <QTooltip>{{ t('Select a file') }}</QTooltip>
+                            <QTooltip>{{ t('globals.selectFile') }}</QTooltip>
                         </QIcon>
                         <QIcon name="info" class="cursor-pointer">
                             <QTooltip>{{
diff --git a/src/i18n/en/index.js b/src/i18n/en/index.js
index 98dabd4f8..ee518418b 100644
--- a/src/i18n/en/index.js
+++ b/src/i18n/en/index.js
@@ -24,6 +24,7 @@ export default {
         dataCreated: 'Data created',
         add: 'Add',
         create: 'Create',
+        edit: 'Edit',
         save: 'Save',
         remove: 'Remove',
         reset: 'Reset',
@@ -79,6 +80,7 @@ export default {
         order: 'Order',
         original: 'Original',
         file: 'File',
+        selectFile: 'Select a file',
     },
     errors: {
         statusUnauthorized: 'Access denied',
diff --git a/src/i18n/es/index.js b/src/i18n/es/index.js
index 36d4662b4..0f65181bd 100644
--- a/src/i18n/es/index.js
+++ b/src/i18n/es/index.js
@@ -24,6 +24,7 @@ export default {
         dataCreated: 'Datos creados',
         add: 'Añadir',
         create: 'Crear',
+        edit: 'Modificar',
         save: 'Guardar',
         remove: 'Eliminar',
         reset: 'Restaurar',
@@ -79,6 +80,7 @@ export default {
         order: 'Orden',
         original: 'Original',
         file: 'Fichero',
+        selectFile: 'Seleccione un fichero',
     },
     errors: {
         statusUnauthorized: 'Acceso denegado',
diff --git a/src/pages/Entry/Card/EntryBuysImport.vue b/src/pages/Entry/Card/EntryBuysImport.vue
index 5783826ec..3e0ac1410 100644
--- a/src/pages/Entry/Card/EntryBuysImport.vue
+++ b/src/pages/Entry/Card/EntryBuysImport.vue
@@ -214,7 +214,7 @@ const redirectToBuysView = () => {
                                 class="cursor-pointer"
                                 @click="inputFileRef.pickFiles()"
                             >
-                                <QTooltip>{{ t('Select a file') }}</QTooltip>
+                                <QTooltip>{{ t('globals.selectFile') }}</QTooltip>
                             </QIcon>
                         </template>
                     </QFile>
@@ -292,6 +292,6 @@ const redirectToBuysView = () => {
 
 <i18n>
 es:
-    Select a file: Selecciona un fichero
+    globals.selectFile: Selecciona un fichero
     Some of the imported buys does not have an item: Algunas de las compras importadas no tienen un artículo
 </i18n>
diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
index 306220dd3..f557c8ef4 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
@@ -514,7 +514,7 @@ async function upsert() {
                                 @click="inputFileRef.pickFiles()"
                             >
                                 <QTooltip>
-                                    {{ t('Select a file') }}
+                                    {{ t('globals.selectFile') }}
                                 </QTooltip>
                             </QBtn>
                             <QBtn icon="info" flat round padding="xs">
@@ -623,7 +623,7 @@ async function upsert() {
                                 @click="inputFileRef.pickFiles()"
                             >
                                 <QTooltip>
-                                    {{ t('Select a file') }}
+                                    {{ t('globals.selectFile') }}
                                 </QTooltip>
                             </QBtn>
                             <QBtn icon="info" flat round padding="xs">
@@ -692,7 +692,6 @@ async function upsert() {
         Generate identifier for original file: Generar identificador para archivo original
         File: Fichero
         Create document: Crear documento
-        Select a file: Seleccione un fichero
         Allowed content types: Tipos de archivo permitidos
         The company can't be empty: La empresa no puede estar vacía
         The warehouse can't be empty: El almacén no puede estar vacío

From c8a4854df9b3e890e8b33f817893586fef2ecadf Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 27 Feb 2024 08:22:38 +0100
Subject: [PATCH 42/54] refs #5509 fix(vnDms): fix issues

---
 src/components/FormModel.vue        | 2 +-
 src/components/common/VnDmsList.vue | 8 +++++---
 src/i18n/en/index.js                | 2 +-
 src/i18n/es/index.js                | 2 +-
 4 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
index 504a7acd6..912ce8ea7 100644
--- a/src/components/FormModel.vue
+++ b/src/components/FormModel.vue
@@ -154,7 +154,7 @@ async function save() {
         hasChanges.value = false;
     } catch (err) {
         console.error(err);
-        notify('errors.create', 'negative');
+        notify('errors.writeRequest', 'negative');
     }
     isLoading.value = false;
 }
diff --git a/src/components/common/VnDmsList.vue b/src/components/common/VnDmsList.vue
index b7e683da9..5057c0790 100644
--- a/src/components/common/VnDmsList.vue
+++ b/src/components/common/VnDmsList.vue
@@ -233,9 +233,11 @@ function parseDms(data) {
                         :is="props.col.component"
                         v-bind="props.col.props && props.col.props(props)"
                     >
-                        <span v-if="props.col.component == 'span'">{{
-                            props.value
-                        }}</span>
+                        <span
+                            v-if="props.col.component == 'span'"
+                            style="white-space: wrap"
+                            >{{ props.value }}</span
+                        >
                     </component>
                 </QTr>
 
diff --git a/src/i18n/en/index.js b/src/i18n/en/index.js
index ee518418b..46237c2b9 100644
--- a/src/i18n/en/index.js
+++ b/src/i18n/en/index.js
@@ -88,7 +88,7 @@ export default {
         statusBadGateway: 'It seems that the server has fall down',
         statusGatewayTimeout: 'Could not contact the server',
         userConfig: 'Error fetching user config',
-        create: 'Error during creation',
+        writeRequest: 'The requested operation could not be completed',
     },
     login: {
         title: 'Login',
diff --git a/src/i18n/es/index.js b/src/i18n/es/index.js
index 0f65181bd..fe82407ad 100644
--- a/src/i18n/es/index.js
+++ b/src/i18n/es/index.js
@@ -88,7 +88,7 @@ export default {
         statusBadGateway: 'Parece ser que el servidor ha caído',
         statusGatewayTimeout: 'No se ha podido contactar con el servidor',
         userConfig: 'Error al obtener configuración de usuario',
-        create: 'Error al crear',
+        writeRequest: 'No se pudo completar la operación solicitada',
     },
     login: {
         title: 'Inicio de sesión',

From 504ea7b5fb67037c5fd57c8e149a88fc5a5a21b7 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 27 Feb 2024 09:39:19 +0100
Subject: [PATCH 43/54] refs #6797 warmFix: jenkinsfile

---
 Jenkinsfile | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index be20b1021..11f25b2dd 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -75,16 +75,12 @@ pipeline {
             steps {
                 sh 'npm run test:unit:ci'
             }
-            post {
+              post {
                 always {
-                    script {
-                        try {
-                            junit 'junitresults.xml'
-                            junit 'junit.xml'
-                        } catch (e) {
-                            echo e.toString()
-                        }
-                    }
+                    junit(
+                        testResults: 'junitresults.xml',
+                        allowEmptyResults: true
+                    )
                 }
             }
         }

From b69b937c424a85a9c487369a5afa08c5d174044a Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Tue, 27 Feb 2024 14:27:09 +0100
Subject: [PATCH 44/54] refs #6908 remove Banner

---
 src/components/common/VnSmsDialog.vue | 20 ++++----------------
 1 file changed, 4 insertions(+), 16 deletions(-)

diff --git a/src/components/common/VnSmsDialog.vue b/src/components/common/VnSmsDialog.vue
index 8bb8c3858..59021cef4 100644
--- a/src/components/common/VnSmsDialog.vue
+++ b/src/components/common/VnSmsDialog.vue
@@ -94,16 +94,6 @@ async function send() {
                 <QSpace />
                 <QBtn icon="close" :disable="isLoading" flat round dense v-close-popup />
             </QCardSection>
-            <QCardSection v-if="props.locale">
-                <QBanner class="bg-amber text-white" rounded dense>
-                    <template #avatar>
-                        <QIcon name="warning" />
-                    </template>
-                    <span
-                        v-html="t('CustomerDefaultLanguage', { locale: t(props.locale) })"
-                    ></span>
-                </QBanner>
-            </QCardSection>
             <QCardSection class="q-pb-xs">
                 <QSelect
                     :label="t('Language')"
@@ -184,11 +174,10 @@ async function send() {
 
 <i18n>
 en:
-    CustomerDefaultLanguage: This customer uses <strong>{locale}</strong> as their default language
     templates:
         pendingPayment: 'Your order is pending of payment.
             Please, enter the website and make the payment with a credit card. Thank you.'
-        minAmount: 'A minimum amount of 50€ (VAT excluded) is required for your order 
+        minAmount: 'A minimum amount of 50€ (VAT excluded) is required for your order
             { orderId } of { shipped } to receive it without additional shipping costs.'
         orderChanges: 'Order {orderId} of { shipped }: { changes }'
     en: English
@@ -197,7 +186,6 @@ en:
     pt: Portuguese
 es:
     Send SMS: Enviar SMS
-    CustomerDefaultLanguage: Este cliente utiliza <strong>{locale}</strong> como idioma por defecto
     Language: Idioma
     Phone: Móvil
     Subject: Asunto
@@ -205,7 +193,7 @@ es:
     templates:
         pendingPayment: 'Su pedido está pendiente de pago.
             Por favor, entre en la página web y efectue el pago con tarjeta. Muchas gracias.'
-        minAmount: 'Es necesario un importe mínimo de 50€ (Sin IVA) en su pedido 
+        minAmount: 'Es necesario un importe mínimo de 50€ (Sin IVA) en su pedido
             { orderId } del día { shipped } para recibirlo sin portes adicionales.'
         orderChanges: 'Pedido {orderId} día { shipped }: { changes }'
     en: Inglés
@@ -222,7 +210,7 @@ fr:
     templates:
         pendingPayment: 'Votre commande est en attente de paiement.
             Veuillez vous connecter sur le site web et effectuer le paiement par carte. Merci beaucoup.'
-        minAmount: 'Un montant minimum de 50€ (TVA non incluse) est requis pour votre commande 
+        minAmount: 'Un montant minimum de 50€ (TVA non incluse) est requis pour votre commande
             { orderId } du { shipped } afin de la recevoir sans frais de port supplémentaires.'
         orderChanges: 'Commande { orderId } du { shipped }: { changes }'
     en: Anglais
@@ -239,7 +227,7 @@ pt:
     templates:
         pendingPayment: 'Seu pedido está pendente de pagamento.
             Por favor, acesse o site e faça o pagamento com cartão. Muito obrigado.'
-        minAmount: 'É necessário um valor mínimo de 50€ (sem IVA) em seu pedido 
+        minAmount: 'É necessário um valor mínimo de 50€ (sem IVA) em seu pedido
             { orderId } do dia { shipped } para recebê-lo sem custos de envio adicionais.'
         orderChanges: 'Pedido { orderId } dia { shipped }: { changes }'
     en: Inglês

From 1484b7de3b4402277a879b79ec5787385d4d9521 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 27 Feb 2024 15:41:09 +0100
Subject: [PATCH 45/54] feat: refs #6909 popup onBeforeLeave

---
 src/components/FormModel.vue | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
index 9fd16088c..5c65650e1 100644
--- a/src/components/FormModel.vue
+++ b/src/components/FormModel.vue
@@ -1,6 +1,7 @@
 <script setup>
 import axios from 'axios';
 import { onMounted, onUnmounted, computed, ref, watch, nextTick } from 'vue';
+import { onBeforeRouteLeave } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { useQuasar } from 'quasar';
 import { useState } from 'src/composables/useState';
@@ -8,6 +9,7 @@ import { useStateStore } from 'stores/useStateStore';
 import { useValidator } from 'src/composables/useValidator';
 import useNotify from 'src/composables/useNotify.js';
 import SkeletonForm from 'components/ui/SkeletonForm.vue';
+import VnConfirm from './ui/VnConfirm.vue';
 
 const quasar = useQuasar();
 const state = useState();
@@ -90,6 +92,19 @@ onMounted(async () => {
     }
 });
 
+onBeforeRouteLeave((to, from, next) => {
+    if (!hasChanges.value) next();
+
+    quasar.dialog({
+        component: VnConfirm,
+        componentProps: {
+            title: t('Unsaved changes will be lost'),
+            message: t('Are you sure exit without saving?'),
+            promise: () => next(),
+        },
+    });
+});
+
 onUnmounted(() => {
     state.unset($props.model);
 });
@@ -249,3 +264,8 @@ watch(formUrl, async () => {
     padding: 32px;
 }
 </style>
+<i18n>
+es:
+    Unsaved changes will be lost: Los cambios que no haya guardado se perderán
+    Are you sure exit without saving?: ¿Seguro que quiere salir sin guardar?
+</i18n>

From 547b5e4a764ff4b5518202ae595ac5aca6fc8838 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 28 Feb 2024 08:30:42 +0100
Subject: [PATCH 46/54] refs #6797 package: old vitest version

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 2bc3b661a..c384ca001 100644
--- a/package.json
+++ b/package.json
@@ -42,7 +42,7 @@
         "eslint-plugin-vue": "^9.14.1",
         "postcss": "^8.4.23",
         "prettier": "^2.8.8",
-        "vitest": "^1.3.1"
+        "vitest": "^0.31.1"
     },
     "engines": {
         "node": "^20 || ^18 || ^16",
@@ -53,6 +53,6 @@
     "overrides": {
         "@vitejs/plugin-vue": "^5.0.4",
         "vite": "^5.1.4",
-        "vitest": "^1.3.1"
+        "vitest": "^0.31.1"
     }
 }

From ced041ad4316a7c58a710f017207777cc6242e71 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 28 Feb 2024 08:37:57 +0100
Subject: [PATCH 47/54] refs #6797 package: fix pnpm-lock

---
 pnpm-lock.yaml | 529 ++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 413 insertions(+), 116 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5ef5b94c9..07896c006 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,7 +51,7 @@ devDependencies:
     version: 1.7.3(eslint@8.56.0)(pinia@2.1.7)(quasar@2.14.5)(vue-router@4.2.5)(vue@3.4.19)
   '@quasar/quasar-app-extension-testing-unit-vitest':
     specifier: ^0.4.0
-    version: 0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(vite@5.1.4)(vitest@1.3.1)(vue@3.4.19)
+    version: 0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(vite@5.1.4)(vitest@0.31.4)(vue@3.4.19)
   '@vue/test-utils':
     specifier: ^2.4.4
     version: 2.4.4(vue@3.4.19)
@@ -80,8 +80,8 @@ devDependencies:
     specifier: ^2.8.8
     version: 2.8.8
   vitest:
-    specifier: ^1.3.1
-    version: 1.3.1
+    specifier: ^0.31.1
+    version: 0.31.4
 
 packages:
 
@@ -166,6 +166,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/android-arm64@0.18.20:
+    resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/android-arm64@0.19.12:
     resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
     engines: {node: '>=12'}
@@ -175,6 +184,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/android-arm@0.18.20:
+    resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/android-arm@0.19.12:
     resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
     engines: {node: '>=12'}
@@ -184,6 +202,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/android-x64@0.18.20:
+    resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/android-x64@0.19.12:
     resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
     engines: {node: '>=12'}
@@ -193,6 +220,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/darwin-arm64@0.18.20:
+    resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/darwin-arm64@0.19.12:
     resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
     engines: {node: '>=12'}
@@ -202,6 +238,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/darwin-x64@0.18.20:
+    resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/darwin-x64@0.19.12:
     resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
     engines: {node: '>=12'}
@@ -211,6 +256,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/freebsd-arm64@0.18.20:
+    resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/freebsd-arm64@0.19.12:
     resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
     engines: {node: '>=12'}
@@ -220,6 +274,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/freebsd-x64@0.18.20:
+    resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/freebsd-x64@0.19.12:
     resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
     engines: {node: '>=12'}
@@ -229,6 +292,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-arm64@0.18.20:
+    resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-arm64@0.19.12:
     resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
     engines: {node: '>=12'}
@@ -238,6 +310,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-arm@0.18.20:
+    resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-arm@0.19.12:
     resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
     engines: {node: '>=12'}
@@ -247,6 +328,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-ia32@0.18.20:
+    resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-ia32@0.19.12:
     resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
     engines: {node: '>=12'}
@@ -256,6 +346,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-loong64@0.18.20:
+    resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-loong64@0.19.12:
     resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
     engines: {node: '>=12'}
@@ -265,6 +364,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-mips64el@0.18.20:
+    resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-mips64el@0.19.12:
     resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
     engines: {node: '>=12'}
@@ -274,6 +382,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-ppc64@0.18.20:
+    resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-ppc64@0.19.12:
     resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
     engines: {node: '>=12'}
@@ -283,6 +400,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-riscv64@0.18.20:
+    resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-riscv64@0.19.12:
     resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
     engines: {node: '>=12'}
@@ -292,6 +418,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-s390x@0.18.20:
+    resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-s390x@0.19.12:
     resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
     engines: {node: '>=12'}
@@ -301,6 +436,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-x64@0.18.20:
+    resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-x64@0.19.12:
     resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
     engines: {node: '>=12'}
@@ -310,6 +454,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/netbsd-x64@0.18.20:
+    resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/netbsd-x64@0.19.12:
     resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
     engines: {node: '>=12'}
@@ -319,6 +472,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/openbsd-x64@0.18.20:
+    resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/openbsd-x64@0.19.12:
     resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
     engines: {node: '>=12'}
@@ -328,6 +490,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/sunos-x64@0.18.20:
+    resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/sunos-x64@0.19.12:
     resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
     engines: {node: '>=12'}
@@ -337,6 +508,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/win32-arm64@0.18.20:
+    resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/win32-arm64@0.19.12:
     resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
     engines: {node: '>=12'}
@@ -346,6 +526,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/win32-ia32@0.18.20:
+    resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/win32-ia32@0.19.12:
     resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
     engines: {node: '>=12'}
@@ -355,6 +544,15 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/win32-x64@0.18.20:
+    resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/win32-x64@0.19.12:
     resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
     engines: {node: '>=12'}
@@ -516,13 +714,6 @@ packages:
       wrap-ansi-cjs: /wrap-ansi@7.0.0
     dev: true
 
-  /@jest/schemas@29.6.3:
-    resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@sinclair/typebox': 0.27.8
-    dev: true
-
   /@jridgewell/gen-mapping@0.3.3:
     resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
     engines: {node: '>=6.0.0'}
@@ -721,7 +912,7 @@ packages:
     resolution: {integrity: sha512-SlOhwzXyPQHWgQIS2ncyDdYdksCJvUYNtgsDQqzAKEG3r3d/ejOxvThle79HTK3Q6HB+gQWFG21Ux00Osr5XSw==}
     dev: false
 
-  /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(vite@5.1.4)(vitest@1.3.1)(vue@3.4.19):
+  /@quasar/quasar-app-extension-testing-unit-vitest@0.4.0(@vue/test-utils@2.4.4)(quasar@2.14.5)(vite@5.1.4)(vitest@0.31.4)(vue@3.4.19):
     resolution: {integrity: sha512-eyzdUdmZiCueNS+5nedjMmzdbpCetSrtdGIwW6KplW1dTzRbLiNvYUjpBOxQGmJCgEhWy9zuswJ7MZ/bTql24Q==}
     engines: {node: '>= 12.22.1', npm: '>= 6.14.12', yarn: '>= 1.17.3'}
     peerDependencies:
@@ -740,7 +931,7 @@ packages:
       quasar: 2.14.5
       vite-jsconfig-paths: 2.0.1(vite@5.1.4)
       vite-tsconfig-paths: 4.3.1(vite@5.1.4)
-      vitest: 1.3.1
+      vitest: 0.31.4
       vue: 3.4.19
     transitivePeerDependencies:
       - supports-color
@@ -890,10 +1081,6 @@ packages:
     dev: true
     optional: true
 
-  /@sinclair/typebox@0.27.8:
-    resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
-    dev: true
-
   /@sindresorhus/is@4.6.0:
     resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
     engines: {node: '>=10'}
@@ -934,6 +1121,16 @@ packages:
       '@types/responselike': 1.0.3
     dev: false
 
+  /@types/chai-subset@1.3.5:
+    resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==}
+    dependencies:
+      '@types/chai': 4.3.12
+    dev: true
+
+  /@types/chai@4.3.12:
+    resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==}
+    dev: true
+
   /@types/chrome@0.0.208:
     resolution: {integrity: sha512-VDU/JnXkF5qaI7WBz14Azpa2VseZTgML0ia/g/B1sr9OfdOnHiH/zZ7P7qCDqxSlkqJh76/bPc8jLFcx8rHJmw==}
     dependencies:
@@ -1081,7 +1278,7 @@ packages:
     resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
     requiresBuild: true
     dependencies:
-      '@types/node': 16.18.82
+      '@types/node': 20.11.19
     dev: true
     optional: true
 
@@ -1100,43 +1297,43 @@ packages:
       vue: 3.4.19
     dev: true
 
-  /@vitest/expect@1.3.1:
-    resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==}
+  /@vitest/expect@0.31.4:
+    resolution: {integrity: sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg==}
     dependencies:
-      '@vitest/spy': 1.3.1
-      '@vitest/utils': 1.3.1
+      '@vitest/spy': 0.31.4
+      '@vitest/utils': 0.31.4
       chai: 4.4.1
     dev: true
 
-  /@vitest/runner@1.3.1:
-    resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==}
+  /@vitest/runner@0.31.4:
+    resolution: {integrity: sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg==}
     dependencies:
-      '@vitest/utils': 1.3.1
-      p-limit: 5.0.0
+      '@vitest/utils': 0.31.4
+      concordance: 5.0.4
+      p-limit: 4.0.0
       pathe: 1.1.2
     dev: true
 
-  /@vitest/snapshot@1.3.1:
-    resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==}
+  /@vitest/snapshot@0.31.4:
+    resolution: {integrity: sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA==}
     dependencies:
       magic-string: 0.30.7
       pathe: 1.1.2
-      pretty-format: 29.7.0
+      pretty-format: 27.5.1
     dev: true
 
-  /@vitest/spy@1.3.1:
-    resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==}
+  /@vitest/spy@0.31.4:
+    resolution: {integrity: sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag==}
     dependencies:
       tinyspy: 2.2.1
     dev: true
 
-  /@vitest/utils@1.3.1:
-    resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==}
+  /@vitest/utils@0.31.4:
+    resolution: {integrity: sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ==}
     dependencies:
-      diff-sequences: 29.6.3
-      estree-walker: 3.0.3
+      concordance: 5.0.4
       loupe: 2.3.7
-      pretty-format: 29.7.0
+      pretty-format: 27.5.1
     dev: true
 
   /@vue/compiler-core@3.4.19:
@@ -1506,6 +1703,10 @@ packages:
     resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
     dev: true
 
+  /blueimp-md5@2.19.0:
+    resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==}
+    dev: true
+
   /body-parser@1.20.1:
     resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
     engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -1933,6 +2134,20 @@ packages:
       typedarray: 0.0.6
     dev: false
 
+  /concordance@5.0.4:
+    resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==}
+    engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'}
+    dependencies:
+      date-time: 3.1.0
+      esutils: 2.0.3
+      fast-diff: 1.3.0
+      js-string-escape: 1.0.1
+      lodash: 4.17.21
+      md5-hex: 3.0.1
+      semver: 7.6.0
+      well-known-symbols: 2.0.0
+    dev: true
+
   /config-chain@1.1.13:
     resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
     dependencies:
@@ -2091,6 +2306,13 @@ packages:
       assert-plus: 1.0.0
     dev: true
 
+  /date-time@3.1.0:
+    resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==}
+    engines: {node: '>=6'}
+    dependencies:
+      time-zone: 1.0.0
+    dev: true
+
   /dayjs@1.11.10:
     resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
     dev: true
@@ -2222,11 +2444,6 @@ packages:
     resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
     engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
 
-  /diff-sequences@29.6.3:
-    resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dev: true
-
   /doctrine@3.0.0:
     resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
     engines: {node: '>=6.0.0'}
@@ -2520,6 +2737,36 @@ packages:
       esbuild-windows-arm64: 0.14.51
     dev: true
 
+  /esbuild@0.18.20:
+    resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/android-arm': 0.18.20
+      '@esbuild/android-arm64': 0.18.20
+      '@esbuild/android-x64': 0.18.20
+      '@esbuild/darwin-arm64': 0.18.20
+      '@esbuild/darwin-x64': 0.18.20
+      '@esbuild/freebsd-arm64': 0.18.20
+      '@esbuild/freebsd-x64': 0.18.20
+      '@esbuild/linux-arm': 0.18.20
+      '@esbuild/linux-arm64': 0.18.20
+      '@esbuild/linux-ia32': 0.18.20
+      '@esbuild/linux-loong64': 0.18.20
+      '@esbuild/linux-mips64el': 0.18.20
+      '@esbuild/linux-ppc64': 0.18.20
+      '@esbuild/linux-riscv64': 0.18.20
+      '@esbuild/linux-s390x': 0.18.20
+      '@esbuild/linux-x64': 0.18.20
+      '@esbuild/netbsd-x64': 0.18.20
+      '@esbuild/openbsd-x64': 0.18.20
+      '@esbuild/sunos-x64': 0.18.20
+      '@esbuild/win32-arm64': 0.18.20
+      '@esbuild/win32-ia32': 0.18.20
+      '@esbuild/win32-x64': 0.18.20
+    dev: true
+
   /esbuild@0.19.12:
     resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
     engines: {node: '>=12'}
@@ -2722,12 +2969,6 @@ packages:
   /estree-walker@2.0.2:
     resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
 
-  /estree-walker@3.0.3:
-    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
-    dependencies:
-      '@types/estree': 1.0.5
-    dev: true
-
   /esutils@2.0.3:
     resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
     engines: {node: '>=0.10.0'}
@@ -2790,21 +3031,6 @@ packages:
       strip-final-newline: 3.0.0
     dev: false
 
-  /execa@8.0.1:
-    resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
-    engines: {node: '>=16.17'}
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 8.0.1
-      human-signals: 5.0.0
-      is-stream: 3.0.0
-      merge-stream: 2.0.0
-      npm-run-path: 5.2.0
-      onetime: 6.0.0
-      signal-exit: 4.1.0
-      strip-final-newline: 3.0.0
-    dev: true
-
   /executable@4.1.1:
     resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
     engines: {node: '>=4'}
@@ -2898,6 +3124,10 @@ packages:
     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
     dev: true
 
+  /fast-diff@1.3.0:
+    resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+    dev: true
+
   /fast-glob@3.2.12:
     resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
     engines: {node: '>=8.6.0'}
@@ -3122,11 +3352,6 @@ packages:
     engines: {node: '>=10'}
     dev: false
 
-  /get-stream@8.0.1:
-    resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
-    engines: {node: '>=16'}
-    dev: true
-
   /getos@3.2.1:
     resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
     dependencies:
@@ -3387,11 +3612,6 @@ packages:
     engines: {node: '>=14.18.0'}
     dev: false
 
-  /human-signals@5.0.0:
-    resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
-    engines: {node: '>=16.17.0'}
-    dev: true
-
   /iconv-lite@0.4.24:
     resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
     engines: {node: '>=0.10.0'}
@@ -3581,6 +3801,7 @@ packages:
   /is-stream@3.0.0:
     resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: false
 
   /is-typedarray@1.0.0:
     resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
@@ -3647,8 +3868,9 @@ packages:
     engines: {node: '>=14'}
     dev: true
 
-  /js-tokens@8.0.3:
-    resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==}
+  /js-string-escape@1.0.1:
+    resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==}
+    engines: {node: '>= 0.8'}
     dev: true
 
   /js-yaml@4.1.0:
@@ -3794,12 +4016,9 @@ packages:
       wrap-ansi: 7.0.0
     dev: true
 
-  /local-pkg@0.5.0:
-    resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+  /local-pkg@0.4.3:
+    resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
     engines: {node: '>=14'}
-    dependencies:
-      mlly: 1.5.0
-      pkg-types: 1.0.3
     dev: true
 
   /locate-path@6.0.0:
@@ -3911,6 +4130,13 @@ packages:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.4.15
 
+  /md5-hex@3.0.1:
+    resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==}
+    engines: {node: '>=8'}
+    dependencies:
+      blueimp-md5: 2.19.0
+    dev: true
+
   /media-typer@0.3.0:
     resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
     engines: {node: '>= 0.6'}
@@ -3959,6 +4185,7 @@ packages:
   /mimic-fn@4.0.0:
     resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
     engines: {node: '>=12'}
+    dev: false
 
   /mimic-response@1.0.1:
     resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
@@ -4113,6 +4340,7 @@ packages:
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
     dependencies:
       path-key: 4.0.0
+    dev: false
 
   /nth-check@2.1.1:
     resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
@@ -4153,6 +4381,7 @@ packages:
     engines: {node: '>=12'}
     dependencies:
       mimic-fn: 4.0.0
+    dev: false
 
   /open@8.4.2:
     resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
@@ -4225,9 +4454,9 @@ packages:
       yocto-queue: 0.1.0
     dev: true
 
-  /p-limit@5.0.0:
-    resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
-    engines: {node: '>=18'}
+  /p-limit@4.0.0:
+    resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
     dependencies:
       yocto-queue: 1.0.0
     dev: true
@@ -4289,6 +4518,7 @@ packages:
   /path-key@4.0.0:
     resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
     engines: {node: '>=12'}
+    dev: false
 
   /path-parse@1.0.7:
     resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
@@ -4397,13 +4627,13 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
-  /pretty-format@29.7.0:
-    resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  /pretty-format@27.5.1:
+    resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
     dependencies:
-      '@jest/schemas': 29.6.3
+      ansi-regex: 5.0.1
       ansi-styles: 5.2.0
-      react-is: 18.2.0
+      react-is: 17.0.2
     dev: true
 
   /process-nextick-args@2.0.1:
@@ -4522,8 +4752,8 @@ packages:
       strip-json-comments: 2.0.1
     dev: false
 
-  /react-is@18.2.0:
-    resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+  /react-is@17.0.2:
+    resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
     dev: true
 
   /readable-stream@2.3.8:
@@ -4697,6 +4927,14 @@ packages:
       fsevents: 2.3.3
     dev: true
 
+  /rollup@3.29.4:
+    resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
+    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+    hasBin: true
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
   /rollup@4.12.0:
     resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -5013,6 +5251,7 @@ packages:
   /strip-final-newline@3.0.0:
     resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
     engines: {node: '>=12'}
+    dev: false
 
   /strip-json-comments@2.0.1:
     resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
@@ -5024,10 +5263,10 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
-  /strip-literal@2.0.0:
-    resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==}
+  /strip-literal@1.3.0:
+    resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==}
     dependencies:
-      js-tokens: 8.0.3
+      acorn: 8.11.3
     dev: true
 
   /sucrase@3.35.0:
@@ -5109,12 +5348,17 @@ packages:
     resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
     dev: true
 
+  /time-zone@1.0.0:
+    resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==}
+    engines: {node: '>=4'}
+    dev: true
+
   /tinybench@2.6.0:
     resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==}
     dev: true
 
-  /tinypool@0.8.2:
-    resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==}
+  /tinypool@0.5.0:
+    resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==}
     engines: {node: '>=14.0.0'}
     dev: true
 
@@ -5399,16 +5643,17 @@ packages:
       - supports-color
     dev: true
 
-  /vite-node@1.3.1:
-    resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==}
-    engines: {node: ^18.0.0 || >=20.0.0}
+  /vite-node@0.31.4(@types/node@20.11.19):
+    resolution: {integrity: sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==}
+    engines: {node: '>=v14.18.0'}
     hasBin: true
     dependencies:
       cac: 6.7.14
       debug: 4.3.4(supports-color@8.1.1)
+      mlly: 1.5.0
       pathe: 1.1.2
       picocolors: 1.0.0
-      vite: 5.1.4
+      vite: 4.5.2(@types/node@20.11.19)
     transitivePeerDependencies:
       - '@types/node'
       - less
@@ -5462,6 +5707,42 @@ packages:
       fsevents: 2.3.3
     dev: true
 
+  /vite@4.5.2(@types/node@20.11.19):
+    resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': '>= 14'
+      less: '*'
+      lightningcss: ^1.21.0
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      '@types/node': 20.11.19
+      esbuild: 0.18.20
+      postcss: 8.4.35
+      rollup: 3.29.4
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
   /vite@5.1.4:
     resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -5497,22 +5778,22 @@ packages:
       fsevents: 2.3.3
     dev: true
 
-  /vitest@1.3.1:
-    resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==}
-    engines: {node: ^18.0.0 || >=20.0.0}
+  /vitest@0.31.4:
+    resolution: {integrity: sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==}
+    engines: {node: '>=v14.18.0'}
     hasBin: true
     peerDependencies:
       '@edge-runtime/vm': '*'
-      '@types/node': ^18.0.0 || >=20.0.0
-      '@vitest/browser': 1.3.1
-      '@vitest/ui': 1.3.1
+      '@vitest/browser': '*'
+      '@vitest/ui': '*'
       happy-dom: '*'
       jsdom: '*'
+      playwright: '*'
+      safaridriver: '*'
+      webdriverio: '*'
     peerDependenciesMeta:
       '@edge-runtime/vm':
         optional: true
-      '@types/node':
-        optional: true
       '@vitest/browser':
         optional: true
       '@vitest/ui':
@@ -5521,26 +5802,37 @@ packages:
         optional: true
       jsdom:
         optional: true
+      playwright:
+        optional: true
+      safaridriver:
+        optional: true
+      webdriverio:
+        optional: true
     dependencies:
-      '@vitest/expect': 1.3.1
-      '@vitest/runner': 1.3.1
-      '@vitest/snapshot': 1.3.1
-      '@vitest/spy': 1.3.1
-      '@vitest/utils': 1.3.1
+      '@types/chai': 4.3.12
+      '@types/chai-subset': 1.3.5
+      '@types/node': 20.11.19
+      '@vitest/expect': 0.31.4
+      '@vitest/runner': 0.31.4
+      '@vitest/snapshot': 0.31.4
+      '@vitest/spy': 0.31.4
+      '@vitest/utils': 0.31.4
+      acorn: 8.11.3
       acorn-walk: 8.3.2
+      cac: 6.7.14
       chai: 4.4.1
+      concordance: 5.0.4
       debug: 4.3.4(supports-color@8.1.1)
-      execa: 8.0.1
-      local-pkg: 0.5.0
+      local-pkg: 0.4.3
       magic-string: 0.30.7
       pathe: 1.1.2
       picocolors: 1.0.0
       std-env: 3.7.0
-      strip-literal: 2.0.0
+      strip-literal: 1.3.0
       tinybench: 2.6.0
-      tinypool: 0.8.2
-      vite: 5.1.4
-      vite-node: 1.3.1
+      tinypool: 0.5.0
+      vite: 4.5.2(@types/node@20.11.19)
+      vite-node: 0.31.4(@types/node@20.11.19)
       why-is-node-running: 2.2.2
     transitivePeerDependencies:
       - less
@@ -5650,6 +5942,11 @@ packages:
     resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==}
     dev: true
 
+  /well-known-symbols@2.0.0:
+    resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==}
+    engines: {node: '>=6'}
+    dev: true
+
   /whatwg-encoding@2.0.0:
     resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
     engines: {node: '>=12'}

From 65fcfbff91a0ba9c4428d4564fb06f9c0644970c Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Wed, 28 Feb 2024 10:28:11 +0100
Subject: [PATCH 48/54] refs #6768 summary redirect

---
 src/pages/Order/Card/OrderSummary.vue       | 5 +++++
 src/pages/Shelving/Card/ShelvingSummary.vue | 7 ++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue
index 9b26891a1..ccc673a37 100644
--- a/src/pages/Order/Card/OrderSummary.vue
+++ b/src/pages/Order/Card/OrderSummary.vue
@@ -59,6 +59,11 @@ const detailsColumns = ref([
 
     <div class="q-pa-md">
         <CardSummary ref="summary" :url="`Orders/${entityId}/summary`">
+            <template #header-left>
+                <a class="header link" :href="`#/orders/${entityId}/summary`">
+                    <QIcon name="open_in_new" color="white" size="sm" />
+                </a>
+            </template>
             <template #header="{ entity }">
                 {{ t('order.summary.basket') }} #{{ entity?.id }} -
                 {{ entity?.client?.name }} ({{ entity?.clientFk }})
diff --git a/src/pages/Shelving/Card/ShelvingSummary.vue b/src/pages/Shelving/Card/ShelvingSummary.vue
index 409329c88..37de5196e 100644
--- a/src/pages/Shelving/Card/ShelvingSummary.vue
+++ b/src/pages/Shelving/Card/ShelvingSummary.vue
@@ -6,7 +6,7 @@ import { useStateStore } from 'stores/useStateStore';
 import CardSummary from 'components/ui/CardSummary.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import ShelvingFilter from 'pages/Shelving/Card/ShelvingFilter.vue';
-import VnUserLink from "components/ui/VnUserLink.vue";
+import VnUserLink from 'components/ui/VnUserLink.vue';
 
 const $props = defineProps({
     id: {
@@ -65,6 +65,11 @@ const filter = {
     </template>
     <div class="q-pa-md">
         <CardSummary ref="summary" :url="`Shelvings/${entityId}`" :filter="filter">
+            <template #header-left>
+                <a class="header link" :href="`#/shelving/${entityId}/summary`">
+                    <QIcon name="open_in_new" color="white" size="sm" />
+                </a>
+            </template>
             <template #header="{ entity }">
                 <div>{{ entity.code }}</div>
             </template>

From b8c6f43d0c03f671d6ff18fff04af152cd5be988 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Wed, 28 Feb 2024 10:58:41 +0100
Subject: [PATCH 49/54] refs #6768 shelving fix

---
 src/pages/Shelving/Card/ShelvingSummary.vue | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/src/pages/Shelving/Card/ShelvingSummary.vue b/src/pages/Shelving/Card/ShelvingSummary.vue
index 37de5196e..27ef33c34 100644
--- a/src/pages/Shelving/Card/ShelvingSummary.vue
+++ b/src/pages/Shelving/Card/ShelvingSummary.vue
@@ -65,11 +65,6 @@ const filter = {
     </template>
     <div class="q-pa-md">
         <CardSummary ref="summary" :url="`Shelvings/${entityId}`" :filter="filter">
-            <template #header-left>
-                <a class="header link" :href="`#/shelving/${entityId}/summary`">
-                    <QIcon name="open_in_new" color="white" size="sm" />
-                </a>
-            </template>
             <template #header="{ entity }">
                 <div>{{ entity.code }}</div>
             </template>

From dd8ec1309fb6da4e0852df3cd1a0d272a9d590a6 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Wed, 28 Feb 2024 10:59:12 +0100
Subject: [PATCH 50/54] refs #6768 fix order

---
 src/pages/Order/Card/OrderSummary.vue | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue
index ccc673a37..f9704a480 100644
--- a/src/pages/Order/Card/OrderSummary.vue
+++ b/src/pages/Order/Card/OrderSummary.vue
@@ -31,7 +31,7 @@ const detailsColumns = ref([
     },
     {
         name: 'description',
-        label: t('order.summary.description'),
+        label: t('globals.description'),
         field: (row) => row?.item?.name,
     },
     {
@@ -59,11 +59,6 @@ const detailsColumns = ref([
 
     <div class="q-pa-md">
         <CardSummary ref="summary" :url="`Orders/${entityId}/summary`">
-            <template #header-left>
-                <a class="header link" :href="`#/orders/${entityId}/summary`">
-                    <QIcon name="open_in_new" color="white" size="sm" />
-                </a>
-            </template>
             <template #header="{ entity }">
                 {{ t('order.summary.basket') }} #{{ entity?.id }} -
                 {{ entity?.client?.name }} ({{ entity?.clientFk }})
@@ -172,7 +167,7 @@ const detailsColumns = ref([
                         <template #header="props">
                             <QTr :props="props">
                                 <QTh auto-width>{{ t('order.summary.item') }}</QTh>
-                                <QTh>{{ t('order.summary.description') }}</QTh>
+                                <QTh>{{ t('globals.description') }}</QTh>
                                 <QTh auto-width>{{ t('order.summary.quantity') }}</QTh>
                                 <QTh auto-width>{{ t('order.summary.price') }}</QTh>
                                 <QTh auto-width>{{ t('order.summary.amount') }}</QTh>

From b1d8ce40bc2523b37dd5d93ef01e9488b45f649c Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Wed, 28 Feb 2024 15:13:43 +0100
Subject: [PATCH 51/54] fix: refs #6945 css vnRow

---
 src/components/ui/VnRow.vue | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/components/ui/VnRow.vue b/src/components/ui/VnRow.vue
index e13730e62..f2d2b55de 100644
--- a/src/components/ui/VnRow.vue
+++ b/src/components/ui/VnRow.vue
@@ -1,16 +1,18 @@
 <template>
-    <div id="row" class="q-gutter-md">
+    <div id="row" class="q-gutter-md q-mb-md">
         <slot></slot>
     </div>
 </template>
 <style lang="scss" scopped>
 #row {
-    display: grid;
-    grid-template-columns: 1fr 1fr;
+    display: flex;
+    > * {
+        flex: 1;
+    }
 }
 @media screen and (max-width: 800px) {
     #row {
-        grid-template-columns: 1fr;
+        flex-direction: column;
     }
 }
 </style>

From 26184328f9aa3065fd665f4145b51da55d26e74f Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Wed, 28 Feb 2024 15:21:44 +0100
Subject: [PATCH 52/54] fix: refs #6945 entryNotes

---
 src/pages/Entry/Card/EntryNotes.vue | 60 ++++++++++++++---------------
 1 file changed, 28 insertions(+), 32 deletions(-)

diff --git a/src/pages/Entry/Card/EntryNotes.vue b/src/pages/Entry/Card/EntryNotes.vue
index 0d2e5e51a..02a0c020a 100644
--- a/src/pages/Entry/Card/EntryNotes.vue
+++ b/src/pages/Entry/Card/EntryNotes.vue
@@ -50,25 +50,23 @@ onMounted(() => {
                     :key="index"
                     class="row q-gutter-md q-mb-md"
                 >
-                    <div class="col-3">
-                        <VnSelectFilter
-                            :label="t('entry.notes.observationType')"
-                            v-model="row.observationTypeFk"
-                            :options="entryObservationsOptions"
-                            :disable="!!row.id"
-                            option-label="description"
-                            option-value="id"
-                            hide-selected
-                        />
-                    </div>
-                    <div class="col">
-                        <VnInput
-                            :label="t('globals.description')"
-                            v-model="row.description"
-                            :rules="validate('EntryObservation.description')"
-                        />
-                    </div>
-                    <div class="col-1 row justify-center items-center">
+                    <VnSelectFilter
+                        :label="t('entry.notes.observationType')"
+                        v-model="row.observationTypeFk"
+                        :options="entryObservationsOptions"
+                        :disable="!!row.id"
+                        option-label="description"
+                        option-value="id"
+                        hide-selected
+                    />
+
+                    <VnInput
+                        :label="t('globals.description')"
+                        v-model="row.description"
+                        :rules="validate('EntryObservation.description')"
+                    />
+
+                    <div class="row justify-center items-center">
                         <QIcon
                             name="delete"
                             size="sm"
@@ -82,19 +80,17 @@ onMounted(() => {
                         </QIcon>
                     </div>
                 </VnRow>
-                <VnRow>
-                    <QIcon
-                        name="add"
-                        size="sm"
-                        class="cursor-pointer"
-                        color="primary"
-                        @click="entryObservationsRef.insert()"
-                    >
-                        <QTooltip>
-                            {{ t('Add note') }}
-                        </QTooltip>
-                    </QIcon>
-                </VnRow>
+                <QIcon
+                    name="add"
+                    size="sm"
+                    class="cursor-pointer"
+                    color="primary"
+                    @click="entryObservationsRef.insert()"
+                >
+                    <QTooltip>
+                        {{ t('Add note') }}
+                    </QTooltip>
+                </QIcon>
             </QCard>
         </template>
     </CrudModel>

From 3804ec3e36090ddb63972ebab7c49505333abb06 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Thu, 29 Feb 2024 09:22:44 +0100
Subject: [PATCH 53/54] refs #6933 fetchedTags title fix

---
 src/components/ui/FetchedTags.vue | 49 +++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 6 deletions(-)

diff --git a/src/components/ui/FetchedTags.vue b/src/components/ui/FetchedTags.vue
index 364713cbc..12bce9d4b 100644
--- a/src/components/ui/FetchedTags.vue
+++ b/src/components/ui/FetchedTags.vue
@@ -13,12 +13,49 @@ defineProps({
 <template>
     <div class="fetchedTags">
         <div class="wrap">
-            <div class="inline-tag" :class="{ empty: !$props.item.value5 }">{{ $props.item.value5 }}</div>
-            <div class="inline-tag" :class="{ empty: !$props.item.value6 }">{{ $props.item.value6 }}</div>
-            <div class="inline-tag" :class="{ empty: !$props.item.value7 }">{{ $props.item.value7 }}</div>
-            <div class="inline-tag" :class="{ empty: !$props.item.value8 }">{{ $props.item.value8 }}</div>
-            <div class="inline-tag" :class="{ empty: !$props.item.value9 }">{{ $props.item.value9 }}</div>
-            <div class="inline-tag" :class="{ empty: !$props.item.value10 }">{{ $props.item.value10 }}</div>
+            <div
+                class="inline-tag"
+                :class="{ empty: !$props.item.value5 }"
+                :title="$props.item.tag5 + ': ' + $props.item.value5"
+            >
+                {{ $props.item.value5 }}
+            </div>
+            <div
+                class="inline-tag"
+                :class="{ empty: !$props.item.tag6 }"
+                :title="$props.item.tag6 + ': ' + $props.item.value6"
+            >
+                {{ $props.item.value6 }}
+            </div>
+
+            <div
+                class="inline-tag"
+                :class="{ empty: !$props.item.value7 }"
+                :title="$props.item.tag7 + ': ' + $props.item.value7"
+            >
+                {{ $props.item.value7 }}
+            </div>
+            <div
+                class="inline-tag"
+                :class="{ empty: !$props.item.value8 }"
+                :title="$props.item.tag8 + ': ' + $props.item.value8"
+            >
+                {{ $props.item.value8 }}
+            </div>
+            <div
+                class="inline-tag"
+                :class="{ empty: !$props.item.value9 }"
+                :title="$props.item.tag9 + ': ' + $props.item.value9"
+            >
+                {{ $props.item.value9 }}
+            </div>
+            <div
+                class="inline-tag"
+                :class="{ empty: !$props.item.value10 }"
+                :title="$props.item.tag10 + ': ' + $props.item.value10"
+            >
+                {{ $props.item.value10 }}
+            </div>
         </div>
     </div>
 </template>

From 742b87c78e76042c8ff47be9086938b5c7f8db3c Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Thu, 29 Feb 2024 10:24:50 +0100
Subject: [PATCH 54/54] refs #6956 deploy: init version 2412

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 7beb22e55..4029d7240 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "salix-front",
-    "version": "24.10.0",
+    "version": "24.12.0",
     "description": "Salix frontend",
     "productName": "Salix",
     "author": "Verdnatura",