riku
2024-08-23 1788c96aea9247cc36ef8b82734997f1a6a92fb4
新增新版本。静安区特供版
已修改49个文件
已添加19个文件
5911 ■■■■ 文件已修改
.env.development 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development.jingan 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production.jingan 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json 2058 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
src/api/index.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/missionApi.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/common-style.css 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components.d.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/SliderBar.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/animation/HistoricalTrajectory.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/map/MapScene.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/map/MapToolbox.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mission/MIssionCreate.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mission/MissionManage.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/monitor/DataSummary.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/monitor/DataTable.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/monitor/FactorCheckbox.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/monitor/FactorRadio.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/monitor/FactorTrend.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/monitor/WeatherData.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/search/OptionDevice copy.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/search/OptionDevice.vue 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/search/OptionLocation.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/search/OptionMission.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/search/OptionTime.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/search/OptionType copy.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/search/OptionType.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/search/SearchBar.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/composables/fetchData.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/checkbox-options.js 218 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/checkbox-options/options-jingan.js 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/checkbox-options/options.js 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/device-type.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/factor-name.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/factor-unit.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/radio-options.js 158 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/radio-options/options-jingan.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/radio-options/options.js 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/scene-types.js 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/scene-types/options-jingan.js 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constant/scene-types/options.js 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/lib/jquery.soap.js 792 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/lib/jquery.xml2json.js 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/model/Factor.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/model/FactorDatas.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/model/FrameAnimation.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/model/Legend.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/elementUI.scss 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/chart/chart-option.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/factor/data.js 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/map/dialog.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/map/sector.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/number.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/LoginPage.vue 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/historymode/HistoryMode copy.vue 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/historymode/HistoryMode.vue 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/historymode/component/DataSheet.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/historymode/component/TrendAnalysis.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/realtimemode/RealtimeMode copy.vue 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/realtimemode/RealtimeMode.vue 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/realtimemode/component/DashBoard.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/realtimemode/component/DeviceChange.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/realtimemode/component/RealTimeTrend.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
# å¼€å‘模式
VITE_DATA_MODE='origin'
.env.development.jingan
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
# å¼€å‘模式(针对静安区版本)
VITE_DATA_MODE='jingan'
.env.production
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
# ç”Ÿäº§æ¨¡å¼
VITE_DATA_MODE='origin'
.env.production.jingan
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
# ç”Ÿäº§æ¨¡å¼ï¼ˆé’ˆå¯¹é™å®‰åŒºç‰ˆæœ¬ï¼‰
VITE_DATA_MODE='jingan'
package-lock.json
@@ -20,11 +20,16 @@
        "echarts": "^5.5.0",
        "element-plus": "^2.6.2",
        "jquery": "^3.7.1",
        "jquery-xml2json": "^0.0.8",
        "jquery.soap": "^1.7.3",
        "js-base64": "^3.7.7",
        "moment": "^2.30.1",
        "pinia": "^2.1.7",
        "strong-soap": "^4.1.3",
        "unplugin-vue-components": "^0.26.0",
        "vue": "^3.4.21",
        "vue-router": "^4.3.0"
        "vue-router": "^4.3.0",
        "xml2json": "^0.12.0"
      },
      "devDependencies": {
        "@rushstack/eslint-patch": "^1.3.3",
@@ -76,6 +81,55 @@
      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/@cypress/request": {
      "version": "3.0.1",
      "resolved": "https://registry.npmmirror.com/@cypress/request/-/request-3.0.1.tgz",
      "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
      "dependencies": {
        "aws-sign2": "~0.7.0",
        "aws4": "^1.8.0",
        "caseless": "~0.12.0",
        "combined-stream": "~1.0.6",
        "extend": "~3.0.2",
        "forever-agent": "~0.6.1",
        "form-data": "~2.3.2",
        "http-signature": "~1.3.6",
        "is-typedarray": "~1.0.0",
        "isstream": "~0.1.2",
        "json-stringify-safe": "~5.0.1",
        "mime-types": "~2.1.19",
        "performance-now": "^2.1.0",
        "qs": "6.10.4",
        "safe-buffer": "^5.1.2",
        "tough-cookie": "^4.1.3",
        "tunnel-agent": "^0.6.0",
        "uuid": "^8.3.2"
      },
      "engines": {
        "node": ">= 6"
      }
    },
    "node_modules/@cypress/request/node_modules/form-data": {
      "version": "2.3.3",
      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
      "dependencies": {
        "asynckit": "^0.4.0",
        "combined-stream": "^1.0.6",
        "mime-types": "^2.1.12"
      },
      "engines": {
        "node": ">= 0.12"
      }
    },
    "node_modules/@cypress/request/node_modules/uuid": {
      "version": "8.3.2",
      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
      "bin": {
        "uuid": "dist/bin/uuid"
      }
    },
    "node_modules/@element-plus/icons-vue": {
@@ -1263,6 +1317,14 @@
        }
      }
    },
    "node_modules/@xmldom/xmldom": {
      "version": "0.8.10",
      "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
      "engines": {
        "node": ">=10.0.0"
      }
    },
    "node_modules/abbrev": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz",
@@ -1270,6 +1332,14 @@
      "dev": true,
      "engines": {
        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
      }
    },
    "node_modules/accept-language": {
      "version": "3.0.20",
      "resolved": "https://registry.npmmirror.com/accept-language/-/accept-language-3.0.20.tgz",
      "integrity": "sha512-xklPzRma4aoDEPk0ZfMjeuxB2FP4JBYlAR25OFUqCoOYDjYo6wGwAs49SnTN/MoB5VpnNX9tENfZ+vEIFmHQMQ==",
      "dependencies": {
        "bcp47": "^1.1.2"
      }
    },
    "node_modules/acorn": {
@@ -1364,6 +1434,22 @@
      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
      "dev": true
    },
    "node_modules/asn1": {
      "version": "0.2.6",
      "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
      "dependencies": {
        "safer-buffer": "~2.1.0"
      }
    },
    "node_modules/assert-plus": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
      "engines": {
        "node": ">=0.8"
      }
    },
    "node_modules/assertion-error": {
      "version": "1.1.0",
      "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz",
@@ -1383,10 +1469,23 @@
      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
    },
    "node_modules/aws-sign2": {
      "version": "0.7.0",
      "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
      "engines": {
        "node": "*"
      }
    },
    "node_modules/aws4": {
      "version": "1.13.1",
      "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.1.tgz",
      "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA=="
    },
    "node_modules/axios": {
      "version": "1.6.8",
      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz",
      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
      "version": "1.7.4",
      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.4.tgz",
      "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
      "dependencies": {
        "follow-redirects": "^1.15.6",
        "form-data": "^4.0.0",
@@ -1398,12 +1497,36 @@
      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    },
    "node_modules/bcp47": {
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/bcp47/-/bcp47-1.1.2.tgz",
      "integrity": "sha512-JnkkL4GUpOvvanH9AZPX38CxhiLsXMBicBY2IAtqiVN8YulGDQybUydWA4W6yAMtw6iShtw+8HEF6cfrTHU+UQ==",
      "engines": {
        "node": ">=0.10"
      }
    },
    "node_modules/bcrypt-pbkdf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
      "dependencies": {
        "tweetnacl": "^0.14.3"
      }
    },
    "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==",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/bindings": {
      "version": "1.5.0",
      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
      "dependencies": {
        "file-uri-to-path": "1.0.0"
      }
    },
    "node_modules/boolbase": {
@@ -1416,7 +1539,6 @@
      "version": "1.1.11",
      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
      "dev": true,
      "dependencies": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
@@ -1433,6 +1555,11 @@
        "node": ">=8"
      }
    },
    "node_modules/brackets2dots": {
      "version": "1.1.0",
      "resolved": "https://registry.npmmirror.com/brackets2dots/-/brackets2dots-1.1.0.tgz",
      "integrity": "sha512-DEIJz+ebFQ2SYPpXd8owCjy+8H+9N2Pd9DeSf0J33oavLyBYpAtjLg/Z/RmdJdTeHmKVva+L411HjnvyV2rSOA=="
    },
    "node_modules/cac": {
      "version": "6.7.14",
      "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz",
@@ -1440,6 +1567,24 @@
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "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==",
      "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"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/callsites": {
@@ -1450,6 +1595,11 @@
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/caseless": {
      "version": "0.12.0",
      "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
    },
    "node_modules/chai": {
      "version": "4.4.1",
@@ -1480,6 +1630,14 @@
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/charenc": {
      "version": "0.0.2",
      "resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
      "engines": {
        "node": "*"
      }
    },
    "node_modules/check-error": {
@@ -1525,6 +1683,11 @@
        "node": ">= 6"
      }
    },
    "node_modules/cldrjs": {
      "version": "0.5.5",
      "resolved": "https://registry.npmmirror.com/cldrjs/-/cldrjs-0.5.5.tgz",
      "integrity": "sha512-KDwzwbmLIPfCgd8JERVDpQKrUUM1U4KpFJJg2IROv89rF172lLufoJnqJ/Wea6fXL5bO6WjuLMzY8V52UWPvkA=="
    },
    "node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@@ -1563,11 +1726,15 @@
        "node": ">=14"
      }
    },
    "node_modules/compress": {
      "version": "0.99.0",
      "resolved": "https://registry.npmmirror.com/compress/-/compress-0.99.0.tgz",
      "integrity": "sha512-+qy9iMBFGTLUqKwYkAqRtZ5Xdl1PGKrSMYCuiirsxSQ5OgDoyP9QO6YoZ4feHzhpufGOwJ+y4qRXz2ytzZ1l0g=="
    },
    "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
      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
    },
    "node_modules/config-chain": {
      "version": "1.1.13",
@@ -1579,11 +1746,15 @@
        "proto-list": "~1.2.1"
      }
    },
    "node_modules/core-util-is": {
      "version": "1.0.2",
      "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
    },
    "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,
      "dependencies": {
        "path-key": "^3.1.0",
        "shebang-command": "^2.0.0",
@@ -1591,6 +1762,14 @@
      },
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/crypt": {
      "version": "0.0.2",
      "resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
      "engines": {
        "node": "*"
      }
    },
    "node_modules/cssesc": {
@@ -1622,6 +1801,25 @@
      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
    },
    "node_modules/curry2": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/curry2/-/curry2-1.0.3.tgz",
      "integrity": "sha512-2vXqPLsITt0ccyczu1BFl3tc8Q6BOCsTHt+NZYasd8wp60RQIYhGM3Beis5h5FgJPT11M1rfiKOR7dPL6cL14Q==",
      "dependencies": {
        "fast-bind": "^1.0.0"
      }
    },
    "node_modules/dashdash": {
      "version": "1.14.1",
      "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
      "dependencies": {
        "assert-plus": "^1.0.0"
      },
      "engines": {
        "node": ">=0.10"
      }
    },
    "node_modules/data-urls": {
      "version": "5.0.0",
      "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-5.0.0.tgz",
@@ -1641,9 +1839,9 @@
      "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
    },
    "node_modules/debug": {
      "version": "4.3.4",
      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
      "version": "4.3.6",
      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz",
      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
      "dependencies": {
        "ms": "2.1.2"
      },
@@ -1680,12 +1878,37 @@
      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
      "dev": true
    },
    "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==",
      "dependencies": {
        "es-define-property": "^1.0.0",
        "es-errors": "^1.3.0",
        "gopd": "^1.0.1"
      },
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
      "engines": {
        "node": ">=0.4.0"
      }
    },
    "node_modules/des.js": {
      "version": "1.1.0",
      "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz",
      "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
      "dependencies": {
        "inherits": "^2.0.1",
        "minimalistic-assert": "^1.0.0"
      }
    },
    "node_modules/diff-sequences": {
@@ -1709,11 +1932,25 @@
        "node": ">=6.0.0"
      }
    },
    "node_modules/dotsplit.js": {
      "version": "1.1.0",
      "resolved": "https://registry.npmmirror.com/dotsplit.js/-/dotsplit.js-1.1.0.tgz",
      "integrity": "sha512-oFVx9VEE+M3yM4oUkaiDa+U2RhOmjXWyXwtfdc5UiHDSZWleE96FS3nx3yXMVuhLJOdI2GMThvaegkwRYPgAFQ=="
    },
    "node_modules/eastasianwidth": {
      "version": "0.2.0",
      "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
      "dev": true
    },
    "node_modules/ecc-jsbn": {
      "version": "0.1.2",
      "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
      "dependencies": {
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.1.0"
      }
    },
    "node_modules/echarts": {
      "version": "5.5.0",
@@ -1872,12 +2109,39 @@
      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
      "dev": true
    },
    "node_modules/end-of-stream": {
      "version": "1.4.4",
      "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
      "dependencies": {
        "once": "^1.4.0"
      }
    },
    "node_modules/entities": {
      "version": "4.5.0",
      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
      "engines": {
        "node": ">=0.12"
      }
    },
    "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==",
      "dependencies": {
        "get-intrinsic": "^1.2.4"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "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==",
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/esbuild": {
@@ -2152,6 +2416,24 @@
        "node": ">=16.17"
      }
    },
    "node_modules/extend": {
      "version": "3.0.2",
      "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
    },
    "node_modules/extsprintf": {
      "version": "1.3.0",
      "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
      "engines": [
        "node >=0.6.0"
      ]
    },
    "node_modules/fast-bind": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/fast-bind/-/fast-bind-1.0.0.tgz",
      "integrity": "sha512-kna1xVU4nn4HW4RVwh6VYSWoii+u8EkWKS3I6YZluncEvtQwahHKhZTRPFHOOkeJK4m0/Tz2Ir9n10tARqeiXw=="
    },
    "node_modules/fast-deep-equal": {
      "version": "3.1.3",
      "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -2221,6 +2503,11 @@
      "engines": {
        "node": "^10.12.0 || >=12.0.0"
      }
    },
    "node_modules/file-uri-to-path": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
    },
    "node_modules/fill-range": {
      "version": "7.0.1",
@@ -2292,6 +2579,14 @@
        "node": ">=14"
      }
    },
    "node_modules/forever-agent": {
      "version": "0.6.1",
      "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
      "engines": {
        "node": "*"
      }
    },
    "node_modules/form-data": {
      "version": "4.0.0",
      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
@@ -2308,8 +2603,7 @@
    "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
      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
    },
    "node_modules/fsevents": {
      "version": "2.3.3",
@@ -2338,6 +2632,24 @@
        "node": "*"
      }
    },
    "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==",
      "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"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/get-stream": {
      "version": "8.0.1",
      "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz",
@@ -2345,6 +2657,14 @@
      "dev": true,
      "engines": {
        "node": ">=16"
      }
    },
    "node_modules/getpass": {
      "version": "0.1.7",
      "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
      "dependencies": {
        "assert-plus": "^1.0.0"
      }
    },
    "node_modules/glob": {
@@ -2399,6 +2719,14 @@
        "node": ">=16 || 14 >=14.17"
      }
    },
    "node_modules/globalize": {
      "version": "1.7.0",
      "resolved": "https://registry.npmmirror.com/globalize/-/globalize-1.7.0.tgz",
      "integrity": "sha512-faR46vTIbFCeAemyuc9E6/d7Wrx9k2ae2L60UhakztFg6VuE42gENVJNuPFtt7Sdjrk9m2w8+py7Jj+JTNy59w==",
      "dependencies": {
        "cldrjs": "^0.5.4"
      }
    },
    "node_modules/globals": {
      "version": "13.24.0",
      "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
@@ -2409,6 +2737,17 @@
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/gopd": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
      "dependencies": {
        "get-intrinsic": "^1.1.3"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/graphemer": {
@@ -2426,6 +2765,39 @@
        "node": ">=8"
      }
    },
    "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==",
      "dependencies": {
        "es-define-property": "^1.0.0"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "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"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "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==",
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/hasown": {
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
@@ -2435,6 +2807,15 @@
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/hoek": {
      "version": "4.3.1",
      "resolved": "https://registry.npmmirror.com/hoek/-/hoek-4.3.1.tgz",
      "integrity": "sha512-v7E+yIjcHECn973i0xHm4kJkEpv3C8sbYS4344WXbzYqRyiDD7rjnnKo4hsJkejQBAFdRMUGNHySeSPKSH9Rqw==",
      "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/html-encoding-sniffer": {
@@ -2460,6 +2841,51 @@
      },
      "engines": {
        "node": ">= 14"
      }
    },
    "node_modules/http-signature": {
      "version": "1.3.6",
      "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.3.6.tgz",
      "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
      "dependencies": {
        "assert-plus": "^1.0.0",
        "jsprim": "^2.0.2",
        "sshpk": "^1.14.1"
      },
      "engines": {
        "node": ">=0.10"
      }
    },
    "node_modules/httpntlm": {
      "version": "1.8.13",
      "resolved": "https://registry.npmmirror.com/httpntlm/-/httpntlm-1.8.13.tgz",
      "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==",
      "funding": [
        {
          "type": "paypal",
          "url": "https://www.paypal.com/donate/?hosted_button_id=2CKNJLZJBW8ZC"
        },
        {
          "type": "buymeacoffee",
          "url": "https://www.buymeacoffee.com/samdecrock"
        }
      ],
      "dependencies": {
        "des.js": "^1.0.1",
        "httpreq": ">=0.4.22",
        "js-md4": "^0.3.2",
        "underscore": "~1.12.1"
      },
      "engines": {
        "node": ">=10.4.0"
      }
    },
    "node_modules/httpreq": {
      "version": "1.1.1",
      "resolved": "https://registry.npmmirror.com/httpreq/-/httpreq-1.1.1.tgz",
      "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==",
      "engines": {
        "node": ">= 6.15.1"
      }
    },
    "node_modules/https-proxy-agent": {
@@ -2537,7 +2963,6 @@
      "version": "1.0.6",
      "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
      "dev": true,
      "dependencies": {
        "once": "^1.3.0",
        "wrappy": "1"
@@ -2546,14 +2971,24 @@
    "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
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    },
    "node_modules/ini": {
      "version": "1.3.8",
      "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
      "dev": true
    },
    "node_modules/invert-kv": {
      "version": "3.0.1",
      "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
      "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sindresorhus/invert-kv?sponsor=1"
      }
    },
    "node_modules/is-binary-path": {
      "version": "2.1.0",
@@ -2565,6 +3000,11 @@
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/is-buffer": {
      "version": "1.1.6",
      "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
    },
    "node_modules/is-core-module": {
      "version": "2.13.1",
@@ -2634,11 +3074,31 @@
        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
      }
    },
    "node_modules/is-typedarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
    },
    "node_modules/isemail": {
      "version": "3.2.0",
      "resolved": "https://registry.npmmirror.com/isemail/-/isemail-3.2.0.tgz",
      "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
      "dependencies": {
        "punycode": "2.x.x"
      },
      "engines": {
        "node": ">=4.0.0"
      }
    },
    "node_modules/isexe": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
      "dev": true
      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
    },
    "node_modules/isstream": {
      "version": "0.1.2",
      "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
    },
    "node_modules/jackspeak": {
      "version": "2.3.6",
@@ -2655,10 +3115,51 @@
        "@pkgjs/parseargs": "^0.11.0"
      }
    },
    "node_modules/joi": {
      "version": "13.7.0",
      "resolved": "https://registry.npmmirror.com/joi/-/joi-13.7.0.tgz",
      "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==",
      "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).",
      "dependencies": {
        "hoek": "5.x.x",
        "isemail": "3.x.x",
        "topo": "3.x.x"
      },
      "engines": {
        "node": ">=8.9.0"
      }
    },
    "node_modules/joi/node_modules/hoek": {
      "version": "5.0.4",
      "resolved": "https://registry.npmmirror.com/hoek/-/hoek-5.0.4.tgz",
      "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==",
      "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).",
      "engines": {
        "node": ">=8.9.0"
      }
    },
    "node_modules/jquery": {
      "version": "3.7.1",
      "resolved": "https://registry.npmmirror.com/jquery/-/jquery-3.7.1.tgz",
      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
    },
    "node_modules/jquery-xml2json": {
      "version": "0.0.8",
      "resolved": "https://registry.npmmirror.com/jquery-xml2json/-/jquery-xml2json-0.0.8.tgz",
      "integrity": "sha512-PF8yh3sEeQev44ZWQ3c4Mxg1rXP8MEhOKPt5lDyaMe25SJaDI7pQvQOS5kpBPb1YC/d/0nEzUn+YewaXhAQFlw=="
    },
    "node_modules/jquery.soap": {
      "version": "1.7.3",
      "resolved": "https://registry.npmmirror.com/jquery.soap/-/jquery.soap-1.7.3.tgz",
      "integrity": "sha512-ZNMQ2Rmy8uQ/4CSJMz0IDZCYhdmT+SiAlLFMGDPvygthZfEsbj9TLPATBIjotx5STyTooRZBgmoaHbAXEAID1A==",
      "dependencies": {
        "jquery": ">=1.9.0"
      }
    },
    "node_modules/js-base64": {
      "version": "3.7.7",
      "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.7.tgz",
      "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw=="
    },
    "node_modules/js-beautify": {
      "version": "1.15.1",
@@ -2690,6 +3191,11 @@
        "node": ">=14"
      }
    },
    "node_modules/js-md4": {
      "version": "0.3.2",
      "resolved": "https://registry.npmmirror.com/js-md4/-/js-md4-0.3.2.tgz",
      "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
    },
    "node_modules/js-tokens": {
      "version": "8.0.3",
      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-8.0.3.tgz",
@@ -2707,6 +3213,11 @@
      "bin": {
        "js-yaml": "bin/js-yaml.js"
      }
    },
    "node_modules/jsbn": {
      "version": "0.1.1",
      "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
    },
    "node_modules/jsdom": {
      "version": "24.0.0",
@@ -2763,6 +3274,11 @@
      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
      "dev": true
    },
    "node_modules/json-schema": {
      "version": "0.4.0",
      "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
    },
    "node_modules/json-schema-traverse": {
      "version": "0.4.1",
      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -2775,11 +3291,30 @@
      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
      "dev": true
    },
    "node_modules/json-stringify-safe": {
      "version": "5.0.1",
      "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
    },
    "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
    },
    "node_modules/jsprim": {
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz",
      "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
      "engines": [
        "node >=0.6.0"
      ],
      "dependencies": {
        "assert-plus": "1.0.0",
        "extsprintf": "1.3.0",
        "json-schema": "0.4.0",
        "verror": "1.10.0"
      }
    },
    "node_modules/keyv": {
      "version": "4.5.4",
@@ -2788,6 +3323,17 @@
      "dev": true,
      "dependencies": {
        "json-buffer": "3.0.1"
      }
    },
    "node_modules/lcid": {
      "version": "3.1.1",
      "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
      "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
      "dependencies": {
        "invert-kv": "^3.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/levn": {
@@ -2883,6 +3429,48 @@
        "node": ">=12"
      }
    },
    "node_modules/map-age-cleaner": {
      "version": "0.1.3",
      "resolved": "https://registry.npmmirror.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
      "dependencies": {
        "p-defer": "^1.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/md5": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
      "dependencies": {
        "charenc": "0.0.2",
        "crypt": "0.0.2",
        "is-buffer": "~1.1.6"
      }
    },
    "node_modules/mem": {
      "version": "5.1.1",
      "resolved": "https://registry.npmmirror.com/mem/-/mem-5.1.1.tgz",
      "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
      "dependencies": {
        "map-age-cleaner": "^0.1.3",
        "mimic-fn": "^2.1.0",
        "p-is-promise": "^2.1.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/mem/node_modules/mimic-fn": {
      "version": "2.1.0",
      "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/memoize-one": {
      "version": "6.0.0",
      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
@@ -2891,8 +3479,7 @@
    "node_modules/merge-stream": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
      "dev": true
      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
    },
    "node_modules/merge2": {
      "version": "1.4.1",
@@ -2942,11 +3529,15 @@
        "node": ">=12"
      }
    },
    "node_modules/minimalistic-assert": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
    },
    "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,
      "dependencies": {
        "brace-expansion": "^1.1.7"
      },
@@ -2961,6 +3552,17 @@
      "dev": true,
      "engines": {
        "node": ">=16 || 14 >=14.17"
      }
    },
    "node_modules/mkdirp": {
      "version": "1.0.4",
      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz",
      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
      "bin": {
        "mkdirp": "bin/cmd.js"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/mlly": {
@@ -2988,6 +3590,11 @@
      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
    },
    "node_modules/nan": {
      "version": "2.20.0",
      "resolved": "https://registry.npmmirror.com/nan/-/nan-2.20.0.tgz",
      "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw=="
    },
    "node_modules/nanoid": {
      "version": "3.3.7",
      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
@@ -3004,6 +3611,24 @@
      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
      "dev": true
    },
    "node_modules/node-expat": {
      "version": "2.4.1",
      "resolved": "https://registry.npmmirror.com/node-expat/-/node-expat-2.4.1.tgz",
      "integrity": "sha512-uWgvQLgo883NKIL+66oJsK9ysKK3ej0YjVCPBZzO/7wMAuH68/Yb7+JwPWNaVq0yPaxrb48AoEXfYEc8gsmFbg==",
      "hasInstallScript": true,
      "dependencies": {
        "bindings": "^1.5.0",
        "nan": "^2.19.0"
      }
    },
    "node_modules/node-rsa": {
      "version": "1.1.1",
      "resolved": "https://registry.npmmirror.com/node-rsa/-/node-rsa-1.1.1.tgz",
      "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==",
      "dependencies": {
        "asn1": "^0.2.4"
      }
    },
    "node_modules/nopt": {
      "version": "7.2.0",
@@ -3069,11 +3694,21 @@
      "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
      "dev": true
    },
    "node_modules/object-inspect": {
      "version": "1.13.2",
      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz",
      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "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,
      "dependencies": {
        "wrappy": "1"
      }
@@ -3105,6 +3740,139 @@
      },
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/os-locale": {
      "version": "5.0.0",
      "resolved": "https://registry.npmmirror.com/os-locale/-/os-locale-5.0.0.tgz",
      "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==",
      "dependencies": {
        "execa": "^4.0.0",
        "lcid": "^3.0.0",
        "mem": "^5.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/os-locale/node_modules/execa": {
      "version": "4.1.0",
      "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz",
      "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
      "dependencies": {
        "cross-spawn": "^7.0.0",
        "get-stream": "^5.0.0",
        "human-signals": "^1.1.1",
        "is-stream": "^2.0.0",
        "merge-stream": "^2.0.0",
        "npm-run-path": "^4.0.0",
        "onetime": "^5.1.0",
        "signal-exit": "^3.0.2",
        "strip-final-newline": "^2.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sindresorhus/execa?sponsor=1"
      }
    },
    "node_modules/os-locale/node_modules/get-stream": {
      "version": "5.2.0",
      "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
      "dependencies": {
        "pump": "^3.0.0"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/os-locale/node_modules/human-signals": {
      "version": "1.1.1",
      "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz",
      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
      "engines": {
        "node": ">=8.12.0"
      }
    },
    "node_modules/os-locale/node_modules/is-stream": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/os-locale/node_modules/mimic-fn": {
      "version": "2.1.0",
      "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/os-locale/node_modules/npm-run-path": {
      "version": "4.0.1",
      "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
      "dependencies": {
        "path-key": "^3.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/os-locale/node_modules/onetime": {
      "version": "5.1.2",
      "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
      "dependencies": {
        "mimic-fn": "^2.1.0"
      },
      "engines": {
        "node": ">=6"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/os-locale/node_modules/signal-exit": {
      "version": "3.0.7",
      "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
    },
    "node_modules/os-locale/node_modules/strip-final-newline": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/p-defer": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/p-defer/-/p-defer-1.0.0.tgz",
      "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/p-is-promise": {
      "version": "2.1.0",
      "resolved": "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-2.1.0.tgz",
      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/p-limit": {
@@ -3165,7 +3933,6 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -3174,7 +3941,6 @@
      "version": "3.1.1",
      "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
@@ -3211,6 +3977,11 @@
      "engines": {
        "node": "*"
      }
    },
    "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=="
    },
    "node_modules/picocolors": {
      "version": "1.0.0",
@@ -3376,23 +4147,43 @@
    "node_modules/psl": {
      "version": "1.9.0",
      "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz",
      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
      "dev": true
      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
    },
    "node_modules/pump": {
      "version": "3.0.0",
      "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
      "dependencies": {
        "end-of-stream": "^1.1.0",
        "once": "^1.3.1"
      }
    },
    "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,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/qs": {
      "version": "6.10.4",
      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.4.tgz",
      "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
      "dependencies": {
        "side-channel": "^1.0.4"
      },
      "engines": {
        "node": ">=0.6"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/querystringify": {
      "version": "2.2.0",
      "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz",
      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
      "dev": true
      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
    },
    "node_modules/queue-microtask": {
      "version": "1.2.3",
@@ -3419,8 +4210,7 @@
    "node_modules/requires-port": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
      "dev": true
      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
    },
    "node_modules/resolve": {
      "version": "1.22.8",
@@ -3528,11 +4318,29 @@
        "queue-microtask": "^1.2.2"
      }
    },
    "node_modules/safe-buffer": {
      "version": "5.2.1",
      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
      "funding": [
        {
          "type": "github",
          "url": "https://github.com/sponsors/feross"
        },
        {
          "type": "patreon",
          "url": "https://www.patreon.com/feross"
        },
        {
          "type": "consulting",
          "url": "https://feross.org/support"
        }
      ]
    },
    "node_modules/safer-buffer": {
      "version": "2.1.2",
      "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
      "dev": true
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
    },
    "node_modules/sass": {
      "version": "1.76.0",
@@ -3551,6 +4359,11 @@
        "node": ">=14.0.0"
      }
    },
    "node_modules/sax": {
      "version": "1.4.1",
      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
    },
    "node_modules/saxes": {
      "version": "6.0.0",
      "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz",
@@ -3562,6 +4375,30 @@
      "engines": {
        "node": ">=v12.22.7"
      }
    },
    "node_modules/selectn": {
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/selectn/-/selectn-1.1.2.tgz",
      "integrity": "sha512-AaQlR5br4jWANaF5p5J1ctpsOKwFE5ljWK8ZUSrc4u4ZwcmFLyiowTMt7UjfzQN2/aXF3xnuSVnV4c3Q9tBDqQ==",
      "dependencies": {
        "brackets2dots": "^1.1.0",
        "curry2": "^1.0.0",
        "debug": "^2.5.2",
        "dotsplit.js": "^1.0.3"
      }
    },
    "node_modules/selectn/node_modules/debug": {
      "version": "2.6.9",
      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
      "dependencies": {
        "ms": "2.0.0"
      }
    },
    "node_modules/selectn/node_modules/ms": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
    },
    "node_modules/semver": {
      "version": "7.6.0",
@@ -3590,11 +4427,26 @@
        "node": ">=10"
      }
    },
    "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.4",
        "gopd": "^1.0.1",
        "has-property-descriptors": "^1.0.2"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "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,
      "dependencies": {
        "shebang-regex": "^3.0.0"
      },
@@ -3606,9 +4458,25 @@
      "version": "3.0.0",
      "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
      "dev": true,
      "engines": {
        "node": ">=8"
      }
    },
    "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"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/siginfo": {
@@ -3630,6 +4498,35 @@
      "version": "1.2.0",
      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz",
      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/sprintf-js": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
    },
    "node_modules/sshpk": {
      "version": "1.18.0",
      "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz",
      "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
      "dependencies": {
        "asn1": "~0.2.3",
        "assert-plus": "^1.0.0",
        "bcrypt-pbkdf": "^1.0.0",
        "dashdash": "^1.12.0",
        "ecc-jsbn": "~0.1.1",
        "getpass": "^0.1.1",
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.0.2",
        "tweetnacl": "~0.14.0"
      },
      "bin": {
        "sshpk-conv": "bin/sshpk-conv",
        "sshpk-sign": "bin/sshpk-sign",
        "sshpk-verify": "bin/sshpk-verify"
      },
      "engines": {
        "node": ">=0.10.0"
      }
@@ -3754,6 +4651,66 @@
        "js-tokens": "^8.0.2"
      }
    },
    "node_modules/strong-globalize": {
      "version": "6.0.6",
      "resolved": "https://registry.npmmirror.com/strong-globalize/-/strong-globalize-6.0.6.tgz",
      "integrity": "sha512-+mN0wTXBg9rLiKBk7jsyfXFWsg08q160XQcmJ3gNxSQ8wrC668dzR8JUp/wcK3NZ2eQ5h5tvc8O6Y+FC0D61lw==",
      "dependencies": {
        "accept-language": "^3.0.18",
        "debug": "^4.2.0",
        "globalize": "^1.6.0",
        "lodash": "^4.17.20",
        "md5": "^2.3.0",
        "mkdirp": "^1.0.4",
        "os-locale": "^5.0.0",
        "yamljs": "^0.3.0"
      },
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/strong-soap": {
      "version": "4.1.3",
      "resolved": "https://registry.npmmirror.com/strong-soap/-/strong-soap-4.1.3.tgz",
      "integrity": "sha512-Ts19vzoumipPPR3iWlmd2OVERAxlLdz6LXayDPBWyh9OuKyRw1hNrsaaGWzhlY2JY+5kq/j7mq2MpEVSYsk10w==",
      "dependencies": {
        "@cypress/request": "^3.0.1",
        "compress": "^0.99.0",
        "debug": "^4.3.6",
        "httpntlm": "^1.8.13",
        "lodash": "^4.17.21",
        "node-rsa": "^1.1.1",
        "sax": "^1.4.1",
        "selectn": "^1.1.2",
        "strong-globalize": "^6.0.6",
        "uuid": "^10.0.0",
        "xml-crypto": "^3.2.0",
        "xmlbuilder": "^10.1.1"
      },
      "engines": {
        "node": "18 || 20 || 21"
      }
    },
    "node_modules/strong-soap/node_modules/xml-crypto": {
      "version": "3.2.0",
      "resolved": "https://registry.npmmirror.com/xml-crypto/-/xml-crypto-3.2.0.tgz",
      "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==",
      "dependencies": {
        "@xmldom/xmldom": "^0.8.8",
        "xpath": "0.0.32"
      },
      "engines": {
        "node": ">=4.0.0"
      }
    },
    "node_modules/strong-soap/node_modules/xpath": {
      "version": "0.0.32",
      "resolved": "https://registry.npmmirror.com/xpath/-/xpath-0.0.32.tgz",
      "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
      "engines": {
        "node": ">=0.6.0"
      }
    },
    "node_modules/supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
@@ -3834,11 +4791,25 @@
        "node": ">=8.0"
      }
    },
    "node_modules/topo": {
      "version": "3.0.3",
      "resolved": "https://registry.npmmirror.com/topo/-/topo-3.0.3.tgz",
      "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
      "deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
      "dependencies": {
        "hoek": "6.x.x"
      }
    },
    "node_modules/topo/node_modules/hoek": {
      "version": "6.1.3",
      "resolved": "https://registry.npmmirror.com/hoek/-/hoek-6.1.3.tgz",
      "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==",
      "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues."
    },
    "node_modules/tough-cookie": {
      "version": "4.1.3",
      "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.3.tgz",
      "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
      "dev": true,
      "dependencies": {
        "psl": "^1.1.33",
        "punycode": "^2.1.1",
@@ -3866,6 +4837,22 @@
      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
      "dev": true
    },
    "node_modules/tunnel-agent": {
      "version": "0.6.0",
      "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
      "dependencies": {
        "safe-buffer": "^5.0.1"
      },
      "engines": {
        "node": "*"
      }
    },
    "node_modules/tweetnacl": {
      "version": "0.14.5",
      "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
    },
    "node_modules/type-check": {
      "version": "0.4.0",
@@ -3903,11 +4890,15 @@
      "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
      "dev": true
    },
    "node_modules/underscore": {
      "version": "1.12.1",
      "resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.12.1.tgz",
      "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
    },
    "node_modules/universalify": {
      "version": "0.2.0",
      "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz",
      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
      "dev": true,
      "engines": {
        "node": ">= 4.0.0"
      }
@@ -3999,7 +4990,6 @@
      "version": "1.5.10",
      "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz",
      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
      "dev": true,
      "dependencies": {
        "querystringify": "^2.1.1",
        "requires-port": "^1.0.0"
@@ -4010,6 +5000,31 @@
      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
      "dev": true
    },
    "node_modules/uuid": {
      "version": "10.0.0",
      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz",
      "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
      "funding": [
        "https://github.com/sponsors/broofa",
        "https://github.com/sponsors/ctavan"
      ],
      "bin": {
        "uuid": "dist/bin/uuid"
      }
    },
    "node_modules/verror": {
      "version": "1.10.0",
      "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
      "engines": [
        "node >=0.6.0"
      ],
      "dependencies": {
        "assert-plus": "^1.0.0",
        "core-util-is": "1.0.2",
        "extsprintf": "^1.2.0"
      }
    },
    "node_modules/vite": {
      "version": "5.2.6",
@@ -4283,7 +5298,6 @@
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
      "dev": true,
      "dependencies": {
        "isexe": "^2.0.0"
      },
@@ -4392,8 +5406,7 @@
    "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
      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
    },
    "node_modules/ws": {
      "version": "8.16.0",
@@ -4425,6 +5438,27 @@
        "node": ">=12"
      }
    },
    "node_modules/xml2json": {
      "version": "0.12.0",
      "resolved": "https://registry.npmmirror.com/xml2json/-/xml2json-0.12.0.tgz",
      "integrity": "sha512-EPJHRWJnJUYbJlzR4pBhZODwWdi2IaYGtDdteJi0JpZ4OD31IplWALuit8r73dJuM4iHZdDVKY1tLqY2UICejg==",
      "dependencies": {
        "hoek": "^4.2.1",
        "joi": "^13.1.2",
        "node-expat": "^2.3.18"
      },
      "bin": {
        "xml2json": "bin/xml2json"
      }
    },
    "node_modules/xmlbuilder": {
      "version": "10.1.1",
      "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/xmlchars": {
      "version": "2.2.0",
      "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -4436,6 +5470,47 @@
      "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
      "dev": true
    },
    "node_modules/yamljs": {
      "version": "0.3.0",
      "resolved": "https://registry.npmmirror.com/yamljs/-/yamljs-0.3.0.tgz",
      "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
      "dependencies": {
        "argparse": "^1.0.7",
        "glob": "^7.0.5"
      },
      "bin": {
        "json2yaml": "bin/json2yaml",
        "yaml2json": "bin/yaml2json"
      }
    },
    "node_modules/yamljs/node_modules/argparse": {
      "version": "1.0.10",
      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
      "dependencies": {
        "sprintf-js": "~1.0.2"
      }
    },
    "node_modules/yamljs/node_modules/glob": {
      "version": "7.2.3",
      "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
      "deprecated": "Glob versions prior to v9 are no longer supported",
      "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": "*"
      },
      "funding": {
        "url": "https://github.com/sponsors/isaacs"
      }
    },
    "node_modules/yocto-queue": {
      "version": "0.1.0",
@@ -4486,6 +5561,48 @@
      "version": "3.6.1",
      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA=="
    },
    "@cypress/request": {
      "version": "3.0.1",
      "resolved": "https://registry.npmmirror.com/@cypress/request/-/request-3.0.1.tgz",
      "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
      "requires": {
        "aws-sign2": "~0.7.0",
        "aws4": "^1.8.0",
        "caseless": "~0.12.0",
        "combined-stream": "~1.0.6",
        "extend": "~3.0.2",
        "forever-agent": "~0.6.1",
        "form-data": "~2.3.2",
        "http-signature": "~1.3.6",
        "is-typedarray": "~1.0.0",
        "isstream": "~0.1.2",
        "json-stringify-safe": "~5.0.1",
        "mime-types": "~2.1.19",
        "performance-now": "^2.1.0",
        "qs": "6.10.4",
        "safe-buffer": "^5.1.2",
        "tough-cookie": "^4.1.3",
        "tunnel-agent": "^0.6.0",
        "uuid": "^8.3.2"
      },
      "dependencies": {
        "form-data": {
          "version": "2.3.3",
          "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
          "requires": {
            "asynckit": "^0.4.0",
            "combined-stream": "^1.0.6",
            "mime-types": "^2.1.12"
          }
        },
        "uuid": {
          "version": "8.3.2",
          "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
        }
      }
    },
    "@element-plus/icons-vue": {
      "version": "2.3.1",
@@ -5265,11 +6382,24 @@
        }
      }
    },
    "@xmldom/xmldom": {
      "version": "0.8.10",
      "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="
    },
    "abbrev": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz",
      "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
      "dev": true
    },
    "accept-language": {
      "version": "3.0.20",
      "resolved": "https://registry.npmmirror.com/accept-language/-/accept-language-3.0.20.tgz",
      "integrity": "sha512-xklPzRma4aoDEPk0ZfMjeuxB2FP4JBYlAR25OFUqCoOYDjYo6wGwAs49SnTN/MoB5VpnNX9tENfZ+vEIFmHQMQ==",
      "requires": {
        "bcp47": "^1.1.2"
      }
    },
    "acorn": {
      "version": "8.11.3",
@@ -5340,6 +6470,19 @@
      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
      "dev": true
    },
    "asn1": {
      "version": "0.2.6",
      "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
      "requires": {
        "safer-buffer": "~2.1.0"
      }
    },
    "assert-plus": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
    },
    "assertion-error": {
      "version": "1.1.0",
      "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz",
@@ -5356,10 +6499,20 @@
      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
    },
    "aws-sign2": {
      "version": "0.7.0",
      "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
    },
    "aws4": {
      "version": "1.13.1",
      "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.1.tgz",
      "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA=="
    },
    "axios": {
      "version": "1.6.8",
      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz",
      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
      "version": "1.7.4",
      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.4.tgz",
      "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
      "requires": {
        "follow-redirects": "^1.15.6",
        "form-data": "^4.0.0",
@@ -5371,10 +6524,31 @@
      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    },
    "bcp47": {
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/bcp47/-/bcp47-1.1.2.tgz",
      "integrity": "sha512-JnkkL4GUpOvvanH9AZPX38CxhiLsXMBicBY2IAtqiVN8YulGDQybUydWA4W6yAMtw6iShtw+8HEF6cfrTHU+UQ=="
    },
    "bcrypt-pbkdf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
      "requires": {
        "tweetnacl": "^0.14.3"
      }
    },
    "binary-extensions": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="
    },
    "bindings": {
      "version": "1.5.0",
      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
      "requires": {
        "file-uri-to-path": "1.0.0"
      }
    },
    "boolbase": {
      "version": "1.0.0",
@@ -5386,7 +6560,6 @@
      "version": "1.1.11",
      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
      "dev": true,
      "requires": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
@@ -5400,17 +6573,39 @@
        "fill-range": "^7.0.1"
      }
    },
    "brackets2dots": {
      "version": "1.1.0",
      "resolved": "https://registry.npmmirror.com/brackets2dots/-/brackets2dots-1.1.0.tgz",
      "integrity": "sha512-DEIJz+ebFQ2SYPpXd8owCjy+8H+9N2Pd9DeSf0J33oavLyBYpAtjLg/Z/RmdJdTeHmKVva+L411HjnvyV2rSOA=="
    },
    "cac": {
      "version": "6.7.14",
      "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz",
      "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
      "dev": true
    },
    "call-bind": {
      "version": "1.0.7",
      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
      "requires": {
        "es-define-property": "^1.0.0",
        "es-errors": "^1.3.0",
        "function-bind": "^1.1.2",
        "get-intrinsic": "^1.2.4",
        "set-function-length": "^1.2.1"
      }
    },
    "callsites": {
      "version": "3.1.0",
      "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
      "dev": true
    },
    "caseless": {
      "version": "0.12.0",
      "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
    },
    "chai": {
      "version": "4.4.1",
@@ -5436,6 +6631,11 @@
        "ansi-styles": "^4.1.0",
        "supports-color": "^7.1.0"
      }
    },
    "charenc": {
      "version": "0.0.2",
      "resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="
    },
    "check-error": {
      "version": "1.0.3",
@@ -5471,6 +6671,11 @@
        }
      }
    },
    "cldrjs": {
      "version": "0.5.5",
      "resolved": "https://registry.npmmirror.com/cldrjs/-/cldrjs-0.5.5.tgz",
      "integrity": "sha512-KDwzwbmLIPfCgd8JERVDpQKrUUM1U4KpFJJg2IROv89rF172lLufoJnqJ/Wea6fXL5bO6WjuLMzY8V52UWPvkA=="
    },
    "color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@@ -5500,11 +6705,15 @@
      "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
      "dev": true
    },
    "compress": {
      "version": "0.99.0",
      "resolved": "https://registry.npmmirror.com/compress/-/compress-0.99.0.tgz",
      "integrity": "sha512-+qy9iMBFGTLUqKwYkAqRtZ5Xdl1PGKrSMYCuiirsxSQ5OgDoyP9QO6YoZ4feHzhpufGOwJ+y4qRXz2ytzZ1l0g=="
    },
    "concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
      "dev": true
      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
    },
    "config-chain": {
      "version": "1.1.13",
@@ -5516,16 +6725,25 @@
        "proto-list": "~1.2.1"
      }
    },
    "core-util-is": {
      "version": "1.0.2",
      "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
    },
    "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": {
        "path-key": "^3.1.0",
        "shebang-command": "^2.0.0",
        "which": "^2.0.1"
      }
    },
    "crypt": {
      "version": "0.0.2",
      "resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="
    },
    "cssesc": {
      "version": "3.0.0",
@@ -5547,6 +6765,22 @@
      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
    },
    "curry2": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/curry2/-/curry2-1.0.3.tgz",
      "integrity": "sha512-2vXqPLsITt0ccyczu1BFl3tc8Q6BOCsTHt+NZYasd8wp60RQIYhGM3Beis5h5FgJPT11M1rfiKOR7dPL6cL14Q==",
      "requires": {
        "fast-bind": "^1.0.0"
      }
    },
    "dashdash": {
      "version": "1.14.1",
      "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
      "requires": {
        "assert-plus": "^1.0.0"
      }
    },
    "data-urls": {
      "version": "5.0.0",
      "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-5.0.0.tgz",
@@ -5563,9 +6797,9 @@
      "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
    },
    "debug": {
      "version": "4.3.4",
      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
      "version": "4.3.6",
      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz",
      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
      "requires": {
        "ms": "2.1.2"
      }
@@ -5591,10 +6825,29 @@
      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
      "dev": true
    },
    "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": {
        "es-define-property": "^1.0.0",
        "es-errors": "^1.3.0",
        "gopd": "^1.0.1"
      }
    },
    "delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
    },
    "des.js": {
      "version": "1.1.0",
      "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz",
      "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
      "requires": {
        "inherits": "^2.0.1",
        "minimalistic-assert": "^1.0.0"
      }
    },
    "diff-sequences": {
      "version": "29.6.3",
@@ -5611,11 +6864,25 @@
        "esutils": "^2.0.2"
      }
    },
    "dotsplit.js": {
      "version": "1.1.0",
      "resolved": "https://registry.npmmirror.com/dotsplit.js/-/dotsplit.js-1.1.0.tgz",
      "integrity": "sha512-oFVx9VEE+M3yM4oUkaiDa+U2RhOmjXWyXwtfdc5UiHDSZWleE96FS3nx3yXMVuhLJOdI2GMThvaegkwRYPgAFQ=="
    },
    "eastasianwidth": {
      "version": "0.2.0",
      "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
      "dev": true
    },
    "ecc-jsbn": {
      "version": "0.1.2",
      "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
      "requires": {
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.1.0"
      }
    },
    "echarts": {
      "version": "5.5.0",
@@ -5740,10 +7007,31 @@
      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
      "dev": true
    },
    "end-of-stream": {
      "version": "1.4.4",
      "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
      "requires": {
        "once": "^1.4.0"
      }
    },
    "entities": {
      "version": "4.5.0",
      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
    },
    "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": {
        "get-intrinsic": "^1.2.4"
      }
    },
    "es-errors": {
      "version": "1.3.0",
      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
    },
    "esbuild": {
      "version": "0.20.2",
@@ -5949,6 +7237,21 @@
        "strip-final-newline": "^3.0.0"
      }
    },
    "extend": {
      "version": "3.0.2",
      "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
    },
    "extsprintf": {
      "version": "1.3.0",
      "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
    },
    "fast-bind": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/fast-bind/-/fast-bind-1.0.0.tgz",
      "integrity": "sha512-kna1xVU4nn4HW4RVwh6VYSWoii+u8EkWKS3I6YZluncEvtQwahHKhZTRPFHOOkeJK4m0/Tz2Ir9n10tARqeiXw=="
    },
    "fast-deep-equal": {
      "version": "3.1.3",
      "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -6012,6 +7315,11 @@
        "flat-cache": "^3.0.4"
      }
    },
    "file-uri-to-path": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
    },
    "fill-range": {
      "version": "7.0.1",
      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
@@ -6062,6 +7370,11 @@
        "signal-exit": "^4.0.1"
      }
    },
    "forever-agent": {
      "version": "0.6.1",
      "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
    },
    "form-data": {
      "version": "4.0.0",
      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
@@ -6075,8 +7388,7 @@
    "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
      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
    },
    "fsevents": {
      "version": "2.3.3",
@@ -6095,11 +7407,31 @@
      "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
      "dev": true
    },
    "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": {
        "es-errors": "^1.3.0",
        "function-bind": "^1.1.2",
        "has-proto": "^1.0.1",
        "has-symbols": "^1.0.3",
        "hasown": "^2.0.0"
      }
    },
    "get-stream": {
      "version": "8.0.1",
      "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz",
      "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
      "dev": true
    },
    "getpass": {
      "version": "0.1.7",
      "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
      "requires": {
        "assert-plus": "^1.0.0"
      }
    },
    "glob": {
      "version": "10.3.10",
@@ -6143,6 +7475,14 @@
        "is-glob": "^4.0.3"
      }
    },
    "globalize": {
      "version": "1.7.0",
      "resolved": "https://registry.npmmirror.com/globalize/-/globalize-1.7.0.tgz",
      "integrity": "sha512-faR46vTIbFCeAemyuc9E6/d7Wrx9k2ae2L60UhakztFg6VuE42gENVJNuPFtt7Sdjrk9m2w8+py7Jj+JTNy59w==",
      "requires": {
        "cldrjs": "^0.5.4"
      }
    },
    "globals": {
      "version": "13.24.0",
      "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
@@ -6150,6 +7490,14 @@
      "dev": true,
      "requires": {
        "type-fest": "^0.20.2"
      }
    },
    "gopd": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
      "requires": {
        "get-intrinsic": "^1.1.3"
      }
    },
    "graphemer": {
@@ -6164,6 +7512,24 @@
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
      "dev": true
    },
    "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": {
        "es-define-property": "^1.0.0"
      }
    },
    "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=="
    },
    "has-symbols": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
    },
    "hasown": {
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
@@ -6171,6 +7537,11 @@
      "requires": {
        "function-bind": "^1.1.2"
      }
    },
    "hoek": {
      "version": "4.3.1",
      "resolved": "https://registry.npmmirror.com/hoek/-/hoek-4.3.1.tgz",
      "integrity": "sha512-v7E+yIjcHECn973i0xHm4kJkEpv3C8sbYS4344WXbzYqRyiDD7rjnnKo4hsJkejQBAFdRMUGNHySeSPKSH9Rqw=="
    },
    "html-encoding-sniffer": {
      "version": "4.0.0",
@@ -6190,6 +7561,32 @@
        "agent-base": "^7.1.0",
        "debug": "^4.3.4"
      }
    },
    "http-signature": {
      "version": "1.3.6",
      "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.3.6.tgz",
      "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
      "requires": {
        "assert-plus": "^1.0.0",
        "jsprim": "^2.0.2",
        "sshpk": "^1.14.1"
      }
    },
    "httpntlm": {
      "version": "1.8.13",
      "resolved": "https://registry.npmmirror.com/httpntlm/-/httpntlm-1.8.13.tgz",
      "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==",
      "requires": {
        "des.js": "^1.0.1",
        "httpreq": ">=0.4.22",
        "js-md4": "^0.3.2",
        "underscore": "~1.12.1"
      }
    },
    "httpreq": {
      "version": "1.1.1",
      "resolved": "https://registry.npmmirror.com/httpreq/-/httpreq-1.1.1.tgz",
      "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw=="
    },
    "https-proxy-agent": {
      "version": "7.0.4",
@@ -6248,7 +7645,6 @@
      "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": {
        "once": "^1.3.0",
        "wrappy": "1"
@@ -6257,14 +7653,18 @@
    "inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
      "dev": true
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    },
    "ini": {
      "version": "1.3.8",
      "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
      "dev": true
    },
    "invert-kv": {
      "version": "3.0.1",
      "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
      "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw=="
    },
    "is-binary-path": {
      "version": "2.1.0",
@@ -6273,6 +7673,11 @@
      "requires": {
        "binary-extensions": "^2.0.0"
      }
    },
    "is-buffer": {
      "version": "1.1.6",
      "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
    },
    "is-core-module": {
      "version": "2.13.1",
@@ -6324,11 +7729,28 @@
      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
      "dev": true
    },
    "is-typedarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
    },
    "isemail": {
      "version": "3.2.0",
      "resolved": "https://registry.npmmirror.com/isemail/-/isemail-3.2.0.tgz",
      "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
      "requires": {
        "punycode": "2.x.x"
      }
    },
    "isexe": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
      "dev": true
      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
    },
    "isstream": {
      "version": "0.1.2",
      "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
    },
    "jackspeak": {
      "version": "2.3.6",
@@ -6340,10 +7762,45 @@
        "@pkgjs/parseargs": "^0.11.0"
      }
    },
    "joi": {
      "version": "13.7.0",
      "resolved": "https://registry.npmmirror.com/joi/-/joi-13.7.0.tgz",
      "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==",
      "requires": {
        "hoek": "5.x.x",
        "isemail": "3.x.x",
        "topo": "3.x.x"
      },
      "dependencies": {
        "hoek": {
          "version": "5.0.4",
          "resolved": "https://registry.npmmirror.com/hoek/-/hoek-5.0.4.tgz",
          "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w=="
        }
      }
    },
    "jquery": {
      "version": "3.7.1",
      "resolved": "https://registry.npmmirror.com/jquery/-/jquery-3.7.1.tgz",
      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
    },
    "jquery-xml2json": {
      "version": "0.0.8",
      "resolved": "https://registry.npmmirror.com/jquery-xml2json/-/jquery-xml2json-0.0.8.tgz",
      "integrity": "sha512-PF8yh3sEeQev44ZWQ3c4Mxg1rXP8MEhOKPt5lDyaMe25SJaDI7pQvQOS5kpBPb1YC/d/0nEzUn+YewaXhAQFlw=="
    },
    "jquery.soap": {
      "version": "1.7.3",
      "resolved": "https://registry.npmmirror.com/jquery.soap/-/jquery.soap-1.7.3.tgz",
      "integrity": "sha512-ZNMQ2Rmy8uQ/4CSJMz0IDZCYhdmT+SiAlLFMGDPvygthZfEsbj9TLPATBIjotx5STyTooRZBgmoaHbAXEAID1A==",
      "requires": {
        "jquery": ">=1.9.0"
      }
    },
    "js-base64": {
      "version": "3.7.7",
      "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.7.tgz",
      "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw=="
    },
    "js-beautify": {
      "version": "1.15.1",
@@ -6364,6 +7821,11 @@
      "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
      "dev": true
    },
    "js-md4": {
      "version": "0.3.2",
      "resolved": "https://registry.npmmirror.com/js-md4/-/js-md4-0.3.2.tgz",
      "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
    },
    "js-tokens": {
      "version": "8.0.3",
      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-8.0.3.tgz",
@@ -6378,6 +7840,11 @@
      "requires": {
        "argparse": "^2.0.1"
      }
    },
    "jsbn": {
      "version": "0.1.1",
      "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
    },
    "jsdom": {
      "version": "24.0.0",
@@ -6422,6 +7889,11 @@
      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
      "dev": true
    },
    "json-schema": {
      "version": "0.4.0",
      "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
    },
    "json-schema-traverse": {
      "version": "0.4.1",
      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -6434,11 +7906,27 @@
      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
      "dev": true
    },
    "json-stringify-safe": {
      "version": "5.0.1",
      "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
    },
    "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
    },
    "jsprim": {
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz",
      "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
      "requires": {
        "assert-plus": "1.0.0",
        "extsprintf": "1.3.0",
        "json-schema": "0.4.0",
        "verror": "1.10.0"
      }
    },
    "keyv": {
      "version": "4.5.4",
@@ -6447,6 +7935,14 @@
      "dev": true,
      "requires": {
        "json-buffer": "3.0.1"
      }
    },
    "lcid": {
      "version": "3.1.1",
      "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
      "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
      "requires": {
        "invert-kv": "^3.0.0"
      }
    },
    "levn": {
@@ -6523,6 +8019,41 @@
        "@jridgewell/sourcemap-codec": "^1.4.15"
      }
    },
    "map-age-cleaner": {
      "version": "0.1.3",
      "resolved": "https://registry.npmmirror.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
      "requires": {
        "p-defer": "^1.0.0"
      }
    },
    "md5": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
      "requires": {
        "charenc": "0.0.2",
        "crypt": "0.0.2",
        "is-buffer": "~1.1.6"
      }
    },
    "mem": {
      "version": "5.1.1",
      "resolved": "https://registry.npmmirror.com/mem/-/mem-5.1.1.tgz",
      "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
      "requires": {
        "map-age-cleaner": "^0.1.3",
        "mimic-fn": "^2.1.0",
        "p-is-promise": "^2.1.0"
      },
      "dependencies": {
        "mimic-fn": {
          "version": "2.1.0",
          "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
        }
      }
    },
    "memoize-one": {
      "version": "6.0.0",
      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
@@ -6531,8 +8062,7 @@
    "merge-stream": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
      "dev": true
      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
    },
    "merge2": {
      "version": "1.4.1",
@@ -6567,11 +8097,15 @@
      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
      "dev": true
    },
    "minimalistic-assert": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
    },
    "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": {
        "brace-expansion": "^1.1.7"
      }
@@ -6581,6 +8115,11 @@
      "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz",
      "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
      "dev": true
    },
    "mkdirp": {
      "version": "1.0.4",
      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz",
      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
    },
    "mlly": {
      "version": "1.6.1",
@@ -6604,6 +8143,11 @@
      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
    },
    "nan": {
      "version": "2.20.0",
      "resolved": "https://registry.npmmirror.com/nan/-/nan-2.20.0.tgz",
      "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw=="
    },
    "nanoid": {
      "version": "3.3.7",
      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
@@ -6614,6 +8158,23 @@
      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
      "dev": true
    },
    "node-expat": {
      "version": "2.4.1",
      "resolved": "https://registry.npmmirror.com/node-expat/-/node-expat-2.4.1.tgz",
      "integrity": "sha512-uWgvQLgo883NKIL+66oJsK9ysKK3ej0YjVCPBZzO/7wMAuH68/Yb7+JwPWNaVq0yPaxrb48AoEXfYEc8gsmFbg==",
      "requires": {
        "bindings": "^1.5.0",
        "nan": "^2.19.0"
      }
    },
    "node-rsa": {
      "version": "1.1.1",
      "resolved": "https://registry.npmmirror.com/node-rsa/-/node-rsa-1.1.1.tgz",
      "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==",
      "requires": {
        "asn1": "^0.2.4"
      }
    },
    "nopt": {
      "version": "7.2.0",
@@ -6666,11 +8227,15 @@
      "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
      "dev": true
    },
    "object-inspect": {
      "version": "1.13.2",
      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz",
      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g=="
    },
    "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": {
        "wrappy": "1"
      }
@@ -6697,6 +8262,93 @@
        "prelude-ls": "^1.2.1",
        "type-check": "^0.4.0"
      }
    },
    "os-locale": {
      "version": "5.0.0",
      "resolved": "https://registry.npmmirror.com/os-locale/-/os-locale-5.0.0.tgz",
      "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==",
      "requires": {
        "execa": "^4.0.0",
        "lcid": "^3.0.0",
        "mem": "^5.0.0"
      },
      "dependencies": {
        "execa": {
          "version": "4.1.0",
          "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz",
          "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
          "requires": {
            "cross-spawn": "^7.0.0",
            "get-stream": "^5.0.0",
            "human-signals": "^1.1.1",
            "is-stream": "^2.0.0",
            "merge-stream": "^2.0.0",
            "npm-run-path": "^4.0.0",
            "onetime": "^5.1.0",
            "signal-exit": "^3.0.2",
            "strip-final-newline": "^2.0.0"
          }
        },
        "get-stream": {
          "version": "5.2.0",
          "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
          "requires": {
            "pump": "^3.0.0"
          }
        },
        "human-signals": {
          "version": "1.1.1",
          "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz",
          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
        },
        "is-stream": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
        },
        "mimic-fn": {
          "version": "2.1.0",
          "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
        },
        "npm-run-path": {
          "version": "4.0.1",
          "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
          "requires": {
            "path-key": "^3.0.0"
          }
        },
        "onetime": {
          "version": "5.1.2",
          "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
          "requires": {
            "mimic-fn": "^2.1.0"
          }
        },
        "signal-exit": {
          "version": "3.0.7",
          "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
          "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
        },
        "strip-final-newline": {
          "version": "2.0.0",
          "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
          "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
        }
      }
    },
    "p-defer": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/p-defer/-/p-defer-1.0.0.tgz",
      "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw=="
    },
    "p-is-promise": {
      "version": "2.1.0",
      "resolved": "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-2.1.0.tgz",
      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
    },
    "p-limit": {
      "version": "3.1.0",
@@ -6743,14 +8395,12 @@
    "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
      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
    },
    "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
      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
    },
    "path-parse": {
      "version": "1.0.7",
@@ -6778,6 +8428,11 @@
      "resolved": "https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz",
      "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
      "dev": true
    },
    "performance-now": {
      "version": "2.1.0",
      "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
    },
    "picocolors": {
      "version": "1.0.0",
@@ -6891,20 +8546,34 @@
    "psl": {
      "version": "1.9.0",
      "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz",
      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
      "dev": true
      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
    },
    "pump": {
      "version": "3.0.0",
      "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
      "requires": {
        "end-of-stream": "^1.1.0",
        "once": "^1.3.1"
      }
    },
    "punycode": {
      "version": "2.3.1",
      "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
      "dev": true
      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
    },
    "qs": {
      "version": "6.10.4",
      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.4.tgz",
      "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
      "requires": {
        "side-channel": "^1.0.4"
      }
    },
    "querystringify": {
      "version": "2.2.0",
      "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz",
      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
      "dev": true
      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
    },
    "queue-microtask": {
      "version": "1.2.3",
@@ -6928,8 +8597,7 @@
    "requires-port": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
      "dev": true
      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
    },
    "resolve": {
      "version": "1.22.8",
@@ -7014,11 +8682,15 @@
        "queue-microtask": "^1.2.2"
      }
    },
    "safe-buffer": {
      "version": "5.2.1",
      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
    },
    "safer-buffer": {
      "version": "2.1.2",
      "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
      "dev": true
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
    },
    "sass": {
      "version": "1.76.0",
@@ -7031,6 +8703,11 @@
        "source-map-js": ">=0.6.2 <2.0.0"
      }
    },
    "sax": {
      "version": "1.4.1",
      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
    },
    "saxes": {
      "version": "6.0.0",
      "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz",
@@ -7038,6 +8715,32 @@
      "dev": true,
      "requires": {
        "xmlchars": "^2.2.0"
      }
    },
    "selectn": {
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/selectn/-/selectn-1.1.2.tgz",
      "integrity": "sha512-AaQlR5br4jWANaF5p5J1ctpsOKwFE5ljWK8ZUSrc4u4ZwcmFLyiowTMt7UjfzQN2/aXF3xnuSVnV4c3Q9tBDqQ==",
      "requires": {
        "brackets2dots": "^1.1.0",
        "curry2": "^1.0.0",
        "debug": "^2.5.2",
        "dotsplit.js": "^1.0.3"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
        }
      }
    },
    "semver": {
@@ -7060,11 +8763,23 @@
        }
      }
    },
    "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==",
      "requires": {
        "define-data-property": "^1.1.4",
        "es-errors": "^1.3.0",
        "function-bind": "^1.1.2",
        "get-intrinsic": "^1.2.4",
        "gopd": "^1.0.1",
        "has-property-descriptors": "^1.0.2"
      }
    },
    "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": {
        "shebang-regex": "^3.0.0"
      }
@@ -7072,8 +8787,18 @@
    "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
      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
    },
    "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==",
      "requires": {
        "call-bind": "^1.0.7",
        "es-errors": "^1.3.0",
        "get-intrinsic": "^1.2.4",
        "object-inspect": "^1.13.1"
      }
    },
    "siginfo": {
      "version": "2.0.0",
@@ -7091,6 +8816,27 @@
      "version": "1.2.0",
      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz",
      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="
    },
    "sprintf-js": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
    },
    "sshpk": {
      "version": "1.18.0",
      "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz",
      "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
      "requires": {
        "asn1": "~0.2.3",
        "assert-plus": "^1.0.0",
        "bcrypt-pbkdf": "^1.0.0",
        "dashdash": "^1.12.0",
        "ecc-jsbn": "~0.1.1",
        "getpass": "^0.1.1",
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.0.2",
        "tweetnacl": "~0.14.0"
      }
    },
    "stackback": {
      "version": "0.0.2",
@@ -7190,6 +8936,56 @@
        "js-tokens": "^8.0.2"
      }
    },
    "strong-globalize": {
      "version": "6.0.6",
      "resolved": "https://registry.npmmirror.com/strong-globalize/-/strong-globalize-6.0.6.tgz",
      "integrity": "sha512-+mN0wTXBg9rLiKBk7jsyfXFWsg08q160XQcmJ3gNxSQ8wrC668dzR8JUp/wcK3NZ2eQ5h5tvc8O6Y+FC0D61lw==",
      "requires": {
        "accept-language": "^3.0.18",
        "debug": "^4.2.0",
        "globalize": "^1.6.0",
        "lodash": "^4.17.20",
        "md5": "^2.3.0",
        "mkdirp": "^1.0.4",
        "os-locale": "^5.0.0",
        "yamljs": "^0.3.0"
      }
    },
    "strong-soap": {
      "version": "4.1.3",
      "resolved": "https://registry.npmmirror.com/strong-soap/-/strong-soap-4.1.3.tgz",
      "integrity": "sha512-Ts19vzoumipPPR3iWlmd2OVERAxlLdz6LXayDPBWyh9OuKyRw1hNrsaaGWzhlY2JY+5kq/j7mq2MpEVSYsk10w==",
      "requires": {
        "@cypress/request": "^3.0.1",
        "compress": "^0.99.0",
        "debug": "^4.3.6",
        "httpntlm": "^1.8.13",
        "lodash": "^4.17.21",
        "node-rsa": "^1.1.1",
        "sax": "^1.4.1",
        "selectn": "^1.1.2",
        "strong-globalize": "^6.0.6",
        "uuid": "^10.0.0",
        "xml-crypto": "^3.2.0",
        "xmlbuilder": "^10.1.1"
      },
      "dependencies": {
        "xml-crypto": {
          "version": "3.2.0",
          "resolved": "https://registry.npmmirror.com/xml-crypto/-/xml-crypto-3.2.0.tgz",
          "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==",
          "requires": {
            "@xmldom/xmldom": "^0.8.8",
            "xpath": "0.0.32"
          }
        },
        "xpath": {
          "version": "0.0.32",
          "resolved": "https://registry.npmmirror.com/xpath/-/xpath-0.0.32.tgz",
          "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="
        }
      }
    },
    "supports-color": {
      "version": "7.2.0",
      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
@@ -7252,11 +9048,25 @@
        "is-number": "^7.0.0"
      }
    },
    "topo": {
      "version": "3.0.3",
      "resolved": "https://registry.npmmirror.com/topo/-/topo-3.0.3.tgz",
      "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
      "requires": {
        "hoek": "6.x.x"
      },
      "dependencies": {
        "hoek": {
          "version": "6.1.3",
          "resolved": "https://registry.npmmirror.com/hoek/-/hoek-6.1.3.tgz",
          "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ=="
        }
      }
    },
    "tough-cookie": {
      "version": "4.1.3",
      "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.3.tgz",
      "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
      "dev": true,
      "requires": {
        "psl": "^1.1.33",
        "punycode": "^2.1.1",
@@ -7278,6 +9088,19 @@
      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
      "dev": true
    },
    "tunnel-agent": {
      "version": "0.6.0",
      "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
      "requires": {
        "safe-buffer": "^5.0.1"
      }
    },
    "tweetnacl": {
      "version": "0.14.5",
      "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
    },
    "type-check": {
      "version": "0.4.0",
@@ -7306,11 +9129,15 @@
      "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
      "dev": true
    },
    "underscore": {
      "version": "1.12.1",
      "resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.12.1.tgz",
      "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
    },
    "universalify": {
      "version": "0.2.0",
      "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz",
      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
      "dev": true
      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="
    },
    "unplugin": {
      "version": "1.10.0",
@@ -7376,7 +9203,6 @@
      "version": "1.5.10",
      "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz",
      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
      "dev": true,
      "requires": {
        "querystringify": "^2.1.1",
        "requires-port": "^1.0.0"
@@ -7387,6 +9213,21 @@
      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
      "dev": true
    },
    "uuid": {
      "version": "10.0.0",
      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz",
      "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="
    },
    "verror": {
      "version": "1.10.0",
      "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
      "requires": {
        "assert-plus": "^1.0.0",
        "core-util-is": "1.0.2",
        "extsprintf": "^1.2.0"
      }
    },
    "vite": {
      "version": "5.2.6",
@@ -7544,7 +9385,6 @@
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
      "dev": true,
      "requires": {
        "isexe": "^2.0.0"
      }
@@ -7626,8 +9466,7 @@
    "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
      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
    },
    "ws": {
      "version": "8.16.0",
@@ -7642,6 +9481,21 @@
      "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
      "dev": true
    },
    "xml2json": {
      "version": "0.12.0",
      "resolved": "https://registry.npmmirror.com/xml2json/-/xml2json-0.12.0.tgz",
      "integrity": "sha512-EPJHRWJnJUYbJlzR4pBhZODwWdi2IaYGtDdteJi0JpZ4OD31IplWALuit8r73dJuM4iHZdDVKY1tLqY2UICejg==",
      "requires": {
        "hoek": "^4.2.1",
        "joi": "^13.1.2",
        "node-expat": "^2.3.18"
      }
    },
    "xmlbuilder": {
      "version": "10.1.1",
      "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg=="
    },
    "xmlchars": {
      "version": "2.2.0",
      "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -7654,6 +9508,38 @@
      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
      "dev": true
    },
    "yamljs": {
      "version": "0.3.0",
      "resolved": "https://registry.npmmirror.com/yamljs/-/yamljs-0.3.0.tgz",
      "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
      "requires": {
        "argparse": "^1.0.7",
        "glob": "^7.0.5"
      },
      "dependencies": {
        "argparse": {
          "version": "1.0.10",
          "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
          "requires": {
            "sprintf-js": "~1.0.2"
          }
        },
        "glob": {
          "version": "7.2.3",
          "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
          "requires": {
            "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"
          }
        }
      }
    },
    "yocto-queue": {
      "version": "0.1.0",
      "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
package.json
@@ -5,7 +5,9 @@
  "type": "module",
  "scripts": {
    "dev": "vite",
    "dev:jingan": "vite --mode development.jingan",
    "build": "vite build",
    "build:jingan": "vite build --mode production.jingan",
    "preview": "vite preview",
    "test:unit": "vitest",
    "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
@@ -24,11 +26,16 @@
    "echarts": "^5.5.0",
    "element-plus": "^2.6.2",
    "jquery": "^3.7.1",
    "jquery-xml2json": "^0.0.8",
    "jquery.soap": "^1.7.3",
    "js-base64": "^3.7.7",
    "moment": "^2.30.1",
    "pinia": "^2.1.7",
    "strong-soap": "^4.1.3",
    "unplugin-vue-components": "^0.26.0",
    "vue": "^3.4.21",
    "vue-router": "^4.3.0"
    "vue-router": "^4.3.0",
    "xml2json": "^0.12.0"
  },
  "devDependencies": {
    "@rushstack/eslint-patch": "^1.3.3",
public/favicon.ico

src/api/index.js
@@ -1,10 +1,13 @@
import axios from 'axios';
import { ElMessage } from 'element-plus';
const debug = false;
const debug = true;
// let ip1 = 'http://114.215.109.124:8805/';
let ip1 = 'http://47.100.191.150:9029/';
// console.log(import.meta.env);
if (import.meta.env.VITE_DATA_MODE == 'jingan') {
  ip1 = 'http://114.215.109.124:8805/';
}
if (debug) {
  ip1 = 'http://192.168.0.138:8084/';
@@ -21,17 +24,21 @@
  i.interceptors.request.use(
    function (config) {
      // åœ¨å‘送请求之前做些什么
      console.log('==>请求开始');
      console.log(`${config.baseURL}${config.url}`);
      if (config.data) {
        console.log('==>请求数据', config.data);
      if (import.meta.env.DEV) {
        console.log('==>请求开始');
        console.log(`${config.baseURL}${config.url}`);
        if (config.data) {
          console.log('==>请求数据', config.data);
        }
      }
      return config;
    },
    function (error) {
      // å¯¹è¯·æ±‚错误做些什么
      console.log('==>请求开始');
      console.log(error);
      if (import.meta.env.DEV) {
        console.log('==>请求开始');
        console.log(error);
      }
      ElMessage({
        message: error,
        type: 'error'
@@ -45,8 +52,10 @@
    function (response) {
      // 2xx èŒƒå›´å†…的状态码都会触发该函数。
      // å¯¹å“åº”数据做点什么
      console.log(response);
      console.log('==>请求结束');
      if (import.meta.env.DEV) {
        console.log(response);
        console.log('==>请求结束');
      }
      if (response.status == 200) {
        if (
          response.data.success != undefined &&
@@ -71,8 +80,10 @@
    function (error) {
      // è¶…出 2xx èŒƒå›´çš„状态码都会触发该函数。
      // å¯¹å“åº”错误做点什么
      console.log(error);
      console.log('==>请求结束');
      if (import.meta.env.DEV) {
        console.log(error);
        console.log('==>请求结束');
      }
      ElMessage({
        message: error,
        type: 'error'
src/api/missionApi.js
@@ -1,4 +1,5 @@
import { $http } from './index';
import { Base64 } from 'js-base64';
/**
 *
@@ -17,5 +18,22 @@
  deleteMission(missionCode) {
    let params = `missionCode=${missionCode}`;
    return $http.post(`air/mission/delete?${params}`).then((res) => res.data);
  },
  downloadReport(missionCode) {
    let params = `missionCode=${missionCode}`;
    return $http
      .get(`air/mission/report?${params}`, { responseType: 'blob' })
      .then((res) => {
        const name = Base64.decode(res.headers.get('fileName'));
        const url = window.URL.createObjectURL(res.data);
        const link = document.createElement('a');
        link.href = url;
        link.setAttribute('download', name);
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        window.URL.revokeObjectURL(url);
      });
  }
};
src/assets/common-style.css
@@ -181,7 +181,7 @@
}
.time {
  color: #ffffff9d;
  color: #ffffffde;
  font-size: 12px;
}
@@ -415,7 +415,7 @@
}
.custom-info {
  border: solid 1px silver;
  border: solid 1px rgb(255, 255, 255);
}
div.info-top {
@@ -440,6 +440,7 @@
div.info-middle {
  padding: 0px 12px 4px 0px;
  /* line-height: 20px; */
  color: #ffffffde;
}
div.refresh-btn {
@@ -527,4 +528,10 @@
  color: var(--font-color);
  font-size: 16px;
  padding: 0px 4px;
}
.text-clz {
  /* background-color: aliceblue; */
  font-size: 14px;
  line-height: 16px;
}
src/components.d.ts
@@ -11,6 +11,7 @@
    BaseMap: typeof import('./components/map/BaseMap.vue')['default']
    CardButton: typeof import('./components/CardButton.vue')['default']
    CardDialog: typeof import('./components/CardDialog.vue')['default']
    copy: typeof import('./components/search/OptionType copy.vue')['default']
    CoreHeader: typeof import('./components/core/CoreHeader.vue')['default']
    CoreMenu: typeof import('./components/core/CoreMenu.vue')['default']
    DataSummary: typeof import('./components/monitor/DataSummary.vue')['default']
@@ -57,11 +58,13 @@
    MissionImport: typeof import('./components/mission/MissionImport.vue')['default']
    MissionManage: typeof import('./components/mission/MissionManage.vue')['default']
    OptionDevice: typeof import('./components/search/OptionDevice.vue')['default']
    'OptionDevice copy': typeof import('./components/search/OptionDevice copy.vue')['default']
    OptionLocation: typeof import('./components/search/OptionLocation.vue')['default']
    OptionLocation2: typeof import('./components/search/OptionLocation2.vue')['default']
    OptionMission: typeof import('./components/search/OptionMission.vue')['default']
    OptionTime: typeof import('./components/search/OptionTime.vue')['default']
    OptionType: typeof import('./components/search/OptionType.vue')['default']
    'OptionType copy': typeof import('./components/search/OptionType copy.vue')['default']
    ProgressLineChart: typeof import('./components/chart/ProgressLineChart.vue')['default']
    RealTimeLineChart: typeof import('./components/chart/RealTimeLineChart.vue')['default']
    RouterLink: typeof import('vue-router')['RouterLink']
src/components/SliderBar.vue
@@ -1,6 +1,7 @@
<template>
  <el-row justify="center" align="middle" class="wrap">
    <el-form-item label="数据量">
    <!-- <el-col :span="6"> -->
    <el-form-item label="展示数据量">
      <el-select
        v-model="pageSize"
        @change="handleSizeChange"
@@ -12,9 +13,12 @@
        <el-option label="500" :value="500" />
      </el-select>
    </el-form-item>
    <!-- </el-col> -->
    <!-- <el-col :span="18"> -->
    <div class="slider-wrap m-l-16">
      <el-slider :model-value="progress" :marks="marks" @input="handleInput" />
    </div>
    <!-- </el-col> -->
  </el-row>
</template>
<script>
@@ -62,6 +66,10 @@
  height: 60px;
}
.slider-wrap {
  min-width: 400px;
  /* background-color: aliceblue; */
  min-width: 290px;
}
.el-form-item {
  margin-bottom: 0px;
}
</style>
src/components/animation/HistoricalTrajectory.vue
@@ -2,28 +2,28 @@
  <BaseCard size="middle-s" direction="up">
    <template #content>
      <el-row align="middle" style="gap: 6px">
        <div>历史轨迹</div>
        <div class="map-btn-group">
          <font-awesome-icon
            :icon="btnStop.icon"
            :class="'btn-search m-r-2 ' + btnStop.clz"
            @click="handleStop"
          />
          <font-awesome-icon
            :icon="btnPlay.icon"
            class="btn-search"
            @click="handlePlayOrPause"
          />
        </div>
        <div class="label-date margin-left-2">
          <span class="label-date-title">倍速</span>
        <el-form-item label="历史轨迹">
          <div class="map-btn-group">
            <font-awesome-icon
              :icon="btnStop.icon"
              :class="'btn-search m-r-2 ' + btnStop.clz"
              @click="handleStop"
            />
            <font-awesome-icon
              :icon="btnPlay.icon"
              class="btn-search"
              @click="handlePlayOrPause"
            />
          </div>
        </el-form-item>
        <el-form-item label="倍速">
          <el-select v-model="speed" size="small" class="w-60">
            <el-option label="1.0X" :value="1" />
            <el-option label="4.0X" :value="4" />
            <el-option label="8.0X" :value="8" />
            <el-option label="16X" :value="16" />
          </el-select>
        </div>
        </el-form-item>
      </el-row>
    </template>
  </BaseCard>
@@ -140,4 +140,8 @@
.btn-disable {
  color: gray;
}
.el-form-item {
  margin-bottom: 0px;
}
</style>
src/components/map/MapScene.vue
@@ -28,6 +28,7 @@
          v-for="item in options"
          :key="item.label"
          :value="item.value"
          :disabled="item.disabled"
          >{{ item.label }}</el-checkbox
        >
      </div>
src/components/map/MapToolbox.vue
@@ -72,25 +72,25 @@
            this.value = !this.value;
            toolbox.toggleCoorPicking(this.value);
          }
        },
        {
          icon: 'fa fa-compass',
          label: '数据标记',
          value: true,
          click: function () {
            this.value = !this.value;
            // todo æ•°æ®æ ‡è®°
          }
        },
        {
          icon: 'fa fa-compass',
          label: '数据弹框',
          value: true,
          click: function () {
            this.value = !this.value;
            // todo æ•°æ®å¼¹æ¡†
          }
        }
        // {
        //   icon: 'fa fa-compass',
        //   label: '数据标记',
        //   value: true,
        //   click: function () {
        //     this.value = !this.value;
        //     // todo æ•°æ®æ ‡è®°
        //   }
        // },
        // {
        //   icon: 'fa fa-compass',
        //   label: '数据弹框',
        //   value: true,
        //   click: function () {
        //     this.value = !this.value;
        //     // todo æ•°æ®å¼¹æ¡†
        //   }
        // }
      ]
    };
  },
src/components/mission/MIssionCreate.vue
@@ -33,14 +33,6 @@
        />
      </el-form-item>
      <OptionType v-model="formObj.deviceType"></OptionType>
      <!-- <el-form-item label="设备编号" prop="acountname">
        <el-input
          size="small"
          clearable
          v-model="formObj.deviceCode"
          placeholder="设备编号"
        />
      </el-form-item> -->
      <OptionDevice
        :type="formObj.deviceType"
        v-model="formObj.deviceCode"
@@ -60,6 +52,7 @@
  </CardDialog>
</template>
<script setup>
import moment from 'moment';
import { ref, reactive, computed } from 'vue';
import missionApi from '@/api/missionApi';
import { useFormConfirm } from '@/composables/formConfirm';
@@ -87,8 +80,23 @@
  timeArray: [
    {
      required: true,
      message: '时间不能为空',
      trigger: 'change'
      // message: '时间不能为空',
      trigger: 'change',
      validator: (rule, value, callback) => {
        console.log(rule);
        console.log(value);
        if (value == null) {
          callback(new Error('时间不能为空'));
        } else {
          const st = moment(value[0]);
          const et = moment(value[1]);
          const range = et.diff(st, 'second');
          if (range > 12 * 60 * 60) {
            callback(new Error('任务时长最多为12小时'));
          }
        }
        callback();
      }
    }
  ]
});
@@ -121,4 +129,20 @@
    }
  }
});
if (import.meta.env.VITE_DATA_MODE == 'jingan') {
  formObj.value.location = {
    pCode: '31',
    pName: '上海市',
    cCode: '3100',
    cName: '上海市',
    dCode: '310106',
    dName: '静安区'
  };
}
</script>
<style scoped>
/* .el-form-item {
  margin-bottom: 0px;
} */
</style>
src/components/mission/MissionManage.vue
@@ -41,7 +41,7 @@
            align="center"
            :formatter="timeFormatter"
          />
          <el-table-column label="管理" width="70" align="center">
          <el-table-column label="管理" width="140" align="center">
            <template #default="{ row }">
              <el-button
                type="primary"
@@ -49,6 +49,14 @@
                class="el-button-custom"
                @click="deleteMission(row)"
                >删除</el-button
              >
              <el-button
                :loading="row.downloadLoading"
                type="primary"
                size="small"
                class="el-button-custom"
                @click="downloadReport(row)"
                >报告</el-button
              >
            </template>
          </el-table-column>
@@ -61,16 +69,16 @@
              </el-button> -->
          <MissionCreate></MissionCreate>
        </div>
        <div>
        <!-- <div>
          <el-button type="primary" class="el-button-custom">
            æ•°æ®å¯¼å…¥
          </el-button>
        </div>
        <div>
        </div> -->
        <!-- <div>
          <el-button type="primary" class="el-button-custom">
            ä¸‹è½½æ¨¡æ¿
          </el-button>
        </div>
        </div> -->
      </el-col>
    </el-row>
  </CardDialog>
@@ -84,6 +92,7 @@
</template>
<script>
import moment from 'moment';
import missionApi from '@/api/missionApi';
import { mapStores } from 'pinia';
import { useMissionStore } from '@/stores/mission';
import { useFetchData } from '@/composables/fetchData';
@@ -111,6 +120,12 @@
      };
      this.msgBoxVisible = true;
    },
    downloadReport(row) {
      row.downloadLoading = true;
      missionApi
        .downloadReport(row.missionCode)
        .finally(() => (row.downloadLoading = false));
    },
    timeFormatter(row, col, cellValue, index) {
      return moment(cellValue).format('YYYY-MM-DD HH:mm:ss');
    }
src/components/monitor/DataSummary.vue
@@ -70,12 +70,14 @@
            total += v.factorData;
            count++;
          });
          let _avg = count == 0 ? 0 : Math.round((total / count) * 100) / 100;
          if (isNaN(_avg)) _avg = '-';
          list.push({
            factorId: f.factorId,
            factor: factorName[f.factorName],
            min,
            max,
            avg: count == 0 ? 0 : Math.round((total / count) * 100) / 100
            avg: _avg
          });
        }
      }
src/components/monitor/DataTable.vue
@@ -65,6 +65,7 @@
import { FactorDatas } from '@/model/FactorDatas';
import { checkboxOptions } from '@/constant/checkbox-options';
import { TYPE0 } from '@/constant/device-type';
import { windDir } from '@/constant/wind-dir';
export default {
  props: {
@@ -112,13 +113,18 @@
        if (Object.hasOwnProperty.call(this.factorDatas.factor, key)) {
          const f = this.factorDatas.factor[key];
          f.datas.forEach((v, i) => {
            const name = f.factorName;
            let value = v.factorData;
            if (name == 'WIND_DIRECTION') {
              value = windDir(value);
            }
            if (list.length <= i) {
              list.push({
                index: i,
                [f.factorName]: v.factorData
                [name]: value
              });
            } else {
              list[i][f.factorName] = v.factorData;
              list[i][name] = value;
            }
          });
        }
@@ -164,7 +170,8 @@
.el-table {
  --el-table-bg-color: transparent;
  --el-table-row-hover-bg-color: #23dad0a2;
  --el-table-current-row-bg-color: #7dff5d96;
  --el-table-current-row-bg-color: #23dad0a2;
  /* --el-table-current-row-bg-color: #7dff5d96; */
  --el-table-text-color: var(--font-color);
}
src/components/monitor/FactorCheckbox.vue
@@ -63,9 +63,7 @@
  },
  emits: ['update:modelValue'],
  data() {
    return {
      checkbox: [checkboxOptions(TYPE0)[0].value]
    };
    return {};
  },
  computed: {
    options() {
@@ -81,7 +79,7 @@
          const e = array[i];
          res.push(e.value);
        }
        this.$emit('update:modelValue', res);
        this.handleChange(res);
      }
    }
  },
@@ -95,10 +93,23 @@
<style scoped>
.el-checkbox {
  --el-checkbox-text-color: white;
  --main-color: #23dad1;
  --el-checkbox-checked-text-color: var(--main-color);
  --el-checkbox-checked-input-border-color: var(--main-color);
  --el-checkbox-checked-bg-color: var(--main-color);
  --el-checkbox-input-border-color-hover: var(--main-color);
  --el-checkbox-disabled-checked-input-fill: var(--main-color);
  --el-checkbox-disabled-checked-input-border-color: var(--main-color);
  --el-checkbox-disabled-checked-icon-color: white;
  margin-right: 6px;
  /* height: initial; */
}
.el-checkbox__input.is-disabled + span.el-checkbox__label {
  color: var(--el-color-primary);
}
.vertical-class {
  display: flex;
  flex-direction: column;
src/components/monitor/FactorRadio.vue
@@ -52,6 +52,7 @@
<style scoped>
.el-radio {
  --el-radio-text-color: white;
  --el-color-primary: #23dad1;
  margin-right: 10px;
  height: initial;
}
src/components/monitor/FactorTrend.vue
@@ -2,18 +2,6 @@
  <BaseCard size="medium" direction="left">
    <template #content>
      <el-scrollbar height="calc(98vh - var(--bevel-length-2))">
        <!-- <div v-for="item in factorTypes" :key="item">
          <el-row>
            <div>{{ allSeries.get(item.value).name }}</div>
            <div>{{ allSeries.get(item.value).currentData }}</div>
            <div>{{ allSeries.get(item.value).min }}</div>
            <div>{{ allSeries.get(item.value).max }}</div>
            <RealTimeLineChart
              v-show="selectFactorType.includes(item.value)"
              :model-value="series(item.value)"
            ></RealTimeLineChart>
          </el-row>
        </div> -->
        <div v-for="item in seriesList" :key="item.key">
          <el-row
            v-show="selectFactorType.includes(item.series.key)"
@@ -74,18 +62,8 @@
    };
  },
  computed: {
    factorTypes() {
      return checkboxOptions(this.deviceType);
    }
    // seriesList() {
    //   const list = [];
    //   for (const iterator of this.allSeries) {
    //     list.push({
    //       xAxis: this.xAxis,
    //       series: iterator[1]
    //     });
    //   }
    //   return list;
    // factorTypes() {
    //   return checkboxOptions(this.deviceType);
    // }
  },
  watch: {
@@ -165,12 +143,20 @@
    },
    toList() {
      const list = [];
      for (const iterator of this.allSeries) {
        list.push({
          xAxis: this.xAxis,
          series: iterator[1]
        });
      }
      // for (const iterator of this.allSeries) {
      //   list.push({
      //     xAxis: this.xAxis,
      //     series: iterator[1]
      //   });
      // }
      checkboxOptions(this.deviceType).forEach((t) => {
        if (this.allSeries.has(t.value)) {
          list.push({
            xAxis: this.xAxis,
            series: this.allSeries.get(t.value)
          });
        }
      });
      this.seriesList = list;
    },
    // getScaleValue(label, value) {
@@ -199,7 +185,7 @@
}
.factor-name {
  color: var(--el-color-warning);
  color: #23dad1;
}
.factor-unit {
src/components/monitor/WeatherData.vue
@@ -26,7 +26,7 @@
</template>
<script>
import { FactorDatas } from '@/model/FactorDatas';
import { windDir } from '../../constant/wind-dir';
import { windDir } from '@/constant/wind-dir';
export default {
  props: {
src/components/search/OptionDevice copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
<template>
  <el-form-item label="设备">
    <el-select
      :model-value="modelValue"
      @update:model-value="handleChange"
      placeholder="设备"
      size="small"
      class="w-120"
    >
      <el-option
        v-for="(s, i) in deviceList"
        :key="i"
        :label="s.label"
        :value="s.value"
      />
    </el-select>
  </el-form-item>
</template>
<script>
export default {
  props: {
    type: String,
    modelValue: String
  },
  emits: ['update:modelValue'],
  data() {
    return {};
  },
  computed: {
    deviceList() {
      const t = this.type ? this.type : '0a';
      return [1, 2, 3].map((v) => {
        const label = `${this.getDeviceType(t)}设备${v}号`;
        const value = `${t}000000000${v}`;
        return {
          label: label,
          value: value
        };
      });
    }
  },
  watch: {
    deviceList(nV, oV) {
      if (nV != oV) {
        this.handleChange(nV[0].value);
      }
    }
  },
  methods: {
    handleChange(value) {
      this.$emit('update:modelValue', value);
    },
    getDeviceType(t) {
      switch (t) {
        case '0a':
          return '车载';
        case '0b':
          return '无人机';
        case '0c':
          return '无人船';
        default:
          return '车载';
      }
    }
  },
  mounted() {
    this.handleChange(this.deviceList[0].value);
  }
};
</script>
<style scoped></style>
src/components/search/OptionDevice.vue
@@ -8,7 +8,7 @@
      class="w-120"
    >
      <el-option
        v-for="(s, i) in deviceList"
        v-for="(s, i) in deviceOptions"
        :key="i"
        :label="s.label"
        :value="s.value"
@@ -18,6 +18,8 @@
</template>
<script>
import { deviceList } from '@/constant/device-type';
export default {
  props: {
    type: String,
@@ -28,20 +30,12 @@
    return {};
  },
  computed: {
    deviceList() {
      const t = this.type ? this.type : '0a';
      return [1, 2, 3].map((v) => {
        const label = `${this.getDeviceType(t)}设备${v}号`;
        const value = `${t}000000000${v}`;
        return {
          label: label,
          value: value
        };
      });
    deviceOptions() {
      return deviceList(this.type);
    }
  },
  watch: {
    deviceList(nV, oV) {
    deviceOptions(nV, oV) {
      if (nV != oV) {
        this.handleChange(nV[0].value);
      }
@@ -50,22 +44,10 @@
  methods: {
    handleChange(value) {
      this.$emit('update:modelValue', value);
    },
    getDeviceType(t) {
      switch (t) {
        case '0a':
          return '车载';
        case '0b':
          return '无人机';
        case '0c':
          return '无人船';
        default:
          return '车载';
      }
    }
  },
  mounted() {
    this.handleChange(this.deviceList[0].value);
    this.handleChange(this.deviceOptions[0].value);
  }
};
</script>
src/components/search/OptionLocation.vue
@@ -25,12 +25,7 @@
  emits: ['update:modelValue'],
  data() {
    return {
      typeList: [
        {
          label: '长宁区',
          value: '310105'
        }
      ]
      typeList: []
    };
  },
  methods: {
@@ -40,6 +35,22 @@
    }
  },
  mounted() {
    let options = [
      {
        label: '长宁区',
        value: '310105'
      }
    ];
    if (import.meta.env.VITE_DATA_MODE == 'jingan') {
      options = [
        {
          label: '静安区',
          value: '310106'
        }
      ];
    }
    this.typeList = options;
    this.handleChange(this.typeList[0].value);
  }
};
src/components/search/OptionMission.vue
@@ -19,7 +19,6 @@
<script>
import { mapStores } from 'pinia';
import missionApi from '@/api/missionApi';
import { useFetchData } from '@/composables/fetchData';
import { useMissionStore } from '@/stores/mission';
@@ -43,23 +42,15 @@
  },
  methods: {
    fetchMission() {
      // this.fetchData((page, pageSize) => {
      //   return missionApi
      //     .fethchMission({ type: this.type, page, pageSize })
      //     .then((res) => {
      //       this.missionList = res.data;
      //       this.missionStore.missionList = res.data;
      //       // if (this.missionList.length > 0) {
      //       //   this.handleChange(0);
      //       // }
      //       return res.head;
      //     });
      // });
      this.missionStore.fetchMission(this.type);
      this.missionStore.fetchMission(this.type).then((res) => {
        if (res.success && res.data.length > 0) {
          this.index = 0;
          this.handleChange(0);
        }
      });
    },
    handleChange(value) {
      this.$emit('update:modelValue', this.missionStore.missionList[value]);
      // this.$emit('change', this.missionList[value]);
    }
  },
  mounted() {
src/components/search/OptionTime.vue
@@ -7,20 +7,30 @@
      start-placeholder="选择开始时间"
      end-placeholder="选择结束时间"
      size="small"
      :disabled-date="diableData"
    />
  </el-form-item>
</template>
<script>
import moment from 'moment';
import { ElMessage } from 'element-plus';
export default {
  props: {
    // æ—¥æœŸå€¼
    modelValue: {
      type: Array
    },
    // æŽ§ä»¶ç±»åž‹
    type: {
      type: String,
      default: 'datetimerange'
    }
    },
    // å…è®¸å¼€å§‹æ—¶é—´
    startDate: Date,
    // å…è®¸ç»“束时间
    endDate: Date
  },
  emits: ['update:modelValue'],
  data() {
@@ -28,7 +38,40 @@
  },
  methods: {
    handleChange(value) {
      this.$emit('update:modelValue', value);
      // æ—¶é—´ä¸èƒ½è¶…过设定的开始结束时间
      let outRange = false;
      if (this.startDate) {
        outRange =
          outRange ||
          moment(value[0]).isBefore(this.startDate) ||
          moment(value[1]).isBefore(this.startDate);
      }
      if (this.endDate) {
        outRange =
          outRange ||
          moment(value[0]).isAfter(this.endDate) ||
          moment(value[1]).isAfter(this.endDate);
      }
      if (outRange) {
        ElMessage({
          message: '所选时间不能超过走航任务时间范围',
          type: 'warning'
        });
      } else {
        this.$emit('update:modelValue', value);
      }
    },
    diableData(date) {
      const time = moment(date);
      let result1 = false;
      let result2 = false;
      if (this.startDate) {
        result1 = time.isBefore(this.startDate);
      }
      if (this.endDate) {
        result2 = time.isAfter(this.endDate);
      }
      return result1 || result2;
    }
  },
  mounted() {
src/components/search/OptionType copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
<template>
  <el-form-item label="类型">
    <el-select
      :model-value="modelValue"
      @update:model-value="handleChange"
      placeholder="类型"
      size="small"
      class="w-80"
    >
      <el-option
        v-for="(s, i) in typeList"
        :key="i"
        :label="s.label"
        :value="s.value"
      />
    </el-select>
  </el-form-item>
</template>
<script>
export default {
  props: {
    modelValue: String
  },
  emits: ['update:modelValue'],
  data() {
    return {
      typeList: [
        {
          label: '车载',
          value: '0a'
        },
        {
          label: '无人机',
          value: '0b'
        },
        {
          label: '无人船',
          value: '0c'
        }
      ]
    };
  },
  methods: {
    handleChange(value) {
      // todo æ ¹æ®è®¾å¤‡ç±»åž‹åˆ‡æ¢åœ°å›¾è½½å…·çš„图标、
      this.$emit('update:modelValue', value);
    }
  },
  mounted() {
    this.handleChange(this.typeList[0].value);
  }
};
</script>
src/components/search/OptionType.vue
@@ -1,5 +1,5 @@
<template>
  <el-form-item label="类型">
  <el-form-item v-show="isShow" label="类型">
    <el-select
      :model-value="modelValue"
      @update:model-value="handleChange"
@@ -18,6 +18,7 @@
</template>
<script>
import { typeList } from '@/constant/device-type';
export default {
  props: {
    modelValue: String
@@ -25,20 +26,8 @@
  emits: ['update:modelValue'],
  data() {
    return {
      typeList: [
        {
          label: '车载',
          value: '0a'
        },
        {
          label: '无人机',
          value: '0b'
        },
        {
          label: '无人船',
          value: '0c'
        }
      ]
      typeList: typeList(),
      isShow: import.meta.env.VITE_DATA_MODE != 'jingan'
    };
  },
  methods: {
src/components/search/SearchBar.vue
@@ -8,7 +8,11 @@
          :type="formSearch.type"
          v-model="formSearch.deviceCode"
        ></OptionDevice>
        <OptionTime v-model="formSearch.timeArray"></OptionTime>
        <OptionTime
          v-model="formSearch.timeArray"
          :start-date="dateRange[0]"
          :end-date="dateRange[1]"
        ></OptionTime>
        <el-button
          :loading="loading"
          type="primary"
@@ -31,12 +35,14 @@
  },
  data() {
    return {
      mission: {},
      mission: undefined,
      formSearch: {
        type: '',
        deviceCode: '',
        timeArray: []
      }
      },
      // å¯é€‰æ—¥æœŸèŒƒå›´ï¼Œæ ¹æ®èµ°èˆªä»»åŠ¡å†³å®š
      dateRange: []
    };
  },
  emits: ['search'],
@@ -52,8 +58,16 @@
          new Date(nV.startTime),
          new Date(nV.endTime)
        ];
        this.dateRange = [new Date(nV.startTime), new Date(nV.endTime)];
        this.formSearch.type = nV.deviceType;
        this.formSearch.deviceCode = nV.deviceCode;
        // ä»£è¡¨é¦–次进入界面,此时自动执行首个任务的数据查询操作
        if (oV == undefined) {
          setTimeout(() => {
            this.handleClick();
          }, 500);
        }
      }
    }
  },
@@ -64,7 +78,7 @@
  }
};
</script>
<style lang="scss">
<style scoped lang="scss">
.map-date-selector {
  display: inline-block;
  position: relative;
@@ -78,4 +92,9 @@
.p-events-auto {
}
.el-form-item {
  margin-bottom: 0px;
  margin-right: 8px !important;
}
</style>
src/composables/fetchData.js
@@ -37,6 +37,7 @@
        }
        loadStatus.value = 0;
        return pageInfo;
      })
      .catch(() => {
        loadStatus.value = 3;
src/constant/checkbox-options.js
@@ -1,186 +1,50 @@
import { TYPE0, TYPE1, TYPE2, TYPE4 } from '@/constant/device-type';
import {
  option1,
  option2,
  option3,
  option4
} from '@/constant/checkbox-options/options';
import { option1 as option1Jingan } from '@/constant/checkbox-options/options-jingan';
// ç›‘测因子单选框选项
function checkboxOptions(deviceType) {
  switch (deviceType) {
    case TYPE0:
      return option1;
    case TYPE1:
      return option3;
    case TYPE2:
      return option2;
    case TYPE4:
      return option4;
    default:
      return option1;
  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
    switch (deviceType) {
      case TYPE0:
        return option1Jingan;
      default:
        return option1Jingan;
    }
  } else {
    switch (deviceType) {
      case TYPE0:
        return option1;
      case TYPE1:
        return option3;
      case TYPE2:
        return option2;
      case TYPE4:
        return option4;
      default:
        return option1;
    }
  }
}
const option1 = [
  {
    label: 'NO2',
    name: 'NO2',
    value: '1'
  },
  {
    label: 'CO',
    name: 'CO',
    value: '2'
  },
  {
    label: 'H2S',
    name: 'H2S',
    value: '3'
  },
  {
    label: 'SO2',
    name: 'SO2',
    value: '4'
  },
  {
    label: 'O3',
    name: 'O3',
    value: '5'
  },
  {
    label: 'PM2.5',
    name: 'PM25',
    value: '6'
  },
  {
    label: 'PM10',
    name: 'PM10',
    value: '7'
  },
  {
    label: 'TVOC',
    name: 'VOC',
    value: '10'
  },
  // {
  //     label: "NOI",
  //     name: "NOI",
  //     value: "11"
  // },
  {
    label: '车速',
    name: 'VELOCITY',
    value: '14'
  },
  {
    label: '风速',
    name: 'WIND_SPEED',
    value: '16'
  },
  {
    label: '风向',
    name: 'WIND_DIRECTION',
    value: '17'
  },
  {
    label: '高度',
    name: 'HEIGHT',
    value: '18'
/**
 * é»˜è®¤é€‰é¡¹
 * @param {*} deviceType è®¾å¤‡ç±»åž‹
 * @param {*} count é»˜è®¤é€‰ä¸­ä¸ªæ•°
 * @returns
 */
function defaultFactorTypes(deviceType, count = 3) {
  const list = checkboxOptions(deviceType);
  if (list.length > count) {
    return list.slice(0, count).map((v) => v.value);
  } else {
    return list.map((v) => v.value);
  }
];
}
const option2 = [
  {
    label: '温度',
    name: 'TMP',
    value: '1'
  },
  {
    label: '电导率',
    name: 'spC',
    value: '2'
  },
  {
    label: '浊度',
    name: 'tur',
    value: '3'
  },
  {
    label: '溶解氧',
    name: 'DO',
    value: '4'
  },
  {
    label: 'PH',
    name: 'PH',
    value: '5'
  }
];
const option3 = [
  {
    label: 'NO2',
    name: 'NO2',
    value: '1'
  },
  {
    label: 'CO',
    name: 'CO',
    value: '2'
  },
  {
    label: 'H2S',
    name: 'H2S',
    value: '3'
  },
  {
    label: 'SO2',
    name: 'SO2',
    value: '4'
  },
  {
    label: 'O3',
    name: 'O3',
    value: '5'
  },
  {
    label: 'PM2.5',
    name: 'PM25',
    value: '6'
  },
  {
    label: 'PM10',
    name: 'PM10',
    value: '7'
  },
  {
    label: 'TVOC',
    name: 'VOC',
    value: '10'
  },
  {
    label: '风速',
    name: 'WIND_SPEED',
    value: '16'
  },
  {
    label: '风向',
    name: 'WIND_DIRECTION',
    value: '17'
  }
];
const option4 = [
  {
    label: 'A相电流',
    name: 'EA',
    value: '1'
  },
  {
    label: 'B相电流',
    name: 'EB',
    value: '2'
  },
  {
    label: 'C相电流',
    name: 'EC',
    value: '3'
  }
];
export { checkboxOptions };
export { checkboxOptions, defaultFactorTypes };
src/constant/checkbox-options/options-jingan.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
/**
 * ä¸Šæµ·å¸‚静安区专有系统图表显示因子切换选项
 */
export const option1 = [
  {
    label: 'NO',
    name: 'NO',
    value: '19'
  },
  {
    label: 'NO2',
    name: 'NO2',
    value: '1'
  },
  {
    label: 'CO',
    name: 'CO',
    value: '2'
  },
  {
    label: 'PM2.5',
    name: 'PM25',
    value: '6'
  },
  {
    label: 'PM10',
    name: 'PM10',
    value: '7'
  },
  {
    label: '温度',
    name: 'TEMPERATURE',
    value: '8'
  },
  {
    label: '车速',
    name: 'VELOCITY',
    value: '14'
  },
  {
    label: '风速',
    name: 'WIND_SPEED',
    value: '16'
  }
  // {
  //   label: '风向',
  //   name: 'WIND_DIRECTION',
  //   value: '17'
  // }
];
src/constant/checkbox-options/options.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
/**
 * åŽŸå§‹ç³»ç»Ÿå›¾è¡¨æ˜¾ç¤ºå› å­åˆ‡æ¢é€‰é¡¹
 */
const option1 = [
  {
    label: 'NO2',
    name: 'NO2',
    value: '1'
  },
  {
    label: 'CO',
    name: 'CO',
    value: '2'
  },
  {
    label: 'H2S',
    name: 'H2S',
    value: '3'
  },
  {
    label: 'SO2',
    name: 'SO2',
    value: '4'
  },
  {
    label: 'O3',
    name: 'O3',
    value: '5'
  },
  {
    label: 'PM2.5',
    name: 'PM25',
    value: '6'
  },
  {
    label: 'PM10',
    name: 'PM10',
    value: '7'
  },
  {
    label: 'TVOC',
    name: 'VOC',
    value: '10'
  },
  // {
  //     label: "NOI",
  //     name: "NOI",
  //     value: "11"
  // },
  {
    label: '车速',
    name: 'VELOCITY',
    value: '14'
  },
  {
    label: '风速',
    name: 'WIND_SPEED',
    value: '16'
  },
  // {
  //   label: '风向',
  //   name: 'WIND_DIRECTION',
  //   value: '17'
  // },
  {
    label: '高度',
    name: 'HEIGHT',
    value: '18'
  }
];
const option2 = [
  {
    label: '温度',
    name: 'TMP',
    value: '1'
  },
  {
    label: '电导率',
    name: 'spC',
    value: '2'
  },
  {
    label: '浊度',
    name: 'tur',
    value: '3'
  },
  {
    label: '溶解氧',
    name: 'DO',
    value: '4'
  },
  {
    label: 'PH',
    name: 'PH',
    value: '5'
  }
];
const option3 = [
  {
    label: 'NO2',
    name: 'NO2',
    value: '1'
  },
  {
    label: 'CO',
    name: 'CO',
    value: '2'
  },
  {
    label: 'H2S',
    name: 'H2S',
    value: '3'
  },
  {
    label: 'SO2',
    name: 'SO2',
    value: '4'
  },
  {
    label: 'O3',
    name: 'O3',
    value: '5'
  },
  {
    label: 'PM2.5',
    name: 'PM25',
    value: '6'
  },
  {
    label: 'PM10',
    name: 'PM10',
    value: '7'
  },
  {
    label: 'TVOC',
    name: 'VOC',
    value: '10'
  },
  {
    label: '风速',
    name: 'WIND_SPEED',
    value: '16'
  }
  // {
  //   label: '风向',
  //   name: 'WIND_DIRECTION',
  //   value: '17'
  // }
];
const option4 = [
  {
    label: 'A相电流',
    name: 'EA',
    value: '1'
  },
  {
    label: 'B相电流',
    name: 'EB',
    value: '2'
  },
  {
    label: 'C相电流',
    name: 'EC',
    value: '3'
  }
];
export { option1, option2, option3, option4 };
src/constant/device-type.js
@@ -9,4 +9,56 @@
// ç”¨ç”µé‡
const TYPE4 = '31';
export { TYPE0, TYPE1, TYPE2, TYPE3, TYPE4 };
function typeList() {
  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
    return [
      {
        label: '车载',
        value: '0a'
      }
    ];
  } else {
    return [
      {
        label: '车载',
        value: '0a'
      },
      {
        label: '无人机',
        value: '0b'
      },
      {
        label: '无人船',
        value: '0c'
      }
    ];
  }
}
// fixeme 2024.8.19 åŽç»­è®¾å¤‡ç¼–号应该从服务器动态获取,同时有设备号的在线编辑功能
function deviceList(type) {
  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
    return [
      {
        label: '车载设备1号',
        value: 'TX105'
      }
    ];
  } else {
    const t = type ? type : '0a';
    const _typeList = typeList();
    const typeStr = _typeList.find((v) => {
      return v.value == t;
    });
    return [1, 2, 3].map((v) => {
      const label = `${typeStr}设备${v}号`;
      const value = `${t}000000000${v}`;
      return {
        label: label,
        value: value
      };
    });
  }
}
export { TYPE0, TYPE1, TYPE2, TYPE3, TYPE4, typeList, deviceList };
src/constant/factor-name.js
@@ -2,6 +2,7 @@
 * ç›‘测因子名称
 */
export const factorName = {
  NO: 'NO',
  NO2: 'NO2', //2
  CO: 'CO', //4
  H2S: 'H2S', //6
src/constant/factor-unit.js
@@ -2,6 +2,10 @@
 * ç›‘测因子单位
 */
export const factorUnit = {
  NO: {
    scale: 1,
    unit: 'μg/m³'
  },
  NO2: {
    scale: 1,
    unit: 'μg/m³'
src/constant/radio-options.js
@@ -1,84 +1,94 @@
import { TYPE0, TYPE1, TYPE2 } from '@/constant/device-type';
import { option1, option2 } from '@/constant/radio-options/options';
import { option1 as option1Jingan } from '@/constant/radio-options/options-jingan';
// ç›‘测因子单选框选项
function radioOptions(deviceType) {
  if ([TYPE0, TYPE1].includes(deviceType)) {
    return option1;
  } else if (deviceType == TYPE2) {
    return option2;
  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
    if (TYPE0 == deviceType) {
      return option1Jingan;
    } else {
      return [];
    }
  } else {
    return [];
    if ([TYPE0, TYPE1].includes(deviceType)) {
      return option1;
    } else if (deviceType == TYPE2) {
      return option2;
    } else {
      return [];
    }
  }
}
const option1 = [
  {
    label: 'NO2',
    name: 'NO2',
    value: '1'
  },
  {
    label: 'CO',
    name: 'CO',
    value: '2'
  },
  {
    label: 'H2S',
    name: 'H2S',
    value: '3'
  },
  {
    label: 'SO2',
    name: 'SO2',
    value: '4'
  },
  {
    label: 'O3',
    name: 'O3',
    value: '5'
  },
  {
    label: 'PM2.5',
    name: 'PM25',
    value: '6'
  },
  {
    label: 'PM10',
    name: 'PM10',
    value: '7'
  },
  {
    label: 'TVOC',
    name: 'VOC',
    value: '10'
  }
];
// const option1 = [
//   {
//     label: 'NO2',
//     name: 'NO2',
//     value: '1'
//   },
//   {
//     label: 'CO',
//     name: 'CO',
//     value: '2'
//   },
//   {
//     label: 'H2S',
//     name: 'H2S',
//     value: '3'
//   },
//   {
//     label: 'SO2',
//     name: 'SO2',
//     value: '4'
//   },
//   {
//     label: 'O3',
//     name: 'O3',
//     value: '5'
//   },
//   {
//     label: 'PM2.5',
//     name: 'PM25',
//     value: '6'
//   },
//   {
//     label: 'PM10',
//     name: 'PM10',
//     value: '7'
//   },
//   {
//     label: 'TVOC',
//     name: 'VOC',
//     value: '10'
//   }
// ];
const option2 = [
  {
    label: '温度',
    name: 'TMP',
    value: '1'
  },
  {
    label: '电导率',
    name: 'spC',
    value: '2'
  },
  {
    label: '浊度',
    name: 'tur',
    value: '3'
  },
  {
    label: '溶解氧',
    name: 'DO',
    value: '4'
  },
  {
    label: 'PH',
    name: 'PH',
    value: '5'
  }
];
// const option2 = [
//   {
//     label: '温度',
//     name: 'TMP',
//     value: '1'
//   },
//   {
//     label: '电导率',
//     name: 'spC',
//     value: '2'
//   },
//   {
//     label: '浊度',
//     name: 'tur',
//     value: '3'
//   },
//   {
//     label: '溶解氧',
//     name: 'DO',
//     value: '4'
//   },
//   {
//     label: 'PH',
//     name: 'PH',
//     value: '5'
//   }
// ];
export { radioOptions };
src/constant/radio-options/options-jingan.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
/**
 * ä¸Šæµ·å¸‚静安区专有系统地图显示因子切换选项
 */
export const option1 = [
  {
    label: 'NO',
    name: 'NO',
    value: '19'
  },
  {
    label: 'NO2',
    name: 'NO2',
    value: '1'
  },
  {
    label: 'CO',
    name: 'CO',
    value: '2'
  },
  {
    label: 'PM2.5',
    name: 'PM25',
    value: '6'
  },
  {
    label: 'PM10',
    name: 'PM10',
    value: '7'
  }
];
src/constant/radio-options/options.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
/**
 * åŽŸå§‹ç³»ç»Ÿåœ°å›¾æ˜¾ç¤ºå› å­åˆ‡æ¢é€‰é¡¹
 */
export const option1 = [
  {
    label: 'NO2',
    name: 'NO2',
    value: '1'
  },
  {
    label: 'CO',
    name: 'CO',
    value: '2'
  },
  {
    label: 'H2S',
    name: 'H2S',
    value: '3'
  },
  {
    label: 'SO2',
    name: 'SO2',
    value: '4'
  },
  {
    label: 'O3',
    name: 'O3',
    value: '5'
  },
  {
    label: 'PM2.5',
    name: 'PM25',
    value: '6'
  },
  {
    label: 'PM10',
    name: 'PM10',
    value: '7'
  },
  {
    label: 'TVOC',
    name: 'VOC',
    value: '10'
  }
];
export const option2 = [
  {
    label: '温度',
    name: 'TMP',
    value: '1'
  },
  {
    label: '电导率',
    name: 'spC',
    value: '2'
  },
  {
    label: '浊度',
    name: 'tur',
    value: '3'
  },
  {
    label: '溶解氧',
    name: 'DO',
    value: '4'
  },
  {
    label: 'PH',
    name: 'PH',
    value: '5'
  }
];
src/constant/scene-types.js
@@ -8,90 +8,15 @@
import scene_18 from '@/assets/mipmap/scene_18.png';
import scene_19 from '@/assets/mipmap/scene_19.png';
import scene_20 from '@/assets/mipmap/scene_20.png';
import { option } from '@/constant/scene-types/options';
import { option as optionJingan } from '@/constant/scene-types/options-jingan';
function sceneTypes() {
  return [
    {
      label: '工地',
      value: '1'
    },
    // {
    //   label: '码头',
    //   value: '2',
    // },
    // {
    //   label: '搅拌站',
    //   value: '3',
    // },
    {
      label: '工业企业',
      value: '4'
    },
    {
      label: '餐饮',
      value: '5'
    },
    {
      label: '汽修',
      value: '6'
    },
    // {
    //   label: '降尘点',
    //   value: '7',
    // },
    // {
    //   label: '空气质量监测点',
    //   value: '8',
    // },
    // {
    //   label: '道路扬尘监测点',
    //   value: '9',
    // },
    // {
    //   label: '道路',
    //   value: '10',
    // },
    // {
    //   label: '河流断面',
    //   value: '11',
    // },
    // {
    //   label: '工业园区',
    //   value: '12',
    // },
    // {
    //   label: '无固定场景',
    //   value: '13',
    // },
    // {
    //   label: '堆场',
    //   value: '14',
    // },
    {
      label: '实验室',
      value: '15'
    },
    {
      label: '精品小区',
      value: '16'
    },
    {
      label: '加油站',
      value: '17'
    },
    {
      label: '商业体',
      value: '18'
    },
    {
      label: '国控点',
      value: '19'
    },
    {
      label: '市控点',
      value: '20'
    }
  ];
  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
    return optionJingan;
  } else {
    return option;
  }
}
function sceneIcon(type) {
src/constant/scene-types/options-jingan.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
/**
 * ä¸Šæµ·å¸‚静安区专有系统地图显示场景类型切换选项
 */
export const option = [
  {
    label: '工地',
    value: '1'
  },
  // {
  //   label: '码头',
  //   value: '2',
  // },
  // {
  //   label: '搅拌站',
  //   value: '3',
  // },
  {
    label: '工业企业',
    value: '4',
    disabled: true
  },
  {
    label: '餐饮',
    value: '5',
    disabled: true
  },
  {
    label: '汽修',
    value: '6',
    disabled: true
  },
  // {
  //   label: '降尘点',
  //   value: '7',
  // },
  // {
  //   label: '空气质量监测点',
  //   value: '8',
  // },
  // {
  //   label: '道路扬尘监测点',
  //   value: '9',
  // },
  // {
  //   label: '道路',
  //   value: '10',
  // },
  // {
  //   label: '河流断面',
  //   value: '11',
  // },
  // {
  //   label: '工业园区',
  //   value: '12',
  // },
  // {
  //   label: '无固定场景',
  //   value: '13',
  // },
  // {
  //   label: '堆场',
  //   value: '14',
  // },
  {
    label: '实验室',
    value: '15',
    disabled: true
  },
  {
    label: '精品小区',
    value: '16',
    disabled: true
  },
  {
    label: '加油站',
    value: '17',
    disabled: true
  },
  {
    label: '商业体',
    value: '18',
    disabled: true
  },
  {
    label: '国控点',
    value: '19'
  },
  {
    label: '市控点',
    value: '20'
  }
];
src/constant/scene-types/options.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
/**
 * åŽŸå§‹ç³»ç»Ÿåœ°å›¾æ˜¾ç¤ºåœºæ™¯ç±»åž‹åˆ‡æ¢é€‰é¡¹
 */
export const option = [
  {
    label: '工地',
    value: '1'
  },
  // {
  //   label: '码头',
  //   value: '2',
  // },
  // {
  //   label: '搅拌站',
  //   value: '3',
  // },
  {
    label: '工业企业',
    value: '4'
  },
  {
    label: '餐饮',
    value: '5'
  },
  {
    label: '汽修',
    value: '6'
  },
  // {
  //   label: '降尘点',
  //   value: '7',
  // },
  // {
  //   label: '空气质量监测点',
  //   value: '8',
  // },
  // {
  //   label: '道路扬尘监测点',
  //   value: '9',
  // },
  // {
  //   label: '道路',
  //   value: '10',
  // },
  // {
  //   label: '河流断面',
  //   value: '11',
  // },
  // {
  //   label: '工业园区',
  //   value: '12',
  // },
  // {
  //   label: '无固定场景',
  //   value: '13',
  // },
  // {
  //   label: '堆场',
  //   value: '14',
  // },
  {
    label: '实验室',
    value: '15'
  },
  {
    label: '精品小区',
    value: '16'
  },
  {
    label: '加油站',
    value: '17'
  },
  {
    label: '商业体',
    value: '18'
  },
  {
    label: '国控点',
    value: '19'
  },
  {
    label: '市控点',
    value: '20'
  }
];
src/lib/jquery.soap.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,792 @@
import $ from 'jquery';
var enableLogging;
var globalConfig = {
  // this setup once, defaults go here
  appendMethodToURL: true,
  async: true,
  enableLogging: false,
  noPrefix: false,
  soap12: false,
  withCredentials: false,
  timeout: 5000
};
function soap(options) {
  var config = {};
  // a configuration call will not have 'data' specified ('params' is used for backwards compatibility)
  if (options && !options.params && !options.data) {
    $.extend(globalConfig, options); // update global config
    enableLogging = options.enableLogging;
    log('jQuery.soap - globalConfig updated:', globalConfig);
    return globalConfig;
  }
  $.extend(config, globalConfig, options);
  // function log will only work below this line!
  enableLogging = config.enableLogging;
  log('jquery.soap - config:', config);
  // fallbacks for changed properties
  SOAPTool.fallbackDeprecated(config);
  var soapObject = SOAPTool.processData({
    data: config.data,
    name: config.elementName ? config.elementName : config.method,
    context: config.context,
    prefix:
      !!config.namespaceQualifier && !config.noPrefix
        ? config.namespaceQualifier + ':'
        : ''
  });
  if (!!config.namespaceQualifier && !!config.namespaceURL) {
    soapObject.addNamespace(config.namespaceQualifier, config.namespaceURL);
  } else if (config.namespaceURL) {
    soapObject.attr('xmlns', config.namespaceURL);
  }
  if (!!soapObject && !!config.url) {
    // we have a request and somewhere to send it
    // Create a SOAPEnvelope with the soapObject
    var soapEnvelope = new SOAPEnvelope(soapObject);
    // Additional attributes and namespaces for the Envelope
    if (config.envAttributes) {
      for (var i in config.envAttributes) {
        soapEnvelope.addAttribute(i, config.envAttributes[i]);
      }
    }
    // SOAPHeader
    if (config.SOAPHeader) {
      var soapHeader = SOAPTool.processData({
        data: config.SOAPHeader,
        name: 'temp',
        prefix: ''
      });
      if (soapHeader) {
        if (soapHeader.hasChildren()) {
          for (var j in soapHeader.children) {
            soapEnvelope.addHeader(soapHeader.children[j]);
          }
        } else {
          soapEnvelope.addHeader(soapHeader);
        }
      }
    }
    // WSS
    if (config.wss) {
      var wssObj = SOAPTool.createWSS(config.wss);
      // add to WSS Security header to soapEnvelope
      if (wssObj) {
        soapEnvelope.addHeader(wssObj);
      }
    }
    // append Method?
    if (!!config.appendMethodToURL && !!config.method) {
      // fixme 2024.8.15 ä¿®æ”¹æ­¤å¤„逻辑,url不再自动添加method作为路径
      // config.url += config.method;
    }
    return soapEnvelope
      .send({
        url: config.url,
        context: config.context,
        timeout: config.timeout,
        async: config.async,
        headers: config.HTTPHeaders ? config.HTTPHeaders : {},
        action: config.SOAPAction ? config.SOAPAction : config.method,
        soap12: config.soap12,
        beforeSend: config.beforeSend,
        statusCode: config.statusCode
      })
      .done(function (data, textStatus, jqXHR) {
        var response = new SOAPResponse(textStatus, jqXHR);
        log('jquery.soap - receive:', response.toString());
        if ($.isFunction(config.success)) {
          config.success.call(this, response);
        }
      })
      .fail(function (jqXHR, textStatus, errorThrown) {
        log('jquery.soap - error:', errorThrown);
        if ($.isFunction(config.error)) {
          config.error.call(this, new SOAPResponse(textStatus, jqXHR));
        }
      });
  } else {
    var errDeferred = new $.Deferred(),
      errmsg;
    if (!soapObject) {
      errmsg = 'jquery.soap - no soapObject';
    }
    if (!config.url) {
      errmsg = 'jquery.soap - no url';
    }
    if (errmsg) {
      warn(errmsg);
      errDeferred.reject(errmsg);
    }
    return errDeferred.promise();
  }
}
//Soap request - this is what being sent
function SOAPEnvelope(soapObject) {
  this.typeOf = 'SOAPEnvelope';
  this.prefix = 'soap';
  this.soapConfig = null;
  this.attributes = {};
  this.headers = [];
  this.bodies = [];
  // let's get the soap namespace prefix
  var parts = soapObject.name.split(':'),
    len;
  if (parts[1] === 'Envelope' || parts[1] === 'Body') {
    this.prefix = parts[0];
    if (
      soapObject.attr('xmlns:' + this.prefix) === SOAPTool.SOAP11.namespaceURL
    ) {
      this.soapConfig = this.SOAP11;
    }
    if (
      soapObject.attr('xmlns:' + this.prefix) === SOAPTool.SOAP12.namespaceURL
    ) {
      this.soapConfig = this.SOAP12;
    }
    // Envelope
    var env = soapObject.find(this.prefix + ':Envelope');
    if (env && env.attributes) {
      for (var i in env.attributes) {
        this.addAttribute(i, env.attributes[i]);
      }
    }
    // headers
    var header = soapObject.find(this.prefix + ':Header');
    if (header && header.children) {
      len = header.children.length;
      for (var j = 0; j < len; j++) {
        this.addHeader(header.children[j]);
      }
    }
    // body
    var body = soapObject.find(this.prefix + ':Body');
    if (body && body.children) {
      len = body.children.length;
      for (var k = 0; k < len; k++) {
        this.addBody(body.children[k]);
      }
    } else {
      len = soapObject.children.length;
      for (var l = 0; l < len; l++) {
        this.addBody(soapObject.children[l]);
      }
    }
  } else {
    // a soapObject with nothing, mere data
    this.addBody(soapObject);
  }
}
SOAPEnvelope.prototype = {
  addAttribute: function (name, value) {
    this.attributes[name] = value;
  },
  addNamespace: function (name, uri) {
    this.addAttribute('xmlns:' + name, uri);
  },
  addHeader: function (soapObject) {
    this.headers.push(soapObject);
  },
  addBody: function (soapObject) {
    this.bodies.push(soapObject);
  },
  toString: function () {
    var soapEnv = new SOAPObject(this.prefix + ':Envelope'),
      len;
    //Add attributes
    for (var name in this.attributes) {
      soapEnv.attr(name, this.attributes[name]);
    }
    //Add Headers
    len = this.headers.length;
    if (len > 0) {
      var soapHeader = soapEnv.newChild(this.prefix + ':Header');
      for (var i = 0; i < len; i++) {
        soapHeader.appendChild(this.headers[i]);
      }
    }
    //Add Bodies
    len = this.bodies.length;
    if (len > 0) {
      var soapBody = soapEnv.newChild(this.prefix + ':Body');
      for (var j = 0; j < len; j++) {
        soapBody.appendChild(this.bodies[j]);
      }
    }
    // Check for main NS over here...
    if (!soapEnv.attr('xmlns:' + this.prefix)) {
      soapEnv.addNamespace(this.prefix, this.soapConfig.namespaceURL);
    }
    if (!soapEnv.attr('xmlns:xsi')) {
      soapEnv.addNamespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance');
    }
    if (!soapEnv.attr('xmlns:xsd')) {
      soapEnv.addNamespace('xsd', 'http://www.w3.org/2001/XMLSchema');
    }
    return '<?xml version="1.0" encoding="UTF-8"?>' + soapEnv.toString();
  },
  send: function (options) {
    var self = this;
    if (!this.soapConfig) {
      this.soapConfig = options.soap12 ? SOAPTool.SOAP12 : SOAPTool.SOAP11;
    }
    var contentType = this.soapConfig.type;
    if (contentType === SOAPTool.SOAP11.type && !!options.action) {
      options.headers.SOAPAction = options.action;
    }
    log('jquery.soap - beforeSend:', this.toString());
    return $.ajax({
      type: 'POST',
      context: options.context,
      statusCode: options.statusCode,
      url: options.url,
      async: options.async,
      headers: options.headers,
      timeout: options.timeout,
      //    crossDomain: true,
      dataType: 'xml',
      processData: false,
      data: this.toString(),
      contentType:
        contentType +
        '; charset=UTF-8' +
        (options.soap12 ? '; action=' + options.action : ''),
      xhrFields: {
        // Add xhrFields, and set xhrFields.withCredentials = true by default, otherwise,
        // it can't send a cross-domain request successfully in Chrome without this settings.
        // You can use it to set withCredentials to true for cross-domain requests if needed.
        // More about it is in jQuery official website. (http://api.jquery.com/jquery.ajax/).
        // I hope it's useful and tested in Chrome & IE 11+ & IE Edge, Thanks.
        withCredentials: options.withCredentials
      },
      // second attempt to get some progres info (but still a no go)
      // I still keep this in tho, we might see it working one day when browsers mature...
      /*
                //WRT issue #80 (https://github.com/doedje/jquery.soap/issues/80) commenting out the xhr function below for IE8 and IE9 compatability. Issue exists when used alongside any script that modifies the XMLHttpRequest object like, for example, the xdomain or xhook libraries. This could be explicitly enabled by users on a per-case basis if it is mentioned somewhere in the readme.md file.
                xhr: function() {
                    var xhr = new window.XMLHttpRequest();
                    xhr.upload.addEventListener("progress", function(evt) {
                        if (evt.lengthComputable) {
                            var progress = evt.loaded / evt.total;
                            log("jquery.soap - progress up: ", (progress * 100) + '% total: ' + evt.total);
                        }
                    }, false);
                    xhr.addEventListener("progress", function(evt) {
                        if (evt.lengthComputable) {
                            var progress = evt.loaded / evt.total;
                            log("jquery.soap - progress down: ", (progress * 100) + '% total: ' + evt.total);
                        }
                    }, false);
                    return xhr;
                },
                */
      beforeSend: function () {
        if ($.isFunction(options.beforeSend)) {
          return options.beforeSend.call(options.context, self);
        }
      }
    });
  }
};
// SOAPObject - an abstraction layer to build SOAP Objects.
var SOAPObject = function (name) {
  this.typeOf = 'SOAPObject';
  this.name = name;
  this.ns = {};
  this.attributes = {};
  this._parent = null;
  this.children = [];
  this.value = undefined;
};
SOAPObject.prototype = {
  attr: function (name, value) {
    if ((!!name && !!value) || (!!name && value === '')) {
      this.attributes[name] = value;
      return this;
    } else if (name) {
      return this.attributes[name];
    } else {
      return this.attributes;
    }
  },
  val: function (value) {
    if (value === undefined) {
      if (this.attr('xsi:nil') === 'true') {
        return null;
      } else {
        return this.value;
      }
    } else if (value === null) {
      this.attr('xsi:nil', 'true');
      return this;
    } else {
      this.value = value;
      return this;
    }
  },
  addNamespace: function (name, url) {
    this.ns[name] = url;
    return this;
  },
  appendChild: function (obj) {
    obj._parent = this;
    this.children.push(obj);
    return obj;
  },
  newChild: function (name) {
    var obj = new SOAPObject(name);
    this.appendChild(obj);
    return obj;
  },
  addParameter: function (name, value) {
    var obj = new SOAPObject(name);
    obj.val(value);
    this.appendChild(obj);
    return this;
  },
  hasChildren: function () {
    return this.children.length > 0 ? true : false;
  },
  find: function (name) {
    if (this.name === name) {
      return this;
    } else {
      for (var i = 0, len = this.children.length; i < len; i++) {
        var result = this.children[i].find(name);
        if (result) {
          return result;
        }
      }
    }
  },
  end: function () {
    return this.parent();
  },
  parent: function () {
    return this._parent;
  },
  toString: function () {
    var out = [],
      encodedValue;
    out.push('<' + this.name);
    //Namespaces
    for (var name in this.ns) {
      out.push(' xmlns:' + name + '="' + this.ns[name] + '"');
    }
    //Node Attributes
    for (var attr in this.attributes) {
      if (typeof this.attributes[attr] === 'string') {
        out.push(
          ' ' +
            attr +
            '="' +
            SOAPTool.encodeXmlValue(this.attributes[attr]) +
            '"'
        );
      }
    }
    out.push('>');
    //Node children
    if (this.hasChildren()) {
      for (var cPos in this.children) {
        var cObj = this.children[cPos];
        if (typeof cObj === 'object' && cObj.typeOf === 'SOAPObject') {
          out.push(cObj.toString());
        }
      }
    }
    //Node Value
    if (this.value !== undefined) {
      if (typeof this.value === 'string') {
        switch (this.value.indexOf('<![CDATA[')) {
          case -1:
            // no CDATA blocks => encode everything
            encodedValue = SOAPTool.encodeXmlValue(this.value);
            break;
          case 0:
            if (this.value.indexOf(']]>') === this.value.length - 3) {
              // entire value wrapped in one single CDATA block => no encoding required
              encodedValue = this.value;
              break;
            }
          default:
            // encode with more advanced CDATA check
            encodedValue = SOAPTool.encodeXmlValueWithCDataCheck(this.value);
        }
      } else if (typeof this.value === 'number') {
        encodedValue = this.value.toString();
      }
      out.push(encodedValue);
    }
    //Close Tag
    out.push('</' + this.name + '>');
    return out.join('');
  }
};
//Soap response - this will be passed to the callback from SOAPEnvelope.send
var SOAPResponse = function (status, xhr) {
  this.typeOf = 'SOAPResponse';
  this.status = status;
  this.headers = xhr.getAllResponseHeaders().split('\n');
  this.httpCode = xhr.status;
  this.httpText = xhr.statusText;
  this.content =
    xhr.responseXML === undefined || xhr.responseXML === null
      ? xhr.responseText
      : xhr.responseXML;
  this.toString = function () {
    if (typeof this.content === 'string') {
      return this.content;
    }
    if ($.isXMLDoc(this.content)) {
      return SOAPTool.dom2string(this.content);
    }
    throw new Error('Unexpected Content: ' + $.type(this.content));
  };
  this.toXML = function () {
    if ($.isXMLDoc(this.content)) {
      return this.content;
    }
    return $.parseXML(this.content);
  };
  this.toJSON = function () {
    if ($.xml2json) {
      return $.xml2json(this.content);
    }
    warn(
      "jQuery.soap - Missing JQuery Plugin 'xml2json', info at: https://github.com/doedje/jquery.soap#dependencies"
    );
  };
};
//Singleton SOAP Tool
var SOAPTool = {
  SOAP11: {
    type: 'text/xml',
    namespaceURL: 'http://schemas.xmlsoap.org/soap/envelope/'
  },
  SOAP12: {
    type: 'application/soap+xml',
    namespaceURL: 'http://www.w3.org/2003/05/soap-envelope'
  },
  processData: function (options) {
    var soapObject;
    if ($.type(options.data) === 'string') {
      // if data is XML string, parse to XML DOM
      // ensure that string is not empty and contains more than whitespace
      if (/\S/.test(options.data)) {
        if (options.data.indexOf('<') > -1) {
          options.data = $.parseXML(options.data);
        } else {
          // this is for bare parameters #125
          soapObject = SOAPTool.json2soap(
            options.name,
            options.data,
            options.prefix
          );
        }
      }
    }
    if ($.isXMLDoc(options.data)) {
      // if data is XML DOM, parse to SOAPObject
      soapObject = SOAPTool.dom2soap(options.data.firstChild);
    } else if ($.isArray(options.data)) {
      // if data is an Array, asume SOAP::Lite
      soapObject = SOAPTool.array2soap(options);
    } else if ($.isPlainObject(options.data)) {
      // if data is JSON, parse to SOAPObject
      soapObject = SOAPTool.json2soap(
        options.name,
        options.data,
        options.prefix
      );
    } else if ($.isFunction(options.data)) {
      // if data is function, the function should return a SOAPObject
      soapObject = options.data.call(options.context, SOAPObject);
    }
    return soapObject;
  },
  encodeXmlValue: function (value) {
    var encodedValue,
      xmlCharMap = {
        '<': '&lt;',
        '>': '&gt;',
        '&': '&amp;',
        '"': '&quot;',
        "'": '&apos;'
      },
      encodedValue;
    encodedValue = value.replace(/[<>&"']/g, function (ch) {
      return xmlCharMap[ch];
    });
    return encodedValue;
  },
  encodeXmlValueWithCDataCheck: function (value) {
    // This function will only encode the parts within value that are not inside a CDATA section, allowing multiple usages of CDATA-blocks
    //  ie. "encoding here <!CDATA[[ no encoding here ]]> encoding here <!CDATA[[ no encoding here ]]>"
    var cdata = false,
      valueArray = value.split(''),
      encoded = [],
      char;
    for (var i = 0, j = valueArray.length; i < j; i++) {
      switch (valueArray[i]) {
        case '<':
          if (cdata) {
            encoded.push('<');
          } else if (value.substr(i, 9) === '<![CDATA[') {
            // if no CDATA section started, check if current char is part of CDATA start
            encoded.push('<![CDATA[');
            i += 8; // skip CDATA start chars
            cdata = true;
          } else {
            encoded.push('&lt;');
          }
          break;
        case ']':
          if (cdata && value.substr(i, 3) === ']]>') {
            // if CDATA section started, check if current char is part of CDATA end
            encoded.push(']]>');
            i += 2; // skip CDATA end chars
            cdata = false;
          } else {
            encoded.push(']');
          }
          break;
        case '>':
          encoded.push(cdata ? '>' : '&gt;');
          break;
        case '&':
          encoded.push(cdata ? '&' : '&amp;');
          break;
        case '"':
          encoded.push(cdata ? '"' : '&quot;');
          break;
        case "'":
          encoded.push(cdata ? "'" : '&apos;');
          break;
        default:
          encoded.push(valueArray[i]);
      }
    }
    return encoded.join('');
  },
  json2soap: function (name, params, prefix, parentNode) {
    var soapObject;
    var childObject;
    if (params === null) {
      soapObject = new SOAPObject(prefix + name);
      soapObject.attr('xsi:nil', 'true');
    } else if (typeof params == 'object') {
      // added by DT - check if object is in fact an Array and treat accordingly
      if (params.constructor.toString().indexOf('Array') > -1) {
        // type is array
        for (var i = 0, len = params.length; i < len; i++) {
          childObject = this.json2soap(name, params[i], prefix, parentNode);
          parentNode.appendChild(childObject);
        }
      } else if (params.constructor.toString().indexOf('String') > -1) {
        // type is string
        // handle String objects as string primitive value
        soapObject = new SOAPObject(prefix + name);
        soapObject.val(params);
      } else if (params.constructor.toString().indexOf('Date') > -1) {
        // type is Date
        // handle Date objects as ISO8601 formated value
        soapObject = new SOAPObject(prefix + name);
        soapObject.val(params.toISOString());
      } else {
        soapObject = new SOAPObject(prefix + name);
        for (var y in params) {
          childObject = this.json2soap(y, params[y], prefix, soapObject);
          if (childObject) {
            soapObject.appendChild(childObject);
          }
        }
      }
    } else if (typeof params == 'boolean') {
      soapObject = new SOAPObject(prefix + name);
      soapObject.val(params ? 'true' : 'false');
    } else {
      soapObject = new SOAPObject(prefix + name);
      soapObject.val(params);
    }
    return soapObject;
  },
  dom2soap: function (xmldom) {
    var whitespace = /^\s+$/,
      soapObject = new SOAPObject(xmldom.nodeName),
      len;
    len = xmldom.attributes.length;
    for (var i = 0; i < len; i++) {
      var attribute = xmldom.attributes[i];
      soapObject.attr(attribute.name, attribute.value);
    }
    len = xmldom.childNodes.length;
    for (var j = 0; j < len; j++) {
      var child = xmldom.childNodes[j];
      if (child.nodeType === 1) {
        var childObject = SOAPTool.dom2soap(child);
        soapObject.appendChild(childObject);
      }
      if (child.nodeType === 3 && !whitespace.test(child.nodeValue)) {
        soapObject.val(child.nodeValue);
      }
      if (child.nodeType === 4) {
        soapObject.val('<![CDATA[' + child.nodeValue + ']]>');
      }
    }
    return soapObject;
  },
  array2soap: function (options) {
    soapObject = new SOAPObject(options.name);
    for (var index = 0, len = options.data.length; index < len; index++) {
      if ($.isArray(options.data[index])) {
        var new_item = soapObject.newChild('soapenc:Array');
        new_item.attr(
          'soapenc:arrayType',
          'xsd:string[' + options.data[index].length + ']'
        );
        for (
          var item = 0, len2 = options.data[index].length;
          item < len2;
          item++
        ) {
          new_item
            .newChild('item')
            .attr('type', 'xsd:string')
            .val(options.data[index][item])
            .end();
        }
      } else {
        soapObject
          .newChild('c-gensym' + index)
          .attr('type', 'xsd:string')
          .val(options.data[index])
          .end();
      }
    }
    return soapObject;
  },
  dom2string: function (dom) {
    if (typeof XMLSerializer !== 'undefined') {
      return new window.XMLSerializer().serializeToString(dom);
    } else {
      return dom.xml;
    }
  },
  createWSS: function (wssValues) {
    if (!!wssValues.username && !!wssValues.password) {
      var wssConst = {
        security: 'wsse:Security',
        securityNS:
          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd',
        usernameToken: 'wsse:UsernameToken',
        usernameTokenNS:
          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd',
        username: 'wsse:Username',
        usernameType:
          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd',
        password: 'wsse:Password',
        passwordType:
          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText',
        nonce: 'wsse:Nonce',
        nonceType:
          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd',
        wsuCreated: 'wsu:Created',
        wsuCreatedType:
          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'
      };
      var WSSObj = new SOAPObject(wssConst.security)
        .addNamespace('wsse', wssConst.securityNS)
        .addNamespace('wsu', wssConst.usernameTokenNS)
        .newChild(wssConst.usernameToken)
        .newChild(wssConst.username)
        .attr('Type', wssConst.usernameType)
        .val(wssValues.username)
        .end()
        .newChild(wssConst.password)
        .attr('Type', wssConst.passwordType)
        .val(wssValues.password)
        .end()
        .end();
      var userTokenObj = WSSObj.find(wssConst.usernameToken);
      if (wssValues.nonce) {
        userTokenObj
          .newChild(wssConst.nonce)
          .attr('Type', wssConst.nonceType)
          .val(wssValues.nonce);
      }
      if (wssValues.created) {
        userTokenObj
          .newChild(wssConst.wsuCreated)
          .attr('Type', wssConst.wsuCreatedType)
          .val(wssValues.created);
      }
      return WSSObj;
    }
  },
  fallbackDeprecated: function (config) {
    // fallbacks for changed properties: (the old names will deprecate at version 2.0.0!)
    var deprecated = {
      // usage -> oldParam: 'newParam'
      namespaceUrl: 'namespaceURL',
      request: 'beforeSend',
      params: 'data'
    };
    for (var oldParam in deprecated) {
      var newParam = deprecated[oldParam];
      if (!config[newParam] && !!config[oldParam]) {
        warn(
          'jquery.soap: ' +
            oldParam +
            ' is deprecated, use ' +
            newParam +
            ' instead!'
        );
        config[newParam] = config[oldParam];
        delete config[oldParam];
      }
    }
  }
};
function log() {
  if (enableLogging && typeof console === 'object') {
    if ($.isFunction(console.log)) {
      if (arguments.length == 1) {
        console.log(arguments[0]);
      } else {
        console.log(arguments);
      }
    }
  }
}
function warn() {
  if (typeof console === 'object') {
    if ($.isFunction(console.warn)) {
      if (arguments.length == 1) {
        console.warn(arguments[0]);
      } else {
        console.warn(arguments);
      }
    }
  }
}
$.soap = soap;
src/lib/jquery.xml2json.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,200 @@
/*
 ### jQuery XML to JSON Plugin v1.3 - 2013-02-18 ###
    * https://www.fyneworks.com/ - diego@fyneworks.com
    * Licensed under http://en.wikipedia.org/wiki/MIT_License
 ###
 Website: http://www.fyneworks.com/jquery/xml-to-json/
*/ /*
 # INSPIRED BY: http://www.terracoder.com/
           AND: http://www.thomasfrank.se/xml_to_json.html
                                            AND: http://www.kawa.net/works/js/xml/objtree-e.html
*/ /*
 This simple script converts XML (document of code) into a JSON object. It is the combination of 2
 'xml to json' great parsers (see below) which allows for both 'simple' and 'extended' parsing modes.
*/
import $ from 'jquery';
// Avoid collisions
// Add function to jQuery namespace
$.extend({
  // converts xml documents and xml text to json object
  xml2json: function (xml, extended) {
    if (!xml) return {}; // quick fail
    //### PARSER LIBRARY
    // Core function
    function parseXML(node, simple) {
      if (!node) return null;
      var txt = '',
        obj = null,
        att = null;
      var nt = node.nodeType,
        nn = jsVar(node.localName || node.nodeName);
      var nv = node.text || node.nodeValue || '';
      /*DBG*/ //if(window.console) console.log(['x2j',nn,nt,nv.length+' bytes']);
      if (node.childNodes) {
        if (node.childNodes.length > 0) {
          /*DBG*/ //if(window.console) console.log(['x2j',nn,'CHILDREN',node.childNodes]);
          $.each(node.childNodes, function (n, cn) {
            var cnt = cn.nodeType,
              cnn = jsVar(cn.localName || cn.nodeName);
            var cnv = cn.text || cn.nodeValue || '';
            /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>a',cnn,cnt,cnv]);
            if (cnt == 8) {
              /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>b',cnn,'COMMENT (ignore)']);
              return; // ignore comment node
            } else if (cnt == 3 || cnt == 4 || !cnn) {
              // ignore white-space in between tags
              if (cnv.match(/^\s+$/)) {
                /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>c',cnn,'WHITE-SPACE (ignore)']);
                return;
              }
              /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>d',cnn,'TEXT']);
              txt += cnv.replace(/^\s+/, '').replace(/\s+$/, '');
              // make sure we ditch trailing spaces from markup
            } else {
              /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>e',cnn,'OBJECT']);
              obj = obj || {};
              if (obj[cnn]) {
                /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>f',cnn,'ARRAY']);
                // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
                if (!obj[cnn].length) obj[cnn] = myArr(obj[cnn]);
                obj[cnn] = myArr(obj[cnn]);
                obj[cnn][obj[cnn].length] = parseXML(cn, true /* simple */);
                obj[cnn].length = obj[cnn].length;
              } else {
                /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>g',cnn,'dig deeper...']);
                obj[cnn] = parseXML(cn);
              }
            }
          });
        } //node.childNodes.length>0
      } //node.childNodes
      if (node.attributes) {
        if (node.attributes.length > 0) {
          /*DBG*/ //if(window.console) console.log(['x2j',nn,'ATTRIBUTES',node.attributes])
          att = {};
          obj = obj || {};
          $.each(node.attributes, function (a, at) {
            var atn = jsVar(at.name),
              atv = at.value;
            att[atn] = atv;
            if (obj[atn]) {
              /*DBG*/ //if(window.console) console.log(['x2j',nn,'attr>',atn,'ARRAY']);
              // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
              //if(!obj[atn].length) obj[atn] = myArr(obj[atn]);//[ obj[ atn ] ];
              obj[cnn] = myArr(obj[cnn]);
              obj[atn][obj[atn].length] = atv;
              obj[atn].length = obj[atn].length;
            } else {
              /*DBG*/ //if(window.console) console.log(['x2j',nn,'attr>',atn,'TEXT']);
              obj[atn] = atv;
            }
          });
          //obj['attributes'] = att;
        } //node.attributes.length>0
      } //node.attributes
      if (obj) {
        obj = $.extend(
          txt != '' ? new String(txt) : {},
          /* {text:txt},*/ obj || {} /*, att || {}*/
        );
        //txt = (obj.text) ? (typeof(obj.text)=='object' ? obj.text : [obj.text || '']).concat([txt]) : txt;
        txt = obj.text ? [obj.text || ''].concat([txt]) : txt;
        if (txt) obj.text = txt;
        txt = '';
      }
      var out = obj || txt;
      //console.log([extended, simple, out]);
      if (extended) {
        if (txt) out = {}; //new String(out);
        txt = out.text || txt || '';
        if (txt) out.text = txt;
        if (!simple) out = myArr(out);
      }
      return out;
    } // parseXML
    // Core Function End
    // Utility functions
    var jsVar = function (s) {
      return String(s || '').replace(/-/g, '_');
    };
    // NEW isNum function: 01/09/2010
    // Thanks to Emile Grau, GigaTecnologies S.L., www.gigatransfer.com, www.mygigamail.com
    function isNum(s) {
      // based on utility function isNum from xml2json plugin (http://www.fyneworks.com/ - diego@fyneworks.com)
      // few bugs corrected from original function :
      // - syntax error : regexp.test(string) instead of string.test(reg)
      // - regexp modified to accept  comma as decimal mark (latin syntax : 25,24 )
      // - regexp modified to reject if no number before decimal mark  : ".7" is not accepted
      // - string is "trimmed", allowing to accept space at the beginning and end of string
      var regexp = /^((-)?([0-9]+)(([\.\,]{0,1})([0-9]+))?$)/;
      return (
        typeof s == 'number' ||
        regexp.test(String(s && typeof s == 'string' ? jQuery.trim(s) : ''))
      );
    }
    // OLD isNum function: (for reference only)
    //var isNum = function(s){ return (typeof s == "number") || String((s && typeof s == "string") ? s : '').test(/^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/); };
    var myArr = function (o) {
      // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
      //if(!o.length) o = [ o ]; o.length=o.length;
      if (!$.isArray(o)) o = [o];
      o.length = o.length;
      // here is where you can attach additional functionality, such as searching and sorting...
      return o;
    };
    // Utility functions End
    //### PARSER LIBRARY END
    // Convert plain text to xml
    if (typeof xml == 'string') xml = $.text2xml(xml);
    // Quick fail if not xml (or if this is a node)
    if (!xml.nodeType) return;
    if (xml.nodeType == 3 || xml.nodeType == 4) return xml.nodeValue;
    // Find xml root node
    var root = xml.nodeType == 9 ? xml.documentElement : xml;
    // Convert xml to json
    var out = parseXML(root, true /* simple */);
    // Clean-up memory
    xml = null;
    root = null;
    // Send output
    return out;
  },
  // Convert text to XML DOM
  text2xml: function (str) {
    // NOTE: I'd like to use jQuery for this, but jQuery makes all tags uppercase
    //return $(xml)[0];
    /* prior to jquery 1.9 */
    /*
    var out;
    try{
     var xml = ((!$.support.opacity && !$.support.style))?new ActiveXObject("Microsoft.XMLDOM"):new DOMParser();
     xml.async = false;
    }catch(e){ throw new Error("XML Parser could not be instantiated") };
    try{
     if((!$.support.opacity && !$.support.style)) out = (xml.loadXML(str))?xml:false;
     else out = xml.parseFromString(str, "text/xml");
    }catch(e){ throw new Error("Error parsing XML string") };
    return out;
    */
    /* jquery 1.9+ */
    return $.parseXML(str);
  }
}); // extend $
src/model/Factor.js
@@ -1,6 +1,7 @@
import { Legend } from './Legend';
const _hMap = {
  19: [0, 1000], //NO
  1: [0, 1000], //NO2
  2: [0, 2000], //CO
  3: [0, 1000], //H2S
src/model/FactorDatas.js
@@ -47,6 +47,9 @@
        }]
        */
  setData: function (dataList, drawMode, callback) {
    if (dataList.length == 0) {
      return;
    }
    this.clearData();
    dataList.forEach((d) => {
@@ -67,6 +70,10 @@
  // æ–°å¢žä¸€ä¸ªæ–°æ•°æ®
  addData: function (dataList, drawMode, callback) {
    if (dataList.length == 0) {
      return;
    }
    var newGps = [];
    dataList.forEach((data) => {
      this.times.push(data.time);
src/model/FrameAnimation.js
@@ -17,7 +17,7 @@
  this.isPause = false;
  this.isRunning = false;
  this.isStop = false;
  this.isStop = true;
  // æ˜¯å¦å¼€å¯åŠ¨æ€ç»˜åˆ¶é€Ÿåº¦
  this.dynamicSpeed = false;
  // æ¯ä¸ªä»»åŠ¡è€—æ—¶ï¼ˆç§’ï¼‰
@@ -28,13 +28,13 @@
FrameAnimation.prototype = {
  start: function () {
    if (this.intervalFlag != undefined) {
      this.isPause = false;
      this.isStop = false;
    } else {
      this.isRunning = true;
    // ä¸å­˜åœ¨åŠ¨ç”»ä»»åŠ¡æ—¶é‡æ–°å¼€å§‹ï¼Œå¦åˆ™ç»§ç»­
    if (this.intervalFlag == undefined) {
      this._doTask();
    }
    this.isPause = false;
    this.isStop = false;
    this.isRunning = true;
  },
  /**
   * åŠ¨æ€åŠ¨ç”»é€Ÿåº¦
@@ -67,8 +67,11 @@
  },
  pause: function () {
    this.isPause = true;
    this.isRunning = false;
  },
  stop: function () {
    if (this.isStop) return;
    if (this.intervalFlag != undefined) {
      clearInterval(this.intervalFlag);
      this.intervalFlag = undefined;
src/model/Legend.js
@@ -8,6 +8,7 @@
  //各监测因子数据分级(标准)
  _legend_r: {
    NO: [0, 100, 200, 700, 1200, 2340],
    NO2: [0, 100, 200, 700, 1200, 2340],
    CO: [0, 5, 10, 35, 60, 90],
    H2S: [0, 150, 500, 650, 800, 1600],
@@ -25,6 +26,14 @@
  //各监测因子数据分级(标准)对应颜色
  _legend_c: {
    NO: [
      [0, 0.89, 0, 0.75],
      [1, 1, 0, 0.75],
      [1, 0.49, 0, 0.75],
      [1, 0, 0, 0.75],
      [0.6, 0, 0.3, 0.75],
      [0.49, 0, 0.14, 0.75]
    ],
    NO2: [
      [0, 0.89, 0, 0.75],
      [1, 1, 0, 0.75],
src/router/index.js
@@ -6,7 +6,7 @@
  routes: [
    {
      path: '/',
      redirect: '/index/hmode'
      redirect: '/login'
    },
    // ç™»é™†é¡µé¢
    {
src/styles/elementUI.scss
@@ -2,13 +2,8 @@
  // --el-text-color-regular: #ffffff;
}
.el-form-item {
  margin-bottom: 0px;
  margin-right: 8px !important;
}
.el-form-item__label {
  color: white !important;
  color: rgba(255, 255, 255, 0.849) !important;
}
// .el-radio {
src/test.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetData>
      <compUser>user1</compUser>
      <compPassword>User1@jingan</compPassword>
      <mn>TX105</mn>
      <dtFrom>2024-08-07 10:00:00</dtFrom>
      <dtTo>2024-08-07 10:00:59</dtTo>
    </GetData>
  </soap:Body>
</soap:Envelope>
src/utils/chart/chart-option.js
@@ -48,6 +48,8 @@
    },
    xAxis: {
      name: '时间',
      nameLocation: 'middle',
      nameGap: 30,
      data: _xAxis,
      axisLabel: {
        textStyle: {
@@ -74,7 +76,16 @@
      }
    },
    yAxis: {
      name: '浓度(μg/m³)',
      name: '浓度(μg/m³)/温度(℃)/速度(m/s)',
      nameLocation: 'middle',
      nameGap: 30,
      // nameTruncate: {
      //   maxWidth: 100,
      //   ellipsis: '...'
      // },
      // nameTextStyle: {
      //   color: 'red'
      // },
      axisLabel: {
        textStyle: {
          fontSize: fontSize
src/utils/factor/data.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,246 @@
/**
 * æ•°æ®èŽ·å–ç®¡ç†
 */
import '@/lib/jquery.xml2json';
import 'jquery.soap';
// import '@/lib/jquery.soap';
import $ from 'jquery';
import moment from 'moment';
import monitorDataApi from '@/api/monitorDataApi';
import { ElMessage } from 'element-plus';
import { parseFloatNAN } from '@/utils/number';
/**************************--本系统原始走航数据获取--*********************************/
/**
 * èŽ·å–åŽ†å²æ•°æ®
 * @param {Object} params
 * @returns
 */
function fetchOriginHistoryData(params) {
  return monitorDataApi.fetchHistroyData(params);
}
/**
 * èŽ·å–å®žæ—¶æœ€æ–°æ•°æ®
 * @param {Object} params
 * @returns
 */
function fetchOriginRealTimeData(params) {
  return monitorDataApi.fetchNextData(params);
}
/**************************--第三方申欣环保走航数据获取--*********************************/
/**
 * èŽ·å–ç”³æ¬£çŽ¯ä¿èµ°èˆªæ•°æ®
 * @date 2024.8.16
 * @param {Object} params
 * @returns
 */
function fetchThirdPartyData(params) {
  return new Promise((resolve, reject) => {
    $.soap({
      // url: 'http://180.169.129.106:9001/WebService.asmx',
      url: 'http://114.215.109.124:8082/jingan/WebService.asmx',
      method: 'GetData',
      appendMethodToURL: false,
      namespaceURL: 'http://tempuri.org/',
      SOAPAction: 'http://tempuri.org/GetData',
      data: params,
      success: function (soapResponse) {
        const json = $.xml2json(soapResponse.toString());
        // console.log(json);
        // todo 2024.8.16 æ•°æ®æ ¼å¼è½¬æ¢
        const res = json.Body.GetDataResponse.GetDataResult;
        if (res.ReturnCode != '0') {
          reject(soapResponse);
          ElMessage({
            message: res.ReturnMessage,
            type: 'error'
          });
        } else if (typeof res.ListInfo != 'object') {
          resolve({
            success: true,
            message: '请求成功',
            data: []
          });
          // reject(soapResponse);
          ElMessage({
            message: '暂无新监测数据',
            type: 'warning'
          });
        } else {
          // æ­¤å¤„有一个 $.xml2json æ–¹æ³•的一个特性,当字段DataInfo中只有一个值时,此时DataInfo为对象类型,而非数组
          if (res.ListInfo.DataInfo.length == undefined) {
            res.ListInfo.DataInfo = [res.ListInfo.DataInfo];
          }
          const _res = res.ListInfo.DataInfo.map((value) => {
            const _time = moment(value.PostTime).format('YYYY-MM-DD HH:mm:ss');
            return {
              deviceCode: params.mn,
              lat: parseFloat(value.Lat),
              lng: parseFloat(value.Lon),
              time: _time,
              values: [
                {
                  factorId: '19',
                  factorName: 'NO',
                  factorData: parseFloatNAN(value.NO)
                },
                {
                  factorId: '1',
                  factorName: 'NO2',
                  factorData: parseFloatNAN(value.NO2)
                },
                {
                  factorId: '2',
                  factorName: 'CO',
                  factorData: parseFloatNAN(value.CO) * 1000
                },
                {
                  factorId: '6',
                  factorName: 'PM25',
                  factorData: parseFloatNAN(value.PM25)
                },
                {
                  factorId: '7',
                  factorName: 'PM10',
                  factorData: parseFloatNAN(value.PM10)
                },
                {
                  factorId: '8',
                  factorName: 'TEMPERATURE',
                  factorData: parseFloatNAN(value.Temperature)
                },
                {
                  factorId: '14',
                  factorName: 'VELOCITY',
                  factorData: parseFloatNAN(value.Speed)
                },
                {
                  factorId: '15',
                  factorName: 'TIME',
                  factorData: moment(_time).valueOf(),
                  statusList: [_time]
                },
                {
                  factorId: '16',
                  factorName: 'WIND_SPEED',
                  factorData: parseFloatNAN(value.WindSpeed)
                },
                {
                  factorId: '17',
                  factorName: 'WIND_DIRECTION',
                  factorData: parseFloatNAN(value.WindDirection)
                }
              ]
            };
          });
          resolve({
            success: true,
            message: '请求成功',
            data: _res
          });
        }
      },
      error: function (SOAPResponse) {
        // show error
        reject(SOAPResponse);
        ElMessage({
          message: '数据获取失败',
          type: 'error'
        });
      }
    });
  });
}
/**************************--对外暴露统一接口--*********************************/
/**
 * èŽ·å–åŽ†å²æ•°æ®
 */
function fetchHistoryData(params) {
  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
    const _params = {
      compUser: 'user1',
      compPassword: 'User1@jingan',
      mn: params.deviceCode,
      dtFrom: params.startTime
        ? params.startTime
        : moment().subtract(6, 'm').format('YYYY-MM-DD HH:mm:ss'),
      dtTo: params.endTime
        ? params.endTime
        : moment().format('YYYY-MM-DD HH:mm:ss')
    };
    return fetchThirdPartyData(_params);
  } else {
    return fetchOriginHistoryData(params);
  }
}
var fetchingTask;
var isFetching;
/**
 * å¼€å¯å®žæ—¶æ•°æ®å¾ªçŽ¯èŽ·å–
 * @param {Object} params
 */
function startLoopFetchRealTimeData(onParam, callback) {
  // æ—¶é—´é—´éš”
  let interval;
  // æ•°æ®èŽ·å–æ–¹æ³•
  let fetchFun;
  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
    //  è¯¥æ•°æ®ä¼ è¾“最低间隔为1分钟,每次获取结束时间自动调整为开始时间的1分钟后
    fetchFun = fetchThirdPartyData;
    interval = 60 * 1000;
  } else {
    fetchFun = fetchOriginRealTimeData;
    interval = 10 * 1000;
  }
  // å¼€å§‹å¾ªçŽ¯ä»»åŠ¡
  clearFetchingTask();
  fetchingTask = setInterval(() => {
    if (isFetching) {
      return;
    }
    isFetching = true;
    // å‚æ•°
    let _params;
    if (typeof onParam === 'function') {
      const params = onParam();
      if (import.meta.env.VITE_DATA_MODE == 'jingan') {
        _params = {
          compUser: 'user1',
          compPassword: 'User1@jingan',
          mn: params.deviceCode,
          dtFrom: params.updateTime,
          dtTo: moment().format('YYYY-MM-DD HH:mm:ss')
        };
      } else {
        _params = params;
      }
    }
    fetchFun(_params)
      .then((res) => {
        if (typeof callback === 'function') {
          callback(res);
        }
      })
      .finally(() => {
        isFetching = false;
      });
  }, interval);
}
/**
 * æ¸…理历史实时数据获取任务
 */
function clearFetchingTask() {
  if (fetchingTask) {
    clearInterval(fetchingTask);
    fetchingTask = undefined;
    isFetching = false;
  }
}
export { fetchHistoryData, startLoopFetchRealTimeData, clearFetchingTask };
src/utils/map/dialog.js
@@ -21,8 +21,9 @@
   * @param {*} onClose å…³é—­å¼¹å‡ºæ¡†å›žè°ƒ
   * @returns
   */
  createInfoWindow(factorDatas, i, onClose) {
  createInfoWindow(deviceCode, factorDatas, i, onClose) {
    let m = {
      deviceCode: deviceCode,
      data: factorDatas,
      index: i,
      window: '',
@@ -76,9 +77,9 @@
    const time = marker.time;
    const factorList = marker.factorList;
    //实例化信息窗体
    // var title = '<div>' + site.name + '</div>' + '<div class="sub-title">编号:' + site.code + '</div>',
    var title = '',
      content = '',
    // var title = '<div class="time">编号:' + marker.deviceCode + '</div>';
    var title = '编号:' + marker.deviceCode;
    var content = '',
      tag = '';
    tag += "<div class='time'>" + '时间: ' + time;
@@ -127,6 +128,7 @@
    var orderList = [
      'VOC',
      'H2S',
      'NO',
      'NO2',
      'CO',
      'SO2',
@@ -139,7 +141,10 @@
      'WIND_DIRECTION'
    ];
    orderList.forEach((e) => {
      content += _contents.get(e);
      const c = _contents.get(e);
      if (c != undefined) {
        content += c;
      }
    });
    // content +=
@@ -162,11 +167,12 @@
    var top_t = document.createElement('div');
    top_t.className = 'ff-border-top';
    var top_c = document.createElement('div');
    top_c.className = 'ff-border-content flexbox flex-space-between';
    top_c.className = 'text-clz ff-border-content flexbox flex-space-between';
    var titleD = document.createElement('div');
    var closeX = document.createElement('i');
    titleD.innerHTML = title;
    var closeX = document.createElement('div');
    $(titleD).text(title);
    // titleD.className = 'time';
    closeX.className = 'text-close';
    $(closeX).attr('aria-hidden', 'true');
    $(closeX).text('X');
@@ -247,9 +253,9 @@
    return info;
  },
  openNewWindow(factorDatas, i, onClose) {
  openNewWindow(deviceCode, factorDatas, i, onClose) {
    if (!this.show) return;
    const window = this.createInfoWindow(factorDatas, i, onClose);
    const window = this.createInfoWindow(deviceCode, factorDatas, i, onClose);
    window.open(map, factorDatas.lnglats_GD[i]);
  },
src/utils/map/sector.js
@@ -109,7 +109,7 @@
function drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2) {
  if (distance == 0 || distance2 == 0) {
    return;
    return false;
  }
  // eslint-disable-next-line no-undef
  var sector = new AMap.Object3D.Mesh();
@@ -167,6 +167,7 @@
  }
  object3Dlayer.add(sector);
  _sector = sector;
  return true;
}
function drawTextMaker(list, list2, distance, distance2) {
@@ -247,13 +248,14 @@
   * @returns æ•°æ®åæ ‡ç‚¹å’Œæ‰‡å½¢æœ€å¤§åŠå¾„
   */
  drawSector(fDatas, i) {
    if (_sector != undefined) {
      this.clearSector();
    }
    this.clearSector();
    const { sDeg, eDeg, lnglat, distance, distance2, list, list2 } =
      sectorParams(fDatas, i);
    drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2);
    drawElasticMarker(list, list2, distance, distance2);
    if (drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2)) {
      // å½“风速大于0绘制了扇形时,才绘制对应的距离等文本标记
      // drawElasticMarker(list, list2, distance, distance2);
      drawTextMaker(list, list2, distance, distance2);
    }
    return { p: lnglat, r: distance };
  },
@@ -266,7 +268,8 @@
    this.clearSectorMesh();
    const { sDeg, eDeg, lnglat, distance, distance2, list, list2 } =
      sectorParams(fDatas, i);
    drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2);
    drawTextMaker(list, list2, distance, distance2);
    if (drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2)) {
      drawTextMaker(list, list2, distance, distance2);
    }
  }
};
src/utils/number.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
export function parseFloatNAN(t) {
  const res = parseFloat(t);
  return isNaN(res) ? 0 : res;
}
src/views/LoginPage.vue
@@ -1,9 +1,190 @@
<template>
  <div>LoginPage</div>
  <div class="background">
    <div class="title-content">飞羽大气环境智能走航监测系统</div>
    <div class="flexbox flex-space-around">
      <img :src="underwayPng" alt="走航监测" class="img-1" />
      <div class="input-box flexbox">
        <div class="flexbox-col align-items" style="margin: auto">
          <div class="flexbox-col input-content flex-space-between">
            <el-form
              :model="formObj"
              ref="formRef"
              :rules="rules"
              label-position="top"
            >
              <el-form-item label="用户名" prop="userName">
                <el-input
                  size="default"
                  v-model="formObj.userName"
                  placeholder="用户名"
                  style="width: 200px"
                />
              </el-form-item>
              <el-form-item label="密码" prop="password">
                <el-input
                  size="default"
                  type="password"
                  show-password
                  v-model="formObj.password"
                  placeholder="密码"
                  style="width: 200px"
                />
              </el-form-item>
            </el-form>
          </div>
          <div class="btn-login" @click="login">登录</div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import underwayPng from '@/assets/mipmap/underway-2.png';
import { ElMessage } from 'element-plus';
export default {
  name: 'LoginPage'
  data() {
    return {
      underwayPng: underwayPng,
      formObj: {},
      rules: {
        userName: [
          {
            required: true,
            message: '请输入用户名',
            trigger: 'blur'
          }
        ],
        password: [
          {
            required: true,
            message: '请输入密码',
            trigger: 'blur'
          }
        ]
      }
    };
  },
  methods: {
    login() {
      this.$refs.formRef.validate((valid) => {
        if (valid) {
          if (
            this.formObj.userName == 'jingan' &&
            this.formObj.password == 'jingan123'
          ) {
            this.$router.replace('/index/hmode');
          } else {
            ElMessage({
              message: '用户名或密码错误',
              type: 'error'
            });
          }
        }
      });
    }
  }
};
</script>
<style scoped>
.background {
  background-color: #002378;
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  min-height: 768px;
  min-width: 1366px;
}
.title-content {
  /* position: absolute; */
  width: 100%;
  height: 200px;
  padding: 3vh 0 0 0;
  /* top: 80px;
    left: 0;
    right: 0; */
  color: white;
  font-size: 1.4rem;
  display: flex;
  justify-content: center;
  background-image: url('@/assets/mipmap/title_bg.png');
  background-size: contain;
  background-repeat: no-repeat;
}
.img-1 {
  min-height: 500px;
  height: 60vh;
  /* margin-left: 6vw; */
}
.input-box {
  width: 400px;
  height: 420px;
  /* background-color: aquamarine; */
  background-image: url('@/assets/mipmap/border.png');
  background-size: 100% 100%;
  color: white;
}
.input-content {
}
.input-content .text-box {
  width: 220px;
  height: 28px;
  font-size: 12px;
  border-radius: 6px;
}
.btn-login {
  margin-top: 20px;
  border-radius: 6px;
  padding: 8px 60px;
  box-shadow: 10px 10px 10px rgba(39, 39, 39, 0.473);
  background: -moz-linear-gradient(
    left,
    rgb(109, 213, 231),
    rgb(80, 166, 202),
    rgb(65, 141, 186),
    rgb(33, 90, 154),
    rgb(13, 56, 133),
    rgb(11, 53, 131)
  );
  background: -ms-linear-gradient(
    left,
    rgb(109, 213, 231),
    rgb(80, 166, 202),
    rgb(65, 141, 186),
    rgb(33, 90, 154),
    rgb(13, 56, 133),
    rgb(11, 53, 131)
  );
  background: -o-linear-gradient(
    left,
    rgb(109, 213, 231),
    rgb(80, 166, 202),
    rgb(65, 141, 186),
    rgb(33, 90, 154),
    rgb(13, 56, 133),
    rgb(11, 53, 131)
  );
  background: -webkit-linear-gradient(
    left,
    rgb(109, 213, 231),
    rgb(80, 166, 202),
    rgb(65, 141, 186),
    rgb(33, 90, 154),
    rgb(13, 56, 133),
    rgb(11, 53, 131)
  );
  cursor: pointer;
}
</style>
src/views/historymode/HistoryMode copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,237 @@
<template>
  <div class="p-events-none m-t-2">
    <el-row justify="center" align="middle" class="top-wrap">
      <SearchBar
        v-show="status == 0"
        :search-time="searchTime"
        :loading="loading"
        @search="fetchHistroyData"
      ></SearchBar>
      <TrajectoryState v-show="status != 0" :status="status"></TrajectoryState>
    </el-row>
    <el-row class="m-t-2">
      <FactorRadio
        :device-type="deviceType"
        @change="(e) => (factorType = e)"
      ></FactorRadio>
    </el-row>
    <el-row class="m-t-2">
      <FactorLegend
        class="m-t-2"
        :factor="factorDatas.factor[factorType]"
      ></FactorLegend>
    </el-row>
    <el-row class="historical" justify="center">
      <HistoricalTrajectory
        :factor-datas="factorDatas"
        :factor-type="factorType"
        @change="(e) => (status = e)"
        @stop="draw"
      ></HistoricalTrajectory>
    </el-row>
    <TrendAnalysis
      class="trend-analysis"
      :locate-index="locateIndex"
      @chart-click="handelIndexChange"
      :factor-datas="factorDatas"
      :device-type="deviceType"
    ></TrendAnalysis>
    <DataSheet
      class="data-sheet"
      :locate-index="locateIndex"
      @table-click="handelIndexChange"
      :factor-datas="factorDatas"
      :device-type="deviceType"
    ></DataSheet>
  </div>
</template>
<script>
import Layer from '@/utils/map/3dLayer';
import marks from '@/utils/map/marks';
import sector from '@/utils/map/sector';
import mapUtil from '@/utils/map/util';
import { DialogUtil } from '@/utils/map/dialog';
import monitorDataApi from '@/api/monitorDataApi';
import { useFetchData } from '@/composables/fetchData';
import moment from 'moment';
import { TYPE0 } from '@/constant/device-type';
import { FactorDatas } from '@/model/FactorDatas';
import TrendAnalysis from './component/TrendAnalysis.vue';
import DataSheet from './component/DataSheet.vue';
import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
export default {
  components: { TrendAnalysis, DataSheet },
  setup() {
    const { loading, fetchData } = useFetchData(10000);
    return { loading, fetchData };
  },
  data() {
    return {
      // ç›‘测设备类型
      deviceType: TYPE0,
      // ç›‘测因子的类型编号
      factorType: '1',
      // ç›‘测数据
      factorDatas: new FactorDatas(),
      // å†³å®šç»˜åˆ¶3D图形时是否与原图像合并
      merge: false,
      // å†³å®šç»˜åˆ¶å®Œ3D图形后地图视角是否自动回中
      setCenter: true,
      // ç»˜åˆ¶æ¨¡å¼ï¼Œ0:自动模式,自动计算当前数据的范围,绘制合适的比例;1:手动模式,根据页面设置的绘图范围进行绘制
      drawMode: 0,
      searchTime: [],
      // å½“前选中高亮的数据点索引
      locateIndex: undefined,
      // è½¨è¿¹åŠ¨ç”»çŠ¶æ€
      status: 0
    };
  },
  watch: {
    factorType(nValue, oValue) {
      if (nValue != oValue && this.status == 0) {
        this.draw();
      }
    }
  },
  methods: {
    // æ£€æŸ¥æ•°æ®ç»çº¬åº¦æ˜¯å¦åˆæ³•
    checkDataIsValid(index) {
      const lnglats_GD = this.factorDatas.lnglats_GD[index];
      const time = this.factorDatas.times[index];
      if (lnglats_GD[0] == 0 && lnglats_GD[1] == 0) {
        ElMessage({
          message: `${time}的数据经纬度无效`,
          type: 'warning'
        });
        return false;
      } else {
        this.locateIndex = index;
        return true;
      }
    },
    // ç›‘听折线图和表格的点击事件
    handelIndexChange(index) {
      if (this.checkDataIsValid(index)) {
        this.drawSector(index);
      }
    },
    draw() {
      // åˆ·æ–°å›¾ä¾‹
      const factor = this.factorDatas.factor[this.factorType];
      sector.clearSector();
      this.drawRoadMap(factor);
      this.drawMassMarks(factor);
    },
    // ç»˜åˆ¶3D走行路线图
    drawRoadMap(e) {
      this.factorDatas.refreshHeight(this.factorType);
      Layer.drawRoadMap(this.factorDatas, e, this.merge, this.setCenter);
      // }
    },
    drawMassMarks(e) {
      marks.drawMassMarks(this.factorDatas, e, (index) => {
        // æŸ¥è¯¢èŒƒå›´å†…的监测站点
        // SceneUtil.searchByCoordinate(lnglat[0], lnglat[1], distance);
        if (this.checkDataIsValid(index)) {
          this.drawSector(index);
        }
      });
      // è°ƒæ•´åœ°å›¾è§†è§’
      mapUtil.setBound(this.factorDatas.lnglats_GD);
    },
    drawSector(index) {
      // 1. ç»˜åˆ¶æ–°æ‰‡å½¢åŒºåŸŸ
      const pr = sector.drawSector(this.factorDatas, index);
      // è°ƒæ•´è§†è§’居中显示
      mapUtil.setFitSector(pr);
      // 2. ç»˜åˆ¶å¯¹è¯æ¡†
      DialogUtil.openNewWindow(this.factorDatas, index, () => {
        // ç§»é™¤æ‰‡å½¢åŒºåŸŸ
        sector.clearSector();
      });
    },
    onFetchData(type, data) {
      // todo æ ¹æ®è®¾å¤‡ç±»åž‹åˆ‡æ¢åœ°å›¾ç›‘测因子展示单选框、折线图复选框、数据表格复选框的因子类型
      this.deviceType = type;
      this.factorDatas.setData(data, this.drawMode, () => {
        this.factorDatas.refreshHeight(this.factorType);
        this.draw();
      });
    },
    fetchHistroyData(option) {
      const { deviceCode, type, timeArray } = option;
      let startTime, endTime;
      if (timeArray && timeArray.length == 2) {
        startTime = moment(timeArray[0]).format('YYYY-MM-DD HH:mm:ss');
        endTime = moment(timeArray[1]).format('YYYY-MM-DD HH:mm:ss');
      }
      this.fetchData((page, pageSize) => {
        return monitorDataApi
          .fetchHistroyData({
            deviceCode,
            startTime,
            endTime,
            page,
            perPage: pageSize
          })
          .then((res) => this.onFetchData(type, res.data));
      });
    },
    fetchRealTimeData() {
      // fixme 2024.5.3 æ­¤å¤„初始获取的数据,参数应该由searchbar决定,后续修改
      this.fetchData((page) => {
        return monitorDataApi
          .fetchHistroyData({
            deviceCode: '0a0000000001',
            // type: TYPE0,
            page,
            perPage: 100
          })
          .then((res) => {
            if (res.data.length > 0) {
              const s = new Date(res.data[0].time.replace(' ', 'T'));
              const e = new Date(
                res.data[res.data.length - 1].time.replace(' ', 'T')
              );
              this.searchTime = [s, e];
            }
            this.onFetchData(TYPE0, res.data);
          });
      });
    }
  },
  mounted() {
    this.fetchRealTimeData();
  },
  unmounted() {
    mapUtil.clearMap();
  }
};
</script>
<style scoped>
.top-wrap {
  height: 40px;
}
.trend-analysis {
  position: absolute;
  left: 0;
  bottom: 2px;
}
.data-sheet {
  position: absolute;
  right: 0;
  top: 0;
}
.historical {
  position: absolute;
  bottom: 10px;
  left: 0;
  right: 0;
}
</style>
src/views/historymode/HistoryMode.vue
@@ -52,14 +52,15 @@
import sector from '@/utils/map/sector';
import mapUtil from '@/utils/map/util';
import { DialogUtil } from '@/utils/map/dialog';
import monitorDataApi from '@/api/monitorDataApi';
import { useFetchData } from '@/composables/fetchData';
import moment from 'moment';
import { TYPE0 } from '@/constant/device-type';
import { radioOptions } from '@/constant/radio-options';
import { FactorDatas } from '@/model/FactorDatas';
import TrendAnalysis from './component/TrendAnalysis.vue';
import DataSheet from './component/DataSheet.vue';
import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
import { ElMessage } from 'element-plus';
import { fetchHistoryData } from '@/utils/factor/data';
export default {
  components: { TrendAnalysis, DataSheet },
@@ -71,8 +72,10 @@
    return {
      // ç›‘测设备类型
      deviceType: TYPE0,
      // ç›‘测设备编号
      deviceCode: '',
      // ç›‘测因子的类型编号
      factorType: '1',
      factorType: radioOptions(TYPE0)[0].value,
      // ç›‘测数据
      factorDatas: new FactorDatas(),
      // å†³å®šç»˜åˆ¶3D图形时是否与原图像合并
@@ -146,9 +149,10 @@
      // 1. ç»˜åˆ¶æ–°æ‰‡å½¢åŒºåŸŸ
      const pr = sector.drawSector(this.factorDatas, index);
      // è°ƒæ•´è§†è§’居中显示
      mapUtil.setFitSector(pr);
      mapUtil.setCenter(pr.p);
      // mapUtil.setFitSector(pr);
      // 2. ç»˜åˆ¶å¯¹è¯æ¡†
      DialogUtil.openNewWindow(this.factorDatas, index, () => {
      DialogUtil.openNewWindow(this.deviceCode, this.factorDatas, index, () => {
        // ç§»é™¤æ‰‡å½¢åŒºåŸŸ
        sector.clearSector();
      });
@@ -163,48 +167,45 @@
    },
    fetchHistroyData(option) {
      const { deviceCode, type, timeArray } = option;
      this.deviceCode = deviceCode;
      let startTime, endTime;
      if (timeArray && timeArray.length == 2) {
        startTime = moment(timeArray[0]).format('YYYY-MM-DD HH:mm:ss');
        endTime = moment(timeArray[1]).format('YYYY-MM-DD HH:mm:ss');
      }
      this.fetchData((page, pageSize) => {
        return monitorDataApi
          .fetchHistroyData({
            deviceCode,
            startTime,
            endTime,
            page,
            perPage: pageSize
          })
          .then((res) => this.onFetchData(type, res.data));
      });
    },
    fetchRealTimeData() {
      // fixme 2024.5.3 æ­¤å¤„初始获取的数据,参数应该由searchbar决定,后续修改
      this.fetchData((page) => {
        return monitorDataApi
          .fetchHistroyData({
            deviceCode: '0a0000000001',
            // type: TYPE0,
            page,
            perPage: 100
          })
          .then((res) => {
            if (res.data.length > 0) {
              const s = new Date(res.data[0].time.replace(' ', 'T'));
              const e = new Date(
                res.data[res.data.length - 1].time.replace(' ', 'T')
              );
              this.searchTime = [s, e];
            }
            this.onFetchData(TYPE0, res.data);
          });
        return fetchHistoryData({
          deviceCode,
          startTime,
          endTime,
          page,
          perPage: pageSize
        }).then((res) => this.onFetchData(type, res.data));
      });
    }
    // fetchRealTimeData() {
    //   // fixme 2024.5.3 æ­¤å¤„初始获取的数据,参数应该由searchbar决定,后续修改
    //   this.fetchData((page) => {
    //     return fetchHistoryData({
    //       deviceCode: '0a0000000001',
    //       // type: TYPE0,
    //       page,
    //       perPage: 100
    //     }).then((res) => {
    //       if (res.data.length > 0) {
    //         const s = new Date(res.data[0].time.replace(' ', 'T'));
    //         const e = new Date(
    //           res.data[res.data.length - 1].time.replace(' ', 'T')
    //         );
    //         this.searchTime = [s, e];
    //       }
    //       this.onFetchData(TYPE0, res.data);
    //     });
    //   });
    // }
  },
  mounted() {
    this.fetchRealTimeData();
    // this.fetchRealTimeData();
  },
  unmounted() {
    mapUtil.clearMap();
src/views/historymode/component/DataSheet.vue
@@ -41,7 +41,7 @@
<script>
// import { toRefs } from 'vue';
import { TYPE0 } from '@/constant/device-type';
import { checkboxOptions } from '@/constant/checkbox-options';
import { defaultFactorTypes } from '@/constant/checkbox-options';
import { FactorDatas } from '@/model/FactorDatas';
// import { useDefaultFactorType } from "../../../composables/defaultFactorType";
@@ -63,7 +63,7 @@
  },
  data() {
    return {
      selectFactorType: this.defaultFactorTypes(),
      selectFactorType: defaultFactorTypes(this.deviceType),
      show: false
    };
  },
@@ -71,21 +71,13 @@
  watch: {
    deviceType(nV, oV) {
      if (nV != oV) {
        this.selectFactorType = this.defaultFactorTypes();
        this.selectFactorType = defaultFactorTypes(nV);
      }
    }
  },
  methods: {
    handleTableClick(index) {
      this.$emit('tableClick', index);
    },
    defaultFactorTypes() {
      const list = checkboxOptions(this.deviceType);
      if (list.length > 3) {
        return list.slice(0, 3).map((v) => v.value);
      } else {
        return list.map((v) => v.value);
      }
    }
  }
};
src/views/historymode/component/TrendAnalysis.vue
@@ -1,7 +1,7 @@
<template>
  <el-row class="wrap">
    <Transition name="">
      <el-col v-show="show" span="10">
      <el-col v-show="show" span="10" class="wrap-left">
        <FactorCheckbox
          v-model="selectFactorType"
          :device-type="deviceType"
@@ -28,11 +28,14 @@
 * ç›‘测要素趋势分析
 */
import { FactorDatas } from '@/model/FactorDatas';
import { defaultFactorTypes } from '@/constant/checkbox-options';
import { TYPE0 } from '@/constant/device-type';
export default {
  props: {
    deviceType: {
      type: String
      type: String,
      default: TYPE0
    },
    factorDatas: FactorDatas,
    // å½“前选中高亮的数据点索引
@@ -40,11 +43,18 @@
  },
  data() {
    return {
      selectFactorType: ['1'],
      selectFactorType: defaultFactorTypes(this.deviceType, 1),
      show: true
    };
  },
  emits: ['chartClick'],
  watch: {
    deviceType(nV, oV) {
      if (nV != oV) {
        this.selectFactorType = defaultFactorTypes(nV, 1);
      }
    }
  },
  methods: {
    handleChartClick(index) {
      this.$emit('chartClick', index);
@@ -59,6 +69,11 @@
  /* background-color: aliceblue; */
}
.wrap-left {
  /* background-color: aliceblue; */
  min-width: 600px;
}
.slide-fade-enter-active {
  transition: all 0.3s ease-out;
}
src/views/realtimemode/RealtimeMode copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
<template>
  <div class="p-events-none m-t-2">
    <el-row justify="center" align="middle" class="top-wrap">
      <DeviceChange @change="onDeviceChange"></DeviceChange>
    </el-row>
    <el-row class="m-t-2">
      <FactorRadio
        :device-type="deviceType"
        @change="(e) => (factorType = e)"
      ></FactorRadio>
    </el-row>
    <el-row class="m-t-2">
      <FactorLegend
        class="m-t-2"
        :factor="factorDatas.factor[factorType]"
      ></FactorLegend>
    </el-row>
    <DashBoard class="dash-board" :factor-datas="factorDatas"></DashBoard>
    <RealTimeTrend
      class="real-time-trend"
      :factor-datas="factorDatas"
      :device-type="deviceType"
    ></RealTimeTrend>
  </div>
</template>
<script>
import { useFetchData } from '@/composables/fetchData';
import { TYPE0 } from '@/constant/device-type';
import { FactorDatas } from '@/model/FactorDatas';
import monitorDataApi from '@/api/monitorDataApi';
import DashBoard from './component/DashBoard.vue';
import RealTimeTrend from './component/RealTimeTrend.vue';
import DeviceChange from './component/DeviceChange.vue';
import { realTimeMapAnimation } from '@/utils/map/animation';
import { startLoopFetchRealTimeData } from '@/utils/factor/data';
// const mapAnimation = new MapAnimation();
export default {
  components: { DashBoard, RealTimeTrend, DeviceChange },
  setup() {
    const { loading, fetchData } = useFetchData(10000);
    return { loading, fetchData };
  },
  data() {
    return {
      // ç›‘测设备类型
      deviceType: TYPE0,
      deviceCode: '0a0000000001',
      // ç›‘测因子的类型编号
      factorType: '1',
      // æ–°èŽ·å–çš„ç›‘æµ‹æ•°æ®
      factorDatas: new FactorDatas(),
      // å…¨éƒ¨ç›‘测数据
      allFactorDatas: new FactorDatas()
    };
  },
  watch: {
    factorType(nV, oV) {
      if (nV != oV) {
        realTimeMapAnimation.setFactorType(nV);
      }
    }
  },
  computed: {
    latestTime() {
      if (this.factorDatas.times.length == 0) {
        return '';
      } else {
        return this.factorDatas.times[this.factorDatas.times.length - 1];
      }
    }
  },
  methods: {
    onDeviceChange({ type, deviceCode }) {
      this.deviceType = type;
      this.deviceCode = deviceCode;
      this.clearFetchingTask();
      realTimeMapAnimation.stop();
      this.allFactorDatas.clearData();
      this.factorDatas.clearData();
      this.notFirstFetch = false;
      this.fetchRealTimeData();
    },
    onFetchData(data) {
      // todo æ ¹æ®è®¾å¤‡ç±»åž‹åˆ‡æ¢åœ°å›¾ç›‘测因子展示单选框、折线图复选框、数据表格复选框的因子类型
      // this.deviceType = type;
      const fDatas = new FactorDatas();
      fDatas.setData(data, this.drawMode, () => {
        fDatas.refreshHeight(this.factorType);
        // this.draw();
        this.factorDatas = fDatas;
      });
    },
    fetchRealTimeData() {
      this.fetchData((page) => {
        return monitorDataApi
          .fetchHistroyData({
            deviceCode: this.deviceCode,
            // startTime: '2021-11-04 09:53:35',
            page,
            perPage: 100
          })
          .then((res) => {
            this.onFetchData(res.data);
            this.onMapData(res.data);
            this.fetchNextData();
          });
      });
    },
    clearFetchingTask() {
      if (this.fetchingTask) {
        clearInterval(this.fetchingTask);
        this.fetchingTask = undefined;
      }
    },
    fetchNextData() {
      this.clearFetchingTask();
      this.fetchingTask = setInterval(() => {
        if (this.isFetching) {
          return;
        }
        this.isFetching = true;
        this.fetchData(() => {
          return monitorDataApi
            .fetchNextData({
              deviceCode: this.deviceCode,
              updateTime: this.latestTime,
              perPage: 10
            })
            .then((res) => {
              this.onFetchData(res.data);
              this.onMapData(res.data);
            })
            .finally(() => (this.isFetching = false));
        });
      }, 10000);
    },
    onMapData(dataList) {
      let startIndex = this.allFactorDatas.length() - 1;
      if (!this.notFirstFetch) {
        startIndex = dataList.length - 2;
        this.notFirstFetch = true;
      }
      startIndex = startIndex < 0 ? 0 : startIndex;
      return new Promise((resolve, reject) => {
        this.allFactorDatas.addData(dataList, this.drawMode, () => {
          realTimeMapAnimation.moveAnimation(
            this.allFactorDatas,
            this.factorType,
            startIndex
          );
        });
      });
    }
  },
  mounted() {
    this.fetchRealTimeData();
    // startLoopFetchRealTimeData({
    //   compUser: 'user1',
    //   compPassword: 'User1@jingan',
    //   mn: 'TX105',
    //   dtFrom: '2024-08-07 10:00:00',
    //   dtTo: '2024-08-07 10:00:59'
    // });
  },
  unmounted() {
    this.clearFetchingTask();
    realTimeMapAnimation.stop();
  }
};
</script>
<style scoped>
.dash-board {
  position: absolute;
  left: 0;
  bottom: 2px;
}
.real-time-trend {
  position: absolute;
  right: 0;
  top: 0;
}
</style>
src/views/realtimemode/RealtimeMode.vue
@@ -25,14 +25,20 @@
</template>
<script>
import moment from 'moment';
import { useFetchData } from '@/composables/fetchData';
import { TYPE0 } from '@/constant/device-type';
import { radioOptions } from '@/constant/radio-options';
import { FactorDatas } from '@/model/FactorDatas';
import monitorDataApi from '@/api/monitorDataApi';
import DashBoard from './component/DashBoard.vue';
import RealTimeTrend from './component/RealTimeTrend.vue';
import DeviceChange from './component/DeviceChange.vue';
import { realTimeMapAnimation } from '@/utils/map/animation';
import {
  fetchHistoryData,
  startLoopFetchRealTimeData,
  clearFetchingTask
} from '@/utils/factor/data';
// const mapAnimation = new MapAnimation();
@@ -46,9 +52,9 @@
    return {
      // ç›‘测设备类型
      deviceType: TYPE0,
      deviceCode: '0a0000000001',
      deviceCode: '',
      // ç›‘测因子的类型编号
      factorType: '1',
      factorType: radioOptions(TYPE0)[0].value,
      // æ–°èŽ·å–çš„ç›‘æµ‹æ•°æ®
      factorDatas: new FactorDatas(),
      // å…¨éƒ¨ç›‘测数据
@@ -63,11 +69,13 @@
    }
  },
  computed: {
    // æ•°æ®æœ€æ–°æ—¶é—´ï¼ˆæœ€æ–°æ•°æ®çš„采样时间加1秒;没有数据时,采用当前时间的前6分钟)
    latestTime() {
      if (this.factorDatas.times.length == 0) {
        return '';
        return moment().subtract(6, 'm').format('YYYY-MM-DD HH:mm:ss');
      } else {
        return this.factorDatas.times[this.factorDatas.times.length - 1];
        const _time = this.factorDatas.times[this.factorDatas.times.length - 1];
        return moment(_time).add(1, 's').format('YYYY-MM-DD HH:mm:ss');
      }
    }
  },
@@ -93,50 +101,40 @@
      });
    },
    fetchRealTimeData() {
      // fixme 2024.5.3 æ­¤å¤„初始获取的数据,参数应该由searchbar决定,后续修改
      this.fetchData((page) => {
        return monitorDataApi
          .fetchHistroyData({
            deviceCode: this.deviceCode,
            // startTime: '2021-11-04 09:53:35',
            page,
            perPage: 100
          })
          .then((res) => {
            this.onFetchData(res.data);
            this.onMapData(res.data);
            this.fetchNextData();
          });
        return fetchHistoryData({
          deviceCode: this.deviceCode,
          // startTime: '2024-08-20 06:00:00',
          // endTime: '2024-08-20 06:02:00',
          page,
          perPage: 100
        }).then((res) => {
          this.onFetchData(res.data);
          this.onMapData(res.data);
          // if (res.data.length > 0) {
          //   this.fetchNextData(res.data[res.data.length - 1].time);
          // }
          this.fetchNextData();
        });
      });
    },
    clearFetchingTask() {
      if (this.fetchingTask) {
        clearInterval(this.fetchingTask);
        this.fetchingTask = undefined;
      }
      clearFetchingTask();
    },
    fetchNextData() {
      this.clearFetchingTask();
      this.fetchingTask = setInterval(() => {
        if (this.isFetching) {
          return;
      startLoopFetchRealTimeData(
        () => {
          return {
            deviceCode: this.deviceCode,
            updateTime: this.latestTime,
            perPage: 10
          };
        },
        (res) => {
          this.onFetchData(res.data);
          this.onMapData(res.data);
        }
        this.isFetching = true;
        this.fetchData(() => {
          return monitorDataApi
            .fetchNextData({
              deviceCode: this.deviceCode,
              updateTime: this.latestTime,
              perPage: 10
            })
            .then((res) => {
              this.onFetchData(res.data);
              this.onMapData(res.data);
            })
            .finally(() => (this.isFetching = false));
        });
      }, 10000);
      );
    },
    onMapData(dataList) {
      let startIndex = this.allFactorDatas.length() - 1;
@@ -157,12 +155,18 @@
    }
  },
  mounted() {
    this.fetchRealTimeData();
    // this.fetchRealTimeData();
    // startLoopFetchRealTimeData({
    //   compUser: 'user1',
    //   compPassword: 'User1@jingan',
    //   mn: 'TX105',
    //   dtFrom: '2024-08-07 10:00:00',
    //   dtTo: '2024-08-07 10:00:59'
    // });
  },
  unmounted() {
    this.clearFetchingTask();
    realTimeMapAnimation.stop();
    console.log('clear');
  }
};
</script>
src/views/realtimemode/component/DashBoard.vue
@@ -46,8 +46,13 @@
  },
  methods: {
    getFactorData(factorDatas, index, key, scale = 10) {
      let d = factorDatas.factor[key].datas[index].factorData;
      return Math.round(d * scale) / scale;
      const _factor = factorDatas.factor[key];
      if (_factor != undefined) {
        let d = _factor.datas[index].factorData;
        return Math.round(d * scale) / scale;
      } else {
        return '--';
      }
    },
    refresh(factorDatas, index) {
      this.temprature = this.getFactorData(factorDatas, index, '8') + '';
src/views/realtimemode/component/DeviceChange.vue
@@ -31,18 +31,22 @@
    handleClick() {
      this.$emit('change', this.formSearch);
    }
  },
  watch: {
    // formSearch(nV, oV) {
    //   if (nV != oV) {
    //     this.handleChange(nV[0].value);
    //   }
    // }
  },
  mounted() {
    this.$emit('change', this.formSearch);
  }
};
</script>
<style lang="scss">
.map-date-selector {
  display: inline-block;
  position: relative;
  /* left: 0;
      right: 0;
      top: 0px; */
  /* padding: 0 4px; */
  /* color: ffffffbd; */
  /* background-color: antiquewhite; */
<style scoped lang="scss">
.el-form-item {
  margin-bottom: 0px;
  margin-right: 8px !important;
}
</style>
src/views/realtimemode/component/RealTimeTrend.vue
@@ -30,6 +30,7 @@
</template>
<script>
import { TYPE0 } from '@/constant/device-type';
import { defaultFactorTypes } from '@/constant/checkbox-options';
import { FactorDatas } from '@/model/FactorDatas';
export default {
@@ -44,7 +45,7 @@
  },
  data() {
    return {
      selectFactorType: ['1', '2', '3'],
      selectFactorType: defaultFactorTypes(this.deviceType),
      show: true
    };
  }