You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ha...@apache.org on 2023/01/17 12:44:11 UTC

[skywalking-banyandb] branch main updated: Add UI for creating and editing tagfamilies and tags. Change some UI styles. (#224)

This is an automated email from the ASF dual-hosted git repository.

hanahmily pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git


The following commit(s) were added to refs/heads/main by this push:
     new 33579b10 Add UI for creating and editing tagfamilies and tags. Change some UI styles. (#224)
33579b10 is described below

commit 33579b1002f8332157a08fa25c3acca99b45b4e5
Author: Wu ChuSheng <a1...@gmail.com>
AuthorDate: Tue Jan 17 20:44:05 2023 +0800

    Add UI for creating and editing tagfamilies and tags. Change some UI styles. (#224)
    
    * change dialog styles
    
    * change right click menu styles
    
    * Add UI for creating and editing tagfamilies and tags
    
    * change right click menu styles
    
    * Fix style errors
    
    * Reconstruction ui project
    
    * change pagesize
    
    * change table height
    
    Co-authored-by: Gao Hongtao <ha...@gmail.com>
---
 ui/package-lock.json                               | 2032 ++++++++------------
 ui/src/App.vue                                     |   68 +-
 .../DialogResources/{index.vue => TagDialog.vue}   |  102 +-
 .../Aside/components/DialogResources/index.vue     |   90 +-
 .../RightMenu/components/right-menu-item.vue       |   36 +-
 .../Database/Aside/components/RightMenu/index.vue  |    8 +-
 ui/src/components/Database/Aside/index.vue         |   26 +-
 .../Database/Main/components/DataTable/index.vue   |    2 +-
 .../Database/Main/components/DrawerRight/index.vue |    3 -
 .../Main/components/SecondNavigation/index.vue     |   22 +-
 ui/src/components/Database/Main/index.vue          |    4 +-
 ui/src/components2/Aside/index.vue                 |  586 ++++++
 ui/src/components2/CodeMirror/index.vue            |  164 ++
 ui/src/components2/Header/components/header.vue    |  167 ++
 .../RightMenu => components2/Header}/index.vue     |   41 +-
 ui/src/components2/Read/index.vue                  |  283 +++
 .../RightMenu/components/right-menu-item.vue       |   36 +-
 .../components => components2}/RightMenu/index.vue |    8 +-
 .../RightMenu => components2/Start}/index.vue      |   26 +-
 ui/src/components2/StreamEditor/index.vue          |   87 +
 ui/src/components2/TopNav/index.vue                |  161 ++
 ui/src/router/index.js                             |  114 +-
 ui/src/stores/tags.js                              |    3 +-
 ui/src/styles/custom.scss                          |    4 +-
 ui/src/styles/elementPlus.scss                     |   81 +-
 ui/src/styles/main.scss                            |    5 +-
 ui/src/utils/axios.js                              |   12 +-
 .../RightMenu => views/Dashboard}/index.vue        |   17 +-
 .../index.vue => views/Measure/createEdit.vue}     |   18 +-
 .../RightMenu => views/Measure}/index.vue          |   50 +-
 .../index.vue => views/Measure/measure.vue}        |   18 +-
 .../RightMenu => views/Property}/index.vue         |   18 +-
 .../index.vue => views/Stream/createEdit.vue}      |   18 +-
 .../RightMenu => views/Stream}/index.vue           |   50 +-
 .../index.vue => views/Stream/stream.vue}          |   20 +-
 35 files changed, 2808 insertions(+), 1572 deletions(-)

diff --git a/ui/package-lock.json b/ui/package-lock.json
index 690916e6..2938bb15 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -30,15 +30,18 @@
       }
     },
     "node_modules/@antfu/utils": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.5.2.tgz",
-      "integrity": "sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==",
-      "dev": true
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.2.tgz",
+      "integrity": "sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
     },
     "node_modules/@babel/parser": {
-      "version": "7.19.1",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.19.1.tgz",
-      "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
+      "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -47,53 +50,43 @@
       }
     },
     "node_modules/@ctrl/tinycolor": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz",
-      "integrity": "sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz",
+      "integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg==",
       "engines": {
         "node": ">=10"
       }
     },
     "node_modules/@element-plus/icons-vue": {
       "version": "2.0.10",
-      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz",
+      "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz",
       "integrity": "sha512-ygEZ1mwPjcPo/OulhzLE7mtDrQBWI8vZzEWSNB2W/RNCRjoQGwbaK4N8lV4rid7Ts4qvySU3njMN7YCiSlSaTQ==",
       "peerDependencies": {
         "vue": "^3.2.0"
       }
     },
-    "node_modules/@esbuild/linux-loong64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.7.tgz",
-      "integrity": "sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/@floating-ui/core": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.0.1.tgz",
-      "integrity": "sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA=="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.0.tgz",
+      "integrity": "sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ=="
     },
     "node_modules/@floating-ui/dom": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.0.1.tgz",
-      "integrity": "sha512-wBDiLUKWU8QNPNOTAFHiIAkBv1KlHauG2AhqjSeh2H+wR8PX+AArXfz8NkRexH5PgMJMmSOS70YS89AbWYh5dA==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.0.tgz",
+      "integrity": "sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A==",
       "dependencies": {
-        "@floating-ui/core": "^1.0.1"
+        "@floating-ui/core": "^1.0.5"
       }
     },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+      "dev": true
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
       "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
       "dev": true,
       "dependencies": {
@@ -106,7 +99,7 @@
     },
     "node_modules/@nodelib/fs.stat": {
       "version": "2.0.5",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
       "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
       "dev": true,
       "engines": {
@@ -115,7 +108,7 @@
     },
     "node_modules/@nodelib/fs.walk": {
       "version": "1.2.8",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
       "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
       "dev": true,
       "dependencies": {
@@ -129,44 +122,63 @@
     "node_modules/@popperjs/core": {
       "name": "@sxzz/popperjs-es",
       "version": "2.11.7",
-      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
-      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
+      "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
     },
     "node_modules/@rollup/pluginutils": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
-      "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+      "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
       "dev": true,
       "dependencies": {
-        "estree-walker": "^2.0.1",
-        "picomatch": "^2.2.2"
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
       },
       "engines": {
-        "node": ">= 8.0.0"
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
       }
     },
+    "node_modules/@types/estree": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+      "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
+      "dev": true
+    },
     "node_modules/@types/lodash": {
-      "version": "4.14.185",
-      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.185.tgz",
-      "integrity": "sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA=="
+      "version": "4.14.191",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+      "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
     },
     "node_modules/@types/lodash-es": {
       "version": "4.17.6",
-      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz",
+      "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz",
       "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
       "dependencies": {
         "@types/lodash": "*"
       }
     },
     "node_modules/@types/web-bluetooth": {
-      "version": "0.0.15",
-      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.15.tgz",
-      "integrity": "sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA=="
+      "version": "0.0.16",
+      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
     },
     "node_modules/@vitejs/plugin-vue": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.1.0.tgz",
-      "integrity": "sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz",
+      "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==",
       "dev": true,
       "engines": {
         "node": "^14.18.0 || >=16.0.0"
@@ -177,126 +189,145 @@
       }
     },
     "node_modules/@vue/compiler-core": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.39.tgz",
-      "integrity": "sha512-mf/36OWXqWn0wsC40nwRRGheR/qoID+lZXbIuLnr4/AngM0ov8Xvv8GHunC0rKRIkh60bTqydlqTeBo49rlbqw==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
+      "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
       "dependencies": {
         "@babel/parser": "^7.16.4",
-        "@vue/shared": "3.2.39",
+        "@vue/shared": "3.2.45",
         "estree-walker": "^2.0.2",
         "source-map": "^0.6.1"
       }
     },
     "node_modules/@vue/compiler-dom": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.39.tgz",
-      "integrity": "sha512-HMFI25Be1C8vLEEv1hgEO1dWwG9QQ8LTTPmCkblVJY/O3OvWx6r1+zsox5mKPMGvqYEZa6l8j+xgOfUspgo7hw==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
+      "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
       "dependencies": {
-        "@vue/compiler-core": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/compiler-core": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "node_modules/@vue/compiler-sfc": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.39.tgz",
-      "integrity": "sha512-fqAQgFs1/BxTUZkd0Vakn3teKUt//J3c420BgnYgEOoVdTwYpBTSXCMJ88GOBCylmUBbtquGPli9tVs7LzsWIA==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
+      "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
       "dependencies": {
         "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.39",
-        "@vue/compiler-dom": "3.2.39",
-        "@vue/compiler-ssr": "3.2.39",
-        "@vue/reactivity-transform": "3.2.39",
-        "@vue/shared": "3.2.39",
+        "@vue/compiler-core": "3.2.45",
+        "@vue/compiler-dom": "3.2.45",
+        "@vue/compiler-ssr": "3.2.45",
+        "@vue/reactivity-transform": "3.2.45",
+        "@vue/shared": "3.2.45",
         "estree-walker": "^2.0.2",
         "magic-string": "^0.25.7",
         "postcss": "^8.1.10",
         "source-map": "^0.6.1"
       }
     },
+    "node_modules/@vue/compiler-sfc/node_modules/magic-string": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "dependencies": {
+        "sourcemap-codec": "^1.4.8"
+      }
+    },
     "node_modules/@vue/compiler-ssr": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.39.tgz",
-      "integrity": "sha512-EoGCJ6lincKOZGW+0Ky4WOKsSmqL7hp1ZYgen8M7u/mlvvEQUaO9tKKOy7K43M9U2aA3tPv0TuYYQFrEbK2eFQ==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
+      "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
       "dependencies": {
-        "@vue/compiler-dom": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/compiler-dom": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "node_modules/@vue/devtools-api": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
-      "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ=="
+      "version": "6.4.5",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
+      "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ=="
     },
     "node_modules/@vue/reactivity": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.39.tgz",
-      "integrity": "sha512-vlaYX2a3qMhIZfrw3Mtfd+BuU+TZmvDrPMa+6lpfzS9k/LnGxkSuf0fhkP0rMGfiOHPtyKoU9OJJJFGm92beVQ==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz",
+      "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==",
       "dependencies": {
-        "@vue/shared": "3.2.39"
+        "@vue/shared": "3.2.45"
       }
     },
     "node_modules/@vue/reactivity-transform": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.39.tgz",
-      "integrity": "sha512-HGuWu864zStiWs9wBC6JYOP1E00UjMdDWIG5W+FpUx28hV3uz9ODOKVNm/vdOy/Pvzg8+OcANxAVC85WFBbl3A==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
+      "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
       "dependencies": {
         "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.39",
-        "@vue/shared": "3.2.39",
+        "@vue/compiler-core": "3.2.45",
+        "@vue/shared": "3.2.45",
         "estree-walker": "^2.0.2",
         "magic-string": "^0.25.7"
       }
     },
+    "node_modules/@vue/reactivity-transform/node_modules/magic-string": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "dependencies": {
+        "sourcemap-codec": "^1.4.8"
+      }
+    },
     "node_modules/@vue/runtime-core": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.39.tgz",
-      "integrity": "sha512-xKH5XP57JW5JW+8ZG1khBbuLakINTgPuINKL01hStWLTTGFOrM49UfCFXBcFvWmSbci3gmJyLl2EAzCaZWsx8g==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz",
+      "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==",
       "dependencies": {
-        "@vue/reactivity": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/reactivity": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "node_modules/@vue/runtime-dom": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.39.tgz",
-      "integrity": "sha512-4G9AEJP+sLhsqf5wXcyKVWQKUhI+iWfy0hWQgea+CpaTD7BR0KdQzvoQdZhwCY6B3oleSyNLkLAQwm0ya/wNoA==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz",
+      "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==",
       "dependencies": {
-        "@vue/runtime-core": "3.2.39",
-        "@vue/shared": "3.2.39",
+        "@vue/runtime-core": "3.2.45",
+        "@vue/shared": "3.2.45",
         "csstype": "^2.6.8"
       }
     },
     "node_modules/@vue/server-renderer": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.39.tgz",
-      "integrity": "sha512-1yn9u2YBQWIgytFMjz4f/t0j43awKytTGVptfd3FtBk76t1pd8mxbek0G/DrnjJhd2V7mSTb5qgnxMYt8Z5iSQ==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz",
+      "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==",
       "dependencies": {
-        "@vue/compiler-ssr": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/compiler-ssr": "3.2.45",
+        "@vue/shared": "3.2.45"
       },
       "peerDependencies": {
-        "vue": "3.2.39"
+        "vue": "3.2.45"
       }
     },
     "node_modules/@vue/shared": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.39.tgz",
-      "integrity": "sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw=="
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
+      "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg=="
     },
     "node_modules/@vueuse/core": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.2.0.tgz",
-      "integrity": "sha512-/MZ6qpz6uSyaXrtoeBWQzAKRG3N7CvfVWvQxiM3ei3Xe5ydOjjtVbo7lGl9p8dECV93j7W8s63A8H0kFLpLyxg==",
+      "version": "9.10.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.10.0.tgz",
+      "integrity": "sha512-CxMewME07qeuzuT/AOIQGv0EhhDoojniqU6pC3F8m5VC76L47UT18DcX88kWlP3I7d3qMJ4u/PD8iSRsy3bmNA==",
       "dependencies": {
-        "@types/web-bluetooth": "^0.0.15",
-        "@vueuse/metadata": "9.2.0",
-        "@vueuse/shared": "9.2.0",
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.10.0",
+        "@vueuse/shared": "9.10.0",
         "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
       }
     },
     "node_modules/@vueuse/core/node_modules/vue-demi": {
       "version": "0.13.11",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
       "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
       "hasInstallScript": true,
       "bin": {
@@ -306,6 +337,9 @@
       "engines": {
         "node": ">=12"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
       "peerDependencies": {
         "@vue/composition-api": "^1.0.0-rc.1",
         "vue": "^3.0.0-0 || ^2.6.0"
@@ -317,21 +351,27 @@
       }
     },
     "node_modules/@vueuse/metadata": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.2.0.tgz",
-      "integrity": "sha512-exN4KE6iquxDCdt72BgEhb3tlOpECtD61AUdXnUqBTIUCl70x1Ar/QXo3bYcvxmdMS2/peQyfeTzBjRTpvL5xw=="
+      "version": "9.10.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.10.0.tgz",
+      "integrity": "sha512-G5VZhgTCapzU9rv0Iq2HBrVOSGzOKb+OE668NxhXNcTjUjwYxULkEhAw70FtRLMZc+hxcFAzDZlKYA0xcwNMuw==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
     },
     "node_modules/@vueuse/shared": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.2.0.tgz",
-      "integrity": "sha512-NnRp/noSWuXW0dKhZK5D0YLrDi0nmZ18UeEgwXQq7Ul5TTP93lcNnKjrHtd68j2xFB/l59yPGFlCryL692bnrA==",
+      "version": "9.10.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.10.0.tgz",
+      "integrity": "sha512-vakHJ2ZRklAzqmcVBL38RS7BxdBA4+5poG9NsSyqJxrt9kz0zX3P5CXMy0Hm6LFbZXUgvKdqAS3pUH1zX/5qTQ==",
       "dependencies": {
         "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
       }
     },
     "node_modules/@vueuse/shared/node_modules/vue-demi": {
       "version": "0.13.11",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
       "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
       "hasInstallScript": true,
       "bin": {
@@ -341,6 +381,9 @@
       "engines": {
         "node": ">=12"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
       "peerDependencies": {
         "@vue/composition-api": "^1.0.0-rc.1",
         "vue": "^3.0.0-0 || ^2.6.0"
@@ -352,9 +395,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.8.0",
-      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz",
-      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "version": "8.8.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
+      "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
       "dev": true,
       "bin": {
         "acorn": "bin/acorn"
@@ -364,9 +407,9 @@
       }
     },
     "node_modules/anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dependencies": {
         "normalize-path": "^3.0.0",
         "picomatch": "^2.0.4"
@@ -377,17 +420,17 @@
     },
     "node_modules/async-validator": {
       "version": "4.2.5",
-      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
       "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
     },
     "node_modules/asynckit": {
       "version": "0.4.0",
-      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "node_modules/axios": {
       "version": "0.27.2",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
       "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
       "dependencies": {
         "follow-redirects": "^1.14.9",
@@ -396,13 +439,13 @@
     },
     "node_modules/balanced-match": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
     "node_modules/binary-extensions": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
       "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
       "engines": {
         "node": ">=8"
@@ -410,7 +453,7 @@
     },
     "node_modules/brace-expansion": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "dev": true,
       "dependencies": {
@@ -419,7 +462,7 @@
     },
     "node_modules/braces": {
       "version": "3.0.2",
-      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
       "dependencies": {
         "fill-range": "^7.0.1"
@@ -430,8 +473,14 @@
     },
     "node_modules/chokidar": {
       "version": "3.5.3",
-      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
       "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
       "dependencies": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -450,7 +499,7 @@
     },
     "node_modules/combined-stream": {
       "version": "1.0.8",
-      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
       "dependencies": {
         "delayed-stream": "~1.0.0"
@@ -461,17 +510,17 @@
     },
     "node_modules/csstype": {
       "version": "2.6.21",
-      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
       "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
     },
     "node_modules/dayjs": {
-      "version": "1.11.5",
-      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.5.tgz",
-      "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA=="
+      "version": "1.11.7",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+      "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
     },
     "node_modules/debug": {
       "version": "4.3.4",
-      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
       "dependencies": {
@@ -488,25 +537,25 @@
     },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
       "engines": {
         "node": ">=0.4.0"
       }
     },
     "node_modules/echarts": {
-      "version": "5.3.3",
-      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.3.3.tgz",
-      "integrity": "sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==",
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.1.tgz",
+      "integrity": "sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==",
       "dependencies": {
         "tslib": "2.3.0",
-        "zrender": "5.3.2"
+        "zrender": "5.4.1"
       }
     },
     "node_modules/element-plus": {
-      "version": "2.2.17",
-      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.17.tgz",
-      "integrity": "sha512-MGwMIE/q+FFD3kgS23x8HIe5043tmD1cTRwjhIX9o6fim1avFnUkrsfYRvybbz4CkyqSb185EheZS5AUPpXh2g==",
+      "version": "2.2.28",
+      "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.28.tgz",
+      "integrity": "sha512-BsxF7iEaBydmRfw1Tt++EO9jRBjbtJr7ZRIrnEwz4J3Cwa1IzHCNCcx3ZwcYTlJq9CYFxv94JnbNr1EbkTou3A==",
       "dependencies": {
         "@ctrl/tinycolor": "^3.4.1",
         "@element-plus/icons-vue": "^2.0.6",
@@ -529,9 +578,9 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.15.7.tgz",
-      "integrity": "sha512-7V8tzllIbAQV1M4QoE52ImKu8hT/NLGlGXkiDsbEU5PS6K8Mn09ZnYoS+dcmHxOS9CRsV4IRAMdT3I67IyUNXw==",
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+      "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
       "dev": true,
       "hasInstallScript": true,
       "bin": {
@@ -541,321 +590,34 @@
         "node": ">=12"
       },
       "optionalDependencies": {
-        "@esbuild/linux-loong64": "0.15.7",
-        "esbuild-android-64": "0.15.7",
-        "esbuild-android-arm64": "0.15.7",
-        "esbuild-darwin-64": "0.15.7",
-        "esbuild-darwin-arm64": "0.15.7",
-        "esbuild-freebsd-64": "0.15.7",
-        "esbuild-freebsd-arm64": "0.15.7",
-        "esbuild-linux-32": "0.15.7",
-        "esbuild-linux-64": "0.15.7",
-        "esbuild-linux-arm": "0.15.7",
-        "esbuild-linux-arm64": "0.15.7",
-        "esbuild-linux-mips64le": "0.15.7",
-        "esbuild-linux-ppc64le": "0.15.7",
-        "esbuild-linux-riscv64": "0.15.7",
-        "esbuild-linux-s390x": "0.15.7",
-        "esbuild-netbsd-64": "0.15.7",
-        "esbuild-openbsd-64": "0.15.7",
-        "esbuild-sunos-64": "0.15.7",
-        "esbuild-windows-32": "0.15.7",
-        "esbuild-windows-64": "0.15.7",
-        "esbuild-windows-arm64": "0.15.7"
-      }
-    },
-    "node_modules/esbuild-android-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.7.tgz",
-      "integrity": "sha512-p7rCvdsldhxQr3YHxptf1Jcd86dlhvc3EQmQJaZzzuAxefO9PvcI0GLOa5nCWem1AJ8iMRu9w0r5TG8pHmbi9w==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-android-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.7.tgz",
-      "integrity": "sha512-L775l9ynJT7rVqRM5vo+9w5g2ysbOCfsdLV4CWanTZ1k/9Jb3IYlQ06VCI1edhcosTYJRECQFJa3eAvkx72eyQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-darwin-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.7.tgz",
-      "integrity": "sha512-KGPt3r1c9ww009t2xLB6Vk0YyNOXh7hbjZ3EecHoVDxgtbUlYstMPDaReimKe6eOEfyY4hBEEeTvKwPsiH5WZg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-darwin-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.7.tgz",
-      "integrity": "sha512-kBIHvtVqbSGajN88lYMnR3aIleH3ABZLLFLxwL2stiuIGAjGlQW741NxVTpUHQXUmPzxi6POqc9npkXa8AcSZQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-freebsd-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.7.tgz",
-      "integrity": "sha512-hESZB91qDLV5MEwNxzMxPfbjAhOmtfsr9Wnuci7pY6TtEh4UDuevmGmkUIjX/b+e/k4tcNBMf7SRQ2mdNuK/HQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-freebsd-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.7.tgz",
-      "integrity": "sha512-dLFR0ChH5t+b3J8w0fVKGvtwSLWCv7GYT2Y2jFGulF1L5HftQLzVGN+6pi1SivuiVSmTh28FwUhi9PwQicXI6Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-32": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.7.tgz",
-      "integrity": "sha512-v3gT/LsONGUZcjbt2swrMjwxo32NJzk+7sAgtxhGx1+ZmOFaTRXBAi1PPfgpeo/J//Un2jIKm/I+qqeo4caJvg==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.7.tgz",
-      "integrity": "sha512-LxXEfLAKwOVmm1yecpMmWERBshl+Kv5YJ/1KnyAr6HRHFW8cxOEsEfisD3sVl/RvHyW//lhYUVSuy9jGEfIRAQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-arm": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.7.tgz",
-      "integrity": "sha512-JKgAHtMR5f75wJTeuNQbyznZZa+pjiUHV7sRZp42UNdyXC6TiUYMW/8z8yIBAr2Fpad8hM1royZKQisqPABPvQ==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.7.tgz",
-      "integrity": "sha512-P3cfhudpzWDkglutWgXcT2S7Ft7o2e3YDMrP1n0z2dlbUZghUkKCyaWw0zhp4KxEEzt/E7lmrtRu/pGWnwb9vw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-mips64le": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.7.tgz",
-      "integrity": "sha512-T7XKuxl0VpeFLCJXub6U+iybiqh0kM/bWOTb4qcPyDDwNVhLUiPcGdG2/0S7F93czUZOKP57YiLV8YQewgLHKw==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-ppc64le": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.7.tgz",
-      "integrity": "sha512-6mGuC19WpFN7NYbecMIJjeQgvDb5aMuvyk0PDYBJrqAEMkTwg3Z98kEKuCm6THHRnrgsdr7bp4SruSAxEM4eJw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-riscv64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.7.tgz",
-      "integrity": "sha512-uUJsezbswAYo/X7OU/P+PuL/EI9WzxsEQXDekfwpQ23uGiooxqoLFAPmXPcRAt941vjlY9jtITEEikWMBr+F/g==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-s390x": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.7.tgz",
-      "integrity": "sha512-+tO+xOyTNMc34rXlSxK7aCwJgvQyffqEM5MMdNDEeMU3ss0S6wKvbBOQfgd5jRPblfwJ6b+bKiz0g5nABpY0QQ==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-netbsd-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.7.tgz",
-      "integrity": "sha512-yVc4Wz+Pu3cP5hzm5kIygNPrjar/v5WCSoRmIjCPWfBVJkZNb5brEGKUlf+0Y759D48BCWa0WHrWXaNy0DULTQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-openbsd-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.7.tgz",
-      "integrity": "sha512-GsimbwC4FSR4lN3wf8XmTQ+r8/0YSQo21rWDL0XFFhLHKlzEA4SsT1Tl8bPYu00IU6UWSJ+b3fG/8SB69rcuEQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-sunos-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.7.tgz",
-      "integrity": "sha512-8CDI1aL/ts0mDGbWzjEOGKXnU7p3rDzggHSBtVryQzkSOsjCHRVe0iFYUuhczlxU1R3LN/E7HgUO4NXzGGP/Ag==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-windows-32": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.7.tgz",
-      "integrity": "sha512-cOnKXUEPS8EGCzRSFa1x6NQjGhGsFlVgjhqGEbLTPsA7x4RRYiy2RKoArNUU4iR2vHmzqS5Gr84MEumO/wxYKA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-windows-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.7.tgz",
-      "integrity": "sha512-7MI08Ec2sTIDv+zH6StNBKO+2hGUYIT42GmFyW6MBBWWtJhTcQLinKS6ldIN1d52MXIbiJ6nXyCJ+LpL4jBm3Q==",
+        "@esbuild/android-arm": "0.15.18",
+        "@esbuild/linux-loong64": "0.15.18",
+        "esbuild-android-64": "0.15.18",
+        "esbuild-android-arm64": "0.15.18",
+        "esbuild-darwin-64": "0.15.18",
+        "esbuild-darwin-arm64": "0.15.18",
+        "esbuild-freebsd-64": "0.15.18",
+        "esbuild-freebsd-arm64": "0.15.18",
+        "esbuild-linux-32": "0.15.18",
+        "esbuild-linux-64": "0.15.18",
+        "esbuild-linux-arm": "0.15.18",
+        "esbuild-linux-arm64": "0.15.18",
+        "esbuild-linux-mips64le": "0.15.18",
+        "esbuild-linux-ppc64le": "0.15.18",
+        "esbuild-linux-riscv64": "0.15.18",
+        "esbuild-linux-s390x": "0.15.18",
+        "esbuild-netbsd-64": "0.15.18",
+        "esbuild-openbsd-64": "0.15.18",
+        "esbuild-sunos-64": "0.15.18",
+        "esbuild-windows-32": "0.15.18",
+        "esbuild-windows-64": "0.15.18",
+        "esbuild-windows-arm64": "0.15.18"
+      }
+    },
+    "node_modules/esbuild/node_modules/esbuild-windows-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+      "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
       "cpu": [
         "x64"
       ],
@@ -868,44 +630,31 @@
         "node": ">=12"
       }
     },
-    "node_modules/esbuild-windows-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.7.tgz",
-      "integrity": "sha512-R06nmqBlWjKHddhRJYlqDd3Fabx9LFdKcjoOy08YLimwmsswlFBJV4rXzZCxz/b7ZJXvrZgj8DDv1ewE9+StMw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/escape-html": {
       "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
     },
     "node_modules/escape-string-regexp": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
       "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
       "dev": true,
       "engines": {
         "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/estree-walker": {
       "version": "2.0.2",
-      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
     "node_modules/fast-glob": {
       "version": "3.2.12",
-      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
       "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
       "dev": true,
       "dependencies": {
@@ -920,9 +669,9 @@
       }
     },
     "node_modules/fastq": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz",
-      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
       "dev": true,
       "dependencies": {
         "reusify": "^1.0.4"
@@ -930,7 +679,7 @@
     },
     "node_modules/fill-range": {
       "version": "7.0.1",
-      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
       "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dependencies": {
         "to-regex-range": "^5.0.1"
@@ -941,8 +690,14 @@
     },
     "node_modules/follow-redirects": {
       "version": "1.15.2",
-      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
       "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
       "engines": {
         "node": ">=4.0"
       },
@@ -954,7 +709,7 @@
     },
     "node_modules/form-data": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
       "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
       "dependencies": {
         "asynckit": "^0.4.0",
@@ -965,28 +720,15 @@
         "node": ">= 6"
       }
     },
-    "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
     "node_modules/function-bind": {
       "version": "1.1.1",
-      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
       "dev": true
     },
     "node_modules/glob-parent": {
       "version": "5.1.2",
-      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
       "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dependencies": {
         "is-glob": "^4.0.1"
@@ -1003,7 +745,7 @@
     },
     "node_modules/has": {
       "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
       "dev": true,
       "dependencies": {
@@ -1014,13 +756,13 @@
       }
     },
     "node_modules/immutable": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz",
-      "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ=="
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz",
+      "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og=="
     },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
       "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dependencies": {
         "binary-extensions": "^2.0.0"
@@ -1030,17 +772,20 @@
       }
     },
     "node_modules/is-core-module": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.10.0.tgz",
-      "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
       "dev": true,
       "dependencies": {
         "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/is-extglob": {
       "version": "2.1.1",
-      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
       "engines": {
         "node": ">=0.10.0"
@@ -1048,7 +793,7 @@
     },
     "node_modules/is-glob": {
       "version": "4.0.3",
-      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
       "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dependencies": {
         "is-extglob": "^2.1.1"
@@ -1059,7 +804,7 @@
     },
     "node_modules/is-number": {
       "version": "7.0.0",
-      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "engines": {
         "node": ">=0.12.0"
@@ -1067,7 +812,7 @@
     },
     "node_modules/jsonc-parser": {
       "version": "3.2.0",
-      "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
       "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
       "dev": true
     },
@@ -1084,27 +829,30 @@
     },
     "node_modules/local-pkg": {
       "version": "0.4.2",
-      "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.2.tgz",
+      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz",
       "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==",
       "dev": true,
       "engines": {
         "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
       }
     },
     "node_modules/lodash": {
       "version": "4.17.21",
-      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "node_modules/lodash-es": {
       "version": "4.17.21",
-      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
     },
     "node_modules/lodash-unified": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.2.tgz",
-      "integrity": "sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
       "peerDependencies": {
         "@types/lodash-es": "*",
         "lodash": "*",
@@ -1112,21 +860,25 @@
       }
     },
     "node_modules/magic-string": {
-      "version": "0.25.9",
-      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
-      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "version": "0.26.7",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
+      "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
+      "dev": true,
       "dependencies": {
         "sourcemap-codec": "^1.4.8"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
     "node_modules/memoize-one": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
       "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
     },
     "node_modules/merge2": {
       "version": "1.4.1",
-      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
       "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true,
       "engines": {
@@ -1135,7 +887,7 @@
     },
     "node_modules/micromatch": {
       "version": "4.0.5",
-      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
       "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
       "dev": true,
       "dependencies": {
@@ -1148,7 +900,7 @@
     },
     "node_modules/mime-db": {
       "version": "1.52.0",
-      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "engines": {
         "node": ">= 0.6"
@@ -1156,7 +908,7 @@
     },
     "node_modules/mime-types": {
       "version": "2.1.35",
-      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "dependencies": {
         "mime-db": "1.52.0"
@@ -1166,9 +918,9 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.0.tgz",
-      "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
+      "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
       "dev": true,
       "dependencies": {
         "brace-expansion": "^2.0.1"
@@ -1179,30 +931,30 @@
     },
     "node_modules/mitt": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
       "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
     },
     "node_modules/mlly": {
-      "version": "0.5.14",
-      "resolved": "https://registry.npmmirror.com/mlly/-/mlly-0.5.14.tgz",
-      "integrity": "sha512-DgRgNUSX9NIxxCxygX4Xeg9C7GX7OUx1wuQ8cXx9o9LE0e9wrH+OZ9fcnrlEedsC/rtqry3ZhUddC759XD/L0w==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.0.tgz",
+      "integrity": "sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==",
       "dev": true,
       "dependencies": {
-        "acorn": "^8.8.0",
-        "pathe": "^0.3.5",
-        "pkg-types": "^0.3.4",
-        "ufo": "^0.8.5"
+        "acorn": "^8.8.1",
+        "pathe": "^1.0.0",
+        "pkg-types": "^1.0.1",
+        "ufo": "^1.0.1"
       }
     },
     "node_modules/ms": {
       "version": "2.1.2",
-      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
     "node_modules/nanoid": {
       "version": "3.3.4",
-      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
       "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
       "bin": {
         "nanoid": "bin/nanoid.cjs"
@@ -1213,7 +965,7 @@
     },
     "node_modules/normalize-path": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "engines": {
         "node": ">=0.10.0"
@@ -1221,42 +973,48 @@
     },
     "node_modules/normalize-wheel-es": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
     "node_modules/path-parse": {
       "version": "1.0.7",
-      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
     "node_modules/pathe": {
-      "version": "0.3.7",
-      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.3.7.tgz",
-      "integrity": "sha512-yz7GK+kSsS27x727jtXpd5VT4dDfP/JDIQmaowfxyWCnFjOWtE1VIh7i6TzcSfzW0n4+bRQztj1VdKnITNq/MA==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz",
+      "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==",
       "dev": true
     },
     "node_modules/picocolors": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
       "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
-      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "engines": {
         "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
     "node_modules/pinia": {
-      "version": "2.0.22",
-      "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.0.22.tgz",
-      "integrity": "sha512-u+b8/BC+tmvo3ACbYO2w5NfxHWFOjvvw9DQnyT0dW8aUMCPRQT5QnfZ5R5W2MzZBMTeZRMQI7V/QFbafmM9QHw==",
+      "version": "2.0.28",
+      "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.28.tgz",
+      "integrity": "sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==",
       "dependencies": {
-        "@vue/devtools-api": "^6.2.1",
+        "@vue/devtools-api": "^6.4.5",
         "vue-demi": "*"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
       "peerDependencies": {
         "@vue/composition-api": "^1.4.0",
         "typescript": ">=4.4.4",
@@ -1273,7 +1031,7 @@
     },
     "node_modules/pinia/node_modules/vue-demi": {
       "version": "0.13.11",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
       "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
       "hasInstallScript": true,
       "bin": {
@@ -1283,6 +1041,9 @@
       "engines": {
         "node": ">=12"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
       "peerDependencies": {
         "@vue/composition-api": "^1.0.0-rc.1",
         "vue": "^3.0.0-0 || ^2.6.0"
@@ -1294,20 +1055,30 @@
       }
     },
     "node_modules/pkg-types": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-0.3.5.tgz",
-      "integrity": "sha512-VkxCBFVgQhNHYk9subx+HOhZ4jzynH11ah63LZsprTKwPCWG9pfWBlkElWFbvkP9BVR0dP1jS9xPdhaHQNK74Q==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz",
+      "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==",
       "dev": true,
       "dependencies": {
         "jsonc-parser": "^3.2.0",
-        "mlly": "^0.5.14",
-        "pathe": "^0.3.7"
+        "mlly": "^1.0.0",
+        "pathe": "^1.0.0"
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.16",
-      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.16.tgz",
-      "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
+      "version": "8.4.21",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+      "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        }
+      ],
       "dependencies": {
         "nanoid": "^3.3.4",
         "picocolors": "^1.0.0",
@@ -1319,13 +1090,27 @@
     },
     "node_modules/queue-microtask": {
       "version": "1.2.3",
-      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
     },
     "node_modules/readdirp": {
       "version": "3.6.0",
-      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
       "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dependencies": {
         "picomatch": "^2.2.1"
@@ -1336,7 +1121,7 @@
     },
     "node_modules/resolve": {
       "version": "1.22.1",
-      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
       "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
       "dev": true,
       "dependencies": {
@@ -1346,11 +1131,14 @@
       },
       "bin": {
         "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/reusify": {
       "version": "1.0.4",
-      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
       "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
       "dev": true,
       "engines": {
@@ -1359,9 +1147,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "2.78.1",
-      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.78.1.tgz",
-      "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==",
+      "version": "2.79.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+      "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
       "dev": true,
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -1375,17 +1163,31 @@
     },
     "node_modules/run-parallel": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
       "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
       "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
       "dependencies": {
         "queue-microtask": "^1.2.2"
       }
     },
     "node_modules/sass": {
-      "version": "1.54.9",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.54.9.tgz",
-      "integrity": "sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==",
+      "version": "1.57.1",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz",
+      "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==",
       "dependencies": {
         "chokidar": ">=3.0.0 <4.0.0",
         "immutable": "^4.0.0",
@@ -1399,14 +1201,14 @@
       }
     },
     "node_modules/scule": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmmirror.com/scule/-/scule-0.3.2.tgz",
-      "integrity": "sha512-zIvPdjOH8fv8CgrPT5eqtxHQXmPNnV/vHJYffZhE43KZkvULvpCTvOt1HPlFaCZx287INL9qaqrZg34e8NgI4g==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz",
+      "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==",
       "dev": true
     },
     "node_modules/source-map": {
       "version": "0.6.1",
-      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "engines": {
         "node": ">=0.10.0"
@@ -1414,7 +1216,7 @@
     },
     "node_modules/source-map-js": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
       "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
       "engines": {
         "node": ">=0.10.0"
@@ -1422,30 +1224,37 @@
     },
     "node_modules/sourcemap-codec": {
       "version": "1.4.8",
-      "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+      "deprecated": "Please use @jridgewell/sourcemap-codec instead"
     },
     "node_modules/strip-literal": {
-      "version": "0.4.2",
-      "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-0.4.2.tgz",
-      "integrity": "sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz",
+      "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==",
       "dev": true,
       "dependencies": {
-        "acorn": "^8.8.0"
+        "acorn": "^8.8.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
       }
     },
     "node_modules/supports-preserve-symlinks-flag": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
       "dev": true,
       "engines": {
         "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/to-regex-range": {
       "version": "5.0.1",
-      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dependencies": {
         "is-number": "^7.0.0"
@@ -1456,40 +1265,41 @@
     },
     "node_modules/tslib": {
       "version": "2.3.0",
-      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
       "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
     },
     "node_modules/ufo": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmmirror.com/ufo/-/ufo-0.8.5.tgz",
-      "integrity": "sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz",
+      "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==",
       "dev": true
     },
     "node_modules/unimport": {
-      "version": "0.6.7",
-      "resolved": "https://registry.npmmirror.com/unimport/-/unimport-0.6.7.tgz",
-      "integrity": "sha512-EMoVqDjswHkU+nD098QYHXH7Mkw7KwGDQAyeRF2lgairJnuO+wpkhIcmCqrD1OPJmsjkTbJ2tW6Ap8St0PuWZA==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/unimport/-/unimport-1.2.0.tgz",
+      "integrity": "sha512-yMok/ubppurBE7Png1QH70Om96AxIoWCcfdxW3J/pziozShMc1UGpPgWpSckfo9ndAO5M74yNnRDdLAZy/gWQg==",
       "dev": true,
       "dependencies": {
-        "@rollup/pluginutils": "^4.2.1",
+        "@rollup/pluginutils": "^5.0.2",
         "escape-string-regexp": "^5.0.0",
-        "fast-glob": "^3.2.11",
+        "fast-glob": "^3.2.12",
         "local-pkg": "^0.4.2",
-        "magic-string": "^0.26.2",
-        "mlly": "^0.5.7",
-        "pathe": "^0.3.3",
-        "scule": "^0.3.2",
-        "strip-literal": "^0.4.0",
-        "unplugin": "^0.9.0"
+        "magic-string": "^0.27.0",
+        "mlly": "^1.0.0",
+        "pathe": "^1.0.0",
+        "pkg-types": "^1.0.1",
+        "scule": "^1.0.0",
+        "strip-literal": "^1.0.0",
+        "unplugin": "^1.0.1"
       }
     },
     "node_modules/unimport/node_modules/magic-string": {
-      "version": "0.26.3",
-      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.26.3.tgz",
-      "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+      "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
       "dev": true,
       "dependencies": {
-        "sourcemap-codec": "^1.4.8"
+        "@jridgewell/sourcemap-codec": "^1.4.13"
       },
       "engines": {
         "node": ">=12"
@@ -1504,53 +1314,36 @@
       }
     },
     "node_modules/unplugin": {
-      "version": "0.9.5",
-      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-0.9.5.tgz",
-      "integrity": "sha512-luraheyfxwtvkvHpsOvMNv7IjLdORTWKZp0gWYNHGLi2ImON3iIZOj464qEyyEwLA/EMt12fC415HW9zRpOfTg==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz",
+      "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==",
       "dev": true,
       "dependencies": {
-        "acorn": "^8.8.0",
+        "acorn": "^8.8.1",
         "chokidar": "^3.5.3",
         "webpack-sources": "^3.2.3",
-        "webpack-virtual-modules": "^0.4.4"
-      },
-      "peerDependencies": {
-        "esbuild": ">=0.13",
-        "rollup": "^2.50.0",
-        "vite": "^2.3.0 || ^3.0.0-0",
-        "webpack": "4 || 5"
-      },
-      "peerDependenciesMeta": {
-        "esbuild": {
-          "optional": true
-        },
-        "rollup": {
-          "optional": true
-        },
-        "vite": {
-          "optional": true
-        },
-        "webpack": {
-          "optional": true
-        }
+        "webpack-virtual-modules": "^0.5.0"
       }
     },
     "node_modules/unplugin-auto-import": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.11.2.tgz",
-      "integrity": "sha512-1+VwBfn9dtiYv9SQLKP1AvZolUbK9xTVeAT+iOcEk4EHSFUlmIqBVLEKI76cifSQTLOJ3rZyPrEgptf3SZNLlQ==",
+      "version": "0.11.5",
+      "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.11.5.tgz",
+      "integrity": "sha512-nvbL2AQwLRR8wbHpJ6L1EBVNmjN045RSedTa4NtsGRkSQFXkI1iKHs4dTqJwcKZsnFrZOAKtLPiN1/oQTObLZw==",
       "dev": true,
       "dependencies": {
-        "@antfu/utils": "^0.5.2",
-        "@rollup/pluginutils": "^4.2.1",
+        "@antfu/utils": "^0.7.0",
+        "@rollup/pluginutils": "^5.0.2",
         "local-pkg": "^0.4.2",
-        "magic-string": "^0.26.2",
-        "unimport": "^0.6.7",
-        "unplugin": "^0.9.3"
+        "magic-string": "^0.26.7",
+        "unimport": "^1.0.1",
+        "unplugin": "^1.0.0"
       },
       "engines": {
         "node": ">=14"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
       "peerDependencies": {
         "@vueuse/core": "*"
       },
@@ -1560,38 +1353,29 @@
         }
       }
     },
-    "node_modules/unplugin-auto-import/node_modules/magic-string": {
-      "version": "0.26.3",
-      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.26.3.tgz",
-      "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
-      "dev": true,
-      "dependencies": {
-        "sourcemap-codec": "^1.4.8"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/unplugin-vue-components": {
-      "version": "0.22.7",
-      "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.22.7.tgz",
-      "integrity": "sha512-MJEAKJF9bRykTRvJ4WXF0FNMAyt1PX3iwpu2NN+li35sAKjQv6sC1col5aZDLiwDZDo2AGwxNkzLJFKaun9qHw==",
+      "version": "0.22.12",
+      "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.22.12.tgz",
+      "integrity": "sha512-FxyzsuBvMCYPIk+8cgscGBQ345tvwVu+qY5IhE++eorkyvA4Z1TiD/HCiim+Kbqozl10i4K+z+NCa2WO2jexRA==",
       "dev": true,
       "dependencies": {
-        "@antfu/utils": "^0.5.2",
-        "@rollup/pluginutils": "^4.2.1",
+        "@antfu/utils": "^0.7.2",
+        "@rollup/pluginutils": "^5.0.2",
         "chokidar": "^3.5.3",
         "debug": "^4.3.4",
         "fast-glob": "^3.2.12",
         "local-pkg": "^0.4.2",
-        "magic-string": "^0.26.3",
-        "minimatch": "^5.1.0",
+        "magic-string": "^0.27.0",
+        "minimatch": "^5.1.1",
         "resolve": "^1.22.1",
-        "unplugin": "^0.9.5"
+        "unplugin": "^1.0.1"
       },
       "engines": {
         "node": ">=14"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
       "peerDependencies": {
         "@babel/parser": "^7.15.8",
         "vue": "2 || 3"
@@ -1603,27 +1387,27 @@
       }
     },
     "node_modules/unplugin-vue-components/node_modules/magic-string": {
-      "version": "0.26.3",
-      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.26.3.tgz",
-      "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
+      "version": "0.27.0",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+      "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
       "dev": true,
       "dependencies": {
-        "sourcemap-codec": "^1.4.8"
+        "@jridgewell/sourcemap-codec": "^1.4.13"
       },
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/vite": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmmirror.com/vite/-/vite-3.1.2.tgz",
-      "integrity": "sha512-wTDKPkiVbeT+drTPdkuvjVIC/2vKKUc1w3qNOuwgpyvPCZF6fvdxB5v5WEcCsqaYea0zrwA4+XialJKCHM3oVQ==",
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz",
+      "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==",
       "dev": true,
       "dependencies": {
-        "esbuild": "^0.15.6",
-        "postcss": "^8.4.16",
+        "esbuild": "^0.15.9",
+        "postcss": "^8.4.18",
         "resolve": "^1.22.1",
-        "rollup": "~2.78.0"
+        "rollup": "^2.79.1"
       },
       "bin": {
         "vite": "bin/vite.js"
@@ -1635,12 +1419,17 @@
         "fsevents": "~2.3.2"
       },
       "peerDependencies": {
+        "@types/node": ">= 14",
         "less": "*",
         "sass": "*",
         "stylus": "*",
+        "sugarss": "*",
         "terser": "^5.4.0"
       },
       "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
         "less": {
           "optional": true
         },
@@ -1650,29 +1439,35 @@
         "stylus": {
           "optional": true
         },
+        "sugarss": {
+          "optional": true
+        },
         "terser": {
           "optional": true
         }
       }
     },
     "node_modules/vue": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.39.tgz",
-      "integrity": "sha512-tRkguhRTw9NmIPXhzk21YFBqXHT2t+6C6wPOgQ50fcFVWnPdetmRqbmySRHznrYjX2E47u0cGlKGcxKZJ38R/g==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz",
+      "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==",
       "dependencies": {
-        "@vue/compiler-dom": "3.2.39",
-        "@vue/compiler-sfc": "3.2.39",
-        "@vue/runtime-dom": "3.2.39",
-        "@vue/server-renderer": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/compiler-dom": "3.2.45",
+        "@vue/compiler-sfc": "3.2.45",
+        "@vue/runtime-dom": "3.2.45",
+        "@vue/server-renderer": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "node_modules/vue-router": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.5.tgz",
-      "integrity": "sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==",
+      "version": "4.1.6",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz",
+      "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==",
       "dependencies": {
-        "@vue/devtools-api": "^6.1.4"
+        "@vue/devtools-api": "^6.4.5"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
       },
       "peerDependencies": {
         "vue": "^3.2.0"
@@ -1680,7 +1475,7 @@
     },
     "node_modules/webpack-sources": {
       "version": "3.2.3",
-      "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
       "dev": true,
       "engines": {
@@ -1688,15 +1483,15 @@
       }
     },
     "node_modules/webpack-virtual-modules": {
-      "version": "0.4.5",
-      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.5.tgz",
-      "integrity": "sha512-8bWq0Iluiv9lVf9YaqWQ9+liNgXSHICm+rg544yRgGYaR8yXZTVBaHZkINZSB2yZSWo4b0F6MIxqJezVfOEAlg==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+      "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
       "dev": true
     },
     "node_modules/zrender": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz",
-      "integrity": "sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==",
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.1.tgz",
+      "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==",
       "dependencies": {
         "tslib": "2.3.0"
       }
@@ -1704,50 +1499,49 @@
   },
   "dependencies": {
     "@antfu/utils": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.5.2.tgz",
-      "integrity": "sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==",
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.2.tgz",
+      "integrity": "sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==",
       "dev": true
     },
     "@babel/parser": {
-      "version": "7.19.1",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.19.1.tgz",
-      "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A=="
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
+      "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg=="
     },
     "@ctrl/tinycolor": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz",
-      "integrity": "sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw=="
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz",
+      "integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg=="
     },
     "@element-plus/icons-vue": {
       "version": "2.0.10",
-      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz",
+      "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz",
       "integrity": "sha512-ygEZ1mwPjcPo/OulhzLE7mtDrQBWI8vZzEWSNB2W/RNCRjoQGwbaK4N8lV4rid7Ts4qvySU3njMN7YCiSlSaTQ==",
       "requires": {}
     },
-    "@esbuild/linux-loong64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.7.tgz",
-      "integrity": "sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw==",
-      "dev": true,
-      "optional": true
-    },
     "@floating-ui/core": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.0.1.tgz",
-      "integrity": "sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA=="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.0.tgz",
+      "integrity": "sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ=="
     },
     "@floating-ui/dom": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.0.1.tgz",
-      "integrity": "sha512-wBDiLUKWU8QNPNOTAFHiIAkBv1KlHauG2AhqjSeh2H+wR8PX+AArXfz8NkRexH5PgMJMmSOS70YS89AbWYh5dA==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.0.tgz",
+      "integrity": "sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A==",
       "requires": {
-        "@floating-ui/core": "^1.0.1"
+        "@floating-ui/core": "^1.0.5"
       }
     },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+      "dev": true
+    },
     "@nodelib/fs.scandir": {
       "version": "2.1.5",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
       "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
       "dev": true,
       "requires": {
@@ -1757,13 +1551,13 @@
     },
     "@nodelib/fs.stat": {
       "version": "2.0.5",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
       "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
       "dev": true
     },
     "@nodelib/fs.walk": {
       "version": "1.2.8",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
       "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
       "dev": true,
       "requires": {
@@ -1773,198 +1567,225 @@
     },
     "@popperjs/core": {
       "version": "npm:@sxzz/popperjs-es@2.11.7",
-      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+      "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
       "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
     },
     "@rollup/pluginutils": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
-      "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
+      "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
       "dev": true,
       "requires": {
-        "estree-walker": "^2.0.1",
-        "picomatch": "^2.2.2"
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
       }
     },
+    "@types/estree": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
+      "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
+      "dev": true
+    },
     "@types/lodash": {
-      "version": "4.14.185",
-      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.185.tgz",
-      "integrity": "sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA=="
+      "version": "4.14.191",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+      "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
     },
     "@types/lodash-es": {
       "version": "4.17.6",
-      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz",
+      "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz",
       "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
       "requires": {
         "@types/lodash": "*"
       }
     },
     "@types/web-bluetooth": {
-      "version": "0.0.15",
-      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.15.tgz",
-      "integrity": "sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA=="
+      "version": "0.0.16",
+      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
     },
     "@vitejs/plugin-vue": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.1.0.tgz",
-      "integrity": "sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz",
+      "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==",
       "dev": true,
       "requires": {}
     },
     "@vue/compiler-core": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.39.tgz",
-      "integrity": "sha512-mf/36OWXqWn0wsC40nwRRGheR/qoID+lZXbIuLnr4/AngM0ov8Xvv8GHunC0rKRIkh60bTqydlqTeBo49rlbqw==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
+      "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
       "requires": {
         "@babel/parser": "^7.16.4",
-        "@vue/shared": "3.2.39",
+        "@vue/shared": "3.2.45",
         "estree-walker": "^2.0.2",
         "source-map": "^0.6.1"
       }
     },
     "@vue/compiler-dom": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.39.tgz",
-      "integrity": "sha512-HMFI25Be1C8vLEEv1hgEO1dWwG9QQ8LTTPmCkblVJY/O3OvWx6r1+zsox5mKPMGvqYEZa6l8j+xgOfUspgo7hw==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
+      "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
       "requires": {
-        "@vue/compiler-core": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/compiler-core": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "@vue/compiler-sfc": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.39.tgz",
-      "integrity": "sha512-fqAQgFs1/BxTUZkd0Vakn3teKUt//J3c420BgnYgEOoVdTwYpBTSXCMJ88GOBCylmUBbtquGPli9tVs7LzsWIA==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
+      "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
       "requires": {
         "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.39",
-        "@vue/compiler-dom": "3.2.39",
-        "@vue/compiler-ssr": "3.2.39",
-        "@vue/reactivity-transform": "3.2.39",
-        "@vue/shared": "3.2.39",
+        "@vue/compiler-core": "3.2.45",
+        "@vue/compiler-dom": "3.2.45",
+        "@vue/compiler-ssr": "3.2.45",
+        "@vue/reactivity-transform": "3.2.45",
+        "@vue/shared": "3.2.45",
         "estree-walker": "^2.0.2",
         "magic-string": "^0.25.7",
         "postcss": "^8.1.10",
         "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "magic-string": {
+          "version": "0.25.9",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+          "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+          "requires": {
+            "sourcemap-codec": "^1.4.8"
+          }
+        }
       }
     },
     "@vue/compiler-ssr": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.39.tgz",
-      "integrity": "sha512-EoGCJ6lincKOZGW+0Ky4WOKsSmqL7hp1ZYgen8M7u/mlvvEQUaO9tKKOy7K43M9U2aA3tPv0TuYYQFrEbK2eFQ==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
+      "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
       "requires": {
-        "@vue/compiler-dom": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/compiler-dom": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "@vue/devtools-api": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
-      "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ=="
+      "version": "6.4.5",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
+      "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ=="
     },
     "@vue/reactivity": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.39.tgz",
-      "integrity": "sha512-vlaYX2a3qMhIZfrw3Mtfd+BuU+TZmvDrPMa+6lpfzS9k/LnGxkSuf0fhkP0rMGfiOHPtyKoU9OJJJFGm92beVQ==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz",
+      "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==",
       "requires": {
-        "@vue/shared": "3.2.39"
+        "@vue/shared": "3.2.45"
       }
     },
     "@vue/reactivity-transform": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.39.tgz",
-      "integrity": "sha512-HGuWu864zStiWs9wBC6JYOP1E00UjMdDWIG5W+FpUx28hV3uz9ODOKVNm/vdOy/Pvzg8+OcANxAVC85WFBbl3A==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
+      "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
       "requires": {
         "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.39",
-        "@vue/shared": "3.2.39",
+        "@vue/compiler-core": "3.2.45",
+        "@vue/shared": "3.2.45",
         "estree-walker": "^2.0.2",
         "magic-string": "^0.25.7"
+      },
+      "dependencies": {
+        "magic-string": {
+          "version": "0.25.9",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+          "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+          "requires": {
+            "sourcemap-codec": "^1.4.8"
+          }
+        }
       }
     },
     "@vue/runtime-core": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.39.tgz",
-      "integrity": "sha512-xKH5XP57JW5JW+8ZG1khBbuLakINTgPuINKL01hStWLTTGFOrM49UfCFXBcFvWmSbci3gmJyLl2EAzCaZWsx8g==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz",
+      "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==",
       "requires": {
-        "@vue/reactivity": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/reactivity": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "@vue/runtime-dom": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.39.tgz",
-      "integrity": "sha512-4G9AEJP+sLhsqf5wXcyKVWQKUhI+iWfy0hWQgea+CpaTD7BR0KdQzvoQdZhwCY6B3oleSyNLkLAQwm0ya/wNoA==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz",
+      "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==",
       "requires": {
-        "@vue/runtime-core": "3.2.39",
-        "@vue/shared": "3.2.39",
+        "@vue/runtime-core": "3.2.45",
+        "@vue/shared": "3.2.45",
         "csstype": "^2.6.8"
       }
     },
     "@vue/server-renderer": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.39.tgz",
-      "integrity": "sha512-1yn9u2YBQWIgytFMjz4f/t0j43awKytTGVptfd3FtBk76t1pd8mxbek0G/DrnjJhd2V7mSTb5qgnxMYt8Z5iSQ==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz",
+      "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==",
       "requires": {
-        "@vue/compiler-ssr": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/compiler-ssr": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "@vue/shared": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.39.tgz",
-      "integrity": "sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw=="
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
+      "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg=="
     },
     "@vueuse/core": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.2.0.tgz",
-      "integrity": "sha512-/MZ6qpz6uSyaXrtoeBWQzAKRG3N7CvfVWvQxiM3ei3Xe5ydOjjtVbo7lGl9p8dECV93j7W8s63A8H0kFLpLyxg==",
+      "version": "9.10.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.10.0.tgz",
+      "integrity": "sha512-CxMewME07qeuzuT/AOIQGv0EhhDoojniqU6pC3F8m5VC76L47UT18DcX88kWlP3I7d3qMJ4u/PD8iSRsy3bmNA==",
       "requires": {
-        "@types/web-bluetooth": "^0.0.15",
-        "@vueuse/metadata": "9.2.0",
-        "@vueuse/shared": "9.2.0",
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.10.0",
+        "@vueuse/shared": "9.10.0",
         "vue-demi": "*"
       },
       "dependencies": {
         "vue-demi": {
           "version": "0.13.11",
-          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
+          "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
           "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
           "requires": {}
         }
       }
     },
     "@vueuse/metadata": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.2.0.tgz",
-      "integrity": "sha512-exN4KE6iquxDCdt72BgEhb3tlOpECtD61AUdXnUqBTIUCl70x1Ar/QXo3bYcvxmdMS2/peQyfeTzBjRTpvL5xw=="
+      "version": "9.10.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.10.0.tgz",
+      "integrity": "sha512-G5VZhgTCapzU9rv0Iq2HBrVOSGzOKb+OE668NxhXNcTjUjwYxULkEhAw70FtRLMZc+hxcFAzDZlKYA0xcwNMuw=="
     },
     "@vueuse/shared": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.2.0.tgz",
-      "integrity": "sha512-NnRp/noSWuXW0dKhZK5D0YLrDi0nmZ18UeEgwXQq7Ul5TTP93lcNnKjrHtd68j2xFB/l59yPGFlCryL692bnrA==",
+      "version": "9.10.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.10.0.tgz",
+      "integrity": "sha512-vakHJ2ZRklAzqmcVBL38RS7BxdBA4+5poG9NsSyqJxrt9kz0zX3P5CXMy0Hm6LFbZXUgvKdqAS3pUH1zX/5qTQ==",
       "requires": {
         "vue-demi": "*"
       },
       "dependencies": {
         "vue-demi": {
           "version": "0.13.11",
-          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
+          "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
           "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
           "requires": {}
         }
       }
     },
     "acorn": {
-      "version": "8.8.0",
-      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz",
-      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "version": "8.8.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
+      "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
       "dev": true
     },
     "anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "requires": {
         "normalize-path": "^3.0.0",
         "picomatch": "^2.0.4"
@@ -1972,17 +1793,17 @@
     },
     "async-validator": {
       "version": "4.2.5",
-      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
       "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
     },
     "asynckit": {
       "version": "0.4.0",
-      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "axios": {
       "version": "0.27.2",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
       "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
       "requires": {
         "follow-redirects": "^1.14.9",
@@ -1991,18 +1812,18 @@
     },
     "balanced-match": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
     "binary-extensions": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
       "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
     },
     "brace-expansion": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "dev": true,
       "requires": {
@@ -2011,7 +1832,7 @@
     },
     "braces": {
       "version": "3.0.2",
-      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
       "requires": {
         "fill-range": "^7.0.1"
@@ -2019,7 +1840,7 @@
     },
     "chokidar": {
       "version": "3.5.3",
-      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
       "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
       "requires": {
         "anymatch": "~3.1.2",
@@ -2034,7 +1855,7 @@
     },
     "combined-stream": {
       "version": "1.0.8",
-      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
       "requires": {
         "delayed-stream": "~1.0.0"
@@ -2042,17 +1863,17 @@
     },
     "csstype": {
       "version": "2.6.21",
-      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
       "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
     },
     "dayjs": {
-      "version": "1.11.5",
-      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.5.tgz",
-      "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA=="
+      "version": "1.11.7",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+      "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
     },
     "debug": {
       "version": "4.3.4",
-      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
       "requires": {
@@ -2061,22 +1882,22 @@
     },
     "delayed-stream": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
     },
     "echarts": {
-      "version": "5.3.3",
-      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.3.3.tgz",
-      "integrity": "sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==",
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.1.tgz",
+      "integrity": "sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==",
       "requires": {
         "tslib": "2.3.0",
-        "zrender": "5.3.2"
+        "zrender": "5.4.1"
       }
     },
     "element-plus": {
-      "version": "2.2.17",
-      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.17.tgz",
-      "integrity": "sha512-MGwMIE/q+FFD3kgS23x8HIe5043tmD1cTRwjhIX9o6fim1avFnUkrsfYRvybbz4CkyqSb185EheZS5AUPpXh2g==",
+      "version": "2.2.28",
+      "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.28.tgz",
+      "integrity": "sha512-BsxF7iEaBydmRfw1Tt++EO9jRBjbtJr7ZRIrnEwz4J3Cwa1IzHCNCcx3ZwcYTlJq9CYFxv94JnbNr1EbkTou3A==",
       "requires": {
         "@ctrl/tinycolor": "^3.4.1",
         "@element-plus/icons-vue": "^2.0.6",
@@ -2096,193 +1917,63 @@
       }
     },
     "esbuild": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.15.7.tgz",
-      "integrity": "sha512-7V8tzllIbAQV1M4QoE52ImKu8hT/NLGlGXkiDsbEU5PS6K8Mn09ZnYoS+dcmHxOS9CRsV4IRAMdT3I67IyUNXw==",
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+      "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
       "dev": true,
       "requires": {
-        "@esbuild/linux-loong64": "0.15.7",
-        "esbuild-android-64": "0.15.7",
-        "esbuild-android-arm64": "0.15.7",
-        "esbuild-darwin-64": "0.15.7",
-        "esbuild-darwin-arm64": "0.15.7",
-        "esbuild-freebsd-64": "0.15.7",
-        "esbuild-freebsd-arm64": "0.15.7",
-        "esbuild-linux-32": "0.15.7",
-        "esbuild-linux-64": "0.15.7",
-        "esbuild-linux-arm": "0.15.7",
-        "esbuild-linux-arm64": "0.15.7",
-        "esbuild-linux-mips64le": "0.15.7",
-        "esbuild-linux-ppc64le": "0.15.7",
-        "esbuild-linux-riscv64": "0.15.7",
-        "esbuild-linux-s390x": "0.15.7",
-        "esbuild-netbsd-64": "0.15.7",
-        "esbuild-openbsd-64": "0.15.7",
-        "esbuild-sunos-64": "0.15.7",
-        "esbuild-windows-32": "0.15.7",
-        "esbuild-windows-64": "0.15.7",
-        "esbuild-windows-arm64": "0.15.7"
-      }
-    },
-    "esbuild-android-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.7.tgz",
-      "integrity": "sha512-p7rCvdsldhxQr3YHxptf1Jcd86dlhvc3EQmQJaZzzuAxefO9PvcI0GLOa5nCWem1AJ8iMRu9w0r5TG8pHmbi9w==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-android-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.7.tgz",
-      "integrity": "sha512-L775l9ynJT7rVqRM5vo+9w5g2ysbOCfsdLV4CWanTZ1k/9Jb3IYlQ06VCI1edhcosTYJRECQFJa3eAvkx72eyQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-darwin-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.7.tgz",
-      "integrity": "sha512-KGPt3r1c9ww009t2xLB6Vk0YyNOXh7hbjZ3EecHoVDxgtbUlYstMPDaReimKe6eOEfyY4hBEEeTvKwPsiH5WZg==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-darwin-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.7.tgz",
-      "integrity": "sha512-kBIHvtVqbSGajN88lYMnR3aIleH3ABZLLFLxwL2stiuIGAjGlQW741NxVTpUHQXUmPzxi6POqc9npkXa8AcSZQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-freebsd-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.7.tgz",
-      "integrity": "sha512-hESZB91qDLV5MEwNxzMxPfbjAhOmtfsr9Wnuci7pY6TtEh4UDuevmGmkUIjX/b+e/k4tcNBMf7SRQ2mdNuK/HQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-freebsd-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.7.tgz",
-      "integrity": "sha512-dLFR0ChH5t+b3J8w0fVKGvtwSLWCv7GYT2Y2jFGulF1L5HftQLzVGN+6pi1SivuiVSmTh28FwUhi9PwQicXI6Q==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-32": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.7.tgz",
-      "integrity": "sha512-v3gT/LsONGUZcjbt2swrMjwxo32NJzk+7sAgtxhGx1+ZmOFaTRXBAi1PPfgpeo/J//Un2jIKm/I+qqeo4caJvg==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.7.tgz",
-      "integrity": "sha512-LxXEfLAKwOVmm1yecpMmWERBshl+Kv5YJ/1KnyAr6HRHFW8cxOEsEfisD3sVl/RvHyW//lhYUVSuy9jGEfIRAQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-arm": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.7.tgz",
-      "integrity": "sha512-JKgAHtMR5f75wJTeuNQbyznZZa+pjiUHV7sRZp42UNdyXC6TiUYMW/8z8yIBAr2Fpad8hM1royZKQisqPABPvQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.7.tgz",
-      "integrity": "sha512-P3cfhudpzWDkglutWgXcT2S7Ft7o2e3YDMrP1n0z2dlbUZghUkKCyaWw0zhp4KxEEzt/E7lmrtRu/pGWnwb9vw==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-mips64le": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.7.tgz",
-      "integrity": "sha512-T7XKuxl0VpeFLCJXub6U+iybiqh0kM/bWOTb4qcPyDDwNVhLUiPcGdG2/0S7F93czUZOKP57YiLV8YQewgLHKw==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-ppc64le": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.7.tgz",
-      "integrity": "sha512-6mGuC19WpFN7NYbecMIJjeQgvDb5aMuvyk0PDYBJrqAEMkTwg3Z98kEKuCm6THHRnrgsdr7bp4SruSAxEM4eJw==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-riscv64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.7.tgz",
-      "integrity": "sha512-uUJsezbswAYo/X7OU/P+PuL/EI9WzxsEQXDekfwpQ23uGiooxqoLFAPmXPcRAt941vjlY9jtITEEikWMBr+F/g==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-s390x": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.7.tgz",
-      "integrity": "sha512-+tO+xOyTNMc34rXlSxK7aCwJgvQyffqEM5MMdNDEeMU3ss0S6wKvbBOQfgd5jRPblfwJ6b+bKiz0g5nABpY0QQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-netbsd-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.7.tgz",
-      "integrity": "sha512-yVc4Wz+Pu3cP5hzm5kIygNPrjar/v5WCSoRmIjCPWfBVJkZNb5brEGKUlf+0Y759D48BCWa0WHrWXaNy0DULTQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-openbsd-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.7.tgz",
-      "integrity": "sha512-GsimbwC4FSR4lN3wf8XmTQ+r8/0YSQo21rWDL0XFFhLHKlzEA4SsT1Tl8bPYu00IU6UWSJ+b3fG/8SB69rcuEQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-sunos-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.7.tgz",
-      "integrity": "sha512-8CDI1aL/ts0mDGbWzjEOGKXnU7p3rDzggHSBtVryQzkSOsjCHRVe0iFYUuhczlxU1R3LN/E7HgUO4NXzGGP/Ag==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-windows-32": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.7.tgz",
-      "integrity": "sha512-cOnKXUEPS8EGCzRSFa1x6NQjGhGsFlVgjhqGEbLTPsA7x4RRYiy2RKoArNUU4iR2vHmzqS5Gr84MEumO/wxYKA==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-windows-64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.7.tgz",
-      "integrity": "sha512-7MI08Ec2sTIDv+zH6StNBKO+2hGUYIT42GmFyW6MBBWWtJhTcQLinKS6ldIN1d52MXIbiJ6nXyCJ+LpL4jBm3Q==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-windows-arm64": {
-      "version": "0.15.7",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.7.tgz",
-      "integrity": "sha512-R06nmqBlWjKHddhRJYlqDd3Fabx9LFdKcjoOy08YLimwmsswlFBJV4rXzZCxz/b7ZJXvrZgj8DDv1ewE9+StMw==",
-      "dev": true,
-      "optional": true
+        "@esbuild/android-arm": "0.15.18",
+        "@esbuild/linux-loong64": "0.15.18",
+        "esbuild-android-64": "0.15.18",
+        "esbuild-android-arm64": "0.15.18",
+        "esbuild-darwin-64": "0.15.18",
+        "esbuild-darwin-arm64": "0.15.18",
+        "esbuild-freebsd-64": "0.15.18",
+        "esbuild-freebsd-arm64": "0.15.18",
+        "esbuild-linux-32": "0.15.18",
+        "esbuild-linux-64": "0.15.18",
+        "esbuild-linux-arm": "0.15.18",
+        "esbuild-linux-arm64": "0.15.18",
+        "esbuild-linux-mips64le": "0.15.18",
+        "esbuild-linux-ppc64le": "0.15.18",
+        "esbuild-linux-riscv64": "0.15.18",
+        "esbuild-linux-s390x": "0.15.18",
+        "esbuild-netbsd-64": "0.15.18",
+        "esbuild-openbsd-64": "0.15.18",
+        "esbuild-sunos-64": "0.15.18",
+        "esbuild-windows-32": "0.15.18",
+        "esbuild-windows-64": "0.15.18",
+        "esbuild-windows-arm64": "0.15.18"
+      },
+      "dependencies": {
+        "esbuild-windows-64": {
+          "version": "0.15.18",
+          "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+          "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
+          "dev": true,
+          "optional": true
+        }
+      }
     },
     "escape-html": {
       "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
     },
     "escape-string-regexp": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
       "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
       "dev": true
     },
     "estree-walker": {
       "version": "2.0.2",
-      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
     "fast-glob": {
       "version": "3.2.12",
-      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
       "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
       "dev": true,
       "requires": {
@@ -2294,9 +1985,9 @@
       }
     },
     "fastq": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz",
-      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
       "dev": true,
       "requires": {
         "reusify": "^1.0.4"
@@ -2304,7 +1995,7 @@
     },
     "fill-range": {
       "version": "7.0.1",
-      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
       "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "requires": {
         "to-regex-range": "^5.0.1"
@@ -2312,12 +2003,12 @@
     },
     "follow-redirects": {
       "version": "1.15.2",
-      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
       "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
     },
     "form-data": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
       "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
       "requires": {
         "asynckit": "^0.4.0",
@@ -2325,21 +2016,15 @@
         "mime-types": "^2.1.12"
       }
     },
-    "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "optional": true
-    },
     "function-bind": {
       "version": "1.1.1",
-      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
       "dev": true
     },
     "glob-parent": {
       "version": "5.1.2",
-      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
       "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "requires": {
         "is-glob": "^4.0.1"
@@ -2353,7 +2038,7 @@
     },
     "has": {
       "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
       "dev": true,
       "requires": {
@@ -2361,22 +2046,22 @@
       }
     },
     "immutable": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz",
-      "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ=="
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz",
+      "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og=="
     },
     "is-binary-path": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
       "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "requires": {
         "binary-extensions": "^2.0.0"
       }
     },
     "is-core-module": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.10.0.tgz",
-      "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
       "dev": true,
       "requires": {
         "has": "^1.0.3"
@@ -2384,12 +2069,12 @@
     },
     "is-extglob": {
       "version": "2.1.1",
-      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
     },
     "is-glob": {
       "version": "4.0.3",
-      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
       "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "requires": {
         "is-extglob": "^2.1.1"
@@ -2397,12 +2082,12 @@
     },
     "is-number": {
       "version": "7.0.0",
-      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
     },
     "jsonc-parser": {
       "version": "3.2.0",
-      "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
       "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
       "dev": true
     },
@@ -2417,48 +2102,49 @@
     },
     "local-pkg": {
       "version": "0.4.2",
-      "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.2.tgz",
+      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz",
       "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==",
       "dev": true
     },
     "lodash": {
       "version": "4.17.21",
-      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "lodash-es": {
       "version": "4.17.21",
-      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
     },
     "lodash-unified": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.2.tgz",
-      "integrity": "sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
       "requires": {}
     },
     "magic-string": {
-      "version": "0.25.9",
-      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
-      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "version": "0.26.7",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
+      "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
+      "dev": true,
       "requires": {
         "sourcemap-codec": "^1.4.8"
       }
     },
     "memoize-one": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
       "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
     },
     "merge2": {
       "version": "1.4.1",
-      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
       "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true
     },
     "micromatch": {
       "version": "4.0.5",
-      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
       "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
       "dev": true,
       "requires": {
@@ -2468,21 +2154,21 @@
     },
     "mime-db": {
       "version": "1.52.0",
-      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
     },
     "mime-types": {
       "version": "2.1.35",
-      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "requires": {
         "mime-db": "1.52.0"
       }
     },
     "minimatch": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.0.tgz",
-      "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
+      "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
       "dev": true,
       "requires": {
         "brace-expansion": "^2.0.1"
@@ -2490,96 +2176,96 @@
     },
     "mitt": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
       "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
     },
     "mlly": {
-      "version": "0.5.14",
-      "resolved": "https://registry.npmmirror.com/mlly/-/mlly-0.5.14.tgz",
-      "integrity": "sha512-DgRgNUSX9NIxxCxygX4Xeg9C7GX7OUx1wuQ8cXx9o9LE0e9wrH+OZ9fcnrlEedsC/rtqry3ZhUddC759XD/L0w==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.0.tgz",
+      "integrity": "sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==",
       "dev": true,
       "requires": {
-        "acorn": "^8.8.0",
-        "pathe": "^0.3.5",
-        "pkg-types": "^0.3.4",
-        "ufo": "^0.8.5"
+        "acorn": "^8.8.1",
+        "pathe": "^1.0.0",
+        "pkg-types": "^1.0.1",
+        "ufo": "^1.0.1"
       }
     },
     "ms": {
       "version": "2.1.2",
-      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
     "nanoid": {
       "version": "3.3.4",
-      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
       "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
     },
     "normalize-path": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
     },
     "normalize-wheel-es": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
     "path-parse": {
       "version": "1.0.7",
-      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
     "pathe": {
-      "version": "0.3.7",
-      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.3.7.tgz",
-      "integrity": "sha512-yz7GK+kSsS27x727jtXpd5VT4dDfP/JDIQmaowfxyWCnFjOWtE1VIh7i6TzcSfzW0n4+bRQztj1VdKnITNq/MA==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz",
+      "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==",
       "dev": true
     },
     "picocolors": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
       "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
     },
     "picomatch": {
       "version": "2.3.1",
-      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
     },
     "pinia": {
-      "version": "2.0.22",
-      "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.0.22.tgz",
-      "integrity": "sha512-u+b8/BC+tmvo3ACbYO2w5NfxHWFOjvvw9DQnyT0dW8aUMCPRQT5QnfZ5R5W2MzZBMTeZRMQI7V/QFbafmM9QHw==",
+      "version": "2.0.28",
+      "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.28.tgz",
+      "integrity": "sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==",
       "requires": {
-        "@vue/devtools-api": "^6.2.1",
+        "@vue/devtools-api": "^6.4.5",
         "vue-demi": "*"
       },
       "dependencies": {
         "vue-demi": {
           "version": "0.13.11",
-          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
+          "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
           "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
           "requires": {}
         }
       }
     },
     "pkg-types": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-0.3.5.tgz",
-      "integrity": "sha512-VkxCBFVgQhNHYk9subx+HOhZ4jzynH11ah63LZsprTKwPCWG9pfWBlkElWFbvkP9BVR0dP1jS9xPdhaHQNK74Q==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz",
+      "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==",
       "dev": true,
       "requires": {
         "jsonc-parser": "^3.2.0",
-        "mlly": "^0.5.14",
-        "pathe": "^0.3.7"
+        "mlly": "^1.0.0",
+        "pathe": "^1.0.0"
       }
     },
     "postcss": {
-      "version": "8.4.16",
-      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.16.tgz",
-      "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
+      "version": "8.4.21",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+      "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
       "requires": {
         "nanoid": "^3.3.4",
         "picocolors": "^1.0.0",
@@ -2588,13 +2274,13 @@
     },
     "queue-microtask": {
       "version": "1.2.3",
-      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
       "dev": true
     },
     "readdirp": {
       "version": "3.6.0",
-      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
       "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "requires": {
         "picomatch": "^2.2.1"
@@ -2602,7 +2288,7 @@
     },
     "resolve": {
       "version": "1.22.1",
-      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
       "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
       "dev": true,
       "requires": {
@@ -2613,14 +2299,14 @@
     },
     "reusify": {
       "version": "1.0.4",
-      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
       "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
       "dev": true
     },
     "rollup": {
-      "version": "2.78.1",
-      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.78.1.tgz",
-      "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==",
+      "version": "2.79.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+      "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
       "dev": true,
       "requires": {
         "fsevents": "~2.3.2"
@@ -2628,7 +2314,7 @@
     },
     "run-parallel": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
       "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
       "dev": true,
       "requires": {
@@ -2636,9 +2322,9 @@
       }
     },
     "sass": {
-      "version": "1.54.9",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.54.9.tgz",
-      "integrity": "sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==",
+      "version": "1.57.1",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz",
+      "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==",
       "requires": {
         "chokidar": ">=3.0.0 <4.0.0",
         "immutable": "^4.0.0",
@@ -2646,44 +2332,44 @@
       }
     },
     "scule": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmmirror.com/scule/-/scule-0.3.2.tgz",
-      "integrity": "sha512-zIvPdjOH8fv8CgrPT5eqtxHQXmPNnV/vHJYffZhE43KZkvULvpCTvOt1HPlFaCZx287INL9qaqrZg34e8NgI4g==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz",
+      "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==",
       "dev": true
     },
     "source-map": {
       "version": "0.6.1",
-      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
     },
     "source-map-js": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
       "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
     },
     "sourcemap-codec": {
       "version": "1.4.8",
-      "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
       "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
     },
     "strip-literal": {
-      "version": "0.4.2",
-      "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-0.4.2.tgz",
-      "integrity": "sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz",
+      "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==",
       "dev": true,
       "requires": {
-        "acorn": "^8.8.0"
+        "acorn": "^8.8.1"
       }
     },
     "supports-preserve-symlinks-flag": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
       "dev": true
     },
     "to-regex-range": {
       "version": "5.0.1",
-      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "requires": {
         "is-number": "^7.0.0"
@@ -2691,40 +2377,41 @@
     },
     "tslib": {
       "version": "2.3.0",
-      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
       "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
     },
     "ufo": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmmirror.com/ufo/-/ufo-0.8.5.tgz",
-      "integrity": "sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz",
+      "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==",
       "dev": true
     },
     "unimport": {
-      "version": "0.6.7",
-      "resolved": "https://registry.npmmirror.com/unimport/-/unimport-0.6.7.tgz",
-      "integrity": "sha512-EMoVqDjswHkU+nD098QYHXH7Mkw7KwGDQAyeRF2lgairJnuO+wpkhIcmCqrD1OPJmsjkTbJ2tW6Ap8St0PuWZA==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/unimport/-/unimport-1.2.0.tgz",
+      "integrity": "sha512-yMok/ubppurBE7Png1QH70Om96AxIoWCcfdxW3J/pziozShMc1UGpPgWpSckfo9ndAO5M74yNnRDdLAZy/gWQg==",
       "dev": true,
       "requires": {
-        "@rollup/pluginutils": "^4.2.1",
+        "@rollup/pluginutils": "^5.0.2",
         "escape-string-regexp": "^5.0.0",
-        "fast-glob": "^3.2.11",
+        "fast-glob": "^3.2.12",
         "local-pkg": "^0.4.2",
-        "magic-string": "^0.26.2",
-        "mlly": "^0.5.7",
-        "pathe": "^0.3.3",
-        "scule": "^0.3.2",
-        "strip-literal": "^0.4.0",
-        "unplugin": "^0.9.0"
+        "magic-string": "^0.27.0",
+        "mlly": "^1.0.0",
+        "pathe": "^1.0.0",
+        "pkg-types": "^1.0.1",
+        "scule": "^1.0.0",
+        "strip-literal": "^1.0.0",
+        "unplugin": "^1.0.1"
       },
       "dependencies": {
         "magic-string": {
-          "version": "0.26.3",
-          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.26.3.tgz",
-          "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
+          "version": "0.27.0",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+          "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
           "dev": true,
           "requires": {
-            "sourcemap-codec": "^1.4.8"
+            "@jridgewell/sourcemap-codec": "^1.4.13"
           }
         }
       }
@@ -2735,120 +2422,109 @@
       "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
     },
     "unplugin": {
-      "version": "0.9.5",
-      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-0.9.5.tgz",
-      "integrity": "sha512-luraheyfxwtvkvHpsOvMNv7IjLdORTWKZp0gWYNHGLi2ImON3iIZOj464qEyyEwLA/EMt12fC415HW9zRpOfTg==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz",
+      "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==",
       "dev": true,
       "requires": {
-        "acorn": "^8.8.0",
+        "acorn": "^8.8.1",
         "chokidar": "^3.5.3",
         "webpack-sources": "^3.2.3",
-        "webpack-virtual-modules": "^0.4.4"
+        "webpack-virtual-modules": "^0.5.0"
       }
     },
     "unplugin-auto-import": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.11.2.tgz",
-      "integrity": "sha512-1+VwBfn9dtiYv9SQLKP1AvZolUbK9xTVeAT+iOcEk4EHSFUlmIqBVLEKI76cifSQTLOJ3rZyPrEgptf3SZNLlQ==",
+      "version": "0.11.5",
+      "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.11.5.tgz",
+      "integrity": "sha512-nvbL2AQwLRR8wbHpJ6L1EBVNmjN045RSedTa4NtsGRkSQFXkI1iKHs4dTqJwcKZsnFrZOAKtLPiN1/oQTObLZw==",
       "dev": true,
       "requires": {
-        "@antfu/utils": "^0.5.2",
-        "@rollup/pluginutils": "^4.2.1",
+        "@antfu/utils": "^0.7.0",
+        "@rollup/pluginutils": "^5.0.2",
         "local-pkg": "^0.4.2",
-        "magic-string": "^0.26.2",
-        "unimport": "^0.6.7",
-        "unplugin": "^0.9.3"
-      },
-      "dependencies": {
-        "magic-string": {
-          "version": "0.26.3",
-          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.26.3.tgz",
-          "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
-          "dev": true,
-          "requires": {
-            "sourcemap-codec": "^1.4.8"
-          }
-        }
+        "magic-string": "^0.26.7",
+        "unimport": "^1.0.1",
+        "unplugin": "^1.0.0"
       }
     },
     "unplugin-vue-components": {
-      "version": "0.22.7",
-      "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.22.7.tgz",
-      "integrity": "sha512-MJEAKJF9bRykTRvJ4WXF0FNMAyt1PX3iwpu2NN+li35sAKjQv6sC1col5aZDLiwDZDo2AGwxNkzLJFKaun9qHw==",
+      "version": "0.22.12",
+      "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.22.12.tgz",
+      "integrity": "sha512-FxyzsuBvMCYPIk+8cgscGBQ345tvwVu+qY5IhE++eorkyvA4Z1TiD/HCiim+Kbqozl10i4K+z+NCa2WO2jexRA==",
       "dev": true,
       "requires": {
-        "@antfu/utils": "^0.5.2",
-        "@rollup/pluginutils": "^4.2.1",
+        "@antfu/utils": "^0.7.2",
+        "@rollup/pluginutils": "^5.0.2",
         "chokidar": "^3.5.3",
         "debug": "^4.3.4",
         "fast-glob": "^3.2.12",
         "local-pkg": "^0.4.2",
-        "magic-string": "^0.26.3",
-        "minimatch": "^5.1.0",
+        "magic-string": "^0.27.0",
+        "minimatch": "^5.1.1",
         "resolve": "^1.22.1",
-        "unplugin": "^0.9.5"
+        "unplugin": "^1.0.1"
       },
       "dependencies": {
         "magic-string": {
-          "version": "0.26.3",
-          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.26.3.tgz",
-          "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
+          "version": "0.27.0",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+          "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
           "dev": true,
           "requires": {
-            "sourcemap-codec": "^1.4.8"
+            "@jridgewell/sourcemap-codec": "^1.4.13"
           }
         }
       }
     },
     "vite": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmmirror.com/vite/-/vite-3.1.2.tgz",
-      "integrity": "sha512-wTDKPkiVbeT+drTPdkuvjVIC/2vKKUc1w3qNOuwgpyvPCZF6fvdxB5v5WEcCsqaYea0zrwA4+XialJKCHM3oVQ==",
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz",
+      "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==",
       "dev": true,
       "requires": {
-        "esbuild": "^0.15.6",
+        "esbuild": "^0.15.9",
         "fsevents": "~2.3.2",
-        "postcss": "^8.4.16",
+        "postcss": "^8.4.18",
         "resolve": "^1.22.1",
-        "rollup": "~2.78.0"
+        "rollup": "^2.79.1"
       }
     },
     "vue": {
-      "version": "3.2.39",
-      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.39.tgz",
-      "integrity": "sha512-tRkguhRTw9NmIPXhzk21YFBqXHT2t+6C6wPOgQ50fcFVWnPdetmRqbmySRHznrYjX2E47u0cGlKGcxKZJ38R/g==",
+      "version": "3.2.45",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz",
+      "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==",
       "requires": {
-        "@vue/compiler-dom": "3.2.39",
-        "@vue/compiler-sfc": "3.2.39",
-        "@vue/runtime-dom": "3.2.39",
-        "@vue/server-renderer": "3.2.39",
-        "@vue/shared": "3.2.39"
+        "@vue/compiler-dom": "3.2.45",
+        "@vue/compiler-sfc": "3.2.45",
+        "@vue/runtime-dom": "3.2.45",
+        "@vue/server-renderer": "3.2.45",
+        "@vue/shared": "3.2.45"
       }
     },
     "vue-router": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.5.tgz",
-      "integrity": "sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==",
+      "version": "4.1.6",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz",
+      "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==",
       "requires": {
-        "@vue/devtools-api": "^6.1.4"
+        "@vue/devtools-api": "^6.4.5"
       }
     },
     "webpack-sources": {
       "version": "3.2.3",
-      "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
       "dev": true
     },
     "webpack-virtual-modules": {
-      "version": "0.4.5",
-      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.5.tgz",
-      "integrity": "sha512-8bWq0Iluiv9lVf9YaqWQ9+liNgXSHICm+rg544yRgGYaR8yXZTVBaHZkINZSB2yZSWo4b0F6MIxqJezVfOEAlg==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+      "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
       "dev": true
     },
     "zrender": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz",
-      "integrity": "sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==",
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.1.tgz",
+      "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==",
       "requires": {
         "tslib": "2.3.0"
       }
diff --git a/ui/src/App.vue b/ui/src/App.vue
index e16e006e..201ef300 100644
--- a/ui/src/App.vue
+++ b/ui/src/App.vue
@@ -18,76 +18,12 @@
 -->
 
 <script setup>
-import HeaderComponent from './components/Header/index.vue'
-import RightMenuComponent from './components/Database/Aside/components/RightMenu/index.vue'
-import { computed } from '@vue/runtime-core'
-import stores from './stores/index'
-import { useRouter, useRoute } from 'vue-router'
-import { getCurrentInstance } from "@vue/runtime-core";
-
-const route = useRoute()
-const router = useRouter()
-const { menuState, header } = stores()
-const { proxy } = getCurrentInstance()
-const $bus = getCurrentInstance().appContext.config.globalProperties.mittBus
-const showRightMenu = computed(() => {
-  return menuState.showRightMenu
-})
-const left = computed(() => {
-  return menuState.left
-})
-const top = computed(() => {
-  return menuState.top
-})
-const rightMenuList = computed(() => {
-  return menuState.rightMenuList
-})
-let activePath = ""
-let show = true
-let showButton = true
-
-const initData = (() => {
-  let path = route.path
-  let name = route.name
-  if (name == "NotFound") {
-    show = false
-  } else {
-    activePath = path
-  }
-  if (name == "Stream" || name == "Measure") {
-    header.changeShowButton(true)
-  } else {
-    header.changeShowButton(false)
-  }
-})()
-
-const appMouseDown = () => {
-  menuState.changeShowRightMenu(false)
-}
-const handleRightItem = (index) => {
-  $bus.emit('handleRightItem', index)
-}
 </script>
 
 <template>
   <div id="app">
-    <div @mousedown="appMouseDown" style="width: 100%; height:100%">
-      <el-container>
-        <el-header v-if="show">
-          <header-component :active="activePath" :showButton="showButton"></header-component>
-        </el-header>
-        <el-main>
-          <keep-alive>
-            <router-view v-if="$route.meta.keepAlive" />
-          </keep-alive>
-          <router-view v-if="!$route.meta.keepAlive"></router-view>
-        </el-main>
-      </el-container>
-    </div>
-    <div v-show="showRightMenu" class="right-menu border-radius-little box-shadow"
-      :style="{ top: top + 'px', left: left + 'px' }">
-      <right-menu-component @handleRightItem="handleRightItem" :rightMenuList="rightMenuList">
-      </right-menu-component>
+    <div style="width: 100%; height:100%">
+      <RouterView></RouterView>
     </div>
   </div>
 </template>
diff --git a/ui/src/components/Database/Aside/components/DialogResources/index.vue b/ui/src/components/Database/Aside/components/DialogResources/TagDialog.vue
similarity index 57%
copy from ui/src/components/Database/Aside/components/DialogResources/index.vue
copy to ui/src/components/Database/Aside/components/DialogResources/TagDialog.vue
index 01e236dc..2f8024f8 100644
--- a/ui/src/components/Database/Aside/components/DialogResources/index.vue
+++ b/ui/src/components/Database/Aside/components/DialogResources/TagDialog.vue
@@ -20,14 +20,9 @@
 <script setup>
 import { watch, ref, reactive } from 'vue'
 const rule = {
-    name: [
+    tagFamily: [
         {
-            required: true, message: 'Please enter the name', trigger: 'blur'
-        }
-    ],
-    group: [
-        {
-            required: true, message: 'Please enter the group', trigger: 'blur'
+            required: true, message: 'Please enter the tagFamily name', trigger: 'blur'
         }
     ]
 }
@@ -39,17 +34,20 @@ const props = defineProps({
     },
     operation: {
         type: String,
-        default: 'create',
+        default: 'Add',
         required: true
     },
     type: {
         type: String,
-        default: 'stream',
-        required: true
+        default: 'Tag'
     },
     group: {
         type: String,
         required: true
+    },
+    name: {
+        type: String,
+        required: true
     }
 })
 
@@ -58,43 +56,16 @@ let data = reactive({
     form: {
         metadata: {
             group: '',
-            name: ''
+            name: '',
+            tagFamily: ''
         }
     }
 })
 let rules = rule
-let tableData = [{
-    tagFamilies: 'searchable',
-    name: 'stream-ids',
-    type: 'String'
-}, {
-    tagFamilies: 'searchable',
-    name: 'stream-ids',
-    type: 'String'
-}, {
-    tagFamilies: 'searchable',
-    name: 'stream-ids',
-    type: 'String'
-}, {
-    tagFamilies: 'searchable',
-    name: 'stream-ids',
-    type: 'String'
-}, {
-    tagFamilies: 'searchable',
-    name: 'stream-ids',
-    type: 'String'
-}, {
-    tagFamilies: 'searchable',
-    name: 'stream-ids',
-    type: 'String'
-}, {
-    tagFamilies: 'searchable',
-    name: 'stream-ids',
-    type: 'String'
-}, {
-    tagFamilies: 'searchable',
-    name: 'stream-ids',
-    type: 'String'
+let tags = [{
+    name: 'start_time',
+    type: 'TAG_TYPE_INT',
+    indexedOnly: false
 }]
 const ruleForm = ref()
 const emit = defineEmits(['confirm', 'cancel'])
@@ -136,20 +107,46 @@ function objectSpanMethod({ row, column, rowIndex, columnIndex }) {
 
 <template>
     <div>
-        <el-dialog width="25%" center :title="`${operation} ${type}`" @close="cancelForm" v-model="data.dialogVisible">
+        <el-dialog width="35%" center :title="`${operation} ${type}`" :show-close="false" v-model="data.dialogVisible"
+            :align-center="true">
             <el-form ref="ruleForm" :rules="rules" :model="data.form.metadata" label-position="left">
                 <el-form-item label="group" label-width="100px" prop="group">
-                    <el-input disabled v-model="data.form.metadata.group" style="width: 300px;">
+                    <el-input disabled v-model="data.form.metadata.group">
                     </el-input>
                 </el-form-item>
                 <el-form-item label="name" label-width="100px" prop="name">
-                    <el-input :disabled="operation == 'edit'" v-model="data.form.metadata.name" style="width: 300px;">
+                    <el-input disabled v-model="data.form.metadata.name">
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="tagFamily" label-width="100px" prop="tagFamily">
+                    <el-input v-model="data.form.metadata.tagFamily">
                     </el-input>
                 </el-form-item>
+                <div class="flex justify-between justify-between opeartorTag">
+                    <div>
+                        <span>Tag</span>
+                    </div>
+                    <div style="width: 50%" class="flex justify-end">
+                        <el-button type="primary" size="small">Add tag</el-button>
+                        <el-button size="small">Batch deletion</el-button>
+                    </div>
+                </div>
+                <el-table :data="tags" border>
+                    <el-table-column type="selection" width="55" />
+                    <el-table-column label="Name" prop="name" />
+                    <el-table-column label="Type" prop="type" />
+                    <el-table-column label="indexedOnly" prop="indexedOnly" />
+                    <el-table-column fixed="right" label="Operations" width="150">
+                        <template #default>
+                            <el-button size="small" @click="handleClick">Detele</el-button>
+                            <el-button size="small">Edit</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
             </el-form>
-            <div slot="footer" class="dialog-footer">
+            <div slot="footer" class="dialog-footer footer">
                 <el-button @click="cancelForm">cancel</el-button>
-                <el-button type="primary" @click="confirmForm">{{operation}}
+                <el-button type="primary" @click="confirmForm">{{ operation }}
                 </el-button>
             </div>
         </el-dialog>
@@ -157,5 +154,14 @@ function objectSpanMethod({ row, column, rowIndex, columnIndex }) {
 </template>
 
 <style lang="scss" scoped>
+.footer {
+    width: 100%;
+    display: flex;
+    justify-content: center;
+}
 
+.opeartorTag {
+    width: 100%;
+    height: 40px;
+}
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/DialogResources/index.vue b/ui/src/components/Database/Aside/components/DialogResources/index.vue
index 01e236dc..797a07eb 100644
--- a/ui/src/components/Database/Aside/components/DialogResources/index.vue
+++ b/ui/src/components/Database/Aside/components/DialogResources/index.vue
@@ -19,6 +19,7 @@
 
 <script setup>
 import { watch, ref, reactive } from 'vue'
+import TagDialog from './TagDialog.vue'
 const rule = {
     name: [
         {
@@ -55,6 +56,8 @@ const props = defineProps({
 
 let data = reactive({
     dialogVisible: false,
+    tagDialogVisible: false,
+    operation: 'Add',
     form: {
         metadata: {
             group: '',
@@ -64,37 +67,26 @@ let data = reactive({
 })
 let rules = rule
 let tableData = [{
-    tagFamilies: 'searchable',
     name: 'stream-ids',
-    type: 'String'
+    tags: [{
+        name: 'start_time',
+        type: 'TAG_TYPE_INT',
+        indexedOnly: false
+    }]
 }, {
-    tagFamilies: 'searchable',
     name: 'stream-ids',
-    type: 'String'
 }, {
-    tagFamilies: 'searchable',
     name: 'stream-ids',
-    type: 'String'
 }, {
-    tagFamilies: 'searchable',
     name: 'stream-ids',
-    type: 'String'
 }, {
-    tagFamilies: 'searchable',
     name: 'stream-ids',
-    type: 'String'
 }, {
-    tagFamilies: 'searchable',
     name: 'stream-ids',
-    type: 'String'
 }, {
-    tagFamilies: 'searchable',
     name: 'stream-ids',
-    type: 'String'
 }, {
-    tagFamilies: 'searchable',
     name: 'stream-ids',
-    type: 'String'
 }]
 const ruleForm = ref()
 const emit = defineEmits(['confirm', 'cancel'])
@@ -136,26 +128,82 @@ function objectSpanMethod({ row, column, rowIndex, columnIndex }) {
 
 <template>
     <div>
-        <el-dialog width="25%" center :title="`${operation} ${type}`" @close="cancelForm" v-model="data.dialogVisible">
+        <el-dialog width="35%" center :title="`${operation} ${type}`" :show-close="false" v-model="data.dialogVisible"
+            :align-center="true">
             <el-form ref="ruleForm" :rules="rules" :model="data.form.metadata" label-position="left">
                 <el-form-item label="group" label-width="100px" prop="group">
-                    <el-input disabled v-model="data.form.metadata.group" style="width: 300px;">
+                    <el-input disabled v-model="data.form.metadata.group">
                     </el-input>
                 </el-form-item>
                 <el-form-item label="name" label-width="100px" prop="name">
-                    <el-input :disabled="operation == 'edit'" v-model="data.form.metadata.name" style="width: 300px;">
+                    <el-input :disabled="operation == 'edit'" v-model="data.form.metadata.name">
                     </el-input>
                 </el-form-item>
+                <div class="flex justify-between justify-between opeartorTag">
+                    <div>
+                        <span>Tag Families</span>
+                    </div>
+                    <div style="width: 50%" class="flex justify-end">
+                        <el-button type="primary" size="small" @click="data.tagDialogVisible = true, data.operation = 'Add'">Add tag families
+                        </el-button>
+                        <el-button size="small">Batch deletion</el-button>
+                    </div>
+                </div>
+                <el-table :data="tableData" border>
+                    <el-table-column type="selection" width="55" />
+                    <!-- <el-table-column label="Tags" type="expand" width="60">
+                        <template #default="props">
+                            <div class="flex justify-end justify-between opeartorTag">
+                                <el-button type="primary" size="small">Add tag</el-button>
+                                <el-button size="small">Batch deletion</el-button>
+                            </div>
+                            <el-table :data="props.row.tags" border style="width: 95%; margin-left: 5%;">
+                                <el-table-column type="selection" width="55" />
+                                <el-table-column label="Name" prop="name" />
+                                <el-table-column label="Type" prop="type" />
+                                <el-table-column label="indexedOnly" prop="indexedOnly" />
+                                <el-table-column fixed="right" label="Operations" width="150">
+                                    <template #default>
+                                        <el-button size="small" @click="handleClick">Detele</el-button>
+                                        <el-button size="small">Edit</el-button>
+                                    </template>
+                                </el-table-column>
+                            </el-table>
+                            <div style="width: 95%; margin-left: 5%;">
+                                <el-divider />
+                            </div>
+                        </template>
+                    </el-table-column> -->
+                    <el-table-column label="Name" prop="name"></el-table-column>
+                    <el-table-column fixed="right" label="Operations" width="150">
+                        <template #default>
+                            <el-button size="small" @click="handleClick">Detele</el-button>
+                            <el-button size="small" @click="data.tagDialogVisible = true, data.operation = 'Edit'">Edit
+                            </el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
             </el-form>
-            <div slot="footer" class="dialog-footer">
+            <div slot="footer" class="dialog-footer footer">
                 <el-button @click="cancelForm">cancel</el-button>
-                <el-button type="primary" @click="confirmForm">{{operation}}
+                <el-button type="primary" @click="confirmForm">{{ operation }}
                 </el-button>
             </div>
         </el-dialog>
     </div>
+    <tag-dialog :visible.sync="data.tagDialogVisible" @cancel="data.tagDialogVisible = false"
+        :group="data.form.metadata.group" :name="data.form.metadata.name" :operation="data.operation"></tag-dialog>
 </template>
 
 <style lang="scss" scoped>
+.footer {
+    width: 100%;
+    display: flex;
+    justify-content: center;
+}
 
+.opeartorTag {
+    width: 100%;
+    height: 40px;
+}
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/components/right-menu-item.vue b/ui/src/components/Database/Aside/components/RightMenu/components/right-menu-item.vue
index 383626e2..b9b1ed29 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/components/right-menu-item.vue
+++ b/ui/src/components/Database/Aside/components/RightMenu/components/right-menu-item.vue
@@ -22,21 +22,10 @@ defineProps({
     icon: String,
     name: String
 })
-let bdColor = 'white'
-let colorStr = 'var(--color-main-font)'
-function handleOver() {
-    bdColor = '#ecf5ff'
-    colorStr = 'var(--color-main)'
-}
-function handleLeave() {
-    bdColor = "white"
-    colorStr = "var(--color-main-font)"
-}
 </script>
 
 <template>
-    <div class="flex right-menu-item align-item-center pointer" @mouseover="handleOver" @mouseleave="handleLeave"
-        :style="{ backgroundColor: bdColor, color: colorStr}" @click="$emit('handleRightItem')">
+    <div class="flex right-menu-item align-item-center pointer" @click="$emit('handleRightItem')">
         <i :class="icon"></i>
         <el-icon>
             <Folder v-if="icon === 'el-icon-folder'" />
@@ -44,7 +33,9 @@ function handleLeave() {
             <RefreshRight v-if="icon === 'el-icon-refresh-right'" />
             <Delete v-if="icon === 'el-icon-delete'" />
         </el-icon>
-        <div style="width: 70%;" class="text-overflow-hidden margin-left-small">{{ name }}</div>
+        <div style="width: 70%;" class="text-overflow-hidden margin-left-small">
+            <span :title="name">{{ name }}</span>
+        </div>
     </div>
 </template>
 
@@ -52,12 +43,25 @@ function handleLeave() {
 .right-menu-item {
     padding: 3px 6px 3px 6px;
     width: calc(100% - 12px);
-    height: 40px;
+    line-height: 30px;
+    height: 30px;
     text-align: start;
+    background-color: white;
+    color: var(--color-main-font);
+
+    &:hover {
+        background-color: #ecf5ff;
+        color: var(--color-main);
+    }
 }
 
 i {
-    font-size: 25px;
-    color: var(--color-main);
+    font-size: 20px;
+    line-height: 30px;
+    height: 30px;
+
+    &:hover {
+        color: var(--color-main);
+    }
 }
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/components/Database/Aside/components/RightMenu/index.vue
index bf964e18..5bd9b9b5 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/components/Database/Aside/components/RightMenu/index.vue
@@ -19,8 +19,6 @@
 
 <script setup>
 import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
 defineProps({
     rightMenuList: Array
 })
@@ -29,10 +27,8 @@ defineProps({
 <template>
     <div style="width: 100%;" class="border-radius-little">
         <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
+            <right-menu-item @handleRightItem="$emit('handleRightItem', index)" :icon="item.icon" :name="item.name">
+            </right-menu-item>
         </div>
     </div>
 </template>
diff --git a/ui/src/components/Database/Aside/index.vue b/ui/src/components/Database/Aside/index.vue
index 38f3f69b..74201f17 100644
--- a/ui/src/components/Database/Aside/index.vue
+++ b/ui/src/components/Database/Aside/index.vue
@@ -505,27 +505,31 @@ $bus.on('handleRightItem', (index) => {
                 </el-sub-menu>
             </div>
         </el-menu>
-        <el-dialog title="Tips" v-model="data.dialogVisible" width="25%" center>
-            <span>Are you sure to delete this {{ data.rightClickType }}?</span>
-            <span slot="footer" class="dialog-footer">
+        <el-dialog title="Tips" v-model="data.dialogVisible" width="25%" center :show-close="false">
+            <div style="margin-bottom: 30px;">
+                <span :title="`Are you sure to delete this ${data.rightClickType}?`">Are you sure to delete this {{
+                        data.rightClickType
+                }}?</span>
+            </div>
+            <span slot="footer" class="dialog-footer footer">
                 <el-button @click="data.dialogVisible = false">cancel</el-button>
                 <el-button type="primary" @click="deleteGroupOrResources">delete</el-button>
             </span>
         </el-dialog>
-        <el-dialog width="25%" center :title="`${data.setGroup} group`" v-model="data.dialogGroupVisible">
+        <el-dialog width="25%" center :title="`${data.setGroup} group`" v-model="data.dialogGroupVisible" :show-close="false">
             <el-form ref="ruleForm" :rules="rules" :model="data.groupForm" label-position="left">
                 <el-form-item label="group name" label-width="120px" prop="name">
-                    <el-input :disabled="data.setGroup == 'edit'" v-model="data.groupForm.name" autocomplete="off"
-                        style="width: 300px;"></el-input>
+                    <el-input :disabled="data.setGroup == 'edit'" v-model="data.groupForm.name" autocomplete="off">
+                    </el-input>
                 </el-form-item>
                 <el-form-item label="group type" label-width="120px" prop="catalog">
-                    <el-select v-model="data.groupForm.catalog" style="width: 300px;" placeholder="please select">
+                    <el-select v-model="data.groupForm.catalog" placeholder="please select" style="width: 100%">
                         <el-option label="CATALOG_STREAM" value="CATALOG_STREAM"></el-option>
                         <el-option label="CATALOG_MEASURE" value="CATALOG_MEASURE"></el-option>
                     </el-select>
                 </el-form-item>
             </el-form>
-            <div slot="footer" class="dialog-footer">
+            <div slot="footer" class="dialog-footer footer">
                 <el-button @click="cancelCreateEditDialog">cancel</el-button>
                 <el-button type="primary" @click="confirmForm">{{ data.setGroup }}
                 </el-button>
@@ -545,6 +549,12 @@ $bus.on('handleRightItem', (index) => {
     text-justify: middle;
 }
 
+.footer {
+    width: 100%;
+    display: flex;
+    justify-content: center;
+}
+
 .right-menu {
     width: 130px;
     position: fixed;
diff --git a/ui/src/components/Database/Main/components/DataTable/index.vue b/ui/src/components/Database/Main/components/DataTable/index.vue
index 3f62a1b3..7d7f27a6 100644
--- a/ui/src/components/Database/Main/components/DataTable/index.vue
+++ b/ui/src/components/Database/Main/components/DataTable/index.vue
@@ -174,7 +174,7 @@ function getTable() {
  * sort table data
  */
 function sortChange(object) {
-    console.log(object);
+    
 }
 /**
  * set table tags, set navigation select
diff --git a/ui/src/components/Database/Main/components/DrawerRight/index.vue b/ui/src/components/Database/Main/components/DrawerRight/index.vue
index f3e6b5dc..8b27e77e 100644
--- a/ui/src/components/Database/Main/components/DrawerRight/index.vue
+++ b/ui/src/components/Database/Main/components/DrawerRight/index.vue
@@ -37,13 +37,10 @@ let data = reactive({
 })
 
 const tableData = computed(() => {
-    console.log('tableData')
     let tags = props.fileData.tagFamilies[data.tagFamily].tags
-    console.log(tags)
     let arr = tags.map((item) => {
         return { tags: item.name, type: item.type }
     })
-    console.log('arr', arr)
     return arr
 })
 watch(() => props.fileData, () => {
diff --git a/ui/src/components/Database/Main/components/SecondNavigation/index.vue b/ui/src/components/Database/Main/components/SecondNavigation/index.vue
index 89df03bd..9725d184 100644
--- a/ui/src/components/Database/Main/components/SecondNavigation/index.vue
+++ b/ui/src/components/Database/Main/components/SecondNavigation/index.vue
@@ -100,27 +100,28 @@ function openDesign() { }
 
 <template>
     <div class="flex second-nav-contain align-item-center justify-center">
-        <div style="width: 130px;">
-            <el-select v-model="data.tagFamily" @change="changeTagFamilies" filterable placeholder="Please select">
-                <el-option v-for="item in data.options" :key="item.value" :label="item.label" :value="item.value">
-                </el-option>
-            </el-select>
-        </div>
-
-        <div class="flex justify-between align-item-center" style="width: calc(100% - 130px);">
+        <div class="flex justify-between align-item-center" style="width: 100%;">
             <div class="flex align-item-center" style="width: 50%;">
+                <div class="flex justify-start align-item-center" style="width: 130px;">
+                    <el-select v-model="data.tagFamily" @change="changeTagFamilies" filterable
+                        placeholder="Please select">
+                        <el-option v-for="item in data.options" :key="item.value" :label="item.label"
+                            :value="item.value">
+                        </el-option>
+                    </el-select>
+                </div>
                 <div class="flex justify-start align-item-center set-margin-left" style="width: 270px;">
                     <el-date-picker v-model="value" type="datetimerange" :shortcuts="pickerOptions.shortcuts"
                         range-separator="to" start-placeholder="begin" end-placeholder="end" align="right" disabled>
                     </el-date-picker>
                 </div>
-                <div class="flex justify-start align-item-center set-margin-left" style="width: 270px;">
+                <!-- <div class="flex justify-start align-item-center set-margin-left" style="width: 270px;">
                     <el-input class="search-input" placeholder="Search by Tags" clearable v-model="query" disabled>
                         <template #append>
                             <el-button :icon="Search" />
                         </template>
                     </el-input>
-                </div>
+                </div> -->
             </div>
             <div class="flex align-item-center justify-end" style="width:50%;">
                 <div>
@@ -143,6 +144,7 @@ function openDesign() { }
 .set-margin-left {
     margin-left: 10px;
 }
+
 .nav-button {
     width: 100%;
     margin: 0;
diff --git a/ui/src/components/Database/Main/index.vue b/ui/src/components/Database/Main/index.vue
index c924cebb..ed78e452 100644
--- a/ui/src/components/Database/Main/index.vue
+++ b/ui/src/components/Database/Main/index.vue
@@ -65,7 +65,7 @@ function closeDetail() {
 </template>
 
 <style lang="scss">
-.el-card {
+/* .el-card {
     margin: 15px;
     padding: 0;
     height: 100%;
@@ -73,7 +73,7 @@ function closeDetail() {
 
 .el-card__body {
     padding: 0;
-}
+} */
 
 .drawer-right {
     -webkit-animation: rtl-drawer-in .3s 1ms;
diff --git a/ui/src/components2/Aside/index.vue b/ui/src/components2/Aside/index.vue
new file mode 100644
index 00000000..19e3814a
--- /dev/null
+++ b/ui/src/components2/Aside/index.vue
@@ -0,0 +1,586 @@
+<!--
+  ~ Licensed to Apache Software Foundation (ASF) under one or more contributor
+  ~ license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright
+  ~ ownership. Apache Software Foundation (ASF) licenses this file to you under
+  ~ the Apache License, Version 2.0 (the "License"); you may
+  ~ not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+-->
+
+<script setup>
+import RigheMenu from '@/components2/RightMenu/index.vue'
+import { getGroupList, getStreamOrMeasureList, deleteStreamOrMeasure, deleteGroup, createGroup, editGroup, createResources } from '@/api/index'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { getCurrentInstance } from "@vue/runtime-core"
+import { useRouter, useRoute } from 'vue-router'
+import { ref, reactive } from 'vue'
+
+const router = useRouter()
+const route = useRoute()
+const { proxy } = getCurrentInstance()
+const { ctx: that } = getCurrentInstance()
+
+// ref
+const ruleForm = ref()
+
+// Loading
+const $loadingCreate = getCurrentInstance().appContext.config.globalProperties.$loadingCreate
+const $loadingClose = proxy.$loadingClose
+
+// Data
+const data = reactive({
+    groupLists: [],
+    isShrink: false,
+    isCollapse: false,
+    // right menu
+    showRightMenu: false,
+    rightMenuList: [],
+    top: 0,
+    left: 0,
+    clickIndex: 0,
+    clickChildIndex: 0,
+    rightClickType: 'group',
+    // create/edit group
+    dialogGroupVisible: false,
+    setGroup: 'create',
+    groupForm: {
+        name: null,
+        catalog: 'CATALOG_STREAM'
+    },
+    activeMenu: ''
+})
+
+// menu config
+const groupMenu = [
+    {
+        icon: "el-icon-folder",
+        name: "new group",
+        id: "create Group"
+    }, {
+        icon: "el-icon-folder",
+        name: "edit group",
+        id: "edit Group"
+    }, {
+        icon: "el-icon-document",
+        name: "new resources",
+        id: "create resources"
+    }, {
+        icon: "el-icon-refresh-right",
+        name: "refresh",
+        id: "refresh Group"
+    }, {
+        icon: "el-icon-delete",
+        name: "delete",
+        id: "delete Group"
+    }
+]
+const resourceMenu = [
+    {
+        icon: "el-icon-document",
+        name: "edit resources",
+        id: "edit resources"
+    },
+    {
+        icon: "el-icon-delete",
+        name: "delete",
+        id: "delete resources"
+    }
+]
+const menuItemFunction = {
+    "new group": openCreateGroup,
+    "edit group": openEditGroup,
+    "new resources": openCreateResource,
+    "refresh": getGroupList,
+    "delete": openDeletaDialog,
+    "edit resources": openEditResource
+}
+
+// rules
+const rules = {
+    name: [
+        {
+            required: true, message: 'Please enter the name of the group', trigger: 'blur'
+        }
+    ],
+    catalog: [
+        {
+            required: true, message: 'Please select the type of the group', trigger: 'blur'
+        }
+    ]
+}
+
+// Eventbus
+const $bus = getCurrentInstance().appContext.config.globalProperties.mittBus
+
+// props data
+const props = defineProps({
+    type: {
+        type: String,
+        required: true,
+        default: ''
+    }
+})
+
+// emit event
+const emit = defineEmits(['setWidth'])
+
+// function
+// init data
+function getGroupLists() {
+    $loadingCreate()
+    getGroupList()
+        .then(res => {
+            if (res.status == 200) {
+                let group = res.data.group
+                let length = group.length
+                data.groupLists = group
+                deleteOtherGroup()
+                data.groupLists.forEach((item, index) => {
+                    let type = props.type
+                    let name = item.metadata.name
+                    getStreamOrMeasureList(type, name)
+                        .then(res => {
+                            if (res.status == 200) {
+                                item.children = res.data[type]
+                            }
+                        })
+                        .finally(() => {
+                            if (length - 1 == index) {
+                                $loadingClose()
+                            }
+                            that.$forceUpdate()
+                        })
+                })
+            }
+        })
+        .finally(() => {
+            $loadingClose()
+        })
+}
+function deleteOtherGroup() {
+    for (let i = 0; i < data.groupLists.length; i++) {
+        let type = data.groupLists[i].catalog == 'CATALOG_MEASURE' ? 'measure' : 'stream'
+        if (type !== props.type) {
+            data.groupLists.splice(i, 1)
+            i--
+        }
+    }
+}
+// to resources
+function openResources(index, childIndex) {
+    const group = data.groupLists[index].children[childIndex].metadata.group
+    const name = data.groupLists[index].children[childIndex].metadata.name
+    const route = {
+        name: props.type,
+        params: {
+            group: group,
+            name: name,
+            operator: 'read',
+            type: props.type
+        }
+    }
+    router.push(route)
+    const add = {
+        label: name,
+        type: 'Read',
+        route
+    }
+    data.activeMenu = `${group}-${name}`
+    $bus.emit('AddTabs', add)
+}
+// open or close Aide
+function shrinkMove(e) {
+    e.preventDefault()
+    if (data.isShrink) {
+        let wid = e.screenX + 5
+        if (wid <= 65) {
+            $bus.emit('changeIsCollapse', {
+                isCollapse: true,
+                width: '65px'
+            })
+        } else {
+            $bus.emit('changeIsCollapse', {
+                isCollapse: false,
+                width: `${wid > 450 ? 450 : wid}px`
+            })
+        }
+    }
+}
+function shrinkUp(e) {
+    e.stopPropagation()
+    data.isShrink = false
+    document.getElementById('app').onmousemove = null
+    document.getElementById('app').onmouseup = null
+    document.getElementById('app').onmouseleave = null
+    document.getElementById('app').ondragover = null
+}
+function shrinkDown(e) {
+    data.isShrink = true
+    document.getElementById('app').onmousemove = shrinkMove
+    document.getElementById('app').onmouseup = shrinkUp
+    document.getElementById('app').onmouseleave = shrinkUp
+    document.getElementById('app').ondragover = shrinkUp
+    e.preventDefault()
+}
+// right click menu
+function rightClickGroup(e, index) {
+    data.rightMenuList = groupMenu
+    data.clickIndex = index
+    data.rightClickType = 'group'
+    openRightMenu(e)
+}
+function rightClickResources(e, index, childIndex) {
+    data.rightMenuList = resourceMenu
+    data.clickIndex = index
+    data.clickChildIndex = childIndex
+    data.rightClickType = 'resources'
+    openRightMenu(e)
+}
+function openRightMenu(e) {
+    data.showRightMenu = true
+    data.top = e.pageY
+    data.left = e.pageX
+    document.getElementById('app').onclick = closeRightMenu
+    stopPropagation()
+}
+function closeRightMenu() {
+    data.showRightMenu = false
+    document.getElementById('app').onclick = null
+    stopPropagation()
+}
+function handleRightItem(index) {
+    const name = data.rightMenuList[index].name
+    return menuItemFunction[name]()
+}
+function stopPropagation(e) {
+    e = e || window.event;
+    if (e.stopPropagation) {
+        e.stopPropagation();
+    } else {
+        e.cancelBubble = true;
+    }
+}
+
+// CRUD operator
+function openCreateGroup() {
+    data.setGroup = 'create'
+    data.dialogGroupVisible = true
+}
+function openEditGroup() {
+    data.groupForm.name = data.groupLists[data.clickIndex].metadata.name
+    data.groupForm.catalog = data.groupLists[data.clickIndex].catalog
+    data.dialogGroupVisible = true
+    data.setGroup = 'edit'
+}
+function openCreateResource() {
+    const route = {
+        name: `create-${props.type}`,
+        params: {
+            operator: 'create',
+            group: data.groupLists[data.clickIndex].metadata.name,
+            name: '',
+            type: props.type
+        }
+    }
+    router.push(route)
+    const add = {
+        label: data.groupLists[data.clickIndex].metadata.name,
+        type: 'Create',
+        route
+    }
+    data.activeMenu = ''
+    $bus.emit('AddTabs', add)
+}
+function openEditResource() {
+    const route = {
+        name: `edit-${props.type}`,
+        params: {
+            operator: 'edit',
+            group: data.groupLists[data.clickIndex].metadata.name,
+            name: data.groupLists[data.clickIndex].children[data.clickChildIndex].metadata.name,
+            type: props.type
+        }
+    }
+    router.push(route)
+    const add = {
+        label: data.groupLists[data.clickIndex].children[data.clickChildIndex].metadata.name,
+        type: 'Edit',
+        route
+    }
+    $bus.emit('AddTabs', add)
+}
+function openDeletaDialog() {
+    ElMessageBox.confirm('Are you sure to delete this resource?')
+        .then(() => {
+            let group = data.groupLists[data.clickIndex].metadata.name
+            if (data.rightClickType == 'group') {
+                return deleteGroupFunction(group)
+            }
+            return deleteResource(group)
+        })
+        .catch(() => {
+            // catch error
+        })
+}
+function deleteGroupFunction(group) {
+    // delete group
+    $loadingCreate()
+    deleteGroup(group)
+        .then((res) => {
+            if (res.status == 200) {
+                if (res.data.deleted) {
+                    ElMessage({
+                        message: 'Delete succeeded',
+                        type: "success",
+                        duration: 5000
+                    })
+                    getGroupLists()
+                }
+                $bus.emit('deleteGroup', data.groupLists[data.clickIndex].metadata.name)
+            }
+        })
+        .finally(() => {
+            $loadingClose()
+        })
+}
+function deleteResource(group) {
+    let name = data.groupLists[data.clickIndex].children[data.clickChildIndex].metadata.name
+    // delete Resources
+    $loadingCreate()
+    deleteStreamOrMeasure(props.type, group, name)
+        .then((res) => {
+            if (res.status == 200) {
+                if (res.data.deleted) {
+                    ElMessage({
+                        message: 'Delete succeeded',
+                        type: "success",
+                        duration: 5000
+                    })
+                    getGroupLists()
+                }
+                $bus.emit('deleteResource', name)
+            }
+        })
+        .finally(() => {
+            $loadingClose()
+        })
+}
+
+// create/edit group
+function confirmForm() {
+    data.setGroup == 'create' ? createGroupFunction() : editGroupFunction()
+}
+function createGroupFunction() {
+    ruleForm.value.validate((valid) => {
+        if (valid) {
+            let dataList = {
+                group: {
+                    metadata: {
+                        group: "",
+                        name: data.groupForm.name
+                    },
+                    catalog: data.groupForm.catalog
+                }
+            }
+            $loadingCreate()
+            createGroup(dataList)
+                .then((res) => {
+                    if (res.status == 200) {
+                        getGroupLists()
+                        ElMessage({
+                            message: 'Created successfully',
+                            type: "success",
+                            duration: 3000
+                        })
+                    }
+                })
+                .finally(() => {
+                    data.dialogGroupVisible = false
+                    $loadingClose()
+                })
+        }
+    })
+}
+function editGroupFunction() {
+    let name = data.groupLists[data.clickIndex].metadata.name
+    ruleForm.value.validate((valid) => {
+        if (valid) {
+            let dataList = {
+                group: {
+                    metadata: {
+                        group: "",
+                        name: data.groupForm.name
+                    },
+                    catalog: data.groupForm.catalog
+                }
+            }
+            $loadingCreate()
+            editGroup(name, dataList)
+                .then((res) => {
+                    if (res.status == 200) {
+                        getGroupLists()
+                        ElMessage({
+                            message: 'Update succeeded',
+                            type: "success",
+                            duration: 3000
+                        })
+                    }
+                })
+                .finally(() => {
+                    data.dialogGroupVisible = false
+                    $loadingClose()
+                })
+        }
+    })
+}
+function cancelCreateEditDialog() {
+    clearGroupForm()
+    data.dialogGroupVisible = false
+}
+// init form data
+function clearGroupForm() {
+    data.groupForm = {
+        name: null,
+        catalog: 'CATALOG_STREAM'
+    }
+}
+function initActiveMenu() {
+    const group = route.params.group
+    const name = route.params.name
+    if (group && name) {
+
+        data.activeMenu = `${group}-${name}`
+    }
+}
+// Eventbus, change isCollapse
+$bus.on('changeIsCollapse', (obj) => {
+    data.isCollapse = obj.isCollapse
+    emit('setWidth', obj.width)
+})
+$bus.on('changeAside', (obj) => {
+    data.activeMenu = `${obj.group}-${obj.name}`
+})
+$bus.on('resetAside', () => {
+    data.activeMenu = ''
+    router.push({
+        name: `${props.type}Start`
+    })
+})
+
+getGroupLists()
+initActiveMenu()
+
+
+</script>
+
+<template>
+    <div class="size flex" v-if="data.groupLists.length > 0">
+        <el-menu :collapse="data.isCollapse" :default-active="data.activeMenu">
+            <div v-for="(item, index) in data.groupLists" :key="item.metadata.name"
+                @contextmenu.prevent="rightClickGroup($event, index)">
+                <el-sub-menu :index="`${item.metadata.name}-${index}`">
+                    <template #title>
+                        <el-icon>
+                            <Folder />
+                        </el-icon>
+                        <span slot="title" :title="item.metadata.name" style="width: 70%" class="text-overflow-hidden">
+                            {{ item.metadata.name }}
+                        </span>
+                    </template>
+                    <div v-for="(child, childIndex) in item.children" :key="child.metadata.name">
+                        <div @contextmenu.prevent="rightClickResources($event, index, childIndex)">
+                            <el-menu-item :index="`${child.metadata.group}-${child.metadata.name}`"
+                                @click="openResources(index, childIndex)">
+                                <template #title>
+                                    <el-icon>
+                                        <Document />
+                                    </el-icon>
+                                    <span slot="title" :title="child.metadata.name" style="width: 90%"
+                                        class="text-overflow-hidden">
+                                        {{ child.metadata.name }}
+                                    </span>
+                                </template>
+                            </el-menu-item>
+                        </div>
+                    </div>
+                </el-sub-menu>
+            </div>
+        </el-menu>
+        <div class="resize" @mousedown="shrinkDown" title="Shrink sidebar"></div>
+    </div>
+    <div class="flex center add" @click="openCreateGroup" style="height: 50px; width: 100%;"
+        v-if="data.groupLists.length == 0">
+        <el-icon>
+            <Plus />
+        </el-icon>
+    </div>
+    <el-dialog width="25%" center :title="`${data.setGroup} group`" v-model="data.dialogGroupVisible"
+        :show-close="false">
+        <el-form ref="ruleForm" :rules="rules" :model="data.groupForm" label-position="left">
+            <el-form-item label="group name" label-width="120px" prop="name">
+                <el-input :disabled="data.setGroup == 'edit'" v-model="data.groupForm.name" autocomplete="off">
+                </el-input>
+            </el-form-item>
+            <el-form-item label="group type" label-width="120px" prop="catalog">
+                <el-select v-model="data.groupForm.catalog" placeholder="please select" style="width: 100%">
+                    <el-option label="CATALOG_STREAM" value="CATALOG_STREAM"></el-option>
+                    <el-option label="CATALOG_MEASURE" value="CATALOG_MEASURE"></el-option>
+                </el-select>
+            </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer footer">
+            <el-button @click="cancelCreateEditDialog">cancel</el-button>
+            <el-button type="primary" @click="confirmForm">{{ data.setGroup }}
+            </el-button>
+        </div>
+    </el-dialog>
+    <div v-if="data.showRightMenu" class="right-menu box-shadow"
+        :style="{ top: `${data.top}px`, left: `${data.left}px` }">
+        <RigheMenu @handleRightItem="handleRightItem" :rightMenuList="data.rightMenuList">
+        </RigheMenu>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+.el-menu {
+    width: 100%;
+    border-right: none;
+    text-align: start;
+    text-justify: middle;
+}
+
+.resize {
+    cursor: col-resize;
+    position: absolute;
+    right: 0;
+    height: 100%;
+    width: 5px;
+}
+
+.right-menu {
+    width: 170px;
+    position: fixed;
+    z-index: 9999999999999999999999999999 !important;
+    background-color: white;
+}
+
+.footer {
+    width: 100%;
+    display: flex;
+    justify-content: center;
+}
+
+.add {
+    cursor: pointer;
+}
+</style>
\ No newline at end of file
diff --git a/ui/src/components2/CodeMirror/index.vue b/ui/src/components2/CodeMirror/index.vue
new file mode 100644
index 00000000..d7694897
--- /dev/null
+++ b/ui/src/components2/CodeMirror/index.vue
@@ -0,0 +1,164 @@
+<!--
+  ~ Licensed to Apache Software Foundation (ASF) under one or more contributor
+  ~ license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright
+  ~ ownership. Apache Software Foundation (ASF) licenses this file to you under
+  ~ the Apache License, Version 2.0 (the "License"); you may
+  ~ not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+-->
+
+<template>
+  <div class="in-coder-panel">
+    <textarea ref="textarea" v-model="code"></textarea>
+  </div>
+</template>
+
+<script>
+import { onMounted, ref, watch } from 'vue'
+import CodeMirror from 'codemirror'
+import 'codemirror/lib/codemirror.css'
+import 'codemirror/mode/javascript/javascript.js'
+import 'codemirror/mode/yaml/yaml.js'
+import 'codemirror/mode/css/css.js'
+import 'codemirror/addon/lint/yaml-lint.js'
+import jsYaml from 'js-yaml'
+window.jsyaml = jsYaml
+export default {
+  components: {},
+  props: {
+    modelValue: {
+      type: String,
+      default: ``
+    },
+    mode: {
+      type: String,
+      default: 'javascript'
+    },
+    lint: {
+      // codemirror仅支持html、css、json、javascript、yaml这几种,请手动引入,且需要下载相关插件,具体插件参考源码(node_modules/codemirror/addon/lint/)或官方文档
+      type: Boolean,
+      default: false
+    },
+    readonly: {
+      type: Boolean,
+      default: false
+    },
+    // 主题
+    theme: {
+      type: String,
+      default: 'base16-dark' // 编辑器主题色
+    },
+    // 高亮选中行
+    styleActiveLine: {
+      type: Boolean,
+      default: true
+    },
+    // 自动刷新
+    autoRefresh: {
+      type: Boolean,
+      default: true
+    }
+  },
+  emits: ['update:modelValue'],
+  setup(props, { emit }) {
+    const textarea = ref(null)
+    const code = ref(props.modelValue)
+    // 编辑器实例
+    let coder
+    watch(
+      () => props.modelValue,
+      val => {
+        coder?.setValue(val)
+      }
+    )
+    const options = {
+      mode: props.mode,
+      // 缩进格式
+      tabSize: 2,
+      // 主题,对应主题库 JS 需要提前引入
+      theme: props.theme,
+      // 行号码
+      lineNumbers: true,
+      line: true,
+      // extraKeys: {'Ctrl': 'autocomplete'},//自定义快捷键
+      readOnly: props.readonly,
+      lint: props.lint,
+      gutters: ['CodeMirror-lint-markers'],
+      // 光标背景行高亮
+      styleActiveLine: props.styleActiveLine,
+      // 自动刷新
+      autoRefresh: props.autoRefresh,
+      height: '500px'
+    }
+    const initialize = async () => {
+      try {
+      // 动态引入相关依赖
+        await import(`codemirror/theme/${props.theme}.css`)
+        if (props.lint) {
+          await import('codemirror/addon/lint/lint.js')
+          await import('codemirror/addon/lint/lint.css')
+        }
+        if (props.mode) {
+          await import(`codemirror/mode/${props.mode}/${props.mode}.js`)
+        }
+        if (props.autoRefresh) {
+          await import('codemirror/addon/display/autorefresh')
+        }
+        if (props.styleActiveLine) {
+          await import('codemirror/addon/selection/active-line')
+        }
+      } catch (e) {
+      }
+      // 初始化编辑器实例,传入需要被实例化的文本域对象和默认配置
+      coder = CodeMirror.fromTextArea(textarea.value, options)
+      coder.on('blur', coder => {
+        const newValue = coder.getValue()
+        emit('update:modelValue', newValue)
+      })
+    }
+    onMounted(() => {
+      initialize()
+    })
+    const checkYaml = async val => {
+      jsYaml.load(val)
+    }
+    return {
+      code,
+      options,
+      textarea,
+      checkYaml
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.in-coder-panel {
+  width: 100%;
+  height: 100%;
+  :deep(.CodeMirror) {
+    border: 1px solid #eee;
+    height: 100%;
+    width: 100%;
+    .CodeMirror-code {
+      line-height: 19px;
+    }
+  }
+}
+</style>
+<style>
+.CodeMirror-lint-tooltip {
+  z-index: 10000 !important;
+}
+</style>
+
diff --git a/ui/src/components2/Header/components/header.vue b/ui/src/components2/Header/components/header.vue
new file mode 100644
index 00000000..647c995f
--- /dev/null
+++ b/ui/src/components2/Header/components/header.vue
@@ -0,0 +1,167 @@
+<!--
+  ~ Licensed to Apache Software Foundation (ASF) under one or more contributor
+  ~ license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright
+  ~ ownership. Apache Software Foundation (ASF) licenses this file to you under
+  ~ the Apache License, Version 2.0 (the "License"); you may
+  ~ not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+-->
+
+<script setup>
+import { reactive } from "vue";
+import { ElImage, ElTooltip, ElMenu, ElMenuItem } from 'element-plus'
+import { useRoute } from 'vue-router'
+import { watch, getCurrentInstance } from '@vue/runtime-core'
+
+// Eventbus
+const $bus = getCurrentInstance().appContext.config.globalProperties.mittBus
+
+// router
+const route = useRoute()
+
+// data
+const data = reactive({
+    activeMenu: '/banyandb/dashboard',
+    isCollapse: false,
+    showButton: false
+})
+const userImg = 'http://localhost:5173/src/assets/banyandb_small.jpg'
+
+// watch
+watch(() => route, () => {
+    let arr = route.path.split('/')
+    data.activeMenu = `/${arr[1]}/${arr[2]}`
+}, {
+    immediate: true,
+    deep: true
+})
+watch(() => data.activeMenu, () => {
+    data.showButton = data.activeMenu == '/banyandb/stream' || data.activeMenu == '/banyandb/measure' ? true : false
+}, {
+    immediate: true,
+    deep: true
+})
+
+// function
+function initData() {
+    let arr = route.path.split('/')
+    data.activeMenu = `/${arr[1]}/${arr[2]}`
+}
+function changeAsideWidth() {
+    if (data.isCollapse) {
+        $bus.emit('changeIsCollapse', {
+            isCollapse: false,
+            width: '200px'
+        })
+    } else {
+        $bus.emit('changeIsCollapse', {
+            isCollapse: true,
+            width: '65px'
+        })
+    }
+}
+$bus.on('changeIsCollapse', (obj) => {
+    data.isCollapse = obj.isCollapse
+})
+initData()
+</script>
+
+<template>
+    <div class="size flex align-item-center justify-between bd-bottom">
+        <div class="image flex align-item-center justify-between">
+            <el-image :src="userImg" class="flex center" fit="fill">
+                <div slot="error" class="image-slot">
+                    <i class="el-icon-picture-outline"></i>
+                </div>
+            </el-image>
+            <div class="title text-main-color text-title text-family text-weight-lt">BanyanDB Manager</div>
+            <!-- open aside menu -->
+            <div class="flex center pointer icon-size" v-if="data.showButton" @click="changeAsideWidth">
+                <el-tooltip class="item" effect="dark" :content="!data.isCollapse ? 'Collapse menu' : 'Expand menu'"
+                    placement="bottom">
+                    <el-icon v-if="!data.isCollapse" class="icon">
+                        <Fold />
+                    </el-icon>
+                    <el-icon class="icon" v-else>
+                        <Expand />
+                    </el-icon>
+                </el-tooltip>
+            </div>
+            <div v-else class="icon-size"></div>
+            <!-- stream/measure sources url -->
+            <div style="width:380px;" class="margin-left-small"></div>
+        </div>
+        <div class="navigation" style="margin-right: 20%">
+            <el-menu active-text-color="#6E38F7" router :ellipsis="false" class="el-menu-demo" mode="horizontal"
+                :default-active="data.activeMenu" @select="handleSelect">
+                <el-menu-item index="/banyandb/dashboard">Dashboard</el-menu-item>
+                <el-menu-item index="/banyandb/stream">Stream</el-menu-item>
+                <el-menu-item index="/banyandb/measure">Measure</el-menu-item>
+                <el-menu-item index="/banyandb/property">Property</el-menu-item>
+            </el-menu>
+        </div>
+        <div class="person flex justify-around align-item-center">
+            <el-icon class="icon pointer">
+                <Message />
+            </el-icon>
+            <el-icon class="icon pointer">
+                <Avatar />
+            </el-icon>
+            <div class="text-normal text-main-color text-family text-weight-lt text-title">Admin</div>
+        </div>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+.image {
+    width: 665px;
+    height: 100%;
+
+    .el-image {
+        width: 59px;
+        height: 59px;
+    }
+
+    .title {
+        height: 100%;
+        line-height: 59px;
+    }
+}
+
+.el-menu-item {
+    font-weight: var(--weight-lt);
+    font-size: var(--size-lt);
+    font-family: var(--font-family-main);
+}
+
+.el-menu-item:hover {
+    color: var(--el-menu-active-color) !important;
+}
+
+.navigation {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.person {
+    width: 140px;
+    height: 100%;
+    margin-right: 30px;
+}
+
+.icon-size {
+    width: 25px;
+    height: 25px;
+}
+</style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/components2/Header/index.vue
similarity index 60%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/components2/Header/index.vue
index bf964e18..c736a500 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/components2/Header/index.vue
@@ -18,25 +18,40 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
-})
+import Header from './components/header.vue'
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
+    <div class="size">
+        <el-container>
+            <el-header>
+                <Header class="size"></Header>
+            </el-header>
+            <el-main>
+                <RouterView></RouterView>
+            </el-main>
+        </el-container>
     </div>
 </template>
 
+
+
 <style lang="scss" scoped>
+.el-container {
+  height: 100%;
+  padding: 0;
+  margin: 0;
 
+  .el-header {
+    background-color: #ffffff;
+    padding: 0;
+    margin: 0;
+  }
+
+  .el-main {
+    background-color: #eaedf1;
+    padding: 0;
+    margin: 0;
+  }
+}
 </style>
\ No newline at end of file
diff --git a/ui/src/components2/Read/index.vue b/ui/src/components2/Read/index.vue
new file mode 100644
index 00000000..0140037e
--- /dev/null
+++ b/ui/src/components2/Read/index.vue
@@ -0,0 +1,283 @@
+<!--
+  ~ Licensed to Apache Software Foundation (ASF) under one or more contributor
+  ~ license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright
+  ~ ownership. Apache Software Foundation (ASF) licenses this file to you under
+  ~ the Apache License, Version 2.0 (the "License"); you may
+  ~ not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+-->
+
+<script setup>
+import { reactive, ref } from 'vue';
+import { useRoute } from 'vue-router'
+import { watch, getCurrentInstance } from '@vue/runtime-core'
+import { getStreamOrMeasure, getTableList } from '@/api/index'
+import { Search, RefreshRight } from '@element-plus/icons-vue'
+/* import CodeMirror from '@/components2/CodeMirror/index.vue' */
+
+const route = useRoute()
+
+/* const yamlRef = ref() */
+
+// Loading
+const { proxy } = getCurrentInstance()
+const $loadingCreate = getCurrentInstance().appContext.config.globalProperties.$loadingCreate
+const $loadingClose = proxy.$loadingClose
+const tagType = {
+    'TAG_TYPE_UNSPECIFIED': 'null',
+    'TAG_TYPE_STRING': 'str',
+    'TAG_TYPE_INT': 'int',
+    'TAG_TYPE_STRING_ARRAY': 'strArray',
+    'TAG_TYPE_INT_ARRAY': 'intArray',
+    'TAG_TYPE_DATA_BINARY': 'binaryData',
+    'TAG_TYPE_ID': 'id'
+}
+const shortcuts = [
+    {
+        text: 'Last week',
+        value: () => {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+            return [start, end]
+        },
+    },
+    {
+        text: 'Last month',
+        value: () => {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
+            return [start, end]
+        },
+    },
+    {
+        text: 'Last 3 months',
+        value: () => {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
+            return [start, end]
+        },
+    },
+]
+const param = {
+    metadata: {
+        group: '',
+        name: '',
+        createRevision: '',
+        modRevision: '',
+        id: ''
+    },
+    offset: null,
+    limit: null,
+    //criteria: {},
+    projection: {
+        tagFamilies: [
+            {
+                name: '',
+                tags: []
+            }
+        ]
+    }
+}
+const data = reactive({
+    group: route.params.group,
+    name: route.params.group,
+    type: route.params.type,
+    tagFamily: 0,
+    tagFamilies: [],
+    options: [],
+    resourceData: null,
+    timeValue: null,
+    loading: false,
+    total: 100,
+    queryInfo: {
+        pagenum: 1,
+        pagesize: 100
+    },
+    tableTags: [],
+    tableData: [],
+    /* code: ref(`apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+  annotations:
+    deprecated.daemonset.template.generation: "1"
+    field.cattle.io/creatorId: user-jsgrs
+  creationTimestamp: "2022-05-16T03:08:58Z"
+  generation: 1
+  labels:
+    cattle.io/creator: norman
+    workload.user.cattle.io/workloadselector: daemonSet-default-asdf`) */
+})
+
+watch(() => route, () => {
+    data.group = route.params.group
+    data.name = route.params.name
+    data.type = route.params.type
+    if(data.group && data.name && data.type) {
+        initData()
+    }
+}, {
+    immediate: true,
+    deep: true
+})
+
+function initData() {
+    $loadingCreate()
+    getStreamOrMeasure(data.type, data.group, data.name)
+        .then(res => {
+            if (res.status == 200) {
+                data.resourceData = res.data[data.type]
+                data.tableTags = res.data[data.type].tagFamilies[0].tags
+                data.options = res.data[data.type].tagFamilies.map((item, index) => {
+                    return { label: item.name, value: index }
+                })
+                data.tagFamily = 0
+                getTableData()
+            }
+        })
+        .finally(() => {
+            $loadingClose()
+        })
+}
+function getTableData() {
+    data.tableData = []
+    data.loading = true
+    setTableParam()
+    let paramList = param
+    paramList.offset = data.queryInfo.pagenum
+    paramList.limit = data.queryInfo.pagesize
+    paramList.metadata = data.resourceData.metadata
+    getTableList(paramList)
+        .then((res) => {
+            if (res.status == 200) {
+                setTableData(res.data.elements)
+            }
+        })
+        .catch(() => {
+            data.loading = false
+        })
+}
+function setTableData(elements) {
+    const tags = data.resourceData.tagFamilies[data.tagFamily].tags
+    data.tableData = elements.map(item => {
+        let dataItem = {}
+        item.tagFamilies[0].tags.forEach(tag => {
+            const index = tags.findIndex(item => item.name == tag.key)
+            const type = tags[index].type
+            if(tag.value[tagType[type]] == null) {
+                return dataItem[tag.key] = 'Null'
+            }
+            dataItem[tag.key] = Object.hasOwnProperty.call(tag.value[tagType[type]], 'value') ? tag.value[tagType[type]].value : tag.value[tagType[type]]
+        })
+        return dataItem
+    })
+    data.loading = false
+}
+function setTableParam() {
+    let tagFamily = data.resourceData.tagFamilies[data.tagFamily]
+    let tagsList = []
+    tagFamily.tags.forEach((item) => {
+        tagsList.push(item.name)
+    })
+    param.projection.tagFamilies[0].name = tagFamily.name
+    param.projection.tagFamilies[0].tags = tagsList
+    //param.criteria[0].tagFamilyName = tagFamily.name
+}
+function changeTagFamilies() {
+    data.tableTags = data.resourceData.tagFamilies[data.tagFamily].tags
+    getTableData()
+}
+/* function btnClick() {
+    yamlRef.value.checkYaml(code).then(() => {
+        
+    })
+} */
+</script>
+
+<template>
+    <div>
+        <el-card shadow="always">
+            <template #header>
+                <div class="flex">
+                    <span class="text-bold">Group:</span>
+                    <span style="margin-right: 20px;">{{ data.group }}</span>
+                    <span class="text-bold">Name:</span>
+                    <span style="margin-right: 20px;">{{ data.name }}</span>
+                    <span class="text-bold">Operator:</span>
+                    <span>Read</span>
+                </div>
+            </template>
+            <el-row>
+                <el-col :span="12">
+                    <div class="flex align-item-center" style="height: 30px; width: 100%;">
+                        <el-form :inline="true" style="height: 30px;">
+                            <el-form-item label="Tag Family">
+                                <el-select v-model="data.tagFamily" @change="changeTagFamilies" filterable
+                                    placeholder="Please select">
+                                    <el-option v-for="item in data.options" :key="item.value" :label="item.label"
+                                        :value="item.value">
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item label="Time Select">
+                                <el-date-picker v-model="data.timeValue" type="datetimerange" :shortcuts="shortcuts"
+                                    range-separator="to" start-placeholder="begin" end-placeholder="end" align="right">
+                                </el-date-picker>
+                            </el-form-item>
+                            <el-form-item>
+                                <el-button size="small" :icon="Search" color="#6E38F7" plain></el-button>
+                            </el-form-item>
+                        </el-form>
+                    </div>
+                </el-col>
+                <el-col :span="12">
+                    <div class="flex align-item-center justify-end" style="height: 30px;">
+                        <el-button size="small" :icon="RefreshRight" @click="getTableData" plain></el-button>
+                    </div>
+                </el-col>
+            </el-row>
+            <!--  <CodeMirror ref="yamlRef" v-model="data.code" mode="yaml" style="height: 200px" :lint="true"
+                :readonly="true">
+            </CodeMirror> -->
+        </el-card>
+        <el-card shadow="always">
+            <el-table v-loading="data.loading" element-loading-text="loading" element-loading-spinner="el-icon-loading"
+                element-loading-background="rgba(0, 0, 0, 0.8)" ref="multipleTable"  stripe border
+                highlight-current-row tooltip-effect="dark" empty-text="No data yet"
+                @selection-change="handleSelectionChange" :data="data.tableData">
+                <el-table-column type="selection" width="55">
+                </el-table-column>
+                <el-table-column type="index" label="number" width="90">
+                </el-table-column>
+                <el-table-column v-for="item in data.tableTags" sortable :sort-change="sortChange" :key="item.name"
+                    :label="item.name" :prop="item.name" show-overflow-tooltip>
+                </el-table-column>
+            </el-table>
+            <el-pagination v-if="data.tableData.length > 0" class="margin-top-bottom" @size-change="handleSizeChange"
+                @current-change="handleCurrentChange" :current-page="data.queryInfo.pagenum"
+                :page-sizes="[6, 12, 18, 24]" :page-size="data.queryInfo.pagesize"
+                layout="total, sizes, prev, pager, next, jumper" :total="data.total">
+            </el-pagination>
+        </el-card>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+::v-deep {
+    .el-card {
+        margin: 15px;
+    }
+}
+</style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/components/right-menu-item.vue b/ui/src/components2/RightMenu/components/right-menu-item.vue
similarity index 75%
copy from ui/src/components/Database/Aside/components/RightMenu/components/right-menu-item.vue
copy to ui/src/components2/RightMenu/components/right-menu-item.vue
index 383626e2..b9b1ed29 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/components/right-menu-item.vue
+++ b/ui/src/components2/RightMenu/components/right-menu-item.vue
@@ -22,21 +22,10 @@ defineProps({
     icon: String,
     name: String
 })
-let bdColor = 'white'
-let colorStr = 'var(--color-main-font)'
-function handleOver() {
-    bdColor = '#ecf5ff'
-    colorStr = 'var(--color-main)'
-}
-function handleLeave() {
-    bdColor = "white"
-    colorStr = "var(--color-main-font)"
-}
 </script>
 
 <template>
-    <div class="flex right-menu-item align-item-center pointer" @mouseover="handleOver" @mouseleave="handleLeave"
-        :style="{ backgroundColor: bdColor, color: colorStr}" @click="$emit('handleRightItem')">
+    <div class="flex right-menu-item align-item-center pointer" @click="$emit('handleRightItem')">
         <i :class="icon"></i>
         <el-icon>
             <Folder v-if="icon === 'el-icon-folder'" />
@@ -44,7 +33,9 @@ function handleLeave() {
             <RefreshRight v-if="icon === 'el-icon-refresh-right'" />
             <Delete v-if="icon === 'el-icon-delete'" />
         </el-icon>
-        <div style="width: 70%;" class="text-overflow-hidden margin-left-small">{{ name }}</div>
+        <div style="width: 70%;" class="text-overflow-hidden margin-left-small">
+            <span :title="name">{{ name }}</span>
+        </div>
     </div>
 </template>
 
@@ -52,12 +43,25 @@ function handleLeave() {
 .right-menu-item {
     padding: 3px 6px 3px 6px;
     width: calc(100% - 12px);
-    height: 40px;
+    line-height: 30px;
+    height: 30px;
     text-align: start;
+    background-color: white;
+    color: var(--color-main-font);
+
+    &:hover {
+        background-color: #ecf5ff;
+        color: var(--color-main);
+    }
 }
 
 i {
-    font-size: 25px;
-    color: var(--color-main);
+    font-size: 20px;
+    line-height: 30px;
+    height: 30px;
+
+    &:hover {
+        color: var(--color-main);
+    }
 }
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/components2/RightMenu/index.vue
similarity index 77%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/components2/RightMenu/index.vue
index bf964e18..5bd9b9b5 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/components2/RightMenu/index.vue
@@ -19,8 +19,6 @@
 
 <script setup>
 import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
 defineProps({
     rightMenuList: Array
 })
@@ -29,10 +27,8 @@ defineProps({
 <template>
     <div style="width: 100%;" class="border-radius-little">
         <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
+            <right-menu-item @handleRightItem="$emit('handleRightItem', index)" :icon="item.icon" :name="item.name">
+            </right-menu-item>
         </div>
     </div>
 </template>
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/components2/Start/index.vue
similarity index 60%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/components2/Start/index.vue
index bf964e18..bb410498 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/components2/Start/index.vue
@@ -18,22 +18,24 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
+import { reactive } from 'vue';
+import { useRoute } from 'vue-router'
+const route = useRoute()
+const data = reactive({
+    type: ''
 })
+
+// function
+function initData() {
+    data.type = route.meta.type
+}
+initData()
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
+    <div class="size flex center column">
+        <div class="text-big text-placeholder-color text-family margin-top-bottom">Welcome to BanyanDB Manager!</div>
+        <div class="text-title text-placeholder-color text-famil">Please open the {{ data.type }} to start working!</div>
     </div>
 </template>
 
diff --git a/ui/src/components2/StreamEditor/index.vue b/ui/src/components2/StreamEditor/index.vue
new file mode 100644
index 00000000..b750520e
--- /dev/null
+++ b/ui/src/components2/StreamEditor/index.vue
@@ -0,0 +1,87 @@
+<!--
+  ~ Licensed to Apache Software Foundation (ASF) under one or more contributor
+  ~ license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright
+  ~ ownership. Apache Software Foundation (ASF) licenses this file to you under
+  ~ the Apache License, Version 2.0 (the "License"); you may
+  ~ not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+-->
+
+<script setup>
+import { watch, getCurrentInstance } from '@vue/runtime-core'
+import { reactive } from 'vue';
+import { useRoute } from 'vue-router'
+const route = useRoute()
+
+const data = reactive({
+    group: route.params.group,
+    name: route.params.group,
+    type: route.params.type,
+    operator: route.params.operator
+})
+
+watch(() => route, () => {
+    data.group = route.params.group
+    data.name = route.params.name
+    data.type = route.params.type
+    data.operator = route.params.operator
+    initData()
+}, {
+    immediate: true,
+    deep: true
+})
+
+function initData() {
+
+}
+</script>
+
+<template>
+    <div>
+        <el-card shadow="always">
+            <template #header>
+                <el-row>
+                    <el-col :span="12">
+                        <div class="flex align-item-center" style="height: 30px; width: 100%;">
+                            <div class="flex" style="height: 30px;">
+                                <span class="text-bold">Type:</span>
+                                <span style="margin-right: 20px;">{{ data.type }}</span>
+                                <span class="text-bold">Group:</span>
+                                <span style="margin-right: 20px;">{{ data.group }}</span>
+                                <span class="text-bold" v-if="data.name">Name:</span>
+                                <span style="margin-right: 20px;" v-if="data.name">{{ data.name }}</span>
+                                <span class="text-bold">Operator:</span>
+                                <span>{{ data.operator }}</span>
+                            </div>
+                        </div>
+                    </el-col>
+                    <el-col :span="12">
+                        <div class="flex align-item-center justify-end" style="height: 30px;">
+                            <el-button size="small" type="primary" color="#6E38F7" >submit</el-button>
+                        </div>
+                    </el-col>
+                </el-row>
+
+            </template>
+
+        </el-card>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+::v-deep {
+    .el-card {
+        margin: 15px;
+    }
+}
+</style>
\ No newline at end of file
diff --git a/ui/src/components2/TopNav/index.vue b/ui/src/components2/TopNav/index.vue
new file mode 100644
index 00000000..7ad109e4
--- /dev/null
+++ b/ui/src/components2/TopNav/index.vue
@@ -0,0 +1,161 @@
+<!--
+  ~ Licensed to Apache Software Foundation (ASF) under one or more contributor
+  ~ license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright
+  ~ ownership. Apache Software Foundation (ASF) licenses this file to you under
+  ~ the Apache License, Version 2.0 (the "License"); you may
+  ~ not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+-->
+
+<script setup>
+import { reactive } from 'vue';
+import { useRouter, useRoute } from 'vue-router';
+import { getCurrentInstance } from '@vue/runtime-core'
+import { ElStep } from 'element-plus';
+
+const router = useRouter()
+const route = useRoute()
+const $bus = getCurrentInstance().appContext.config.globalProperties.mittBus
+
+const data = reactive({
+    activeTabIndex: 0,
+    tabsList: []
+})
+function tabClick() {
+    router.push(data.tabsList[data.activeTabIndex].route)
+    const group = data.tabsList[data.activeTabIndex].route.params.group
+    const name = data.tabsList[data.activeTabIndex].route.params.name
+
+    if (group && name) {
+        $bus.emit('changeAside', { group, name })
+    }
+}
+function removeTab(index) {
+    const len = data.tabsList.length
+    const activeTabIndex = data.activeTabIndex
+    if (len == 1) {
+        data.tabsList = []
+        $bus.emit('resetAside')
+        return
+    }
+    data.tabsList.splice(index, 1)
+    if (activeTabIndex != 0) {
+        data.activeTabIndex--
+    }
+    router.push(data.tabsList[data.activeTabIndex].route)
+}
+function initData() {
+    const group = route.params.group
+    const name = route.params.name
+    const operator = route.params.operator
+    const type = route.params.type
+    if (!operator || !group || !type) {
+        return
+    }
+    const routeData = {
+        params: route.params
+    }
+    const add = { route: routeData }
+    if (operator == 'read') {
+        routeData.name = type
+        add.label = name
+        add.type = 'Read'
+    } else if (operator == 'edit') {
+        routeData.name = `edit-${type}`
+        add.label = name
+        add.type = 'Edit'
+    } else {
+        routeData.name = `create-${type}`
+        add.label = group
+        add.type = 'Create'
+    }
+    data.tabsList.push(add)
+}
+$bus.on('AddTabs', (tab) => {
+    const index = data.tabsList.findIndex(item => {
+        return item.label == tab.label && item.type == tab.type
+    })
+    if (index >= 0) {
+        return data.activeTabIndex = index
+    }
+    data.tabsList.push(tab)
+    data.activeTabIndex = data.tabsList.length - 1
+})
+$bus.on('deleteGroup', (group) => {
+    data.tabsList.forEach(item, index => {
+        if (item.route.group === group) {
+            removeTab(index)
+        }
+    })
+})
+$bus.on('deleteResource', (name) => {
+    data.tabsList.forEach(item, index => {
+        if (item.route.name && item.route.name === name) {
+            removeTab(index)
+        }
+    })
+})
+initData()
+</script>
+
+<template>
+    <div class="topNav-box bd-top" v-if="data.tabsList.length > 0">
+        <el-tabs type="card" v-model="data.activeTabIndex" closable class="demo-tabs" @tab-change="tabClick"
+            @tab-remove="removeTab">
+            <el-tab-pane v-for="item, index in data.tabsList" :key="`${item.type}-${item.label}`"
+                :label="`${item.type}-${item.label}`" :name="index"></el-tab-pane>
+        </el-tabs>
+    </div>
+</template>
+
+<style>
+.demo-tabs>.el-tabs__content {
+    padding: 32px;
+    color: #6b778c;
+    font-size: 32px;
+    font-weight: 600;
+}
+</style>
+<style lang="scss" scoped>
+.topNav-box {
+    width: 100%;
+    height: 40px;
+    background-color: var(--color-white);
+    box-shadow: 0 0 10px 0 var(--color-placeholder-font);
+}
+
+::v-deep {
+    .el-tabs--card>.el-tabs__header .el-tabs__nav {
+        border-top: none !important;
+        padding: 0 !important;
+    }
+
+    .el-tabs__header.is-top {
+        padding: 0 !important;
+        margin: 0 !important;
+    }
+    .el-tabs__item.is-active {
+        color: var(--color-main) !important;
+        background-color: var(--color-main-background) !important;
+        border: 1px solid var(--color-main) !important;
+        border-bottom: none !important;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+    }
+    .el-tabs__content {
+        padding: 0 !important;
+        margin: 0 !important;
+        height: 0 !important;
+    }
+}
+</style>
\ No newline at end of file
diff --git a/ui/src/router/index.js b/ui/src/router/index.js
index 46a3aa55..c458848e 100644
--- a/ui/src/router/index.js
+++ b/ui/src/router/index.js
@@ -18,50 +18,98 @@
  */
 
 import { createRouter, createWebHistory } from 'vue-router'
-import DashboardView from '../views/DashboardView.vue'
+import Header from '@/components2/Header/index.vue'
 import NotFoundView from '../views/NotFoundView.vue'
-import StreamView from '../views/StreamView.vue'
-import PropertyView from '../views/PropertyView.vue'
-import MeasureView from '../views/MeasureView.vue'
 
 const router = createRouter({
   history: createWebHistory(import.meta.env.BASE_URL),
   routes: [
     {
       path: '/',
-      redirect: '/dashboard'
+      redirect: '/banyandb'
     },
     {
-      path: '/dashboard',
-      name: 'Dashboard',
-      component: DashboardView,
+      path: '/banyandb',
+      component: Header,
+      name: 'banyandb',
+      redirect: '/banyandb/dashboard',
       meta: {
         keepAlive: false,
-      }
-    },
-    {
-      path: '/stream',
-      name: 'Stream',
-      component: StreamView,
-      meta: {
-        keepAlive: true,
-      }
-    },
-    {
-      path: '/measure',
-      name: 'Measure',
-      component: MeasureView,
-      meta: {
-        keepAlive: false,
-      }
-    },
-    {
-      path: '/property',
-      name: 'Property',
-      component: PropertyView,
-      meta: {
-        keepAlive: false,
-      }
+      },
+      children: [
+        {
+          path: '/banyandb/dashboard',
+          name: 'dashboard',
+          component: () => import('@/views/Dashboard/index.vue')
+        },
+        {
+          path: '/banyandb/stream',
+          name: 'streamHome',
+          redirect: '/banyandb/stream/start',
+          component: () => import('@/views/Stream/index.vue'),
+          children: [
+            {
+              path: '/banyandb/stream/start',
+              name: 'streamStart',
+              component: () => import('@/components2/Start/index.vue'),
+              meta: {
+                type: 'stream'
+              }
+            },
+            {
+              path: '/banyandb/stream/operator-read/:type/:operator/:group/:name',
+              name: 'stream',
+              component: () => import('@/views/Stream/stream.vue')
+            },
+            {
+              path: '/banyandb/stream/operator-create/:type/:operator/:group',
+              name: 'create-stream',
+              component: () => import('@/views/Stream/createEdit.vue')
+            },
+            {
+              path: '/banyandb/stream/operator-edit/:type/:operator/:group/:name',
+              name: 'edit-stream',
+              component: () => import('@/views/Stream/createEdit.vue')
+            }
+          ]
+        },
+        {
+          path: '/banyandb/measure',
+          name: 'measureHome',
+          redirect: '/banyandb/measure/start',
+          component: () => import('@/views/Measure/index.vue'),
+          children: [
+            {
+              path: '/banyandb/measure/start',
+              name: 'measureStart',
+              component: () => import('@/components2/Start/index.vue'),
+              meta: {
+                type: 'measure'
+              }
+            },
+            {
+              path: '/banyandb/measure/operator-read/:type/:operator/:group/:name',
+              name: 'measure',
+              component: () => import('@/views/Measure/measure.vue')
+            },
+            {
+              path: '/banyandb/measure/operator-create/:type/:operator/:group',
+              name: 'create-measure',
+              component: () => import('@/views/Measure/createEdit.vue')
+            },
+            {
+              path: '/banyandb/measure/operator-edit/:type/:operator/:group/:name',
+              name: 'edit-measure',
+              component: () => import('@/views/Stream/createEdit.vue')
+            }
+          ]
+        },
+        {
+          path: '/banyandb/property',
+          name: 'Property',
+          component: () => import('@/views/Property/index.vue')
+        }
+      ]
     },
     {
       // will match everything
diff --git a/ui/src/stores/tags.js b/ui/src/stores/tags.js
index 4dd3d7a3..eb60bb17 100644
--- a/ui/src/stores/tags.js
+++ b/ui/src/stores/tags.js
@@ -18,6 +18,7 @@
  */
 
 import { defineStore } from "pinia"
+import { ElMessage } from 'element-plus'
 
 export default defineStore('tags', {
     state() {
@@ -31,7 +32,7 @@ export default defineStore('tags', {
             let result = this.tagsList.findIndex(item => item.metadata.group === val.metadata.group && item.metadata.type === val.metadata.type && item.metadata.name === val.metadata.name)
             if (result === -1) {
                 if (this.tagsList.length == 9) {
-                    Message({
+                    ElMessage({
                         message: "Open up to 9 files at the same time! Please close some files and try again!",
                         type: "warning"
                     })
diff --git a/ui/src/styles/custom.scss b/ui/src/styles/custom.scss
index e4d93f0d..112b12f2 100644
--- a/ui/src/styles/custom.scss
+++ b/ui/src/styles/custom.scss
@@ -22,7 +22,9 @@ html {
             color
     ==================== */
     --color-main: #6E38F7; /* main color */
-    --color-main-background: #daccff;
+    --el-color-primary: var(--color-main) !important;
+    --el-border-color-hover: var(--color-main) !important;
+    --color-main-background: rgb(241, 235, 254);
     --color-background: #e7ebfc;
 
     --color-top-background: #1d1f2a;
diff --git a/ui/src/styles/elementPlus.scss b/ui/src/styles/elementPlus.scss
index 1cd3fec1..b930cd53 100644
--- a/ui/src/styles/elementPlus.scss
+++ b/ui/src/styles/elementPlus.scss
@@ -16,24 +16,40 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 @use './custom.scss' as *;
 
 /* ====================
        button
 =======================*/
-.el-button.nav-button {
-    height: 25px;
-    border-radius: 1px;
-    line-height: 28px;
-    font-size: 12px;
-    margin: 0;
-
+/* .el-button {
+    height: 25px !important;
+    border-radius: 1px !important;
+    font-size: 12px !important;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    --el-button-active-text-color: black !important;
+    --el-button-active-border-color: var(--el-border-color) !important;
+    --el-button-active-bg-color: white !important;
     &:hover {
         color: var(--color-main) !important;
         background-color: var(--color-main-background) !important;
         border: 1px solid var(--color-main) !important;
     }
+    &:focus {
+        color: var(--color-main) !important;
+        background-color: var(--color-main-background) !important;
+        border: 1px solid var(--color-main) !important;
+    }
+}
+
+.el-button--danger {
+    &:hover {
+        color: var(--el-color-danger) !important;
+        background-color: #f5bebe !important;
+        border: 1px solid var(--el-color-danger) !important;
+    }
 }
 
 .el-button--primary {
@@ -47,7 +63,7 @@
         background-color: white !important;
         border: 1px solid #e4e7ed !important;
     }
-}
+} */
 
 /* =============
       el-tag
@@ -73,6 +89,7 @@
             background-color: var(--color-main) !important;
         }
     }
+
     &:hover {
         background-color: var(--color-main-background) !important;
     }
@@ -119,13 +136,16 @@
     --el-select-input-focus-border-color: var(--color-main) !important;
     --el-select-border-color-hover: var(--color-main) !important;
 }
+
 .el-scrollbar__view.el-select-dropdown__list {
     margin: 0 !important;
     font-size: 12px !important;
+
     .el-select-dropdown__item.selected {
         font-size: 14px !important;
         color: var(--color-main);
     }
+
     .el-select-dropdown__item {
         font-size: 14px !important;
     }
@@ -140,6 +160,7 @@
     --el-input-border-radius: 1px !important;
     --el-input-focus-border-color: var(--color-main) !important;
     --el-input-clear-hover-color: var(--color-main) !important;
+
     .el-input__inner {
         height: 25px !important;
     }
@@ -151,6 +172,7 @@
 .el-date-editor {
     height: 25px !important;
     border-radius: 1px !important;
+
     .el-range-input {
         height: 21px !important;
     }
@@ -171,15 +193,19 @@
     --el-table-header-bg-color: #f2f5fc !important;
     --el-table-header-text-color: black !important
 }
+
 .el-table .sort-caret.ascending {
     border-bottom-color: var(--el-text-color-placeholder) !important;
 }
+
 .el-table .ascending .sort-caret.ascending {
     border-bottom-color: var(--color-main) !important;
 }
+
 .el-table .sort-caret.descending {
     border-top-color: var(--el-text-color-placeholder) !important;
 }
+
 .el-table .descending .sort-caret.descending {
     border-top-color: var(--color-main) !important;
 }
@@ -189,4 +215,41 @@
 ===================*/
 .el-card {
     border-radius: 0px !important;
+}
+
+/* ===============
+     left menu
+===================*/
+.el-sub-menu__title {
+    height: 48px !important;
+}
+
+.el-menu-item {
+    height: 45px !important;
+}
+
+.el-menu.el-menu--horizontal.el-menu-demo {
+    border: 0px !important;
+
+    .el-menu-item {
+        height: 100% !important;
+    }
+}
+.el-menu-item.is-active {
+    color: var(--color-main) !important;
+}
+.el-sub-menu.is-active {
+    --el-menu-active-color: var(--color-main) !important;
+}
+.navigation {
+    border: 0px !important;
+}
+
+/*==================
+    el-checkbox
+===================*/
+.el-checkbox {
+    --el-checkbox-checked-bg-color: var(--color-main) !important;
+    --el-checkbox-checked-input-border-color: var(--color-main) !important;
+    --el-checkbox-input-border-color-hover: var(--color-main) !important;
 }
\ No newline at end of file
diff --git a/ui/src/styles/main.scss b/ui/src/styles/main.scss
index 4e70c25b..983cd1e0 100644
--- a/ui/src/styles/main.scss
+++ b/ui/src/styles/main.scss
@@ -19,6 +19,8 @@
 
  @use './custom.scss' as *;
 
+.size {width: 100%; height: 100%;}
+
 /* ==================
      flex layout
 ==================== */
@@ -61,6 +63,7 @@
 .text-justify {text-align: justify;}
 .text-start {text-align: start;}
 .text-family {font-family: var(--font-family-main);}
+.text-bold {font-weight: bold}
 .text-weight-mini {font-weight: var(--weight-mini);}
 .text-weight-lt {font-weight: var(--weight-lt);}
 .text-main-color {color: var(--color-main-font);}
@@ -92,7 +95,7 @@
 /* ==================
      box-shadow
 ==================== */
-.box-shadow{box-shadow: 0px 0px 10px var(--color-placeholder-font);}
+.box-shadow{box-shadow: 0px 0px 10px 0 var(--color-placeholder-font);}
 
 /* ==================
         margin
diff --git a/ui/src/utils/axios.js b/ui/src/utils/axios.js
index 50cf3999..50ad8cd4 100644
--- a/ui/src/utils/axios.js
+++ b/ui/src/utils/axios.js
@@ -33,7 +33,7 @@ axiosService.interceptors.request.use(
          * TODO
          * Configuration before request
          */
-        // console.log(config)
+
         return config
     },
     error => {
@@ -41,7 +41,6 @@ axiosService.interceptors.request.use(
          * TODO
          * do some error handling
          */
-        console.log(error)
         return Promise.reject(error)
     }
 )
@@ -49,7 +48,6 @@ axiosService.interceptors.request.use(
 // re request
 function reRequest(err) {
     let againReq = new Promise((resolve) => {
-        console.log('request:' + err.config.url + 'Request failed, re request');
         resolve();
     })
     return againReq.then(() => {
@@ -65,8 +63,7 @@ axiosService.interceptors.response.use(
          * TODO
          * Data processing operation
          */
-        console.log('response', response)
-        if(response.status == 200) {
+        if (response.status == 200) {
             return Promise.resolve(response)
         } else {
             return Promise.reject(response)
@@ -77,11 +74,8 @@ axiosService.interceptors.response.use(
          * TODO
          * do some error handling
          */
-        console.log(error)
-        console.log(error.message)
         const resErr = error.data
-        console.log(resErr)
-        
+
         let msg = error.data && error.data.message ? error.data.message : error.message
         ElMessage({
             message: msg,
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/views/Dashboard/index.vue
similarity index 60%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/views/Dashboard/index.vue
index bf964e18..f6c1b98b 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/views/Dashboard/index.vue
@@ -18,22 +18,13 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
-})
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
+    <div>
+        <h1 class="home">
+            This is the dashboard page
+        </h1>
     </div>
 </template>
 
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/views/Measure/createEdit.vue
similarity index 59%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/views/Measure/createEdit.vue
index bf964e18..cedd97bd 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/views/Measure/createEdit.vue
@@ -18,25 +18,13 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
-})
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
-    </div>
+    <div class="about">
+    <h1>This is the create or edit measure page</h1>
+  </div>
 </template>
 
 <style lang="scss" scoped>
-
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/views/Measure/index.vue
similarity index 53%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/views/Measure/index.vue
index bf964e18..8783afc1 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/views/Measure/index.vue
@@ -18,25 +18,49 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
+import Aside from '@/components2/Aside/index.vue'
+import TopNav from '@/components2/TopNav/index.vue'
+import { reactive } from 'vue';
+
+const data = reactive({
+  width: '200px'
 })
+
+function setWidth(width) {
+  data.width = width
+}
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
-    </div>
+  <div class="size">
+    <el-container>
+      <el-aside :width="data.width" class="bd-top flex" style="position:relative; background-color: white;">
+        <Aside type="measure" @setWidth="setWidth"></Aside>
+      </el-aside>
+      <el-main>
+        <TopNav></TopNav>
+        <RouterView></RouterView>
+      </el-main>
+    </el-container>
+  </div>
 </template>
 
 <style lang="scss" scoped>
+.el-container {
+  height: 100%;
+  padding: 0;
+  margin: 0;
+
+  .el-header {
+    background-color: #ffffff;
+    padding: 0;
+    margin: 0;
+  }
 
+  .el-main {
+    background-color: #eaedf1;
+    padding: 0;
+    margin: 0;
+  }
+}
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/views/Measure/measure.vue
similarity index 59%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/views/Measure/measure.vue
index bf964e18..8052921a 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/views/Measure/measure.vue
@@ -18,25 +18,13 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
-})
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
-    </div>
+    <div class="about">
+    <h1>This is the Measure page</h1>
+  </div>
 </template>
 
 <style lang="scss" scoped>
-
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/views/Property/index.vue
similarity index 59%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/views/Property/index.vue
index bf964e18..4c303543 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/views/Property/index.vue
@@ -18,25 +18,13 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
-})
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
-    </div>
+    <div class="about">
+    <h1>This is the property page</h1>
+  </div>
 </template>
 
 <style lang="scss" scoped>
-
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/views/Stream/createEdit.vue
similarity index 59%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/views/Stream/createEdit.vue
index bf964e18..9e790373 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/views/Stream/createEdit.vue
@@ -18,23 +18,13 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
-})
+import StreamEditor from '@/components2/StreamEditor/index.vue'
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
-    </div>
+  <div class="about">
+    <StreamEditor></StreamEditor>
+  </div>
 </template>
 
 <style lang="scss" scoped>
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/views/Stream/index.vue
similarity index 53%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/views/Stream/index.vue
index bf964e18..92e026b6 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/views/Stream/index.vue
@@ -18,25 +18,49 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
+import Aside from '@/components2/Aside/index.vue'
+import TopNav from '@/components2/TopNav/index.vue'
+import { reactive } from 'vue';
+
+const data = reactive({
+  width: '200px'
 })
+
+function setWidth(width) {
+  data.width = width
+}
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
-    </div>
+  <div class="size">
+    <el-container>
+      <el-aside :width="data.width" class="bd-top flex box-shadow" style="position:relative; background-color: white;">
+        <Aside type="stream" @setWidth="setWidth"></Aside>
+      </el-aside>
+      <el-main>
+        <TopNav></TopNav>
+        <RouterView></RouterView>
+      </el-main>
+    </el-container>
+  </div>
 </template>
 
 <style lang="scss" scoped>
+.el-container {
+  height: 100%;
+  padding: 0;
+  margin: 0;
+
+  .el-header {
+    background-color: #ffffff;
+    padding: 0;
+    margin: 0;
+  }
 
+  .el-main {
+    background-color: #eaedf1;
+    padding: 0;
+    margin: 0;
+  }
+}
 </style>
\ No newline at end of file
diff --git a/ui/src/components/Database/Aside/components/RightMenu/index.vue b/ui/src/views/Stream/stream.vue
similarity index 59%
copy from ui/src/components/Database/Aside/components/RightMenu/index.vue
copy to ui/src/views/Stream/stream.vue
index bf964e18..bbf8ba85 100644
--- a/ui/src/components/Database/Aside/components/RightMenu/index.vue
+++ b/ui/src/views/Stream/stream.vue
@@ -18,23 +18,15 @@
 -->
 
 <script setup>
-import RightMenuItem from './components/right-menu-item.vue'
-function handle() {
-}
-defineProps({
-    rightMenuList: Array
-})
+import Read from '@/components2/Read/index.vue'
+import { useRoute } from 'vue-router'
+const route = useRoute()
 </script>
 
 <template>
-    <div style="width: 100%;" class="border-radius-little">
-        <div style="width: 100%;" v-for="(item, index) in rightMenuList" :key="item.name">
-            <right-menu-item
-            @handleRightItem="$emit('handleRightItem', index)"
-                :class="index == rightMenuList.length - 1 ? 'border-radius-bottom-little' : index == 0 ? 'border-radius-top-little bd-bottom' : 'bd-bottom'"
-                :icon="item.icon" :name="item.name"></right-menu-item>
-        </div>
-    </div>
+  <div>
+    <Read></Read>
+  </div>
 </template>
 
 <style lang="scss" scoped>