diff --git a/package-lock.json b/package-lock.json
index 3f17cff..d1bdf91 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,261 +1,623 @@
 {
   "name": "vue3_template",
   "version": "0.0.0",
-  "lockfileVersion": 1,
+  "lockfileVersion": 3,
   "requires": true,
-  "dependencies": {
-    "@aashutoshrathi/word-wrap": {
+  "packages": {
+    "": {
+      "name": "vue3_template",
+      "version": "0.0.0",
+      "dependencies": {
+        "@element-plus/icons-vue": "^2.3.1",
+        "@icon-park/vue-next": "^1.4.2",
+        "@vueuse/core": "^9.13.0",
+        "@vueuse/integrations": "^10.7.1",
+        "@wangeditor/editor": "^5.1.23",
+        "@wangeditor/editor-for-vue": "^5.1.12",
+        "animate.css": "^4.1.1",
+        "autofit.js": "^3.0.7",
+        "axios": "^1.6.3",
+        "dayjs": "^1.11.10",
+        "echarts": "^5.4.3",
+        "element-plus": "^2.4.4",
+        "html2canvas": "^1.4.1",
+        "jspdf": "^2.5.1",
+        "lodash-es": "^4.17.21",
+        "mitt": "^3.0.1",
+        "nanoid": "^5.0.4",
+        "normalize.css": "^8.0.1",
+        "pako": "^2.1.0",
+        "pinia": "^2.1.7",
+        "pinia-plugin-persistedstate": "^3.2.1",
+        "qrcode": "^1.5.3",
+        "qs": "^6.11.2",
+        "relation-graph": "^2.1.24",
+        "throttle-debounce": "^5.0.0",
+        "v-viewer": "^3.0.11",
+        "vant": "^4.8.4",
+        "viewerjs": "^1.11.6",
+        "vue": "^3.4.3",
+        "vue-countup-v3": "^1.4.1",
+        "vue-draggable-plus": "^0.3.4",
+        "vue-esign": "^1.1.4",
+        "vue-router": "^4.2.5",
+        "vue3-pdfjs": "^0.1.6",
+        "vue3-print-nb": "^0.1.4",
+        "vue3-puzzle-vcode": "^1.1.5",
+        "vue3-seamless-scroll": "^2.0.1",
+        "xlsx": "^0.18.5"
+      },
+      "devDependencies": {
+        "@our-patches/postcss-px-to-viewport": "^1.2.0",
+        "@types/node": "^18.19.4",
+        "@vitejs/plugin-basic-ssl": "^1.0.2",
+        "@vitejs/plugin-vue": "^4.6.2",
+        "@vue/eslint-config-prettier": "^7.1.0",
+        "autoprefixer": "^10.4.16",
+        "eslint": "^8.56.0",
+        "eslint-config-prettier": "^8.10.0",
+        "eslint-config-standard": "^17.1.0",
+        "eslint-plugin-import": "^2.29.1",
+        "eslint-plugin-n": "^15.7.0",
+        "eslint-plugin-prettier": "^4.2.1",
+        "eslint-plugin-promise": "^6.1.1",
+        "eslint-plugin-vue": "^9.19.2",
+        "prettier": "^2.8.8",
+        "sass": "^1.69.0",
+        "unplugin-auto-import": "^0.12.2",
+        "unplugin-vue-components": "^0.22.12",
+        "vite": "^4.5.1",
+        "vite-plugin-enhance-log": "^0.5.2",
+        "vite-plugin-eslint": "^1.8.1",
+        "vite-plugin-remove-console": "^2.2.0",
+        "vue-eslint-parser": "^9.3.2"
+      }
+    },
+    "node_modules/@aashutoshrathi/word-wrap": {
       "version": "1.2.6",
       "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
       "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "@antfu/utils": {
+    "node_modules/@ampproject/remapping": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz",
+      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@antfu/utils": {
       "version": "0.7.7",
       "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.7.tgz",
       "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==",
       "dev": true
     },
-    "@babel/code-frame": {
+    "node_modules/@babel/code-frame": {
       "version": "7.23.5",
       "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.23.5.tgz",
       "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/highlight": "^7.23.4",
         "chalk": "^2.4.2"
       },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/generator": {
+    "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "dev": true
+    },
+    "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.23.5",
+      "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.5.tgz",
+      "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.24.0.tgz",
+      "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.23.5",
+        "@babel/generator": "^7.23.6",
+        "@babel/helper-compilation-targets": "^7.23.6",
+        "@babel/helper-module-transforms": "^7.23.3",
+        "@babel/helpers": "^7.24.0",
+        "@babel/parser": "^7.24.0",
+        "@babel/template": "^7.24.0",
+        "@babel/traverse": "^7.24.0",
+        "@babel/types": "^7.24.0",
+        "convert-source-map": "^2.0.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core/node_modules/@babel/traverse": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.0.tgz",
+      "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.23.5",
+        "@babel/generator": "^7.23.6",
+        "@babel/helper-environment-visitor": "^7.22.20",
+        "@babel/helper-function-name": "^7.23.0",
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/parser": "^7.24.0",
+        "@babel/types": "^7.24.0",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core/node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/core/node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
+      "peer": true,
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@babel/generator": {
       "version": "7.23.6",
       "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.6.tgz",
       "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/types": "^7.23.6",
         "@jridgewell/gen-mapping": "^0.3.2",
         "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/helper-environment-visitor": {
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.23.6",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
+      "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.23.5",
+        "@babel/helper-validator-option": "^7.23.5",
+        "browserslist": "^4.22.2",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-environment-visitor": {
       "version": "7.22.20",
       "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
       "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
     },
-    "@babel/helper-function-name": {
+    "node_modules/@babel/helper-function-name": {
       "version": "7.23.0",
       "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
       "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/template": "^7.22.15",
         "@babel/types": "^7.23.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/helper-hoist-variables": {
+    "node_modules/@babel/helper-hoist-variables": {
       "version": "7.22.5",
       "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
       "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/helper-plugin-utils": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
-      "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
-      "dev": true
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+      "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.22.15"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
     },
-    "@babel/helper-split-export-declaration": {
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.23.3",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
+      "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.22.20",
+        "@babel/helper-module-imports": "^7.22.15",
+        "@babel/helper-simple-access": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/helper-validator-identifier": "^7.22.20"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz",
+      "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-simple-access": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-split-export-declaration": {
       "version": "7.22.6",
       "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
       "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/helper-string-parser": {
+    "node_modules/@babel/helper-string-parser": {
       "version": "7.23.4",
       "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
       "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
     },
-    "@babel/helper-validator-identifier": {
+    "node_modules/@babel/helper-validator-identifier": {
       "version": "7.22.20",
       "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
       "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
     },
-    "@babel/highlight": {
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.23.5",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
+      "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.0.tgz",
+      "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/template": "^7.24.0",
+        "@babel/traverse": "^7.24.0",
+        "@babel/types": "^7.24.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers/node_modules/@babel/traverse": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.0.tgz",
+      "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==",
+      "dev": true,
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.23.5",
+        "@babel/generator": "^7.23.6",
+        "@babel/helper-environment-visitor": "^7.22.20",
+        "@babel/helper-function-name": "^7.23.0",
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/parser": "^7.24.0",
+        "@babel/types": "^7.24.0",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers/node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight": {
       "version": "7.23.4",
       "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.23.4.tgz",
       "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/helper-validator-identifier": "^7.22.20",
         "chalk": "^2.4.2",
         "js-tokens": "^4.0.0"
       },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/parser": {
-      "version": "7.23.9",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.9.tgz",
-      "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA=="
+    "node_modules/@babel/highlight/node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
     },
-    "@babel/plugin-syntax-typescript": {
+    "node_modules/@babel/highlight/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "dev": true
+    },
+    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.0.tgz",
+      "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-typescript": {
       "version": "7.23.3",
       "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz",
       "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/helper-plugin-utils": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "@babel/runtime": {
-      "version": "7.23.9",
-      "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.9.tgz",
-      "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
-      "requires": {
+    "node_modules/@babel/runtime": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.0.tgz",
+      "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==",
+      "dependencies": {
         "regenerator-runtime": "^0.14.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/template": {
-      "version": "7.23.9",
-      "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.23.9.tgz",
-      "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==",
+    "node_modules/@babel/template": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.24.0.tgz",
+      "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/code-frame": "^7.23.5",
-        "@babel/parser": "^7.23.9",
-        "@babel/types": "^7.23.9"
+        "@babel/parser": "^7.24.0",
+        "@babel/types": "^7.24.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/traverse": {
+    "node_modules/@babel/traverse": {
       "version": "7.21.4",
       "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.21.4.tgz",
       "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/code-frame": "^7.21.4",
         "@babel/generator": "^7.21.4",
         "@babel/helper-environment-visitor": "^7.18.9",
@@ -267,211 +629,431 @@
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
-      "dependencies": {
-        "globals": {
-          "version": "11.12.0",
-          "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
-          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-          "dev": true
-        }
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@babel/types": {
-      "version": "7.23.9",
-      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.23.9.tgz",
-      "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==",
+    "node_modules/@babel/traverse/node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
       "dev": true,
-      "requires": {
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.24.0",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.24.0.tgz",
+      "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
+      "dev": true,
+      "dependencies": {
         "@babel/helper-string-parser": "^7.23.4",
         "@babel/helper-validator-identifier": "^7.22.20",
         "to-fast-properties": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "@ctrl/tinycolor": {
+    "node_modules/@ctrl/tinycolor": {
       "version": "3.6.1",
       "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
-      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA=="
+      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+      "engines": {
+        "node": ">=10"
+      }
     },
-    "@element-plus/icons-vue": {
+    "node_modules/@element-plus/icons-vue": {
       "version": "2.3.1",
       "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
-      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg=="
+      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
     },
-    "@esbuild/android-arm": {
+    "node_modules/@esbuild/android-arm": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
       "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+      "cpu": [
+        "arm"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/android-arm64": {
+    "node_modules/@esbuild/android-arm64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
       "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/android-x64": {
+    "node_modules/@esbuild/android-x64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
       "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/darwin-arm64": {
+    "node_modules/@esbuild/darwin-arm64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
       "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/darwin-x64": {
+    "node_modules/@esbuild/darwin-x64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
       "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/freebsd-arm64": {
+    "node_modules/@esbuild/freebsd-arm64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
       "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/freebsd-x64": {
+    "node_modules/@esbuild/freebsd-x64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
       "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-arm": {
+    "node_modules/@esbuild/linux-arm": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
       "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+      "cpu": [
+        "arm"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-arm64": {
+    "node_modules/@esbuild/linux-arm64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
       "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-ia32": {
+    "node_modules/@esbuild/linux-ia32": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
       "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+      "cpu": [
+        "ia32"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-loong64": {
+    "node_modules/@esbuild/linux-loong64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
       "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+      "cpu": [
+        "loong64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-mips64el": {
+    "node_modules/@esbuild/linux-mips64el": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
       "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+      "cpu": [
+        "mips64el"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-ppc64": {
+    "node_modules/@esbuild/linux-ppc64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
       "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+      "cpu": [
+        "ppc64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-riscv64": {
+    "node_modules/@esbuild/linux-riscv64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
       "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+      "cpu": [
+        "riscv64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-s390x": {
+    "node_modules/@esbuild/linux-s390x": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
       "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+      "cpu": [
+        "s390x"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/linux-x64": {
+    "node_modules/@esbuild/linux-x64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
       "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/netbsd-x64": {
+    "node_modules/@esbuild/netbsd-x64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
       "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/openbsd-x64": {
+    "node_modules/@esbuild/openbsd-x64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
       "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/sunos-x64": {
+    "node_modules/@esbuild/sunos-x64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
       "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/win32-arm64": {
+    "node_modules/@esbuild/win32-arm64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
       "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/win32-ia32": {
+    "node_modules/@esbuild/win32-ia32": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
       "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+      "cpu": [
+        "ia32"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@esbuild/win32-x64": {
+    "node_modules/@esbuild/win32-x64": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
       "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+      "cpu": [
+        "x64"
+      ],
       "dev": true,
-      "optional": true
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "@eslint-community/eslint-utils": {
+    "node_modules/@eslint-community/eslint-utils": {
       "version": "4.4.0",
       "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
       "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
       }
     },
-    "@eslint-community/regexpp": {
+    "node_modules/@eslint-community/regexpp": {
       "version": "4.10.0",
       "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
       "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
     },
-    "@eslint/eslintrc": {
+    "node_modules/@eslint/eslintrc": {
       "version": "2.1.4",
       "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
       "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
         "espree": "^9.6.0",
@@ -481,239 +1063,302 @@
         "js-yaml": "^4.1.0",
         "minimatch": "^3.1.2",
         "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "@eslint/js": {
-      "version": "8.56.0",
-      "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.56.0.tgz",
-      "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
-      "dev": true
+    "node_modules/@eslint/js": {
+      "version": "8.57.0",
+      "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz",
+      "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
     },
-    "@floating-ui/core": {
+    "node_modules/@floating-ui/core": {
       "version": "1.6.0",
       "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.0.tgz",
       "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
-      "requires": {
+      "dependencies": {
         "@floating-ui/utils": "^0.2.1"
       }
     },
-    "@floating-ui/dom": {
+    "node_modules/@floating-ui/dom": {
       "version": "1.6.3",
       "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.3.tgz",
       "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==",
-      "requires": {
+      "dependencies": {
         "@floating-ui/core": "^1.0.0",
         "@floating-ui/utils": "^0.2.0"
       }
     },
-    "@floating-ui/utils": {
+    "node_modules/@floating-ui/utils": {
       "version": "0.2.1",
       "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.1.tgz",
       "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
     },
-    "@humanwhocodes/config-array": {
+    "node_modules/@humanwhocodes/config-array": {
       "version": "0.11.14",
       "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
       "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@humanwhocodes/object-schema": "^2.0.2",
         "debug": "^4.3.1",
         "minimatch": "^3.0.5"
+      },
+      "engines": {
+        "node": ">=10.10.0"
       }
     },
-    "@humanwhocodes/module-importer": {
+    "node_modules/@humanwhocodes/module-importer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
       "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=12.22"
+      }
     },
-    "@humanwhocodes/object-schema": {
+    "node_modules/@humanwhocodes/object-schema": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
       "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
       "dev": true
     },
-    "@icon-park/vue-next": {
+    "node_modules/@icon-park/vue-next": {
       "version": "1.4.2",
       "resolved": "https://registry.npmmirror.com/@icon-park/vue-next/-/vue-next-1.4.2.tgz",
-      "integrity": "sha512-+QklF255wkfBOabY+xw6FAI0Bwln/RhdwCunNy/9sKdKuChtaU67QZqU67KGAvZUTeeBgsL+yaHHxqfQeGZXEQ=="
-    },
-    "@jridgewell/gen-mapping": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
-      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
-      "dev": true,
-      "requires": {
-        "@jridgewell/set-array": "^1.0.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
+      "integrity": "sha512-+QklF255wkfBOabY+xw6FAI0Bwln/RhdwCunNy/9sKdKuChtaU67QZqU67KGAvZUTeeBgsL+yaHHxqfQeGZXEQ==",
+      "engines": {
+        "node": ">= 8.0.0",
+        "npm": ">= 5.0.0"
+      },
+      "peerDependencies": {
+        "vue": "3.x"
       }
     },
-    "@jridgewell/resolve-uri": {
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
       "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
     },
-    "@jridgewell/set-array": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
-      "dev": true
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
     },
-    "@jridgewell/sourcemap-codec": {
+    "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
     },
-    "@jridgewell/trace-mapping": {
-      "version": "0.3.22",
-      "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
-      "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
-    "@nodelib/fs.scandir": {
+    "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
       "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@nodelib/fs.stat": "2.0.5",
         "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "@nodelib/fs.stat": {
+    "node_modules/@nodelib/fs.stat": {
       "version": "2.0.5",
       "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
       "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
     },
-    "@nodelib/fs.walk": {
+    "node_modules/@nodelib/fs.walk": {
       "version": "1.2.8",
       "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
       "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@nodelib/fs.scandir": "2.1.5",
         "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "@our-patches/postcss-px-to-viewport": {
+    "node_modules/@our-patches/postcss-px-to-viewport": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/@our-patches/postcss-px-to-viewport/-/postcss-px-to-viewport-1.2.0.tgz",
       "integrity": "sha512-/yGylbA5hBCeF3vM6q/RgZxB3B2fOU1Mu64ETBIIymEyORMP/NVRmiek9f3Hfw4xNixH64S5Ph9YYA8BDpl5kw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "object-assign": ">=4.0.1"
+      },
+      "peerDependencies": {
+        "postcss": ">=5.0.2"
       }
     },
-    "@rollup/pluginutils": {
+    "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=="
+    },
+    "node_modules/@rollup/pluginutils": {
       "version": "5.1.0",
       "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
       "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@types/estree": "^1.0.0",
         "estree-walker": "^2.0.2",
         "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
       }
     },
-    "@transloadit/prettier-bytes": {
+    "node_modules/@transloadit/prettier-bytes": {
       "version": "0.0.7",
       "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
       "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
     },
-    "@types/eslint": {
-      "version": "8.56.2",
-      "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.56.2.tgz",
-      "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==",
+    "node_modules/@types/eslint": {
+      "version": "8.56.5",
+      "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.56.5.tgz",
+      "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
       }
     },
-    "@types/estree": {
+    "node_modules/@types/estree": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
       "dev": true
     },
-    "@types/event-emitter": {
+    "node_modules/@types/event-emitter": {
       "version": "0.3.5",
       "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
       "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
     },
-    "@types/json-schema": {
+    "node_modules/@types/json-schema": {
       "version": "7.0.15",
       "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
       "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
       "dev": true
     },
-    "@types/json5": {
+    "node_modules/@types/json5": {
       "version": "0.0.29",
       "resolved": "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz",
       "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
       "dev": true
     },
-    "@types/lodash": {
-      "version": "4.14.202",
-      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.202.tgz",
-      "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ=="
+    "node_modules/@types/lodash": {
+      "version": "4.17.0",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.0.tgz",
+      "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA=="
     },
-    "@types/lodash-es": {
+    "node_modules/@types/lodash-es": {
       "version": "4.17.12",
       "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
       "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
-      "requires": {
+      "dependencies": {
         "@types/lodash": "*"
       }
     },
-    "@types/node": {
-      "version": "18.19.17",
-      "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.19.17.tgz",
-      "integrity": "sha512-SzyGKgwPzuWp2SHhlpXKzCX0pIOfcI4V2eF37nNBJOhwlegQ83omtVQ1XxZpDE06V/d6AQvfQdPfnw0tRC//Ng==",
+    "node_modules/@types/node": {
+      "version": "18.19.25",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.19.25.tgz",
+      "integrity": "sha512-NrNXHJCexZtcbR9K1hsv1fSbwAwnhv7ql7l331aKvW0sej5H0NY1o64BHe0AA2ZoQuTm7NE6fyNW079MOWXe4Q==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "undici-types": "~5.26.4"
       }
     },
-    "@types/raf": {
+    "node_modules/@types/raf": {
       "version": "3.4.3",
       "resolved": "https://registry.npmmirror.com/@types/raf/-/raf-3.4.3.tgz",
       "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==",
       "optional": true
     },
-    "@types/web-bluetooth": {
+    "node_modules/@types/sortablejs": {
+      "version": "1.15.8",
+      "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.8.tgz",
+      "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==",
+      "peer": true
+    },
+    "node_modules/@types/web-bluetooth": {
       "version": "0.0.16",
       "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
       "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
     },
-    "@ungap/structured-clone": {
+    "node_modules/@ungap/structured-clone": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
       "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
       "dev": true
     },
-    "@uppy/companion-client": {
+    "node_modules/@uppy/companion-client": {
       "version": "2.2.2",
       "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
       "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
-      "requires": {
+      "dependencies": {
         "@uppy/utils": "^4.1.2",
         "namespace-emitter": "^2.0.1"
       }
     },
-    "@uppy/core": {
+    "node_modules/@uppy/core": {
       "version": "2.3.4",
       "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
       "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
-      "requires": {
+      "dependencies": {
         "@transloadit/prettier-bytes": "0.0.7",
         "@uppy/store-default": "^2.1.1",
         "@uppy/utils": "^4.1.3",
@@ -722,268 +1367,400 @@
         "namespace-emitter": "^2.0.1",
         "nanoid": "^3.1.25",
         "preact": "^10.5.13"
-      },
-      "dependencies": {
-        "nanoid": {
-          "version": "3.3.7",
-          "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
-          "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
-        }
       }
     },
-    "@uppy/store-default": {
+    "node_modules/@uppy/core/node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/@uppy/store-default": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
       "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
     },
-    "@uppy/utils": {
+    "node_modules/@uppy/utils": {
       "version": "4.1.3",
       "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
       "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
-      "requires": {
+      "dependencies": {
         "lodash.throttle": "^4.1.1"
       }
     },
-    "@uppy/xhr-upload": {
+    "node_modules/@uppy/xhr-upload": {
       "version": "2.1.3",
       "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
       "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
-      "requires": {
+      "dependencies": {
         "@uppy/companion-client": "^2.2.2",
         "@uppy/utils": "^4.1.2",
         "nanoid": "^3.1.25"
       },
-      "dependencies": {
-        "nanoid": {
-          "version": "3.3.7",
-          "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
-          "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
-        }
+      "peerDependencies": {
+        "@uppy/core": "^2.3.3"
       }
     },
-    "@vant/popperjs": {
+    "node_modules/@uppy/xhr-upload/node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/@vant/popperjs": {
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz",
       "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw=="
     },
-    "@vant/use": {
+    "node_modules/@vant/use": {
       "version": "1.6.0",
       "resolved": "https://registry.npmmirror.com/@vant/use/-/use-1.6.0.tgz",
-      "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA=="
+      "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==",
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
     },
-    "@vitejs/plugin-basic-ssl": {
+    "node_modules/@vitejs/plugin-basic-ssl": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz",
       "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=14.6.0"
+      },
+      "peerDependencies": {
+        "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
+      }
     },
-    "@vitejs/plugin-vue": {
+    "node_modules/@vitejs/plugin-vue": {
       "version": "4.6.2",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz",
       "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^4.0.0 || ^5.0.0",
+        "vue": "^3.2.25"
+      }
     },
-    "@vue/compiler-core": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.19.tgz",
-      "integrity": "sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==",
-      "requires": {
+    "node_modules/@vue/compiler-core": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz",
+      "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==",
+      "dependencies": {
         "@babel/parser": "^7.23.9",
-        "@vue/shared": "3.4.19",
+        "@vue/shared": "3.4.21",
         "entities": "^4.5.0",
         "estree-walker": "^2.0.2",
         "source-map-js": "^1.0.2"
       }
     },
-    "@vue/compiler-dom": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.19.tgz",
-      "integrity": "sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==",
-      "requires": {
-        "@vue/compiler-core": "3.4.19",
-        "@vue/shared": "3.4.19"
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz",
+      "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==",
+      "dependencies": {
+        "@vue/compiler-core": "3.4.21",
+        "@vue/shared": "3.4.21"
       }
     },
-    "@vue/compiler-sfc": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.19.tgz",
-      "integrity": "sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==",
-      "requires": {
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz",
+      "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==",
+      "dependencies": {
         "@babel/parser": "^7.23.9",
-        "@vue/compiler-core": "3.4.19",
-        "@vue/compiler-dom": "3.4.19",
-        "@vue/compiler-ssr": "3.4.19",
-        "@vue/shared": "3.4.19",
+        "@vue/compiler-core": "3.4.21",
+        "@vue/compiler-dom": "3.4.21",
+        "@vue/compiler-ssr": "3.4.21",
+        "@vue/shared": "3.4.21",
         "estree-walker": "^2.0.2",
-        "magic-string": "^0.30.6",
-        "postcss": "^8.4.33",
+        "magic-string": "^0.30.7",
+        "postcss": "^8.4.35",
         "source-map-js": "^1.0.2"
       }
     },
-    "@vue/compiler-ssr": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.19.tgz",
-      "integrity": "sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==",
-      "requires": {
-        "@vue/compiler-dom": "3.4.19",
-        "@vue/shared": "3.4.19"
+    "node_modules/@vue/compiler-sfc/node_modules/magic-string": {
+      "version": "0.30.8",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.8.tgz",
+      "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.4.15"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
-    "@vue/devtools-api": {
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz",
+      "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.4.21",
+        "@vue/shared": "3.4.21"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
       "version": "6.6.1",
       "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz",
       "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA=="
     },
-    "@vue/eslint-config-prettier": {
+    "node_modules/@vue/eslint-config-prettier": {
       "version": "7.1.0",
       "resolved": "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz",
       "integrity": "sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "eslint-config-prettier": "^8.3.0",
         "eslint-plugin-prettier": "^4.0.0"
+      },
+      "peerDependencies": {
+        "eslint": ">= 7.28.0",
+        "prettier": ">= 2.0.0"
       }
     },
-    "@vue/reactivity": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.19.tgz",
-      "integrity": "sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==",
-      "requires": {
-        "@vue/shared": "3.4.19"
+    "node_modules/@vue/reactivity": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
+      "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+      "dependencies": {
+        "@vue/shared": "3.4.21"
       }
     },
-    "@vue/runtime-core": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.19.tgz",
-      "integrity": "sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==",
-      "requires": {
-        "@vue/reactivity": "3.4.19",
-        "@vue/shared": "3.4.19"
+    "node_modules/@vue/runtime-core": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+      "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+      "dependencies": {
+        "@vue/reactivity": "3.4.21",
+        "@vue/shared": "3.4.21"
       }
     },
-    "@vue/runtime-dom": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.19.tgz",
-      "integrity": "sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==",
-      "requires": {
-        "@vue/runtime-core": "3.4.19",
-        "@vue/shared": "3.4.19",
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
+      "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+      "dependencies": {
+        "@vue/runtime-core": "3.4.21",
+        "@vue/shared": "3.4.21",
         "csstype": "^3.1.3"
       }
     },
-    "@vue/server-renderer": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.19.tgz",
-      "integrity": "sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==",
-      "requires": {
-        "@vue/compiler-ssr": "3.4.19",
-        "@vue/shared": "3.4.19"
+    "node_modules/@vue/server-renderer": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
+      "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.4.21",
+        "@vue/shared": "3.4.21"
+      },
+      "peerDependencies": {
+        "vue": "3.4.21"
       }
     },
-    "@vue/shared": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.19.tgz",
-      "integrity": "sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw=="
+    "node_modules/@vue/shared": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz",
+      "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g=="
     },
-    "@vueuse/core": {
+    "node_modules/@vueuse/core": {
       "version": "9.13.0",
       "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
       "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
-      "requires": {
+      "dependencies": {
         "@types/web-bluetooth": "^0.0.16",
         "@vueuse/metadata": "9.13.0",
         "@vueuse/shared": "9.13.0",
         "vue-demi": "*"
       }
     },
-    "@vueuse/integrations": {
-      "version": "10.7.2",
-      "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-10.7.2.tgz",
-      "integrity": "sha512-+u3RLPFedjASs5EKPc69Ge49WNgqeMfSxFn+qrQTzblPXZg6+EFzhjarS5edj2qAf6xQ93f95TUxRwKStXj/sQ==",
-      "requires": {
-        "@vueuse/core": "10.7.2",
-        "@vueuse/shared": "10.7.2",
-        "vue-demi": ">=0.14.6"
+    "node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.7",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz",
+      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
       },
-      "dependencies": {
-        "@types/web-bluetooth": {
-          "version": "0.0.20",
-          "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
-          "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
-        },
-        "@vueuse/core": {
-          "version": "10.7.2",
-          "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.7.2.tgz",
-          "integrity": "sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==",
-          "requires": {
-            "@types/web-bluetooth": "^0.0.20",
-            "@vueuse/metadata": "10.7.2",
-            "@vueuse/shared": "10.7.2",
-            "vue-demi": ">=0.14.6"
-          }
-        },
-        "@vueuse/metadata": {
-          "version": "10.7.2",
-          "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.7.2.tgz",
-          "integrity": "sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ=="
-        },
-        "@vueuse/shared": {
-          "version": "10.7.2",
-          "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.7.2.tgz",
-          "integrity": "sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==",
-          "requires": {
-            "vue-demi": ">=0.14.6"
-          }
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
         }
       }
     },
-    "@vueuse/metadata": {
+    "node_modules/@vueuse/integrations": {
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-10.9.0.tgz",
+      "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==",
+      "dependencies": {
+        "@vueuse/core": "10.9.0",
+        "@vueuse/shared": "10.9.0",
+        "vue-demi": ">=0.14.7"
+      },
+      "peerDependencies": {
+        "async-validator": "*",
+        "axios": "*",
+        "change-case": "*",
+        "drauu": "*",
+        "focus-trap": "*",
+        "fuse.js": "*",
+        "idb-keyval": "*",
+        "jwt-decode": "*",
+        "nprogress": "*",
+        "qrcode": "*",
+        "sortablejs": "*",
+        "universal-cookie": "*"
+      },
+      "peerDependenciesMeta": {
+        "async-validator": {
+          "optional": true
+        },
+        "axios": {
+          "optional": true
+        },
+        "change-case": {
+          "optional": true
+        },
+        "drauu": {
+          "optional": true
+        },
+        "focus-trap": {
+          "optional": true
+        },
+        "fuse.js": {
+          "optional": true
+        },
+        "idb-keyval": {
+          "optional": true
+        },
+        "jwt-decode": {
+          "optional": true
+        },
+        "nprogress": {
+          "optional": true
+        },
+        "qrcode": {
+          "optional": true
+        },
+        "sortablejs": {
+          "optional": true
+        },
+        "universal-cookie": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/integrations/node_modules/@types/web-bluetooth": {
+      "version": "0.0.20",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+      "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
+    },
+    "node_modules/@vueuse/integrations/node_modules/@vueuse/core": {
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.9.0.tgz",
+      "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.20",
+        "@vueuse/metadata": "10.9.0",
+        "@vueuse/shared": "10.9.0",
+        "vue-demi": ">=0.14.7"
+      }
+    },
+    "node_modules/@vueuse/integrations/node_modules/@vueuse/metadata": {
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.9.0.tgz",
+      "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA=="
+    },
+    "node_modules/@vueuse/integrations/node_modules/@vueuse/shared": {
+      "version": "10.9.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.9.0.tgz",
+      "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==",
+      "dependencies": {
+        "vue-demi": ">=0.14.7"
+      }
+    },
+    "node_modules/@vueuse/integrations/node_modules/vue-demi": {
+      "version": "0.14.7",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz",
+      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/metadata": {
       "version": "9.13.0",
       "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
       "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
     },
-    "@vueuse/shared": {
+    "node_modules/@vueuse/shared": {
       "version": "9.13.0",
       "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
       "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
-      "requires": {
+      "dependencies": {
         "vue-demi": "*"
       }
     },
-    "@wangeditor/basic-modules": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
-      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
-      "requires": {
-        "is-url": "^1.2.4"
+    "node_modules/@vueuse/shared/node_modules/vue-demi": {
+      "version": "0.14.7",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz",
+      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
       }
     },
-    "@wangeditor/code-highlight": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
-      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
-      "requires": {
-        "prismjs": "^1.23.0"
-      }
-    },
-    "@wangeditor/core": {
-      "version": "1.1.19",
-      "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
-      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
-      "requires": {
-        "@types/event-emitter": "^0.3.3",
-        "event-emitter": "^0.3.5",
-        "html-void-elements": "^2.0.0",
-        "i18next": "^20.4.0",
-        "scroll-into-view-if-needed": "^2.2.28",
-        "slate-history": "^0.66.0"
-      }
-    },
-    "@wangeditor/editor": {
+    "node_modules/@wangeditor/editor": {
       "version": "5.1.23",
       "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
       "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
-      "requires": {
+      "dependencies": {
         "@uppy/core": "^2.1.1",
         "@uppy/xhr-upload": "^2.0.3",
         "@wangeditor/basic-modules": "^1.1.7",
@@ -1005,177 +1782,306 @@
         "nanoid": "^3.2.0",
         "slate": "^0.72.0",
         "snabbdom": "^3.1.0"
-      },
-      "dependencies": {
-        "nanoid": {
-          "version": "3.3.7",
-          "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
-          "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
-        }
       }
     },
-    "@wangeditor/editor-for-vue": {
+    "node_modules/@wangeditor/editor-for-vue": {
       "version": "5.1.12",
       "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
-      "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ=="
+      "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
+      "peerDependencies": {
+        "@wangeditor/editor": ">=5.1.0",
+        "vue": "^3.0.5"
+      }
     },
-    "@wangeditor/list-module": {
+    "node_modules/@wangeditor/editor/node_modules/@wangeditor/basic-modules": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+      "dependencies": {
+        "is-url": "^1.2.4"
+      },
+      "peerDependencies": {
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "lodash.throttle": "^4.1.1",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/editor/node_modules/@wangeditor/code-highlight": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+      "dependencies": {
+        "prismjs": "^1.23.0"
+      },
+      "peerDependencies": {
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/editor/node_modules/@wangeditor/core": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
+      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+      "dependencies": {
+        "@types/event-emitter": "^0.3.3",
+        "event-emitter": "^0.3.5",
+        "html-void-elements": "^2.0.0",
+        "i18next": "^20.4.0",
+        "scroll-into-view-if-needed": "^2.2.28",
+        "slate-history": "^0.66.0"
+      },
+      "peerDependencies": {
+        "@uppy/core": "^2.1.1",
+        "@uppy/xhr-upload": "^2.0.3",
+        "dom7": "^3.0.0",
+        "is-hotkey": "^0.2.0",
+        "lodash.camelcase": "^4.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.debounce": "^4.0.8",
+        "lodash.foreach": "^4.5.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "lodash.toarray": "^4.4.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "node_modules/@wangeditor/editor/node_modules/@wangeditor/list-module": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
-      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ=="
+      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
+      "peerDependencies": {
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
     },
-    "@wangeditor/table-module": {
+    "node_modules/@wangeditor/editor/node_modules/@wangeditor/table-module": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
-      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w=="
+      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==",
+      "peerDependencies": {
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
     },
-    "@wangeditor/upload-image-module": {
+    "node_modules/@wangeditor/editor/node_modules/@wangeditor/upload-image-module": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
-      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA=="
+      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==",
+      "peerDependencies": {
+        "@uppy/core": "^2.0.3",
+        "@uppy/xhr-upload": "^2.0.3",
+        "@wangeditor/basic-modules": "1.x",
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "lodash.foreach": "^4.5.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
     },
-    "@wangeditor/video-module": {
+    "node_modules/@wangeditor/editor/node_modules/@wangeditor/video-module": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
-      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg=="
+      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==",
+      "peerDependencies": {
+        "@uppy/core": "^2.1.4",
+        "@uppy/xhr-upload": "^2.0.7",
+        "@wangeditor/core": "1.x",
+        "dom7": "^3.0.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
     },
-    "acorn": {
+    "node_modules/@wangeditor/editor/node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/acorn": {
       "version": "8.11.3",
       "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz",
       "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
-      "dev": true
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
     },
-    "acorn-jsx": {
+    "node_modules/acorn-jsx": {
       "version": "5.3.2",
       "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
       "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-      "dev": true
+      "dev": true,
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
     },
-    "ajv": {
+    "node_modules/adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
         "json-schema-traverse": "^0.4.1",
         "uri-js": "^4.2.2"
       }
     },
-    "animate.css": {
+    "node_modules/animate.css": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz",
       "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
     },
-    "ansi-regex": {
+    "node_modules/ansi-regex": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "ansi-styles": {
+    "node_modules/ansi-styles": {
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "requires": {
+      "dependencies": {
         "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "anymatch": {
+    "node_modules/anymatch": {
       "version": "3.1.3",
       "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
       "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "normalize-path": "^3.0.0",
         "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "argparse": {
+    "node_modules/argparse": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
       "dev": true
     },
-    "array-buffer-byte-length": {
+    "node_modules/array-buffer-byte-length": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
       "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.5",
         "is-array-buffer": "^3.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "array-includes": {
+    "node_modules/array-includes": {
       "version": "3.1.7",
       "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.7.tgz",
       "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.2.0",
         "es-abstract": "^1.22.1",
         "get-intrinsic": "^1.2.1",
         "is-string": "^1.0.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "array.prototype.filter": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz",
-      "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "es-array-method-boxes-properly": "^1.0.0",
-        "is-string": "^1.0.7"
-      }
-    },
-    "array.prototype.findlastindex": {
+    "node_modules/array.prototype.findlastindex": {
       "version": "1.2.4",
       "resolved": "https://registry.npmmirror.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz",
       "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.5",
         "define-properties": "^1.2.1",
         "es-abstract": "^1.22.3",
         "es-errors": "^1.3.0",
         "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "array.prototype.flat": {
+    "node_modules/array.prototype.flat": {
       "version": "1.3.2",
       "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
       "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.2.0",
         "es-abstract": "^1.22.1",
         "es-shim-unscopables": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "array.prototype.flatmap": {
+    "node_modules/array.prototype.flatmap": {
       "version": "1.3.2",
       "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
       "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.2.0",
         "es-abstract": "^1.22.1",
         "es-shim-unscopables": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "arraybuffer.prototype.slice": {
+    "node_modules/arraybuffer.prototype.slice": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
       "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "array-buffer-byte-length": "^1.0.1",
         "call-bind": "^1.0.5",
         "define-properties": "^1.2.1",
@@ -1184,172 +2090,248 @@
         "get-intrinsic": "^1.2.3",
         "is-array-buffer": "^3.0.4",
         "is-shared-array-buffer": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "async-validator": {
+    "node_modules/async-validator": {
       "version": "4.2.5",
       "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
       "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
     },
-    "asynckit": {
+    "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
-    "atob": {
+    "node_modules/atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "bin": {
+        "atob": "bin/atob.js"
+      },
+      "engines": {
+        "node": ">= 4.5.0"
+      }
     },
-    "autofit.js": {
+    "node_modules/autofit.js": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/autofit.js/-/autofit.js-3.1.0.tgz",
       "integrity": "sha512-zX/2VbpxdDcgDDCT1A0psuF8Phs8QbmFXstvLkqrrOcv33LQttCh2J6GVs84585+LfMAfacemxRXIidrFXu02g=="
     },
-    "autoprefixer": {
-      "version": "10.4.17",
-      "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.17.tgz",
-      "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==",
+    "node_modules/autoprefixer": {
+      "version": "10.4.18",
+      "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.18.tgz",
+      "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==",
       "dev": true,
-      "requires": {
-        "browserslist": "^4.22.2",
-        "caniuse-lite": "^1.0.30001578",
+      "dependencies": {
+        "browserslist": "^4.23.0",
+        "caniuse-lite": "^1.0.30001591",
         "fraction.js": "^4.3.7",
         "normalize-range": "^0.1.2",
         "picocolors": "^1.0.0",
         "postcss-value-parser": "^4.2.0"
+      },
+      "bin": {
+        "autoprefixer": "bin/autoprefixer"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
       }
     },
-    "available-typed-arrays": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz",
-      "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==",
-      "dev": true
+    "node_modules/available-typed-arrays": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "dev": true,
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
-    "axios": {
-      "version": "1.6.7",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.7.tgz",
-      "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==",
-      "requires": {
-        "follow-redirects": "^1.15.4",
+    "node_modules/axios": {
+      "version": "1.6.8",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz",
+      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
         "form-data": "^4.0.0",
         "proxy-from-env": "^1.1.0"
       }
     },
-    "balanced-match": {
+    "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
-    "base64-arraybuffer": {
+    "node_modules/base64-arraybuffer": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
-      "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="
+      "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
+      "engines": {
+        "node": ">= 0.6.0"
+      }
     },
-    "binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
-      "dev": true
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "boolbase": {
+    "node_modules/boolbase": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
       "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
       "dev": true
     },
-    "brace-expansion": {
+    "node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
-    "braces": {
+    "node_modules/braces": {
       "version": "3.0.2",
       "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "browserslist": {
+    "node_modules/browserslist": {
       "version": "4.23.0",
       "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz",
       "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "caniuse-lite": "^1.0.30001587",
         "electron-to-chromium": "^1.4.668",
         "node-releases": "^2.0.14",
         "update-browserslist-db": "^1.0.13"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
       }
     },
-    "btoa": {
+    "node_modules/btoa": {
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/btoa/-/btoa-1.2.1.tgz",
-      "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
+      "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
+      "bin": {
+        "btoa": "bin/btoa.js"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
     },
-    "builtins": {
+    "node_modules/builtins": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/builtins/-/builtins-5.0.1.tgz",
       "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
       "dev": true,
-      "requires": {
-        "semver": "^7.0.0"
-      },
       "dependencies": {
-        "semver": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
-          "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
+        "semver": "^7.0.0"
       }
     },
-    "call-bind": {
+    "node_modules/builtins/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/builtins/node_modules/semver": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
+      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/builtins/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "node_modules/call-bind": {
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
       "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
-      "requires": {
+      "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
         "get-intrinsic": "^1.2.4",
         "set-function-length": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "callsites": {
+    "node_modules/callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
       "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
     },
-    "camelcase": {
+    "node_modules/camelcase": {
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "engines": {
+        "node": ">=6"
+      }
     },
-    "caniuse-lite": {
-      "version": "1.0.30001588",
-      "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz",
-      "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==",
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001599",
+      "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz",
+      "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==",
       "dev": true
     },
-    "canvg": {
+    "node_modules/canvg": {
       "version": "3.0.10",
       "resolved": "https://registry.npmmirror.com/canvg/-/canvg-3.0.10.tgz",
       "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==",
       "optional": true,
-      "requires": {
+      "dependencies": {
         "@babel/runtime": "^7.12.5",
         "@types/raf": "^3.4.0",
         "core-js": "^3.8.3",
@@ -1359,248 +2341,381 @@
         "stackblur-canvas": "^2.0.0",
         "svg-pathdata": "^6.0.3"
       },
-      "dependencies": {
-        "regenerator-runtime": {
-          "version": "0.13.11",
-          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
-          "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
-          "optional": true
-        }
+      "engines": {
+        "node": ">=10.0.0"
       }
     },
-    "chalk": {
+    "node_modules/canvg/node_modules/regenerator-runtime": {
+      "version": "0.13.11",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+      "optional": true
+    },
+    "node_modules/cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/chalk": {
       "version": "4.1.2",
       "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "chokidar": {
+    "node_modules/chokidar": {
       "version": "3.6.0",
       "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
       "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
-        "fsevents": "~2.3.2",
         "glob-parent": "~5.1.2",
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
         "normalize-path": "~3.0.0",
         "readdirp": "~3.6.0"
       },
-      "dependencies": {
-        "glob-parent": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
-          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        }
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
       }
     },
-    "cliui": {
+    "node_modules/chokidar/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/cliui": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
       "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-      "requires": {
+      "dependencies": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.0",
         "wrap-ansi": "^6.2.0"
       }
     },
-    "color-convert": {
+    "node_modules/codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "requires": {
+      "dependencies": {
         "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
       }
     },
-    "color-name": {
+    "node_modules/color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
-    "combined-stream": {
+    "node_modules/combined-stream": {
       "version": "1.0.8",
       "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "requires": {
+      "dependencies": {
         "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
       }
     },
-    "compute-scroll-into-view": {
+    "node_modules/compute-scroll-into-view": {
       "version": "1.0.20",
       "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
       "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
     },
-    "concat-map": {
+    "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
       "dev": true
     },
-    "core-js": {
-      "version": "3.36.0",
-      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.36.0.tgz",
-      "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==",
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true,
+      "peer": true
+    },
+    "node_modules/core-js": {
+      "version": "3.36.1",
+      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.36.1.tgz",
+      "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==",
+      "hasInstallScript": true,
       "optional": true
     },
-    "countup.js": {
+    "node_modules/countup.js": {
       "version": "2.8.0",
       "resolved": "https://registry.npmmirror.com/countup.js/-/countup.js-2.8.0.tgz",
       "integrity": "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ=="
     },
-    "cross-spawn": {
+    "node_modules/crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+      "bin": {
+        "crc32": "bin/crc32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
         "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "css-line-break": {
+    "node_modules/css-line-break": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz",
       "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
-      "requires": {
+      "dependencies": {
         "utrie": "^1.0.2"
       }
     },
-    "cssesc": {
+    "node_modules/cssesc": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
       "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
-      "dev": true
+      "dev": true,
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
     },
-    "csstype": {
+    "node_modules/csstype": {
       "version": "3.1.3",
       "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
       "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
     },
-    "d": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz",
-      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
-      "requires": {
-        "es5-ext": "^0.10.50",
-        "type": "^1.0.1"
+    "node_modules/d": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz",
+      "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+      "dependencies": {
+        "es5-ext": "^0.10.64",
+        "type": "^2.7.2"
+      },
+      "engines": {
+        "node": ">=0.12"
       }
     },
-    "dayjs": {
+    "node_modules/data-view-buffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/data-view-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/data-view-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/dayjs": {
       "version": "1.11.10",
       "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz",
       "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
     },
-    "debug": {
+    "node_modules/debug": {
       "version": "4.3.4",
       "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "decamelize": {
+    "node_modules/decamelize": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
+      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "deep-is": {
+    "node_modules/deep-is": {
       "version": "0.1.4",
       "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true
     },
-    "define-data-property": {
+    "node_modules/define-data-property": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
       "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
-      "requires": {
+      "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
         "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "define-properties": {
+    "node_modules/define-properties": {
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
       "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "define-data-property": "^1.0.1",
         "has-property-descriptors": "^1.0.0",
         "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "delayed-stream": {
+    "node_modules/delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
     },
-    "dijkstrajs": {
+    "node_modules/dijkstrajs": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
       "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
     },
-    "doctrine": {
+    "node_modules/doctrine": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
       "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
       }
     },
-    "dom7": {
+    "node_modules/dom7": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
       "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
-      "requires": {
+      "dependencies": {
         "ssr-window": "^3.0.0-alpha.1"
       }
     },
-    "dommatrix": {
+    "node_modules/dommatrix": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/dommatrix/-/dommatrix-1.0.3.tgz",
-      "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww=="
+      "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==",
+      "deprecated": "dommatrix is no longer maintained. Please use @thednp/dommatrix."
     },
-    "dompurify": {
+    "node_modules/dompurify": {
       "version": "2.4.7",
       "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-2.4.7.tgz",
       "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==",
       "optional": true
     },
-    "echarts": {
+    "node_modules/echarts": {
       "version": "5.5.0",
       "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz",
       "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==",
-      "requires": {
+      "dependencies": {
         "tslib": "2.3.0",
         "zrender": "5.5.0"
       }
     },
-    "electron-to-chromium": {
-      "version": "1.4.673",
-      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz",
-      "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==",
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.710",
+      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.710.tgz",
+      "integrity": "sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA==",
       "dev": true
     },
-    "element-plus": {
-      "version": "2.5.6",
-      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.5.6.tgz",
-      "integrity": "sha512-zctKTiyIDmcnMp3K5WG1hglgraW9EbiCLiIDVtaMCS5mPMl2fRKdS0vOFGnECIq9taFoxnyoDwxHD81nv0B4RA==",
-      "requires": {
+    "node_modules/element-plus": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.6.1.tgz",
+      "integrity": "sha512-6VRpLjwtIVdtUuITJPPKtpOH1NM6nuAkRE3q5O4Lrx0N1bYMhTkiqb2Jy7zfQuDPbOIkkF2OABTzegpNnzgsnQ==",
+      "dependencies": {
         "@ctrl/tinycolor": "^3.4.1",
         "@element-plus/icons-vue": "^2.3.1",
         "@floating-ui/dom": "^1.0.1",
@@ -1617,42 +2732,45 @@
         "memoize-one": "^6.0.0",
         "normalize-wheel-es": "^1.2.0"
       },
-      "dependencies": {
-        "@popperjs/core": {
-          "version": "npm:@sxzz/popperjs-es@2.11.7",
-          "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
-          "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
-        }
+      "peerDependencies": {
+        "vue": "^3.2.0"
       }
     },
-    "emoji-regex": {
+    "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
-    "encode-utf8": {
+    "node_modules/encode-utf8": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/encode-utf8/-/encode-utf8-1.0.3.tgz",
       "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
     },
-    "entities": {
+    "node_modules/entities": {
       "version": "4.5.0",
       "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
-      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      }
     },
-    "es-abstract": {
-      "version": "1.22.4",
-      "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.4.tgz",
-      "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==",
+    "node_modules/es-abstract": {
+      "version": "1.23.2",
+      "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.23.2.tgz",
+      "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "array-buffer-byte-length": "^1.0.1",
         "arraybuffer.prototype.slice": "^1.0.3",
-        "available-typed-arrays": "^1.0.6",
+        "available-typed-arrays": "^1.0.7",
         "call-bind": "^1.0.7",
+        "data-view-buffer": "^1.0.1",
+        "data-view-byte-length": "^1.0.1",
+        "data-view-byte-offset": "^1.0.0",
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
-        "es-set-tostringtag": "^2.0.2",
+        "es-object-atoms": "^1.0.0",
+        "es-set-tostringtag": "^2.0.3",
         "es-to-primitive": "^1.2.1",
         "function.prototype.name": "^1.1.6",
         "get-intrinsic": "^1.2.4",
@@ -1660,15 +2778,16 @@
         "globalthis": "^1.0.3",
         "gopd": "^1.0.1",
         "has-property-descriptors": "^1.0.2",
-        "has-proto": "^1.0.1",
+        "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "hasown": "^2.0.1",
+        "hasown": "^2.0.2",
         "internal-slot": "^1.0.7",
         "is-array-buffer": "^3.0.4",
         "is-callable": "^1.2.7",
-        "is-negative-zero": "^2.0.2",
+        "is-data-view": "^1.0.1",
+        "is-negative-zero": "^2.0.3",
         "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.2",
+        "is-shared-array-buffer": "^1.0.3",
         "is-string": "^1.0.7",
         "is-typed-array": "^1.1.13",
         "is-weakref": "^1.0.2",
@@ -1676,105 +2795,140 @@
         "object-keys": "^1.1.1",
         "object.assign": "^4.1.5",
         "regexp.prototype.flags": "^1.5.2",
-        "safe-array-concat": "^1.1.0",
+        "safe-array-concat": "^1.1.2",
         "safe-regex-test": "^1.0.3",
-        "string.prototype.trim": "^1.2.8",
-        "string.prototype.trimend": "^1.0.7",
+        "string.prototype.trim": "^1.2.9",
+        "string.prototype.trimend": "^1.0.8",
         "string.prototype.trimstart": "^1.0.7",
-        "typed-array-buffer": "^1.0.1",
-        "typed-array-byte-length": "^1.0.0",
-        "typed-array-byte-offset": "^1.0.0",
-        "typed-array-length": "^1.0.4",
+        "typed-array-buffer": "^1.0.2",
+        "typed-array-byte-length": "^1.0.1",
+        "typed-array-byte-offset": "^1.0.2",
+        "typed-array-length": "^1.0.5",
         "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.14"
+        "which-typed-array": "^1.1.15"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "es-array-method-boxes-properly": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
-      "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
-      "dev": true
-    },
-    "es-define-property": {
+    "node_modules/es-define-property": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz",
       "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
-      "requires": {
+      "dependencies": {
         "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "es-errors": {
+    "node_modules/es-errors": {
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
-    },
-    "es-set-tostringtag": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
-      "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
-      "dev": true,
-      "requires": {
-        "get-intrinsic": "^1.2.2",
-        "has-tostringtag": "^1.0.0",
-        "hasown": "^2.0.0"
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "es-shim-unscopables": {
+    "node_modules/es-object-atoms": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+      "dev": true,
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+      "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+      "dev": true,
+      "dependencies": {
+        "get-intrinsic": "^1.2.4",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-shim-unscopables": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
       "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "hasown": "^2.0.0"
       }
     },
-    "es-to-primitive": {
+    "node_modules/es-to-primitive": {
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
       "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "is-callable": "^1.1.4",
         "is-date-object": "^1.0.1",
         "is-symbol": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "es5-ext": {
+    "node_modules/es5-ext": {
       "version": "0.10.64",
       "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz",
       "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
-      "requires": {
+      "hasInstallScript": true,
+      "dependencies": {
         "es6-iterator": "^2.0.3",
         "es6-symbol": "^3.1.3",
         "esniff": "^2.0.1",
         "next-tick": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
       }
     },
-    "es6-iterator": {
+    "node_modules/es6-iterator": {
       "version": "2.0.3",
       "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
       "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
-      "requires": {
+      "dependencies": {
         "d": "1",
         "es5-ext": "^0.10.35",
         "es6-symbol": "^3.1.1"
       }
     },
-    "es6-symbol": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz",
-      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
-      "requires": {
-        "d": "^1.0.1",
-        "ext": "^1.1.2"
+    "node_modules/es6-symbol": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
+      "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+      "dependencies": {
+        "d": "^1.0.2",
+        "ext": "^1.7.0"
+      },
+      "engines": {
+        "node": ">=0.12"
       }
     },
-    "esbuild": {
+    "node_modules/esbuild": {
       "version": "0.18.20",
       "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz",
       "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
       "dev": true,
-      "requires": {
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
         "@esbuild/android-arm": "0.18.20",
         "@esbuild/android-arm64": "0.18.20",
         "@esbuild/android-x64": "0.18.20",
@@ -1799,34 +2953,40 @@
         "@esbuild/win32-x64": "0.18.20"
       }
     },
-    "escalade": {
+    "node_modules/escalade": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz",
       "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
     },
-    "escape-html": {
+    "node_modules/escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
     },
-    "escape-string-regexp": {
+    "node_modules/escape-string-regexp": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
       "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true
-    },
-    "eslint": {
-      "version": "8.56.0",
-      "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.56.0.tgz",
-      "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
       "dev": true,
-      "requires": {
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "8.57.0",
+      "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz",
+      "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+      "dev": true,
+      "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.6.1",
         "@eslint/eslintrc": "^2.1.4",
-        "@eslint/js": "8.56.0",
-        "@humanwhocodes/config-array": "^0.11.13",
+        "@eslint/js": "8.57.0",
+        "@humanwhocodes/config-array": "^0.11.14",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
         "@ungap/structured-clone": "^1.2.0",
@@ -1861,133 +3021,129 @@
         "strip-ansi": "^6.0.1",
         "text-table": "^0.2.0"
       },
-      "dependencies": {
-        "find-up": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
-          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^6.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
-          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^5.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
-          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-          "dev": true,
-          "requires": {
-            "yocto-queue": "^0.1.0"
-          }
-        },
-        "p-locate": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
-          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^3.0.2"
-          }
-        }
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "eslint-config-prettier": {
+    "node_modules/eslint-config-prettier": {
       "version": "8.10.0",
       "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
       "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
-      "dev": true
+      "dev": true,
+      "bin": {
+        "eslint-config-prettier": "bin/cli.js"
+      },
+      "peerDependencies": {
+        "eslint": ">=7.0.0"
+      }
     },
-    "eslint-config-standard": {
+    "node_modules/eslint-config-standard": {
       "version": "17.1.0",
       "resolved": "https://registry.npmmirror.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz",
       "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^8.0.1",
+        "eslint-plugin-import": "^2.25.2",
+        "eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
+        "eslint-plugin-promise": "^6.0.0"
+      }
     },
-    "eslint-import-resolver-node": {
+    "node_modules/eslint-import-resolver-node": {
       "version": "0.3.9",
       "resolved": "https://registry.npmmirror.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
       "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "debug": "^3.2.7",
         "is-core-module": "^2.13.0",
         "resolve": "^1.22.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        }
       }
     },
-    "eslint-module-utils": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
-      "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+    "node_modules/eslint-import-resolver-node/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-module-utils": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz",
+      "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==",
+      "dev": true,
+      "dependencies": {
         "debug": "^3.2.7"
       },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependenciesMeta": {
+        "eslint": {
+          "optional": true
         }
       }
     },
-    "eslint-plugin-es": {
+    "node_modules/eslint-module-utils/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-plugin-es": {
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
       "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "eslint-utils": "^2.0.0",
         "regexpp": "^3.0.0"
       },
-      "dependencies": {
-        "eslint-utils": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-2.1.0.tgz",
-          "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
-          "dev": true,
-          "requires": {
-            "eslint-visitor-keys": "^1.1.0"
-          }
-        },
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
+      "engines": {
+        "node": ">=8.10.0"
+      },
+      "peerDependencies": {
+        "eslint": ">=4.19.1"
       }
     },
-    "eslint-plugin-import": {
+    "node_modules/eslint-plugin-es/node_modules/eslint-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+      "dev": true,
+      "dependencies": {
+        "eslint-visitor-keys": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/eslint-plugin-import": {
       "version": "2.29.1",
       "resolved": "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
       "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "array-includes": "^3.1.7",
         "array.prototype.findlastindex": "^1.2.3",
         "array.prototype.flat": "^1.3.2",
@@ -2006,33 +3162,40 @@
         "semver": "^6.3.1",
         "tsconfig-paths": "^3.15.0"
       },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "doctrine": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz",
-          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
-          "dev": true,
-          "requires": {
-            "esutils": "^2.0.2"
-          }
-        }
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
       }
     },
-    "eslint-plugin-n": {
+    "node_modules/eslint-plugin-import/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-plugin-import/node_modules/doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "dev": true,
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eslint-plugin-n": {
       "version": "15.7.0",
       "resolved": "https://registry.npmmirror.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz",
       "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "builtins": "^5.0.1",
         "eslint-plugin-es": "^4.1.0",
         "eslint-utils": "^3.0.0",
@@ -2042,1896 +3205,2517 @@
         "resolve": "^1.22.1",
         "semver": "^7.3.8"
       },
-      "dependencies": {
-        "semver": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
-          "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
+      "engines": {
+        "node": ">=12.22.0"
+      },
+      "peerDependencies": {
+        "eslint": ">=7.0.0"
       }
     },
-    "eslint-plugin-prettier": {
+    "node_modules/eslint-plugin-n/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/eslint-plugin-n/node_modules/semver": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
+      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/eslint-plugin-n/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "node_modules/eslint-plugin-prettier": {
       "version": "4.2.1",
       "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
       "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
       "dev": true,
-      "requires": {
-        "prettier-linter-helpers": "^1.0.0"
-      }
-    },
-    "eslint-plugin-promise": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmmirror.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz",
-      "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==",
-      "dev": true
-    },
-    "eslint-plugin-vue": {
-      "version": "9.21.1",
-      "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.21.1.tgz",
-      "integrity": "sha512-XVtI7z39yOVBFJyi8Ljbn7kY9yHzznKXL02qQYn+ta63Iy4A9JFBw6o4OSB9hyD2++tVT+su9kQqetUyCCwhjw==",
-      "dev": true,
-      "requires": {
-        "@eslint-community/eslint-utils": "^4.4.0",
-        "natural-compare": "^1.4.0",
-        "nth-check": "^2.1.1",
-        "postcss-selector-parser": "^6.0.13",
-        "semver": "^7.5.4",
-        "vue-eslint-parser": "^9.4.2",
-        "xml-name-validator": "^4.0.0"
-      },
       "dependencies": {
-        "semver": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
-          "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
+        "prettier-linter-helpers": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "eslint": ">=7.28.0",
+        "prettier": ">=2.0.0"
+      },
+      "peerDependenciesMeta": {
+        "eslint-config-prettier": {
+          "optional": true
         }
       }
     },
-    "eslint-scope": {
+    "node_modules/eslint-plugin-promise": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmmirror.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz",
+      "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-vue": {
+      "version": "9.23.0",
+      "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.23.0.tgz",
+      "integrity": "sha512-Bqd/b7hGYGrlV+wP/g77tjyFmp81lh5TMw0be9093X02SyelxRRfCI6/IsGq/J7Um0YwB9s0Ry0wlFyjPdmtUw==",
+      "dev": true,
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "natural-compare": "^1.4.0",
+        "nth-check": "^2.1.1",
+        "postcss-selector-parser": "^6.0.15",
+        "semver": "^7.6.0",
+        "vue-eslint-parser": "^9.4.2",
+        "xml-name-validator": "^4.0.0"
+      },
+      "engines": {
+        "node": "^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-vue/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/eslint-plugin-vue/node_modules/semver": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
+      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/eslint-plugin-vue/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "node_modules/eslint-scope": {
       "version": "7.2.2",
       "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz",
       "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "eslint-utils": {
+    "node_modules/eslint-utils": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz",
       "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "eslint-visitor-keys": "^2.0.0"
       },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-          "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-          "dev": true
-        }
+      "engines": {
+        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+      },
+      "peerDependencies": {
+        "eslint": ">=5"
       }
     },
-    "eslint-visitor-keys": {
+    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
       "version": "3.4.3",
       "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
       "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
     },
-    "esniff": {
+    "node_modules/esniff": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz",
       "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
-      "requires": {
+      "dependencies": {
         "d": "^1.0.1",
         "es5-ext": "^0.10.62",
         "event-emitter": "^0.3.5",
         "type": "^2.7.2"
       },
-      "dependencies": {
-        "type": {
-          "version": "2.7.2",
-          "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz",
-          "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
-        }
+      "engines": {
+        "node": ">=0.10"
       }
     },
-    "espree": {
+    "node_modules/espree": {
       "version": "9.6.1",
       "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz",
       "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "acorn": "^8.9.0",
         "acorn-jsx": "^5.3.2",
         "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "esquery": {
+    "node_modules/esquery": {
       "version": "1.5.0",
       "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz",
       "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
       }
     },
-    "esrecurse": {
+    "node_modules/esrecurse": {
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
       }
     },
-    "estraverse": {
+    "node_modules/estraverse": {
       "version": "5.3.0",
       "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
       "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=4.0"
+      }
     },
-    "estree-walker": {
+    "node_modules/estree-walker": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
-    "esutils": {
+    "node_modules/esutils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
       "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "event-emitter": {
+    "node_modules/event-emitter": {
       "version": "0.3.5",
       "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
       "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
-      "requires": {
+      "dependencies": {
         "d": "1",
         "es5-ext": "~0.10.14"
       }
     },
-    "ext": {
+    "node_modules/ext": {
       "version": "1.7.0",
       "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
       "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
-      "requires": {
-        "type": "^2.7.2"
-      },
       "dependencies": {
-        "type": {
-          "version": "2.7.2",
-          "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz",
-          "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
-        }
+        "type": "^2.7.2"
       }
     },
-    "fast-deep-equal": {
+    "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "dev": true
     },
-    "fast-diff": {
+    "node_modules/fast-diff": {
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz",
       "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
       "dev": true
     },
-    "fast-glob": {
+    "node_modules/fast-glob": {
       "version": "3.3.2",
       "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
       "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@nodelib/fs.stat": "^2.0.2",
         "@nodelib/fs.walk": "^1.2.3",
         "glob-parent": "^5.1.2",
         "merge2": "^1.3.0",
         "micromatch": "^4.0.4"
       },
-      "dependencies": {
-        "glob-parent": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
-          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        }
+      "engines": {
+        "node": ">=8.6.0"
       }
     },
-    "fast-json-stable-stringify": {
+    "node_modules/fast-glob/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
       "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
       "dev": true
     },
-    "fast-levenshtein": {
+    "node_modules/fast-levenshtein": {
       "version": "2.0.6",
       "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
       "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
       "dev": true
     },
-    "fastq": {
+    "node_modules/fastq": {
       "version": "1.17.1",
       "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
       "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "reusify": "^1.0.4"
       }
     },
-    "fflate": {
+    "node_modules/fflate": {
       "version": "0.4.8",
       "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.4.8.tgz",
       "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="
     },
-    "file-entry-cache": {
+    "node_modules/file-entry-cache": {
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
       "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "flat-cache": "^3.0.4"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "fill-range": {
+    "node_modules/fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
       "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "requires": {
-        "locate-path": "^5.0.0",
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^6.0.0",
         "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "flat-cache": {
+    "node_modules/flat-cache": {
       "version": "3.2.0",
       "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz",
       "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "flatted": "^3.2.9",
         "keyv": "^4.5.3",
         "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "flatted": {
-      "version": "3.2.9",
-      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz",
-      "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+    "node_modules/flatted": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz",
+      "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
       "dev": true
     },
-    "follow-redirects": {
-      "version": "1.15.5",
-      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.5.tgz",
-      "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw=="
+    "node_modules/follow-redirects": {
+      "version": "1.15.6",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz",
+      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
     },
-    "for-each": {
+    "node_modules/for-each": {
       "version": "0.3.3",
       "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz",
       "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "is-callable": "^1.1.3"
       }
     },
-    "form-data": {
+    "node_modules/form-data": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
       "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-      "requires": {
+      "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
         "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
       }
     },
-    "fraction.js": {
+    "node_modules/frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/fraction.js": {
       "version": "4.3.7",
       "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz",
       "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": "*"
+      }
     },
-    "fs.realpath": {
+    "node_modules/fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
       "dev": true
     },
-    "fsevents": {
+    "node_modules/fsevents": {
       "version": "2.3.3",
       "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
       "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
-      "optional": true
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
     },
-    "function-bind": {
+    "node_modules/function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
     },
-    "function.prototype.name": {
+    "node_modules/function.prototype.name": {
       "version": "1.1.6",
       "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
       "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.2.0",
         "es-abstract": "^1.22.1",
         "functions-have-names": "^1.2.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "functions-have-names": {
+    "node_modules/functions-have-names": {
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
       "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
       "dev": true
     },
-    "get-caller-file": {
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true,
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-caller-file": {
       "version": "2.0.5",
       "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
     },
-    "get-intrinsic": {
+    "node_modules/get-intrinsic": {
       "version": "1.2.4",
       "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
       "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
-      "requires": {
+      "dependencies": {
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
         "has-proto": "^1.0.1",
         "has-symbols": "^1.0.3",
         "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "get-symbol-description": {
+    "node_modules/get-symbol-description": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
       "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.5",
         "es-errors": "^1.3.0",
         "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "glob": {
+    "node_modules/glob": {
       "version": "7.2.3",
       "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
         "inherits": "2",
         "minimatch": "^3.1.1",
         "once": "^1.3.0",
         "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
       }
     },
-    "glob-parent": {
+    "node_modules/glob-parent": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz",
       "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
       }
     },
-    "globals": {
+    "node_modules/globals": {
       "version": "13.24.0",
       "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
       "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "globalthis": {
+    "node_modules/globalthis": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz",
       "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "define-properties": "^1.1.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "gopd": {
+    "node_modules/gopd": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
       "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
-      "requires": {
+      "dependencies": {
         "get-intrinsic": "^1.1.3"
       }
     },
-    "graphemer": {
+    "node_modules/graphemer": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz",
       "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
       "dev": true
     },
-    "has-bigints": {
+    "node_modules/has-bigints": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz",
       "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
       "dev": true
     },
-    "has-flag": {
+    "node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "has-property-descriptors": {
+    "node_modules/has-property-descriptors": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
       "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
-      "requires": {
+      "dependencies": {
         "es-define-property": "^1.0.0"
       }
     },
-    "has-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz",
-      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
+    "node_modules/has-proto": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
-    "has-symbols": {
+    "node_modules/has-symbols": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
-    "has-tostringtag": {
+    "node_modules/has-tostringtag": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
       "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "hasown": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.1.tgz",
-      "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
-      "requires": {
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dependencies": {
         "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "html-void-elements": {
+    "node_modules/html-void-elements": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
       "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
     },
-    "html2canvas": {
+    "node_modules/html2canvas": {
       "version": "1.4.1",
       "resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
       "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
-      "requires": {
+      "dependencies": {
         "css-line-break": "^2.1.0",
         "text-segmentation": "^1.0.3"
+      },
+      "engines": {
+        "node": ">=8.0.0"
       }
     },
-    "i18next": {
+    "node_modules/i18next": {
       "version": "20.6.1",
       "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
       "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
-      "requires": {
+      "dependencies": {
         "@babel/runtime": "^7.12.0"
       }
     },
-    "ignore": {
+    "node_modules/ignore": {
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz",
       "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
     },
-    "immer": {
+    "node_modules/immer": {
       "version": "9.0.21",
       "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
       "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
     },
-    "immutable": {
+    "node_modules/immutable": {
       "version": "4.3.5",
       "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.5.tgz",
       "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==",
       "dev": true
     },
-    "import-fresh": {
+    "node_modules/import-fresh": {
       "version": "3.3.0",
       "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
       "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
       }
     },
-    "imurmurhash": {
+    "node_modules/imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
       "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.19"
+      }
     },
-    "inflight": {
+    "node_modules/inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
       }
     },
-    "inherits": {
+    "node_modules/inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "dev": true
     },
-    "internal-slot": {
+    "node_modules/internal-slot": {
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.7.tgz",
       "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "es-errors": "^1.3.0",
         "hasown": "^2.0.0",
         "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-array-buffer": {
+    "node_modules/is-array-buffer": {
       "version": "3.0.4",
       "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
       "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "get-intrinsic": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-bigint": {
+    "node_modules/is-bigint": {
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz",
       "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "has-bigints": "^1.0.1"
       }
     },
-    "is-binary-path": {
+    "node_modules/is-binary-path": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
       "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "is-boolean-object": {
+    "node_modules/is-boolean-object": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
       "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-callable": {
+    "node_modules/is-callable": {
       "version": "1.2.7",
       "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz",
       "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
-    "is-core-module": {
+    "node_modules/is-core-module": {
       "version": "2.13.1",
       "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz",
       "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "hasown": "^2.0.0"
       }
     },
-    "is-date-object": {
+    "node_modules/is-data-view": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.1.tgz",
+      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+      "dev": true,
+      "dependencies": {
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-date-object": {
       "version": "1.0.5",
       "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz",
       "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-extglob": {
+    "node_modules/is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "is-fullwidth-code-point": {
+    "node_modules/is-fullwidth-code-point": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "is-glob": {
+    "node_modules/is-glob": {
       "version": "4.0.3",
       "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
       "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "is-hotkey": {
+    "node_modules/is-hotkey": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
       "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
     },
-    "is-negative-zero": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
-      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
-      "dev": true
+    "node_modules/is-negative-zero": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
-    "is-number": {
+    "node_modules/is-number": {
       "version": "7.0.0",
       "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
     },
-    "is-number-object": {
+    "node_modules/is-number-object": {
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz",
       "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-path-inside": {
+    "node_modules/is-path-inside": {
       "version": "3.0.3",
       "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz",
       "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "is-plain-object": {
+    "node_modules/is-plain-object": {
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
-      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "is-regex": {
+    "node_modules/is-regex": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz",
       "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-shared-array-buffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
-      "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+    "node_modules/is-shared-array-buffer": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
       "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2"
+      "dependencies": {
+        "call-bind": "^1.0.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-string": {
+    "node_modules/is-string": {
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz",
       "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-symbol": {
+    "node_modules/is-symbol": {
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz",
       "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "has-symbols": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-typed-array": {
+    "node_modules/is-typed-array": {
       "version": "1.1.13",
       "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.13.tgz",
       "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "which-typed-array": "^1.1.14"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "is-url": {
+    "node_modules/is-url": {
       "version": "1.2.4",
       "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
       "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
     },
-    "is-weakref": {
+    "node_modules/is-weakref": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz",
       "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2"
       }
     },
-    "isarray": {
+    "node_modules/isarray": {
       "version": "2.0.5",
       "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz",
       "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
       "dev": true
     },
-    "isexe": {
+    "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
       "dev": true
     },
-    "js-tokens": {
+    "node_modules/js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
       "dev": true
     },
-    "js-yaml": {
+    "node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
       "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
       }
     },
-    "jsesc": {
+    "node_modules/jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",
       "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
+      "dev": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
     },
-    "json-buffer": {
+    "node_modules/json-buffer": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz",
       "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
       "dev": true
     },
-    "json-schema-traverse": {
+    "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
       "dev": true
     },
-    "json-stable-stringify-without-jsonify": {
+    "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
       "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
       "dev": true
     },
-    "json5": {
+    "node_modules/json5": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz",
       "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
       }
     },
-    "jsonc-parser": {
+    "node_modules/jsonc-parser": {
       "version": "3.2.1",
       "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz",
       "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
       "dev": true
     },
-    "jspdf": {
+    "node_modules/jspdf": {
       "version": "2.5.1",
       "resolved": "https://registry.npmmirror.com/jspdf/-/jspdf-2.5.1.tgz",
       "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==",
-      "requires": {
+      "dependencies": {
         "@babel/runtime": "^7.14.0",
         "atob": "^2.1.2",
         "btoa": "^1.2.1",
+        "fflate": "^0.4.8"
+      },
+      "optionalDependencies": {
         "canvg": "^3.0.6",
         "core-js": "^3.6.0",
         "dompurify": "^2.2.0",
-        "fflate": "^0.4.8",
         "html2canvas": "^1.0.0-rc.5"
       }
     },
-    "keyv": {
+    "node_modules/keyv": {
       "version": "4.5.4",
       "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz",
       "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "json-buffer": "3.0.1"
       }
     },
-    "levn": {
+    "node_modules/levn": {
       "version": "0.4.1",
       "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
       "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "prelude-ls": "^1.2.1",
         "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "local-pkg": {
+    "node_modules/local-pkg": {
       "version": "0.4.3",
       "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz",
       "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==",
-      "dev": true
-    },
-    "locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "requires": {
-        "p-locate": "^4.1.0"
+      "dev": true,
+      "engines": {
+        "node": ">=14"
       }
     },
-    "lodash": {
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
-    "lodash-es": {
+    "node_modules/lodash-es": {
       "version": "4.17.21",
       "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
     },
-    "lodash-unified": {
+    "node_modules/lodash-unified": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
-      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ=="
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+      "peerDependencies": {
+        "@types/lodash-es": "*",
+        "lodash": "*",
+        "lodash-es": "*"
+      }
     },
-    "lodash.camelcase": {
+    "node_modules/lodash.camelcase": {
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
       "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
     },
-    "lodash.clonedeep": {
+    "node_modules/lodash.clonedeep": {
       "version": "4.5.0",
       "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
       "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
     },
-    "lodash.debounce": {
+    "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
       "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
     },
-    "lodash.foreach": {
+    "node_modules/lodash.foreach": {
       "version": "4.5.0",
       "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
       "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
     },
-    "lodash.isequal": {
+    "node_modules/lodash.isequal": {
       "version": "4.5.0",
       "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
       "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
     },
-    "lodash.merge": {
+    "node_modules/lodash.merge": {
       "version": "4.6.2",
       "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true
     },
-    "lodash.throttle": {
+    "node_modules/lodash.throttle": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
       "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
     },
-    "lodash.toarray": {
+    "node_modules/lodash.toarray": {
       "version": "4.4.0",
       "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
       "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
     },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
       "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
+      "peer": true,
+      "dependencies": {
+        "yallist": "^3.0.2"
       }
     },
-    "magic-string": {
-      "version": "0.30.7",
-      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.7.tgz",
-      "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==",
-      "requires": {
-        "@jridgewell/sourcemap-codec": "^1.4.15"
+    "node_modules/magic-string": {
+      "version": "0.27.0",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz",
+      "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.4.13"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
-    "memoize-one": {
+    "node_modules/memoize-one": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
       "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
     },
-    "merge2": {
+    "node_modules/merge2": {
       "version": "1.4.1",
       "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
       "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
     },
-    "micromatch": {
+    "node_modules/micromatch": {
       "version": "4.0.5",
       "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz",
       "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "braces": "^3.0.2",
         "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
       }
     },
-    "mime-db": {
+    "node_modules/mime-db": {
       "version": "1.52.0",
       "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
     },
-    "mime-match": {
+    "node_modules/mime-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
       "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
-      "requires": {
+      "dependencies": {
         "wildcard": "^1.1.0"
       }
     },
-    "mime-types": {
+    "node_modules/mime-types": {
       "version": "2.1.35",
       "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "requires": {
+      "dependencies": {
         "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
       }
     },
-    "minimatch": {
+    "node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
       }
     },
-    "minimist": {
+    "node_modules/minimist": {
       "version": "1.2.8",
       "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
       "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
       "dev": true
     },
-    "mitt": {
+    "node_modules/mitt": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
       "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
     },
-    "mlly": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.5.0.tgz",
-      "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==",
+    "node_modules/mlly": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.6.1.tgz",
+      "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "acorn": "^8.11.3",
         "pathe": "^1.1.2",
         "pkg-types": "^1.0.3",
         "ufo": "^1.3.2"
       }
     },
-    "ms": {
+    "node_modules/ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
-    "namespace-emitter": {
+    "node_modules/namespace-emitter": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
       "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
     },
-    "nanoid": {
+    "node_modules/nanoid": {
       "version": "5.0.6",
       "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.0.6.tgz",
-      "integrity": "sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA=="
+      "integrity": "sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==",
+      "bin": {
+        "nanoid": "bin/nanoid.js"
+      },
+      "engines": {
+        "node": "^18 || >=20"
+      }
     },
-    "natural-compare": {
+    "node_modules/natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
       "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
       "dev": true
     },
-    "next-tick": {
+    "node_modules/next-tick": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
       "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
     },
-    "node-releases": {
+    "node_modules/node-releases": {
       "version": "2.0.14",
       "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz",
       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
       "dev": true
     },
-    "normalize-path": {
+    "node_modules/normalize-path": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "normalize-range": {
+    "node_modules/normalize-range": {
       "version": "0.1.2",
       "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
       "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "normalize-wheel-es": {
+    "node_modules/normalize-wheel-es": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
-    "normalize.css": {
+    "node_modules/normalize.css": {
       "version": "8.0.1",
       "resolved": "https://registry.npmmirror.com/normalize.css/-/normalize.css-8.0.1.tgz",
       "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
     },
-    "nth-check": {
+    "node_modules/nth-check": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
       "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "boolbase": "^1.0.0"
       }
     },
-    "object-assign": {
+    "node_modules/object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "object-inspect": {
+    "node_modules/object-inspect": {
       "version": "1.13.1",
       "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz",
       "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
     },
-    "object-keys": {
+    "node_modules/object-keys": {
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
-    "object.assign": {
+    "node_modules/object.assign": {
       "version": "4.1.5",
       "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz",
       "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.5",
         "define-properties": "^1.2.1",
         "has-symbols": "^1.0.3",
         "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "object.fromentries": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.7.tgz",
-      "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+    "node_modules/object.fromentries": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.8.tgz",
+      "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
       "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
-      }
-    },
-    "object.groupby": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/object.groupby/-/object.groupby-1.0.2.tgz",
-      "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==",
-      "dev": true,
-      "requires": {
-        "array.prototype.filter": "^1.0.3",
-        "call-bind": "^1.0.5",
+      "dependencies": {
+        "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.22.3",
-        "es-errors": "^1.0.0"
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "object.values": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.1.7.tgz",
-      "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+    "node_modules/object.groupby": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/object.groupby/-/object.groupby-1.0.3.tgz",
+      "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
       "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "once": {
+    "node_modules/object.values": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.2.0.tgz",
+      "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "wrappy": "1"
       }
     },
-    "optionator": {
+    "node_modules/optionator": {
       "version": "0.9.3",
       "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz",
       "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@aashutoshrathi/word-wrap": "^1.2.3",
         "deep-is": "^0.1.3",
         "fast-levenshtein": "^2.0.6",
         "levn": "^0.4.1",
         "prelude-ls": "^1.2.1",
         "type-check": "^0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "requires": {
-        "p-try": "^2.0.0"
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "requires": {
-        "p-limit": "^2.2.0"
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "p-try": {
+    "node_modules/p-try": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "engines": {
+        "node": ">=6"
+      }
     },
-    "pako": {
+    "node_modules/pako": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz",
       "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
     },
-    "parent-module": {
+    "node_modules/parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
       "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
       }
     },
-    "path-exists": {
+    "node_modules/path-exists": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "path-is-absolute": {
+    "node_modules/path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "path-key": {
+    "node_modules/path-key": {
       "version": "3.1.1",
       "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "path-parse": {
+    "node_modules/path-parse": {
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
-    "pathe": {
+    "node_modules/pathe": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
       "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
       "dev": true
     },
-    "pdfjs-dist": {
+    "node_modules/pdfjs-dist": {
       "version": "2.16.105",
       "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz",
       "integrity": "sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==",
-      "requires": {
+      "dependencies": {
         "dommatrix": "^1.0.3",
         "web-streams-polyfill": "^3.2.1"
+      },
+      "peerDependencies": {
+        "worker-loader": "^3.0.8"
+      },
+      "peerDependenciesMeta": {
+        "worker-loader": {
+          "optional": true
+        }
       }
     },
-    "performance-now": {
+    "node_modules/performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
       "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
       "optional": true
     },
-    "picocolors": {
+    "node_modules/picocolors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
       "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
     },
-    "picomatch": {
+    "node_modules/picomatch": {
       "version": "2.3.1",
       "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      }
     },
-    "pinia": {
+    "node_modules/pinia": {
       "version": "2.1.7",
       "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz",
       "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
-      "requires": {
+      "dependencies": {
         "@vue/devtools-api": "^6.5.0",
         "vue-demi": ">=0.14.5"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.4.0",
+        "typescript": ">=4.4.4",
+        "vue": "^2.6.14 || ^3.3.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "pinia-plugin-persistedstate": {
+    "node_modules/pinia-plugin-persistedstate": {
       "version": "3.2.1",
       "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.1.tgz",
-      "integrity": "sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ=="
+      "integrity": "sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==",
+      "peerDependencies": {
+        "pinia": "^2.0.0"
+      }
     },
-    "pkg-types": {
+    "node_modules/pinia/node_modules/vue-demi": {
+      "version": "0.14.7",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz",
+      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pkg-types": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.3.tgz",
       "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "jsonc-parser": "^3.2.0",
         "mlly": "^1.2.0",
         "pathe": "^1.1.0"
       }
     },
-    "pngjs": {
+    "node_modules/pngjs": {
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
-      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="
+      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+      "engines": {
+        "node": ">=10.13.0"
+      }
     },
-    "postcss": {
-      "version": "8.4.35",
-      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.35.tgz",
-      "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
-      "requires": {
+    "node_modules/possible-typed-array-names": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.36",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.36.tgz",
+      "integrity": "sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw==",
+      "dependencies": {
         "nanoid": "^3.3.7",
         "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
+        "source-map-js": "^1.1.0"
       },
-      "dependencies": {
-        "nanoid": {
-          "version": "3.3.7",
-          "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
-          "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
-        }
+      "engines": {
+        "node": "^10 || ^12 || >=14"
       }
     },
-    "postcss-selector-parser": {
-      "version": "6.0.15",
-      "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
-      "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
+    "node_modules/postcss-selector-parser": {
+      "version": "6.0.16",
+      "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+      "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
       }
     },
-    "postcss-value-parser": {
+    "node_modules/postcss-value-parser": {
       "version": "4.2.0",
       "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
       "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
       "dev": true
     },
-    "preact": {
-      "version": "10.19.6",
-      "resolved": "https://registry.npmmirror.com/preact/-/preact-10.19.6.tgz",
-      "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw=="
+    "node_modules/postcss/node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
     },
-    "prelude-ls": {
+    "node_modules/preact": {
+      "version": "10.19.7",
+      "resolved": "https://registry.npmmirror.com/preact/-/preact-10.19.7.tgz",
+      "integrity": "sha512-IJOW6cQN1fwfC17HfNOqUtAGyB8wAYshuC+jG1JiL/1+sC4yVyuA3IcF0N9vdodMJjW/lbuEF5qFsJqGNcbHbw=="
+    },
+    "node_modules/prelude-ls": {
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
       "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
     },
-    "prettier": {
+    "node_modules/prettier": {
       "version": "2.8.8",
       "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
-      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+      "devOptional": true,
+      "bin": {
+        "prettier": "bin-prettier.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
     },
-    "prettier-linter-helpers": {
+    "node_modules/prettier-linter-helpers": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
       "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "fast-diff": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
       }
     },
-    "prismjs": {
+    "node_modules/prismjs": {
       "version": "1.29.0",
       "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
-      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
+      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+      "engines": {
+        "node": ">=6"
+      }
     },
-    "proxy-from-env": {
+    "node_modules/proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
     },
-    "punycode": {
+    "node_modules/punycode": {
       "version": "2.3.1",
       "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
     },
-    "qrcode": {
+    "node_modules/qrcode": {
       "version": "1.5.3",
       "resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.3.tgz",
       "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==",
-      "requires": {
+      "dependencies": {
         "dijkstrajs": "^1.0.1",
         "encode-utf8": "^1.0.3",
         "pngjs": "^5.0.0",
         "yargs": "^15.3.1"
+      },
+      "bin": {
+        "qrcode": "bin/qrcode"
+      },
+      "engines": {
+        "node": ">=10.13.0"
       }
     },
-    "qs": {
-      "version": "6.11.2",
-      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz",
-      "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
-      "requires": {
-        "side-channel": "^1.0.4"
+    "node_modules/qs": {
+      "version": "6.12.0",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.12.0.tgz",
+      "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==",
+      "dependencies": {
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">=0.6"
       }
     },
-    "queue-microtask": {
+    "node_modules/queue-microtask": {
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
       "dev": true
     },
-    "raf": {
+    "node_modules/raf": {
       "version": "3.4.1",
       "resolved": "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz",
       "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
       "optional": true,
-      "requires": {
+      "dependencies": {
         "performance-now": "^2.1.0"
       }
     },
-    "readdirp": {
+    "node_modules/readdirp": {
       "version": "3.6.0",
       "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
       "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
       }
     },
-    "regenerator-runtime": {
+    "node_modules/regenerator-runtime": {
       "version": "0.14.1",
       "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
       "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
     },
-    "regexp.prototype.flags": {
+    "node_modules/regexp.prototype.flags": {
       "version": "1.5.2",
       "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
       "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.6",
         "define-properties": "^1.2.1",
         "es-errors": "^1.3.0",
         "set-function-name": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "regexpp": {
+    "node_modules/regexpp": {
       "version": "3.2.0",
       "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz",
       "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "relation-graph": {
-      "version": "2.1.31",
-      "resolved": "https://registry.npmmirror.com/relation-graph/-/relation-graph-2.1.31.tgz",
-      "integrity": "sha512-g97xqmH1pGtjygqFYVrg+tCDpzovPtkW2/jZgyYNQODmXSPD4xIWXWh98BkydZPveM8rMIf0pYMlI+jI9ANPuA==",
-      "requires": {
+    "node_modules/relation-graph": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmmirror.com/relation-graph/-/relation-graph-2.1.35.tgz",
+      "integrity": "sha512-duFtK4J43RW1XbzWOIByZsiqK+lGtjPdgicmSZADu4uY95S4DBYkDjDoGPGTW6NIwmFpDokOpNKjDe4Y0ppR6g==",
+      "dependencies": {
         "html2canvas": "^1.4.1",
         "screenfull": "^5.1.0"
       }
     },
-    "require-directory": {
+    "node_modules/require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "require-main-filename": {
+    "node_modules/require-main-filename": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
       "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
     },
-    "resolve": {
+    "node_modules/resolve": {
       "version": "1.22.8",
       "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
       "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
         "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
       }
     },
-    "resolve-from": {
+    "node_modules/resolve-from": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
       "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
     },
-    "reusify": {
+    "node_modules/reusify": {
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
       "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
     },
-    "rgbcolor": {
+    "node_modules/rgbcolor": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/rgbcolor/-/rgbcolor-1.0.1.tgz",
       "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
-      "optional": true
+      "optional": true,
+      "engines": {
+        "node": ">= 0.8.15"
+      }
     },
-    "rimraf": {
+    "node_modules/rimraf": {
       "version": "3.0.2",
       "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
       }
     },
-    "rollup": {
+    "node_modules/rollup": {
       "version": "3.29.4",
       "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.4.tgz",
       "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
       "dev": true,
-      "requires": {
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=14.18.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
         "fsevents": "~2.3.2"
       }
     },
-    "run-parallel": {
+    "node_modules/run-parallel": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
       "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "queue-microtask": "^1.2.2"
       }
     },
-    "safe-array-concat": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz",
-      "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==",
+    "node_modules/safe-array-concat": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
       "dev": true,
-      "requires": {
-        "call-bind": "^1.0.5",
-        "get-intrinsic": "^1.2.2",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "get-intrinsic": "^1.2.4",
         "has-symbols": "^1.0.3",
         "isarray": "^2.0.5"
+      },
+      "engines": {
+        "node": ">=0.4"
       }
     },
-    "safe-regex-test": {
+    "node_modules/safe-regex-test": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
       "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.6",
         "es-errors": "^1.3.0",
         "is-regex": "^1.1.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "sass": {
-      "version": "1.71.0",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.71.0.tgz",
-      "integrity": "sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w==",
+    "node_modules/sass": {
+      "version": "1.72.0",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.72.0.tgz",
+      "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "chokidar": ">=3.0.0 <4.0.0",
         "immutable": "^4.0.0",
         "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "bin": {
+        "sass": "sass.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
       }
     },
-    "screenfull": {
+    "node_modules/screenfull": {
       "version": "5.2.0",
       "resolved": "https://registry.npmmirror.com/screenfull/-/screenfull-5.2.0.tgz",
-      "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="
+      "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "scroll-into-view-if-needed": {
+    "node_modules/scroll-into-view-if-needed": {
       "version": "2.2.31",
       "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
       "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
-      "requires": {
+      "dependencies": {
         "compute-scroll-into-view": "^1.0.20"
       }
     },
-    "scule": {
+    "node_modules/scule": {
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
       "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
       "dev": true
     },
-    "semver": {
+    "node_modules/semver": {
       "version": "6.3.1",
       "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
     },
-    "set-blocking": {
+    "node_modules/set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
       "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
     },
-    "set-function-length": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.1.tgz",
-      "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
-      "requires": {
-        "define-data-property": "^1.1.2",
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.3",
+        "get-intrinsic": "^1.2.4",
         "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.1"
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "set-function-name": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.1.tgz",
-      "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+    "node_modules/set-function-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
       "dev": true,
-      "requires": {
-        "define-data-property": "^1.0.1",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
         "functions-have-names": "^1.2.3",
-        "has-property-descriptors": "^1.0.0"
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "shebang-command": {
+    "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "shebang-regex": {
+    "node_modules/shebang-regex": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "side-channel": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.5.tgz",
-      "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==",
-      "requires": {
-        "call-bind": "^1.0.6",
+    "node_modules/side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "dependencies": {
+        "call-bind": "^1.0.7",
         "es-errors": "^1.3.0",
         "get-intrinsic": "^1.2.4",
         "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "slate": {
+    "node_modules/slate": {
       "version": "0.72.8",
       "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
       "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
-      "requires": {
+      "dependencies": {
         "immer": "^9.0.6",
         "is-plain-object": "^5.0.0",
         "tiny-warning": "^1.0.3"
       }
     },
-    "slate-history": {
+    "node_modules/slate-history": {
       "version": "0.66.0",
       "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
       "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
-      "requires": {
+      "dependencies": {
         "is-plain-object": "^5.0.0"
+      },
+      "peerDependencies": {
+        "slate": ">=0.65.3"
       }
     },
-    "snabbdom": {
+    "node_modules/snabbdom": {
       "version": "3.6.2",
       "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz",
-      "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q=="
+      "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==",
+      "engines": {
+        "node": ">=12.17.0"
+      }
     },
-    "source-map": {
+    "node_modules/source-map": {
       "version": "0.7.4",
       "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz",
       "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
     },
-    "source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+    "node_modules/source-map-js": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.1.0.tgz",
+      "integrity": "sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
     },
-    "ssr-window": {
+    "node_modules/ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "dependencies": {
+        "frac": "~1.1.2"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/ssr-window": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
       "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
     },
-    "stackblur-canvas": {
+    "node_modules/stackblur-canvas": {
       "version": "2.7.0",
       "resolved": "https://registry.npmmirror.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz",
       "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==",
-      "optional": true
+      "optional": true,
+      "engines": {
+        "node": ">=0.1.14"
+      }
     },
-    "string-width": {
+    "node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "requires": {
+      "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
         "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "string.prototype.trim": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
-      "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+    "node_modules/string.prototype.trim": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
       "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.0",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "string.prototype.trimend": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
-      "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+    "node_modules/string.prototype.trimend": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
       "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       }
     },
-    "string.prototype.trimstart": {
+    "node_modules/string.prototype.trimstart": {
       "version": "1.0.7",
       "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
       "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.2.0",
         "es-abstract": "^1.22.1"
       }
     },
-    "strip-ansi": {
+    "node_modules/strip-ansi": {
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "requires": {
+      "dependencies": {
         "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "strip-bom": {
+    "node_modules/strip-bom": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz",
       "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
     },
-    "strip-json-comments": {
+    "node_modules/strip-json-comments": {
       "version": "3.1.1",
       "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
       "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "strip-literal": {
+    "node_modules/strip-literal": {
       "version": "1.3.0",
       "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.3.0.tgz",
       "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "acorn": "^8.10.0"
       }
     },
-    "supports-color": {
+    "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "supports-preserve-symlinks-flag": {
+    "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",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
     },
-    "svg-pathdata": {
+    "node_modules/svg-pathdata": {
       "version": "6.0.3",
       "resolved": "https://registry.npmmirror.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
       "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
-      "optional": true
+      "optional": true,
+      "engines": {
+        "node": ">=12.0.0"
+      }
     },
-    "text-segmentation": {
+    "node_modules/text-segmentation": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz",
       "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
-      "requires": {
+      "dependencies": {
         "utrie": "^1.0.2"
       }
     },
-    "text-table": {
+    "node_modules/text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
       "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
     },
-    "throttle-debounce": {
+    "node_modules/throttle-debounce": {
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz",
-      "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg=="
+      "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==",
+      "engines": {
+        "node": ">=12.22"
+      }
     },
-    "tiny-warning": {
+    "node_modules/tiny-warning": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
       "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
     },
-    "to-fast-properties": {
+    "node_modules/to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
       "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
     },
-    "to-regex-range": {
+    "node_modules/to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
       }
     },
-    "tsconfig-paths": {
+    "node_modules/tsconfig-paths": {
       "version": "3.15.0",
       "resolved": "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
       "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@types/json5": "^0.0.29",
         "json5": "^1.0.2",
         "minimist": "^1.2.6",
         "strip-bom": "^3.0.0"
       }
     },
-    "tslib": {
+    "node_modules/tslib": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
       "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
     },
-    "type": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz",
-      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+    "node_modules/type": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz",
+      "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
     },
-    "type-check": {
+    "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
       "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "type-fest": {
+    "node_modules/type-fest": {
       "version": "0.20.2",
       "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz",
       "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true
-    },
-    "typed-array-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz",
-      "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==",
       "dev": true,
-      "requires": {
-        "call-bind": "^1.0.6",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/typed-array-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
         "es-errors": "^1.3.0",
         "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "typed-array-byte-length": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
-      "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "for-each": "^0.3.3",
-        "has-proto": "^1.0.1",
-        "is-typed-array": "^1.1.10"
-      }
-    },
-    "typed-array-byte-offset": {
+    "node_modules/typed-array-byte-length": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.1.tgz",
-      "integrity": "sha512-tcqKMrTRXjqvHN9S3553NPCaGL0VPgFI92lXszmrE8DMhiDPLBYLlvo8Uu4WZAAX/aGqp/T1sbA4ph8EWjDF9Q==",
+      "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
       "dev": true,
-      "requires": {
-        "available-typed-arrays": "^1.0.6",
+      "dependencies": {
         "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
         "gopd": "^1.0.1",
-        "has-proto": "^1.0.1",
+        "has-proto": "^1.0.3",
         "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "typed-array-length": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz",
-      "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+    "node_modules/typed-array-byte-offset": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+      "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
       "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "is-typed-array": "^1.1.9"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "ufo": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.4.0.tgz",
-      "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==",
+    "node_modules/typed-array-length": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.5.tgz",
+      "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13",
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/ufo": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.2.tgz",
+      "integrity": "sha512-eiutMaL0J2MKdhcOM1tUy13pIrYnyR87fEd8STJQFrrAwImwvlXkxlZEjaKah8r2viPohld08lt73QfLG1NxMg==",
       "dev": true
     },
-    "unbox-primitive": {
+    "node_modules/unbox-primitive": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
       "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "call-bind": "^1.0.2",
         "has-bigints": "^1.0.2",
         "has-symbols": "^1.0.3",
         "which-boxed-primitive": "^1.0.2"
       }
     },
-    "undici-types": {
+    "node_modules/undici-types": {
       "version": "5.26.5",
       "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz",
       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
       "dev": true
     },
-    "unimport": {
+    "node_modules/unimport": {
       "version": "2.2.4",
       "resolved": "https://registry.npmmirror.com/unimport/-/unimport-2.2.4.tgz",
       "integrity": "sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@rollup/pluginutils": "^5.0.2",
         "escape-string-regexp": "^5.0.0",
         "fast-glob": "^3.2.12",
@@ -3943,43 +5727,38 @@
         "scule": "^1.0.0",
         "strip-literal": "^1.0.0",
         "unplugin": "^1.0.1"
-      },
-      "dependencies": {
-        "escape-string-regexp": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
-          "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
-          "dev": true
-        },
-        "magic-string": {
-          "version": "0.27.0",
-          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz",
-          "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/sourcemap-codec": "^1.4.13"
-          }
-        }
       }
     },
-    "unplugin": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.7.1.tgz",
-      "integrity": "sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw==",
+    "node_modules/unimport/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
       "dev": true,
-      "requires": {
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/unplugin": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.10.0.tgz",
+      "integrity": "sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==",
+      "dev": true,
+      "dependencies": {
         "acorn": "^8.11.3",
-        "chokidar": "^3.5.3",
+        "chokidar": "^3.6.0",
         "webpack-sources": "^3.2.3",
         "webpack-virtual-modules": "^0.6.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
       }
     },
-    "unplugin-auto-import": {
+    "node_modules/unplugin-auto-import": {
       "version": "0.12.2",
       "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.12.2.tgz",
       "integrity": "sha512-hC4w0GZjPjmLtrxV0u10XO350V9eCtQyEyifXr7B9UGD7SvbbIvKuOcHt58Zd4FAqZJXKWoXkpr9mdhBp85Usw==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@antfu/utils": "^0.7.2",
         "@rollup/pluginutils": "^5.0.2",
         "local-pkg": "^0.4.3",
@@ -3987,24 +5766,24 @@
         "unimport": "^2.0.1",
         "unplugin": "^1.0.1"
       },
-      "dependencies": {
-        "magic-string": {
-          "version": "0.27.0",
-          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz",
-          "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/sourcemap-codec": "^1.4.13"
-          }
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@vueuse/core": "*"
+      },
+      "peerDependenciesMeta": {
+        "@vueuse/core": {
+          "optional": true
         }
       }
     },
-    "unplugin-vue-components": {
+    "node_modules/unplugin-vue-components": {
       "version": "0.22.12",
       "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.22.12.tgz",
       "integrity": "sha512-FxyzsuBvMCYPIk+8cgscGBQ345tvwVu+qY5IhE++eorkyvA4Z1TiD/HCiim+Kbqozl10i4K+z+NCa2WO2jexRA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@antfu/utils": "^0.7.2",
         "@rollup/pluginutils": "^5.0.2",
         "chokidar": "^3.5.3",
@@ -4016,226 +5795,315 @@
         "resolve": "^1.22.1",
         "unplugin": "^1.0.1"
       },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
-          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0"
-          }
-        },
-        "magic-string": {
-          "version": "0.27.0",
-          "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz",
-          "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/sourcemap-codec": "^1.4.13"
-          }
-        },
-        "minimatch": {
-          "version": "5.1.6",
-          "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
-          "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@babel/parser": "^7.15.8",
+        "vue": "2 || 3"
+      },
+      "peerDependenciesMeta": {
+        "@babel/parser": {
+          "optional": true
         }
       }
     },
-    "update-browserslist-db": {
+    "node_modules/unplugin-vue-components/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/unplugin-vue-components/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/update-browserslist-db": {
       "version": "1.0.13",
       "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
       "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "escalade": "^3.1.1",
         "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
       }
     },
-    "uri-js": {
+    "node_modules/uri-js": {
       "version": "4.4.1",
       "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "punycode": "^2.1.0"
       }
     },
-    "util-deprecate": {
+    "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
       "dev": true
     },
-    "utrie": {
+    "node_modules/utrie": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz",
       "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
-      "requires": {
+      "dependencies": {
         "base64-arraybuffer": "^1.0.2"
       }
     },
-    "v-viewer": {
+    "node_modules/v-viewer": {
       "version": "3.0.13",
       "resolved": "https://registry.npmmirror.com/v-viewer/-/v-viewer-3.0.13.tgz",
       "integrity": "sha512-T8pgGzlF0ZCHVpD/32OKsD8MlpI6tqYP3n1XLcSjvGQMc0ABn8nJ4AumxvzAKVQrLRWtDTG6qRGAyCPCmi7ceA==",
-      "requires": {
+      "dependencies": {
         "lodash-es": "^4.17.21"
+      },
+      "peerDependencies": {
+        "viewerjs": "^1.11.0",
+        "vue": "^3.0.0"
       }
     },
-    "vant": {
-      "version": "4.8.5",
-      "resolved": "https://registry.npmmirror.com/vant/-/vant-4.8.5.tgz",
-      "integrity": "sha512-l+gz0oVNn5z/3q2AYGsyi0jvkRb8968rr+bBe3mifV+Szad6LwD1i715LlA3Nrv8PlimQ9ZT8wtkjuKjGkNMGw==",
-      "requires": {
+    "node_modules/vant": {
+      "version": "4.8.7",
+      "resolved": "https://registry.npmmirror.com/vant/-/vant-4.8.7.tgz",
+      "integrity": "sha512-puBsqVzC94niN2fFLbkpZGInE8fYK+jjoOAhQ7XAreFCn8xkxnjGpcLNoLvQSP2hUYKN7+kES1bbz/h7RHF7vQ==",
+      "dependencies": {
         "@vant/popperjs": "^1.3.0",
         "@vant/use": "^1.6.0",
         "@vue/shared": "^3.0.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
       }
     },
-    "viewerjs": {
+    "node_modules/viewerjs": {
       "version": "1.11.6",
       "resolved": "https://registry.npmmirror.com/viewerjs/-/viewerjs-1.11.6.tgz",
       "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw=="
     },
-    "vite": {
+    "node_modules/vite": {
       "version": "4.5.2",
       "resolved": "https://registry.npmmirror.com/vite/-/vite-4.5.2.tgz",
       "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "esbuild": "^0.18.10",
-        "fsevents": "~2.3.2",
         "postcss": "^8.4.27",
         "rollup": "^3.27.1"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      },
+      "peerDependencies": {
+        "@types/node": ">= 14",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
       }
     },
-    "vite-plugin-enhance-log": {
+    "node_modules/vite-plugin-enhance-log": {
       "version": "0.5.2",
       "resolved": "https://registry.npmmirror.com/vite-plugin-enhance-log/-/vite-plugin-enhance-log-0.5.2.tgz",
       "integrity": "sha512-ybCnKHMAE5viRkMacTw3WX5bLV/YLyELScwhw1LW1H3/uCpdx8Bu3vOO8C1RghbSrRlpmnJKnSY7SatttW2YZg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@babel/generator": "^7.21.4",
         "@babel/parser": "^7.22.5",
         "@babel/plugin-syntax-typescript": "^7.21.4",
         "@babel/traverse": "7.21.4",
         "source-map": "^0.7.4"
+      },
+      "peerDependencies": {
+        "vite": "^2.9.0 || ^3.0.0 || ^4.0.0"
       }
     },
-    "vite-plugin-eslint": {
+    "node_modules/vite-plugin-eslint": {
       "version": "1.8.1",
       "resolved": "https://registry.npmmirror.com/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz",
       "integrity": "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "@rollup/pluginutils": "^4.2.1",
         "@types/eslint": "^8.4.5",
         "rollup": "^2.77.2"
       },
-      "dependencies": {
-        "@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==",
-          "dev": true,
-          "requires": {
-            "estree-walker": "^2.0.1",
-            "picomatch": "^2.2.2"
-          }
-        },
-        "rollup": {
-          "version": "2.79.1",
-          "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.79.1.tgz",
-          "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
-          "dev": true,
-          "requires": {
-            "fsevents": "~2.3.2"
-          }
-        }
+      "peerDependencies": {
+        "eslint": ">=7",
+        "vite": ">=2"
       }
     },
-    "vite-plugin-remove-console": {
+    "node_modules/vite-plugin-eslint/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==",
+      "dev": true,
+      "dependencies": {
+        "estree-walker": "^2.0.1",
+        "picomatch": "^2.2.2"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      }
+    },
+    "node_modules/vite-plugin-eslint/node_modules/rollup": {
+      "version": "2.79.1",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.79.1.tgz",
+      "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+      "dev": true,
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/vite-plugin-remove-console": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/vite-plugin-remove-console/-/vite-plugin-remove-console-2.2.0.tgz",
       "integrity": "sha512-qgjh5pz75MdE9Kzs8J0kBwaCfifHV0ezRbB9rpGsIOxam+ilcGV7WOk91vFJXquzRmiKrFh3Hxlh0JJWAmXTbQ==",
       "dev": true
     },
-    "vue": {
-      "version": "3.4.19",
-      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.19.tgz",
-      "integrity": "sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==",
-      "requires": {
-        "@vue/compiler-dom": "3.4.19",
-        "@vue/compiler-sfc": "3.4.19",
-        "@vue/runtime-dom": "3.4.19",
-        "@vue/server-renderer": "3.4.19",
-        "@vue/shared": "3.4.19"
-      }
-    },
-    "vue-countup-v3": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmmirror.com/vue-countup-v3/-/vue-countup-v3-1.4.1.tgz",
-      "integrity": "sha512-umhQyf4rGdH5tL+ZuWgnoEbq7VpqxC0NH3Yd5TfaYVggGhuD5ihMd2TuNo9PU+F+SCwIGho8Muvfu2LYQBft0A==",
-      "requires": {
-        "countup.js": "^2.6.2"
-      }
-    },
-    "vue-demi": {
-      "version": "0.14.7",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz",
-      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA=="
-    },
-    "vue-draggable-plus": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmmirror.com/vue-draggable-plus/-/vue-draggable-plus-0.3.5.tgz",
-      "integrity": "sha512-HqIxV4Wr4U5LRPLRi2oV+EJ4g6ibyRKhuaiH4ZQo+LxK4zrk2XcBk9UyXC88OXp4SAq0XYH4Wco/T3LX5kJ79A=="
-    },
-    "vue-esign": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmmirror.com/vue-esign/-/vue-esign-1.1.4.tgz",
-      "integrity": "sha512-7Ix5PdcyyhVfsvrT9a+yp5+36gbQ0/bpDO+QSLT58IgJ5t164PEptOy5Nslw8bZbk3n3Hc7SP5B8eXQ8X8W+OA==",
-      "requires": {
-        "vue": "^2.5.11"
-      },
+    "node_modules/vue": {
+      "version": "3.4.21",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
+      "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
       "dependencies": {
-        "@vue/compiler-sfc": {
-          "version": "2.7.16",
-          "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
-          "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
-          "requires": {
-            "@babel/parser": "^7.23.5",
-            "postcss": "^8.4.14",
-            "prettier": "^1.18.2 || ^2.0.0",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-        },
-        "vue": {
-          "version": "2.7.16",
-          "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz",
-          "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
-          "requires": {
-            "@vue/compiler-sfc": "2.7.16",
-            "csstype": "^3.1.0"
-          }
+        "@vue/compiler-dom": "3.4.21",
+        "@vue/compiler-sfc": "3.4.21",
+        "@vue/runtime-dom": "3.4.21",
+        "@vue/server-renderer": "3.4.21",
+        "@vue/shared": "3.4.21"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
         }
       }
     },
-    "vue-eslint-parser": {
+    "node_modules/vue-countup-v3": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/vue-countup-v3/-/vue-countup-v3-1.4.1.tgz",
+      "integrity": "sha512-umhQyf4rGdH5tL+ZuWgnoEbq7VpqxC0NH3Yd5TfaYVggGhuD5ihMd2TuNo9PU+F+SCwIGho8Muvfu2LYQBft0A==",
+      "dependencies": {
+        "countup.js": "^2.6.2"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/vue-draggable-plus": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/vue-draggable-plus/-/vue-draggable-plus-0.3.5.tgz",
+      "integrity": "sha512-HqIxV4Wr4U5LRPLRi2oV+EJ4g6ibyRKhuaiH4ZQo+LxK4zrk2XcBk9UyXC88OXp4SAq0XYH4Wco/T3LX5kJ79A==",
+      "peerDependencies": {
+        "@types/sortablejs": "^1.15.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-esign": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/vue-esign/-/vue-esign-1.1.4.tgz",
+      "integrity": "sha512-7Ix5PdcyyhVfsvrT9a+yp5+36gbQ0/bpDO+QSLT58IgJ5t164PEptOy5Nslw8bZbk3n3Hc7SP5B8eXQ8X8W+OA==",
+      "dependencies": {
+        "vue": "^2.5.11"
+      }
+    },
+    "node_modules/vue-esign/node_modules/@vue/compiler-sfc": {
+      "version": "2.7.16",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
+      "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
+      "dependencies": {
+        "@babel/parser": "^7.23.5",
+        "postcss": "^8.4.14",
+        "source-map": "^0.6.1"
+      },
+      "optionalDependencies": {
+        "prettier": "^1.18.2 || ^2.0.0"
+      }
+    },
+    "node_modules/vue-esign/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/vue-esign/node_modules/vue": {
+      "version": "2.7.16",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz",
+      "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
+      "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",
+      "dependencies": {
+        "@vue/compiler-sfc": "2.7.16",
+        "csstype": "^3.1.0"
+      }
+    },
+    "node_modules/vue-eslint-parser": {
       "version": "9.4.2",
       "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
       "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "debug": "^4.3.4",
         "eslint-scope": "^7.1.1",
         "eslint-visitor-keys": "^3.3.0",
@@ -4244,88 +6112,134 @@
         "lodash": "^4.17.21",
         "semver": "^7.3.6"
       },
+      "engines": {
+        "node": "^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": ">=6.0.0"
+      }
+    },
+    "node_modules/vue-eslint-parser/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
       "dependencies": {
-        "semver": {
-          "version": "7.6.0",
-          "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
-          "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "vue-router": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.5.tgz",
-      "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
-      "requires": {
-        "@vue/devtools-api": "^6.5.0"
+    "node_modules/vue-eslint-parser/node_modules/semver": {
+      "version": "7.6.0",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
+      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "vue3-pdfjs": {
+    "node_modules/vue-eslint-parser/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "node_modules/vue-router": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.3.0.tgz",
+      "integrity": "sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.5.1"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/vue3-pdfjs": {
       "version": "0.1.6",
       "resolved": "https://registry.npmmirror.com/vue3-pdfjs/-/vue3-pdfjs-0.1.6.tgz",
       "integrity": "sha512-7UaWbsp8wNqB0y/rRlyo5yRb0S+XOkkSpmdUuS267Dhi07Pt4RFEetQ8inrpf/aTFJwGnW0Uc/UE4p376s+Zmw==",
-      "requires": {
+      "dependencies": {
         "pdfjs-dist": "^2.10.377",
         "vue": "^3.2.19"
+      },
+      "engines": {
+        "node": ">=10.0.0"
       }
     },
-    "vue3-print-nb": {
+    "node_modules/vue3-print-nb": {
       "version": "0.1.4",
       "resolved": "https://registry.npmmirror.com/vue3-print-nb/-/vue3-print-nb-0.1.4.tgz",
       "integrity": "sha512-LExI7viEzplR6ZKQ2b+V4U0cwGYbVD4fut/XHvk3UPGlT5CcvIGs6VlwGp107aKgk6P8Pgx4rco3Rehv2lti3A==",
-      "requires": {
+      "dependencies": {
         "vue": "^3.0.5"
       }
     },
-    "vue3-puzzle-vcode": {
+    "node_modules/vue3-puzzle-vcode": {
       "version": "1.1.7",
       "resolved": "https://registry.npmmirror.com/vue3-puzzle-vcode/-/vue3-puzzle-vcode-1.1.7.tgz",
       "integrity": "sha512-mW780dz7HKjrElnE60CeYSeHGidKBKHoMjTDYfqF21330rTkFOsfDK1FQKZ22MktgMtTEoS/imfpEDlM1cxY/g=="
     },
-    "vue3-seamless-scroll": {
+    "node_modules/vue3-seamless-scroll": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/vue3-seamless-scroll/-/vue3-seamless-scroll-2.0.1.tgz",
       "integrity": "sha512-mI3BaDU3pjcPUhVSw3/xNKdfPBDABTi/OdZaZqKysx4cSdNfGRbVvGNDzzptBbJ5S7imv5T55l6x/SqgnxKreg==",
-      "requires": {
+      "dependencies": {
         "throttle-debounce": "5.0.0"
       }
     },
-    "web-streams-polyfill": {
+    "node_modules/web-streams-polyfill": {
       "version": "3.3.3",
       "resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
-      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "engines": {
+        "node": ">= 8"
+      }
     },
-    "webpack-sources": {
+    "node_modules/webpack-sources": {
       "version": "3.2.3",
       "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=10.13.0"
+      }
     },
-    "webpack-virtual-modules": {
+    "node_modules/webpack-virtual-modules": {
       "version": "0.6.1",
       "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz",
       "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==",
       "dev": true
     },
-    "which": {
+    "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "which-boxed-primitive": {
+    "node_modules/which-boxed-primitive": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
       "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "is-bigint": "^1.0.1",
         "is-boolean-object": "^1.1.0",
         "is-number-object": "^1.0.4",
@@ -4333,67 +6247,113 @@
         "is-symbol": "^1.0.3"
       }
     },
-    "which-module": {
+    "node_modules/which-module": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz",
       "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
     },
-    "which-typed-array": {
-      "version": "1.1.14",
-      "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.14.tgz",
-      "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==",
+    "node_modules/which-typed-array": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.15.tgz",
+      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
       "dev": true,
-      "requires": {
-        "available-typed-arrays": "^1.0.6",
-        "call-bind": "^1.0.5",
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
         "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.1"
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
-    "wildcard": {
+    "node_modules/wildcard": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
       "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
     },
-    "wrap-ansi": {
+    "node_modules/wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/wrap-ansi": {
       "version": "6.2.0",
       "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
       "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-      "requires": {
+      "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
         "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "wrappy": {
+    "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "dev": true
     },
-    "xml-name-validator": {
+    "node_modules/xlsx": {
+      "version": "0.18.5",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
+      "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "cfb": "~1.2.1",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      },
+      "bin": {
+        "xlsx": "bin/xlsx.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/xml-name-validator": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
       "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "y18n": {
+    "node_modules/y18n": {
       "version": "4.0.3",
       "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
       "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
     },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true,
+      "peer": true
     },
-    "yargs": {
+    "node_modules/yargs": {
       "version": "15.4.1",
       "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
       "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
-      "requires": {
+      "dependencies": {
         "cliui": "^6.0.0",
         "decamelize": "^1.2.0",
         "find-up": "^4.1.0",
@@ -4405,28 +6365,82 @@
         "which-module": "^2.0.0",
         "y18n": "^4.0.0",
         "yargs-parser": "^18.1.2"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "yargs-parser": {
+    "node_modules/yargs-parser": {
       "version": "18.1.3",
       "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
       "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-      "requires": {
+      "dependencies": {
         "camelcase": "^5.0.0",
         "decamelize": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=6"
       }
     },
-    "yocto-queue": {
+    "node_modules/yargs/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/yargs/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/yargs/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/yargs/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/yocto-queue": {
       "version": "0.1.0",
       "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
     },
-    "zrender": {
+    "node_modules/zrender": {
       "version": "5.5.0",
       "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz",
       "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==",
-      "requires": {
+      "dependencies": {
         "tslib": "2.3.0"
       }
     }
diff --git a/package.json b/package.json
index 7b8d52a..8bb9dbf 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
     "axios": "^1.6.3",
     "dayjs": "^1.11.10",
     "echarts": "^5.4.3",
-    "element-plus": "^2.4.4",
+    "element-plus": "^2.6.1",
     "html2canvas": "^1.4.1",
     "jspdf": "^2.5.1",
     "lodash-es": "^4.17.21",
@@ -46,7 +46,8 @@
     "vue3-pdfjs": "^0.1.6",
     "vue3-print-nb": "^0.1.4",
     "vue3-puzzle-vcode": "^1.1.5",
-    "vue3-seamless-scroll": "^2.0.1"
+    "vue3-seamless-scroll": "^2.0.1",
+    "xlsx": "^0.18.5"
   },
   "devDependencies": {
     "@our-patches/postcss-px-to-viewport": "^1.2.0",
diff --git a/src/assets/css/element.scss b/src/assets/css/element.scss
index 5157b2c..a53ad65 100644
--- a/src/assets/css/element.scss
+++ b/src/assets/css/element.scss
@@ -298,6 +298,7 @@
 .el-dialog {
   background: transparent !important;
   --el-dialog-margin-top: 50px !important;
+  padding: 0 !important;
 
   .el-dialog__header {
     background-image: url("/src/assets/images/public/tctitlebg.png");
@@ -321,8 +322,14 @@
     }
   }
 
-  .el-dialog__body, .el-dialog__footer {
+  .el-dialog__body {
     background-color: var(--el-bullet-frame-bg-color);
+    padding: calc(var(--el-dialog-padding-primary) + 10px) var(--el-dialog-padding-primary);
+  }
+
+  .el-dialog__footer {
+    background-color: var(--el-bullet-frame-bg-color);
+    padding: var(--el-dialog-padding-primary);
   }
 }
 
@@ -418,3 +425,7 @@
 .el-color-predefine__color-selector.selected {
   --el-color-primary: #fff !important;
 }
+
+.el-input-number.is-disabled .el-input-number__decrease, .el-input-number.is-disabled .el-input-number__increase{
+  border-color: var(--el-border-color) !important;
+}
diff --git a/src/assets/js/data_dictionary.js b/src/assets/js/data_dictionary.js
index dc19f53..386a05c 100644
--- a/src/assets/js/data_dictionary.js
+++ b/src/assets/js/data_dictionary.js
@@ -224,12 +224,12 @@ export const layoutFnGetInsuranceCompany = async () => {
 // 培训类型
 export const layoutFnGetTrainingType = async (params) => {
   const resData = await getTrainingType(params);
-  return ref(resData.trainingtypelist);
+  return ref(resData.varList);
 };
 // 行业类型
 export const layoutFnGetIndustryType = async (params) => {
   const resData = await getIndustryType(params);
-  return ref(JSON.parse(resData.zTreeNodes));
+  return ref(resData.zTreeNodes);
 };
 // 岗位类型
 export const layoutFnGetPostType = async (params) => {
@@ -241,3 +241,10 @@ export const layoutFnGetTrainingLevel = async (params) => {
   const resData = await getTrainingLevel(params);
   return ref(resData.varList);
 };
+// 试题标签
+export const layoutFnGetTestQuestionLabels = async () => {
+  const resData = await getLevels({
+    DICTIONARIES_ID: "a60ebc858e2c46108bf82bbd8acc8f50",
+  });
+  return ref(resData.list);
+};
diff --git a/src/components/hidden_add/index.vue b/src/components/hidden_add/index.vue
index dc5a627..21c42d4 100644
--- a/src/components/hidden_add/index.vue
+++ b/src/components/hidden_add/index.vue
@@ -103,11 +103,11 @@
               <el-radio-group v-model="form.RECTIFICATIONTYPE">
                 <el-radio
                   :disabled="form.HIDDENLEVEL === 'hiddenLevel0002'"
-                  label="1"
+                  value="1"
                 >
                   立即整改
                 </el-radio>
-                <el-radio label="2">限期整改</el-radio>
+                <el-radio value="2">限期整改</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
diff --git a/src/components/learning_train_type/index.vue b/src/components/learning_train_type/index.vue
index c05f606..57eace5 100644
--- a/src/components/learning_train_type/index.vue
+++ b/src/components/learning_train_type/index.vue
@@ -1,5 +1,9 @@
 <template>
-  <el-select v-if="type !== 'industryType'" v-model="modelValue">
+  <el-select
+    v-if="type !== 'industryType'"
+    v-model="modelValue"
+    :disabled="disabled"
+  >
     <el-option
       v-for="item in data"
       :key="item[keys[type]]"
@@ -81,7 +85,7 @@ const keys = {
   postType: "POSTTYPE_ID",
   trainingLevel: "TRAINLEVEL_ID",
 };
-const emits = defineEmits(["update:modelValue"]);
+const emits = defineEmits(["update:modelValue", "throw-data"]);
 const modelValue = useVModel(props, "modelValue", emits);
 const treeSelectRef = ref(null);
 const data = ref([]);
@@ -120,1211 +124,42 @@ defineExpose({
   getIndustryTypeCurrentCheckAll,
 });
 const fnGetTrainingType = async () => {
-  data.value = [
-    {
-      OPERATTIME: "2023-05-24 08:26:00",
-      TRAININGTYPE_ID: "c70bf859512241579a8a30fc5d1ae153",
-      ISDELETE: "0",
-      OPERATOR: "联安众超管",
-      CREATOR: "联安众超管",
-      SORT: 2,
-      NAME: "职业健康",
-      PARENT_ID: "0",
-      CREATTIME: "2023-05-24 08:26:00",
-    },
-    {
-      OPERATTIME: "2023-04-08 13:28:01",
-      TRAININGTYPE_ID: "6128172b7a1144c98cc196044281f66c",
-      ISDELETE: "0",
-      OPERATOR: "admin",
-      CREATOR: "admin",
-      SORT: 111,
-      NAME: "全员培训",
-      PARENT_ID: "0",
-      CREATTIME: "2023-04-08 13:28:01",
-    },
-  ];
   const resData = await layoutFnGetTrainingType();
   data.value = resData.value;
+  emits("throw-data", data.value);
 };
 const fnGetIndustryType = async () => {
-  data.value = [
-    {
-      OPERATTIME: "2023-05-24 13:42:22",
-      ISDELETE: "0",
-      nodes: [
-        {
-          OPERATTIME: "2023-05-24 13:42:38",
-          ISDELETE: "0",
-          OPERATOR: "联安众超管",
-          CREATOR: "联安众超管",
-          INDUSTRYTYPE_ID: "41da504607804bd1b966e157c2b4e9f0",
-          SORT: 1,
-          NAME: "公路旅客运输",
-          PARENT_ID: "26b046958f8a46e7a016425c1c4e2fc9",
-          CREATTIME: "2023-05-24 13:42:38",
-        },
-      ],
-      OPERATOR: "",
-      CREATOR: "联安众超管",
-      INDUSTRYTYPE_ID: "26b046958f8a46e7a016425c1c4e2fc9",
-      SORT: 1,
-      NAME: "道路运输业",
-      PARENT_ID: "0",
-      CREATTIME: "2023-05-24 13:40:19",
-    },
-    {
-      OPERATTIME: "2023-02-27 10:14:32",
-      ISDELETE: "0",
-      nodes: [
-        {
-          OPERATTIME: "2023-02-27 10:08:20",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:09:17",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "d38ed992d2f84f13890f73a65a52f6df",
-              SORT: 1,
-              NAME: "选矿厂",
-              PARENT_ID: "655e9bc29a1d4a1ea39bbe59487a182e",
-              CREATTIME: "2023-02-27 10:09:17",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:09:23",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "34c3a66d82bc43b7acc398e07f2edaee",
-              SORT: 2,
-              NAME: "地下矿山",
-              PARENT_ID: "655e9bc29a1d4a1ea39bbe59487a182e",
-              CREATTIME: "2023-02-27 10:09:23",
-            },
-            {
-              OPERATTIME: "2023-04-04 14:52:03",
-              ISDELETE: "0",
-              OPERATOR: "",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "017aeaf1602b4eed8a53d6a110262016",
-              SORT: 3,
-              NAME: "露天矿山",
-              PARENT_ID: "655e9bc29a1d4a1ea39bbe59487a182e",
-              CREATTIME: "2023-02-27 10:09:28",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "655e9bc29a1d4a1ea39bbe59487a182e",
-          SORT: 0,
-          NAME: "金属非金属矿山",
-          PARENT_ID: "1b250e1ec1e24576aaa84daa804e9ab2",
-          CREATTIME: "2023-02-27 10:08:20",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:08:27",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:09:39",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "462db2c330354524ad912aade071e109",
-              SORT: 1,
-              NAME: "生产经营单位",
-              PARENT_ID: "fa95c820e1b2491e8f9cb0d03558696b",
-              CREATTIME: "2023-02-27 10:09:39",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "fa95c820e1b2491e8f9cb0d03558696b",
-          SORT: 1,
-          NAME: "危险化学品",
-          PARENT_ID: "1b250e1ec1e24576aaa84daa804e9ab2",
-          CREATTIME: "2023-02-27 10:08:27",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:08:33",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:13:14",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "30d22d43a79f4c929e434139dea85935",
-              SORT: 1,
-              NAME: "炼铁",
-              PARENT_ID: "4ecff39fff9a417ebf343f09ecc58e46",
-              CREATTIME: "2023-02-27 10:13:14",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:13:23",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "bbda6b7ddc224592be73d5f1cda29220",
-              SORT: 2,
-              NAME: "炼钢",
-              PARENT_ID: "4ecff39fff9a417ebf343f09ecc58e46",
-              CREATTIME: "2023-02-27 10:13:23",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:13:30",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "35c0879727774eb99d53ac523aae3225",
-              SORT: 3,
-              NAME: "黑色金属铸造",
-              PARENT_ID: "4ecff39fff9a417ebf343f09ecc58e46",
-              CREATTIME: "2023-02-27 10:13:30",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "4ecff39fff9a417ebf343f09ecc58e46",
-          SORT: 2,
-          NAME: "金属冶炼",
-          PARENT_ID: "1b250e1ec1e24576aaa84daa804e9ab2",
-          CREATTIME: "2023-02-27 10:08:33",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:08:38",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:13:41",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "e4e457b98c724b5786e7173bb921f365",
-              SORT: 1,
-              NAME: "生产经营单位",
-              PARENT_ID: "6ec61b50449c48059a264046323423d0",
-              CREATTIME: "2023-02-27 10:13:41",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "6ec61b50449c48059a264046323423d0",
-          SORT: 3,
-          NAME: "烟花爆竹",
-          PARENT_ID: "1b250e1ec1e24576aaa84daa804e9ab2",
-          CREATTIME: "2023-02-27 10:08:38",
-        },
-      ],
-      OPERATOR: "",
-      CREATOR: "admin",
-      INDUSTRYTYPE_ID: "1b250e1ec1e24576aaa84daa804e9ab2",
-      SORT: 1,
-      NAME: "高危行业",
-      PARENT_ID: "0",
-      CREATTIME: "2023-02-27 09:54:38",
-    },
-    {
-      OPERATTIME: "2023-02-27 10:14:35",
-      ISDELETE: "0",
-      nodes: [
-        {
-          OPERATTIME: "2023-02-27 10:13:53",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:16:33",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "b935b913b0e749c0a509968011cc6c45",
-              SORT: 1,
-              NAME: "炼铁",
-              PARENT_ID: "5f464ef0c4f741759a713fef2bb732ac",
-              CREATTIME: "2023-02-27 10:16:33",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:16:39",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "1aeb4cfedee5403da5f996d04772fc12",
-              SORT: 2,
-              NAME: "炼钢",
-              PARENT_ID: "5f464ef0c4f741759a713fef2bb732ac",
-              CREATTIME: "2023-02-27 10:16:39",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:16:46",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "c486471667d44257843595346abd250b",
-              SORT: 3,
-              NAME: "钢压延加工",
-              PARENT_ID: "5f464ef0c4f741759a713fef2bb732ac",
-              CREATTIME: "2023-02-27 10:16:46",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "5f464ef0c4f741759a713fef2bb732ac",
-          SORT: 1,
-          NAME: "冶金行业",
-          PARENT_ID: "f39f6967559f42448eb619da8eb0fce4",
-          CREATTIME: "2023-02-27 10:13:53",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:14:26",
-          ISDELETE: "0",
-          OPERATOR: "",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "6e9b1e9172214d648981a74d3649c3a1",
-          SORT: 2,
-          NAME: "有色行业",
-          PARENT_ID: "f39f6967559f42448eb619da8eb0fce4",
-          CREATTIME: "2023-02-27 10:14:03",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:14:20",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:16:57",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "1e57be917b8c4d448ae6529499ae96c7",
-              SORT: 1,
-              NAME: "水泥制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-02-27 10:16:57",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:17:04",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "fcef5e12dd9b4fd4953682ab84671aeb",
-              SORT: 2,
-              NAME: "石灰和石膏制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-02-27 10:17:04",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:17:09",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "001a60ece1294f2d967ea5a461461e70",
-              SORT: 3,
-              NAME: "平板玻璃制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-02-27 10:17:09",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:17:15",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "61de0885dc244d98bddf99afc4425267",
-              SORT: 4,
-              NAME: "特种玻璃制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-02-27 10:17:15",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:17:22",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "bd0aca3819fd4da7bbf7be90335f6020",
-              SORT: 5,
-              NAME: "玻璃纤维及制品制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-02-27 10:17:22",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:17:28",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "b83ab8eef2534ebfa85a488c11bea300",
-              SORT: 6,
-              NAME: "玻璃纤维增强塑料制品制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-02-27 10:17:28",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:17:35",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "a2aa5cd30b1249aba6f9e0a569afb774",
-              SORT: 7,
-              NAME: "建筑陶瓷制品制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-02-27 10:17:35",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:17:41",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "229c19358708403397b905330b9a8224",
-              SORT: 8,
-              NAME: "卫生陶瓷制品制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-02-27 10:17:41",
-            },
-            {
-              OPERATTIME: "2023-05-24 11:51:41",
-              ISDELETE: "0",
-              OPERATOR: "联安众超管",
-              CREATOR: "联安众超管",
-              INDUSTRYTYPE_ID: "4563908d4bc54895a0dbbb397d247537",
-              SORT: 9,
-              NAME: "粘土砖瓦及建筑砌块制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-05-24 11:51:41",
-            },
-            {
-              OPERATTIME: "2023-05-24 14:18:08",
-              ISDELETE: "0",
-              OPERATOR: "联安众超管",
-              CREATOR: "联安众超管",
-              INDUSTRYTYPE_ID: "67e09e268ef142768df4e334ff8a629d",
-              SORT: 10,
-              NAME: "其他建筑材料制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-05-24 14:18:08",
-            },
-            {
-              OPERATTIME: "2023-05-24 14:22:15",
-              ISDELETE: "0",
-              OPERATOR: "联安众超管",
-              CREATOR: "联安众超管",
-              INDUSTRYTYPE_ID: "7af5a6dccffc444faba1d70ffc763bfb",
-              SORT: 11,
-              NAME: "其他陶瓷制品制造",
-              PARENT_ID: "9b620e5b89514abb85f306fcf337c3a3",
-              CREATTIME: "2023-05-24 14:22:15",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "9b620e5b89514abb85f306fcf337c3a3",
-          SORT: 3,
-          NAME: "建材行业",
-          PARENT_ID: "f39f6967559f42448eb619da8eb0fce4",
-          CREATTIME: "2023-02-27 10:14:20",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:15:45",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:17:51",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "19909ff1724d4f9d8a50b1310f670954",
-              SORT: 1,
-              NAME: "金属结构制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:17:51",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:17:56",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "b59ee1617abd4d3fbdc797bf0f87de7b",
-              SORT: 2,
-              NAME: "金属门窗制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:17:56",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:05",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "3f5b738f21d442ebbd00e4e5f872d6da",
-              SORT: 3,
-              NAME: "金属包装容器及材料制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:05",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:11",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "d52ca8f2d82543a8841ff47c3bd0c124",
-              SORT: 4,
-              NAME: "金属丝绳及其制品制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:11",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:18",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "8d90b34941504a109bf127a19894cf47",
-              SORT: 5,
-              NAME: "金属表面处理及热处理加工",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:18",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:24",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "435c52ced633412caa07ffda98855587",
-              SORT: 6,
-              NAME: "电工机械专用设备制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:24",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:29",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "6fb88ffd31ac4a4dbd15593c07f28403",
-              SORT: 7,
-              NAME: "半导体器件专用设备制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:29",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:35",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "a8099ba67c304b84a3c6d6a196fdd0c9",
-              SORT: 8,
-              NAME: "电子元器件与机电组件设备制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:35",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:40",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "52d7c2b30a7c432dbeb73002a2521a57",
-              SORT: 9,
-              NAME: "汽车车身、挂车制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:40",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:49",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "52f2786f738c4cbb813481ee74d4d263",
-              SORT: 10,
-              NAME: "汽车零部件及配件制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:49",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:18:56",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "4515268e11d44dc184c70427daf60f00",
-              SORT: 11,
-              NAME: "变压器、整流器和电感器制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:18:56",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:19:01",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "d4c627411c5244e790dbaeb038e143d7",
-              SORT: 12,
-              NAME: "电容器及其配套设备制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:19:01",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:19:13",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "30eb3d1f582841bca3d5ceda3864d60e",
-              SORT: 13,
-              NAME: "光伏设备及元器件制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:19:13",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:19:21",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "cc1481db4b7d411ab71fad23f0774b10",
-              SORT: 14,
-              NAME: "电线、电缆制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:19:21",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:19:28",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "c5ed9abf21024bc1b42a8d2edaad54e8",
-              SORT: 15,
-              NAME: "电子专用材料制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:19:28",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:19:35",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "2723dac483e946efaf79e222148ca254",
-              SORT: 16,
-              NAME: "电工仪器仪表制造",
-              PARENT_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-              CREATTIME: "2023-02-27 10:19:35",
-            },
-          ],
-          OPERATOR: "",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "e042d66d3c4a4952bbd716adfd5b57f0",
-          SORT: 4,
-          NAME: "机械行业",
-          PARENT_ID: "f39f6967559f42448eb619da8eb0fce4",
-          CREATTIME: "2023-02-27 10:15:34",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:16:00",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:19:45",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "9e5a99038a894d1dae1ec014aa4b1456",
-              SORT: 1,
-              NAME: "水产品冷冻加工",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:19:45",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:19:51",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "5c9c06268c47400a95cd12e9b5a258e5",
-              SORT: 2,
-              NAME: "淀粉及淀粉制品制造",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:19:51",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:19:56",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "a05f300720344c078cf60be21e351bac",
-              SORT: 3,
-              NAME: "速冻食品制造",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:19:56",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:02",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "af2c521d98fb43ce8bdeb6e33f6f17c0",
-              SORT: 4,
-              NAME: "白酒制造",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:02",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:09",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "824878a5c0ea41d4b5b208da2d4a494d",
-              SORT: 5,
-              NAME: "啤酒制造",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:09",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:16",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "be49153fc87c44a98246d43ff0f734fd",
-              SORT: 6,
-              NAME: "葡萄酒制造",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:16",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:22",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "6a34916f17e3467995a21c34a4555378",
-              SORT: 7,
-              NAME: "果菜汁及果菜汁饮料制造",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:22",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:29",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "5209604046014d00afdd8472df2d77b5",
-              SORT: 8,
-              NAME: "木片加工",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:29",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:35",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "fb569e85fefd42caa91c514b7c299afa",
-              SORT: 9,
-              NAME: "包装装潢及其他印刷",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:35",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:42",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "212cce1973e54b66ab737ea144602815",
-              SORT: 10,
-              NAME: "橡胶板、管、带制造",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:42",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:51",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "2aac1e584fa140a9a3c0a021c0887b83",
-              SORT: 11,
-              NAME: "光学玻璃制造",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:51",
-            },
-            {
-              OPERATTIME: "2023-05-24 11:48:32",
-              ISDELETE: "0",
-              OPERATOR: "联安众超管",
-              CREATOR: "联安众超管",
-              INDUSTRYTYPE_ID: "455f097da53544f1a5e78a6d33cf3a3f",
-              SORT: 11,
-              NAME: "植物油加工",
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-05-24 11:48:32",
-            },
-            {
-              OPERATTIME: "2023-05-24 14:56:11",
-              ISDELETE: "0",
-              OPERATOR: "联安众超管",
-              INDUSTRYTYPE_ID: "3df1e485646948fd95805a8ce0997384",
-              SORT: 11,
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-05-24 14:56:11",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:20:57",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "9082363f85844844b4483c87f8ef7341",
-              SORT: 12,
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:20:57",
-            },
-            {
-              OPERATTIME: "2023-05-24 11:49:16",
-              ISDELETE: "0",
-              INDUSTRYTYPE_ID: "60b14e3fc45d409caa55bd3b852ffe7e",
-              SORT: 12,
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-05-24 11:49:16",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:21:04",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "bee15c59606b447a81f59c9469f13103",
-              SORT: 13,
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-02-27 10:21:04",
-            },
-            {
-              OPERATTIME: "2023-05-24 14:27:18",
-              ISDELETE: "0",
-              INDUSTRYTYPE_ID: "fdabec905a704b09a0eb683ca72c9f02",
-              SORT: 14,
-              PARENT_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-              CREATTIME: "2023-05-24 14:27:18",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "c23e931ddcca467e91ee276ea2b3ae34",
-          SORT: 5,
-          PARENT_ID: "f39f6967559f42448eb619da8eb0fce4",
-          CREATTIME: "2023-02-27 10:16:00",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:16:09",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:21:18",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "23d086ff44b549168f8cf15889db005c",
-              SORT: 1,
-              NAME: "棉纺纱加工",
-              PARENT_ID: "568e833dee3640a1bb3b141f39af1d0f",
-              CREATTIME: "2023-02-27 10:21:18",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:21:23",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "1842606b879f4654bd2f7d528ed62e5a",
-              SORT: 2,
-              NAME: "棉织造加工",
-              PARENT_ID: "568e833dee3640a1bb3b141f39af1d0f",
-              CREATTIME: "2023-02-27 10:21:23",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:21:30",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "bf1a53b278924a7fa29866660d4c4f60",
-              SORT: 3,
-              NAME: "棉印染精加工",
-              PARENT_ID: "568e833dee3640a1bb3b141f39af1d0f",
-              CREATTIME: "2023-02-27 10:21:30",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:21:36",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "8c9bc93bfef148a7bf356fb5b352fa87",
-              SORT: 4,
-              NAME: "化纤织造加工",
-              PARENT_ID: "568e833dee3640a1bb3b141f39af1d0f",
-              CREATTIME: "2023-02-27 10:21:36",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:21:42",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "f729f10497814c54b9a01cab4c575556",
-              SORT: 5,
-              NAME: "化纤织物染整精加工",
-              PARENT_ID: "568e833dee3640a1bb3b141f39af1d0f",
-              CREATTIME: "2023-02-27 10:21:42",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:21:47",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "44f42467181842499260a052a73ffcbe",
-              SORT: 6,
-              NAME: "非织造布制造",
-              PARENT_ID: "568e833dee3640a1bb3b141f39af1d0f",
-              CREATTIME: "2023-02-27 10:21:47",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:21:53",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "99fcc9294a634856851afeee30d1f171",
-              SORT: 7,
-              NAME: "运动机织服装制造",
-              PARENT_ID: "568e833dee3640a1bb3b141f39af1d0f",
-              CREATTIME: "2023-02-27 10:21:53",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:00",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "76ffa02414c1499bbcb6eaa505d242c3",
-              SORT: 8,
-              NAME: "运动休闲针织服装制造",
-              PARENT_ID: "568e833dee3640a1bb3b141f39af1d0f",
-              CREATTIME: "2023-02-27 10:22:00",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "568e833dee3640a1bb3b141f39af1d0f",
-          SORT: 6,
-          NAME: "纺织行业",
-          PARENT_ID: "f39f6967559f42448eb619da8eb0fce4",
-          CREATTIME: "2023-02-27 10:16:09",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:16:17",
-          ISDELETE: "0",
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "e9f98e1322f24da4b15a6b6ff3550c55",
-          SORT: 7,
-          NAME: "烟草行业",
-          PARENT_ID: "f39f6967559f42448eb619da8eb0fce4",
-          CREATTIME: "2023-02-27 10:16:17",
-        },
-        {
-          OPERATTIME: "2023-02-27 10:16:24",
-          ISDELETE: "0",
-          nodes: [
-            {
-              OPERATTIME: "2023-02-27 10:22:11",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "aab96f05c88046d69733280389cc58d9",
-              SORT: 1,
-              NAME: "服装批发",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:11",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:16",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "e49e397df49840b59158e8d4d5abb6eb",
-              SORT: 2,
-              NAME: "百货零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:16",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:20",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "933a77ffa9a74e0dbb6bcf57384ad40f",
-              SORT: 3,
-              NAME: "超级市场零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:20",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:26",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "19585964fe8b46af8f145790966db65c",
-              SORT: 4,
-              NAME: "便利店零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:26",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:31",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "8f824a4d57e7402d955dc4f112505e24",
-              SORT: 5,
-              NAME: "汽车新车零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:31",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:37",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "7a02c2bd1dd045e9ad0d662cdaba57db",
-              SORT: 6,
-              NAME: "汽车旧车零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:37",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:43",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "2efafba8fbeb4376ac32d5c195e81efa",
-              SORT: 7,
-              NAME: "汽车零配件零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:43",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:49",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "90874226c22e4a59b00a3af05562e645",
-              SORT: 8,
-              NAME: "摩托车及零配件零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:49",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:22:55",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "4acb8986ca1d4f1ab045548f18d8cbe7",
-              SORT: 9,
-              NAME: "日用家电零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:22:55",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:02",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "0bbf430e0bb24627bc93f135d2166e36",
-              SORT: 10,
-              NAME: "五金零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:02",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:08",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "a4fdd353d8564e038ec7fecd23699776",
-              SORT: 11,
-              NAME: "灯具零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:08",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:15",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "c008d95c73224907b91fb0a146a80522",
-              SORT: 12,
-              NAME: "家具零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:15",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:22",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "0a061308f2ae49c297221c667ad12881",
-              SORT: 13,
-              NAME: "涂料零售",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:22",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:30",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "3fe1317bf3b24334b2e6716d8babda92",
-              SORT: 14,
-              NAME: "旅游饭店",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:30",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:36",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "4b2e94dbbb0c42768c997c057be2bb89",
-              SORT: 15,
-              NAME: "经济型连锁酒店",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:36",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:41",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "a3d83a53bc484a7fa84a61a6885aa667",
-              SORT: 16,
-              NAME: "民宿服务",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:41",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:47",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "6079ee40b1e14b3fb336fbf6490a598b",
-              SORT: 17,
-              NAME: "正餐服务",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:47",
-            },
-            {
-              OPERATTIME: "2023-02-27 10:23:54",
-              ISDELETE: "0",
-              OPERATOR: "admin",
-              CREATOR: "admin",
-              INDUSTRYTYPE_ID: "a7cf17c7ca8b42e68d8822566b06fc39",
-              SORT: 18,
-              NAME: "快餐服务",
-              PARENT_ID: "84b7ed71d06d400b9e99df728928d6ce",
-              CREATTIME: "2023-02-27 10:23:54",
-            },
-          ],
-          OPERATOR: "admin",
-          CREATOR: "admin",
-          INDUSTRYTYPE_ID: "84b7ed71d06d400b9e99df728928d6ce",
-          SORT: 8,
-          NAME: "商贸行业",
-          PARENT_ID: "f39f6967559f42448eb619da8eb0fce4",
-          CREATTIME: "2023-02-27 10:16:24",
-        },
-      ],
-      OPERATOR: "",
-      CREATOR: "admin",
-      INDUSTRYTYPE_ID: "f39f6967559f42448eb619da8eb0fce4",
-      SORT: 2,
-      NAME: "一般行业",
-      PARENT_ID: "0",
-      CREATTIME: "2023-02-27 09:54:52",
-    },
-    {
-      OPERATTIME: "2023-05-24 11:40:03",
-      ISDELETE: "0",
-      nodes: [
-        {
-          OPERATTIME: "2023-05-24 11:40:14",
-          ISDELETE: "0",
-          OPERATOR: "联安众超管",
-          CREATOR: "联安众超管",
-          INDUSTRYTYPE_ID: "e74ad1f963f8423291a64cf9070558a3",
-          SORT: 1,
-          NAME: "井工煤矿",
-          PARENT_ID: "eb392a55110f4d9899d8554b84537aa0",
-          CREATTIME: "2023-05-24 11:40:14",
-        },
-        {
-          OPERATTIME: "2023-05-24 11:40:26",
-          ISDELETE: "0",
-          OPERATOR: "联安众超管",
-          CREATOR: "联安众超管",
-          INDUSTRYTYPE_ID: "6a19f1511de34b9fae955f0d61668e91",
-          SORT: 2,
-          NAME: "露天煤矿",
-          PARENT_ID: "eb392a55110f4d9899d8554b84537aa0",
-          CREATTIME: "2023-05-24 11:40:26",
-        },
-      ],
-      OPERATOR: "联安众超管",
-      CREATOR: "联安众超管",
-      INDUSTRYTYPE_ID: "eb392a55110f4d9899d8554b84537aa0",
-      SORT: 3,
-      NAME: "煤矿",
-      PARENT_ID: "0",
-      CREATTIME: "2023-05-24 11:40:03",
-    },
-  ];
   const resData = await layoutFnGetIndustryType();
   data.value = resData.value;
+  emits("throw-data", data.value);
 };
 const fnGetPostType = async () => {
-  data.value = [
-    {
-      OPERATTIME: "2023-07-20 18:12:26",
-      TRAININGTYPE_ID: "c70bf859512241579a8a30fc5d1ae153",
-      ISDELETE: "0",
-      OPERATOR: "admin",
-      CREATOR: "联安众超管",
-      POSTTYPE_ID: "61a74c83ece848f59d8b154e9370201d",
-      SORT: 12,
-      NAME: "职业健康主要负责人",
-      PARENT_ID: "0",
-      CREATTIME: "2023-05-24 08:28:18",
-    },
-    {
-      OPERATTIME: "2023-07-20 18:12:40",
-      TRAININGTYPE_ID: "c70bf859512241579a8a30fc5d1ae153",
-      ISDELETE: "0",
-      OPERATOR: "admin",
-      CREATOR: "联安众超管",
-      POSTTYPE_ID: "79042228778146d9bb7f0547b48a7b14",
-      SORT: 13,
-      NAME: "职业健康管理人员",
-      PARENT_ID: "0",
-      CREATTIME: "2023-05-24 08:28:49",
-    },
-    {
-      OPERATTIME: "2023-07-20 18:12:43",
-      TRAININGTYPE_ID: "c70bf859512241579a8a30fc5d1ae153",
-      ISDELETE: "0",
-      OPERATOR: "admin",
-      CREATOR: "联安众超管",
-      POSTTYPE_ID: "2b49f40b0c1545019d78cde8a5a218a4",
-      SORT: 14,
-      NAME: "劳动者",
-      PARENT_ID: "0",
-      CREATTIME: "2023-05-24 08:29:00",
-    },
-  ];
   const resData = await layoutFnGetPostType({
     TRAININGTYPE_ID: props.searchValue,
   });
   data.value = resData.value;
+  emits("throw-data", data.value);
 };
 const fnGetTrainingLevel = async () => {
   const resData = await layoutFnGetTrainingLevel({
     POSTTYPE_ID: props.searchValue,
   });
   data.value = resData.value;
+  emits("throw-data", data.value);
 };
 if (props.type === "trainingType") fnGetTrainingType();
 if (props.type === "industryType") fnGetIndustryType();
 watchEffect(() => {
-  if (props.type === "postType" && props.searchValue) fnGetPostType();
-  if (props.type === "trainingLevel" && props.searchValue) fnGetTrainingLevel();
+  if (props.type === "postType" || props.type === "trainingLevel") {
+    if (props.searchValue) {
+      props.type === "postType" && fnGetPostType();
+      props.type === "trainingLevel" && fnGetTrainingLevel();
+    } else {
+      modelValue.value = "";
+      data.value = [];
+      emits("throw-data", []);
+    }
+  }
 });
 </script>
 
diff --git a/src/request/data_dictionary.js b/src/request/data_dictionary.js
index d3ee094..5183dba 100644
--- a/src/request/data_dictionary.js
+++ b/src/request/data_dictionary.js
@@ -133,7 +133,7 @@ export const getStandardLevels = () =>
   });
 // 培训类型
 export const getTrainingType = (params) =>
-  post("/trainingtype/privateList", {
+  post("/trainingtype/listAll", {
     loading: false,
     ...params,
   });
diff --git a/src/request/training_archive_management.js b/src/request/training_archive_management.js
index 073eb29..d1f8490 100644
--- a/src/request/training_archive_management.js
+++ b/src/request/training_archive_management.js
@@ -1,4 +1,4 @@
-import { post } from "@/request/axios.js";
+import { post, upload } from "@/request/axios.js";
 
 export const getStudentsList = (params) =>
   post("/archives/getStudentsList", params); // 一人一档用户列表
@@ -24,6 +24,8 @@ export const getLearningRecord = (params) =>
 export const getDict = (params) => post("/dictionaries/getLevels", params); // 获取人员类型
 export const downloadFilesdetailword = (params) =>
   post("/archives/filesdetailword", params); // 一人一档:档案详情导出
+export const downloadAward = (params) =>
+  post("/archives/batchDownloadWord", params); // 一人一档:补充档案导出
 
 export const getClassPapers = (params) =>
   post("/archives/getClassPapers", params); // 一期一档:班级试卷列表
@@ -70,12 +72,19 @@ export const downloadSign = (params) => post("/archives/sign", params); // 一
 
 export const downloadAllwordzip = (params) =>
   post("/archivesallcorpword/allwordzip", params); // 一企一档:档案目录
-export const getArchivesfilesList = (params) =>
-  post("/archivesfiles/list", params); // 一企一档列表
 export const getArchivesPostmanList = (params) =>
   post("/archivespostman/list", params); // 一企一档:年度三岗人员管理台账列表
 export const downloadPersonmanage = (params) =>
   post("/archivespostman/personmanage", params); // 一企一档:三岗人员管理台账导出
+export const getPostmanView = (params) =>
+  post("/archivespostman/goEdit", params); // 一企一档:三岗人员管理台账查看
+export const setPostmanDelete = (params) =>
+  post("/archivespostman/delete", params); // 一企一档:三岗人员管理台账删除
+export const setPostmanAdd = (params) => upload("/archivespostman/add", params); // 一企一档:三岗人员管理台账添加
+export const setPostmanEdit = (params) =>
+  upload("/archivespostman/edit", params); // 一企一档:三岗人员管理台账修改
+export const setPostmanImport = (params) =>
+  upload("/archivespostman/readExcel", params); // 一企一档:三岗人员管理台账导入
 export const getArchivesTeacherList = (params) =>
   post("/archivesteacher/list", params); // 一企一档:年度本单位师资管理台账
 export const getArchivesPlanList = (params) =>
@@ -84,6 +93,18 @@ export const getArchivesManagerList = (params) =>
   post("/archivesedumanager/list", params); // 一企一档:年度安全培训教育管理台账
 export const getArchivesCapitalList = (params) =>
   post("/archivescapital/list", params); // 一企一档:年度培训资金提取和使用情况管理台账
+export const setCapitalDelete = (params) =>
+  post("/archivescapital/delete", params); // 一企一档:年度培训资金提取和使用情况管理台账删除
+export const getCapitalView = (params) =>
+  post("/archivescapital/goEdit", params); // 一企一档:年度培训资金提取和使用情况管理台账查看
+export const setCapitalAdd = (params) => post("/archivescapital/add", params); // 一企一档:年度培训资金提取和使用情况管理台账添加
+export const setCapitalEdit = (params) => post("/archivescapital/edit", params); // 一企一档:年度培训资金提取和使用情况管理台账修改
+export const setArchivesFilesUpload = (params) =>
+  upload("/archivesfiles/add", params); // 一企一档:上传pdf文件
+export const getArchivesFilesList = (params) =>
+  post("/archivesfiles/listAll", params); // 一企一档:获取附件
+export const setArchivesFilesDelete = (params) =>
+  post("/archivesfiles/delete", params); // 一企一档:删除附件
 export const downloadFundmanageword = (params) =>
   post("/archivescapital/fundmanageword", params); // 一企一档:年度培训资金提取和使用情况管理台账导出
 export const downloadTrainingplanword = (params) =>
@@ -96,3 +117,12 @@ export const downloadTeacherword = (params) =>
 export const getPdffileList = (params) => post("/archivespdffile/list", params); // 档案下载重新下载
 export const redownLoad = (params) =>
   post("/archivespdffile/redownload", params); // 档案下载重新下载
+export const getClassStrengthenDetailsList = (params) =>
+  post("/class/strengthenlist", params); // 效果评估:班级列表
+export const getStudentStrengthenDetailsList = (params) =>
+  post("/class/strengthenstudentlist", params); // 效果评估:学员列表
+export const getClassEvaluation = (params) =>
+  post("/class/getEvaluation", params); // 获取班级效果评估表信息
+export const getStudentEvaluation = (params) =>
+  post("/student/getEvaluation", params); // 获取个人效果评估表信息
+export const downloadClassEvaluation = (params) => post("class/hs", params); // 导出班级效果评估表信息
diff --git a/src/request/training_process_management.js b/src/request/training_process_management.js
index ad0934b..dc1a0d3 100644
--- a/src/request/training_process_management.js
+++ b/src/request/training_process_management.js
@@ -1,4 +1,48 @@
-import { post } from "@/request/axios.js";
+import { post, upload } from "@/request/axios.js";
 
 export const setExamPaperManagementDelete = (params) =>
   post("/stageexampaperinput/delete", params); // 试卷管理删除
+export const setExamPaperManagementAdd = (params) =>
+  upload("/stageexampaperinput/add", params); // 试卷管理添加
+export const setExamPaperManagementEdit = (params) =>
+  upload("/stageexampaperinput/edit", params); // 试卷管理修改
+export const setExamPaperManagementInherit = (params) =>
+  post("/stageexampaperinput/inherit", params); // 试卷管理继承
+export const setExamPaperManagementAddToDraft = (params) =>
+  upload("/stageexampaperCache/add", params); // 试卷管理保存到草稿
+export const setExamPaperManagementTestQuestionsDelete = (params) =>
+  post("/paperQuestion/delete", params); // 试卷管理试题删除
+export const setExamPaperManagementTestQuestionsAdd = (params) =>
+  post("/paperQuestion/add", params); // 试卷管理试题新增
+export const setExamPaperManagementTestQuestionsEdit = (params) =>
+  post("/paperQuestion/edit", params); // 试卷管理试题修改
+export const getAssociatedCoursewareNameList = (params) =>
+  post("/videocourseware/getCourseWareName", params); // 关联课件名称
+export const getClassManagementList = (params) => post("/class/list", params); // 班级管理列表
+export const setClassManagementDelete = (params) =>
+  post("/class/delete", params); // 班级管理删除
+export const setClassManagementDelay = (params) =>
+  post("/class/postpone", params); // 班级管理延期
+export const getPersonnelList = (params) =>
+  post("/trainedusersign/listByEnt", { loading: false, params }); // 班级管理添加人员
+export const getClassManagementView = (params) => post("/class/goEdit", params); // 班级管理查看
+export const setClassManagementAdd = (params) => post("/class/add", params); // 班级管理添加
+export const setClassManagementEdit = (params) => post("/class/edit", params); // 班级管理修改
+export const setClassManagementModifyExamTimes = (params) =>
+  post("/class/editNumberofexams", params); // 班级管理修改考试次数
+export const getClassManagementStudentList = (params) =>
+  post("/student/classStudentList", params); // 班级管理学员列表
+export const getClassManagementExportLearningRecords = (params) =>
+  post("/student/exportStudentList", params); // 班级管理导出学员学习记录
+export const setClassManagementStudentDelete = (params) =>
+  post("/student/deleteStudent", params); // 班级管理学员删除
+export const getClassManagementSelectStudentList = (params) =>
+  post("/user/studentList", params); // 班级管理新增学员列表
+export const getClassManagementSelectStudentAdd = (params) =>
+  post("/student/add", params); // 班级管理新增学员保存
+export const getClassManagementStudentLearningRecordsList = (params) =>
+  post("/coursestudyvideorecord/getAllByuserInfo", params); // 班级管理学员学习记录列表
+export const getClassManagementStudentExamRecordsList = (params) =>
+  post("/stageexam/list", params); // 班级管理学员考试记录列表
+export const getClassManagementStudentExamRecordsView = (params) =>
+  post("/stageexam/findExam", params); // 班级管理学员考试记录查看
diff --git a/src/views/archives_management/enterprise/archives.vue b/src/views/archives_management/enterprise/archives.vue
index 00c5888..4d2377f 100644
--- a/src/views/archives_management/enterprise/archives.vue
+++ b/src/views/archives_management/enterprise/archives.vue
@@ -34,6 +34,7 @@
         v-if="data.component"
         v-model:type="data.type"
         :title="data.title"
+        :corp-name="data.corp_name"
         :year="data.YEAR"
       />
     </el-card>
@@ -53,6 +54,7 @@ import Eduplan from "./components/eduplan";
 import Edumanager from "./components/edumanager";
 import Capital from "./components/capital";
 import { downloadAllwordzip } from "@/request/training_archive_management.js";
+import { getEnterpriseInfo } from "@/request/enterprise_management.js";
 
 const data = reactive({
   list: [
@@ -81,8 +83,14 @@ const data = reactive({
   YEAR: dayjs().format("YYYY"),
   component: "",
   type: "",
+  corp_name: "",
   title: "",
 });
+const fnGetData = async () => {
+  const resData = await getEnterpriseInfo();
+  data.corp_name = resData.pd.CORP_NAME;
+};
+fnGetData();
 const fnExport = debounce(
   1000,
   async () => {
diff --git a/src/views/archives_management/enterprise/components/capital.vue b/src/views/archives_management/enterprise/components/capital.vue
index 6ed7c22..13bb0c8 100644
--- a/src/views/archives_management/enterprise/components/capital.vue
+++ b/src/views/archives_management/enterprise/components/capital.vue
@@ -6,13 +6,22 @@
     @close="fnClose"
   >
     <div class="tr">
+      <el-button type="primary" @click="list.push({})">新增</el-button>
+      <el-button type="danger" @click="fnDelete">删除</el-button>
       <el-button type="primary" @click="fnExport">导出</el-button>
     </div>
     <div class="tc">
       <h3>{{ year }}年度培训资金提取和使用情况管理台账</h3>
     </div>
-    <p class="mb">单位名称:{{ name }}</p>
-    <layout-table :data="data.list" :show-pagination="false">
+    <p class="mb">单位名称:{{ corpName }}</p>
+    <layout-table
+      :data="list"
+      :show-pagination="false"
+      :stripe="false"
+      :highlight-current-row="true"
+      @row-click="fnRowClick"
+      @row-dblclick="fnRowDblclick"
+    >
       <el-table-column type="index" label="序号" width="60" />
       <el-table-column prop="DATE" label="日期" />
       <el-table-column label="费用项目">
@@ -32,6 +41,43 @@
       </el-table-column>
       <el-table-column prop="BALANCE" label="余额" />
     </layout-table>
+    <table class="print_use dn">
+      <thead>
+        <tr>
+          <td rowspan="2">序号</td>
+          <td rowspan="2">日期</td>
+          <td colspan="9">费用项目</td>
+          <td rowspan="2">余额</td>
+        </tr>
+        <tr>
+          <td>提取金额</td>
+          <td>培训教材教具费</td>
+          <td>师资费</td>
+          <td>试卷印制费</td>
+          <td>外出培训费</td>
+          <td>教学设备、课桌椅等购置维护费</td>
+          <td>培训活动费</td>
+          <td>委托培训费</td>
+          <td>其他与培训有关的直接支出</td>
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(item, index) in list" :key="index">
+          <td>{{ index + 1 }}</td>
+          <td>{{ item.DATE }}</td>
+          <td>{{ item.AMOUNT }}</td>
+          <td>{{ item.MATERIAL_COST }}</td>
+          <td>{{ item.TEACHER_COST }}</td>
+          <td>{{ item.PAPER_COST }}</td>
+          <td>{{ item.OUTSIDE_COST }}</td>
+          <td>{{ item.EQUIPMENT_COST }}</td>
+          <td>{{ item.TRAIN_COST }}</td>
+          <td>{{ item.ENTRUST_COST }}</td>
+          <td>{{ item.OTHER_COST }}</td>
+          <td>{{ item.BALANCE }}</td>
+        </tr>
+      </tbody>
+    </table>
     <div class="flex mt">
       <div>制表人:</div>
       <div>编制日期:</div>
@@ -45,17 +91,28 @@
       <el-button @click="fnClose">关闭</el-button>
     </template>
   </el-dialog>
+  <capital-add
+    v-model:visible="data.addOrEditDialog.visible"
+    v-model:form="data.addOrEditDialog.form"
+    :type="data.addOrEditDialog.type"
+    :year="year"
+    @get-data="fnGetData"
+  />
 </template>
 
 <script setup>
 import LayoutTable from "@/components/table/index";
-import { reactive, watchEffect } from "vue";
-import { ElMessageBox } from "element-plus";
+import { nextTick, reactive, watchEffect } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
 import { debounce } from "throttle-debounce";
 import {
   getArchivesCapitalList,
   downloadFundmanageword,
+  setCapitalDelete,
+  getCapitalView,
 } from "@/request/training_archive_management.js";
+import useListData from "@/assets/js/useListData.js";
+import capitalAdd from "./capital_add.vue";
 
 const props = defineProps({
   type: {
@@ -66,31 +123,44 @@ const props = defineProps({
     type: String,
     required: true,
   },
-  CORPINFO_ID: {
-    type: String,
-    required: true,
-  },
-  name: {
-    type: String,
-    required: true,
-  },
   year: {
     type: String,
     required: true,
   },
+  corpName: {
+    type: String,
+    required: true,
+  },
 });
 const data = reactive({
-  list: [],
+  ARCHIVESCAPITAL_ID: "",
+  addOrEditDialog: {
+    visible: false,
+    type: "",
+    form: {
+      DATE: "",
+      AMOUNT: "",
+      MATERIAL_COST: "",
+      TEACHER_COST: "",
+      PAPER_COST: "",
+      OUTSIDE_COST: "",
+      EQUIPMENT_COST: "",
+      TRAIN_COST: "",
+      ENTRUST_COST: "",
+      OTHER_COST: "",
+      BALANCE: "",
+    },
+  },
 });
 const emits = defineEmits(["update:type"]);
-const fnGetData = async () => {
-  const resData = await getArchivesCapitalList({
+const { list, fnGetData } = useListData(getArchivesCapitalList, {
+  otherParams: {
     TYPE: props.type,
-    CORPINFO_ID: props.CORPINFO_ID,
     YEAR: props.year,
-  });
-  data.list = resData.varList;
-};
+  },
+  usePagination: false,
+  immediate: false,
+});
 watchEffect(() => {
   if (props.type === 105) fnGetData();
 });
@@ -100,8 +170,7 @@ const fnExport = debounce(
     await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
     await downloadFundmanageword({
       YEAR: props.year,
-      CORPINFO_ID: props.CORPINFO_ID,
-      NAME: props.name,
+      NAME: props.corpName,
     });
     await ElMessageBox.confirm(
       "导出后请前往档案下载中下载该档案!",
@@ -111,6 +180,35 @@ const fnExport = debounce(
   },
   { atBegin: true }
 );
+const fnRowClick = (row) => {
+  data.ARCHIVESCAPITAL_ID = row.ARCHIVESCAPITAL_ID;
+};
+const fnRowDblclick = async (row) => {
+  data.addOrEditDialog.visible = true;
+  await nextTick();
+  if (row.ARCHIVESCAPITAL_ID) {
+    const resData = await getCapitalView({
+      ARCHIVESCAPITAL_ID: row.ARCHIVESCAPITAL_ID,
+    });
+    data.addOrEditDialog.form = resData.pd;
+    data.addOrEditDialog.type = "edit";
+  } else data.addOrEditDialog.type = "add";
+};
+const fnDelete = debounce(
+  1000,
+  async () => {
+    if (data.ARCHIVESCAPITAL_ID) {
+      await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
+      await setCapitalDelete({
+        ARCHIVESCAPITAL_ID: data.ARCHIVESCAPITAL_ID,
+      });
+      ElMessage.success("删除成功");
+    }
+    data.ARCHIVESCAPITAL_ID = "";
+    fnGetData();
+  },
+  { atBegin: true }
+);
 const fnClose = () => {
   emits("update:type", 0);
 };
diff --git a/src/views/archives_management/enterprise/components/capital_add.vue b/src/views/archives_management/enterprise/components/capital_add.vue
new file mode 100644
index 0000000..1473eea
--- /dev/null
+++ b/src/views/archives_management/enterprise/components/capital_add.vue
@@ -0,0 +1,153 @@
+<template>
+  <el-dialog
+    v-model="visible"
+    :append-to-body="true"
+    :title="type === 'edit' ? '修改' : '新增'"
+    :on-close="fnClose"
+  >
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="220px">
+      <el-form-item label="日期" prop="DATE">
+        <el-date-picker
+          v-model="form.DATE"
+          type="date"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+        />
+      </el-form-item>
+      <el-form-item label="提取金额	" prop="AMOUNT">
+        <el-input v-model="form.AMOUNT" />
+      </el-form-item>
+      <el-form-item label="项目类型	" prop="ITEM_TYPE">
+        <el-input v-model="form.ITEM_TYPE" />
+      </el-form-item>
+      <el-form-item label="培训教材教具费" prop="MATERIAL_COST">
+        <el-input v-model="form.MATERIAL_COST" />
+      </el-form-item>
+      <el-form-item label="师资费	" prop="TEACHER_COST">
+        <el-input v-model="form.TEACHER_COST" />
+      </el-form-item>
+      <el-form-item label="试卷印制费	" prop="PAPER_COST">
+        <el-input v-model="form.PAPER_COST" />
+      </el-form-item>
+      <el-form-item label="外出培训费	" prop="OUTSIDE_COST">
+        <el-input v-model="form.OUTSIDE_COST" />
+      </el-form-item>
+      <el-form-item label="教学设备、课桌椅等购置维护费	" prop="EQUIPMENT_COST">
+        <el-input v-model="form.EQUIPMENT_COST" />
+      </el-form-item>
+      <el-form-item label="培训活动费	" prop="TRAIN_COST">
+        <el-input v-model="form.TRAIN_COST" />
+      </el-form-item>
+      <el-form-item label="委托培训费	" prop="ENTRUST_COST">
+        <el-input v-model="form.ENTRUST_COST" />
+      </el-form-item>
+      <el-form-item label="其他与培训有关的直接支出" prop="OTHER_COST">
+        <el-input v-model="form.OTHER_COST" />
+      </el-form-item>
+      <el-form-item label="余额" prop="BALANCE">
+        <el-input v-model="form.BALANCE" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="fnClose">取消</el-button>
+      <el-button type="primary" @click="fnSubmit">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { useVModels } from "@vueuse/core";
+import { ref } from "vue";
+import { debounce } from "throttle-debounce";
+import useFormValidate from "@/assets/js/useFormValidate.js";
+import {
+  setCapitalAdd,
+  setCapitalEdit,
+} from "@/request/training_archive_management.js";
+import { ElMessage } from "element-plus";
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+    default: false,
+  },
+  form: {
+    type: Object,
+    required: true,
+    default: () => ({}),
+  },
+  type: {
+    type: String,
+    required: true,
+    default: "",
+  },
+  year: {
+    type: String,
+    required: true,
+    default: "",
+  },
+});
+const emits = defineEmits(["update:visible", "update:form", "get-data"]);
+const { visible, form } = useVModels(props, emits);
+const rules = {
+  DATE: [{ required: true, message: "请选择日期", trigger: "blur" }],
+  AMOUNT: [{ required: true, message: "提取金额不能为空", trigger: "blur" }],
+  ITEM_TYPE: [{ required: true, message: "项目类型不能为空", trigger: "blur" }],
+  MATERIAL_COST: [
+    { required: true, message: "培训教材教具费不能为空", trigger: "blur" },
+  ],
+  TEACHER_COST: [
+    { required: true, message: "师资费不能为空", trigger: "blur" },
+  ],
+  PAPER_COST: [
+    { required: true, message: "试卷印制费不能为空", trigger: "blur" },
+  ],
+  OUTSIDE_COST: [
+    { required: true, message: "外出培训费不能为空", trigger: "blur" },
+  ],
+  EQUIPMENT_COST: [
+    {
+      required: true,
+      message: "教学设备、课桌椅等购置维护费不能为空",
+      trigger: "blur",
+    },
+  ],
+  TRAIN_COST: [
+    { required: true, message: "培训活动费不能为空", trigger: "blur" },
+  ],
+  ENTRUST_COST: [
+    { required: true, message: "委托培训费不能为空", trigger: "blur" },
+  ],
+  OTHER_COST: [
+    {
+      required: true,
+      message: "其他与培训有关的直接支出不能为空",
+      trigger: "blur",
+    },
+  ],
+  BALANCE: [{ required: true, message: "余额不能为空", trigger: "blur" }],
+};
+const formRef = ref(null);
+const fnClose = () => {
+  formRef.value.resetFields();
+  visible.value = false;
+};
+const fnSubmit = debounce(
+  1000,
+  async () => {
+    await useFormValidate(formRef);
+    props.type === "add"
+      ? await setCapitalAdd({ ...props.form, YEAR: props.year })
+      : await setCapitalEdit({ ...props.form });
+    ElMessage.success("操作成功");
+    fnClose();
+    emits("get-data");
+  },
+  {
+    atBegin: true,
+  }
+);
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/archives_management/enterprise/components/edumanager.vue b/src/views/archives_management/enterprise/components/edumanager.vue
index 4f669cc..282438f 100644
--- a/src/views/archives_management/enterprise/components/edumanager.vue
+++ b/src/views/archives_management/enterprise/components/edumanager.vue
@@ -11,8 +11,8 @@
     <div class="tc">
       <h3>{{ year }}年度安全培训教育管理台账</h3>
     </div>
-    <p class="mb">单位名称:{{ name }}</p>
-    <layout-table :data="data.list" :show-pagination="false">
+    <p class="mb">单位名称:{{ corpName }}</p>
+    <layout-table :data="list" :show-pagination="false">
       <el-table-column type="index" label="序号" width="60" />
       <el-table-column prop="TRAINING_DATE" label="培训时间" />
       <el-table-column prop="TRAINING_OBJECT" label="培训对象" />
@@ -27,9 +27,7 @@
       <el-table-column prop="TRAINING_CONTENT" label="培训内容" />
       <el-table-column prop="PERSON_NUMBER" label="参加人数" />
       <el-table-column prop="CLASS_HOURS" label="培训学时" />
-      <el-table-column prop="TRAINING_PLACE" label="培训地点">
-        <span>{{ name }}</span>
-      </el-table-column>
+      <el-table-column prop="CORP_NAME" label="培训地点" />
       <el-table-column prop="TRAINING_TEACHERS" label="培训教师" />
       <el-table-column prop="ASSESSMENT_METHOD" label="考核方式">
         <span>线上考核</span>
@@ -60,13 +58,14 @@
 
 <script setup>
 import LayoutTable from "@/components/table/index";
-import { reactive, watchEffect } from "vue";
+import { watchEffect } from "vue";
 import { ElMessageBox } from "element-plus";
 import { debounce } from "throttle-debounce";
 import {
   getArchivesManagerList,
   downloadEdumanageword,
 } from "@/request/training_archive_management.js";
+import useListData from "@/assets/js/useListData.js";
 
 const props = defineProps({
   type: {
@@ -77,11 +76,7 @@ const props = defineProps({
     type: String,
     required: true,
   },
-  CORPINFO_ID: {
-    type: String,
-    required: true,
-  },
-  name: {
+  corpName: {
     type: String,
     required: true,
   },
@@ -90,19 +85,15 @@ const props = defineProps({
     required: true,
   },
 });
-const data = reactive({
-  list: [],
-});
 const emits = defineEmits(["update:type"]);
-const fnGetData = async () => {
-  const resData = await getArchivesManagerList({
+const { list, fnGetData } = useListData(getArchivesManagerList, {
+  otherParams: {
     TYPE: props.type,
-    CORPINFO_ID: props.CORPINFO_ID,
     YEAR: props.year,
-  });
-
-  data.list = resData.varList;
-};
+  },
+  usePagination: false,
+  immediate: false,
+});
 watchEffect(() => {
   if (props.type === 104) fnGetData();
 });
@@ -112,8 +103,7 @@ const fnExport = debounce(
     await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
     await downloadEdumanageword({
       YEAR: props.year,
-      CORPINFO_ID: props.CORPINFO_ID,
-      NAME: props.name,
+      NAME: props.corpName,
     });
     await ElMessageBox.confirm(
       "导出后请前往档案下载中下载该档案!",
diff --git a/src/views/archives_management/enterprise/components/eduplan.vue b/src/views/archives_management/enterprise/components/eduplan.vue
index db5332e..c13c614 100644
--- a/src/views/archives_management/enterprise/components/eduplan.vue
+++ b/src/views/archives_management/enterprise/components/eduplan.vue
@@ -7,15 +7,13 @@
   >
     <div class="tr">
       <el-button type="primary" @click="fnExport">导出</el-button>
-      <el-button type="primary" @click="data.dialogForFile = true"
-        >上传文件</el-button
-      >
+      <el-button type="primary" @click="fnImport">上传文件</el-button>
     </div>
     <div class="tc">
       <h3>{{ year }}年度安全培训教育计划</h3>
     </div>
-    <p class="mb">单位名称:{{ name }}</p>
-    <layout-table :data="data.list" :show-pagination="false">
+    <p class="mb">单位名称:{{ corpName }}</p>
+    <layout-table :data="list" :show-pagination="false">
       <el-table-column type="index" label="序号" width="60" />
       <el-table-column prop="START_TIME" label="开始时间" />
       <el-table-column prop="END_TIME" label="结束时间" />
@@ -28,9 +26,7 @@
         <span>线上考核</span>
       </el-table-column>
       <el-table-column prop="CLASSHOUR" label="学时" />
-      <el-table-column prop="PLACE" label="地点">
-        <span>{{ name }}</span>
-      </el-table-column>
+      <el-table-column prop="CORP_NAME" label="地点" />
       <el-table-column prop="TRAINING_TEACHERS" label="培训教师" />
       <el-table-column prop="FUND_GUARANTEE" label="经费保障">
         <span>安全生产投入</span>
@@ -43,28 +39,9 @@
       <div>档案管理人员:</div>
       <div>更新日期:</div>
     </div>
-    <template #footer>
-      <el-button @click="fnClose">关闭</el-button>
-    </template>
-    <el-dialog
-      v-model:visible="data.dialogForFile"
-      :title="'安全培训教育计划'"
-      top="50px"
-      width="1200px"
-      append-to-body
-    >
-      <file
-        v-if="data.dialogForFile"
-        :id="CORPINFO_ID"
-        :year="year"
-        :type="103"
-      />
-      <template #footer>
-        <el-button @click="data.dialogForFile = false">关闭</el-button>
-      </template>
-    </el-dialog>
+    <template #footer> <el-button @click="fnClose">关闭</el-button> </template>
     <pdf
-      v-if="data.dialogForFile"
+      v-model:visible="data.dialogForFile.visible"
       :title="'安全培训教育计划'"
       :type="103"
       :year="year"
@@ -82,6 +59,7 @@ import {
   downloadTrainingplanword,
 } from "@/request/training_archive_management.js";
 import Pdf from "./pdf.vue";
+import useListData from "@/assets/js/useListData.js";
 
 const props = defineProps({
   type: {
@@ -92,11 +70,7 @@ const props = defineProps({
     type: String,
     required: true,
   },
-  id: {
-    type: String,
-    required: true,
-  },
-  name: {
+  corpName: {
     type: String,
     required: true,
   },
@@ -106,19 +80,16 @@ const props = defineProps({
   },
 });
 const data = reactive({
-  list: [],
-  dialogForFile: false,
+  dialogForFile: {
+    visible: false,
+  },
 });
 const emits = defineEmits(["update:type"]);
-const fnGetData = async () => {
-  const resData = await getArchivesPlanList({
-    TYPE: props.type,
-    CORPINFO_ID: props.CORPINFO_ID,
-    ENTERPRISE_ID: props.ENTERPRISE_ID,
-    YEAR: props.year,
-  });
-  data.list = resData.varList;
-};
+const { list, fnGetData } = useListData(getArchivesPlanList, {
+  otherParams: { TYPE: props.type, YEAR: props.year },
+  usePagination: false,
+  immediate: false,
+});
 watchEffect(() => {
   if (props.type === 103) fnGetData();
 });
@@ -128,8 +99,6 @@ const fnExport = debounce(
     await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
     await downloadTrainingplanword({
       YEAR: props.year,
-      CORPINFO_ID: props.CORPINFO_ID,
-      ENTERPRISE_ID: props.ENTERPRISE_ID,
       NAME: props.name,
     });
     await ElMessageBox.confirm(
@@ -140,6 +109,9 @@ const fnExport = debounce(
   },
   { atBegin: true }
 );
+const fnImport = () => {
+  data.dialogForFile.visible = !data.dialogForFile.visible;
+};
 const fnClose = () => {
   emits("update:type", 0);
 };
diff --git a/src/views/archives_management/enterprise/components/pdf.vue b/src/views/archives_management/enterprise/components/pdf.vue
index 92c5e93..c8d08da 100644
--- a/src/views/archives_management/enterprise/components/pdf.vue
+++ b/src/views/archives_management/enterprise/components/pdf.vue
@@ -1,17 +1,30 @@
 <template>
   <el-dialog
+    v-model="visible"
     :title="title"
     :model-value="
-      type === 1 || type === 2 || type === 3 || type === 4 || type === 103
+      type === 1 || type === 2 || type === 3 || type === 4 || visible
     "
     width="1100px"
     @close="fnClose"
   >
+    <div>
+      <layout-upload
+        :file-list="[]"
+        auto-upload
+        :http-request="fnUpload"
+        accept=".pdf"
+        :show-file-list="false"
+        :limit="999"
+      >
+        <template #tip>只能上传pdf文件</template>
+      </layout-upload>
+    </div>
     <div class="content-flex">
       <div class="content-left">
         <el-scrollbar style="height: 600px">
           <layout-table
-            :data="data.list"
+            :data="list"
             :show-header="false"
             :show-pagination="false"
             :border="false"
@@ -20,16 +33,26 @@
             @row-click="fnRowClick"
           >
             <el-table-column prop="FILE_NAME" />
+            <el-table-column label="操作">
+              <template #default="{ row }">
+                <el-button type="primary" text link @click.stop="fnDelete(row)">
+                  <el-icon color="red" class="mr-10">
+                    <delete />
+                  </el-icon>
+                  删除
+                </el-button>
+              </template>
+            </el-table-column>
           </layout-table>
         </el-scrollbar>
       </div>
       <div class="content-right">
-        <div v-if="!data.pdfSrc" class="content-tip">
+        <div v-if="!pdfSrc" class="content-tip">
           <div class="box">
             <div class="icon">
               <icon-file-pdf-one
                 theme="filled"
-                size="60"
+                size="50"
                 fill="#fff"
                 :stroke-width="3"
               />
@@ -40,16 +63,7 @@
             </div>
           </div>
         </div>
-        <el-scrollbar style="height: 600px">
-          <div v-if="data.pdfSrc">
-            <vue-pdf
-              v-for="page in data.numOfPages"
-              :key="page"
-              :src="data.pdfSrc"
-              :page="page"
-            />
-          </div>
-        </el-scrollbar>
+        <layout-pdf v-if="pdfSrc" :src="pdfSrc" model="normal" />
       </div>
     </div>
     <template #footer>
@@ -59,13 +73,26 @@
 </template>
 
 <script setup>
-import LayoutTable from "@/components/table/index";
-import { nextTick, reactive, watchEffect } from "vue";
-import { VuePdf, createLoadingTask } from "vue3-pdfjs/esm";
-import { getArchivesfilesList } from "@/request/training_archive_management.js";
+import {
+  getArchivesFilesList,
+  setArchivesFilesDelete,
+  setArchivesFilesUpload,
+} from "@/request/training_archive_management.js";
+import LayoutUpload from "@/components/upload/index.vue";
+import LayoutPdf from "@/components/pdf/index.vue";
+import { ref, watchEffect } from "vue";
+import { Delete } from "@element-plus/icons-vue";
+import useListData from "@/assets/js/useListData.js";
+import { debounce } from "throttle-debounce";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { useVModels } from "@vueuse/core";
 
-const FILE_URL = import.meta.env.VITE_FILE_URL;
 const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: false,
+    default: false,
+  },
   type: {
     type: Number,
     required: true,
@@ -74,7 +101,7 @@ const props = defineProps({
     type: String,
     required: true,
   },
-  CORPINFO_ID: {
+  corpName: {
     type: String,
     required: true,
   },
@@ -83,21 +110,14 @@ const props = defineProps({
     required: true,
   },
 });
-const data = reactive({
-  list: [],
-  pdfSrc: "",
-  numOfPages: 0,
+const emits = defineEmits(["update:visible", "update:type"]);
+const { visible } = useVModels(props, emits);
+const pdfSrc = ref("");
+const { list, fnGetData } = useListData(getArchivesFilesList, {
+  otherParams: { TYPE: props.type, YEAR: props.year },
+  usePagination: false,
+  immediate: false,
 });
-const emits = defineEmits(["update:type"]);
-const fnGetData = async () => {
-  const resData = await getArchivesfilesList({
-    TYPE: props.type,
-    YEAR: props.year,
-    CORPINFO_ID: props.CORPINFO_ID,
-    MODULE: "corp",
-  });
-  data.list = resData.varList;
-};
 watchEffect(() => {
   if (
     props.type === 1 ||
@@ -106,21 +126,38 @@ watchEffect(() => {
     props.type === 4 ||
     props.type === 103
   )
-    fnGetData();
+    fnGetData({ TYPE: props.type, YEAR: props.year });
 });
+const fnUpload = async (item) => {
+  const formData = new FormData();
+  formData.append("FFILE", item.file);
+  formData.append("TYPE", props.type);
+  formData.append("YEAR", props.year);
+  await setArchivesFilesUpload(formData);
+  fnGetData({ TYPE: props.type, YEAR: props.year });
+};
+const fnDelete = debounce(
+  1000,
+  async ({ ARCHIVESFILES_ID, FILE_PATH }) => {
+    await ElMessageBox.confirm("确定要删除吗?", {
+      type: "warning",
+    });
+    await setArchivesFilesDelete({
+      ARCHIVESFILES_ID,
+      FILE_PATH,
+    });
+    ElMessage.success("删除成功");
+    fnGetData({ TYPE: props.type, YEAR: props.year });
+  },
+  { atBegin: true }
+);
 const fnRowClick = async (row) => {
-  data.pdfSrc = "";
-  await nextTick();
-  data.pdfSrc = FILE_URL + row.FILE_PATH;
-  const loadingTask = createLoadingTask(FILE_URL + row.FILE_PATH);
-  loadingTask.promise.then((pdf) => {
-    data.numOfPages = pdf.numPages;
-  });
+  pdfSrc.value = row.FILE_PATH;
 };
 const fnClose = () => {
-  data.pdfSrc = "";
-  data.numOfPages = 0;
+  pdfSrc.value = "";
   emits("update:type", 0);
+  visible.value = false;
 };
 </script>
 
diff --git a/src/views/archives_management/enterprise/components/postman.vue b/src/views/archives_management/enterprise/components/postman.vue
index c7cfdd0..68759c1 100644
--- a/src/views/archives_management/enterprise/components/postman.vue
+++ b/src/views/archives_management/enterprise/components/postman.vue
@@ -6,13 +6,23 @@
     @close="fnClose"
   >
     <div class="tr">
+      <el-button type="primary" @click="list.push({})">新增</el-button>
+      <el-button type="danger" @click="fnDelete">删除</el-button>
+      <el-button type="primary" @click="fnImport">导入</el-button>
       <el-button type="primary" @click="fnExport">导出</el-button>
     </div>
     <div class="tc">
       <h3>{{ year }}年度三岗人员管理台账</h3>
     </div>
-    <p class="mb">单位名称:{{ name }}</p>
-    <layout-table :data="data.list" :show-pagination="false">
+    <p class="mb">单位名称:{{ corpName }}</p>
+    <layout-table
+      :data="list"
+      :show-pagination="false"
+      :stripe="false"
+      :highlight-current-row="true"
+      @row-click="fnRowClick"
+      @row-dblclick="fnRowDblclick"
+    >
       <el-table-column type="index" label="序号" width="60" />
       <el-table-column prop="NAME" label="姓名" />
       <el-table-column prop="POST" label="岗位/操作项目" />
@@ -30,12 +40,31 @@
       <el-table-column prop="CARD_ID" label="证书号" />
       <el-table-column prop="EFFECTIVE_DATE" label="证书有效期限" />
       <el-table-column prop="RETRAINING" label="复训日期" />
-      <el-table-column prop="RETRAINING" label="操作" align="center">
-        <template #default="{ row }">
-          <el-button type="primary" @click="handleEdit(row)">编辑</el-button>
-        </template>
-      </el-table-column>
     </layout-table>
+    <table class="print_use dn">
+      <thead>
+        <tr>
+          <td>序号</td>
+          <td>姓名</td>
+          <td>岗位/操作项目</td>
+          <td>电话</td>
+          <td>证书号</td>
+          <td>证书有效期限</td>
+          <td>复训日期</td>
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(item, index) in list" :key="index">
+          <td>{{ index + 1 }}</td>
+          <td>{{ item.NAME }}</td>
+          <td>{{ item.POST }}</td>
+          <td>{{ item.PHONE }}</td>
+          <td>{{ item.CARD_ID }}</td>
+          <td>{{ item.EFFECTIVE_DATE }}</td>
+          <td>{{ item.RETRAINING }}</td>
+        </tr>
+      </tbody>
+    </table>
     <div class="flex mt">
       <div>档案管理人员:</div>
       <div>更新日期:</div>
@@ -43,18 +72,36 @@
     <template #footer>
       <el-button @click="fnClose">关闭</el-button>
     </template>
+    <postman-add
+      v-model:visible="data.addOrEditDialog.visible"
+      v-model:form="data.addOrEditDialog.form"
+      :type="data.addOrEditDialog.type"
+      :year="year"
+      @get-data="fnGetData"
+    />
+    <layout-import-file
+      v-model:visible="data.importDialogVisible"
+      template-url="/TrafficFile/template/post.xls"
+      @submit="fnSubmitImport"
+    />
   </el-dialog>
 </template>
 
 <script setup>
 import LayoutTable from "@/components/table/index";
-import { reactive, watchEffect } from "vue";
-import { ElMessageBox } from "element-plus";
+import { nextTick, reactive, watchEffect } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
 import { debounce } from "throttle-debounce";
 import {
   getArchivesPostmanList,
   downloadPersonmanage,
+  getPostmanView,
+  setPostmanDelete,
+  setPostmanImport,
 } from "@/request/training_archive_management.js";
+import PostmanAdd from "./postman_add.vue";
+import LayoutImportFile from "@/components/import_file/index.vue";
+import useListData from "@/assets/js/useListData.js";
 
 const FILE_URL = import.meta.env.VITE_FILE_URL;
 const props = defineProps({
@@ -66,31 +113,37 @@ const props = defineProps({
     type: String,
     required: true,
   },
-  CORPINFO_ID: {
-    type: String,
-    required: true,
-  },
   year: {
     type: String,
     required: true,
   },
-  name: {
+  corpName: {
     type: String,
     required: true,
   },
 });
 const data = reactive({
-  list: [],
+  importDialogVisible: false,
+  ARCHIVES_POSTMAN_ID: "",
+  addOrEditDialog: {
+    visible: false,
+    type: "",
+    form: {
+      NAME: "",
+      POST: "",
+      PHONE: "",
+      CARD_ID: "",
+      EFFECTIVE_DATE: "",
+      RETRAINING: "",
+    },
+  },
 });
 const emits = defineEmits(["update:type"]);
-const fnGetData = async () => {
-  const resData = await getArchivesPostmanList({
-    TYPE: props.type,
-    CORPINFO_ID: props.CORPINFO_ID,
-    YEAR: props.year,
-  });
-  data.list = resData.varList;
-};
+const { list, fnGetData } = useListData(getArchivesPostmanList, {
+  otherParams: { TYPE: props.type, YEAR: props.year },
+  usePagination: false,
+  immediate: false,
+});
 watchEffect(() => {
   if (props.type === 101) fnGetData();
 });
@@ -100,8 +153,7 @@ const fnExport = debounce(
     await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
     await downloadPersonmanage({
       YEAR: props.year,
-      CORPINFO_ID: props.CORPINFO_ID,
-      NAME: props.name,
+      NAME: props.corpName,
     });
     await ElMessageBox.confirm(
       "导出后请前往档案下载中下载该档案!",
@@ -111,6 +163,42 @@ const fnExport = debounce(
   },
   { atBegin: true }
 );
+const fnRowClick = (row) => {
+  data.ARCHIVES_POSTMAN_ID = row.ARCHIVES_POSTMAN_ID;
+};
+const fnRowDblclick = async (row) => {
+  data.addOrEditDialog.visible = true;
+  await nextTick();
+  if (row.ARCHIVES_POSTMAN_ID) {
+    const resData = await getPostmanView({
+      ARCHIVES_POSTMAN_ID: row.ARCHIVES_POSTMAN_ID,
+    });
+    data.addOrEditDialog.form = resData.pd;
+    data.addOrEditDialog.type = "edit";
+  } else data.addOrEditDialog.type = "add";
+};
+const fnDelete = debounce(
+  1000,
+  async () => {
+    if (data.ARCHIVES_POSTMAN_ID) {
+      await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
+      await setPostmanDelete({
+        ARCHIVES_POSTMAN_ID: data.ARCHIVES_POSTMAN_ID,
+      });
+      ElMessage.success("删除成功");
+    }
+    data.ARCHIVES_POSTMAN_ID = "";
+    fnGetData();
+  },
+  { atBegin: true }
+);
+const fnImport = () => {
+  data.importDialogVisible = !data.importDialogVisible;
+};
+const fnSubmitImport = async (formData) => {
+  const resData = await setPostmanImport(formData);
+  ElMessage.success(resData.msg);
+};
 const fnClose = () => {
   emits("update:type", 0);
 };
diff --git a/src/views/archives_management/enterprise/components/postman_add.vue b/src/views/archives_management/enterprise/components/postman_add.vue
new file mode 100644
index 0000000..b589afa
--- /dev/null
+++ b/src/views/archives_management/enterprise/components/postman_add.vue
@@ -0,0 +1,141 @@
+<template>
+  <el-dialog
+    v-model="visible"
+    :append-to-body="true"
+    :title="type === 'edit' ? '修改' : '新增'"
+    :on-close="fnClose"
+  >
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="姓名" prop="NAME">
+        <el-input v-model="form.NAME" />
+      </el-form-item>
+      <el-form-item label="岗位/操作项目" prop="POST">
+        <el-input v-model="form.POST" />
+      </el-form-item>
+      <el-form-item label="手机号" prop="PHONE">
+        <el-input v-model="form.PHONE" />
+      </el-form-item>
+      <el-form-item label="照片" prop="hideUpload">
+        <layout-upload
+          v-model:file-list="form.hideUpload"
+          accept=".jpg,.jpeg,.png"
+          list-type="picture-card"
+          :limit="1"
+          delete-to-server
+        />
+      </el-form-item>
+      <el-form-item label="证书号" prop="CARD_ID">
+        <el-input v-model="form.CARD_ID" />
+      </el-form-item>
+      <el-form-item label="证书有效期限" prop="EFFECTIVE_DATE">
+        <el-date-picker
+          v-model="form.EFFECTIVE_DATE"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          type="date"
+        />
+      </el-form-item>
+      <el-form-item label="复训日期" prop="RETRAINING">
+        <el-date-picker
+          v-model="form.RETRAINING"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          type="date"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="fnClose">取消</el-button>
+      <el-button type="primary" @click="fnSubmit">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { useVModels } from "@vueuse/core";
+import { ref } from "vue";
+import { debounce } from "throttle-debounce";
+import useFormValidate from "@/assets/js/useFormValidate.js";
+import {
+  setPostmanAdd,
+  setPostmanEdit,
+} from "@/request/training_archive_management.js";
+import { ElMessage } from "element-plus";
+import LayoutUpload from "@/components/upload/index.vue";
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+    default: false,
+  },
+  form: {
+    type: Object,
+    required: true,
+    default: () => ({}),
+  },
+  type: {
+    type: String,
+    required: true,
+    default: "",
+  },
+  year: {
+    type: String,
+    required: true,
+    default: "",
+  },
+});
+const emits = defineEmits(["update:visible", "update:form", "get-data"]);
+const { visible, form } = useVModels(props, emits);
+const rules = {
+  NAME: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
+  POST: [{ required: true, message: "岗位/操作项目不能为空", trigger: "blur" }],
+  PHONE: [
+    { required: true, message: "手机号不能为空", trigger: "blur" },
+    {
+      pattern:
+        /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
+      message: "请输入正确的手机号",
+      trigger: "blur",
+    },
+  ],
+  hideUpload: [{ required: true, message: "照片不能为空", trigger: "blur" }],
+  CARD_ID: [{ required: true, message: "证书号不能为空", trigger: "blur" }],
+  EFFECTIVE_DATE: [
+    { required: true, message: "请选择证书有效期限", trigger: "change" },
+  ],
+  RETRAINING: [
+    { required: true, message: "请选择复训日期", trigger: "change" },
+  ],
+};
+const formRef = ref(null);
+const fnClose = () => {
+  formRef.value.resetFields();
+  visible.value = false;
+};
+const fnSubmit = debounce(
+  1000,
+  async () => {
+    await useFormValidate(formRef);
+    const formData = new FormData();
+    Object.keys(props.form).forEach((key) => {
+      formData.append(key, props.form[key]);
+    });
+    if (props.form.hideUpload[0].raw) {
+      formData.append("FFILE", props.form.hideUpload[0].raw);
+    }
+    formData.append("YEAR", props.year);
+    props.type === "add"
+      ? await setPostmanAdd(formData)
+      : await setPostmanEdit(formData);
+    ElMessage.success("操作成功");
+    fnClose();
+    emits("get-data");
+  },
+  {
+    atBegin: true,
+  }
+);
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/archives_management/enterprise/components/teacher.vue b/src/views/archives_management/enterprise/components/teacher.vue
index a0aaadc..af4a586 100644
--- a/src/views/archives_management/enterprise/components/teacher.vue
+++ b/src/views/archives_management/enterprise/components/teacher.vue
@@ -11,8 +11,8 @@
     <div class="tc">
       <h3>{{ year }}年度本单位师资管理台账</h3>
     </div>
-    <p class="mb">单位名称:{{ name }}</p>
-    <layout-table :data="data.list" :show-pagination="false">
+    <p class="mb">单位名称:{{ corpName }}</p>
+    <layout-table :data="list" :show-pagination="false">
       <el-table-column type="index" label="序号" width="60" />
       <el-table-column prop="NAME" label="姓名" />
       <el-table-column prop="WORKYEAR" label="从事本专业工作年限" />
@@ -37,13 +37,14 @@
 
 <script setup>
 import LayoutTable from "@/components/table/index";
-import { reactive, watchEffect } from "vue";
+import { watchEffect } from "vue";
 import { ElMessageBox } from "element-plus";
 import { debounce } from "throttle-debounce";
 import {
   getArchivesTeacherList,
   downloadTeacherword,
 } from "@/request/training_archive_management.js";
+import useListData from "@/assets/js/useListData.js";
 
 const props = defineProps({
   type: {
@@ -54,11 +55,7 @@ const props = defineProps({
     type: String,
     required: true,
   },
-  CORPINFO_ID: {
-    type: String,
-    required: true,
-  },
-  name: {
+  corpName: {
     type: String,
     required: true,
   },
@@ -67,18 +64,12 @@ const props = defineProps({
     required: true,
   },
 });
-const data = reactive({
-  list: [],
-});
 const emits = defineEmits(["update:type"]);
-const fnGetData = async () => {
-  const resData = await getArchivesTeacherList({
-    TYPE: props.type,
-    CORPINFO_ID: props.CORPINFO_ID,
-    YEAR: props.year,
-  });
-  data.list = resData.varList;
-};
+const { list, fnGetData } = useListData(getArchivesTeacherList, {
+  otherParams: { TYPE: props.type, YEAR: props.year },
+  usePagination: false,
+  immediate: false,
+});
 watchEffect(() => {
   if (props.type === 102) fnGetData();
 });
@@ -88,8 +79,7 @@ const fnExport = debounce(
     await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
     await downloadTeacherword({
       YEAR: props.year,
-      CORPINFO_ID: props.CORPINFO_ID,
-      NAME: props.name,
+      NAME: props.corpName,
     });
     await ElMessageBox.confirm(
       "导出后请前往档案下载中下载该档案!",
diff --git a/src/views/archives_management/semester/components/paper.vue b/src/views/archives_management/semester/components/paper.vue
index 2bf5faf..8baf5dd 100644
--- a/src/views/archives_management/semester/components/paper.vue
+++ b/src/views/archives_management/semester/components/paper.vue
@@ -37,20 +37,20 @@
         v-model="item.ANSWER"
         :disabled="true"
       >
-        <el-radio label="A">A.{{ item.OPTIONA }}</el-radio>
-        <el-radio label="B">B.{{ item.OPTIONB }}</el-radio>
-        <el-radio label="C">C.{{ item.OPTIONC }}</el-radio>
-        <el-radio label="D">D.{{ item.OPTIOND }}</el-radio>
+        <el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
+        <el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
+        <el-radio value="C">C.{{ item.OPTIONC }}</el-radio>
+        <el-radio value="D">D.{{ item.OPTIOND }}</el-radio>
       </el-radio-group>
       <el-checkbox-group
         v-if="item.QUESTIONTYPE === '2'"
         v-model="item.checkList"
         :disabled="true"
       >
-        <el-checkbox label="A">A.{{ item.OPTIONA }}</el-checkbox>
-        <el-checkbox label="B">B.{{ item.OPTIONB }}</el-checkbox>
-        <el-checkbox label="C">C.{{ item.OPTIONC }}</el-checkbox>
-        <el-checkbox label="D">D.{{ item.OPTIOND }}</el-checkbox>
+        <el-checkbox value="A">A.{{ item.OPTIONA }}</el-checkbox>
+        <el-checkbox value="B">B.{{ item.OPTIONB }}</el-checkbox>
+        <el-checkbox value="C">C.{{ item.OPTIONC }}</el-checkbox>
+        <el-checkbox value="D">D.{{ item.OPTIOND }}</el-checkbox>
       </el-checkbox-group>
       <el-radio-group
         v-if="item.QUESTIONTYPE === '3'"
@@ -58,9 +58,9 @@
         :disabled="true"
         class="panduan"
       >
-        <el-radio label="A">A.{{ item.OPTIONA }}</el-radio>
+        <el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
         <div class="el-radio"></div>
-        <el-radio label="B">B.{{ item.OPTIONB }}</el-radio>
+        <el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
         <div class="el-radio"></div>
       </el-radio-group>
     </dl>
diff --git a/src/views/archives_management/semester/components/results.vue b/src/views/archives_management/semester/components/results.vue
index 7f380ae..370621c 100644
--- a/src/views/archives_management/semester/components/results.vue
+++ b/src/views/archives_management/semester/components/results.vue
@@ -11,7 +11,7 @@
     <div id="printContent">
       <h2 class="tc">学员考核成绩统计表</h2>
       <div class="flex mt mb">
-        <span>平台名称:{{ data.info.CORPINFO_NAME }}</span>
+        <span>平台名称:{{ corpName }}</span>
         <span
           >报表日期:{{ dayjs(data.clazz.END_TIME).format("YYYY-MM-DD") }}</span
         >
@@ -21,7 +21,7 @@
           <td colspan="2">公司名称</td>
         </tr>
         <tr>
-          <td colspan="2">{{ data.clazz.CORP_INFO }}</td>
+          <td colspan="2">{{ corpName }}</td>
         </tr>
         <tr>
           <td>培训时间</td>
@@ -173,6 +173,10 @@ const props = defineProps({
     type: String,
     required: true,
   },
+  corpName: {
+    type: String,
+    required: true,
+  },
 });
 const data = reactive({
   info: {},
diff --git a/src/views/archives_management/semester/components/training_schedule.vue b/src/views/archives_management/semester/components/training_schedule.vue
index 00bd24e..804779e 100644
--- a/src/views/archives_management/semester/components/training_schedule.vue
+++ b/src/views/archives_management/semester/components/training_schedule.vue
@@ -9,9 +9,9 @@
       <el-button type="primary" @click="fnExport">导出</el-button>
     </div>
     <div class="tc">
-      <h3>{{ CORP_NAME }}培训计划</h3>
+      <h3>{{ corpName }}培训计划</h3>
     </div>
-    <p class="mb">单位名称:{{ CORP_INFO }}</p>
+    <p class="mb">单位名称:{{ corpName }}</p>
     <layout-table :data="data.list" :show-pagination="false">
       <el-table-column type="index" label="序号" width="50" />
       <el-table-column label="培训人员类型"> 从业人员 </el-table-column>
@@ -33,7 +33,7 @@
       <el-table-column prop="TRAINING_TEACHERS" label="授课教师" />
     </layout-table>
     <div class="flex mt">
-      <div>编制单位:{{ CORP_NAME }}</div>
+      <div>编制单位:{{ corpName }}</div>
       <div>编制日期:</div>
     </div>
     <template #footer>
diff --git a/src/views/archives_management/semester/handout_list.vue b/src/views/archives_management/semester/handout_list.vue
index ad85e7d..48453a4 100644
--- a/src/views/archives_management/semester/handout_list.vue
+++ b/src/views/archives_management/semester/handout_list.vue
@@ -6,15 +6,15 @@
       </div>
       <layout-table
         ref="tableRef"
-        v-model:pagination="data.pagination"
+        v-model:pagination="pagination"
         row-key="CURRICULUM_ID"
-        :data="data.varlist"
+        :data="list"
         @get-data="fnGetData"
       >
         <el-table-column reserve-selection type="selection" width="55" />
         <el-table-column label="序号" width="60">
           <template #default="{ $index }">
-            {{ serialNumber(data.pagination, $index) }}
+            {{ serialNumber(pagination, $index) }}
           </template>
         </el-table-column>
         <el-table-column prop="CURRICULUMNAME" label="教材名称" />
@@ -50,17 +50,12 @@ import {
   getClassCurriculumList,
   downloadTeachingMaterialAll,
 } from "@/request/training_archive_management.js";
+import useListData from "@/assets/js/useListData.js";
 
 const route = useRoute();
 const { CLASS_ID } = route.query;
 const tableRef = ref(null);
 const data = reactive({
-  varlist: [],
-  pagination: {
-    currentPage: 1,
-    pageSize: 10,
-    total: 0,
-  },
   type: 0,
   CURRICULUM_ID: "",
 });
@@ -68,16 +63,9 @@ const fnView = (row) => {
   data.type = 106;
   data.CURRICULUM_ID = row.CURRICULUM_ID;
 };
-const fnGetData = async () => {
-  const resData = await getClassCurriculumList({
-    currentPage: data.pagination.currentPage,
-    pageSize: data.pagination.pageSize,
-    CLASS_ID,
-  });
-  data.varlist = resData.varList;
-  data.pagination.total = resData.page.totalResult;
-};
-fnGetData();
+const { list, pagination, fnGetData } = useListData(getClassCurriculumList, {
+  otherParams: { CLASS_ID },
+});
 const fnExport = debounce(
   1000,
   async () => {
diff --git a/src/views/archives_management/semester/paper_list.vue b/src/views/archives_management/semester/paper_list.vue
index 076888b..a059ede 100644
--- a/src/views/archives_management/semester/paper_list.vue
+++ b/src/views/archives_management/semester/paper_list.vue
@@ -2,14 +2,14 @@
   <div>
     <el-card>
       <el-form
-        :model="data.searchForm"
+        :model="searchForm"
         label-width="80px"
         @submit.prevent="fnResetPagination"
       >
         <el-row>
           <el-col :span="6">
             <el-form-item label="试卷名称" prop="KEYWORDS">
-              <el-input v-model="data.searchForm.KEYWORDS" />
+              <el-input v-model="searchForm.KEYWORDS" />
             </el-form-item>
           </el-col>
           <el-col :span="6">
@@ -18,10 +18,7 @@
               <el-button native-type="reset" @click="fnResetPagination">
                 重置
               </el-button>
-              <el-button
-                v-if="data.varlist.length > 0"
-                type="primary"
-                @click="fnExport"
+              <el-button v-if="list.length > 0" type="primary" @click="fnExport"
                 >导出</el-button
               >
             </el-form-item>
@@ -30,15 +27,15 @@
       </el-form>
       <layout-table
         ref="tableRef"
-        v-model:pagination="data.pagination"
+        v-model:pagination="pagination"
         row-key="STAGEEXAMPAPERINPUT_ID"
-        :data="data.varlist"
+        :data="list"
         @get-data="fnGetData"
       >
         <el-table-column reserve-selection type="selection" width="55" />
         <el-table-column label="序号" width="60">
           <template #default="{ $index }">
-            {{ serialNumber(data.pagination, $index) }}
+            {{ serialNumber(pagination, $index) }}
           </template>
         </el-table-column>
         <el-table-column prop="EXAMNAME" label="试卷名称" />
@@ -78,18 +75,12 @@ import {
   getClassPaperList,
   downloadArchivePapers,
 } from "@/request/training_archive_management.js";
+import useListData from "@/assets/js/useListData.js";
 
 const route = useRoute();
 const { CLASS_ID, CLASS_NAME } = route.query;
 const tableRef = ref(null);
 const data = reactive({
-  varlist: [],
-  pagination: {
-    currentPage: 1,
-    pageSize: 10,
-    total: 0,
-  },
-  searchForm: {},
   type: 0,
   STAGEEXAMPAPERINPUT_ID: "",
 });
@@ -97,26 +88,8 @@ const fnView = (STAGEEXAMPAPERINPUT_ID) => {
   data.type = 103;
   data.STAGEEXAMPAPERINPUT_ID = STAGEEXAMPAPERINPUT_ID;
 };
-const fnGetData = async () => {
-  const resData = await getClassPaperList({
-    currentPage: data.pagination.currentPage,
-    pageSize: data.pagination.pageSize,
-    CLASS_ID,
-    ...data.searchForm,
-  });
-  data.varlist = resData.varList;
-  data.pagination.total = resData.page.totalResult;
-};
-fnGetData();
-const fnResetPagination = () => {
-  data.pagination = {
-    currentPage: 1,
-    pageSize: 10,
-    total: 0,
-  };
-  tableRef.value.clearSelection();
-  fnGetData();
-};
+const { list, pagination, searchForm, fnGetData, fnResetPagination } =
+  useListData(getClassPaperList, { otherParams: { CLASS_ID } });
 const fnExport = debounce(
   1000,
   async () => {
diff --git a/src/views/archives_management/user/archives.vue b/src/views/archives_management/user/archives.vue
index d1850cf..97d7b78 100644
--- a/src/views/archives_management/user/archives.vue
+++ b/src/views/archives_management/user/archives.vue
@@ -727,16 +727,16 @@
               :disabled="true"
             >
               <dd>
-                <el-radio label="A">A.{{ item.OPTIONA }}</el-radio>
+                <el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
               </dd>
               <dd>
-                <el-radio label="B">B.{{ item.OPTIONB }}</el-radio>
+                <el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
               </dd>
               <dd>
-                <el-radio label="C">C.{{ item.OPTIONC }}</el-radio>
+                <el-radio value="C">C.{{ item.OPTIONC }}</el-radio>
               </dd>
               <dd>
-                <el-radio label="D">D.{{ item.OPTIOND }}</el-radio>
+                <el-radio value="D">D.{{ item.OPTIOND }}</el-radio>
               </dd>
             </el-radio-group>
             <el-checkbox-group
@@ -745,16 +745,16 @@
               :disabled="true"
             >
               <dd>
-                <el-checkbox label="A">A.{{ item.OPTIONA }}</el-checkbox>
+                <el-checkbox value="A">A.{{ item.OPTIONA }}</el-checkbox>
               </dd>
               <dd>
-                <el-checkbox label="B">B.{{ item.OPTIONB }}</el-checkbox>
+                <el-checkbox value="B">B.{{ item.OPTIONB }}</el-checkbox>
               </dd>
               <dd>
-                <el-checkbox label="C">C.{{ item.OPTIONC }}</el-checkbox>
+                <el-checkbox value="C">C.{{ item.OPTIONC }}</el-checkbox>
               </dd>
               <dd>
-                <el-checkbox label="D">D.{{ item.OPTIOND }}</el-checkbox>
+                <el-checkbox value="D">D.{{ item.OPTIOND }}</el-checkbox>
               </dd>
             </el-checkbox-group>
             <el-radio-group
@@ -763,10 +763,10 @@
               :disabled="true"
             >
               <dd>
-                <el-radio label="A">A.{{ item.OPTIONA }}</el-radio>
+                <el-radio value="A">A.{{ item.OPTIONA }}</el-radio>
               </dd>
               <dd>
-                <el-radio label="B">B.{{ item.OPTIONB }}</el-radio>
+                <el-radio value="B">B.{{ item.OPTIONB }}</el-radio>
               </dd>
             </el-radio-group>
             <div class="flex">
diff --git a/src/views/archives_management/user/index.vue b/src/views/archives_management/user/index.vue
index 7263061..fcf231a 100644
--- a/src/views/archives_management/user/index.vue
+++ b/src/views/archives_management/user/index.vue
@@ -15,7 +15,7 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="4">
             <el-form-item label-width="10px">
               <el-button type="primary" native-type="submit">搜索</el-button>
               <el-button native-type="reset" @click="fnResetPagination">
@@ -23,6 +23,14 @@
               </el-button>
             </el-form-item>
           </el-col>
+          <el-form-item label-width="10px">
+            <el-button type="primary" @click="fnBatchDownload">
+              下载补充档案
+            </el-button>
+          </el-form-item>
+          <el-form-item label-width="10px">
+            <el-button type="primary"> 班级档案 </el-button>
+          </el-form-item>
         </el-row>
       </el-form>
     </el-card>
@@ -83,12 +91,42 @@ import { serialNumber } from "@/assets/js/utils.js";
 import useListData from "@/assets/js/useListData.js";
 import { ref } from "vue";
 
-import { getStudentsList } from "@/request/training_archive_management.js";
+import {
+  downloadAward,
+  getStudentsList,
+} from "@/request/training_archive_management.js";
 import router from "@/router/index.js";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { debounce } from "throttle-debounce";
 
 const tableRef = ref(null);
 const { list, pagination, searchForm, fnGetData, fnResetPagination } =
   useListData(getStudentsList);
-</script>
 
+const fnBatchDownload = debounce(
+  1000,
+  async () => {
+    const selectionData = tableRef.value.getSelectionRows();
+    if (selectionData.length === 0) {
+      ElMessage.warning("请选中要下载的学员补充档案...");
+      return;
+    }
+    const ids = selectionData
+      .map((item) => {
+        return item.USER_ID;
+      })
+      .join(",");
+    await downloadAward({
+      ids,
+    });
+    await ElMessageBox.confirm(
+      "导出后请前往档案下载中下载该档案!",
+      "温馨提示",
+      { type: "info" }
+    );
+    tableRef.value.clearSelection();
+  },
+  { atBegin: true }
+);
+</script>
 <style scoped></style>
diff --git a/src/views/effect_appraisal/enterprise_effect/components/classStrengthen.vue b/src/views/effect_appraisal/enterprise_effect/components/classStrengthen.vue
new file mode 100644
index 0000000..168fa95
--- /dev/null
+++ b/src/views/effect_appraisal/enterprise_effect/components/classStrengthen.vue
@@ -0,0 +1,211 @@
+<template>
+  <el-dialog v-model="visible" width="1100px" title="效果评估表">
+    <div class="tr mb">
+      <el-button type="primary" @click="fnExport">导出</el-button>
+    </div>
+    <div id="printContent">
+      <h1 style="text-align: center; margin-left: 60px">
+        安全生产教育培训动态评估报告
+      </h1>
+      <p class="p1" style="width: 100%; text-align: center">
+        企业名称:
+        {{ data.evaluationDialogForm.CORP_NAME }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+        评估日期:
+        {{ data.evaluationDialogForm.END_TIME }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+      </p>
+      <h3>一、评估概述</h3>
+      <p class="p1">
+        本报告旨在对{{ data.evaluationDialogForm.CORP_NAME }}公司
+        的安全生产培训进行动态评估,安全生产培训的目标是提高员工的安全意识和技能,促进工作场所的安全管理和事故预防。本报告将对培训的实施情况、培训效果、参与度、员工考试通过率、知识盲点以及可能的改进措施进行评估和分析。
+      </p>
+      <h3>二、评估内容</h3>
+      <p class="p1">
+        贵公司于{{ data.evaluationDialogForm.START_TIME }}时间 -
+        {{ data.evaluationDialogForm.END_TIME }}时间进行了{{
+          data.evaluationDialogForm.CLASS_NAME
+        }}培训,培训内容如下:{{ data.evaluationDialogForm.coursewareName }}
+      </p>
+      <h3>三、考试结果</h3>
+      <p class="p1">
+        <b
+          >(一)本次考试共{{
+            data.evaluationDialogForm.EXMA_COUNT
+          }}人参加,合格人数{{
+            data.evaluationDialogForm.PASS_COUNT
+          }}人,未合格人数{{
+            data.evaluationDialogForm.NO_PASS_COUNT
+          }}人,通过率{{
+            data.evaluationDialogForm.passRate
+          }}%。具体情况如下:</b
+        >
+      </p>
+      <div id="chart" ref="chart" style="width: 900px; height: 320px" />
+      <p class="p1"><b>(二)评估结果和分析</b></p>
+      <p class="p1">
+        基于评估结果和培训过程中的观察,我们对员工的知识盲点进行分析,指出可能存在的理解不足或需要加强的知识领域,主要知识盲点体现为:
+      </p>
+      <p class="p1">{{ data.evaluationDialogForm.error }}</p>
+      <table class="table">
+        <tr>
+          <td>标签名称</td>
+          <td>错误率</td>
+        </tr>
+        <tr
+          v-for="(value, key) in data.evaluationDialogForm.ratioMap"
+          :key="key"
+        >
+          <td>{{ key }}</td>
+          <td>{{ value }}%</td>
+        </tr>
+      </table>
+      <p class="p1">知识盲点对应课件为:</p>
+      <p class="p1">{{ data.evaluationDialogForm.errorVideoName }}</p>
+      <p class="p1"><b>(三)评估建议</b></p>
+      <p class="p1">
+        存在的知识盲点需要进一步加强和补充。我们建议您将重点放在弥补这些盲点上,通过进一步学习、参与讨论或与安全专家交流弥补知识盲区。
+      </p>
+      <h3>四、强化培训记录</h3>
+      <p class="p1"><b>(一)强化培训考试记录</b></p>
+      <table class="table">
+        <tr>
+          <td colspan="3">班级名称</td>
+          <td colspan="3">培训时间</td>
+        </tr>
+        <tr>
+          <td colspan="3">{{ data.evaluationDialogForm.CLASS_NAME }}</td>
+          <td colspan="3">
+            {{
+              dayjs(data.evaluationDialogForm.START_TIME).format(
+                "YYYY年MM月DD日"
+              )
+            }}
+            -
+            {{
+              dayjs(data.evaluationDialogForm.END_TIME).format("YYYY年MM月DD日")
+            }}
+          </td>
+        </tr>
+        <tr>
+          <td colspan="3">培训人数</td>
+          <td colspan="3">合格人数</td>
+        </tr>
+        <tr>
+          <td colspan="3">{{ data.evaluationDialogForm.STR_EXMA_COUNT }}</td>
+          <td colspan="3">{{ data.evaluationDialogForm.STR_PASS_COUNT }}</td>
+        </tr>
+        <tr>
+          <td colspan="6">合格学员名单</td>
+        </tr>
+        <tr>
+          <td style="width: 10%">序号</td>
+          <td style="width: 15%">姓名</td>
+          <td style="width: 25%">身份证号</td>
+          <td style="width: 20%">手机号</td>
+          <td style="width: 10%">性别</td>
+          <td style="width: 25%">效果评估成绩</td>
+        </tr>
+        <tr
+          v-for="(value, key) in data.evaluationDialogForm.PASS_List"
+          :key="key"
+        >
+          <td style="width: 10%">{{ key + 1 }}</td>
+          <td style="width: 15%">{{ value.NAME }}</td>
+          <td style="width: 25%">{{ value.USER_ID_CARD }}</td>
+          <td style="width: 20%">{{ value.PHONE }}</td>
+          <td style="width: 10%">{{ value.SEX }}</td>
+          <td style="width: 25%">{{ value.STRENGTHENEXAMSCORE }}</td>
+        </tr>
+        <tr>
+          <td colspan="6">未合格学员名单</td>
+        </tr>
+        <tr>
+          <td style="width: 10%">序号</td>
+          <td style="width: 15%">姓名</td>
+          <td style="width: 25%">身份证号</td>
+          <td style="width: 20%">手机号</td>
+          <td style="width: 10%">性别</td>
+          <td style="width: 25%">效果评估成绩</td>
+        </tr>
+        <tr
+          v-for="(value, key) in data.evaluationDialogForm.NO_PASS_List"
+          :key="key"
+        >
+          <td style="width: 10%">{{ key + 1 }}</td>
+          <td style="width: 15%">{{ value.NAME }}</td>
+          <td style="width: 25%">{{ value.USER_ID_CARD }}</td>
+          <td style="width: 20%">{{ value.PHONE }}</td>
+          <td style="width: 10%">{{ value.SEX }}</td>
+          <td style="width: 25%">{{ value.STRENGTHENEXAMSCORE }}</td>
+        </tr>
+      </table>
+    </div>
+    <template #footer>
+      <el-button @click="visible = false">关闭</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { reactive, watchEffect } from "vue";
+import { ElMessageBox } from "element-plus";
+
+import { getClassEvaluation } from "@/request/training_archive_management.js";
+import { useVModel } from "@vueuse/core";
+import dayjs from "dayjs";
+const props = defineProps({
+  classId: {
+    type: String,
+    required: true,
+  },
+  visible: {
+    type: Boolean,
+    default: false,
+  },
+});
+const visible = useVModel(props, "visible");
+const data = reactive({
+  evaluationDialogForm: {},
+  count1: "",
+  count2: "",
+  count3: "",
+});
+const fnGetData = async () => {
+  const resData = await getClassEvaluation({
+    CLASS_ID: props.classId,
+  });
+  data.evaluationDialogForm = resData.pageData;
+  data.count1 = data.pageData.count1;
+  data.count2 = data.pageData.count2;
+  data.count3 = data.pageData.count3;
+};
+const fnExport = async () => {
+  await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
+  window.location.href =
+    import.meta.env[import.meta.env.DEV ? "VITE_PROXY" : "VITE_BASE_URL"] +
+    "class/hs?CLASS_ID=" +
+    props.classId;
+};
+watchEffect(() => {
+  if (visible.value) fnGetData();
+});
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+table {
+  width: 100%;
+  border-collapse: collapse;
+
+  td {
+    border: 1px solid var(--el-border-color);
+    padding: 8px;
+    font-size: 14px;
+    text-align: center;
+  }
+}
+</style>
diff --git a/src/views/effect_appraisal/enterprise_effect/components/studentStrengthen.vue b/src/views/effect_appraisal/enterprise_effect/components/studentStrengthen.vue
new file mode 100644
index 0000000..8b242e6
--- /dev/null
+++ b/src/views/effect_appraisal/enterprise_effect/components/studentStrengthen.vue
@@ -0,0 +1,283 @@
+<template>
+  <el-dialog v-model="visible" width="1100px" title="效果评估表">
+    <div class="tr mb">
+      <el-button type="primary" @click="fnExport">导出</el-button>
+    </div>
+    <div id="printContent">
+      <h1 style="text-align: center; margin-left: 60px">
+        安全生产教育培训动态评估报告
+      </h1>
+      <p class="p1" style="width: 100%; text-align: center">
+        姓名: {{ data.evaluationDialogForm.NAME }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+        身份证号:
+        {{
+          data.evaluationDialogForm.USER_ID_CARD
+        }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评估日期:
+        {{ data.evaluationDialogForm.OPERATTIME }}
+      </p>
+      <h3>一、评估概述</h3>
+      <p class="p1">
+        本报告旨在评估您在最近接受的安全培训中的个人效果,并提供课程考试结果以及指出可能存在的知识盲点。安全培训的目标是提高您在工作环境中的安全意识和行为,以减少事故和伤害的发生。本报告将对您的培训参与度、知识掌握程度、课程考试成绩以及可能存在的知识盲点进行评估。
+      </p>
+      <h3>二、学员基本情况</h3>
+      <table
+        align="center"
+        border="1"
+        cellspacing="0"
+        width="100%"
+        class="table"
+      >
+        <tr>
+          <td style="width: 70px">姓名</td>
+          <td style="width: 60px">{{ data.evaluationDialogForm.NAME }}</td>
+          <td style="width: 55px">性别</td>
+          <td style="width: 80px">{{ data.evaluationDialogForm.SEX }}</td>
+          <td style="width: 60px">身份证号</td>
+          <td style="width: 150px">
+            {{ data.evaluationDialogForm.USER_ID_CARD }}
+          </td>
+          <td style="width: 60px">学历</td>
+          <td style="width: 200px">
+            {{ data.evaluationDialogForm.DEGREE_OF_EDUCATION }}
+          </td>
+          <td style="width: 60px">专业</td>
+          <td>{{ data.evaluationDialogForm.MAJOR }}</td>
+        </tr>
+        <tr>
+          <td>职务/职称</td>
+          <td>{{ data.evaluationDialogForm.DUTIES }}</td>
+          <td>部门</td>
+          <td>{{ data.evaluationDialogForm.DEPARTMENT_NAME }}</td>
+          <td>工种</td>
+          <td>{{ data.evaluationDialogForm.POST_NAME }}</td>
+          <td>行业类别</td>
+          <td>{{ data.evaluationDialogForm.INDUSTRY_ALL_NAME }}</td>
+          <td>联系电话</td>
+          <td>{{ data.evaluationDialogForm.PHONE }}</td>
+        </tr>
+        <tr>
+          <td>人员类型</td>
+          <td colspan="9">{{ data.evaluationDialogForm.PERSONNEL_TYPE }}</td>
+        </tr>
+      </table>
+      <h3>三、评估内容</h3>
+      <p class="p1">
+        您在 {{ data.evaluationDialogForm.START_TIME }} -
+        {{ data.evaluationDialogForm.END_TIME }} 进行了
+        {{ data.evaluationDialogForm.CLASS_NAME }}, 培训内容如下:
+        {{ data.evaluationDialogForm.coursewareName }}
+      </p>
+      <p class="p1">
+        您参加了培训后的课程考试,并取得了以下成绩:{{
+          data.evaluationDialogForm.STAGEEXAMSCORE
+        }}分
+      </p>
+      <h3>四、评估结果</h3>
+      <p class="p1">根据我们的评估,您的个人培训效果如下:</p>
+      <p class="p1">
+        <b
+          >(一)您在培训期间表现出积极的参与度,完成了所有的培训课程和活动;</b
+        >
+      </p>
+      <p class="p1">
+        <b
+          >(二)<span v-if="data.evaluationDialogForm.correct !== ''"
+            >您对 {{ data.evaluationDialogForm.correct }} 知识掌握得很好。</span
+          >在评估过程中,我们发现您可能存在以下知识盲点:{{
+            data.evaluationDialogForm.error
+          }}</b
+        >
+      </p>
+      <p class="p1">知识盲点对应课件为:</p>
+      <p class="p1">{{ data.evaluationDialogForm.errorVideoName }}</p>
+      <p class="p1"><b>(三)评估建议</b></p>
+      <p class="p1">
+        存在的知识盲点需要进一步加强和补充。我们建议您将重点放在弥补这些盲点上,通过进一步学习、参与讨论或与安全专家交流弥补知识盲区。
+      </p>
+      <h3>五、强化培训记录</h3>
+      <p class="p1"><b>(一)强化培训考试记录</b></p>
+
+      <div
+        v-if="data.evaluationDialogForm.STRENGTHEN_EXAMNAME !== '0'"
+        class="page-break"
+      >
+        <div class="levelup no-print">
+          <h1>考卷详情</h1>
+        </div>
+        <div class="paper-details chapter_box">
+          <div class="chapter_right_img" />
+          <h1 style="text-align: center">
+            {{ data.evaluationDialogForm.STRENGTHEN_EXAMNAME }}
+          </h1>
+          <div style="text-align: center">
+            (满分:{{ data.evaluationDialogForm.STRENGTHEN_EXAMSCORE }}分)
+          </div>
+          <div class="subflex">
+            <span>班级名称:{{ data.evaluationDialogForm.CLASS_NAME }}</span>
+            <span>姓名:{{ data.evaluationDialogForm.NAME }}</span>
+          </div>
+          <div class="subflex">
+            <span
+              >考试时间:{{
+                data.evaluationDialogForm.STRENGTHEN_OPERATTIME
+              }}</span
+            >
+            <span
+              >分数:{{ data.evaluationDialogForm.STRENGTHENEXAMSCORE }}</span
+            >
+          </div>
+
+          <div class="study-papg">
+            <dl
+              v-for="(row, key) in data.evaluationDialogForm
+                .strengthenexamrecord"
+              :key="key"
+            >
+              <dt>
+                <span v-if="row.QUESTIONTYPE === '1'" class="mark mark-green"
+                  >(单选题)
+                </span>
+                <span v-if="row.QUESTIONTYPE === '2'" class="mark mark-blue"
+                  >(多选题)</span
+                >
+                <span v-if="row.QUESTIONTYPE === '3'" class="mark mark-orange"
+                  >(判断题)</span
+                >
+                <span v-if="row.QUESTIONTYPE === '4'" class="mark mark-purple"
+                  >(填空题)</span
+                >
+                {{ key + 1 }}.{{ row.QUESTIONDRY }}
+                <span class="ml-10">(题目分值:{{ row.SCORE }})</span>
+              </dt>
+              <el-radio-group
+                v-if="row.QUESTIONTYPE === '1'"
+                v-model="row.ANSWER"
+                :disabled="true"
+              >
+                <dd>
+                  <el-radio value="A">A.{{ row.OPTIONA }}</el-radio>
+                </dd>
+                <dd>
+                  <el-radio value="B">B.{{ row.OPTIONB }}</el-radio>
+                </dd>
+                <dd>
+                  <el-radio value="C">C.{{ row.OPTIONC }}</el-radio>
+                </dd>
+                <dd>
+                  <el-radio value="D">D.{{ row.OPTIOND }}</el-radio>
+                </dd>
+              </el-radio-group>
+              <el-checkbox-group
+                v-if="row.QUESTIONTYPE === '2'"
+                v-model="row.checkList"
+                :disabled="true"
+              >
+                <dd>
+                  <el-checkbox value="A">A.{{ row.OPTIONA }}</el-checkbox>
+                </dd>
+                <dd>
+                  <el-checkbox value="B">B.{{ row.OPTIONB }}</el-checkbox>
+                </dd>
+                <dd>
+                  <el-checkbox value="C">C.{{ row.OPTIONC }}</el-checkbox>
+                </dd>
+                <dd>
+                  <el-checkbox value="D">D.{{ row.OPTIOND }}</el-checkbox>
+                </dd>
+              </el-checkbox-group>
+              <el-radio-group
+                v-if="row.QUESTIONTYPE === '3'"
+                v-model="row.ANSWER"
+                :disabled="true"
+              >
+                <dd>
+                  <el-radio value="A">A.{{ row.OPTIONA }}</el-radio>
+                </dd>
+                <dd>
+                  <el-radio value="B">B.{{ row.OPTIONB }}</el-radio>
+                </dd>
+              </el-radio-group>
+              <div class="flex-layout space-between">
+                <div>
+                  <div v-if="row.QUESTIONTYPE === '4'" class="mb-10">
+                    学员答案:{{ row.ANSWER }}
+                  </div>
+                  <div class="mb-10">参考答案:{{ row.ANSWERRIGHT }}</div>
+                  <div>答案解析:{{ row.DESCR }}</div>
+                </div>
+              </div>
+            </dl>
+          </div>
+        </div>
+      </div>
+    </div>
+    <template #footer>
+      <el-button @click="visible = false">关闭</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { reactive, watchEffect } from "vue";
+import { ElMessageBox } from "element-plus";
+
+import { getStudentEvaluation } from "@/request/training_archive_management.js";
+import { useVModel } from "@vueuse/core";
+const props = defineProps({
+  studentId: {
+    type: String,
+    required: true,
+  },
+  visible: {
+    type: Boolean,
+    default: false,
+  },
+});
+const visible = useVModel(props, "visible");
+const data = reactive({
+  evaluationDialogForm: {},
+  count1: "",
+  count2: "",
+  count3: "",
+});
+const fnGetData = async () => {
+  const resData = await getStudentEvaluation({
+    STUDENT_ID: props.studentId,
+  });
+  data.evaluationDialogForm = resData.pageData;
+  data.count1 = data.pageData.count1;
+  data.count2 = data.pageData.count2;
+  data.count3 = data.pageData.count3;
+};
+
+const fnExport = async () => {
+  await ElMessageBox.confirm("确定要导出吗?", { type: "warning" });
+  window.location.href =
+    import.meta.env[import.meta.env.DEV ? "VITE_PROXY" : "VITE_BASE_URL"] +
+    "student/hs?STUDENT_ID=" +
+    props.studentId;
+};
+watchEffect(() => {
+  if (visible.value) fnGetData();
+});
+</script>
+
+<style scoped lang="scss">
+.flex {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+table {
+  width: 100%;
+  border-collapse: collapse;
+
+  td {
+    border: 1px solid var(--el-border-color);
+    padding: 8px;
+    font-size: 14px;
+    text-align: center;
+  }
+}
+</style>
diff --git a/src/views/effect_appraisal/enterprise_effect/index.vue b/src/views/effect_appraisal/enterprise_effect/index.vue
new file mode 100644
index 0000000..f83314e
--- /dev/null
+++ b/src/views/effect_appraisal/enterprise_effect/index.vue
@@ -0,0 +1,126 @@
+<template>
+  <div>
+    <el-card>
+      <el-form
+        :model="searchForm"
+        label-width="100px"
+        @submit.prevent="fnResetPagination"
+      >
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="班级名称" prop="NAME">
+              <el-input
+                v-model="searchForm.NAME"
+                placeholder="请输入班级名称"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="年份" prop="YEAR">
+              <el-date-picker
+                v-model="searchForm.YEAR"
+                value-format="YYYY"
+                type="year"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label-width="10px">
+              <el-button type="primary" native-type="submit">搜索</el-button>
+              <el-button native-type="reset" @click="fnResetPagination">
+                重置
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <layout-card>
+      <layout-table
+        ref="tableRef"
+        v-model:pagination="pagination"
+        :data="list"
+        @get-data="fnGetData"
+      >
+        <el-table-column type="selection" width="55"> </el-table-column>
+        <el-table-column label="序号" width="60">
+          <template #default="{ $index }">
+            {{ serialNumber(pagination, $index) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="NAME" label="班级名称" width="200" />
+        <el-table-column prop="CODE" label="班级编码" width="200" />
+        <el-table-column prop="TRAINTYPENAME" label="培训类型" width="200" />
+        <el-table-column prop="POSTTYPENAME" label="岗位类型" width="200" />
+        <el-table-column
+          prop="PASSSTUDENTCOUNT"
+          label="效果评估通过人数"
+          width="200"
+        />
+        <el-table-column
+          prop="ALLSTUDENTCOUNT"
+          label="效果评估总人数"
+          width="200"
+        />
+        <el-table-column label="操作">
+          <template #default="{ row }">
+            <el-button
+              type="primary"
+              text
+              link
+              @click="
+                router.push({
+                  path: '/effect_appraisal/enterprise_effect/index/studentStrengthenDetailsList',
+                  query: {
+                    CLASS_ID: row.CLASS_ID,
+                  },
+                })
+              "
+            >
+              学员详情
+            </el-button>
+            <el-button
+              type="primary"
+              text
+              link
+              @click="goClassStrengthenInfo(row.CLASS_ID)"
+            >
+              班级效果评估表
+            </el-button>
+          </template>
+        </el-table-column>
+      </layout-table>
+    </layout-card>
+    <class-strengthen
+      v-model:visible="data.evaluationDialog.visible"
+      :class-id="data.evaluationDialog.CLASS_ID"
+    />
+  </div>
+</template>
+
+<script setup>
+import { serialNumber } from "@/assets/js/utils.js";
+import useListData from "@/assets/js/useListData.js";
+import { reactive, ref } from "vue";
+
+import { getClassStrengthenDetailsList } from "@/request/training_archive_management.js";
+import router from "@/router/index.js";
+import ClassStrengthen from "./components/classStrengthen.vue";
+
+const data = reactive({
+  evaluationDialog: {
+    visible: false,
+    CLASS_ID: "",
+  },
+});
+const tableRef = ref(null);
+const { list, pagination, searchForm, fnGetData, fnResetPagination } =
+  useListData(getClassStrengthenDetailsList);
+
+const goClassStrengthenInfo = (class_id) => {
+  data.evaluationDialog.visible = true;
+  data.evaluationDialog.CLASS_ID = class_id;
+};
+</script>
+<style scoped></style>
diff --git a/src/views/effect_appraisal/enterprise_effect/studentStrengthenDetailsList.vue b/src/views/effect_appraisal/enterprise_effect/studentStrengthenDetailsList.vue
new file mode 100644
index 0000000..e4c0fed
--- /dev/null
+++ b/src/views/effect_appraisal/enterprise_effect/studentStrengthenDetailsList.vue
@@ -0,0 +1,128 @@
+<template>
+  <div>
+    <el-card>
+      <el-form
+        :model="searchForm"
+        label-width="100px"
+        @submit.prevent="fnResetPagination"
+      >
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="姓名" prop="STUDENTNAME">
+              <el-input v-model="searchForm.NAME" placeholder="请输入姓名" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="年份" prop="YEAR">
+              <el-date-picker
+                v-model="searchForm.YEAR"
+                value-format="YYYY"
+                type="year"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label-width="10px">
+              <el-button type="primary" native-type="submit">搜索</el-button>
+              <el-button native-type="reset" @click="fnResetPagination">
+                重置
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <layout-card>
+      <layout-table
+        ref="tableRef"
+        v-model:pagination="pagination"
+        :data="list"
+        @get-data="fnGetData"
+      >
+        <el-table-column type="selection" width="55"> </el-table-column>
+        <el-table-column label="序号" width="60">
+          <template #default="{ $index }">
+            {{ serialNumber(pagination, $index) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="STUDENTNAME" label="姓名" width="200" />
+        <el-table-column prop="USERIDCARD" label="身份证号" width="200" />
+        <el-table-column prop="PHONE" label="手机号" width="200" />
+        <el-table-column
+          prop="STRENGTHENEXAMSTATE"
+          label="效果评估状态"
+          width="200"
+        >
+          <template #default="{ row }">
+            <span>
+              {{ row.STRENGTHENEXAMSTATE === "3" ? "通过" : "未通过" }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="STRENGTHENEXAMSCORE"
+          label="效果评估最高分"
+          width="200"
+        >
+          <template #default="{ row }">
+            <span>
+              {{
+                row.STRENGTHENEXAMSCORE
+                  ? row.STRENGTHENEXAMSCORE
+                  : "未进行评估考试"
+              }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作">
+          <template #default="{ row }">
+            <el-button
+              type="primary"
+              text
+              link
+              @click="goStudentStrengthenInfo(row.STUDENT_ID)"
+            >
+              查看个人效果评估
+            </el-button>
+          </template>
+        </el-table-column>
+      </layout-table>
+    </layout-card>
+    <student-strengthen
+      v-model:visible="data.evaluationDialog.visible"
+      :student-id="data.evaluationDialog.STUDENT_ID"
+    />
+  </div>
+</template>
+
+<script setup>
+import { serialNumber } from "@/assets/js/utils.js";
+import useListData from "@/assets/js/useListData.js";
+import { reactive, ref } from "vue";
+
+import { getStudentStrengthenDetailsList } from "@/request/training_archive_management.js";
+import { useRoute } from "vue-router";
+import StudentStrengthen from "./components/studentStrengthen.vue";
+
+const route = useRoute();
+const { CLASS_ID } = route.query;
+const tableRef = ref(null);
+const data = reactive({
+  evaluationDialog: {
+    visible: false,
+    STUDENT_ID: "",
+  },
+});
+
+const { list, pagination, searchForm, fnGetData, fnResetPagination } =
+  useListData(getStudentStrengthenDetailsList, {
+    otherParams: { CLASS_ID },
+  });
+
+const goStudentStrengthenInfo = (student_id) => {
+  data.evaluationDialog.visible = true;
+  data.evaluationDialog.STUDENT_ID = student_id;
+};
+</script>
+<style scoped></style>
diff --git a/src/views/enterprise_management/department/components/add.vue b/src/views/enterprise_management/department/components/add.vue
index d39e0f4..ffb7450 100644
--- a/src/views/enterprise_management/department/components/add.vue
+++ b/src/views/enterprise_management/department/components/add.vue
@@ -45,14 +45,14 @@
           v-model="form.ISSUPERVISE"
           @change="fnChangeRegulatoryAuthorities"
         >
-          <el-radio label="1">是</el-radio>
-          <el-radio label="0">否</el-radio>
+          <el-radio value="1">是</el-radio>
+          <el-radio value="0">否</el-radio>
         </el-radio-group>
       </el-form-item>
       <el-form-item label="是否外来人员部门" prop="FOREIGNPERSONNEL">
         <el-radio-group v-model="form.FOREIGNPERSONNEL">
-          <el-radio label="1">是</el-radio>
-          <el-radio label="0">否</el-radio>
+          <el-radio value="1">是</el-radio>
+          <el-radio value="0">否</el-radio>
         </el-radio-group>
       </el-form-item>
       <el-form-item
diff --git a/src/views/enterprise_management/post/components/add.vue b/src/views/enterprise_management/post/components/add.vue
index 490bc71..8f3dc47 100644
--- a/src/views/enterprise_management/post/components/add.vue
+++ b/src/views/enterprise_management/post/components/add.vue
@@ -23,8 +23,8 @@
       </el-form-item>
       <el-form-item label="状态" prop="STATUS">
         <el-radio-group v-model="form.STATUS">
-          <el-radio label="0">启用</el-radio>
-          <el-radio label="1">禁用</el-radio>
+          <el-radio value="0">启用</el-radio>
+          <el-radio value="1">禁用</el-radio>
         </el-radio-group>
       </el-form-item>
       <el-form-item label="告知卡" prop="files">
diff --git a/src/views/enterprise_management/user/add.vue b/src/views/enterprise_management/user/add.vue
index a13fb56..23b5180 100644
--- a/src/views/enterprise_management/user/add.vue
+++ b/src/views/enterprise_management/user/add.vue
@@ -178,16 +178,16 @@
             <el-col :span="24">
               <el-form-item label="是否主要负责人" prop="ISHEAD">
                 <el-radio-group v-model="data.form.ISHEAD">
-                  <el-radio label="1">是</el-radio>
-                  <el-radio label="0">否</el-radio>
+                  <el-radio value="1">是</el-radio>
+                  <el-radio value="0">否</el-radio>
                 </el-radio-group>
               </el-form-item>
             </el-col>
             <el-col :span="24">
               <el-form-item label="是否部门领导" prop="ISLEADER">
                 <el-radio-group v-model="data.form.ISLEADER">
-                  <el-radio label="1">是</el-radio>
-                  <el-radio label="0">否</el-radio>
+                  <el-radio value="1">是</el-radio>
+                  <el-radio value="0">否</el-radio>
                 </el-radio-group>
                 <el-tooltip
                   content="温馨提示:部门领导可以审核离岗申请,查看同部门清单数据"
diff --git a/src/views/hidden_danger_government/acceptance/acceptance.vue b/src/views/hidden_danger_government/acceptance/acceptance.vue
index bc2ad84..1ef613e 100644
--- a/src/views/hidden_danger_government/acceptance/acceptance.vue
+++ b/src/views/hidden_danger_government/acceptance/acceptance.vue
@@ -12,8 +12,8 @@
         <el-col :span="24">
           <el-form-item label="是否合格" prop="ISQUALIFIED">
             <el-radio-group v-model="data.form.ISQUALIFIED">
-              <el-radio label="1">是</el-radio>
-              <el-radio label="2">否</el-radio>
+              <el-radio value="1">是</el-radio>
+              <el-radio value="2">否</el-radio>
             </el-radio-group>
           </el-form-item>
         </el-col>
diff --git a/src/views/hidden_danger_government/rectification/rectification.vue b/src/views/hidden_danger_government/rectification/rectification.vue
index c7f16c7..d2cc1bd 100644
--- a/src/views/hidden_danger_government/rectification/rectification.vue
+++ b/src/views/hidden_danger_government/rectification/rectification.vue
@@ -21,8 +21,8 @@
                   :model-value="data.form.IS_NORMAL"
                   @change="fnIsNormalChange"
                 >
-                  <el-radio label="1">是</el-radio>
-                  <el-radio label="2">否</el-radio>
+                  <el-radio value="1">是</el-radio>
+                  <el-radio value="2">否</el-radio>
                 </el-radio-group>
               </el-form-item>
             </el-col>
@@ -168,7 +168,7 @@
               <el-col :span="24">
                 <el-form-item label="整改方案" prop="HAVESCHEME">
                   <el-radio-group v-model="data.form.HAVESCHEME">
-                    <el-radio label="1" value="1">有</el-radio>
+                    <el-radio value="1">有</el-radio>
                     <el-radio :disabled="data.info.ISCONFIRM === '1'" label="0">
                       无
                     </el-radio>
@@ -245,7 +245,7 @@
               <el-col :span="24">
                 <el-form-item label="整改计划" prop="HAVEPLAN">
                   <el-radio-group v-model="data.form.HAVEPLAN">
-                    <el-radio label="1" value="1">有</el-radio>
+                    <el-radio value="1">有</el-radio>
                     <el-radio :disabled="data.info.ISCONFIRM === '1'" label="0">
                       无
                     </el-radio>
diff --git a/src/views/training_process_management/class_management/add.vue b/src/views/training_process_management/class_management/add.vue
new file mode 100644
index 0000000..c4281b5
--- /dev/null
+++ b/src/views/training_process_management/class_management/add.vue
@@ -0,0 +1,57 @@
+<template>
+  <layout-card>
+    <el-tabs v-model="active" @tab-change="fnTabChange">
+      <el-tab-pane
+        label="基本信息"
+        :name="
+          type === 'add'
+            ? '/training_process_management/class_management/add'
+            : type === 'edit'
+            ? '/training_process_management/class_management/edit'
+            : '/training_process_management/class_management/view'
+        "
+        lazy
+        :disabled="!CLASS_ID"
+      >
+        <basic-info />
+      </el-tab-pane>
+      <el-tab-pane
+        label="学员"
+        name="/training_process_management/class_management/student"
+        lazy
+        :disabled="!CLASS_ID"
+      >
+        <student />
+      </el-tab-pane>
+      <el-tab-pane
+        label="课程"
+        name="/training_process_management/class_management/curriculum"
+        lazy
+        :disabled="!CLASS_ID"
+      >
+        <curriculum />
+      </el-tab-pane>
+    </el-tabs>
+  </layout-card>
+</template>
+
+<script setup>
+import BasicInfo from "./components/basic_info.vue";
+import Student from "./components/student.vue";
+import Curriculum from "./components/curriculum.vue";
+import { ref } from "vue";
+import { useRoute, useRouter } from "vue-router";
+
+const router = useRouter();
+const route = useRoute();
+const { CLASS_ID, type } = route.query;
+const active = ref(route.path);
+const fnTabChange = (path) => {
+  router.replace({
+    path,
+    query: { ...route.query },
+  });
+};
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/components/add_student.vue b/src/views/training_process_management/class_management/components/add_student.vue
new file mode 100644
index 0000000..86df482
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/add_student.vue
@@ -0,0 +1,170 @@
+<template>
+  <el-dialog v-model="visible" title="添加学员">
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="发布类型" prop="releaseType">
+            <el-radio-group v-model="form.releaseType">
+              <el-radio value="1">按身份发布</el-radio>
+              <el-radio value="2">按人员发布</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="从业身份" prop="personnelTypes">
+            <el-checkbox-group
+              v-model="form.personnelTypes"
+              @change="fnGetDataTransfer"
+            >
+              <el-checkbox
+                v-for="item in personnelTypeList"
+                :key="item.DICTIONARIES_ID"
+                :label="item.NAME"
+                :value="item.DICTIONARIES_ID"
+              />
+            </el-checkbox-group>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <layout-table
+      ref="tableRef"
+      :data="list"
+      :show-pagination="false"
+      max-height="500"
+      row-key="USER_ID"
+    >
+      <el-table-column
+        v-if="form.releaseType === '2'"
+        reserve-selection
+        type="selection"
+        width="55"
+      />
+      <el-table-column label="序号" width="60" type="index" />
+      <el-table-column prop="NAME" label="姓名" />
+      <el-table-column prop="DEPARTMENT_NAME" label="部门" />
+      <el-table-column prop="POST_NAME" label="岗位" />
+      <el-table-column prop="USER_ID_CARD" label="身份证号" />
+      <el-table-column prop="PERSONNEL_TYPE_NAME" label="从业身份" />
+    </layout-table>
+    <template #footer>
+      <el-button @click="fnClose">关闭</el-button>
+      <el-button type="primary" @click="fnSubmit">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { useVModels } from "@vueuse/core";
+import useListData from "@/assets/js/useListData.js";
+import {
+  getClassManagementSelectStudentAdd,
+  getClassManagementSelectStudentList,
+} from "@/request/training_process_management.js";
+import { layoutFnGetPersonnelType } from "@/assets/js/data_dictionary.js";
+import { ref, watch } from "vue";
+import { debounce } from "throttle-debounce";
+import useFormValidate from "@/assets/js/useFormValidate.js";
+import { ElMessage } from "element-plus";
+import { useRoute } from "vue-router";
+
+const route = useRoute();
+const { CLASS_ID, EXAMINATION } = route.query;
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+    default: false,
+  },
+  form: {
+    type: Object,
+    required: true,
+    default: () => ({}),
+  },
+  selectList: {
+    type: Array,
+    required: true,
+    default: () => [],
+  },
+});
+const emits = defineEmits(["update:visible", "update:form", "get-data"]);
+const { visible, form } = useVModels(props, emits);
+const { list, fnGetData, tableRef } = useListData(
+  getClassManagementSelectStudentList,
+  {
+    usePagination: false,
+    key: "userList",
+    immediate: false,
+    callbackFn: (list) => {
+      for (let i = 0; i < props.selectList.length; i++) {
+        for (let j = 0; j < list.length; j++) {
+          if (list[j].USER_ID === props.selectList[i].USER_ID) {
+            list.splice(j, 1);
+            break;
+          }
+        }
+      }
+    },
+  }
+);
+const rules = {
+  releaseType: [{ required: true, message: "请选择发布类型", trigger: "blur" }],
+  personnelTypes: [
+    { required: true, message: "请选择从业身份", trigger: "blur" },
+  ],
+};
+const formRef = ref(null);
+const fnGetDataTransfer = () => {
+  fnGetData({
+    PERSONNEL_TYPES: form.value.personnelTypes.join(","),
+  });
+};
+watch(
+  () => visible.value,
+  () => {
+    if (visible.value) {
+      if (form.value.personnelTypes.length > 0) fnGetDataTransfer();
+    }
+  }
+);
+const personnelTypeList = await layoutFnGetPersonnelType();
+const fnClose = () => {
+  formRef.value.resetFields();
+  tableRef.value.clearSelection();
+  visible.value = false;
+};
+const fnSubmit = debounce(
+  1000,
+  async () => {
+    await useFormValidate(formRef);
+    if (list.value.length === 0) {
+      ElMessage.warning("当前从业身份没有学习人员,请重新选择");
+      return;
+    }
+    let currentIds = "";
+    if (form.value.releaseType === "1") {
+      currentIds = list.value.map((item) => item.USER_ID).join(",");
+    } else {
+      const selectionData = tableRef.value.getSelectionRows();
+      if (selectionData.length === 0) {
+        ElMessage.warning("请选择学员");
+        return;
+      }
+      currentIds = selectionData.map((item) => item.USER_ID).join(",");
+    }
+    await getClassManagementSelectStudentAdd({
+      RELEASE_TYPE: form.value.releaseType,
+      PERSONNEL_TYPES: form.value.personnelTypes.join(","),
+      CLASS_ID,
+      EXAMINATION,
+      userIds: currentIds,
+    });
+    ElMessage.success("添加成功");
+    fnClose();
+    emits("get-data");
+  },
+  { atBegin: true }
+);
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/components/basic_info.vue b/src/views/training_process_management/class_management/components/basic_info.vue
new file mode 100644
index 0000000..bade4d1
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/basic_info.vue
@@ -0,0 +1,370 @@
+<template>
+  <el-form ref="formRef" :model="data.form" :rules="rules" label-width="160px">
+    <el-row>
+      <el-col :span="24">
+        <el-divider content-position="left">基本信息</el-divider>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="班级名称" prop="NAME">
+          <el-input
+            v-model="data.form.NAME"
+            placeholder="请输入班级名称"
+            :disabled="isEdit"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="培训日期" prop="TIME">
+          <el-date-picker
+            v-model="data.form.TIME"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            :disabled="isEdit"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="培训类型" prop="TRAINTYPE">
+          <layout-learning-train-type
+            ref="trainingTypeRef"
+            v-model="data.form.TRAINTYPE"
+            type="trainingType"
+            :disabled="isEdit"
+            @update:model-value="
+              data.form.POSTTYPE = '';
+              data.form.TRAINLEVEL = '';
+            "
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="岗位类型" prop="POSTTYPE">
+          <layout-learning-train-type
+            ref="postTypeRef"
+            v-model="data.form.POSTTYPE"
+            type="postType"
+            :search-value="data.form.TRAINTYPE"
+            :disabled="isEdit"
+            @update:model-value="data.form.TRAINLEVEL = ''"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item
+          label="培训级别"
+          prop="TRAINLEVEL"
+          :rules="[
+            {
+              required: data.trainingLevelList.length !== 0,
+              message: '请选择培训级别',
+              trigger: 'change',
+            },
+          ]"
+        >
+          <layout-learning-train-type
+            ref="trainingLevelRef"
+            v-model="data.form.TRAINLEVEL"
+            type="trainingLevel"
+            :search-value="data.form.POSTTYPE"
+            :disabled="isEdit"
+            @throw-data="data.trainingLevelList = $event"
+          />
+        </el-form-item>
+      </el-col>
+      <template
+        v-if="
+          data.form.TRAINTYPE &&
+          data.form.TRAINTYPE !== 'c70bf859512241579a8a30fc5d1ae153'
+        "
+      >
+        <el-col :span="12">
+          <el-form-item label="记录人员" prop="RECORDOR">
+            <el-select
+              v-model="data.form.RECORDOR"
+              filterable
+              :disabled="isEdit"
+            >
+              <el-option
+                v-for="item in data.recordingPersonnelList"
+                :key="item.USERSIGNID"
+                :value="item.USERSIGNID"
+                :label="item.USERNAME"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="考核人员" prop="ASSESSOR">
+            <el-select
+              v-model="data.form.ASSESSOR"
+              filterable
+              :disabled="isEdit"
+            >
+              <el-option
+                v-for="item in data.assessorsList"
+                :key="item.USERSIGNID"
+                :value="item.USERSIGNID"
+                :label="item.USERNAME"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="安全管理部门负责人" prop="SAFETYDEPTOR">
+            <el-select
+              v-model="data.form.SAFETYDEPTOR"
+              filterable
+              :disabled="isEdit"
+            >
+              <el-option
+                v-for="item in data.headOfSafetyManagementDepartmentList"
+                :key="item.USERSIGNID"
+                :value="item.USERSIGNID"
+                :label="item.USERNAME"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="负责人" prop="PRINCIPAL">
+            <el-input
+              v-model="data.form.PRINCIPAL"
+              placeholder="请输入负责人"
+              :disabled="isEdit"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="负责人电话" prop="PRINCIPAL_PHONE">
+            <el-input
+              v-model="data.form.PRINCIPAL_PHONE"
+              placeholder="请输入负责人电话"
+              :disabled="isEdit"
+            />
+          </el-form-item>
+        </el-col>
+      </template>
+      <el-col :span="24">
+        <el-divider content-position="left">基本设置</el-divider>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="是否开启考试" prop="EXAMINATION">
+          <el-radio-group v-model="data.form.EXAMINATION" :disabled="isEdit">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
+          <span class="ml-10">
+            不考试的班级,学员学习完所有课程,即为完成学业。
+          </span>
+        </el-form-item>
+      </el-col>
+      <el-col v-if="data.form.EXAMINATION === 1" :span="12">
+        <el-form-item label="考试次数" prop="NUMBEROFEXAMS">
+          <div style="flex: 1; display: flex">
+            <el-input-number
+              v-model="data.form.NUMBEROFEXAMS"
+              :min="1"
+              :max="2147483600"
+              :disabled="isEdit"
+            />
+            <el-button
+              v-if="STATE && STATE !== '1' && STATE !== '6'"
+              type="primary"
+              class="ml-10"
+              @click="fnModifyExamTimes"
+            >
+              修改考试次数
+            </el-button>
+          </div>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="是否人脸识别" prop="ISFACE">
+          <el-radio-group v-model="data.form.ISFACE" :disabled="isEdit">
+            <el-radio label="1">是</el-radio>
+            <el-radio label="0">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-col>
+      <el-col v-if="data.form.EXAMINATION === 1" :span="12">
+        <el-form-item label="是否效果评估" prop="ISSTRENGTHEN">
+          <el-radio-group v-model="data.form.ISSTRENGTHEN" :disabled="isEdit">
+            <el-radio label="2">强制</el-radio>
+            <el-radio label="1">是</el-radio>
+            <el-radio label="0">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+  <div v-if="!isEdit" class="mt-10 tc">
+    <el-button type="primary" @click="fnSubmit">
+      {{ !CLASS_ID ? "保存并下一步" : "保存" }}
+    </el-button>
+  </div>
+  <modify-exam-times
+    :id="CLASS_ID"
+    v-model:visible="data.modifyExamTimesDialog.visible"
+    v-model:form="data.modifyExamTimesDialog.form"
+    @get-data="fnGetData"
+  />
+</template>
+
+<script setup>
+import { nextTick, reactive, ref } from "vue";
+import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
+import {
+  getClassManagementView,
+  getPersonnelList,
+  setClassManagementAdd,
+  setClassManagementEdit,
+} from "@/request/training_process_management.js";
+import { debounce } from "throttle-debounce";
+import useFormValidate from "@/assets/js/useFormValidate.js";
+import { ElMessage } from "element-plus";
+import { useRoute, useRouter } from "vue-router";
+import ModifyExamTimes from "./modify_exam_times.vue";
+
+const route = useRoute();
+const router = useRouter();
+const { STATE, CLASS_ID, type } = route.query;
+const isEdit = STATE && STATE !== "1";
+const formRef = ref(null);
+const trainingTypeRef = ref(null);
+const postTypeRef = ref(null);
+const trainingLevelRef = ref(null);
+const data = reactive({
+  recordingPersonnelList: [],
+  assessorsList: [],
+  headOfSafetyManagementDepartmentList: [],
+  trainingLevelList: [],
+  form: {
+    NAME: "",
+    TIME: "",
+    TRAINTYPE: "",
+    POSTTYPE: "",
+    TRAINLEVEL: "",
+    RECORDOR: "",
+    ASSESSOR: "",
+    SAFETYDEPTOR: "",
+    PRINCIPAL: "",
+    PRINCIPAL_PHONE: "",
+    EXAMINATION: 1,
+    NUMBEROFEXAMS: 1,
+    ISFACE: "1",
+    ISSTRENGTHEN: "1",
+  },
+  modifyExamTimesDialog: {
+    visible: false,
+    form: { NUMBEROFEXAMS: 1, source: 1 },
+  },
+});
+const rules = {
+  NAME: [{ required: true, message: "请输入班级名称", trigger: "blur" }],
+  TIME: [{ required: true, message: "请选择培训日期", trigger: "change" }],
+  TRAINTYPE: [{ required: true, message: "请选择培训类型", trigger: "change" }],
+  POSTTYPE: [{ required: true, message: "请选择岗位类型", trigger: "change" }],
+  RECORDOR: [{ required: true, message: "请选择记录人员", trigger: "change" }],
+  ASSESSOR: [{ required: true, message: "请选择考核人员", trigger: "change" }],
+  SAFETYDEPTOR: [
+    { required: true, message: "请选择安全管理部门负责人", trigger: "change" },
+  ],
+  PRINCIPAL: [{ required: true, message: "请输入负责人", trigger: "blur" }],
+  PRINCIPAL_PHONE: [
+    { required: true, message: "请输入负责人电话", trigger: "blur" },
+    {
+      pattern:
+        /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/,
+      message: "请输入正确的手机号码",
+    },
+  ],
+  EXAMINATION: [
+    { required: true, message: "请选择是否开启考试", trigger: "change" },
+  ],
+  ISFACE: [
+    { required: true, message: "请选择是否人脸识别", trigger: "change" },
+  ],
+  ISSTRENGTHEN: [
+    { required: true, message: "请选择是否效果评估", trigger: "change" },
+  ],
+  NUMBEROFEXAMS: [
+    { required: true, message: "请输入考试次数", trigger: "blur" },
+  ],
+};
+const fnGetData = async () => {
+  if (!CLASS_ID) return;
+  const resData = await getClassManagementView({ CLASS_ID });
+  resData.pd.TIME = [resData.pd.START_TIME, resData.pd.END_TIME];
+  data.form = resData.pd;
+};
+fnGetData();
+const fnGetPersonnelList = async () => {
+  const { varList: recordingPersonnelList } = await getPersonnelList({
+    USERSIGNTYPE: "854c77daf3734384807a638dfafe04d5",
+  });
+  const { varList: assessorsList } = await getPersonnelList({
+    USERSIGNTYPE: "f2726f92987d4f77be1c3f0460669418",
+  });
+  const { varList: headOfSafetyManagementDepartmentList } =
+    await getPersonnelList({
+      USERSIGNTYPE: "5f4794189cf24fc2a7e12fa47b70139e",
+    });
+  data.recordingPersonnelList = recordingPersonnelList;
+  data.assessorsList = assessorsList;
+  data.headOfSafetyManagementDepartmentList =
+    headOfSafetyManagementDepartmentList;
+};
+fnGetPersonnelList();
+const fnSubmit = debounce(
+  1000,
+  async () => {
+    await useFormValidate(formRef);
+    const params = {
+      ...data.form,
+      ISSTRENGTHEN: data.form.EXAMINATION === 1 ? data.form.ISSTRENGTHEN : "0",
+      START_TIME: data.form.TIME[0],
+      END_TIME: data.form.TIME[1],
+      SAMPLINGNUMBER: "0",
+      TRAINTYPE_NAME: trainingTypeRef.value.getCurrentNode().NAME,
+      POSTTYPE_NAME: postTypeRef.value.getCurrentNode().NAME,
+      TRAINLEVEL_NAME: trainingLevelRef.value.getCurrentNode().NAME || "",
+      trainAllName:
+        trainingTypeRef.value.getCurrentNode().NAME +
+        "-" +
+        postTypeRef.value.getCurrentNode().NAME,
+    };
+    let resData;
+    !CLASS_ID
+      ? (resData = await setClassManagementAdd(params))
+      : await setClassManagementEdit(params);
+    ElMessage.success("提交成功");
+    await router.replace({
+      path: !CLASS_ID
+        ? "/training_process_management/class_management/student"
+        : type === "add"
+        ? "/training_process_management/class_management/add"
+        : "/training_process_management/class_management/edit",
+      query: {
+        ...route.query,
+        CLASS_ID: !CLASS_ID ? resData.CLASS_ID : CLASS_ID,
+        TRAINTYPE: data.form.TRAINTYPE,
+        EXAMINATION: data.form.EXAMINATION,
+        ISSTRENGTHEN: data.form.ISSTRENGTHEN,
+      },
+    });
+  },
+  { atBegin: true }
+);
+const fnModifyExamTimes = async () => {
+  data.modifyExamTimesDialog.visible = true;
+  await nextTick();
+  data.modifyExamTimesDialog.form.NUMBEROFEXAMS = data.form.NUMBEROFEXAMS;
+  data.modifyExamTimesDialog.form.source = data.form.NUMBEROFEXAMS;
+};
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/components/curriculum.vue b/src/views/training_process_management/class_management/components/curriculum.vue
new file mode 100644
index 0000000..e95413c
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/curriculum.vue
@@ -0,0 +1,28 @@
+<template>
+  <div>
+    <div v-if="!isEdit" class="mt-10 tc">
+      <el-button
+        @click="
+          router.replace({
+            path: '/training_process_management/class_management/student',
+            query: { ...route.query },
+          })
+        "
+      >
+        上一步
+      </el-button>
+      <el-button type="primary"> 完成 </el-button>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { useRoute, useRouter } from "vue-router";
+
+const route = useRoute();
+const router = useRouter();
+const { STATE } = route.query;
+const isEdit = STATE && STATE !== "1";
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/components/delay.vue b/src/views/training_process_management/class_management/components/delay.vue
new file mode 100644
index 0000000..3d2fd34
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/delay.vue
@@ -0,0 +1,61 @@
+<template>
+  <el-dialog v-model="visible" title="延期" :on-close="fnClose">
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="60px">
+      <el-form-item label="日期" prop="TIME">
+        <el-date-picker
+          v-model="form.TIME"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          :disabled-date="fnDisabledDate"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="fnClose">取消</el-button>
+      <el-button type="primary" @click="fnSubmit">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { useVModels } from "@vueuse/core";
+import { ref } from "vue";
+import useFormValidate from "@/assets/js/useFormValidate.js";
+import { setClassManagementDelay } from "@/request/training_process_management.js";
+import { ElMessage } from "element-plus";
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+    default: false,
+  },
+  form: {
+    type: Object,
+    required: true,
+    default: () => {},
+  },
+});
+const emits = defineEmits(["update:visible", "update:form", "get-data"]);
+const { visible, form } = useVModels(props, emits);
+const formRef = ref(null);
+const rules = {
+  TIME: [{ required: true, message: "请选择日期", trigger: "change" }],
+};
+const fnDisabledDate = (time) => {
+  return time.getTime() <= new Date(form.value.TIME).getTime();
+};
+const fnClose = () => {
+  formRef.value.resetFields();
+  visible.value = false;
+};
+const fnSubmit = async () => {
+  await useFormValidate(formRef);
+  await setClassManagementDelay({ ...form.value });
+  ElMessage.success("延期成功");
+  fnClose();
+  emits("get-data");
+};
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/components/exam_details.vue b/src/views/training_process_management/class_management/components/exam_details.vue
new file mode 100644
index 0000000..78531be
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/exam_details.vue
@@ -0,0 +1,107 @@
+<template>
+  <el-dialog v-model="visible" title="考试详情" width="70%">
+    <el-divider content-position="left">考试学员信息</el-divider>
+    <div style="display: flex; justify-content: space-around">
+      <div>学员名字:{{ info.USERNAME }}</div>
+      <div>考试时间:{{ info.EXAMTIMEBEGIN + "至" + info.EXAMTIMEEND }}</div>
+      <div>得分:{{ info.EXAMSCORE }}</div>
+    </div>
+    <el-divider content-position="left">试卷基本信息</el-divider>
+    <div style="display: flex; justify-content: space-around">
+      <div>试卷名称:{{ info.EXAMNAME }}</div>
+      <div>试卷总分:{{ info.PAPEREXAMSCORE }}</div>
+      <div>考试时长:{{ info.ANSWERSHEETTIME }}分钟</div>
+      <div>通过分数:{{ info.PASSSCORE }}</div>
+    </div>
+    <el-divider content-position="left">试卷内容信息</el-divider>
+    <div class="items mt-20 p-20">
+      <div
+        v-for="(item, index) in info.QUESTIONLIST"
+        :key="item.PAPER_QUESTION_ID"
+        class="item ptb-20"
+      >
+        <div class="mt-10">
+          {{ index + 1 }}.
+          <span v-if="item.QUESTIONTYPE === '1'"> (单选题) </span>
+          <span v-if="item.QUESTIONTYPE === '2'"> (多选题) </span>
+          <span v-if="item.QUESTIONTYPE === '3'"> (判断题) </span>
+          {{ item.QUESTIONDRY }}
+          <span class="ml-10">(题目分值:{{ item.SCORE }})</span>
+        </div>
+        <div class="mt-10 ml-30">
+          <el-radio-group
+            v-if="item.QUESTIONTYPE === '1'"
+            disabled
+            :model-value="item.ANSWER"
+          >
+            <el-radio label="A">A.{{ item.OPTIONA }}</el-radio>
+            <el-radio label="B">B.{{ item.OPTIONB }}</el-radio>
+            <el-radio label="C">C.{{ item.OPTIONC }}</el-radio>
+            <el-radio label="D">D.{{ item.OPTIOND }}</el-radio>
+          </el-radio-group>
+          <el-checkbox-group
+            v-if="item.QUESTIONTYPE === '2'"
+            disabled
+            :model-value="item.ANSWER?.split('')"
+          >
+            <el-checkbox label="A">A.{{ item.OPTIONA }}</el-checkbox>
+            <el-checkbox label="B">B.{{ item.OPTIONB }}</el-checkbox>
+            <el-checkbox label="C">C.{{ item.OPTIONC }}</el-checkbox>
+            <el-checkbox label="D">D.{{ item.OPTIOND }}</el-checkbox>
+          </el-checkbox-group>
+          <el-radio-group
+            v-if="item.QUESTIONTYPE === '3'"
+            disabled
+            :model-value="item.ANSWER"
+          >
+            <el-radio label="A">A.{{ item.OPTIONA }}</el-radio>
+            <el-radio label="B">B.{{ item.OPTIONB }}</el-radio>
+          </el-radio-group>
+        </div>
+        <div class="mt-10">答案:{{ item.ANSWER }}</div>
+        <div class="mt-10">答案解析:{{ item.DESCR }}</div>
+        <div class="mt-10">关联课件名称:{{ item.COURSEWARENAME }}</div>
+      </div>
+    </div>
+    <template #footer>
+      <el-button @click="visible = false">关闭</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { useVModel } from "@vueuse/core";
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+    default: false,
+  },
+  info: {
+    type: Object,
+    required: true,
+    default: () => ({}),
+  },
+});
+const emits = defineEmits(["update:visible"]);
+const visible = useVModel(props, "visible", emits);
+</script>
+
+<style scoped lang="scss">
+.items {
+  border: 1px solid var(--el-border-color);
+
+  .item {
+    border-bottom: 1px dashed #ebeef5;
+
+    &:first-child {
+      padding-top: 0;
+    }
+
+    &:last-child {
+      border-bottom: none;
+    }
+  }
+}
+</style>
diff --git a/src/views/training_process_management/class_management/components/exam_records.vue b/src/views/training_process_management/class_management/components/exam_records.vue
new file mode 100644
index 0000000..3831000
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/exam_records.vue
@@ -0,0 +1,102 @@
+<template>
+  <div>
+    <el-form
+      :model="searchForm"
+      label-width="80px"
+      @submit.prevent="fnResetPagination"
+    >
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="试卷名称" prop="KEYWORDS">
+            <el-input v-model="searchForm.KEYWORDS" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label-width="10px">
+            <el-button type="primary" native-type="submit">搜索</el-button>
+            <el-button native-type="reset" @click="fnResetPagination">
+              重置
+            </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <layout-table
+      v-model:pagination="pagination"
+      :data="list"
+      @get-data="fnGetData"
+    >
+      <el-table-column label="序号" width="60" fixed="left">
+        <template #default="{ $index }">
+          {{ serialNumber(pagination, $index) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="试卷名称" prop="EXAMNAME" />
+      <el-table-column label="成绩" prop="EXAMSCORE" width="100" />
+      <el-table-column label="是否通过" width="100">
+        <template #default="{ row }">
+          {{ row.RESULT === "0" ? "未通过" : "" }}
+          {{ row.RESULT === "1" ? "通过" : "" }}
+        </template>
+      </el-table-column>
+      <el-table-column label="正确题数" prop="EXAMQUESTIONRIGHT" width="100" />
+      <el-table-column label="错误题数" prop="EXAMQUESTIONWRONG" width="100" />
+      <el-table-column label="正确率(%)" prop="ACCURACY" width="100" />
+      <el-table-column label="考试时间" width="300">
+        <template #default="{ row }">
+          {{ row.EXAMTIMEBEGIN + "至" + row.EXAMTIMEEND }}
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="80px">
+        <template #default="{ row }">
+          <el-button
+            type="primary"
+            text
+            link
+            @click="fnExamDetails(row.STAGEEXAM_ID)"
+          >
+            考试详情
+          </el-button>
+        </template>
+      </el-table-column>
+    </layout-table>
+    <exam-details
+      v-model:visible="data.examDetailsDialog.visible"
+      :info="data.examDetailsDialog.info"
+    />
+  </div>
+</template>
+
+<script setup>
+import useListData from "@/assets/js/useListData.js";
+import {
+  getClassManagementStudentExamRecordsList,
+  getClassManagementStudentExamRecordsView,
+} from "@/request/training_process_management.js";
+import { useRoute } from "vue-router";
+import { serialNumber } from "@/assets/js/utils.js";
+import { reactive } from "vue";
+import ExamDetails from "./exam_details.vue";
+
+const route = useRoute();
+const { STUDENT_ID, CLASS_ID } = route.query;
+const { list, pagination, searchForm, fnGetData, fnResetPagination } =
+  useListData(getClassManagementStudentExamRecordsList, {
+    otherParams: { STUDENT_ID, CLASS_ID },
+  });
+const data = reactive({
+  examDetailsDialog: {
+    visible: false,
+    info: {},
+  },
+});
+const fnExamDetails = async (STAGEEXAM_ID) => {
+  const resData = await getClassManagementStudentExamRecordsView({
+    STAGEEXAM_ID,
+  });
+  data.examDetailsDialog.info = resData.pd;
+  data.examDetailsDialog.visible = true;
+};
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/components/learning_records.vue b/src/views/training_process_management/class_management/components/learning_records.vue
new file mode 100644
index 0000000..075dbb9
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/learning_records.vue
@@ -0,0 +1,74 @@
+<template>
+  <div>
+    <el-form :model="searchForm" label-width="80px" @submit.prevent="fnGetData">
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="课程名称" prop="CURRICULUMNAME">
+            <el-input v-model="searchForm.CURRICULUMNAME" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="小节名称" prop="CHAPTERNAME">
+            <el-input v-model="searchForm.CHAPTERNAME" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="学习状态" prop="STATE">
+            <el-select v-model="searchForm.STATE">
+              <el-option
+                v-for="item in stateList"
+                :key="item.ID"
+                :label="item.NAME"
+                :value="item.ID"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label-width="10px">
+            <el-button type="primary" native-type="submit">搜索</el-button>
+            <el-button native-type="reset" @click="fnGetData"> 重置 </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <layout-table :data="list" :show-pagination="false">
+      <el-table-column label="序号" width="60" type="index" />
+      <el-table-column label="课程名称" prop="CURRICULUMNAME" />
+      <el-table-column label="小节名称" prop="CHAPTERNAME" />
+      <el-table-column label="学习情况" width="150">
+        <template #default="{ row }">
+          <span v-if="row.FINISHTIME">已完成</span>
+          <span v-else-if="row.CREATTIME">学习中</span>
+          <span v-else>未学习</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="开始学习时间" prop="CREATTIME" width="150" />
+      <el-table-column label="完成时间" prop="FINISHTIME" width="150" />
+      <el-table-column label="最近观看时间" prop="OPERATTIME" width="150" />
+    </layout-table>
+  </div>
+</template>
+
+<script setup>
+import useListData from "@/assets/js/useListData.js";
+import { getClassManagementStudentLearningRecordsList } from "@/request/training_process_management.js";
+import { useRoute } from "vue-router";
+
+const route = useRoute();
+const { STUDENT_ID, CLASS_ID } = route.query;
+const stateList = [
+  { ID: "-1", NAME: "未学习" },
+  { ID: "0", NAME: "学习中" },
+  { ID: "1", NAME: "已完成" },
+];
+const { list, searchForm, fnGetData } = useListData(
+  getClassManagementStudentLearningRecordsList,
+  {
+    otherParams: { STUDENT_ID, CLASS_ID },
+    usePagination: false,
+  }
+);
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/components/modify_exam_times.vue b/src/views/training_process_management/class_management/components/modify_exam_times.vue
new file mode 100644
index 0000000..14eed98
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/modify_exam_times.vue
@@ -0,0 +1,70 @@
+<template>
+  <el-dialog v-model="visible" title="修改考试次数" :on-close="fnClose">
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="原考试次数" prop="source">
+        <el-input-number v-model="form.source" disabled />
+      </el-form-item>
+      <el-form-item label="新考试次数" prop="NUMBEROFEXAMS">
+        <el-input-number v-model="form.NUMBEROFEXAMS" :min="+form.source + 1" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="fnClose">取消</el-button>
+      <el-button type="primary" @click="fnSubmit">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { useVModels } from "@vueuse/core";
+import { ref } from "vue";
+import useFormValidate from "@/assets/js/useFormValidate.js";
+import { setClassManagementModifyExamTimes } from "@/request/training_process_management.js";
+import { ElMessage, ElMessageBox } from "element-plus";
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+    default: false,
+  },
+  form: {
+    type: Object,
+    required: true,
+    default: () => {},
+  },
+  id: {
+    type: String,
+    required: true,
+    default: "",
+  },
+});
+const emits = defineEmits(["update:visible", "update:form", "get-data"]);
+const { visible, form } = useVModels(props, emits);
+const formRef = ref(null);
+const rules = {
+  NUMBEROFEXAMS: [
+    { required: true, message: "请填写考试次数", trigger: "blur" },
+  ],
+};
+const fnClose = () => {
+  formRef.value.resetFields();
+  visible.value = false;
+};
+const fnSubmit = async () => {
+  await useFormValidate(formRef);
+  await ElMessageBox.confirm(
+    "确定要修改该班级的考试次数吗?考试已通过的学员不受影响",
+    { type: "warning" }
+  );
+  await setClassManagementModifyExamTimes({
+    ...form.value,
+    CLASS_ID: props.id,
+  });
+  ElMessage.success("修改成功");
+  fnClose();
+  emits("get-data");
+};
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/components/student.vue b/src/views/training_process_management/class_management/components/student.vue
new file mode 100644
index 0000000..751aeae
--- /dev/null
+++ b/src/views/training_process_management/class_management/components/student.vue
@@ -0,0 +1,358 @@
+<template>
+  <div>
+    <el-form
+      :model="searchForm"
+      label-width="100px"
+      @submit.prevent="fnGetDataTransfer"
+    >
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="姓名" prop="NAME">
+            <el-input v-model="searchForm.NAME" placeholder="请输入姓名" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="部门" prop="DEPARTMENT_ID">
+            <layout-department
+              v-model="searchForm.DEPARTMENT_ID"
+              @update:model-value="fnGetPost"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="岗位" prop="POST_ID">
+            <el-select v-model="searchForm.POST_ID">
+              <el-option
+                v-for="item in data.postList"
+                :key="item.POST_ID"
+                :label="item.NAME"
+                :value="item.POST_ID"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="学习状态" prop="STUDYSTATE">
+            <el-select v-model="searchForm.STUDYSTATE">
+              <el-option
+                v-for="item in learningStatus"
+                :key="item.ID"
+                :label="item.NAME"
+                :value="item.ID"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="考试状态" prop="STAGEEXAMSTATE">
+            <el-select v-model="searchForm.STAGEEXAMSTATE">
+              <el-option
+                v-for="item in examStatus"
+                :key="item.ID"
+                :label="item.NAME"
+                :value="item.ID"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="入班时间" prop="TIME">
+            <el-date-picker
+              v-model="searchForm.TIME"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label-width="10px">
+            <el-button type="primary" native-type="submit">搜索</el-button>
+            <el-button native-type="reset" @click="fnGetDataTransfer">
+              重置
+            </el-button>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label-width="10px" class="end">
+            <el-button
+              v-if="!isEdit"
+              type="primary"
+              @click="data.addStudentDialog.visible = true"
+            >
+              新增学员
+            </el-button>
+            <el-button
+              v-if="isEdit"
+              type="primary"
+              @click="fnGetLearningRecords"
+            >
+              导出学员学习记录
+            </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <layout-table :data="list" :show-pagination="false" max-height="500">
+      <el-table-column label="序号" width="60" type="index" fixed="left" />
+      <el-table-column fixed width="100" prop="NAME" label="姓名" />
+      <el-table-column width="200" prop="DEPARTMENT_NAME" label="部门" />
+      <el-table-column width="200" prop="POST_NAME" label="岗位" />
+      <el-table-column width="200" prop="USER_ID_CARD" label="身份证号" />
+      <el-table-column width="200" prop="FILE_NUMBER" label="档案编号" />
+      <el-table-column width="100" label="人脸认证">
+        <template #default="{ row }">
+          {{ row.AUTHENTICATION === "0" ? "未认证" : "已认证" }}
+        </template>
+      </el-table-column>
+      <el-table-column width="100" prop="ALL_CLASSHOUR" label="要求学时" />
+      <el-table-column width="100" label="已完成学时">
+        <template #default="{ row }">
+          <template v-if="row.COMPLETE_CLASSHOUR">
+            {{
+              row.COMPLETE_CLASSHOUR === "0.0"
+                ? 0
+                : parseFloat(row.COMPLETE_CLASSHOUR).toFixed(1)
+            }}
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column width="100" label="考试状态">
+        <template #default="{ row }">
+          {{ translationStatus(row.STAGEEXAMSTATE, examStatus) }}
+        </template>
+      </el-table-column>
+      <el-table-column width="100" label="学习状态">
+        <template #default="{ row }">
+          {{ translationStatus(row.STUDYSTATE, learningStatus) }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="OPERATORNAME" label="操作人" />
+      <el-table-column width="150" prop="CREATTIME" label="入班时间" />
+      <el-table-column label="操作" width="150" fixed="right">
+        <template #default="{ row }">
+          <el-button
+            v-if="!isEdit"
+            type="primary"
+            text
+            link
+            @click="fnDelete(row.STUDENT_ID)"
+          >
+            从本班移除
+          </el-button>
+          <el-button
+            v-if="isEdit"
+            type="primary"
+            text
+            link
+            @click="
+              router.push({
+                path: '/training_process_management/class_management/student/learning_records',
+                query: { STUDENT_ID: row.STUDENT_ID, CLASS_ID },
+              })
+            "
+          >
+            学习记录
+          </el-button>
+        </template>
+      </el-table-column>
+    </layout-table>
+    <div v-if="!isEdit" class="mt-10 tc">
+      <el-button
+        @click="
+          router.replace({
+            path:
+              type === 'add'
+                ? '/training_process_management/class_management/add'
+                : '/training_process_management/class_management/edit',
+            query: { ...route.query },
+          })
+        "
+      >
+        上一步
+      </el-button>
+      <el-button
+        type="primary"
+        @click="
+          router.replace({
+            path: '/training_process_management/class_management/curriculum',
+            query: { ...route.query },
+          })
+        "
+      >
+        下一步
+      </el-button>
+    </div>
+    <add-student
+      v-model:visible="data.addStudentDialog.visible"
+      v-model:form="data.addStudentDialog.form"
+      :select-list="list"
+      @get-data="fnGetDataTransfer"
+    />
+  </div>
+</template>
+
+<script setup>
+import LayoutDepartment from "@/components/department/index.vue";
+import { getPostListAll } from "@/request/data_dictionary.js";
+import { reactive } from "vue";
+import { translationStatus } from "@/assets/js/utils.js";
+import useListData from "@/assets/js/useListData.js";
+import {
+  getClassManagementExportLearningRecords,
+  getClassManagementStudentList,
+  setClassManagementStudentDelete,
+} from "@/request/training_process_management.js";
+import { useRoute, useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import * as XLSX from "xlsx";
+import { debounce } from "throttle-debounce";
+import AddStudent from "./add_student.vue";
+
+const route = useRoute();
+const router = useRouter();
+const { CLASS_ID, STATE, type } = route.query;
+const isEdit = STATE && STATE !== "1";
+const learningStatus = [
+  { ID: "0", NAME: "未学习" },
+  { ID: "1", NAME: "学习中" },
+  { ID: "2", NAME: "已学完" },
+  { ID: "3", NAME: "已完成" },
+  { ID: "4", NAME: "未完成" },
+  { ID: "5", NAME: "待评估" },
+  { ID: "6", NAME: "评估未合格" },
+];
+const examStatus = [
+  { ID: "0", NAME: "不考试" },
+  { ID: "1", NAME: "待考试" },
+  { ID: "2", NAME: "考试未通过" },
+  { ID: "3", NAME: "考试通过" },
+  { ID: "4", NAME: "未参加" },
+];
+const data = reactive({
+  postList: [],
+  addStudentDialog: {
+    visible: false,
+    form: {
+      releaseType: "",
+      personnelTypes: [],
+    },
+  },
+});
+const { list, searchForm, fnGetData } = useListData(
+  getClassManagementStudentList,
+  {
+    otherParams: { CLASS_ID },
+    usePagination: false,
+    callbackFn: (list, resData) => {
+      data.addStudentDialog.form.releaseType =
+        resData.classInfo.RELEASE_TYPE || "";
+      data.addStudentDialog.form.personnelTypes = resData.classInfo
+        .PERSONNEL_TYPES
+        ? resData.classInfo.PERSONNEL_TYPES.split(",")
+        : [];
+    },
+  }
+);
+const fnGetDataTransfer = () => {
+  fnGetData({
+    START_TIME: searchForm.value.TIME?.[0],
+    END_TIME: searchForm.value.TIME?.[1],
+  });
+};
+const fnGetPost = async (DEPARTMENT_ID) => {
+  data.postList = [];
+  searchForm.value.POST_ID = "";
+  if (!DEPARTMENT_ID) return;
+  const resData = await getPostListAll({ DEPARTMENT_ID });
+  data.postList = resData.postList;
+};
+const fnGetLearningRecords = async () => {
+  await ElMessageBox.confirm("确定要导出查询出来所有的学习记录?", {
+    type: "warning",
+  });
+  const resData = await getClassManagementExportLearningRecords({
+    CLASS_ID,
+    ...searchForm.value,
+    START_TIME: searchForm.value.TIME?.[0],
+    END_TIME: searchForm.value.TIME?.[1],
+  });
+  if (resData.varList.length > 0) fnExportLearningRecords(resData.varList);
+  else ElMessage.warning("没有学习记录");
+};
+const fnExportLearningRecords = (list) => {
+  const tableData = [
+    [
+      "序号",
+      "身份证",
+      "姓名",
+      "性别",
+      "手机号",
+      "部门",
+      "岗位",
+      "要求总学时",
+      "已完成学时",
+      "是否考试通过",
+      "考试分数",
+      "学习状态",
+      "班级名称",
+    ],
+  ];
+  list.forEach((item, index) => {
+    for (let i = 0; i < learningStatus.length; i++) {
+      if (learningStatus[i].ID === item.STUDYSTATE) {
+        item.STUDYSTATE = learningStatus[i].NAME;
+        break;
+      }
+    }
+    for (let i = 0; i < examStatus.length; i++) {
+      if (learningStatus[i].ID === item.STAGEEXAMSTATE) {
+        item.STAGEEXAMSTATE = learningStatus[i].NAME;
+        break;
+      }
+    }
+    if (item.ALL_CLASSHOUR === "0.0") item.ALL_CLASSHOUR = "0";
+    const COMPLETE_CLASSHOUR =
+      item.COMPLETE_CLASSHOUR === "0.0"
+        ? 0
+        : parseFloat(item.COMPLETE_CLASSHOUR).toFixed(1);
+    tableData.push([
+      index + 1,
+      item.USER_ID_CARD,
+      item.NAME,
+      item.SEX,
+      item.PHONE,
+      item.DEPARTMENT_NAME,
+      item.POST_NAME,
+      item.ALL_CLASSHOUR,
+      COMPLETE_CLASSHOUR,
+      item.STAGEEXAMSTATE,
+      item.EXAMSCORE,
+      item.STUDYSTATE,
+      item.CLASS_NAME,
+    ]);
+  });
+  const ws = XLSX.utils.aoa_to_sheet(tableData);
+  const wb = XLSX.utils.book_new();
+  XLSX.utils.book_append_sheet(wb, ws, "学员统计");
+  XLSX.writeFile(wb, "学员统计表.xlsx");
+  ElMessage.success("导出成功");
+};
+const fnDelete = debounce(
+  1000,
+  async (STUDENT_ID) => {
+    await ElMessageBox.confirm("确定要从本班移除该学员吗?", {
+      type: "warning",
+    });
+    await setClassManagementStudentDelete({ STUDENT_ID });
+    ElMessage.success("移除成功");
+    fnGetDataTransfer();
+  },
+  { atBegin: type }
+);
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/index.vue b/src/views/training_process_management/class_management/index.vue
new file mode 100644
index 0000000..f04bee0
--- /dev/null
+++ b/src/views/training_process_management/class_management/index.vue
@@ -0,0 +1,344 @@
+<template>
+  <div>
+    <el-card>
+      <el-form
+        :model="searchForm"
+        label-width="100px"
+        @submit.prevent="fnResetPaginationTransfer"
+      >
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="班级编码" prop="CODE">
+              <el-input v-model="searchForm.CODE" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="班级名称" prop="KEYWORDS">
+              <el-input v-model="searchForm.KEYWORDS" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="培训类型" prop="TRAINTYPE">
+              <layout-learning-train-type
+                v-model="searchForm.TRAINTYPE"
+                type="trainingType"
+                @update:model-value="
+                  searchForm.POSTTYPE = '';
+                  searchForm.TRAINLEVEL = '';
+                "
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="行业类型" prop="INDUSTRY_END_ID">
+              <layout-learning-train-type
+                v-model="searchForm.INDUSTRY_END_ID"
+                type="industryType"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="岗位类型" prop="POSTTYPE">
+              <layout-learning-train-type
+                v-model="searchForm.POSTTYPE"
+                type="postType"
+                :search-value="searchForm.TRAINTYPE"
+                @update:model-value="searchForm.TRAINLEVEL = ''"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="培训级别" prop="TRAINLEVEL">
+              <layout-learning-train-type
+                v-model="searchForm.TRAINLEVEL"
+                type="trainingLevel"
+                :search-value="searchForm.POSTTYPE"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="班级状态" prop="STATE">
+              <el-select v-model="searchForm.STATE">
+                <el-option
+                  v-for="item in classStatusList"
+                  :key="item.ID"
+                  :value="item.ID"
+                  :label="item.NAME"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="开班时间" prop="TIME">
+              <el-date-picker
+                v-model="searchForm.TIME"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="结束时间" prop="TIME1">
+              <el-date-picker
+                v-model="searchForm.TIME1"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label-width="10px">
+              <el-button type="primary" native-type="submit">搜索</el-button>
+              <el-button native-type="reset" @click="fnResetPaginationTransfer">
+                重置
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <layout-card>
+      <div class="mb-10">
+        <span class="mr-10">
+          班级总数:<i>{{ data.clsNum }}</i>
+        </span>
+        <span>
+          班级总人次:<i>{{ data.stuNum }}</i>
+        </span>
+      </div>
+      <layout-table
+        v-model:pagination="pagination"
+        :data="list"
+        @get-data="fnGetDataTransfer"
+      >
+        <el-table-column label="序号" width="60" fixed="left">
+          <template #default="{ $index }">
+            {{ serialNumber(pagination, $index) }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="班级名称"
+          prop="NAME"
+          show-overflow-tooltip
+          fixed="left"
+        />
+        <el-table-column
+          label="班级编码"
+          prop="CODE"
+          width="150"
+          fixed="left"
+        />
+        <el-table-column
+          label="培训类型"
+          prop="TRAININGTYPE_NAME"
+          width="150"
+        />
+        <el-table-column label="行业类型" prop="POSTTYPE_NAME" width="150" />
+        <el-table-column
+          label="岗位类型"
+          prop="INDUSTRY_ALL_NAME"
+          width="200"
+        />
+        <el-table-column label="培训等级" prop="TRAINLEVEL_NAME" width="150" />
+        <el-table-column label="负责人" prop="PRINCIPAL" width="150" />
+        <el-table-column label="培训开始时间" prop="START_TIME" width="150" />
+        <el-table-column label="培训结束时间" prop="END_TIME" width="150" />
+        <el-table-column label="涉及培训岗位数" prop="POSTNUM" width="150" />
+        <el-table-column label="学员人员数" prop="STUDENT_NUM" width="150" />
+        <el-table-column label="试卷类型" width="150">
+          <template #default="{ row }">
+            {{ translationStatus(row.STATE, classStatusList) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="200" fixed="right">
+          <template #default="{ row }">
+            <el-button
+              type="primary"
+              text
+              link
+              @click="
+                router.push({
+                  path:
+                    row.STATE === '1'
+                      ? '/training_process_management/class_management/edit'
+                      : '/training_process_management/class_management/view',
+                  query: {
+                    STATE: row.STATE,
+                    CLASS_ID: row.CLASS_ID,
+                    EXAMINATION: row.EXAMINATION,
+                    ISSTRENGTHEN: row.ISSTRENGTHEN,
+                    TRAINTYPE: row.TRAINTYPE,
+                    type: row.STATE === '1' ? 'edit' : 'view',
+                  },
+                })
+              "
+            >
+              {{ row.STATE === "1" ? "编辑" : "查看" }}
+            </el-button>
+            <el-button
+              type="primary"
+              text
+              link
+              @click="
+                router.push({
+                  path: '/training_process_management/class_management/student',
+                  query: {
+                    STATE: row.STATE,
+                    CLASS_ID: row.CLASS_ID,
+                    EXAMINATION: row.EXAMINATION,
+                    ISSTRENGTHEN: row.ISSTRENGTHEN,
+                    TRAINTYPE: row.TRAINTYPE,
+                    type: 'edit',
+                  },
+                })
+              "
+            >
+              学员
+            </el-button>
+            <el-button
+              type="primary"
+              text
+              link
+              @click="
+                router.push({
+                  path: '/training_process_management/class_management/curriculum',
+                  query: {
+                    STATE: row.STATE,
+                    CLASS_ID: row.CLASS_ID,
+                    EXAMINATION: row.EXAMINATION,
+                    ISSTRENGTHEN: row.ISSTRENGTHEN,
+                    TRAINTYPE: row.TRAINTYPE,
+                    type: 'edit',
+                  },
+                })
+              "
+            >
+              课程
+            </el-button>
+            <el-button
+              v-if="row.STATE === '1' && row.STUDYRECORDCNT === 0"
+              type="primary"
+              text
+              link
+              @click="fnDelete(row.CLASS_ID)"
+            >
+              删除
+            </el-button>
+            <el-button
+              v-if="row.STATE !== '1'"
+              type="primary"
+              text
+              link
+              @click="fnDelay(row.CLASS_ID, row.END_TIME)"
+            >
+              延期
+            </el-button>
+          </template>
+        </el-table-column>
+        <template #button>
+          <el-button
+            type="primary"
+            @click="
+              router.push({
+                path: '/training_process_management/class_management/add',
+                query: { type: 'add' },
+              })
+            "
+          >
+            新建培训任务
+          </el-button>
+        </template>
+      </layout-table>
+    </layout-card>
+    <delay
+      v-model:visible="data.delayDialog.visible"
+      v-model:form="data.delayDialog.form"
+      @get-data="fnResetPaginationTransfer"
+    />
+  </div>
+</template>
+
+<script setup>
+import useListData from "@/assets/js/useListData.js";
+import { serialNumber, translationStatus } from "@/assets/js/utils.js";
+import { useRouter } from "vue-router";
+import { debounce } from "throttle-debounce";
+import { ElMessage, ElMessageBox } from "element-plus";
+import {
+  getClassManagementList,
+  setClassManagementDelete,
+} from "@/request/training_process_management.js";
+import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
+import { nextTick, reactive } from "vue";
+import Delay from "./components/delay.vue";
+
+const classStatusList = [
+  { ID: "1", NAME: "未申请" },
+  { ID: "4", NAME: "待开班" },
+  { ID: "5", NAME: "培训中" },
+  { ID: "6", NAME: "培训结束" },
+];
+const router = useRouter();
+const data = reactive({
+  stuNum: 0,
+  clsNum: 0,
+  delayDialog: {
+    visible: false,
+    form: {
+      CLASS_ID: "",
+      TIME: "",
+    },
+  },
+});
+const { list, pagination, searchForm, fnGetData, fnResetPagination } =
+  useListData(getClassManagementList, {
+    callbackFn: (list, resData) => {
+      data.stuNum = resData.stuNum;
+      data.clsNum = resData.clsNum;
+    },
+  });
+const fnGetDataTransfer = () => {
+  fnGetData({
+    STARTTIME: searchForm.value.TIME?.[0],
+    ENDTIME: searchForm.value.TIME?.[1],
+    OVERSTARTTIME: searchForm.value.TIME1?.[0],
+    OVERENDTIME: searchForm.value.TIME1?.[1],
+  });
+};
+const fnResetPaginationTransfer = () => {
+  fnResetPagination({
+    STARTTIME: searchForm.value.TIME?.[0],
+    ENDTIME: searchForm.value.TIME?.[1],
+    OVERSTARTTIME: searchForm.value.TIME1?.[0],
+    OVERENDTIME: searchForm.value.TIME1?.[1],
+  });
+};
+const fnDelete = debounce(
+  1000,
+  async (CLASS_ID) => {
+    await ElMessageBox.confirm("确定要删除吗?", {
+      type: "warning",
+    });
+    await setClassManagementDelete({ CLASS_ID });
+    ElMessage.success("删除成功");
+    fnResetPaginationTransfer();
+  },
+  { atBegin: true }
+);
+const fnDelay = async (CLASS_ID, END_TIME) => {
+  data.delayDialog.visible = true;
+  await nextTick();
+  data.delayDialog.form.CLASS_ID = CLASS_ID;
+  data.delayDialog.form.TIME = END_TIME;
+};
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/class_management/learning_records.vue b/src/views/training_process_management/class_management/learning_records.vue
new file mode 100644
index 0000000..fb436e9
--- /dev/null
+++ b/src/views/training_process_management/class_management/learning_records.vue
@@ -0,0 +1,38 @@
+<template>
+  <div>
+    <layout-card>
+      <el-tabs v-model="active" @tab-change="fnTabChange">
+        <el-tab-pane label="学习记录" name="learning_records" lazy>
+          <learning-records />
+        </el-tab-pane>
+        <el-tab-pane label="考试记录" name="exam_records" lazy>
+          <exam-records />
+        </el-tab-pane>
+      </el-tabs>
+    </layout-card>
+  </div>
+</template>
+
+<script setup>
+import { onBeforeRouteUpdate, useRoute, useRouter } from "vue-router";
+import { ref } from "vue";
+import LearningRecords from "./components/learning_records.vue";
+import ExamRecords from "./components/exam_records.vue";
+
+const router = useRouter();
+const route = useRoute();
+const defaultName = "learning_records";
+const active = ref(route.query.active || defaultName);
+onBeforeRouteUpdate((to, from, next) => {
+  active.value = to.query.active || defaultName;
+  next();
+});
+const fnTabChange = (active) => {
+  router.replace({
+    path: "/training_process_management/class_management/student/learning_records",
+    query: { ...route.query, active },
+  });
+};
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/exam_paper_management/add.vue b/src/views/training_process_management/exam_paper_management/add.vue
index f157976..4c34b34 100644
--- a/src/views/training_process_management/exam_paper_management/add.vue
+++ b/src/views/training_process_management/exam_paper_management/add.vue
@@ -1,7 +1,382 @@
 <template>
-  <layout-card>11</layout-card>
+  <layout-card>
+    <el-divider content-position="left">试卷基本信息</el-divider>
+    <el-form
+      ref="formRef"
+      :model="data.form"
+      :rules="rules"
+      label-width="100px"
+    >
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="试卷名称" prop="EXAMNAME">
+            <el-input v-model="data.form.EXAMNAME" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="总分数" prop="EXAMSCORE">
+            <el-input-number
+              v-model="data.form.EXAMSCORE"
+              :disabled="type !== 'add'"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="合格分数" prop="PASSSCORE">
+            <el-input-number v-model="data.form.PASSSCORE" />
+          </el-form-item>
+        </el-col>
+        <template v-if="type === 'add'">
+          <el-col :span="12">
+            <el-form-item label="下载模板">
+              <el-button type="primary" @click="fnDownloadTemplate">
+                下载
+              </el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="上传试题" prop="fileList">
+              <layout-upload
+                v-model:file-list="data.form.fileList"
+                accept=".XLS,.XLSX,.xls,.xlsx"
+                :size="1"
+              >
+                <template #tip>
+                  只能上传.XLS 和 .XLSX格式的单个文件,且文件大小不超过1MB!
+                </template>
+              </layout-upload>
+            </el-form-item>
+          </el-col>
+        </template>
+      </el-row>
+    </el-form>
+    <div v-if="type !== 'add'">
+      <el-divider content-position="left">试卷题目信息</el-divider>
+      <el-form
+        :model="searchForm"
+        label-width="100px"
+        @submit.prevent="fnGetData"
+      >
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="题目内容" prop="KEYWORDS">
+              <el-input v-model="searchForm.KEYWORDS" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="题目类型" prop="QUESTIONTYPE">
+              <el-select v-model="searchForm.QUESTIONTYPE">
+                <el-option
+                  v-for="item in questionTypeOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label-width="10px">
+              <el-button type="primary" native-type="submit">搜索</el-button>
+              <el-button native-type="reset" @click="fnGetData">
+                重置
+              </el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label-width="10px" class="end">
+              <el-button type="primary" @click="fnAddOrEdit({}, '')">
+                新增试题
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div class="items mt-20 p-20">
+        <div
+          v-for="(item, index) in list"
+          :key="item.PAPER_QUESTION_ID"
+          class="item ptb-20"
+        >
+          <div class="mt-10">
+            {{ index + 1 }}.
+            <span v-if="item.QUESTIONTYPE === '1'"> (单选题) </span>
+            <span v-if="item.QUESTIONTYPE === '2'"> (多选题) </span>
+            <span v-if="item.QUESTIONTYPE === '3'"> (判断题) </span>
+            {{ item.QUESTIONDRY }}
+            <span class="ml-10">(题目分值:{{ item.SCORE }})</span>
+          </div>
+          <div class="mt-10 ml-30">
+            <el-radio-group
+              v-if="item.QUESTIONTYPE === '1'"
+              disabled
+              :model-value="item.ANSWER"
+            >
+              <el-radio label="A">A.{{ item.OPTIONA }}</el-radio>
+              <el-radio label="B">B.{{ item.OPTIONB }}</el-radio>
+              <el-radio label="C">C.{{ item.OPTIONC }}</el-radio>
+              <el-radio label="D">D.{{ item.OPTIOND }}</el-radio>
+            </el-radio-group>
+            <el-checkbox-group
+              v-if="item.QUESTIONTYPE === '2'"
+              disabled
+              :model-value="item.ANSWER?.split('')"
+            >
+              <el-checkbox label="A">A.{{ item.OPTIONA }}</el-checkbox>
+              <el-checkbox label="B">B.{{ item.OPTIONB }}</el-checkbox>
+              <el-checkbox label="C">C.{{ item.OPTIONC }}</el-checkbox>
+              <el-checkbox label="D">D.{{ item.OPTIOND }}</el-checkbox>
+            </el-checkbox-group>
+            <el-radio-group
+              v-if="item.QUESTIONTYPE === '3'"
+              disabled
+              :model-value="item.ANSWER"
+            >
+              <el-radio label="A">A.{{ item.OPTIONA }}</el-radio>
+              <el-radio label="B">B.{{ item.OPTIONB }}</el-radio>
+            </el-radio-group>
+          </div>
+          <div class="flex">
+            <div>
+              <div class="mt-10">答案:{{ item.ANSWER }}</div>
+              <div class="mt-10">答案解析:{{ item.DESCR }}</div>
+              <div class="mt-10">关联课件名称:{{ item.COURSEWARENAME }}</div>
+            </div>
+            <div class="tr">
+              <el-button @click="fnAddOrEdit(item, index)">编辑</el-button>
+              <el-button @click="fnDelete(item.PAPER_QUESTION_ID, index)">
+                删除
+              </el-button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="mt-10 tc">
+      <el-button type="primary" @click="fnSubmit('normal')">
+        {{ buttonTextMap[type] }}
+      </el-button>
+      <el-button type="primary" @click="fnSubmit('draft')">
+        保存到草稿箱
+      </el-button>
+    </div>
+    <add-test-questions
+      :id="STAGEEXAMPAPERINPUT_ID"
+      v-model:visible="data.addOrEditDialog.visible"
+      v-model:form="data.addOrEditDialog.form"
+      :type="data.addOrEditDialog.type"
+      :is-inherit="type === 'inherit'"
+      @get-data="fnGetDataInfo"
+      @confirm="fnAddTestQuestionsConfirm"
+    />
+  </layout-card>
 </template>
 
-<script setup></script>
+<script setup>
+import { nextTick, reactive, ref } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import LayoutUpload from "@/components/upload/index.vue";
+import { useRoute, useRouter } from "vue-router";
+import { debounce } from "throttle-debounce";
+import useFormValidate from "@/assets/js/useFormValidate.js";
+import {
+  setExamPaperManagementAdd,
+  setExamPaperManagementAddToDraft,
+  setExamPaperManagementEdit,
+  setExamPaperManagementInherit,
+  setExamPaperManagementTestQuestionsDelete,
+} from "@/request/training_process_management.js";
+import {
+  getExamPaperManagementTestQuestions,
+  getExamPaperManagementView,
+} from "@/request/training_resource_management.js";
+import useListData from "@/assets/js/useListData.js";
+import { cloneDeep, sumBy } from "lodash-es";
+import AddTestQuestions from "./components/add_test_questions.vue";
 
-<style scoped lang="scss"></style>
+const route = useRoute();
+const router = useRouter();
+const { type, STAGEEXAMPAPERINPUT_ID } = route.query;
+const buttonTextMap = {
+  add: "立即创建",
+  edit: "保存修改",
+  inherit: "继承试卷",
+};
+const questionTypeOptions = [
+  { value: "1", label: "单选题" },
+  { value: "2", label: "多选题" },
+  { value: "3", label: "判断题" },
+];
+const rules = {
+  EXAMNAME: [{ required: true, message: "请输入试卷名称", trigger: "blur" }],
+  EXAMSCORE: [{ required: true, message: "请输入总分数", trigger: "blur" }],
+  PASSSCORE: [{ required: true, message: "请输入合格分数", trigger: "blur" }],
+  fileList: [{ required: true, message: "请上传试题", trigger: "change" }],
+};
+const formRef = ref(null);
+const data = reactive({
+  form: {
+    EXAMNAME: "",
+    EXAMSCORE: 0,
+    PASSSCORE: 0,
+    fileList: [],
+  },
+  addOrEditDialog: {
+    visible: false,
+    form: {
+      QUESTIONTYPE: "",
+      QUESTIONDRY: "",
+      OPTIONA: "",
+      OPTIONB: "",
+      OPTIONC: "",
+      OPTIOND: "",
+      ANSWER: "",
+      SCORE: 0,
+      LABEL_TYPE: "",
+      VIDEOCOURSEWARE_ID: "",
+    },
+    type: "",
+    index: "",
+  },
+});
+const { list, searchForm, fnGetData } = useListData(
+  getExamPaperManagementTestQuestions,
+  {
+    otherParams: { STAGEEXAMPAPERINPUT_ID },
+    immediate: false,
+    usePagination: false,
+  }
+);
+const fnGetDataInfo = async () => {
+  if (!STAGEEXAMPAPERINPUT_ID) return;
+  const resData = await getExamPaperManagementView({ STAGEEXAMPAPERINPUT_ID });
+  resData.pd.EXAMSCORE = +resData.pd.EXAMSCORE;
+  resData.pd.PASSSCORE = +resData.pd.PASSSCORE;
+  data.form = resData.pd;
+  fnGetData();
+};
+fnGetDataInfo();
+const fnDownloadTemplate = async () => {
+  await ElMessageBox.confirm("确定要下载excel模板吗?", {
+    type: "warning",
+  });
+  window.open(
+    import.meta.env[import.meta.env.DEV ? "VITE_PROXY" : "VITE_BASE_URL"] +
+      "question/downExcel"
+  );
+};
+const fnAddOrEdit = async (row, index) => {
+  data.addOrEditDialog.visible = true;
+  await nextTick();
+  data.addOrEditDialog.type = row.PAPER_QUESTION_ID ? "edit" : "add";
+  data.addOrEditDialog.index = index;
+  if (row.PAPER_QUESTION_ID) {
+    data.addOrEditDialog.form = cloneDeep(row);
+    data.addOrEditDialog.form.SCORE = +row.SCORE;
+  }
+};
+const fnAddTestQuestionsConfirm = (value) => {
+  if (data.addOrEditDialog.type === "add") list.value.push(value);
+  else list.value.splice(data.addOrEditDialog.index, 1, value);
+  data.form.EXAMSCORE = sumBy(list.value, (item) => +item.SCORE);
+};
+const fnDelete = debounce(
+  1000,
+  async (PAPER_QUESTION_ID, index) => {
+    await ElMessageBox.confirm("确定要删除吗?", {
+      type: "warning",
+    });
+    if (type === "inherit") {
+      list.value.splice(index, 1);
+      data.form.EXAMSCORE = sumBy(list.value, (item) => +item.SCORE);
+      ElMessage.success("删除成功");
+    } else {
+      await setExamPaperManagementTestQuestionsDelete({
+        PAPER_QUESTION_ID,
+        STAGEEXAMPAPERINPUT_ID,
+      });
+      ElMessage.success("删除成功");
+      await fnGetDataInfo();
+    }
+  },
+  { atBegin: true }
+);
+const fnSubmit = debounce(
+  1000,
+  async (submitType) => {
+    await useFormValidate(formRef);
+    if (data.form.PASSSCORE > data.form.EXAMSCORE) {
+      ElMessage.warning("合格分数不能大于总分数");
+      return;
+    }
+    const formData = new FormData();
+    Object.keys(data.form).forEach((key) => {
+      formData.append(key, data.form[key]);
+    });
+    formData.delete("fileList");
+    if (data.form.fileList?.length > 0) {
+      formData.append("FFILENAME", data.form.fileList[0].name);
+      formData.append("FFILE", data.form.fileList[0].raw);
+    }
+    let resData;
+    if (submitType === "draft") {
+      resData = await setExamPaperManagementAddToDraft(formData);
+    } else if (submitType === "normal") {
+      if (type === "add") {
+        resData = await setExamPaperManagementAdd(formData);
+      }
+      if (type === "edit") {
+        resData = await setExamPaperManagementEdit(formData);
+      }
+      if (type === "inherit") {
+        await setExamPaperManagementInherit({
+          ...data.form,
+          queList: JSON.stringify(list.value),
+        });
+        router.back();
+        return;
+      }
+    }
+    if (resData.code === 1) {
+      ElMessage.success("保存成功");
+      router.back();
+    } else {
+      ElMessage({
+        dangerouslyUseHTMLString: true,
+        message: resData.msg,
+        type: "error",
+        showClose: true,
+        duration: 10 * 1000,
+      });
+    }
+  },
+  { atBegin: true }
+);
+</script>
+
+<style scoped lang="scss">
+.items {
+  border: 1px solid var(--el-border-color);
+
+  .item {
+    border-bottom: 1px dashed #ebeef5;
+
+    &:first-child {
+      padding-top: 0;
+    }
+
+    &:last-child {
+      border-bottom: none;
+    }
+  }
+}
+
+.flex {
+  display: flex;
+  align-items: center;
+
+  div {
+    flex: 1;
+  }
+}
+</style>
diff --git a/src/views/training_process_management/exam_paper_management/components/add_test_questions.vue b/src/views/training_process_management/exam_paper_management/components/add_test_questions.vue
new file mode 100644
index 0000000..1350b8e
--- /dev/null
+++ b/src/views/training_process_management/exam_paper_management/components/add_test_questions.vue
@@ -0,0 +1,248 @@
+<template>
+  <el-dialog
+    v-model="visible"
+    :title="type === 'add' ? '新增' : '修改'"
+    @close="fnClose"
+    @open="fnQuestionTypeChange"
+  >
+    <el-form ref="formRef" :rules="rules" :model="form" label-width="110px">
+      <el-form-item label="试题类型" prop="QUESTIONTYPE">
+        <el-select v-model="form.QUESTIONTYPE" @change="fnQuestionTypeChange">
+          <el-option
+            v-for="item in questionTypeOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="题干" prop="QUESTIONDRY">
+        <el-input
+          v-model="form.QUESTIONDRY"
+          type="textarea"
+          :autosize="{ minRows: 3 }"
+        />
+      </el-form-item>
+      <template v-if="form.QUESTIONTYPE !== '3' && form.QUESTIONTYPE !== '4'">
+        <el-form-item label="选项A" prop="OPTIONA">
+          <el-input v-model="form.OPTIONA" />
+        </el-form-item>
+        <el-form-item label="选项B" prop="OPTIONB">
+          <el-input v-model="form.OPTIONB" />
+        </el-form-item>
+        <el-form-item label="选项C" prop="OPTIONC">
+          <el-input v-model="form.OPTIONC" />
+        </el-form-item>
+        <el-form-item label="选项D" prop="OPTIOND">
+          <el-input v-model="form.OPTIOND" />
+        </el-form-item>
+      </template>
+      <el-form-item label="答案" prop="ANSWER">
+        <el-select v-model="form.ANSWER">
+          <el-option
+            v-for="item in answerOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="分值" prop="SCORE">
+        <el-input-number v-model="form.SCORE" />
+      </el-form-item>
+      <el-form-item label="试题标签" prop="LABEL_TYPE">
+        <el-select v-model="form.LABEL_TYPE">
+          <el-option
+            v-for="item in testQuestionLabels"
+            :key="item.DICTIONARIES_ID"
+            :label="item.NAME"
+            :value="item.DICTIONARIES_ID"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="关联课件名称" prop="VIDEOCOURSEWARE_ID">
+        <el-select-v2
+          v-model="form.VIDEOCOURSEWARE_ID"
+          :options="associatedCoursewareName"
+          filterable
+          :props="{ label: 'COURSEWARENAME', value: 'VIDEOCOURSEWARE_ID' }"
+        />
+      </el-form-item>
+      <el-form-item label="答案解析" prop="DESCR">
+        <el-input
+          v-model="form.DESCR"
+          type="textarea"
+          :autosize="{ minRows: 3 }"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="fnClose">取消</el-button>
+      <el-button type="primary" @click="fnSubmit">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { useVModels } from "@vueuse/core";
+import { nextTick, ref } from "vue";
+import { debounce } from "throttle-debounce";
+import useFormValidate from "@/assets/js/useFormValidate.js";
+import { ElMessage } from "element-plus";
+import { layoutFnGetTestQuestionLabels } from "@/assets/js/data_dictionary.js";
+import {
+  getAssociatedCoursewareNameList,
+  setExamPaperManagementTestQuestionsAdd,
+  setExamPaperManagementTestQuestionsEdit,
+} from "@/request/training_process_management.js";
+import { cloneDeep } from "lodash-es";
+
+const questionTypeOptions = [
+  { value: "1", label: "单选题" },
+  { value: "2", label: "多选题" },
+  { value: "3", label: "判断题" },
+];
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    required: true,
+    default: false,
+  },
+  form: {
+    type: Object,
+    required: true,
+    default: () => ({}),
+  },
+  type: {
+    type: String,
+    required: true,
+    default: "",
+  },
+  id: {
+    type: String,
+    required: true,
+    default: "",
+  },
+  isInherit: {
+    type: Boolean,
+    required: true,
+    default: false,
+  },
+});
+const emits = defineEmits([
+  "update:visible",
+  "update:form",
+  "get-data",
+  "confirm",
+]);
+const { visible, form } = useVModels(props, emits);
+const formRef = ref(null);
+const answerOptions = ref([]);
+const associatedCoursewareName = ref([]);
+const rules = {
+  QUESTIONTYPE: [
+    { required: true, message: "请选择试题类型", trigger: "change" },
+  ],
+  QUESTIONDRY: [{ required: true, message: "请输入题干", trigger: "blur" }],
+  OPTIONA: [{ required: true, message: "请输入选项A", trigger: "blur" }],
+  OPTIONB: [{ required: true, message: "请输入选项B", trigger: "blur" }],
+  OPTIONC: [{ required: true, message: "请输入选项C", trigger: "blur" }],
+  OPTIOND: [{ required: true, message: "请输入选项D", trigger: "blur" }],
+  ANSWER: [{ required: true, message: "请选择答案", trigger: "change" }],
+  SCORE: [{ required: true, message: "请输入分值", trigger: "blur" }],
+  LABEL_TYPE: [
+    { required: true, message: "请选择试题标签", trigger: "change" },
+  ],
+  VIDEOCOURSEWARE_ID: [
+    { required: true, message: "请选择关联课件名称", trigger: "change" },
+  ],
+};
+const testQuestionLabels = await layoutFnGetTestQuestionLabels();
+const fnGetAssociatedCoursewareNameList = async () => {
+  const resData = await getAssociatedCoursewareNameList();
+  associatedCoursewareName.value = resData.CourseWareNameList;
+};
+fnGetAssociatedCoursewareNameList();
+const fnQuestionTypeChange = async () => {
+  await nextTick();
+  if (form.value.QUESTIONTYPE === "1") {
+    answerOptions.value = [
+      { value: "A", label: "A" },
+      { value: "B", label: "B" },
+      { value: "C", label: "C" },
+      { value: "D", label: "D" },
+    ];
+  } else if (form.value.QUESTIONTYPE === "2") {
+    answerOptions.value = [
+      { value: "AB", label: "AB" },
+      { value: "AC", label: "AC" },
+      { value: "AD", label: "AD" },
+      { value: "BC", label: "BC" },
+      { value: "BD", label: "BD" },
+      { value: "CD", label: "CD" },
+      { value: "ABC", label: "ABC" },
+      { value: "ABD", label: "ABD" },
+      { value: "ACD", label: "ACD" },
+      { value: "BCD", label: "BCD" },
+      { value: "ABCD", label: "ABCD" },
+    ];
+  } else if (form.value.QUESTIONTYPE === "3") {
+    answerOptions.value = [
+      { value: "A", label: "对" },
+      { value: "B", label: "错" },
+    ];
+  } else {
+    answerOptions.value = [];
+  }
+};
+const fnClose = () => {
+  formRef.value.resetFields();
+  visible.value = false;
+};
+const fnSubmit = debounce(
+  1000,
+  async () => {
+    await useFormValidate(formRef);
+    if (form.value.QUESTIONTYPE === "3") {
+      form.value.OPTIONA = "对";
+      form.value.OPTIONB = "错";
+      form.value.OPTIONC = "";
+      form.value.OPTIOND = "";
+    }
+    let arr = [];
+    if (form.value.QUESTIONTYPE === "3") {
+      arr = ["#" + form.value.OPTIONA + "#", "#" + form.value.OPTIONB + "#"];
+    } else if (form.value.QUESTIONTYPE !== "4") {
+      arr = [
+        "#" + form.value.OPTIONA + "#",
+        "#" + form.value.OPTIONB + "#",
+        "#" + form.value.OPTIONC + "#",
+        "#" + form.value.OPTIOND + "#",
+      ];
+    }
+    const s = arr.join(",") + ",";
+    for (let i = 0; i < arr.length - 1; i++) {
+      if (s.replace(arr[i] + ",", "").indexOf(arr[i]) > -1) {
+        ElMessage.warning("试题答案重复:" + arr[i].split("#").join(""));
+        return;
+      }
+    }
+    if (!props.isInherit) {
+      props.type === "add"
+        ? await setExamPaperManagementTestQuestionsAdd({
+            ...form.value,
+            STAGEEXAMPAPERINPUT_ID: props.id,
+          })
+        : await setExamPaperManagementTestQuestionsEdit({ ...form.value });
+      emits("get-data");
+    } else {
+      emits("confirm", cloneDeep(form.value));
+    }
+    ElMessage.success("操作成功");
+    fnClose();
+  },
+  { atBegin: true }
+);
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/training_process_management/exam_paper_management/index.vue b/src/views/training_process_management/exam_paper_management/index.vue
index 722d561..1eb9420 100644
--- a/src/views/training_process_management/exam_paper_management/index.vue
+++ b/src/views/training_process_management/exam_paper_management/index.vue
@@ -93,7 +93,7 @@
               查看
             </el-button>
             <el-button
-              v-if="row.SOURCETYPE === '1' || row.PAPERUSERCOUNT > 0"
+              v-if="row.SOURCETYPE === '2' || row.PAPERUSERCOUNT === 0"
               type="primary"
               text
               link
@@ -126,7 +126,7 @@
               继承
             </el-button>
             <el-button
-              v-show="row.SOURCETYPE === '1' || row.PAPERUSERCOUNT > 0"
+              v-if="row.SOURCETYPE === '2' || row.PAPERUSERCOUNT === 0"
               type="primary"
               text
               link
diff --git a/src/views/training_resource_management/course_management/add.vue b/src/views/training_resource_management/course_management/add.vue
index ccad795..3078b77 100644
--- a/src/views/training_resource_management/course_management/add.vue
+++ b/src/views/training_resource_management/course_management/add.vue
@@ -19,6 +19,10 @@
               ref="trainingTypeRef"
               v-model="data.form.TRAINTYPE"
               type="trainingType"
+              @update:model-value="
+                data.form.POSTTYPE = '';
+                data.form.TRAINLEVEL = '';
+              "
             />
           </el-form-item>
         </el-col>
@@ -38,6 +42,7 @@
               v-model="data.form.POSTTYPE"
               type="postType"
               :search-value="data.form.TRAINTYPE"
+              @update:model-value="data.form.TRAINLEVEL = ''"
             />
           </el-form-item>
         </el-col>
diff --git a/src/views/training_resource_management/course_management/index.vue b/src/views/training_resource_management/course_management/index.vue
index 6499034..aa9dcd0 100644
--- a/src/views/training_resource_management/course_management/index.vue
+++ b/src/views/training_resource_management/course_management/index.vue
@@ -30,6 +30,10 @@
               <layout-learning-train-type
                 v-model="searchForm.TRAINTYPE"
                 type="trainingType"
+                @update:model-value="
+                  searchForm.POSTTYPE = '';
+                  searchForm.TRAINLEVEL = '';
+                "
               />
             </el-form-item>
           </el-col>
@@ -47,6 +51,7 @@
                 v-model="searchForm.POSTTYPE"
                 type="postType"
                 :search-value="searchForm.TRAINTYPE"
+                @update:model-value="searchForm.TRAINLEVEL = ''"
               />
             </el-form-item>
           </el-col>
diff --git a/src/views/training_resource_management/video_courseware/index.vue b/src/views/training_resource_management/video_courseware/index.vue
index 5323308..2050f2d 100644
--- a/src/views/training_resource_management/video_courseware/index.vue
+++ b/src/views/training_resource_management/video_courseware/index.vue
@@ -17,6 +17,7 @@
               <layout-learning-train-type
                 v-model="searchForm.TRAINTYPE"
                 type="trainingType"
+                @update:model-value="searchForm.POSTTYPE = ''"
               />
             </el-form-item>
           </el-col>