diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000..a95941c
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,68 @@
+{
+ "extends": "eslint:recommended",
+ "env": {
+ "es6": true,
+ "browser": true
+ },
+ "parserOptions": {
+ "ecmaVersion": "latest",
+ "sourceType": "module"
+ },
+ "plugins": ["require-sort"],
+ "rules": {
+ "require-sort/require-sort": "warn",
+ "arrow-body-style": "warn",
+ "arrow-spacing": ["warn", { "before": true, "after": true }],
+ "brace-style": ["error", "1tbs", { "allowSingleLine": true }],
+ "comma-dangle": ["error", "always-multiline"],
+ "comma-spacing": "error",
+ "comma-style": "error",
+ "curly": ["error", "multi", "consistent"],
+ "dot-location": ["error", "property"],
+ "handle-callback-err": "off",
+ "indent": ["warn", 2, { "SwitchCase": 1}],
+ "key-spacing": ["warn", {
+ "beforeColon": false,
+ "afterColon": true,
+ "mode": "strict",
+ "align": {
+ "beforeColon": true,
+ "afterColon": true,
+ "on": "colon"
+ }
+ }],
+ "keyword-spacing": "error",
+ "max-nested-callbacks": ["error", { "max": 4 }],
+ "max-statements-per-line": ["error", { "max": 2 }],
+ "no-console": "off",
+ "no-constant-condition": ["error", { "checkLoops": false }],
+ "no-empty-function": "error",
+ "no-floating-decimal": "error",
+ "no-inline-comments": "error",
+ "no-irregular-whitespace": ["warn", { "skipTemplates": true }],
+ "no-lonely-if": "error",
+ "no-multi-spaces": "warn",
+ "no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }],
+ "no-shadow": ["error", { "allow": ["err", "resolve", "reject"] }],
+ "no-trailing-spaces": ["warn"],
+ "no-unused-vars": ["off"],
+ "no-var": "error",
+ "object-curly-spacing": ["warn", "always"],
+ "prefer-const": "error",
+ "prefer-arrow-callback": "error",
+ "quotes": ["warn", "double"],
+ "require-await": "error",
+ "semi": ["error", "always"],
+ "space-before-blocks": "error",
+ "space-before-function-paren": ["error", {
+ "anonymous": "never",
+ "named": "never",
+ "asyncArrow": "always"
+ }],
+ "space-in-parens": "error",
+ "space-infix-ops": "error",
+ "space-unary-ops": "error",
+ "spaced-comment": "error",
+ "yoda": "error"
+ }
+}
\ No newline at end of file
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..9d5a528
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,32 @@
+name: build
+
+on:
+ push:
+ branches: [ Release ]
+ pull_request:
+ branches: [ Release ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+
+ - name: Use Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: "20.x"
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build
+ run: npm run build
+
+ - name: Archive production artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: dist
+ path: dist/*
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 56cc642..6a7d6d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,85 +1,130 @@
-# Built application files
-*.apk
-*.aar
-*.ap_
-*.aab
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
-# Files for the ART/Dalvik VM
-*.dex
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
-# Java class files
-*.class
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
-# Generated files
-bin/
-gen/
-out/
-# Uncomment the following line in case you need and you don't have the release build type files in your app
-# release/
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
-# Gradle files
-.gradle/
-build/
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
-# Local configuration file (sdk path, etc)
-local.properties
+# nyc test coverage
+.nyc_output
-# Proguard folder generated by Eclipse
-proguard/
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
-# Log Files
-*.log
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variable files
+.env
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+.cache
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
-# Android Studio Navigation editor temp files
-.navigation/
-
-# Android Studio captures folder
-captures/
-
-# IntelliJ
-*.iml
-.idea/workspace.xml
-.idea/tasks.xml
-.idea/gradle.xml
-.idea/assetWizardSettings.xml
-.idea/dictionaries
-.idea/libraries
-# Android Studio 3 in .gitignore file.
-.idea/caches
-.idea/modules.xml
-# Comment next line if keeping position of elements in Navigation Editor is relevant for you
-.idea/navEditor.xml
-
-# Keystore files
-# Uncomment the following lines if you do not want to check your keystore files in.
-#*.jks
-#*.keystore
-
-# External native build folder generated in Android Studio 2.2 and later
-.externalNativeBuild
-.cxx/
-
-# Google Services (e.g. APIs or Firebase)
-# google-services.json
-
-# Freeline
-freeline.py
-freeline/
-freeline_project_description.json
-
-# fastlane
-fastlane/report.xml
-fastlane/Preview.html
-fastlane/screenshots
-fastlane/test_output
-fastlane/readme.md
-
-# Version control
-vcs.xml
-
-# lint
-lint/intermediates/
-lint/generated/
-lint/outputs/
-lint/tmp/
-# lint/reports/
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
\ No newline at end of file
diff --git a/.stylelintrc b/.stylelintrc
new file mode 100644
index 0000000..90e423d
--- /dev/null
+++ b/.stylelintrc
@@ -0,0 +1,77 @@
+{
+ "extends": ["stylelint-config-standard"],
+ "plugins": [
+ "stylelint-order"
+ ],
+ "rules": {
+ "order/order": [
+ "custom-properties",
+ "declarations"
+ ],
+ "order/properties-order": [
+ "all",
+ "content",
+ "display",
+ "flex",
+ "flex-basis",
+ "flex-grow",
+ "align-items",
+ "justtify-contents",
+ "grid-template-column",
+ "grid-template-row",
+ "flex-direction",
+ "gap",
+ "gap-column",
+ "gap-row",
+ "position",
+ "inset",
+ "top",
+ "left",
+ "bottom",
+ "right",
+ "height",
+ "width",
+ "aspect-ratio",
+ "margin",
+ "margin-top",
+ "margin-right",
+ "margin-bottom",
+ "margin-left",
+ "padding",
+ "padding-top",
+ "padding-right",
+ "padding-bottom",
+ "padding-left",
+ "border",
+ "border-top",
+ "border-right",
+ "border-bottom",
+ "border-left",
+ "border-radius",
+ "border-top-left-radius",
+ "border-top-right-radius",
+ "border-bottom-right-radius",
+ "border-bottom-left-radius",
+ "opacity",
+ "color",
+ "background-color",
+ "outline",
+ "text-align",
+ "text-decoration",
+ "font-family",
+ "font-weight",
+ "font-size",
+ "font-variant-numeric",
+ "line-height",
+ "white-space",
+ "overflow",
+ "overflow-x",
+ "overflow-y",
+ "cursor",
+ "pointer-event",
+ "isolation",
+ "z-index",
+ "transition"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/exptech/change.html b/exptech/change.html
deleted file mode 100644
index a6908aa..0000000
--- a/exptech/change.html
+++ /dev/null
@@ -1,217 +0,0 @@
-
-
-
- ExpTech | 更改密碼
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
更改密碼
-
更改 ExpTech 密碼
-
-
-
-
更改密碼成功
-
將在五秒後跳轉回登入畫面
-
-
- Discord 伺服器
-
-
-
-
-
-
\ No newline at end of file
diff --git a/exptech/check.html b/exptech/check.html
deleted file mode 100644
index 79cfcd3..0000000
--- a/exptech/check.html
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
-
- ExpTech | 註冊驗證
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
註冊驗證
-
註冊驗證 ExpTech 帳號
-
-
-
註冊成功
-
將在五秒後跳轉回登入畫面
-
-
-
-
無效註冊
-
將在五秒後跳轉回登入畫面
-
-
- Discord 伺服器
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/exptech/forget.html b/exptech/forget.html
deleted file mode 100644
index a571640..0000000
--- a/exptech/forget.html
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
- ExpTech | 忘記密碼
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
忘記密碼
-
忘記 ExpTech 密碼
-
-
-
-
發送成功
-
已寄驗證信到你電子郵件地址請查收
-
將在五秒後跳轉回登入畫面
-
-
-
-
無效註冊
-
將在五秒後跳轉回登入畫面
-
-
- Discord 伺服器
-
-
-
-
-
-
\ No newline at end of file
diff --git a/exptech/login.html b/exptech/login.html
deleted file mode 100644
index 26ed908..0000000
--- a/exptech/login.html
+++ /dev/null
@@ -1,335 +0,0 @@
-
-
-
- ExpTech | 登入
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
登入
-
登入管理你的 ExpTech 帳號
-
-
- Discord 伺服器
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/exptech/register.html b/exptech/register.html
deleted file mode 100644
index 8262f49..0000000
--- a/exptech/register.html
+++ /dev/null
@@ -1,182 +0,0 @@
-
-
-
- ExpTech | 註冊
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
註冊
-
註冊 ExpTech 帳號
-
-
-
-
發送成功
-
已寄驗證信到你電子郵件地址請查收
-
將在五秒後跳轉回登入畫面
-
-
- Discord 伺服器
-
-
-
-
-
-
\ No newline at end of file
diff --git a/exptech/user.css b/exptech/user.css
deleted file mode 100644
index 8d07151..0000000
--- a/exptech/user.css
+++ /dev/null
@@ -1,345 +0,0 @@
-@import url(https://fonts.googleapis.com/earlyaccess/cwtexyen.css);
-
-html,
-body {
- font-family: "cwTeXYen", sans-serif;
- user-select: none;
- background-color: #333439;
- color: white;
- margin: 0;
-}
-
-table {
- border-collapse: collapse;
- font-size: 0.8em;
- font-family: sans-serif;
- min-width: 400px;
- box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
- border-radius: 4px;
- overflow: hidden;
-}
-
-table>thead>tr {
- background-color: hsl(300deg 100% 30%);
- text-align: left;
-}
-
-table th,
-table td {
- color: #fff;
- padding: 8px 10px;
- text-align: center;
- border: 0.2px solid darkgray;
-}
-
-table>tbody>tr>td::after {
- display: block;
- content: attr(data-text);
- font-weight: bold;
- height: 0;
- overflow: hidden;
- visibility: hidden;
- pointer-events: none;
-}
-
-table>tbody>tr {
- background-color: hsl(300deg 100% 30% / 12%);
-}
-
-table>tbody>tr:nth-of-type(even) {
- background-color: hsl(300deg 100% 60% / 12%);
-}
-
-table>tbody>tr:last-of-type {
- border-bottom: 2px solid hsl(300deg 100% 30%);
-}
-
-table>tbody>tr:hover {
- font-weight: bold;
- color: hsl(300deg 100% 30%);
-}
-
-.index {
- height: 100%;
-}
-
-.index1 {
- padding-left: 10px;
- position: fixed;
-}
-
-.title {
- font-size: 24px;
- font-weight: 900;
- padding-left: 10px;
-}
-
-.subtitle {
- font-size: 16px;
- font-weight: 300;
- padding-left: 10px;
-}
-
-.note {
- border-radius: 5px;
- text-align: center;
- color: white;
- background-color: #333439;
- border: 2px solid white;
- outline: none;
- font-size: 20px;
-}
-
-.main {
- font-size: 30px;
- display: flex;
- height: 92%;
-}
-
-.load {
- font-size: 20px;
- padding: 5px;
- margin: 3px;
- border: 2px solid white;
- border-radius: 5px;
- background-color: dodgerblue;
- cursor: pointer;
-}
-
-.menu {
- width: 10%;
- text-align: center;
- position: fixed;
- left: 0;
- margin-top: 51px;
-}
-
-.menu1 {
- width: 10%;
-}
-
-.box {
- width: 90%;
- overflow: auto;
- height: calc(100vh - 60px);
- margin-top: 51px;
-}
-
-.menu-item {
- color: darkgrey;
- font-size: 40px;
- padding: 20px;
- margin: 10px;
- border: 2px solid white;
- border-radius: 5px;
- cursor: pointer;
-}
-
-.box-item {
- display: none;
- padding: 15px;
- height: 95%;
- overflow-y: auto;
-}
-
-.box-items {
- padding: 10px;
- margin: 5px;
- border-radius: 10px;
- border: 2px solid white;
- width: fit-content;
-}
-
-.Pay {
- font-size: 40px;
- font-weight: 900;
- border-radius: 5px;
- color: gold;
- background-color: #333439;
- border-color: gold;
- cursor: pointer;
- padding: 10px;
- margin: 5px;
-}
-
-.warn {
- color: gold;
- font-size: 24px;
- padding: 5px;
-}
-
-.a {
- font-size: 22px;
-}
-
-.a-title {
- font-size: 30px;
- font-weight: 600;
- padding: 3px;
-}
-
-.a-subtitle {
- font-size: 22px;
- font-weight: 300;
- padding: 2px;
- margin: 2px;
-}
-
-.a-body {
- font-size: 20px;
- padding: 2px;
- margin: 2px;
-}
-
-.tag {
- border: 1px solid white;
- border-radius: 5px;
- padding: 2px;
- margin: 2px;
- font-size: 18px;
-}
-
-.a-item {
- border: 0.5px solid grey;
- border-radius: 5px;
- padding: 10px;
- margin: 10px;
-}
-
-::selection {
- color: #fff;
- background: rgb(255 255 255 / 35%);
-}
-
-::-webkit-scrollbar {
- width: 6px;
- background-color: rgb(255 255 255 / 8%);
-}
-
-::-webkit-scrollbar-thumb {
- border-radius: 10px;
- background-color: gray;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background-color: rgb(255 255 255 / 32%);
-}
-
-::-webkit-scrollbar-thumb:active {
- background-color: rgb(255 255 255 / 8%);
-}
-
-.code-item {
- border: 2px solid grey;
- border-radius: 5px;
- padding: 10px;
- margin: 10px;
-}
-
-.code-title {
- font-size: 28px;
- font-weight: 900;
- padding: 2px;
-}
-
-.code-subtitle {
- font-size: 22px;
- font-weight: 300;
- padding: 2px;
-}
-
-.code-body {
- font-size: 20px;
- padding: 2px;
-}
-
-.studio {
- color: gold;
-}
-
-.info-item {
- border-radius: 5px;
- border: 2px solid grey;
- padding: 15px;
- margin: 10px;
-}
-
-.info-title {
- font-size: 32px;
- font-weight: 900;
-}
-
-.info-note {
- font-weight: 600;
- color: indianred;
-}
-
-.info-body {
- font-size: 24px;
- padding: 10px;
-}
-
-.info-end {
- font-size: 18px;
- padding: 5px;
- font-weight: 400;
-}
-
-.out {
- background-color: red;
- cursor: pointer;
- border-color: white;
- color: white;
- border-radius: 5px;
- font-size: 24px;
-}
-
-.info-box {
- padding: 10px;
- margin: 10px;
-}
-
-.link {
- display: flex;
- font-size: 24px;
- align-items: center;
- border: 0.5px solid gray;
- padding: 10px;
- margin: 10px;
- border-radius: 5px;
- cursor: pointer;
- width: fit-content;
-}
-
-.link:hover {
- background-color: black;
-}
-
-.link-text {
- padding-right: 5px;
-}
-
-.alert-box {
- position: absolute;
- width: 50%;
- height: 50%;
- top: 25%;
- left: 25%;
- background-color: rgb(75, 9, 9);
- border: 2px solid white;
- border-radius: 5px;
- color: white;
- padding: 15px;
- font-size: 28px;
-}
-
-.alert-box-button {
- background-color: darkblue;
- padding: 5px;
- margin: 10px;
- font-size: 24px;
- border-radius: 5px;
- border: 2px solid blue;
- width: fit-content;
- cursor: pointer;
-}
\ No newline at end of file
diff --git a/exptech/user.html b/exptech/user.html
deleted file mode 100644
index 1ddedc1..0000000
--- a/exptech/user.html
+++ /dev/null
@@ -1,624 +0,0 @@
-
-
-
- TREM Service Panel
-
-
-
-
-
-
-
-
-
-
-
-
ExpTech Studio
-
TREM Service Panel
-
-
-
-
-
-
-
-
-
-
-
- 說明 |
- API |
- 費用 |
- 服務 |
- 狀態 |
- 操作 |
-
-
-
-
-
-
- WebSocket 模式下可以收到「較穩定快速的地震預警」
-
-
-
-
-
-
-
-
-
-
-
- Key(前10位) |
- 創建時間 |
- 備註 |
- 操作 |
- 其他 |
-
-
-
-
-
-
-
-
-
-
- Key(前10位) |
- IP |
- 初次連線時間 |
- 最後連線時間 |
-
-
-
-
-
流量圖(近24小時)
-
-
流量統計列表(近24小時)
-
-
-
- 路徑 |
- 請求類型 |
- 服務類型 |
- 次數 |
-
-
-
-
-
-
-
-
-
-
- UUID(前10位) |
- IP |
- 連線時間 |
-
-
-
-
-
-
-
-
-
-
裝置列表(不計入客戶端連接數)
-
-
-
- EID |
- 型號 |
- IP |
- localIP |
- 版本 |
- SSID |
- RSSI |
- Mac地址 |
- 最後連線時間 |
- 測試 |
- 設定 |
-
-
-
-
-
-
-
-
TREM Lite
-
1.6.5(1.6.11) | Powered by whes1015
-
- TREM Lite 是一款開源地震速報軟體,提供給您即時的地震資訊,利用自製的測站,顯示各地的即時震度,在地震發生的第一時間取得各管道發布的強震即時警報訊息
-
-
-
下載 (Discord CDN)
-
-
-
-
-
-
TREM Plus
-
6.0.178 | Powered by yayacat
-
- 各式功能聚集在一起的 TREM 客戶端
-
-
-
-
-
RTS Map
-
0.0.16 | Powered by Kamiya
-
- Real Time Station Map 即時觀測點
-
-
-
下載 (Discord CDN)
-
-
-
-
-
TREM Web
-
Web | Powered by whes1015
-
- TREM 即時強震觀測網
-
-
-
-
-
TREM SDMD
-
Web | Powered by whes1015
-
- TREM Seismic Data Management System | TREM 地震資料管理系統
-
-
-
-
-
TREM Earthquake History
-
Web | Powered by whes1015、Kamiya
-
- TREM 地震檢知紀錄
-
-
-
-
-
CWB EEW History
-
Web | Powered by whes1015、Kamiya
-
- 中央氣象局(CWB) 地震預警紀錄
-
-
-
-
-
TREM Image
-
Web | Powered by whes1015
-
- TREM 圖像
-
-
-
-
-
-
-
TOS 服務條款
-
- 1. 通過使用服務 用戶被視為已
同意使用條款
- 2.
禁止未經允許的再分發 (開發團隊知情且允許的情況 不受此規範限制)
- 3. 禁止轉售 TREM 提供之資訊
- 4. 禁止違反法律法規或違反公共秩序和道德的行為
- 5. TREM 使用 P2P 技術傳遞資訊
- 6. 任何資訊均以
中央氣象局(CWB) 發布之內容為準
- 7. 所有非
中央氣象局(CWB) 所提供之資料及其衍生服務均被視為
進階功能
- 8. 不得於網路上傳播含「進階功能」之畫面 避免觸犯氣象法及造成社會大眾之誤導或錯誤理解其含義
- 9. 購買 進階功能 及表示接受其存在資訊錯誤的
風險 應在購買前
自行評估
- 我方一概不負責因上述原因所導致之一切後果
- 10. 除以上條款外 任何開發團隊合理認為不適當的行為均不被允許
-
-
ExpTech Studio | 2023年07月12日 初稿
-
-
-
資料來源
-
-
地震預警
-
-
- - 交通部中央氣象局 (CWB)
- - 日本気象庁 (JMA)
- - 防災科研 (NIED)
- - 中国四川省地震局 (SCDZJ)
- - 기상청 (KMA)
-
-
-
震度
-
-
- - 中央研究院 (SINICA)
- - 臺灣即時地震監測 (TREM)
-
-
-
-
-
-
貢獻者(Discord)
-
-
ExpTech Studio
-
-
- - whes1015
- - kamiya4047
- - yayacat
- - eggrollpvp
-
-
-
ExpTech Family
-
-
- - __ellan
- - xiaoan0711
- - yawp93125
- - yoyo0901
- - xd_pisces
- - tya8732
- - xtw.littlecat
- - cracks666666
- - liangliang5102
- - hy2seong
-
-
-
-
包括但不限於上述列出之用戶 因為有這些人的付出 TREM 才能越來越好
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/exptech/user.js b/exptech/user.js
deleted file mode 100644
index ad655dd..0000000
--- a/exptech/user.js
+++ /dev/null
@@ -1,744 +0,0 @@
-const urlSearchParams = new URLSearchParams(window.location.search);
-const params = Object.fromEntries(urlSearchParams.entries());
-if (!params.token) window.location.replace("./login.html");
-
-Chart.defaults.borderColor = "#36A2EB";
-Chart.defaults.color = "white";
-
-const menu_index = document.getElementById("menu-index");
-const menu_service = document.getElementById("menu-service");
-const menu_key = document.getElementById("menu-key");
-const menu_status = document.getElementById("menu-status");
-const menu_device = document.getElementById("menu-device");
-const menu_code = document.getElementById("menu-code");
-const menu_info = document.getElementById("menu-info");
-const box_index = document.getElementById("box-index");
-const box_service = document.getElementById("box-service");
-const box_key = document.getElementById("box-key");
-const box_status = document.getElementById("box-status");
-const box_device = document.getElementById("box-device");
-const box_code = document.getElementById("box-code");
-const box_info = document.getElementById("box-info");
-
-const table_service = document.getElementById("table-service");
-const table_device = document.getElementById("table-device");
-const table_status = document.getElementById("table-status");
-const table_key = document.getElementById("table-key");
-const table_api = document.getElementById("table-api");
-const table_equipment = document.getElementById("table-equipment");
-
-const create = document.getElementById("create");
-const note = document.getElementById("note");
-const announcement = document.getElementById("announcement");
-const ctx = document.getElementById("myChart");
-
-const alert_box = document.getElementById("alert-box");
-const index = document.getElementById("index");
-const eid = document.getElementById("eid");
-const device_setting_box = document.getElementById("device-setting");
-const device_config = document.getElementById("device-config");
-
-let client_limit = false;
-
-const a_type = [
- { text: "錯誤", color: "red" },
- { text: "已解決", color: "green" },
- { text: "影響: 小", color: "dimgrey" },
- { text: "影響: 中", color: "darkorange" },
- { text: "影響: 大", color: "purple" },
- { text: "公告", color: "darkblue" },
- { text: "維修", color: "darkkhaki" },
- { text: "測試", color: "darkcyan" },
- { text: "變更", color: "deeppink" },
- { text: "完成", color: "green" },
-];
-
-let service_list = [];
-let service_info = [];
-let user_info = {};
-let CTX;
-let config;
-
-document.getElementById("add-coin").onclick = () => {
- document.getElementById("info-page").style.display = "none";
- document.getElementById("pay-page").style.display = "";
-};
-
-document.getElementById("add-device").onclick = () => {
- fetch(`https://exptech.com.tw/api/v1/check?eid=${eid.value}&token=${params.token}`)
- .then(async res => {
- const ans = await res.text()
- eid.value = "";
- if (ans == "OK") alert("請在60秒內按下裝置上的確認按鈕\n直到燈號熄滅");
- else alert("未發現此裝置\n請檢查欲連接之裝置是否已連上網路");
- })
- .catch(err => {
- eid.value = "";
- console.error(err);
- const res = err.request.response;
- alert(res)
- });
-};
-
-function Pay(type) {
- document.getElementById("pay-page").style.display = "none";
- fetch(`https://exptech.com.tw/api/v1/et/pay?type=${type}&token=${params.token}`)
- .then(async res => {
- const data = await res.json();
- document.getElementById("TradeInfo").value = data.TradeInfo;
- document.getElementById("TradeSha").value = data.TradeSha;
- document.getElementById("Pay").style.display = "";
- })
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-}
-
-const time_string = (time) => {
- const now = new Date(time);
- let Now = now.getFullYear().toString();
- Now += "/";
- if ((now.getMonth() + 1) < 10) Now += "0" + (now.getMonth() + 1).toString();
- else Now += (now.getMonth() + 1).toString();
- Now += "/";
- if (now.getDate() < 10) Now += "0" + now.getDate().toString();
- else Now += now.getDate().toString();
- Now += " ";
- if (now.getHours() < 10) Now += "0" + now.getHours().toString();
- else Now += now.getHours().toString();
- Now += ":";
- if (now.getMinutes() < 10) Now += "0" + now.getMinutes().toString();
- else Now += now.getMinutes().toString();
- Now += ":";
- if (now.getSeconds() < 10) Now += "0" + now.getSeconds().toString();
- else Now += now.getSeconds().toString();
- return Now;
-};
-
-fetch("https://exptech.com.tw/api/v1/et/service-info")
- .then(async res => {
- const data = await res.json();
- service_list = data.list;
- service_info = data.info;
- load();
- })
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-
-const client_text = document.getElementById("client");
-const day_text = document.getElementById("day");
-
-function load() {
- for (const item of document.getElementsByClassName("load")) {
- item.style.backgroundColor = "grey";
- item.textContent = "資料更新中...";
- item.style.pointerEvents = "none";
- }
- fetch(`https://exptech.com.tw/api/v1/et/info?token=${params.token}`)
- .then(async res => {
- user_info = await res.json();
- if (Object.keys(user_info.client_list).length > user_info.client) {
- if (!client_limit) {
- client_limit = true;
- alert_box.style.display = "";
- index.style.display = "none";
- document.getElementById("alert-box-text").innerHTML = "已超出此帳戶限制之 客戶端連接數
可能導致此帳戶底下的設備 無法正常運作";
- }
- client_text.style.color = "purple";
- } else {
- client_limit = false;
- client_text.style.color = "white";
- }
- client_text.textContent = `${Object.keys(user_info.client_list).length}/${user_info.client}`;
- document.getElementById("coin").textContent = user_info.coin;
- document.getElementById("use").textContent = user_info.use;
- const day_count = Math.floor(user_info.coin / user_info.use);
- day_text.textContent = (!user_info.coin) ? "已用完" : (!user_info.use) ? "未使用" : `${day_count} 天`;
- day_text.style.color = (!user_info.coin) ? "purple" : (!user_info.use) ? "lightgray" : (day_count < 7) ? "purple" : "white";
- reload_service();
- reload_device();
- reload_status();
- reload_key();
- service_info_load();
- equipment_info_load();
- setTimeout(() => {
- for (const item of document.getElementsByClassName("load")) {
- item.style.backgroundColor = "dodgerblue";
- item.textContent = "資料更新";
- item.style.pointerEvents = "";
- item.onclick = () => {
- load();
- };
- }
- }, 5000);
- })
- .catch(err => window.location.replace("./login.html"));
- fetch("https://exptech.com.tw/api/v1/et/announcement")
- .then(async res => {
- const data = await res.json();
- const frag = new DocumentFragment();
- for (let i = 0; i < data.length; i++) {
- const box = document.createElement("div");
- box.className = "a-item";
-
- const title = document.createElement("div");
- title.className = "a-title";
- title.innerHTML = data[i].title;
-
- const tag = document.createElement("div");
- tag.className = "a-tag";
-
- for (let I = 0; I < data[i].type.length; I++) {
- const t = document.createElement("a");
- t.className = "tag";
- t.textContent = a_type[data[i].type[I]].text;
- t.style.backgroundColor = a_type[data[i].type[I]].color;
- tag.appendChild(t);
- }
-
- const subtitle = document.createElement("div");
- subtitle.className = "a-subtitle";
- subtitle.innerHTML = data[i].subtitle;
-
- const body = document.createElement("div");
- body.className = "a-body";
- body.innerHTML = data[i].body;
-
- box.appendChild(title);
- box.appendChild(tag);
- box.appendChild(subtitle);
- box.appendChild(body);
- frag.appendChild(box);
- }
-
- announcement.replaceChildren(frag);
- })
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-}
-
-function equipment_info_load() {
- const frag = new DocumentFragment();
- for (let i = 0; i < Object.keys(user_info.device_list).length; i++) {
- const id = Object.keys(user_info.device_list)[i];
- const box = document.createElement("tr");
-
- const eid = document.createElement("td");
- eid.textContent = id;
- eid.setAttribute("data-text", eid.textContent);
-
- const model = document.createElement("td");
- model.textContent = user_info.device_list[id].model;
- model.setAttribute("data-text", model.textContent);
-
- const IP = document.createElement("td");
- IP.textContent = user_info.device_list[id].IP;
- IP.setAttribute("data-text", IP.textContent);
-
- const ip = document.createElement("td");
- ip.textContent = user_info.device_list[id].ip;
- ip.setAttribute("data-text", ip.textContent);
-
- const ver = document.createElement("td");
- ver.textContent = user_info.device_list[id].ver;
- ver.setAttribute("data-text", ver.textContent);
-
- const ssid = document.createElement("td");
- ssid.textContent = user_info.device_list[id].ssid;
- ssid.setAttribute("data-text", ssid.textContent);
-
- const rssi = document.createElement("td");
- rssi.textContent = user_info.device_list[id].rssi;
- rssi.setAttribute("data-text", rssi.textContent);
-
- const mac = document.createElement("td");
- mac.textContent = user_info.device_list[id].mac;
- mac.setAttribute("data-text", mac.textContent);
-
- const time = document.createElement("td");
- time.textContent = time_string(user_info.device_list[id].time);
- time.setAttribute("data-text", time.textContent);
-
- const test = document.createElement("td");
- if (user_info.device_list[id].online) test.innerHTML = `測試`;
- else test.innerHTML = "離線";
- test.setAttribute("data-text", test.textContent);
-
- const set = document.createElement("td");
- if (user_info.device_list[id].online) set.innerHTML = `配置`;
- else set.innerHTML = "離線";
- set.setAttribute("data-text", set.textContent);
-
- box.appendChild(eid);
- box.appendChild(model);
- box.appendChild(IP);
- box.appendChild(ip);
- box.appendChild(ver);
- box.appendChild(ssid);
- box.appendChild(rssi);
- box.appendChild(mac);
- box.appendChild(time);
- box.appendChild(test);
- box.appendChild(set);
- frag.appendChild(box);
- }
-
- table_equipment.replaceChildren(frag);
-}
-
-function device_setting(id) {
- document.getElementById("config").textContent = `${id} Config`;
- config = {
- id: id,
- ssid: "exptech",
- pass: "1234567890",
- lat: "22.967286",
- lon: "120.2940045",
- site: "1",
- };
- config.ssid = user_info.device_list[id].ssid;
- if (user_info.device_list[id].pass) config.pass = user_info.device_list[id].pass;
- if (user_info.device_list[id].config) {
- if (user_info.device_list[id].config.lat) config.lat = user_info.device_list[id].config.lat;
- if (user_info.device_list[id].config.lon) config.lon = user_info.device_list[id].config.lon;
- if (user_info.device_list[id].config.site) config.site = user_info.device_list[id].config.site;
- }
- document.getElementById("ssid").value = config.ssid;
- document.getElementById("pass").value = config.pass;
- document.getElementById("lat").value = config.lat;
- document.getElementById("lon").value = config.lon;
- document.getElementById("site").value = config.site;
- device_setting_box.style.display = "";
-}
-
-document.getElementById("device-config").onclick = () => {
- config.ssid = document.getElementById("ssid").value;
- config.pass = document.getElementById("pass").value;
- config.lat = document.getElementById("lat").value;
- config.lon = document.getElementById("lon").value;
- config.site = document.getElementById("site").value;
- fetch("https://exptech.com.tw/api/v1/et", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ function: "send", type: "config", uuid: config.id, token: params.token, data: config }),
- })
- .then(async res => {
- const ans = await res.text();
- if (ans == "Success Sended!") {
- device_setting_box.style.display = "none";
- load();
- alert("已發送 [配置] 訊息");
- } else if (ans == "Client Close!") alert("裝置已斷開連接");
- else alert("未發現裝置");
- })
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-
-}
-
-document.getElementById("device-cancel").onclick = () => {
- device_setting_box.style.display = "none";
-}
-
-function test(id) {
- fetch("https://exptech.com.tw/api/v1/et", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ function: "send", type: "test", uuid: id, token: params.token, }),
- })
- .then(async res => {
- const ans = await res.text();
- if (ans == "Success Sended!") alert("已發送 [測試] 訊息");
- else if (ans == "Client Close!") alert("裝置已斷開連接");
- else alert("未發現裝置");
- })
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-}
-
-function service_info_load() {
- const amount = {};
-
- const Chart_data = {
- labels: [],
- datasets: [],
- };
-
- for (let i = 0; i < user_info.dump.length; i++) {
- Chart_data.labels.push(`${user_info.dump[i].hour.replace(" ", "日 ")}時`);
- for (let I = 0; I < Object.keys(user_info.dump[i].data).length; I++) {
- const type = Object.keys(user_info.dump[i].data)[I];
- if (!amount[type]) amount[type] = 0;
- amount[type] += user_info.dump[i].data[type];
- }
- }
-
- for (let i = 0; i < user_info.dump.length; i++)
- for (let I = 0; I < Object.keys(amount).length; I++) {
- const type = Object.keys(amount)[I];
- const c = user_info.dump[i].data[type] ?? 0;
- let find = false;
- for (let _i = 0; _i < Chart_data.datasets.length; _i++)
- if (Chart_data.datasets[_i].label == type) {
- find = true;
- Chart_data.datasets[_i].data.push(c);
- break;
- }
-
- if (!find) Chart_data.datasets.push({
- label: type,
- data: [c],
- backgroundColor: service_info[type]?.color ?? ColorCode(),
- });
- }
-
-
- const frag = new DocumentFragment();
- for (let i = 0; i < Object.keys(amount).length; i++) {
- const type = Object.keys(amount)[i];
- const box = document.createElement("tr");
-
- const path = document.createElement("td");
- path.textContent = type;
- path.setAttribute("data-text", path.textContent);
-
- const fun = document.createElement("td");
- fun.textContent = (type.startsWith("ws")) ? "WebSocket" : (type.startsWith("get")) ? "GET" : "POST";
- fun.setAttribute("data-text", fun.textContent);
-
- const service = document.createElement("td");
- service.textContent = service_info[type]?.service ?? "";
- service.setAttribute("data-text", service.textContent);
-
- const count = document.createElement("td");
- count.textContent = amount[type];
- count.setAttribute("data-text", count.textContent);
-
- box.appendChild(path);
- box.appendChild(fun);
- box.appendChild(service);
- box.appendChild(count);
- frag.appendChild(box);
- }
-
- table_api.replaceChildren(frag);
-
- if (!CTX) {
- CTX = new Chart(ctx, {
- type: "bar",
- data: Chart_data,
- options: {
- plugins: {
- title: {
- display: true,
- text: "ExpTech Service 流量圖 (點擊下方圖例可調整查看的服務類型)",
- },
- },
- responsive: true,
- scales: {
- x: {
- stacked: true,
- },
- y: {
- stacked: true,
- },
- },
- },
- });
- } else {
- CTX.data = Chart_data;
- CTX.update();
- }
-}
-
-function ColorCode() {
- const makingColorCode = "0123456789ABCDEF";
- let finalCode = "#";
- for (let counter = 0; counter < 6; counter++)
- finalCode = finalCode + makingColorCode[Math.floor(Math.random() * 16)];
- return finalCode;
-}
-
-function switch_service(type, status) {
- fetch(`https://exptech.com.tw/api/v1/et/${(!status) ? "subscribe" : "unsubscribe"}?token=${params.token}&type=${type}`)
- .then(res => load())
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-}
-
-function copy(key) {
- navigator.clipboard.writeText(key)
- .then(() => alert("金鑰已複製到剪貼板"))
- .catch(err => console.error(err));
-}
-
-function del(key) {
- fetch(`https://exptech.com.tw/api/v1/et/key-remove?token=${params.token}&key=${key}`)
- .then(res => load())
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-}
-
-function reload_key() {
- const frag = new DocumentFragment();
- for (let i = 0; i < Object.keys(user_info.key).length; i++) {
- const k = Object.keys(user_info.key)[i];
- const box = document.createElement("tr");
-
- const key = document.createElement("td");
- key.textContent = k.substring(0, 10);
- key.setAttribute("data-text", key.textContent);
-
- const time = document.createElement("td");
- time.textContent = time_string(user_info.key[k].time);
- time.setAttribute("data-text", time.textContent);
-
- const note = document.createElement("td");
- note.textContent = user_info.key[k].note;
- note.setAttribute("data-text", note.textContent);
-
- const action = document.createElement("td");
- action.innerHTML = `複製金鑰`;
- action.setAttribute("data-text", action.textContent);
-
- const del = document.createElement("td");
- del.innerHTML = `刪除金鑰`;
- del.setAttribute("data-text", del.textContent);
-
- box.appendChild(key);
- box.appendChild(time);
- box.appendChild(note);
- box.appendChild(action);
- box.appendChild(del);
- frag.appendChild(box);
- }
-
- table_key.replaceChildren(frag);
-}
-
-function reload_status() {
- const frag = new DocumentFragment();
- for (let i = 0; i < Object.keys(user_info.key_list).length; i++) {
- const k = Object.keys(user_info.key_list)[i];
- const box = document.createElement("tr");
-
- const key = document.createElement("td");
- key.textContent = k.substring(0, 10);
- key.setAttribute("data-text", key.textContent);
-
- const ip = document.createElement("td");
- ip.textContent = user_info.key_list[k].ip;
- ip.setAttribute("data-text", ip.textContent);
-
- const first = document.createElement("td");
- first.textContent = time_string(user_info.key_list[k].start);
- first.setAttribute("data-text", first.textContent);
-
- const last = document.createElement("td");
- last.textContent = time_string(user_info.key_list[k].time);
- last.setAttribute("data-text", last.textContent);
-
- box.appendChild(key);
- box.appendChild(ip);
- box.appendChild(first);
- box.appendChild(last);
- frag.appendChild(box);
- }
-
- table_status.replaceChildren(frag);
-}
-
-function reload_device() {
- const frag = new DocumentFragment();
- for (let i = 0; i < Object.keys(user_info.client_list).length; i++) {
- const id = Object.keys(user_info.client_list)[i];
- const box = document.createElement("tr");
-
- const uuid = document.createElement("td");
- uuid.textContent = id.substring(0, 10);
- uuid.setAttribute("data-text", uuid.textContent);
-
- const ip = document.createElement("td");
- ip.textContent = user_info.client_list[id].ip;
- ip.setAttribute("data-text", ip.textContent);
-
- const first = document.createElement("td");
- first.textContent = time_string(user_info.client_list[id].time);
- first.setAttribute("data-text", first.textContent);
-
- box.appendChild(uuid);
- box.appendChild(ip);
- box.appendChild(first);
- frag.appendChild(box);
- }
-
- table_device.replaceChildren(frag);
-}
-
-function reload_service() {
- const frag = new DocumentFragment();
- for (let i = 0; i < service_list.length; i++) {
- const item = service_list[i];
- const box = document.createElement("tr");
-
- const name = document.createElement("td");
- name.textContent = item.name;
- name.setAttribute("data-text", name.textContent);
-
- const api = document.createElement("td");
- api.textContent = item.api;
- api.setAttribute("data-text", api.textContent);
-
- const coin = document.createElement("td");
- coin.textContent = `${item.coin} 硬幣/天`;
- coin.setAttribute("data-text", coin.textContent);
-
- const service = document.createElement("td");
- const ser = user_info.service?.includes(item.api);
- service.textContent = (ser || typeof item.type == "boolean") ? "服務中" : "未提供";
- service.style.backgroundColor = (ser || typeof item.type == "boolean") ? "green" : "red";
- service.setAttribute("data-text", service.textContent);
-
- const status = document.createElement("td");
- const sub = user_info.subscribe?.includes(item.api);
- if (!sub) user_info.service?.includes(item.api);
- if (item.type && typeof item.type == "string") status.textContent = (sub) ? "已訂閱" : "未訂閱";
- if (item.type && typeof item.type == "string") status.style.backgroundColor = (sub) ? "green" : "red";
- status.setAttribute("data-text", status.textContent);
-
- const type = document.createElement("td");
- if (item.type && typeof item.type == "string") type.innerHTML = `${(sub) ? "取消" : "訂閱"}`;
- type.setAttribute("data-text", type.textContent);
-
- box.appendChild(name);
- box.appendChild(api);
- box.appendChild(coin);
- box.appendChild(service);
- box.appendChild(status);
- box.appendChild(type);
- frag.appendChild(box);
- }
-
- table_service.replaceChildren(frag);
-}
-
-create.onclick = () => {
- fetch("https://exptech.com.tw/api/v1/et/key-add", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- token: params.token,
- note: note.value,
- }),
- })
- .then(res => {
- load();
- note.value = "";
- })
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-};
-
-menu_index.onclick = () => {
- for (const item of document.getElementsByClassName("menu-item"))
- item.style.color = "darkgrey";
- menu_index.style.color = "white";
- for (const item of document.getElementsByClassName("box-item"))
- item.style.display = "none";
- box_index.style.display = "block";
- document.getElementById("info-page").style.display = "";
- document.getElementById("pay-page").style.display = "none";
- document.getElementById("Pay").style.display = "none";
-};
-menu_service.onclick = () => {
- for (const item of document.getElementsByClassName("menu-item"))
- item.style.color = "darkgrey";
- menu_service.style.color = "white";
- for (const item of document.getElementsByClassName("box-item"))
- item.style.display = "none";
- box_service.style.display = "block";
-};
-menu_key.onclick = () => {
- for (const item of document.getElementsByClassName("menu-item"))
- item.style.color = "darkgrey";
- menu_key.style.color = "white";
- for (const item of document.getElementsByClassName("box-item"))
- item.style.display = "none";
- box_key.style.display = "block";
-};
-menu_status.onclick = () => {
- for (const item of document.getElementsByClassName("menu-item"))
- item.style.color = "darkgrey";
- menu_status.style.color = "white";
- for (const item of document.getElementsByClassName("box-item"))
- item.style.display = "none";
- box_status.style.display = "block";
-};
-menu_device.onclick = () => {
- for (const item of document.getElementsByClassName("menu-item"))
- item.style.color = "darkgrey";
- menu_device.style.color = "white";
- for (const item of document.getElementsByClassName("box-item"))
- item.style.display = "none";
- box_device.style.display = "block";
-};
-menu_code.onclick = () => {
- for (const item of document.getElementsByClassName("menu-item"))
- item.style.color = "darkgrey";
- menu_code.style.color = "white";
- for (const item of document.getElementsByClassName("box-item"))
- item.style.display = "none";
- box_code.style.display = "block";
-};
-menu_info.onclick = () => {
- for (const item of document.getElementsByClassName("menu-item"))
- item.style.color = "darkgrey";
- menu_info.style.color = "white";
- for (const item of document.getElementsByClassName("box-item"))
- item.style.display = "none";
- box_info.style.display = "block";
-};
-
-document.getElementById("out").onclick = () => {
- fetch(`https://exptech.com.tw/api/v1/et/logout?token=${params.token}`)
- .then(res => window.location.replace("./login.html"))
- .catch(err => {
- console.error(err);
- const res = err.request.response;
- alert(res);
- });
-};
-
-function link(url) {
- window.open(`https://${url}`, "_blank");
-}
-
-setInterval(() => load(), 60_000);
-
-document.getElementById("alert-box-button").onclick = () => {
- index.style.display = "";
- alert_box.style.display = "none";
-}
\ No newline at end of file
diff --git a/exptech/utils.css b/exptech/utils.css
deleted file mode 100644
index 6d5309e..0000000
--- a/exptech/utils.css
+++ /dev/null
@@ -1,356 +0,0 @@
-@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+TC&display=swap');
-
-:root {
- --background: 48deg, 83%, 98%;
- --on-background: 72deg, 10%, 10%;
- --primary: 70deg, 100%, 20%;
- --on-primary: 0deg, 0%, 100%;
- --primary-container: 72deg, 76%, 71%;
- --on-primary-container: 74deg, 100%, 6%;
- --secondary-container: 69deg, 41%, 83%;
- --on-secondary-container: 71deg, 57%, 7%;
- --outline: 64deg, 6%, 44%;
- --on-surface: 72deg, 10%, 10%;
- --surface-variant: 64deg, 24%, 86%;
- --on-surface-variant: 70deg, 9%, 26%;
- --error: 0deg, 75%, 42%;
- --medium: 47deg, 100%, 23%;
- --strong: 72deg, 100%, 20%;
- --very-strong: 300deg, 76%, 37%;
-}
-
-.view {
- width: 400px;
- transition: opacity 100ms ease-in-out;
-}
-
-#form-view {
- opacity: 1;
-}
-
-#success-view {
- display: none;
- opacity: 0;
-}
-
-#invaild-view {
- display: none;
- opacity: 0;
-}
-
-.check-mark {
- display: block;
- margin: 32px auto;
- fill: hsl(var(--primary));
-}
-
-.no-entry {
- display: block;
- margin: 32px auto;
-}
-
-.success-title {
- color: hsl(var(--on-surface-variant));
-}
-
-.success-description {
- margin: 8px;
- text-align: center;
- font-size: 16px;
- line-height: 18px;
- color: hsl(var(--outline));
-}
-
-body {
- display: grid;
- align-items: center;
- justify-content: center;
- padding: 0;
- margin: 0;
- height: 100svh;
- line-height: 18px;
- background-color: hsl(var(--background));
- color: hsl(var(--on-background));
- user-select: none;
- font-family: "Noto Sans TC", sans-serif;
- overflow-x: hidden;
-}
-
-#container {
- position: relative;
- width: 400px;
- padding: 48px 36px;
- padding-left: 28px;
- background-color: hsla(var(--primary), 0.04);
- outline: 1px solid hsl(var(--surface-variant));
- box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1);
- border-radius: 8px;
- transition: height 100ms ease-in-out;
-}
-
-.title {
- font-size: 24px;
- line-height: 26px;
- font-weight: bold;
- text-align: center;
- margin-bottom: 8px;
-}
-
-.description {
- text-align: center;
- margin: 16px;
-}
-
-.register-form {
- display: table;
- margin: 0;
- width: 100%;
-}
-
-.form-item-container {
- margin-left: 8px;
- margin-bottom: 32px;
-}
-
-.form-item {
- display: flex;
- flex-direction: column;
- margin-bottom: 12px;
-}
-
-.form-item {
- margin-bottom: 12px;
-}
-
-label {
- font-size: 14px;
- line-height: 16px;
- padding: 8px 0;
- color: hsl(var(--on-surface-variant));
-}
-
-input[type=text],
-input[type=password],
-input[type=email] {
- all: unset;
- flex: 1;
- padding: 12px;
- font-size: 14px;
- line-height: 16px;
- border-radius: 4px;
- outline: 1px solid hsla(var(--outline), .4);
- transition: outline .1s ease-in-out;
-}
-
-input[type=text]:disabled,
-input[type=password]:disabled,
-input[type=email]:disabled {
- outline: 1px solid hsla(var(--on-surface-variant), .12);
- color: hsla(var(--on-surface-variant), .38);
- cursor: not-allowed;
-}
-
-input[type=text]:not(:disabled):hover,
-input[type=password]:not(:disabled):hover,
-input[type=email]:not(:disabled):hover {
- outline-color: hsl(var(--on-surface-variant));
-}
-
-input[type=text]:not(:disabled):active,
-input[type=password]:not(:disabled):active,
-input[type=email]:not(:disabled):active {
- opacity: 0.8;
-}
-
-input[type=text]:not(:disabled):focus,
-input[type=password]:not(:disabled):focus,
-input[type=email]:not(:disabled):focus {
- outline: 2px solid hsl(var(--primary));
- background-color: hsla(var(--primary), .08);
- color: hsl(var(--on-primary-container));
-}
-
-input[type=text]::placeholder,
-input[type=password]::placeholder,
-input[type=email]::placeholder {
- color: hsla(var(--on-surface-variant), .6)
-}
-
-.input-action {
- display: flex;
-}
-
-#password-strength {
- position: relative;
- display: none;
- height: 4px;
- margin-top: 12px;
- margin-bottom: 32px;
- background-color: hsl(var(--surface-variant));
- border-radius: 4px;
-}
-
-#password-strength::before {
- position: absolute;
- height: 100%;
- width: 100%;
- border-radius: 4px;
- content: "";
- background-color: transparent;
- transition: width .1s ease-in-out,
- background-color .1s ease-in-out;
-}
-
-#password-strength::after {
- position: absolute;
- top: 100%;
- margin: 8px 0;
- content: "";
- font-size: 14px;
- line-height: 16px;
- font-weight: bold;
- transition: color .1s ease-in-out;
-}
-
-#password-strength.error::before {
- background-color: hsl(var(--error));
- color: hsl(var(--error));
-}
-
-#password-strength.weak::before {
- width: 25%;
- background-color: hsl(var(--outline));
- color: hsl(var(--outline));
-}
-
-#password-strength.medium::before {
- width: 50%;
- background-color: hsl(var(--medium));
- color: hsl(var(--medium));
-}
-
-#password-strength.strong::before {
- width: 75%;
- background-color: hsl(var(--strong));
- color: hsl(var(--strong));
-}
-
-#password-strength.very-strong::before {
- width: 100%;
- background-color: hsl(var(--very-strong));
- color: hsl(var(--very-strong));
-}
-
-#password-strength.error::after {
- color: hsl(var(--error));
-}
-
-#password-strength.empty::after {
- content: "密碼不得為空";
-}
-
-#password-strength.invalid::after {
- content: "密碼只能包含大小寫半形英數、 _ 、 . 、- 和 @";
-}
-
-#password-strength.weak::after {
- width: 25%;
- content: "密碼強度:弱";
- color: hsl(var(--outline));
-}
-
-#password-strength.medium::after {
- width: 50%;
- content: "密碼強度:中等";
- color: hsl(var(--medium));
-}
-
-#password-strength.strong::after {
- width: 75%;
- content: "密碼強度:強";
- color: hsl(var(--strong));
-}
-
-#password-strength.very-strong::after {
- width: 100%;
- content: "密碼強度:非常強";
- color: hsl(var(--very-strong));
-}
-
-#login {
- all: unset;
- padding: 10px 8px;
- background-color: transparent;
- color: hsl(var(--primary));
- border-radius: 4px;
- font-size: 16px;
- line-height: 18px;
- font-weight: bold;
- transition: background-color .1s ease-in-out,
- opacity .1s ease-in-out;
-}
-
-#login:hover {
- background-color: hsla(var(--primary), 0.12);
-}
-
-#submit {
- all: unset;
- padding: 10px 24px;
- background-color: hsl(var(--primary));
- color: hsl(var(--on-primary));
- border-radius: 4px;
- font-size: 16px;
- line-height: 18px;
- font-weight: bold;
- float: right;
- transition: background-color .1s ease-in-out,
- color .1s ease-in-out,
- opacity .1s ease-in-out;
-}
-
-#submit:disabled {
- background-color: hsla(var(--on-surface), .12);
- color: hsla(var(--on-surface), .38);
- cursor: not-allowed;
-}
-
-.info {
- display: inline-block;
- margin: 16px;
- font-size: 14px;
- line-height: 16px;
- color: hsla(var(--on-surface-variant), .6);
- text-decoration: none;
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --background: 72deg, 10%, 10%;
- --on-background: 48deg, 83%, 98%;
- --primary: 72deg, 53%, 61%;
- --on-primary: 72deg, 100%, 10%;
- --primary-container: 71deg, 100%, 15%;
- --on-primary-container: 72deg, 76%, 71%;
- --secondary-container: 72deg, 21%, 24%;
- --on-secondary-container: 69deg, 41%, 83%;
- --outline: 64deg, 6%, 54%;
- --on-surface: 48deg, 16%, 87%;
- --surface-variant: 70deg, 9%, 26%;
- --on-surface-variant: 64deg, 13%, 75%;
- --error: 6deg, 100%, 84%;
- --medium: 47deg, 88%, 51%;
- --strong: 71deg, 100%, 42%;
- --very-strong: 308deg, 100%, 83%;
- }
-
- ::-ms-reveal {
- filter: invert(100%);
- }
-}
-
-@media screen and (max-width: 768px) {
- #container {
- width: auto;
- }
-}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..a3b0994
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6010 @@
+{
+ "name": "exptech-service-web",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "exptech-service-web",
+ "version": "1.0.0",
+ "license": "AGPL-3.0",
+ "devDependencies": {
+ "@parcel/transformer-pug": "^2.9.3",
+ "@parcel/transformer-sass": "^2.9.3",
+ "eslint": "^8.44.0",
+ "eslint-plugin-require-sort": "^1.3.0",
+ "parcel": "^2.9.3",
+ "stylelint": "^15.10.1",
+ "stylelint-config-standard": "^34.0.0",
+ "stylelint-order": "^6.0.3"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+ "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+ "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.22.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
+ "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
+ "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.0.tgz",
+ "integrity": "sha512-dTKSIHHWc0zPvcS5cqGP+/TPFUJB0ekJ9dGKvMAFoNuBFhDPBt9OMGNZiIA5vTiNdGHHBeScYPXIGBMnVOahsA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^2.1.1"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz",
+ "integrity": "sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ },
+ "node_modules/@csstools/media-query-list-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.2.tgz",
+ "integrity": "sha512-M8cFGGwl866o6++vIY7j1AKuq9v57cf+dGepScwCcbut9ypJNr4Cj+LLTWligYUZ0uyhEoJDKt5lvyBfh2L3ZQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^2.3.0",
+ "@csstools/css-tokenizer": "^2.1.1"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz",
+ "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.13"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
+ "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
+ "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
+ "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+ "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@lezer/common": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz",
+ "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==",
+ "dev": true
+ },
+ "node_modules/@lezer/lr": {
+ "version": "0.15.8",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz",
+ "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==",
+ "dev": true,
+ "dependencies": {
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "node_modules/@lmdb/lmdb-darwin-arm64": {
+ "version": "2.7.11",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.7.11.tgz",
+ "integrity": "sha512-r6+vYq2vKzE+vgj/rNVRMwAevq0+ZR9IeMFIqcSga+wMtMdXQ27KqQ7uS99/yXASg29bos7yHP3yk4x6Iio0lw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-darwin-x64": {
+ "version": "2.7.11",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.7.11.tgz",
+ "integrity": "sha512-jhj1aB4K8ycRL1HOQT5OtzlqOq70jxUQEWRN9Gqh3TIDN30dxXtiHi6EWF516tzw6v2+3QqhDMJh8O6DtTGG8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-arm": {
+ "version": "2.7.11",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.7.11.tgz",
+ "integrity": "sha512-dHfLFVSrw/v5X5lkwp0Vl7+NFpEeEYKfMG2DpdFJnnG1RgHQZngZxCaBagFoaJGykRpd2DYF1AeuXBFrAUAXfw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-arm64": {
+ "version": "2.7.11",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.7.11.tgz",
+ "integrity": "sha512-7xGEfPPbmVJWcY2Nzqo11B9Nfxs+BAsiiaY/OcT4aaTDdykKeCjvKMQJA3KXCtZ1AtiC9ljyGLi+BfUwdulY5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-x64": {
+ "version": "2.7.11",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.7.11.tgz",
+ "integrity": "sha512-vUKI3JrREMQsXX8q0Eq5zX2FlYCKWMmLiCyyJNfZK0Uyf14RBg9VtB3ObQ41b4swYh2EWaltasWVe93Y8+KDng==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-win32-x64": {
+ "version": "2.7.11",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.7.11.tgz",
+ "integrity": "sha512-BJwkHlSUgtB+Ei52Ai32M1AOMerSlzyIGA/KC4dAGL+GGwVMdwG8HGCOA2TxP3KjhbgDPMYkv7bt/NmOmRIFng==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mischnic/json-sourcemap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz",
+ "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==",
+ "dev": true,
+ "dependencies": {
+ "@lezer/common": "^0.15.7",
+ "@lezer/lr": "^0.15.4",
+ "json5": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz",
+ "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz",
+ "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz",
+ "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz",
+ "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz",
+ "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz",
+ "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@parcel/bundler-default": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.9.3.tgz",
+ "integrity": "sha512-JjJK8dq39/UO/MWI/4SCbB1t/qgpQRFnFDetAAAezQ8oN++b24u1fkMDa/xqQGjbuPmGeTds5zxGgYs7id7PYg==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/graph": "2.9.3",
+ "@parcel/hash": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/cache": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.9.3.tgz",
+ "integrity": "sha512-Bj/H2uAJJSXtysG7E/x4EgTrE2hXmm7td/bc97K8M9N7+vQjxf7xb0ebgqe84ePVMkj4MVQSMEJkEucXVx4b0Q==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/fs": "2.9.3",
+ "@parcel/logger": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "lmdb": "2.7.11"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.9.3"
+ }
+ },
+ "node_modules/@parcel/codeframe": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.9.3.tgz",
+ "integrity": "sha512-z7yTyD6h3dvduaFoHpNqur74/2yDWL++33rjQjIjCaXREBN6dKHoMGMizzo/i4vbiI1p9dDox2FIDEHCMQxqdA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/compressor-raw": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.9.3.tgz",
+ "integrity": "sha512-jz3t4/ICMsHEqgiTmv5i1DJva2k5QRpZlBELVxfY+QElJTVe8edKJ0TiKcBxh2hx7sm4aUigGmp7JiqqHRRYmA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/config-default": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.9.3.tgz",
+ "integrity": "sha512-tqN5tF7QnVABDZAu76co5E6N8mA9n8bxiWdK4xYyINYFIEHgX172oRTqXTnhEMjlMrdmASxvnGlbaPBaVnrCTw==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/bundler-default": "2.9.3",
+ "@parcel/compressor-raw": "2.9.3",
+ "@parcel/namer-default": "2.9.3",
+ "@parcel/optimizer-css": "2.9.3",
+ "@parcel/optimizer-htmlnano": "2.9.3",
+ "@parcel/optimizer-image": "2.9.3",
+ "@parcel/optimizer-svgo": "2.9.3",
+ "@parcel/optimizer-swc": "2.9.3",
+ "@parcel/packager-css": "2.9.3",
+ "@parcel/packager-html": "2.9.3",
+ "@parcel/packager-js": "2.9.3",
+ "@parcel/packager-raw": "2.9.3",
+ "@parcel/packager-svg": "2.9.3",
+ "@parcel/reporter-dev-server": "2.9.3",
+ "@parcel/resolver-default": "2.9.3",
+ "@parcel/runtime-browser-hmr": "2.9.3",
+ "@parcel/runtime-js": "2.9.3",
+ "@parcel/runtime-react-refresh": "2.9.3",
+ "@parcel/runtime-service-worker": "2.9.3",
+ "@parcel/transformer-babel": "2.9.3",
+ "@parcel/transformer-css": "2.9.3",
+ "@parcel/transformer-html": "2.9.3",
+ "@parcel/transformer-image": "2.9.3",
+ "@parcel/transformer-js": "2.9.3",
+ "@parcel/transformer-json": "2.9.3",
+ "@parcel/transformer-postcss": "2.9.3",
+ "@parcel/transformer-posthtml": "2.9.3",
+ "@parcel/transformer-raw": "2.9.3",
+ "@parcel/transformer-react-refresh-wrap": "2.9.3",
+ "@parcel/transformer-svg": "2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.9.3"
+ }
+ },
+ "node_modules/@parcel/core": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.9.3.tgz",
+ "integrity": "sha512-4KlM1Zr/jpsqWuMXr2zmGsaOUs1zMMFh9vfCNKRZkptf+uk8I3sugHbNdo+F5B+4e2yMuOEb1zgAmvJLeuH6ww==",
+ "dev": true,
+ "dependencies": {
+ "@mischnic/json-sourcemap": "^0.1.0",
+ "@parcel/cache": "2.9.3",
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/events": "2.9.3",
+ "@parcel/fs": "2.9.3",
+ "@parcel/graph": "2.9.3",
+ "@parcel/hash": "2.9.3",
+ "@parcel/logger": "2.9.3",
+ "@parcel/package-manager": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/profiler": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/types": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "@parcel/workers": "2.9.3",
+ "abortcontroller-polyfill": "^1.1.9",
+ "base-x": "^3.0.8",
+ "browserslist": "^4.6.6",
+ "clone": "^2.1.1",
+ "dotenv": "^7.0.0",
+ "dotenv-expand": "^5.1.0",
+ "json5": "^2.2.0",
+ "msgpackr": "^1.5.4",
+ "nullthrows": "^1.1.1",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/diagnostic": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.9.3.tgz",
+ "integrity": "sha512-6jxBdyB3D7gP4iE66ghUGntWt2v64E6EbD4AetZk+hNJpgudOOPsKTovcMi/i7I4V0qD7WXSF4tvkZUoac0jwA==",
+ "dev": true,
+ "dependencies": {
+ "@mischnic/json-sourcemap": "^0.1.0",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/events": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.9.3.tgz",
+ "integrity": "sha512-K0Scx+Bx9f9p1vuShMzNwIgiaZUkxEnexaKYHYemJrM7pMAqxIuIqhnvwurRCsZOVLUJPDDNJ626cWTc5vIq+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/fs": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.9.3.tgz",
+ "integrity": "sha512-/PrRKgCRw22G7rNPSpgN3Q+i2nIkZWuvIOAdMG4KWXC4XLp8C9jarNaWd5QEQ75amjhQSl3oUzABzkdCtkKrgg==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/fs-search": "2.9.3",
+ "@parcel/types": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "@parcel/watcher": "^2.0.7",
+ "@parcel/workers": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.9.3"
+ }
+ },
+ "node_modules/@parcel/fs-search": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.9.3.tgz",
+ "integrity": "sha512-nsNz3bsOpwS+jphcd+XjZL3F3PDq9lik0O8HPm5f6LYkqKWT+u/kgQzA8OkAHCR3q96LGiHxUywHPEBc27vI4Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/graph": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.9.3.tgz",
+ "integrity": "sha512-3LmRJmF8+OprAr6zJT3X2s8WAhLKkrhi6RsFlMWHifGU5ED1PFcJWFbOwJvSjcAhMQJP0fErcFIK1Ludv3Vm3g==",
+ "dev": true,
+ "dependencies": {
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/hash": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.9.3.tgz",
+ "integrity": "sha512-qlH5B85XLzVAeijgKPjm1gQu35LoRYX/8igsjnN8vOlbc3O8BYAUIutU58fbHbtE8MJPbxQQUw7tkTjeoujcQQ==",
+ "dev": true,
+ "dependencies": {
+ "xxhash-wasm": "^0.4.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/logger": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.9.3.tgz",
+ "integrity": "sha512-5FNBszcV6ilGFcijEOvoNVG6IUJGsnMiaEnGQs7Fvc1dktTjEddnoQbIYhcSZL63wEmzBZOgkT5yDMajJ/41jw==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/events": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/markdown-ansi": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.9.3.tgz",
+ "integrity": "sha512-/Q4X8F2aN8UNjAJrQ5NfK2OmZf6shry9DqetUSEndQ0fHonk78WKt6LT0zSKEBEW/bB/bXk6mNMsCup6L8ibjQ==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/namer-default": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.9.3.tgz",
+ "integrity": "sha512-1ynFEcap48/Ngzwwn318eLYpLUwijuuZoXQPCsEQ21OOIOtfhFQJaPwXTsw6kRitshKq76P2aafE0BioGSqxcA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/node-resolver-core": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.0.3.tgz",
+ "integrity": "sha512-AjxNcZVHHJoNT/A99PKIdFtwvoze8PAiC3yz8E/dRggrDIOboUEodeQYV5Aq++aK76uz/iOP0tST2T8A5rhb1A==",
+ "dev": true,
+ "dependencies": {
+ "@mischnic/json-sourcemap": "^0.1.0",
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/fs": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "nullthrows": "^1.1.1",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/optimizer-css": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.9.3.tgz",
+ "integrity": "sha512-RK1QwcSdWDNUsFvuLy0hgnYKtPQebzCb0vPPzqs6LhL+vqUu9utOyRycGaQffHCkHVQP6zGlN+KFssd7YtFGhA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/utils": "2.9.3",
+ "browserslist": "^4.6.6",
+ "lightningcss": "^1.16.1",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/optimizer-htmlnano": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.9.3.tgz",
+ "integrity": "sha512-9g/KBck3c6DokmJfvJ5zpHFBiCSolaGrcsTGx8C3YPdCTVTI9P1TDCwUxvAr4LjpcIRSa82wlLCI+nF6sSgxKA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "htmlnano": "^2.0.0",
+ "nullthrows": "^1.1.1",
+ "posthtml": "^0.16.5",
+ "svgo": "^2.4.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/optimizer-htmlnano/node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/@parcel/optimizer-htmlnano/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@parcel/optimizer-htmlnano/node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "dev": true,
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@parcel/optimizer-htmlnano/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "dev": true
+ },
+ "node_modules/@parcel/optimizer-htmlnano/node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "dev": true,
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@parcel/optimizer-image": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.9.3.tgz",
+ "integrity": "sha512-530YzthE7kmecnNhPbkAK+26yQNt69pfJrgE0Ev0BZaM1Wu2+33nki7o8qvkTkikhPrurEJLGIXt1qKmbKvCbA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "@parcel/workers": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.9.3"
+ }
+ },
+ "node_modules/@parcel/optimizer-svgo": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.9.3.tgz",
+ "integrity": "sha512-ytQS0wY5JJhWU4mL0wfhYDUuHcfuw+Gy2+JcnTm1t1AZXHlOTbU6EzRWNqBShsgXjvdrQQXizAe3B6GFFlFJVQ==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "svgo": "^2.4.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/optimizer-svgo/node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/@parcel/optimizer-svgo/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@parcel/optimizer-svgo/node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "dev": true,
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@parcel/optimizer-svgo/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "dev": true
+ },
+ "node_modules/@parcel/optimizer-svgo/node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "dev": true,
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@parcel/optimizer-swc": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.9.3.tgz",
+ "integrity": "sha512-GQINNeqtdpL1ombq/Cpwi6IBk02wKJ/JJbYbyfHtk8lxlq13soenpwOlzJ5T9D2fdG+FUhai9NxpN5Ss4lNoAg==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/utils": "2.9.3",
+ "@swc/core": "^1.3.36",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/package-manager": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.9.3.tgz",
+ "integrity": "sha512-NH6omcNTEupDmW4Lm1e4NUYBjdqkURxgZ4CNESESInHJe6tblVhNB8Rpr1ar7zDar7cly9ILr8P6N3Ei7bTEjg==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/fs": "2.9.3",
+ "@parcel/logger": "2.9.3",
+ "@parcel/node-resolver-core": "3.0.3",
+ "@parcel/types": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "@parcel/workers": "2.9.3",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.9.3"
+ }
+ },
+ "node_modules/@parcel/packager-css": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.9.3.tgz",
+ "integrity": "sha512-mePiWiYZOULY6e1RdAIJyRoYqXqGci0srOaVZYaP7mnrzvJgA63kaZFFsDiEWghunQpMUuUjM2x/vQVHzxmhKQ==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/utils": "2.9.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/packager-html": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.9.3.tgz",
+ "integrity": "sha512-0Ex+O0EaZf9APNERRNGgGto02hFJ6f5RQEvRWBK55WAV1rXeU+kpjC0c0qZvnUaUtXfpWMsEBkevJCwDkUMeMg==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/types": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "nullthrows": "^1.1.1",
+ "posthtml": "^0.16.5"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/packager-js": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.9.3.tgz",
+ "integrity": "sha512-V5xwkoE3zQ3R+WqAWhA1KGQ791FvJeW6KonOlMI1q76Djjgox68hhObqcLu66AmYNhR2R/wUpkP18hP2z8dSFw==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/hash": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/utils": "2.9.3",
+ "globals": "^13.2.0",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/packager-raw": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.9.3.tgz",
+ "integrity": "sha512-oPQTNoYanQ2DdJyL61uPYK2py83rKOT8YVh2QWAx0zsSli6Kiy64U3+xOCYWgDVCrHw9+9NpQMuAdSiFg4cq8g==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/packager-svg": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.9.3.tgz",
+ "integrity": "sha512-p/Ya6UO9DAkaCUFxfFGyeHZDp9YPAlpdnh1OChuwqSFOXFjjeXuoK4KLT+ZRalVBo2Jo8xF70oKMZw4MVvaL7Q==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/types": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "posthtml": "^0.16.4"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/plugin": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.9.3.tgz",
+ "integrity": "sha512-qN85Gqr2GMuxX1dT1mnuO9hOcvlEv1lrYrCxn7CJN2nUhbwcfG+LEvcrCzCOJ6XtIHm+ZBV9h9p7FfoPLvpw+g==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/types": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/profiler": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.9.3.tgz",
+ "integrity": "sha512-pyHc9lw8VZDfgZoeZWZU9J0CVEv1Zw9O5+e0DJPDPHuXJYr72ZAOhbljtU3owWKAeW+++Q2AZWkbUGEOjI/e6g==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/events": "2.9.3",
+ "chrome-trace-event": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/reporter-cli": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.9.3.tgz",
+ "integrity": "sha512-pZiEvQpuXFuQBafMHxkDmwH8CnnK9sWHwa3bSbsnt385aUahtE8dpY0LKt+K1zfB6degKoczN6aWVj9WycQuZQ==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/types": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "chalk": "^4.1.0",
+ "term-size": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/reporter-dev-server": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.9.3.tgz",
+ "integrity": "sha512-s6eboxdLEtRSvG52xi9IiNbcPKC0XMVmvTckieue2EqGDbDcaHQoHmmwkk0rNq0/Z/UxelGcQXoIYC/0xq3ykQ==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/reporter-tracer": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.9.3.tgz",
+ "integrity": "sha512-9cXpKWk0m6d6d+4+TlAdOe8XIPaFEIKGWMWG+5SFAQE08u3olet4PSvd49F4+ZZo5ftRE7YI3j6xNbXvJT8KGw==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "chrome-trace-event": "^1.0.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/resolver-default": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.9.3.tgz",
+ "integrity": "sha512-8ESJk1COKvDzkmOnppNXoDamNMlYVIvrKc2RuFPmp8nKVj47R6NwMgvwxEaatyPzvkmyTpq5RvG9I3HFc+r4Cw==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/node-resolver-core": "3.0.3",
+ "@parcel/plugin": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/runtime-browser-hmr": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.9.3.tgz",
+ "integrity": "sha512-EgiDIDrVAWpz7bOzWXqVinQkaFjLwT34wsonpXAbuI7f7r00d52vNAQC9AMu+pTijA3gyKoJ+Q4NWPMZf7ACDA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/runtime-js": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.9.3.tgz",
+ "integrity": "sha512-EvIy+qXcKnB5qxHhe96zmJpSAViNVXHfQI5RSdZ2a7CPwORwhTI+zPNT9sb7xb/WwFw/WuTTgzT40b41DceU6Q==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/runtime-react-refresh": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.9.3.tgz",
+ "integrity": "sha512-XBgryZQIyCmi6JwEfMUCmINB3l1TpTp9a2iFxmYNpzHlqj4Ve0saKaqWOVRLvC945ZovWIBzcSW2IYqWKGtbAA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "react-error-overlay": "6.0.9",
+ "react-refresh": "^0.9.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/runtime-service-worker": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.9.3.tgz",
+ "integrity": "sha512-qLJLqv1mMdWL7gyh8aKBFFAuEiJkhUUgLKpdn6eSfH/R7kTtb76WnOwqUrhvEI9bZFUM/8Pa1bzJnPpqSOM+Sw==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/source-map": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz",
+ "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==",
+ "dev": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3"
+ },
+ "engines": {
+ "node": "^12.18.3 || >=14"
+ }
+ },
+ "node_modules/@parcel/transformer-babel": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.9.3.tgz",
+ "integrity": "sha512-pURtEsnsp3h6tOBDuzh9wRvVtw4PgIlqwAArIWdrG7iwqOUYv9D8ME4+ePWEu7MQWAp58hv9pTJtqWv4T+Sq8A==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/utils": "2.9.3",
+ "browserslist": "^4.6.6",
+ "json5": "^2.2.0",
+ "nullthrows": "^1.1.1",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-css": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.9.3.tgz",
+ "integrity": "sha512-duWMdbEBBPjg3fQdXF16iWIdThetDZvCs2TpUD7xOlXH6kR0V5BJy8ONFT15u1RCqIV9hSNGaS3v3I9YRNY5zQ==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/utils": "2.9.3",
+ "browserslist": "^4.6.6",
+ "lightningcss": "^1.16.1",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-html": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.9.3.tgz",
+ "integrity": "sha512-0NU4omcHzFXA1seqftAXA2KNZaMByoKaNdXnLgBgtCGDiYvOcL+6xGHgY6pw9LvOh5um10KI5TxSIMILoI7VtA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/hash": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "nullthrows": "^1.1.1",
+ "posthtml": "^0.16.5",
+ "posthtml-parser": "^0.10.1",
+ "posthtml-render": "^3.0.0",
+ "semver": "^7.5.2",
+ "srcset": "4"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-image": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.9.3.tgz",
+ "integrity": "sha512-7CEe35RaPadQzLIuxzTtIxnItvOoy46hcbXtOdDt6lmVa4omuOygZYRIya2lsGIP4JHvAaALMb5nt99a1uTwJg==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "@parcel/workers": "2.9.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.9.3"
+ }
+ },
+ "node_modules/@parcel/transformer-js": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.9.3.tgz",
+ "integrity": "sha512-Z2MVVg5FYcPOfxlUwxqb5l9yjTMEqE3KI3zq2MBRUme6AV07KxLmCDF23b6glzZlHWQUE8MXzYCTAkOPCcPz+Q==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/utils": "2.9.3",
+ "@parcel/workers": "2.9.3",
+ "@swc/helpers": "^0.5.0",
+ "browserslist": "^4.6.6",
+ "nullthrows": "^1.1.1",
+ "regenerator-runtime": "^0.13.7",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.9.3"
+ }
+ },
+ "node_modules/@parcel/transformer-json": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.9.3.tgz",
+ "integrity": "sha512-yNL27dbOLhkkrjaQjiQ7Im9VOxmkfuuSNSmS0rA3gEjVcm07SLKRzWkAaPnyx44Lb6bzyOTWwVrb9aMmxgADpA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "json5": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-postcss": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.9.3.tgz",
+ "integrity": "sha512-HoDvPqKzhpmvMmHqQhDnt8F1vH61m6plpGiYaYnYv2Om4HHi5ZIq9bO+9QLBnTKfaZ7ndYSefTKOxTYElg7wyw==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/hash": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "clone": "^2.1.1",
+ "nullthrows": "^1.1.1",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-posthtml": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.9.3.tgz",
+ "integrity": "sha512-2fQGgrzRmaqbWf3y2/T6xhqrNjzqMMKksqJzvc8TMfK6f2kg3Ddjv158eaSW2JdkV39aY7tvAOn5f1uzo74BMA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "nullthrows": "^1.1.1",
+ "posthtml": "^0.16.5",
+ "posthtml-parser": "^0.10.1",
+ "posthtml-render": "^3.0.0",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-pug": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-pug/-/transformer-pug-2.9.3.tgz",
+ "integrity": "sha512-uz7KT7JcgdnwxAn3l1Ejy4uKgDt0sHjo759pdU4XV1Fn/XkskDPMUhHChQY89jMueU8IkK5cpXAdr5j55+FN9Q==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "pug": "^3.0.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-raw": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.9.3.tgz",
+ "integrity": "sha512-oqdPzMC9QzWRbY9J6TZEqltknjno+dY24QWqf8ondmdF2+W+/2mRDu59hhCzQrqUHgTq4FewowRZmSfpzHxwaQ==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-react-refresh-wrap": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.9.3.tgz",
+ "integrity": "sha512-cb9NyU6oJlDblFIlzqIE8AkvRQVGl2IwJNKwD4PdE7Y6sq2okGEPG4hOw3k/Y9JVjM4/2pUORqvjSRhWwd9oVQ==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "react-refresh": "^0.9.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-sass": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-sass/-/transformer-sass-2.9.3.tgz",
+ "integrity": "sha512-i9abj9bKg3xCHghJyTM3rUVxIEn9n1Rl+DFdpyNAD8VZ52COfOshFDQOWNuhU1hEnJOFYCjnfcO0HRTsg3dWmg==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/plugin": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "sass": "^1.38.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/transformer-svg": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.9.3.tgz",
+ "integrity": "sha512-ypmE+dzB09IMCdEAkOsSxq1dEIm2A3h67nAFz4qbfHbwNgXBUuy/jB3ZMwXN/cO0f7SBh/Ap8Jhq6vmGqB5tWw==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/hash": "2.9.3",
+ "@parcel/plugin": "2.9.3",
+ "nullthrows": "^1.1.1",
+ "posthtml": "^0.16.5",
+ "posthtml-parser": "^0.10.1",
+ "posthtml-render": "^3.0.0",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0",
+ "parcel": "^2.9.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/types": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.9.3.tgz",
+ "integrity": "sha512-NSNY8sYtRhvF1SqhnIGgGvJocyWt1K8Tnw5cVepm0g38ywtX6mwkBvMkmeehXkII4mSUn+frD9wGsydTunezvA==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/cache": "2.9.3",
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/fs": "2.9.3",
+ "@parcel/package-manager": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "@parcel/workers": "2.9.3",
+ "utility-types": "^3.10.0"
+ }
+ },
+ "node_modules/@parcel/utils": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.9.3.tgz",
+ "integrity": "sha512-cesanjtj/oLehW8Waq9JFPmAImhoiHX03ihc3JTWkrvJYSbD7wYKCDgPAM3JiRAqvh1LZ6P699uITrYWNoRLUg==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/codeframe": "2.9.3",
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/hash": "2.9.3",
+ "@parcel/logger": "2.9.3",
+ "@parcel/markdown-ansi": "2.9.3",
+ "@parcel/source-map": "^2.1.1",
+ "chalk": "^4.1.0",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.2.0.tgz",
+ "integrity": "sha512-71S4TF+IMyAn24PK4KSkdKtqJDR3zRzb0HE3yXpacItqTM7XfF2f5q9NEGLEVl0dAaBAGfNwDCjH120y25F6Tg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.2.0",
+ "@parcel/watcher-darwin-arm64": "2.2.0",
+ "@parcel/watcher-darwin-x64": "2.2.0",
+ "@parcel/watcher-linux-arm-glibc": "2.2.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.2.0",
+ "@parcel/watcher-linux-arm64-musl": "2.2.0",
+ "@parcel/watcher-linux-x64-glibc": "2.2.0",
+ "@parcel/watcher-linux-x64-musl": "2.2.0",
+ "@parcel/watcher-win32-arm64": "2.2.0",
+ "@parcel/watcher-win32-x64": "2.2.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.2.0.tgz",
+ "integrity": "sha512-nU2wh00CTQT9rr1TIKTjdQ9lAGYpmz6XuKw0nAwAN+S2A5YiD55BK1u+E5WMCT8YOIDe/n6gaj4o/Bi9294SSQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.2.0.tgz",
+ "integrity": "sha512-cJl0UZDcodciy3TDMomoK/Huxpjlkkim3SyMgWzjovHGOZKNce9guLz2dzuFwfObBFCjfznbFMIvAZ5syXotYw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.2.0.tgz",
+ "integrity": "sha512-QI77zxaGrCV1StKcoRYfsUfmUmvPMPfQrubkBBy5XujV2fwaLgZivQOTQMBgp5K2+E19u1ufpspKXAPqSzpbyg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.2.0.tgz",
+ "integrity": "sha512-I2GPBcAXazPzabCmfsa3HRRW+MGlqxYd8g8RIueJU+a4o5nyNZDz0CR1cu0INT0QSQXEZV7w6UE8Hz9CF8u3Pg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.2.0.tgz",
+ "integrity": "sha512-St5mlfp+2lS9AmgixUqfwJa/DwVmTCJxC1HcOubUTz6YFOKIlkHCeUa1Bxi4E/tR/HSez8+heXHL8HQkJ4Bd8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.2.0.tgz",
+ "integrity": "sha512-jS+qfhhoOBVWwMLP65MaG8xdInMK30pPW8wqTCg2AAuVJh5xepMbzkhHJ4zURqHiyY3EiIRuYu4ONJKCxt8iqA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.2.0.tgz",
+ "integrity": "sha512-xJvJ7R2wJdi47WZBFS691RDOWvP1j/IAs3EXaWVhDI8FFITbWrWaln7KoNcR0Y3T+ZwimFY/cfb0PNht1q895g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.2.0.tgz",
+ "integrity": "sha512-D+NMpgr23a+RI5mu8ZPKWy7AqjBOkURFDgP5iIXXEf/K3hm0jJ3ogzi0Ed2237B/CdYREimCgXyeiAlE/FtwyA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.2.0.tgz",
+ "integrity": "sha512-z225cPn3aygJsyVUOWwfyW+fY0Tvk7N3XCOl66qUPFxpbuXeZuiuuJemmtm8vxyqa3Ur7peU/qJxrpC64aeI7Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.2.0.tgz",
+ "integrity": "sha512-JqGW0RJ61BkKx+yYzIURt9s53P7xMVbv0uxYPzAXLBINGaFmkIKSuUPyBVfy8TMbvp93lvF4SPBNDzVRJfvgOw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/workers": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.9.3.tgz",
+ "integrity": "sha512-zRrDuZJzTevrrwElYosFztgldhqW6G9q5zOeQXfVQFkkEJCNfg36ixeiofKRU8uu2x+j+T6216mhMNB6HiuY+w==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/logger": "2.9.3",
+ "@parcel/profiler": "2.9.3",
+ "@parcel/types": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "peerDependencies": {
+ "@parcel/core": "^2.9.3"
+ }
+ },
+ "node_modules/@swc/core": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.70.tgz",
+ "integrity": "sha512-LWVWlEDLlOD25PvA2NEz41UzdwXnlDyBiZbe69s3zM0DfCPwZXLUm79uSqH9ItsOjTrXSL5/1+XUL6C/BZwChA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.3.70",
+ "@swc/core-darwin-x64": "1.3.70",
+ "@swc/core-linux-arm-gnueabihf": "1.3.70",
+ "@swc/core-linux-arm64-gnu": "1.3.70",
+ "@swc/core-linux-arm64-musl": "1.3.70",
+ "@swc/core-linux-x64-gnu": "1.3.70",
+ "@swc/core-linux-x64-musl": "1.3.70",
+ "@swc/core-win32-arm64-msvc": "1.3.70",
+ "@swc/core-win32-ia32-msvc": "1.3.70",
+ "@swc/core-win32-x64-msvc": "1.3.70"
+ },
+ "peerDependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.70.tgz",
+ "integrity": "sha512-31+mcl0dgdRHvZRjhLOK9V6B+qJ7nxDZYINr9pBlqGWxknz37Vld5KK19Kpr79r0dXUZvaaelLjCnJk9dA2PcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.70.tgz",
+ "integrity": "sha512-GMFJ65E18zQC80t0os+TZvI+8lbRuitncWVge/RXmXbVLPRcdykP4EJ87cqzcG5Ah0z18/E0T+ixD6jHRisrYQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.70.tgz",
+ "integrity": "sha512-wjhCwS8LCiAq2VedF1b4Bryyw68xZnfMED4pLRazAl8BaUlDFANfRBORNunxlfHQj4V3x39IaiLgCZRHMdzXBg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.70.tgz",
+ "integrity": "sha512-9D/Rx67cAOnMiexvCqARxvhj7coRajTp5HlJHuf+rfwMqI2hLhpO9/pBMQxBUAWxODO/ksQ/OF+GJRjmtWw/2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.70.tgz",
+ "integrity": "sha512-gkjxBio7XD+1GlQVVyPP/qeFkLu83VhRHXaUrkNYpr5UZG9zZurBERT9nkS6Y+ouYh+Q9xmw57aIyd2KvD2zqQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.70.tgz",
+ "integrity": "sha512-/nCly+V4xfMVwfEUoLLAukxUSot/RcSzsf6GdsGTjFcrp5sZIntAjokYRytm3VT1c2TK321AfBorsi9R5w8Y7Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.70.tgz",
+ "integrity": "sha512-HoOsPJbt361KGKaivAK0qIiYARkhzlxeAfvF5NlnKxkIMOZpQ46Lwj3tR0VWohKbrhS+cYKFlVuDi5XnDkx0XA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.70.tgz",
+ "integrity": "sha512-hm4IBK/IaRil+aj1cWU6f0GyAdHpw/Jr5nyFYLM2c/tt7w2t5hgb8NjzM2iM84lOClrig1fG6edj2vCF1dFzNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.70.tgz",
+ "integrity": "sha512-5cgKUKIT/9Fp5fCA+zIjYCQ4dSvjFYOeWGZR3QiTXGkC4bGa1Ji9SEPyeIAX0iruUnKjYaZB9RvHK2tNn7RLrQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.3.70",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.70.tgz",
+ "integrity": "sha512-LE8lW46+TQBzVkn2mHBlk8DIElPIZ2dO5P8AbJiARNBAnlqQWu67l9gWM89UiZ2l33J2cI37pHzON3tKnT8f9g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz",
+ "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+ "dev": true
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+ "dev": true
+ },
+ "node_modules/abortcontroller-polyfill": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz",
+ "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "dev": true
+ },
+ "node_modules/assert-never": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
+ "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==",
+ "dev": true
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-walk": {
+ "version": "3.0.0-canary-5",
+ "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
+ "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.9.6"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base-x": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
+ "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/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"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.9",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
+ "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001503",
+ "electron-to-chromium": "^1.4.431",
+ "node-releases": "^2.0.12",
+ "update-browserslist-db": "^1.0.11"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
+ "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.3.0",
+ "map-obj": "^4.1.0",
+ "quick-lru": "^5.1.1",
+ "type-fest": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001515",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz",
+ "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/character-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
+ "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==",
+ "dev": true,
+ "dependencies": {
+ "is-regex": "^1.0.3"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/constantinople": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
+ "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.6.0",
+ "@babel/types": "^7.6.1"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz",
+ "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/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",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-functions-list": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.0.tgz",
+ "integrity": "sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-select/node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
+ "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+ "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+ "dev": true,
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/doctypes": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
+ "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==",
+ "dev": true
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz",
+ "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.459",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.459.tgz",
+ "integrity": "sha512-XXRS5NFv8nCrBL74Rm3qhJjA2VCsRFx0OjHKBMPI0otij56aun8UWiKTDABmd5/7GTR021pA4wivs+Ri6XCElg==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz",
+ "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.1.0",
+ "@eslint/js": "8.44.0",
+ "@humanwhocodes/config-array": "^0.11.10",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.6.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-require-sort": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-require-sort/-/eslint-plugin-require-sort-1.3.0.tgz",
+ "integrity": "sha512-uGyXChANR0kO9SWqZDrZquyVfYQCydovKGjM7zCo+rZE2l3eoWXkNDVZC4JaHYANJ9m5fJ5QE/5kcWHGJLofSQ==",
+ "dev": true
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
+ "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+ "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz",
+ "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz",
+ "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-port": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz",
+ "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "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/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globjoin": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/htmlnano": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.0.4.tgz",
+ "integrity": "sha512-WGCkyGFwjKW1GeCBsPYacMvaMnZtFJ0zIRnC2NCddkA+IOEhTqskXrS7lep+3yYZw/nQ3dW1UAX4yA/GJyR8BA==",
+ "dev": true,
+ "dependencies": {
+ "cosmiconfig": "^8.0.0",
+ "posthtml": "^0.16.5",
+ "timsort": "^0.3.0"
+ },
+ "peerDependencies": {
+ "cssnano": "^6.0.0",
+ "postcss": "^8.3.11",
+ "purgecss": "^5.0.0",
+ "relateurl": "^0.2.7",
+ "srcset": "4.0.0",
+ "svgo": "^3.0.2",
+ "terser": "^5.10.0",
+ "uncss": "^0.17.3"
+ },
+ "peerDependenciesMeta": {
+ "cssnano": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "purgecss": {
+ "optional": true
+ },
+ "relateurl": {
+ "optional": true
+ },
+ "srcset": {
+ "optional": true
+ },
+ "svgo": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "uncss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
+ "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.2",
+ "domutils": "^2.8.0",
+ "entities": "^3.0.1"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz",
+ "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==",
+ "dev": true
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-expression": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
+ "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/is-expression/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-json": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz",
+ "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==",
+ "dev": true
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
+ "dev": true
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/js-stringify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
+ "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jstransformer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
+ "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==",
+ "dev": true,
+ "dependencies": {
+ "is-promise": "^2.0.0",
+ "promise": "^7.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/known-css-properties": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
+ "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==",
+ "dev": true
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.21.5.tgz",
+ "integrity": "sha512-/pEUPeih2EwIx9n4T82aOG6CInN83tl/mWlw6B5gWLf36UplQi1L+5p3FUHsdt4fXVfOkkh9KIaM3owoq7ss8A==",
+ "dev": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-darwin-arm64": "1.21.5",
+ "lightningcss-darwin-x64": "1.21.5",
+ "lightningcss-linux-arm-gnueabihf": "1.21.5",
+ "lightningcss-linux-arm64-gnu": "1.21.5",
+ "lightningcss-linux-arm64-musl": "1.21.5",
+ "lightningcss-linux-x64-gnu": "1.21.5",
+ "lightningcss-linux-x64-musl": "1.21.5",
+ "lightningcss-win32-x64-msvc": "1.21.5"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.5.tgz",
+ "integrity": "sha512-z05hyLX85WY0UfhkFUOrWEFqD69lpVAmgl3aDzMKlIZJGygbhbegqb4PV8qfUrKKNBauut/qVNPKZglhTaDDxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.21.5.tgz",
+ "integrity": "sha512-MSJhmej/U9MrdPxDk7+FWhO8+UqVoZUHG4VvKT5RQ4RJtqtANTiWiI97LvoVNMtdMnHaKs1Pkji6wHUFxjJsHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.21.5.tgz",
+ "integrity": "sha512-xN6+5/JsMrbZHL1lPl+MiNJ3Xza12ueBKPepiyDCFQzlhFRTj7D0LG+cfNTzPBTO8KcYQynLpl1iBB8LGp3Xtw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.21.5.tgz",
+ "integrity": "sha512-KfzFNhC4XTbmG3ma/xcTs/IhCwieW89XALIusKmnV0N618ZDXEB0XjWOYQRCXeK9mfqPdbTBpurEHV/XZtkniQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.21.5.tgz",
+ "integrity": "sha512-bc0GytQO5Mn9QM6szaZ+31fQHNdidgpM1sSCwzPItz8hg3wOvKl8039rU0veMJV3ZgC9z0ypNRceLrSHeRHmXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.21.5.tgz",
+ "integrity": "sha512-JwMbgypPQgc2kW2av3OwzZ8cbrEuIiDiXPJdXRE6aVxu67yHauJawQLqJKTGUhiAhy6iLDG8Wg0a3/ziL+m+Kw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.21.5.tgz",
+ "integrity": "sha512-Ib8b6IQ/OR/VrPU6YBgy4T3QnuHY7DUa95O+nz+cwrTkMSN6fuHcTcIaz4t8TJ6HI5pl3uxUOZjmtls2pyQWow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.21.5",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.21.5.tgz",
+ "integrity": "sha512-A8cSi8lUpBeVmoF+DqqW7cd0FemDbCuKr490IXdjyeI+KL8adpSKUs8tcqO0OXPh1EoDqK7JNkD/dELmd4Iz5g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/lmdb": {
+ "version": "2.7.11",
+ "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.7.11.tgz",
+ "integrity": "sha512-x9bD4hVp7PFLUoELL8RglbNXhAMt5CYhkmss+CEau9KlNoilsTzNi9QDsPZb3KMpOGZXG6jmXhW3bBxE2XVztw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "msgpackr": "1.8.5",
+ "node-addon-api": "^4.3.0",
+ "node-gyp-build-optional-packages": "5.0.6",
+ "ordered-binary": "^1.4.0",
+ "weak-lru-cache": "^1.2.2"
+ },
+ "bin": {
+ "download-lmdb-prebuilds": "bin/download-prebuilds.js"
+ },
+ "optionalDependencies": {
+ "@lmdb/lmdb-darwin-arm64": "2.7.11",
+ "@lmdb/lmdb-darwin-x64": "2.7.11",
+ "@lmdb/lmdb-linux-arm": "2.7.11",
+ "@lmdb/lmdb-linux-arm64": "2.7.11",
+ "@lmdb/lmdb-linux-x64": "2.7.11",
+ "@lmdb/lmdb-win32-x64": "2.7.11"
+ }
+ },
+ "node_modules/lmdb/node_modules/msgpackr": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.5.tgz",
+ "integrity": "sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==",
+ "dev": true,
+ "optionalDependencies": {
+ "msgpackr-extract": "^3.0.1"
+ }
+ },
+ "node_modules/lmdb/node_modules/node-addon-api": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
+ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
+ "dev": true
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mathml-tag-names": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "dev": true
+ },
+ "node_modules/meow": {
+ "version": "10.1.5",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
+ "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimist": "^1.2.2",
+ "camelcase-keys": "^7.0.0",
+ "decamelize": "^5.0.0",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.2",
+ "read-pkg-up": "^8.0.0",
+ "redent": "^4.0.0",
+ "trim-newlines": "^4.0.2",
+ "type-fest": "^1.2.2",
+ "yargs-parser": "^20.2.9"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/meow/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/msgpackr": {
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.5.tgz",
+ "integrity": "sha512-/IJ3cFSN6Ci3eG2wLhbFEL6GT63yEaoN/R5My2QkV6zro+OJaVRLPlwvxY7EtHYSmDlQpk8stvOQTL2qJFkDRg==",
+ "dev": true,
+ "optionalDependencies": {
+ "msgpackr-extract": "^3.0.2"
+ }
+ },
+ "node_modules/msgpackr-extract": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz",
+ "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "node-gyp-build-optional-packages": "5.0.7"
+ },
+ "bin": {
+ "download-msgpackr-prebuilds": "bin/download-prebuilds.js"
+ },
+ "optionalDependencies": {
+ "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2",
+ "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2",
+ "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2",
+ "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2",
+ "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2",
+ "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2"
+ }
+ },
+ "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz",
+ "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "node-gyp-build-optional-packages": "bin.js",
+ "node-gyp-build-optional-packages-optional": "optional.js",
+ "node-gyp-build-optional-packages-test": "build-test.js"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz",
+ "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==",
+ "dev": true
+ },
+ "node_modules/node-gyp-build-optional-packages": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.6.tgz",
+ "integrity": "sha512-2ZJErHG4du9G3/8IWl/l9Bp5BBFy63rno5GVmjQijvTuUZKsl6g8RB4KH/x3NLcV5ZBb4GsXmAuTYr6dRml3Gw==",
+ "dev": true,
+ "bin": {
+ "node-gyp-build-optional-packages": "bin.js",
+ "node-gyp-build-optional-packages-optional": "optional.js",
+ "node-gyp-build-optional-packages-test": "build-test.js"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
+ "dev": true
+ },
+ "node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nullthrows": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
+ "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
+ "dev": true
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ordered-binary": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.1.tgz",
+ "integrity": "sha512-9LtiGlPy982CsgxZvJGNNp2/NnrgEr6EAyN3iIEP3/8vd3YLgAZQHbQ75ZrkfBRGrNg37Dk3U6tuVb+B4Xfslg==",
+ "dev": true
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parcel": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.9.3.tgz",
+ "integrity": "sha512-2GTVocFkwblV/TIg9AmT7TI2fO4xdWkyN8aFUEVtiVNWt96GTR3FgQyHFValfCbcj1k9Xf962Ws2hYXYUr9k1Q==",
+ "dev": true,
+ "dependencies": {
+ "@parcel/config-default": "2.9.3",
+ "@parcel/core": "2.9.3",
+ "@parcel/diagnostic": "2.9.3",
+ "@parcel/events": "2.9.3",
+ "@parcel/fs": "2.9.3",
+ "@parcel/logger": "2.9.3",
+ "@parcel/package-manager": "2.9.3",
+ "@parcel/reporter-cli": "2.9.3",
+ "@parcel/reporter-dev-server": "2.9.3",
+ "@parcel/reporter-tracer": "2.9.3",
+ "@parcel/utils": "2.9.3",
+ "chalk": "^4.1.0",
+ "commander": "^7.0.0",
+ "get-port": "^4.2.0"
+ },
+ "bin": {
+ "parcel": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.25",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz",
+ "integrity": "sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-resolve-nested-selector": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+ "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
+ "dev": true
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-sorting": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz",
+ "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==",
+ "dev": true,
+ "peerDependencies": {
+ "postcss": "^8.4.20"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/posthtml": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz",
+ "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==",
+ "dev": true,
+ "dependencies": {
+ "posthtml-parser": "^0.11.0",
+ "posthtml-render": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/posthtml-parser": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz",
+ "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==",
+ "dev": true,
+ "dependencies": {
+ "htmlparser2": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/posthtml-render": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz",
+ "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==",
+ "dev": true,
+ "dependencies": {
+ "is-json": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/posthtml/node_modules/posthtml-parser": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz",
+ "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==",
+ "dev": true,
+ "dependencies": {
+ "htmlparser2": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "dev": true,
+ "dependencies": {
+ "asap": "~2.0.3"
+ }
+ },
+ "node_modules/pug": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz",
+ "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==",
+ "dev": true,
+ "dependencies": {
+ "pug-code-gen": "^3.0.2",
+ "pug-filters": "^4.0.0",
+ "pug-lexer": "^5.0.1",
+ "pug-linker": "^4.0.0",
+ "pug-load": "^3.0.0",
+ "pug-parser": "^6.0.0",
+ "pug-runtime": "^3.0.1",
+ "pug-strip-comments": "^2.0.0"
+ }
+ },
+ "node_modules/pug-attrs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
+ "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
+ "dev": true,
+ "dependencies": {
+ "constantinople": "^4.0.1",
+ "js-stringify": "^1.0.2",
+ "pug-runtime": "^3.0.0"
+ }
+ },
+ "node_modules/pug-code-gen": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz",
+ "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==",
+ "dev": true,
+ "dependencies": {
+ "constantinople": "^4.0.1",
+ "doctypes": "^1.1.0",
+ "js-stringify": "^1.0.2",
+ "pug-attrs": "^3.0.0",
+ "pug-error": "^2.0.0",
+ "pug-runtime": "^3.0.0",
+ "void-elements": "^3.1.0",
+ "with": "^7.0.0"
+ }
+ },
+ "node_modules/pug-error": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz",
+ "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==",
+ "dev": true
+ },
+ "node_modules/pug-filters": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
+ "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
+ "dev": true,
+ "dependencies": {
+ "constantinople": "^4.0.1",
+ "jstransformer": "1.0.0",
+ "pug-error": "^2.0.0",
+ "pug-walk": "^2.0.0",
+ "resolve": "^1.15.1"
+ }
+ },
+ "node_modules/pug-lexer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz",
+ "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==",
+ "dev": true,
+ "dependencies": {
+ "character-parser": "^2.2.0",
+ "is-expression": "^4.0.0",
+ "pug-error": "^2.0.0"
+ }
+ },
+ "node_modules/pug-linker": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
+ "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
+ "dev": true,
+ "dependencies": {
+ "pug-error": "^2.0.0",
+ "pug-walk": "^2.0.0"
+ }
+ },
+ "node_modules/pug-load": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
+ "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
+ "dev": true,
+ "dependencies": {
+ "object-assign": "^4.1.1",
+ "pug-walk": "^2.0.0"
+ }
+ },
+ "node_modules/pug-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
+ "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
+ "dev": true,
+ "dependencies": {
+ "pug-error": "^2.0.0",
+ "token-stream": "1.0.0"
+ }
+ },
+ "node_modules/pug-runtime": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz",
+ "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==",
+ "dev": true
+ },
+ "node_modules/pug-strip-comments": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
+ "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
+ "dev": true,
+ "dependencies": {
+ "pug-error": "^2.0.0"
+ }
+ },
+ "node_modules/pug-walk": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
+ "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-error-overlay": {
+ "version": "6.0.9",
+ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz",
+ "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==",
+ "dev": true
+ },
+ "node_modules/react-refresh": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz",
+ "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
+ "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^3.0.2",
+ "parse-json": "^5.2.0",
+ "type-fest": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
+ "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^5.0.0",
+ "read-pkg": "^6.0.0",
+ "type-fest": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
+ "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
+ "dev": true,
+ "dependencies": {
+ "indent-string": "^5.0.0",
+ "strip-indent": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "dev": true
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/sass": {
+ "version": "1.63.6",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz",
+ "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+ "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz",
+ "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==",
+ "dev": true
+ },
+ "node_modules/srcset": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz",
+ "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
+ "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
+ "dev": true,
+ "dependencies": {
+ "min-indent": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/style-search": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+ "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
+ "dev": true
+ },
+ "node_modules/stylelint": {
+ "version": "15.10.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.1.tgz",
+ "integrity": "sha512-CYkzYrCFfA/gnOR+u9kJ1PpzwG10WLVnoxHDuBA/JiwGqdM9+yx9+ou6SE/y9YHtfv1mcLo06fdadHTOx4gBZQ==",
+ "dev": true,
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^2.3.0",
+ "@csstools/css-tokenizer": "^2.1.1",
+ "@csstools/media-query-list-parser": "^2.1.2",
+ "@csstools/selector-specificity": "^3.0.0",
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.3",
+ "cosmiconfig": "^8.2.0",
+ "css-functions-list": "^3.1.0",
+ "css-tree": "^2.3.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.0",
+ "fastest-levenshtein": "^1.0.16",
+ "file-entry-cache": "^6.0.1",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.3.1",
+ "ignore": "^5.2.4",
+ "import-lazy": "^4.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.27.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^10.1.5",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.24",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.13",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "style-search": "^0.1.0",
+ "supports-hyperlinks": "^3.0.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.1",
+ "write-file-atomic": "^5.0.1"
+ },
+ "bin": {
+ "stylelint": "bin/stylelint.mjs"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ }
+ },
+ "node_modules/stylelint-config-recommended": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz",
+ "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "stylelint": "^15.10.0"
+ }
+ },
+ "node_modules/stylelint-config-standard": {
+ "version": "34.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-34.0.0.tgz",
+ "integrity": "sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==",
+ "dev": true,
+ "dependencies": {
+ "stylelint-config-recommended": "^13.0.0"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "stylelint": "^15.10.0"
+ }
+ },
+ "node_modules/stylelint-order": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.3.tgz",
+ "integrity": "sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^8.4.21",
+ "postcss-sorting": "^8.0.2"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.0.0 || ^15.0.0"
+ }
+ },
+ "node_modules/stylelint/node_modules/balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "dev": true
+ },
+ "node_modules/stylelint/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz",
+ "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.18"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+ "dev": true
+ },
+ "node_modules/svgo": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz",
+ "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.2.1",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/table": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
+ "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/term-size": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
+ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/timsort": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+ "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/token-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
+ "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==",
+ "dev": true
+ },
+ "node_modules/trim-newlines": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
+ "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/utility-types": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz",
+ "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/weak-lru-cache": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz",
+ "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==",
+ "dev": true
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/with": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
+ "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.9.6",
+ "@babel/types": "^7.9.6",
+ "assert-never": "^1.2.1",
+ "babel-walk": "3.0.0-canary-5"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/xxhash-wasm": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz",
+ "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d954641
--- /dev/null
+++ b/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "exptech-service-web",
+ "version": "1.0.0",
+ "description": "ExpTech Website",
+ "scripts": {
+ "watch": "parcel ./src/*.pug",
+ "build": "parcel build ./src/*.pug --no-cache --no-scope-hoist --public-url=https://exptech.com.tw/api/v1/file/exptech/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ExpTechTW/ExpTech-Service-Web.git"
+ },
+ "author": "ExpTech",
+ "license": "AGPL-3.0",
+ "bugs": {
+ "url": "https://github.com/ExpTechTW/ExpTech-Service-Web/issues"
+ },
+ "homepage": "https://github.com/ExpTechTW/ExpTech-Service-Web#readme",
+ "devDependencies": {
+ "@parcel/transformer-pug": "^2.9.3",
+ "@parcel/transformer-sass": "^2.9.3",
+ "eslint": "^8.44.0",
+ "eslint-plugin-require-sort": "^1.3.0",
+ "parcel": "^2.9.3",
+ "stylelint": "^15.10.1",
+ "stylelint-config-standard": "^34.0.0",
+ "stylelint-order": "^6.0.3"
+ },
+ "browserslist": "> 0.5%, last 2 versions, not dead",
+ "targets": {
+ "default": {
+ "context": "browser"
+ }
+ }
+}
diff --git a/src/change.html b/src/change.html
new file mode 100644
index 0000000..b76a680
--- /dev/null
+++ b/src/change.html
@@ -0,0 +1,269 @@
+
+
+ ExpTech | 更改密碼
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
更改密碼
+
更改 ExpTech 密碼
+
+
+
+
更改密碼成功
+
將在五秒後跳轉回登入畫面
+
+
+ Discord 伺服器
+
+
+
+
+
diff --git a/src/check.html b/src/check.html
new file mode 100644
index 0000000..857e739
--- /dev/null
+++ b/src/check.html
@@ -0,0 +1,137 @@
+
+
+ ExpTech | 註冊驗證
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
註冊驗證
+
註冊驗證 ExpTech 帳號
+
+
+
註冊成功
+
將在五秒後跳轉回登入畫面
+
+
+
+
無效註冊
+
將在五秒後跳轉回登入畫面
+
+
+ Discord 伺服器
+
+
+
+
+
+
diff --git a/src/components/header.pug b/src/components/header.pug
new file mode 100644
index 0000000..7273848
--- /dev/null
+++ b/src/components/header.pug
@@ -0,0 +1,6 @@
+mixin header(page)
+ .header
+ .header-image
+ .header-title-container
+ .header-title ExpTech Studio
+ .header-page= page
\ No newline at end of file
diff --git a/src/components/icon.pug b/src/components/icon.pug
new file mode 100644
index 0000000..4b6ca29
--- /dev/null
+++ b/src/components/icon.pug
@@ -0,0 +1,2 @@
+mixin icon(iconName)
+ span.icon.material-symbols-rounded= iconName
\ No newline at end of file
diff --git a/src/forget.html b/src/forget.html
new file mode 100644
index 0000000..0012a13
--- /dev/null
+++ b/src/forget.html
@@ -0,0 +1,179 @@
+
+
+ ExpTech | 忘記密碼
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
忘記密碼
+
忘記 ExpTech 密碼
+
+
+
+
發送成功
+
+ 已寄驗證信到你電子郵件地址請查收
+
+
將在五秒後跳轉回登入畫面
+
+
+
+
無效註冊
+
將在五秒後跳轉回登入畫面
+
+
+ Discord 伺服器
+
+
+
+
+
diff --git a/src/images/exptech.png b/src/images/exptech.png
new file mode 100644
index 0000000..129ab76
Binary files /dev/null and b/src/images/exptech.png differ
diff --git a/src/images/github-mark-white.png b/src/images/github-mark-white.png
new file mode 100644
index 0000000..50b8175
Binary files /dev/null and b/src/images/github-mark-white.png differ
diff --git a/exptech/index.html b/src/index.html
similarity index 96%
rename from exptech/index.html
rename to src/index.html
index 1ccce14..d16fe1e 100644
--- a/exptech/index.html
+++ b/src/index.html
@@ -1,131 +1,131 @@
-
-
-
- TREM
-
-
-
-
-
-
-
-
-
-
-
TREM
-
Taiwan Real-time Earthquake Monitoring | 臺灣即時地震監測
-
-
受 2022/03/23 地震啟發,於 2022/05/19 由 ExpTech Studio 開始開發的 即時地震觀測網,平均能在發震後 9.3 秒,獲得地震資訊。
-
-
-
-
實用功能
-
-
強震即時警報 →
-
-
-
-
-
-
-
-
-
← 地震檢知
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ TREM
+
+
+
+
+
+
+
+
+
+
+
TREM
+
Taiwan Real-time Earthquake Monitoring | 臺灣即時地震監測
+
+
受 2022/03/23 地震啟發,於 2022/05/19 由 ExpTech Studio 開始開發的 即時地震觀測網,平均能在發震後 9.3 秒,獲得地震資訊。
+
+
+
+
實用功能
+
+
強震即時警報 →
+
+
+
+
+
+
+
+
+
← 地震檢知
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/login.pug b/src/login.pug
new file mode 100644
index 0000000..6edf259
--- /dev/null
+++ b/src/login.pug
@@ -0,0 +1,50 @@
+html(lang="zh-Hant")
+ head
+ title ExpTech | 登入
+ meta(charset="utf-8")
+ meta(name="viewport", content="width=device-width, initial-scale=1")
+ meta(name="description", content="登入管理你的 ExpTech 帳號")
+
+ //- Facebook Meta Tags
+ meta(property="og:site_name", content="探索科技 | ExpTech Studio")
+ meta(property="og:url", content="https://exptech.com.tw/api/v1/file/exptech/login.html")
+ meta(property="og:type", content="website")
+ meta(property="og:title", content="登入")
+ meta(property="og:description", content="登入管理你的 ExpTech 帳號")
+ meta(property="og:image", content="https://cdn.jsdelivr.net/gh/ExpTechTW/API@master/image/Icon/ExpTech.png")
+
+ //- Twitter Meta Tags
+ meta(name="twitter:card", content="summary")
+ meta(property="twitter:domain", content="exptech.com.tw")
+ meta(property="twitter:url", content="https://exptech.com.tw/api/v1/file/exptech/login.html")
+ meta(name="twitter:title", content="登入")
+ meta(name="twitter:description", content="登入管理你的 ExpTech 帳號")
+ meta(name="twitter:image", content="https://cdn.jsdelivr.net/gh/ExpTechTW/API@master/image/Icon/ExpTech.png")
+
+ link(rel="stylesheet", href="./stylesheets/login.scss")
+ link(rel="preconnect", href="https://fonts.googleapis.com")
+ link(rel="preconnect", href="https://fonts.gstatic.com", crossorigin)
+ link(href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;500&display=swap", rel="stylesheet")
+
+ body
+ main
+ .container
+ .title 登入
+ .description 登入管理你的 ExpTech 帳號
+ form#login.login-form
+ .form-item-container
+ .form-item
+ label.required(for="email") 電子郵件地址
+ input#email(type="email", name="email", placeholder="電子郵件地址", autocomplete="email", required)
+ .form-item
+ label.required(for="password") 用戶密碼
+ input#password(type="password", name="password", placeholder="用戶密碼", autocomplete="current-password", required)
+ a.forget-password(href="./forget.html") 忘記密碼?
+ a.forget-password(href="./change.html") 更改密碼?
+ div
+ | 如果這不是你的電腦,請使用私密瀏覽視窗登入。
+ button#register(type="button") 註冊帳號
+ button#submit(type="submit") 登入
+ a.info(href="https://exptech.com.tw/f?v=discord") Discord 伺服器
+
+ script(src="./scripts/login.js")
\ No newline at end of file
diff --git a/src/register.pug b/src/register.pug
new file mode 100644
index 0000000..5efc394
--- /dev/null
+++ b/src/register.pug
@@ -0,0 +1,56 @@
+html(lang="zh-Hant")
+ head
+ title ExpTech | 註冊
+ meta(charset="utf-8")
+ meta(name="viewport", content="width=device-width, initial-scale=1")
+ meta(name="description", content="註冊 ExpTech 帳號")
+
+ //- Facebook Meta Tags
+ meta(property="og:site_name", content="探索科技 | ExpTech Studio")
+ meta(property="og:url", content="https://exptech.com.tw/api/v1/file/exptech/register.html")
+ meta(property="og:type", content="website")
+ meta(property="og:title", content="註冊")
+ meta(property="og:description", content="註冊 ExpTech 帳號")
+ meta(property="og:image", content="https://cdn.jsdelivr.net/gh/ExpTechTW/API@master/image/Icon/ExpTech.png")
+
+ //- Twitter Meta Tags
+ meta(name="twitter:card", content="summary")
+ meta(property="twitter:domain", content="exptech.com.tw")
+ meta(property="twitter:url", content="https://exptech.com.tw/api/v1/file/exptech/register.html")
+ meta(name="twitter:title", content="註冊")
+ meta(name="twitter:description", content="註冊 ExpTech 帳號")
+ meta(name="twitter:image", content="https://cdn.jsdelivr.net/gh/ExpTechTW/API@master/image/Icon/ExpTech.png")
+
+ link(rel="stylesheet", href="./stylesheets/register.scss")
+ link(rel="preconnect", href="https://fonts.googleapis.com")
+ link(rel="preconnect", href="https://fonts.gstatic.com", crossorigin)
+ link(href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;500&display=swap", rel="stylesheet")
+
+ body
+ main
+ #container
+ .title 註冊
+ .description 註冊 ExpTech 帳號
+ #form-view.view
+ form#register.register-form
+ .form-item-container
+ .form-item
+ label.required(for="email") 電子郵件地址
+ input#email(type="email", name="email", placeholder="電子郵件地址", autocomplete="email", required)
+ .form-item
+ label.required(for="password") 密碼
+ input#password(type="password", name="password", placeholder="密碼", autocomplete="new-password", required)
+ #password-strength
+ .form-item
+ label.required(for="repeat-password") 確認密碼
+ input#repeat-password(type="password", name="password", placeholder="確認密碼", autocomplete="new-password", required)
+ button#login(type="button") 登入帳號
+ button#submit(type="submit") 註冊
+ #success-view.view
+ svg.check-mark(xmlns="http://www.w3.org/2000/svg", height="128", width="128", viewBox="0 96 960 960"): path(d="M421 744.537 690.537 475l-34.845-34.23L421 675.847 302.539 557.385l-33.846 34.23L421 744.537Zm59.067 211.462q-78.221 0-147.397-29.92-69.176-29.92-120.989-81.71-51.814-51.791-81.747-120.936-29.933-69.146-29.933-147.366 0-78.836 29.92-148.204 29.92-69.369 81.71-120.682 51.791-51.314 120.936-81.247 69.146-29.933 147.366-29.933 78.836 0 148.204 29.92 69.369 29.92 120.682 81.21 51.314 51.291 81.247 120.629 29.933 69.337 29.933 148.173 0 78.221-29.92 147.397-29.92 69.176-81.21 120.989-51.291 51.814-120.629 81.747-69.337 29.933-148.173 29.933ZM480 910.615q139.692 0 237.154-97.769Q814.615 715.077 814.615 576q0-139.692-97.461-237.154Q619.692 241.385 480 241.385q-139.077 0-236.846 97.461Q145.385 436.308 145.385 576q0 139.077 97.769 236.846T480 910.615ZM480 576Z")
+ .success-title.title 發送成功
+ .success-description 已寄驗證信到你電子郵件地址請查收
+ .success-description 將在五秒後跳轉回登入畫面
+ a.info(href="https://exptech.com.tw/f?v=discord") Discord 伺服器
+
+ script(src="./scripts/register.js")
\ No newline at end of file
diff --git a/src/scripts/domhelper.js b/src/scripts/domhelper.js
new file mode 100644
index 0000000..635bb2d
--- /dev/null
+++ b/src/scripts/domhelper.js
@@ -0,0 +1,97 @@
+export class ElementBuilder {
+ constructor(data = {}) {
+ if (typeof data == "string") {
+ this.element = document.createElement(data);
+ } else {
+ this.element = document.createElement(data.tag ?? "div");
+
+ if ("id" in data)
+ this.element.id = data.id;
+
+ if ("class" in data)
+ if (Array.isArray(data.class))
+ for (const className of data.class)
+ this.element.classList.add(className);
+ else if (typeof data.class == "string")
+ this.element.className = data.class;
+
+ if ("attributes" in data)
+ for (const key in data.attributes)
+ this.element.setAttribute(key, data.attributes[key]);
+ }
+ }
+
+ setId(id) {
+ this.element.id = id;
+ return this;
+ }
+
+ setClass(data) {
+ if (Array.isArray(data))
+ for (const className of data)
+ this.element.classList.add(className);
+ else if (typeof data == "string")
+ this.element.className = data;
+ return this;
+ }
+
+ setContent(content) {
+ this.element.textContent = content;
+ return this;
+ }
+
+ setAttribute(key, value) {
+ this.element.setAttribute(key, value);
+ return this;
+ }
+
+ setDisabled(state) {
+ this.element.disabled = state;
+ return this;
+ }
+
+ setRequired(required) {
+ this.element.required = required;
+ return this;
+ }
+
+ setStyle(rule, value) {
+ this.element.style[rule] = value;
+ return this;
+ }
+
+ addChildren(children) {
+ if (Array.isArray(children))
+ for (const child of children)
+ if (child instanceof ElementBuilder)
+ this.element.append(child.toElement());
+ else
+ this.element.append(child);
+ else
+ if (children instanceof ElementBuilder)
+ this.element.append(children.toElement());
+ else
+ this.element.append(children);
+
+
+ return this;
+ }
+
+ setChildren(children) {
+ this.element.setChildren(children);
+ }
+
+ on(eventName, callback, ...args) {
+ this.element.addEventListener(eventName, callback.bind(this.element, ...args));
+ return this;
+ }
+
+ once(eventName, callback, ...args) {
+ this.element.addEventListener(eventName, callback.bind(this.element, ...args), { once: true });
+ return this;
+ }
+
+ toElement() {
+ return this.element;
+ }
+}
\ No newline at end of file
diff --git a/src/scripts/login.js b/src/scripts/login.js
new file mode 100644
index 0000000..20875b4
--- /dev/null
+++ b/src/scripts/login.js
@@ -0,0 +1,85 @@
+/**
+ * @type {HTMLInputElement}
+ */
+const email = document.getElementById("email");
+const password = document.getElementById("password");
+const loginForm = document.getElementById("login");
+
+document.getElementById("register").addEventListener("click", (e) => {
+ window.location.href = "./register.html";
+});
+
+loginForm.addEventListener("submit", (e) => {
+ e.preventDefault();
+
+ email.setCustomValidity("");
+ password.setCustomValidity("");
+
+ const values = {
+ email : email.value,
+ pass : password.value,
+ };
+
+ email.disabled = true;
+ password.disabled = true;
+ loginForm.disabled = true;
+
+ fetch("https://exptech.com.tw/api/v1/et/login", {
+ method : "POST",
+ headers : {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ email : values.email,
+ pass : values.pass,
+ }),
+ })
+ .then(async res => {
+ if (res.ok) {
+ window.location.href = `./user.html?token=${await res.text()}`;
+ } else {
+ switch (await res.text()) {
+ case "Invaild email!": {
+ email.setCustomValidity("電子郵件地址無效。");
+ break;
+ }
+
+ case "Invaild pass!": {
+ password.setCustomValidity("密碼無效。");
+ break;
+ }
+
+ case "Pass error!": {
+ password.setCustomValidity("密碼錯誤。");
+ break;
+ }
+
+ case "This account was not found!": {
+ email.setCustomValidity("找不到此帳戶,可能尚未註冊。");
+ setTimeout(() => window.location.href = "./register.html", 5_000);
+ break;
+ }
+
+ default: {
+ console.error(res);
+ break;
+ }
+ }
+
+ email.disabled = false;
+ password.disabled = false;
+ loginForm.disabled = false;
+ email.reportValidity();
+ password.reportValidity();
+ }
+ })
+ .catch(err => {
+ console.error(err);
+ email.disabled = false;
+ password.disabled = false;
+ loginForm.disabled = false;
+ const res = err.request.response;
+ alert(res);
+ });
+ return false;
+});
\ No newline at end of file
diff --git a/src/scripts/register.js b/src/scripts/register.js
new file mode 100644
index 0000000..c511194
--- /dev/null
+++ b/src/scripts/register.js
@@ -0,0 +1,119 @@
+const password_strength = document.getElementById("password-strength");
+const password = document.getElementById("password");
+const email = document.getElementById("email");
+const repeat_password = document.getElementById("repeat-password");
+const success_view = document.getElementById("success-view");
+const form_view = document.getElementById("form-view");
+const container = document.getElementById("container");
+const registerForm = document.getElementById("register");
+
+document.getElementById("login").addEventListener("click", (e) => {
+ window.location.href = "./login.html";
+});
+
+password.addEventListener("input", function(e) {
+ this.value = password.value;
+ password_strength.style.display = "block";
+
+ if (this.value.match(/(?=.*[^A-Za-z0-9@_.-])/))
+ return (password_strength.className = "error invalid");
+
+ if (this.value.match(
+ /(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{10,})/,
+ ))
+ password_strength.className = "very-strong";
+ else if (this.value.match(/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,})/))
+ password_strength.className = "strong";
+ else if (this.value.match(/((?=.*[a-zA-Z0-9])(?=.{6,}))/))
+ password_strength.className = "medium";
+ else if (this.value.length > 0)
+ password_strength.className = "weak";
+ else
+ password_strength.className = "error empty";
+});
+
+registerForm.addEventListener("submit", (e) => {
+ e.preventDefault();
+
+ repeat_password.setCustomValidity("");
+ email.setCustomValidity("");
+ password.setCustomValidity("");
+
+ const values = {
+ email : email.value,
+ pass : password.value,
+ };
+
+ if (repeat_password.value != values.pass) {
+ repeat_password.setCustomValidity("與密碼不相符");
+ repeat_password.reportValidity();
+ return;
+ }
+
+ registerForm.disabled = true;
+
+ fetch("https://exptech.com.tw/api/v1/et/register", {
+ method : "POST",
+ headers : { "Content-Type": "application/json" },
+ body : JSON.stringify({
+ email : values.email,
+ pass : values.pass,
+ }),
+ })
+ .then(async (res) => {
+ if (res.ok) {
+ container.style.height = form_view.offsetHeight + 76;
+ form_view.style.position = "absolute";
+ success_view.style.position = "absolute";
+ success_view.style.display = "block";
+ form_view.style.opacity = 0;
+ container.style.height = success_view.offsetHeight + 76;
+ setTimeout(() => {
+ success_view.style.position = "";
+ success_view.style.opacity = 1;
+ form_view.style.display = "none";
+ form_view.style.position = "";
+ }, 100);
+
+ setTimeout(() => (window.location.href = "./login.html"), 5_000);
+ } else {
+ switch (await res.text()) {
+ case "Invaild email!": {
+ email.setCustomValidity("電子郵件地址無效。");
+ email.reportValidity();
+ break;
+ }
+
+ case "Invaild pass!": {
+ password.setCustomValidity("密碼無效。");
+ password.reportValidity();
+ break;
+ }
+
+ case "Pass format error!": {
+ password.setCustomValidity("密碼格式錯誤。");
+ password.reportValidity();
+ break;
+ }
+
+ case "This email already in use!": {
+ email.setCustomValidity("電子郵件地址已被使用。");
+ email.reportValidity();
+ break;
+ }
+
+ default: {
+ console.error(res);
+ break;
+ }
+ }
+ registerForm.disabled = false;
+ }
+ })
+ .catch((err) => {
+ console.error(err);
+ registerForm.disabled = false;
+ const res = err.request.response;
+ alert(res);
+ });
+});
\ No newline at end of file
diff --git a/src/scripts/user.js b/src/scripts/user.js
new file mode 100644
index 0000000..aa67ee8
--- /dev/null
+++ b/src/scripts/user.js
@@ -0,0 +1,543 @@
+import { ElementBuilder } from "./domhelper";
+
+const urlSearchParams = new URLSearchParams(window.location.search);
+const params = Object.fromEntries(urlSearchParams.entries());
+if (!params.token) window.location.replace("./login.html");
+
+Chart.defaults.borderColor = "#36A2EB";
+Chart.defaults.color = "white";
+
+for (const button of document.querySelectorAll("button.nav-item"))
+ button.addEventListener("click", () => {
+ if (document.getElementById(button.getAttribute("data-view")).classList.contains("active")) return;
+
+ for (const nav of document.querySelectorAll("button.nav-item")) {
+ nav.classList.remove("active");
+ document.getElementById(nav.getAttribute("data-view")).classList.remove("active");
+ }
+
+ button.classList.add("active");
+ setTimeout(() => document.getElementById(button.getAttribute("data-view")).classList.add("active"), 100);
+ });
+
+
+const table_service = document.getElementById("table-service");
+const table_device = document.getElementById("table-device");
+const table_status = document.getElementById("table-status");
+const table_key = document.getElementById("table-key");
+const table_api = document.getElementById("table-api");
+
+const create = document.getElementById("create");
+const note = document.getElementById("note");
+const announcement = document.getElementById("announcement");
+const ctx = document.getElementById("myChart");
+
+const alert_box = document.getElementById("alert-box");
+const index = document.getElementById("index");
+
+let client_limit = false;
+
+const a_type = [
+ { text: "錯誤", color: "red" },
+ { text: "已解決", color: "green" },
+ { text: "影響: 小", color: "dimgrey" },
+ { text: "影響: 中", color: "darkorange" },
+ { text: "影響: 大", color: "purple" },
+ { text: "公告", color: "darkblue" },
+ { text: "維修", color: "darkkhaki" },
+ { text: "測試", color: "darkcyan" },
+ { text: "變更", color: "deeppink" },
+ { text: "完成", color: "green" },
+];
+
+let service_list = [];
+let service_info = [];
+let user = {};
+let CTX;
+
+function Pay(type) {
+ document.getElementById("pay-page").style.display = "none";
+ fetch(`https://exptech.com.tw/api/v1/et/pay?type=${type}&token=${params.token}`)
+ .then(async res => {
+ const data = await res.json();
+ document.getElementById("TradeInfo").value = data.TradeInfo;
+ document.getElementById("TradeSha").value = data.TradeSha;
+ document.getElementById("Pay").style.display = "";
+ })
+ .catch(err => {
+ console.error(err);
+ const res = err.request.response;
+ alert(res);
+ });
+}
+
+const toTimeString = (timestamp) => {
+ const date = new Date(timestamp);
+ return [
+ [
+ `${date.getFullYear()}`,
+ `${date.getMonth() + 1}`.padStart(2, "0"),
+ `${date.getDate()}`.padStart(2, "0"),
+ ].join("/"),
+ " ",
+ [
+ `${date.getHours()}`.padStart(2, "0"),
+ `${date.getMinutes()}`.padStart(2, "0"),
+ `${date.getSeconds()}`.padStart(2, "0"),
+ ].join(":"),
+ ].join("");
+};
+
+fetch("https://exptech.com.tw/api/v1/et/service-info")
+ .then(async res => {
+ const data = await res.json();
+ service_list = data.list;
+ service_info = data.info;
+ refresh();
+ })
+ .catch(err => {
+ console.error(err);
+ const res = err.request.response;
+ alert(res);
+ });
+
+const client_text = document.getElementById("client");
+const day_text = document.getElementById("day");
+
+function refresh() {
+ for (const item of document.getElementsByClassName("load")) {
+ item.style.backgroundColor = "grey";
+ item.textContent = "資料更新中...";
+ item.style.pointerEvents = "none";
+ }
+ fetch(`https://exptech.com.tw/api/v1/et/info?token=${params.token}`)
+ .then(res => {
+ if (res.ok) {
+ res
+ .json()
+ .then(data => {
+ user = data;
+ if (Object.keys(user.client_list).length > user.client) {
+ if (!client_limit) {
+ client_limit = true;
+ alert_box.style.display = "";
+ index.style.display = "none";
+ document.getElementById("alert-box-text").innerHTML = "已超出此帳戶限制之 客戶端連接數
可能導致此帳戶底下的設備 無法正常運作";
+ }
+ client_text.style.color = "purple";
+ } else {
+ client_limit = false;
+ client_text.style.color = "white";
+ }
+ client_text.textContent = `${Object.keys(user.client_list).length}/${user.client}`;
+ document.getElementById("coin").textContent = user.coin;
+ document.getElementById("use").textContent = user.use;
+ const day_count = Math.floor(user.coin / user.use);
+ day_text.textContent = (!user.coin) ? "已用完" : (!user.use) ? "未使用" : `${day_count} 天`;
+ day_text.style.color = (!user.coin) ? "purple" : (!user.use) ? "lightgray" : (day_count < 7) ? "purple" : "white";
+ reload_service();
+ reload_device();
+ reload_status();
+ reload_key();
+ service_info_load();
+ setTimeout(() => {
+ for (const item of document.getElementsByClassName("load")) {
+ item.style.backgroundColor = "dodgerblue";
+ item.textContent = "資料更新";
+ item.style.pointerEvents = "";
+ item.onclick = () => {
+ refresh();
+ };
+ }
+ }, 5000);
+ });
+ } else
+ if (res.status == 400) {
+ console.log("Invalid or expired access token, redirecting to login page.");
+ window.location.replace("./login.html");
+ }
+ });
+
+ fetch("https://exptech.com.tw/api/v1/et/announcement")
+ .then(async res => {
+ const data = await res.json();
+ const frag = new DocumentFragment();
+ for (let i = 0; i < data.length; i++) {
+ const box = new ElementBuilder()
+ .setClass([ "announcement" ])
+ // subtitle
+ .addChildren(new ElementBuilder()
+ .setClass([ "announcement-subtitle" ])
+ .setContent(data[i].subtitle)
+ .addChildren(new ElementBuilder()
+ .setClass([ "announcement-tag-container" ])
+ // tags
+ .addChildren(data[i].type.map(tag => new ElementBuilder()
+ .setClass([ "tag" ])
+ .setContent(a_type[tag].text)
+ .setStyle("backgroundColor", a_type[tag].color)))))
+ // title
+ .addChildren(new ElementBuilder()
+ .setClass([ "announcement-title" ])
+ .setContent(data[i].title))
+ // body
+ .addChildren(new ElementBuilder()
+ .setClass([ "announcement-content" ])
+ .setContent(data[i].body))
+ .toElement();
+
+ frag.appendChild(box);
+ }
+
+ announcement.replaceChildren(frag);
+ })
+ .catch(err => {
+ console.error(err);
+ const res = err.request.response;
+ alert(res);
+ });
+}
+
+function service_info_load() {
+ const amount = {};
+
+ const Chart_data = {
+ labels : [],
+ datasets : [],
+ };
+
+ for (let i = 0; i < user.dump.length; i++) {
+ Chart_data.labels.push(`${user.dump[i].hour.replace(" ", "日 ")}時`);
+ for (let I = 0; I < Object.keys(user.dump[i].data).length; I++) {
+ const type = Object.keys(user.dump[i].data)[I];
+ if (!amount[type]) amount[type] = 0;
+ amount[type] += user.dump[i].data[type];
+ }
+ }
+
+ for (let i = 0; i < user.dump.length; i++)
+ for (let I = 0; I < Object.keys(amount).length; I++) {
+ const type = Object.keys(amount)[I];
+ const c = user.dump[i].data[type] ?? 0;
+ let find = false;
+ for (let _i = 0; _i < Chart_data.datasets.length; _i++)
+ if (Chart_data.datasets[_i].label == type) {
+ find = true;
+ Chart_data.datasets[_i].data.push(c);
+ break;
+ }
+
+ if (!find) Chart_data.datasets.push({
+ label : type,
+ data : [c],
+ backgroundColor : service_info[type]?.color ?? ColorCode(),
+ });
+ }
+
+
+ const frag = new DocumentFragment();
+ for (let i = 0; i < Object.keys(amount).length; i++) {
+ const type = Object.keys(amount)[i];
+ const box = document.createElement("tr");
+
+ const path = document.createElement("td");
+ path.textContent = type;
+ path.setAttribute("data-text", path.textContent);
+
+ const fun = document.createElement("td");
+ fun.textContent = (type.startsWith("ws")) ? "WebSocket" : (type.startsWith("get")) ? "GET" : "POST";
+ fun.setAttribute("data-text", fun.textContent);
+
+ const service = document.createElement("td");
+ service.textContent = service_info[type]?.service ?? "";
+ service.setAttribute("data-text", service.textContent);
+
+ const count = document.createElement("td");
+ count.textContent = amount[type];
+ count.setAttribute("data-text", count.textContent);
+
+ box.appendChild(path);
+ box.appendChild(fun);
+ box.appendChild(service);
+ box.appendChild(count);
+ frag.appendChild(box);
+ }
+
+ table_api.replaceChildren(frag);
+
+ if (!CTX) {
+ CTX = new Chart(ctx, {
+ type : "bar",
+ data : Chart_data,
+ options : {
+ plugins: {
+ title: {
+ display : true,
+ text : "ExpTech Service 流量圖 (點擊下方圖例可調整查看的服務類型)",
+ },
+ },
+ responsive : true,
+ scales : {
+ x: {
+ stacked: true,
+ },
+ y: {
+ stacked: true,
+ },
+ },
+ },
+ });
+ } else {
+ CTX.data = Chart_data;
+ CTX.update();
+ }
+}
+
+function ColorCode() {
+ const makingColorCode = "0123456789ABCDEF";
+ let finalCode = "#";
+ for (let counter = 0; counter < 6; counter++)
+ finalCode = finalCode + makingColorCode[Math.floor(Math.random() * 16)];
+ return finalCode;
+}
+
+const toggleService = (type, status) => {
+ fetch(`https://exptech.com.tw/api/v1/et/${(!status) ? "subscribe" : "unsubscribe"}?token=${params.token}&type=${type}`)
+ .then(res => {
+ if (res.ok)
+ refresh();
+ else
+ throw new Error(`The server returned a status code of ${res.status}`);
+ })
+ .catch(err => {
+ console.error(err);
+ alert(`無法${(!status) ? "訂閱" : "取消訂閱"}、請稍後再試。\n原因:${err}`);
+ });
+};
+
+const copy = (key) => {
+ navigator.clipboard.writeText(key)
+ .then(() => alert("已將金鑰複製至剪貼板"))
+ .catch(err => console.error(err));
+};
+
+const deleteKey = (key) => {
+ fetch(`https://exptech.com.tw/api/v1/et/key-remove?token=${params.token}&key=${key}`)
+ .then(res => {
+ if (res.ok)
+ refresh();
+ else
+ throw new Error(`The server returned a status code of ${res.status}`);
+ })
+ .catch(err => {
+ console.error(err);
+ alert(`無法${(!status) ? "訂閱" : "取消訂閱"}、請稍後再試。\n原因:${err}`);
+ });
+};
+
+function reload_key() {
+ const frag = new DocumentFragment();
+ for (let i = 0; i < Object.keys(user.key).length; i++) {
+ const k = Object.keys(user.key)[i];
+
+ const data = {
+ key : k.substring(0, 10),
+ time : toTimeString(user.key[k].time),
+ note : user.key[k].note,
+ };
+
+ const box = new ElementBuilder("tr")
+ // key
+ .addChildren(new ElementBuilder("td")
+ .setContent(data.key)
+ .setAttribute("data-text", data.key))
+ // time
+ .addChildren(new ElementBuilder("td")
+ .setContent(data.time)
+ .setAttribute("data-text", data.time))
+ // time
+ .addChildren(new ElementBuilder("td")
+ .setContent(data.note)
+ .setAttribute("data-text", data.note))
+ // copy to clipboard
+ .addChildren(new ElementBuilder("td")
+ .setClass([ "primary", "action" ])
+ .setContent("複製金鑰")
+ .setAttribute("data-text", "複製金鑰")
+ .on("click", copy, k))
+ // delete key
+ .addChildren(new ElementBuilder("td")
+ .setClass([ "danger", "action" ])
+ .setContent("刪除金鑰")
+ .setAttribute("data-text", "刪除金鑰")
+ .on("click", deleteKey, k))
+ .toElement();
+
+ frag.appendChild(box);
+ }
+
+ table_key.replaceChildren(frag);
+}
+
+function reload_status() {
+ const frag = new DocumentFragment();
+ for (let i = 0; i < Object.keys(user.key_list).length; i++) {
+ const k = Object.keys(user.key_list)[i];
+ const box = document.createElement("tr");
+
+ const key = document.createElement("td");
+ key.textContent = k.substring(0, 10);
+ key.setAttribute("data-text", key.textContent);
+
+ const ip = document.createElement("td");
+ ip.textContent = user.key_list[k].ip;
+ ip.setAttribute("data-text", ip.textContent);
+
+ const first = document.createElement("td");
+ first.textContent = toTimeString(user.key_list[k].start);
+ first.setAttribute("data-text", first.textContent);
+
+ const last = document.createElement("td");
+ last.textContent = toTimeString(user.key_list[k].time);
+ last.setAttribute("data-text", last.textContent);
+
+ box.appendChild(key);
+ box.appendChild(ip);
+ box.appendChild(first);
+ box.appendChild(last);
+ frag.appendChild(box);
+ }
+
+ table_status.replaceChildren(frag);
+}
+
+function reload_device() {
+ const frag = new DocumentFragment();
+ for (let i = 0; i < Object.keys(user.client_list).length; i++) {
+ const id = Object.keys(user.client_list)[i];
+ const box = document.createElement("tr");
+
+ const uuid = document.createElement("td");
+ uuid.textContent = id.substring(0, 10);
+ uuid.setAttribute("data-text", uuid.textContent);
+
+ const ip = document.createElement("td");
+ ip.textContent = user.client_list[id].ip;
+ ip.setAttribute("data-text", ip.textContent);
+
+ const first = document.createElement("td");
+ first.textContent = toTimeString(user.client_list[id].time);
+ first.setAttribute("data-text", first.textContent);
+
+ box.appendChild(uuid);
+ box.appendChild(ip);
+ box.appendChild(first);
+ frag.appendChild(box);
+ }
+
+ table_device.replaceChildren(frag);
+}
+
+function reload_service() {
+ const frag = new DocumentFragment();
+ for (let i = 0; i < service_list.length; i++) {
+ const item = service_list[i];
+
+ const isServicing = user.service?.includes(item.api) || typeof item.type == "boolean";
+ const isSubscribed = user.subscribe?.includes(item.api);
+
+ const box = new ElementBuilder("tr")
+ // 說明
+ .addChildren(new ElementBuilder("td")
+ .setContent(item.name)
+ .setAttribute("data-text", item.name))
+ // API
+ .addChildren(new ElementBuilder("td")
+ .setContent(item.api)
+ .setAttribute("data-text", item.api))
+ // 費用
+ .addChildren(new ElementBuilder("td")
+ .setContent(`${item.coin} 硬幣/天`)
+ .setAttribute("data-text", `${item.coin} 硬幣/天`))
+ // 服務
+ .addChildren(new ElementBuilder("td")
+ .setContent((isServicing) ? "服務中" : "未提供")
+ .setStyle("color", (isServicing) ? "#bfb" : "#fbb")
+ .setStyle("backgroundColor", (isServicing) ? "#0d04" : "#d004")
+ .setAttribute("data-text", (isServicing) ? "服務中" : "未提供"));
+
+ // 狀態
+ if (item.type && typeof item.type == "string")
+ box.addChildren(new ElementBuilder("td")
+ .setContent((isSubscribed) ? "已訂閱" : "未訂閱")
+ .setStyle("color", (isSubscribed) ? "#bfb" : "#fbb")
+ .setStyle("backgroundColor", (isSubscribed) ? "#0d04" : "#d004")
+ .setAttribute("data-text", (isSubscribed) ? "已訂閱" : "未訂閱"));
+ else
+ box.addChildren(new ElementBuilder("td"));
+
+ // 操作
+ if (item.type && typeof item.type == "string")
+ box.addChildren(new ElementBuilder("td")
+ .setClass([ "action", ...((isSubscribed) ? ["danger"] : ["primary"]) ])
+ .setContent((isSubscribed) ? "取消" : "訂閱")
+ .setAttribute("data-text", (isSubscribed) ? "取消" : "訂閱")
+ .on("click", toggleService, item.type, isSubscribed));
+ else
+ box.addChildren(new ElementBuilder("td"));
+
+ frag.appendChild(box.toElement());
+ }
+
+ table_service.replaceChildren(frag);
+}
+
+create.onclick = () => {
+ fetch("https://exptech.com.tw/api/v1/et/key-add", {
+ method : "POST",
+ headers : { "Content-Type": "application/json" },
+ body : JSON.stringify({
+ token : params.token,
+ note : note.value,
+ }),
+ })
+ .then(res => {
+ refresh();
+ note.value = "";
+ })
+ .catch(err => {
+ console.error(err);
+ const res = err.request.response;
+ alert(res);
+ });
+};
+
+document.getElementById("logout").addEventListener("click", function() {
+ document.body.style.pointerEvents = "none";
+ this.disabled = true;
+ this.classList.add("loading");
+ fetch(`https://exptech.com.tw/api/v1/et/logout?token=${params.token}`)
+ .then(res => {
+ if (res.ok)
+ window.location.replace("./login.html");
+ else
+ throw res.status;
+ })
+ .catch(err => {
+ console.error(err);
+ document.body.style.pointerEvents = "";
+ this.disabled = false;
+ this.classList.remove("loading");
+ });
+});
+
+function link(url) {
+ window.open(`https://${url}`, "_blank");
+}
+
+setInterval(() => refresh(), 60_000);
+
+document.getElementById("alert-box-button").onclick = () => {
+ index.style.display = "";
+ alert_box.style.display = "none";
+};
\ No newline at end of file
diff --git a/src/stylesheets/components/header.scss b/src/stylesheets/components/header.scss
new file mode 100644
index 0000000..8c5c50d
--- /dev/null
+++ b/src/stylesheets/components/header.scss
@@ -0,0 +1,29 @@
+.header {
+ display: flex;
+ gap: 8px;
+ font-size: 20px;
+ line-height: 22px;
+
+ > .header-image {
+ height: 100%;
+ aspect-ratio: 1;
+ background-image: url("../../images/exptech.png");
+ background-size: cover;
+ background-repeat: no-repeat;
+ }
+
+ > .header-title-container {
+ display: flex;
+ flex-direction: column;
+
+ > .header-title {
+ font-weight: 700;
+ }
+
+ > .header-page {
+ font-size: 16px;
+ color: #ccc;
+ font-weight: 400;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/stylesheets/components/input.scss b/src/stylesheets/components/input.scss
new file mode 100644
index 0000000..3e7955d
--- /dev/null
+++ b/src/stylesheets/components/input.scss
@@ -0,0 +1,45 @@
+label {
+ font-size: 14px;
+ line-height: 16px;
+ padding: 8px 0;
+ color: hsl(var(--on-surface-variant));
+}
+
+input[type=text],
+input[type=password],
+input[type=email] {
+ all: unset;
+ flex: 1;
+ padding: 12px;
+ font-size: 14px;
+ line-height: 16px;
+ border-radius: 4px;
+ outline: 1px solid hsl(var(--outline) / 40%);
+ transition: outline .1s ease-in-out;
+
+ &:disabled {
+ outline: 1px solid hsl(var(--on-surface-variant) / 12%);
+ color: hsl(var(--on-surface-variant) / 38%);
+ cursor: not-allowed;
+ }
+
+ &:not(:disabled) {
+ &:hover {
+ outline-color: hsl(var(--on-surface-variant));
+ }
+
+ &:active {
+ opacity: 0.8;
+ }
+
+ &:focus {
+ outline: 2px solid hsl(var(--primary));
+ background-color: hsl(var(--primary) / 8%);
+ color: hsl(var(--on-primary-container));
+ }
+ }
+
+ &::placeholder {
+ color: hsl(var(--on-surface-variant) / 60%)
+ }
+}
\ No newline at end of file
diff --git a/src/stylesheets/login.scss b/src/stylesheets/login.scss
new file mode 100644
index 0000000..3b4d6fb
--- /dev/null
+++ b/src/stylesheets/login.scss
@@ -0,0 +1,150 @@
+@use "./components/input.scss";
+
+:root {
+ --background: 285deg 100% 99%;
+ --on-background: 240deg 7% 11%;
+ --primary: 211deg 100% 37%;
+ --on-primary: 0deg 0% 100%;
+ --primary-container: 224deg 100% 92%;
+ --on-primary-container: 216deg 100% 13%;
+ --outline: 224deg 5% 48%;
+ --surface-variant: 230deg 24% 90%;
+ --on-surface-variant: 222deg 7% 29%;
+}
+
+body {
+ display: grid;
+ align-items: center;
+ justify-content: center;
+ margin: 0;
+ padding: 0;
+ height: 100svh;
+ color: hsl(var(--on-background));
+ background-color: hsl(var(--background));
+ font-family: Lato, "Noto Sans TC", sans-serif;
+ line-height: 18px;
+ overflow-x: hidden;
+ user-select: none;
+}
+
+.container {
+ width: 400px;
+ padding: 48px 36px;
+ padding-left: 28px;
+ background-color: hsla(var(--primary), 0.04);
+ outline: 1px solid hsl(var(--surface-variant));
+ box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1);
+ border-radius: 8px;
+}
+
+.title {
+ font-size: 24px;
+ line-height: 26px;
+ font-weight: bold;
+ text-align: center;
+ margin-bottom: 8px;
+}
+
+.description {
+ text-align: center;
+ margin: 16px;
+}
+
+.login-form {
+ display: table;
+ margin: 0;
+ width: 100%;
+}
+
+.form-item-container {
+ margin-left: 8px;
+ margin-bottom: 48px;
+}
+
+.form-item {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 12px;
+}
+
+.form-item {
+ margin-bottom: 12px;
+}
+
+#register {
+ all: unset;
+ padding: 10px 8px;
+ background-color: transparent;
+ color: hsl(var(--primary));
+ border-radius: 4px;
+ font-size: 16px;
+ line-height: 18px;
+ font-weight: bold;
+ transition: background-color .1s ease-in-out,
+ opacity .1s ease-in-out;
+}
+
+#register:hover {
+ background-color: hsla(var(--primary), 0.12);
+}
+
+#submit {
+ all: unset;
+ padding: 10px 24px;
+ background-color: hsl(var(--primary));
+ color: hsl(var(--on-primary));
+ border-radius: 4px;
+ font-size: 16px;
+ line-height: 18px;
+ font-weight: bold;
+ float: right;
+ transition: opacity .1s ease-in-out;
+}
+
+#register:active,
+#submit:active,
+a:active {
+ opacity: 0.8;
+}
+
+.forget-password {
+ align-self: start;
+ font-size: 14px;
+ font-weight: bold;
+ margin: 12px 0;
+ color: hsl(var(--primary));
+ text-decoration: none;
+}
+
+.info {
+ display: inline-block;
+ margin: 16px;
+ font-size: 14px;
+ line-height: 16px;
+ color: hsla(var(--on-surface-variant), .6);
+ text-decoration: none;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --background: 240deg 7% 11%;
+ --on-background: 255deg 7% 89%;
+ --primary: 220deg 100% 84%;
+ --on-primary: 213deg 100% 20%;
+ --primary-container: 212deg 100% 28%;
+ --on-primary-container: 224deg 100% 92%;
+ --outline: 229deg 5% 58%;
+ --surface-variant: 222deg 7% 29%;
+ --on-surface-variant: 230deg 11% 79%;
+ }
+
+ ::-ms-reveal {
+ filter: invert(100%);
+ }
+}
+
+@media screen and (max-width: 768px) {
+ .container {
+ width: auto;
+ }
+}
\ No newline at end of file
diff --git a/src/stylesheets/register.scss b/src/stylesheets/register.scss
new file mode 100644
index 0000000..2171cb2
--- /dev/null
+++ b/src/stylesheets/register.scss
@@ -0,0 +1,298 @@
+@use "./components/input.scss";
+
+:root {
+ --background: 48deg 83% 98%;
+ --on-background: 72deg 10% 10%;
+ --primary: 70deg 100% 20%;
+ --on-primary: 0deg 0% 100%;
+ --primary-container: 72deg 76% 71%;
+ --on-primary-container: 74deg 100% 6%;
+ --secondary-container: 69deg 41% 83%;
+ --on-secondary-container: 71deg 57% 7%;
+ --outline: 64deg 6% 44%;
+ --on-surface: 72deg 10% 10%;
+ --surface-variant: 64deg 24% 86%;
+ --on-surface-variant: 70deg 9% 26%;
+ --error: 0deg 75% 42%;
+ --medium: 47deg 100% 23%;
+ --strong: 72deg 100% 20%;
+ --very-strong: 300deg 76% 37%;
+}
+
+body {
+ display: grid;
+ align-items: center;
+ justify-content: center;
+ margin: 0;
+ padding: 0;
+ height: 100svh;
+ color: hsl(var(--on-background));
+ background-color: hsl(var(--background));
+ font-family: Lato, "Noto Sans TC", sans-serif;
+ line-height: 18px;
+ overflow-x: hidden;
+ user-select: none;
+}
+
+.view {
+ width: 400px;
+ transition: opacity 100ms ease-in-out;
+}
+
+#form-view {
+ opacity: 1;
+}
+
+#success-view {
+ display: none;
+ opacity: 0;
+}
+
+#invaild-view {
+ display: none;
+ opacity: 0;
+}
+
+.check-mark {
+ display: block;
+ margin: 32px auto;
+ fill: hsl(var(--primary));
+}
+
+.no-entry {
+ display: block;
+ margin: 32px auto;
+}
+
+.success-title {
+ color: hsl(var(--on-surface-variant));
+}
+
+.success-description {
+ margin: 8px;
+ color: hsl(var(--outline));
+ text-align: center;
+ font-size: 16px;
+ line-height: 18px;
+}
+
+#container {
+ position: relative;
+ width: 400px;
+ padding: 48px 36px;
+ padding-left: 28px;
+ border-radius: 8px;
+ background-color: hsl(var(--primary) 0.04);
+ outline: 1px solid hsl(var(--surface-variant));
+ transition: height 100ms ease-in-out;
+ box-shadow: 0 0 8px 0 rgb(0 0 0 / 10%);
+}
+
+.title {
+ margin-bottom: 8px;
+ text-align: center;
+ font-weight: bold;
+ font-size: 24px;
+ line-height: 26px;
+}
+
+.description {
+ margin: 16px;
+ text-align: center;
+}
+
+.register-form {
+ display: table;
+ width: 100%;
+ margin: 0;
+}
+
+.form-item-container {
+ margin-bottom: 32px;
+ margin-left: 8px;
+}
+
+.form-item {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 12px;
+}
+
+.input-action {
+ display: flex;
+}
+
+#password-strength {
+ display: none;
+ position: relative;
+ height: 4px;
+ margin-top: 12px;
+ margin-bottom: 32px;
+ border-radius: 4px;
+ background-color: hsl(var(--surface-variant));
+}
+
+#password-strength::before {
+ content: "";
+ position: absolute;
+ height: 100%;
+ width: 100%;
+ border-radius: 4px;
+ background-color: transparent;
+ transition: width .1s ease-in-out,
+ background-color .1s ease-in-out;
+}
+
+#password-strength::after {
+ content: "";
+ position: absolute;
+ top: 100%;
+ margin: 8px 0;
+ font-weight: bold;
+ font-size: 14px;
+ line-height: 16px;
+ transition: color .1s ease-in-out;
+}
+
+#password-strength.error::before {
+ color: hsl(var(--error));
+ background-color: hsl(var(--error));
+}
+
+#password-strength.weak::before {
+ width: 25%;
+ color: hsl(var(--outline));
+ background-color: hsl(var(--outline));
+}
+
+#password-strength.medium::before {
+ width: 50%;
+ color: hsl(var(--medium));
+ background-color: hsl(var(--medium));
+}
+
+#password-strength.strong::before {
+ width: 75%;
+ color: hsl(var(--strong));
+ background-color: hsl(var(--strong));
+}
+
+#password-strength.very-strong::before {
+ width: 100%;
+ color: hsl(var(--very-strong));
+ background-color: hsl(var(--very-strong));
+}
+
+#password-strength.error::after {
+ color: hsl(var(--error));
+}
+
+#password-strength.empty::after {
+ content: "密碼不得為空";
+}
+
+#password-strength.invalid::after {
+ content: "密碼只能包含大小寫半形英數、 _ 、 . 、- 和 @";
+}
+
+#password-strength.weak::after {
+ content: "密碼強度:弱";
+ width: 25%;
+ color: hsl(var(--outline));
+}
+
+#password-strength.medium::after {
+ content: "密碼強度:中等";
+ width: 50%;
+ color: hsl(var(--medium));
+}
+
+#password-strength.strong::after {
+ content: "密碼強度:強";
+ width: 75%;
+ color: hsl(var(--strong));
+}
+
+#password-strength.very-strong::after {
+ content: "密碼強度:非常強";
+ width: 100%;
+ color: hsl(var(--very-strong));
+}
+
+#login {
+ all: unset;
+ padding: 10px 8px;
+ border-radius: 4px;
+ color: hsl(var(--primary));
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 16px;
+ line-height: 18px;
+ transition: background-color .1s ease-in-out,
+ opacity .1s ease-in-out;
+}
+
+#login:hover {
+ background-color: hsl(var(--primary) 0.12);
+}
+
+#submit {
+ all: unset;
+ padding: 10px 24px;
+ border-radius: 4px;
+ color: hsl(var(--on-primary));
+ background-color: hsl(var(--primary));
+ font-weight: bold;
+ font-size: 16px;
+ line-height: 18px;
+ transition: background-color .1s ease-in-out,
+ color .1s ease-in-out,
+ opacity .1s ease-in-out;
+ float: right;
+}
+
+#submit:disabled {
+ color: hsl(var(--on-surface) .38);
+ background-color: hsl(var(--on-surface) .12);
+ cursor: not-allowed;
+}
+
+.info {
+ display: inline-block;
+ margin: 16px;
+ color: hsl(var(--on-surface-variant) .6);
+ text-decoration: none;
+ font-size: 14px;
+ line-height: 16px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --background: 72deg 10% 10%;
+ --on-background: 48deg 83% 98%;
+ --primary: 72deg 53% 61%;
+ --on-primary: 72deg 100% 10%;
+ --primary-container: 71deg 100% 15%;
+ --on-primary-container: 72deg 76% 71%;
+ --secondary-container: 72deg 21% 24%;
+ --on-secondary-container: 69deg 41% 83%;
+ --outline: 64deg 6% 54%;
+ --on-surface: 48deg 16% 87%;
+ --surface-variant: 70deg 9% 26%;
+ --on-surface-variant: 64deg 13% 75%;
+ --error: 6deg 100% 84%;
+ --medium: 47deg 88% 51%;
+ --strong: 71deg 100% 42%;
+ --very-strong: 308deg 100% 83%;
+ }
+
+ ::-ms-reveal {
+ filter: invert(100%);
+ }
+}
+
+@media screen and (width <= 768px) {
+ #container {
+ width: auto;
+ }
+}
\ No newline at end of file
diff --git a/src/stylesheets/user.scss b/src/stylesheets/user.scss
new file mode 100644
index 0000000..0ad2fcf
--- /dev/null
+++ b/src/stylesheets/user.scss
@@ -0,0 +1,607 @@
+@import url("https://fonts.googleapis.com/earlyaccess/cwtexyen.css");
+
+body {
+ display: grid;
+ height: 100svh;
+ width: 100svw;
+ margin: 0;
+ color: white;
+ background-color: #1f2026;
+ font-family: Lato, "Noto Sans TC", "微軟正黑體", sans-serif;
+ white-space: nowrap;
+ user-select: none;
+
+ > .app-container {
+ display: grid;
+ grid-template-rows: auto 1fr;
+ gap: 8px;
+ padding: 8px;
+
+ > .content {
+ display: grid;
+ grid-template-columns: 140px 1fr;
+ gap: 12px;
+ min-height: 0;
+ transition-property: grid-template-columns;
+ transition-duration: 200ms;
+ transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
+
+ > nav {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ > button.nav-item,
+ > button.nav-button {
+ all: unset;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin: 2px;
+ padding: 8px;
+ border-radius: 12px;
+ color: #aaa;
+ outline: 1px solid transparent;
+ font-weight: 400;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'opsz' 24;
+ cursor: pointer;
+ transition-property: background-color, color, opacity, outline, font-weight, font-variation-settings;
+ transition-duration: 100ms;
+ transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
+
+ &:not(.active) {
+ &:hover {
+ color: #ddd;
+ outline: 1px solid #aaa;
+ font-weight: 600;
+ font-variation-settings: 'FILL' 0, 'wght' 600, 'opsz' 24;
+ }
+
+ &:active {
+ opacity: .6;
+ font-weight: 300;
+ font-variation-settings: 'FILL' 0 , 'wght' 300, 'opsz' 24;
+ }
+ }
+
+ &.active {
+ color: #fff;
+ outline: 2px solid hsl(0deg 0% 80%);
+ font-weight: 500;
+ font-variation-settings: 'FILL' 1, 'wght' 500, 'opsz' 24;
+ }
+
+ &.danger {
+ color: hsl(5deg 100% 85%);
+
+ &:hover {
+ color: hsl(5deg 100% 75%);
+ background-color: hsl(5deg 100% 65% / 16%);
+ outline: 1px solid rgb(255 120 120 / 60%);
+ }
+ }
+
+ > .text {
+ opacity: 1;
+ transition-property: opacity;
+ transition-duration: 200ms;
+ transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
+ }
+ }
+ }
+
+ > .view-container {
+ display: flex;
+ flex-direction: column;
+ position: relative;
+
+ > .view {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ opacity: 0;
+ pointer-events: none;
+ overflow: hidden;
+ transition-property: opacity;
+ transition-duration: 200ms;
+ transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
+
+ &.active {
+ opacity: 1;
+ pointer-events: all;
+ overflow-y: auto;
+ }
+
+ >.container {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ padding-right: 8px;
+
+ > .view-header {
+ font-size: 28px;
+ font-weight: 700;
+
+ &:not(:first-child) {
+ padding-top: 1em;
+ }
+ }
+ }
+ }
+ }
+
+ > .overlay-container {
+ display: grid;
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100svh;
+ width: 100svw;
+ opacity: 0;
+ z-index: 999999;
+ pointer-events: none;
+ }
+ }
+ }
+}
+
+.card-container {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: 12px;
+
+ > .card {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ padding: 16px;
+ border-radius: 12px;
+ background-color: hsl(0deg 0% 100% / 6%);
+ border: 1px solid #666;
+
+ > .card-title {
+ color: #ccc;
+ font-size: 20px;
+ font-weight: 400;
+ line-height: 20px;
+ }
+
+ > .card-content {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+
+ > .card-value {
+ font-size: 36px;
+ line-height: 36px;
+ }
+ }
+ }
+}
+
+.announcement-container {
+ display: flex;
+ flex-direction: column;
+
+ > .announcement {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ padding: 8px 0;
+ border-bottom: 1px solid #666;
+
+ &:first-child {
+ padding-top: 0;
+ }
+
+ &:last-child {
+ padding-bottom: 0;
+ border-bottom: 0;
+ }
+
+ > .announcement-subtitle {
+ color: #ccc;
+ font-size: 14px;
+ line-height: 14px;
+
+ > .announcement-tag-container {
+ display: inline-flex;
+ flex-wrap: wrap;
+ gap: 4px;
+ margin: 0 4px;
+
+ > .tag {
+ color: #fff;
+ padding: 4px;
+ border-radius: 4px;
+ }
+ }
+ }
+
+ > .announcement-title {
+ font-size: 24px;
+ line-height: 24px;
+ font-weight: 500;
+ }
+
+ > .announcement-content {
+ color: #ccc;
+ }
+ }
+}
+
+.link-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+
+ > .link {
+ display: flex;
+ align-items: center;
+ gap: 2px;
+ color: hsl(225deg, 72%, 68%);
+ text-decoration: none;
+ font-size: 18px;
+ line-height: 20px;
+
+ > .link-text {
+ border-bottom: 1px solid hsl(225deg, 72%, 68%);
+ }
+
+ &.external::after {
+ content: "open_in_new";
+ font-family: "Material Symbols Rounded";
+ }
+ }
+}
+
+.application-container {
+ display: flex;
+ flex-direction: column;
+
+ > .application {
+ padding: 8px;
+
+ > .application-name-container {
+ display: flex;
+ align-items: flex-end;
+ gap: 8px;
+
+ > .application-name {
+ font-size: 24px;
+ font-weight: 700;
+ line-height: 24px;
+ }
+
+ > .application-version {
+ color: #aaa;
+ font-family: "Fira Code", consolas, monospace;
+ }
+ }
+
+ > .application-maintainer {
+ color: #aaa;
+ }
+
+ .application-description {
+ color: #ddd;
+ }
+ }
+}
+
+.table-wrapper {
+ overflow: auto;
+ padding-bottom: 4px;
+}
+
+table {
+ border-radius: 4px;
+ font-family: sans-serif;
+ font-size: 0.9em;
+ overflow: hidden;
+ border-collapse: collapse;
+ width: 100%;
+ box-shadow: 0 0 20px rgb(0 0 0 / 15%);
+}
+
+table>thead>tr {
+ background-color: hsl(300deg 100% 30%);
+ text-align: left;
+}
+
+table th,
+table td {
+ padding: 8px 10px;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+}
+
+table>tbody>tr>td::after {
+ content: attr(data-text);
+ display: block;
+ height: 0;
+ font-weight: bold;
+ overflow: hidden;
+ visibility: hidden;
+ pointer-events: none;
+}
+
+table>tbody>tr {
+ background-color: hsl(300deg 100% 30% / 12%);
+}
+
+table>tbody>tr:nth-of-type(even) {
+ background-color: hsl(300deg 100% 60% / 12%);
+}
+
+table>tbody>tr:last-of-type {
+ border-bottom: 2px solid hsl(300deg 100% 30%);
+}
+
+table>tbody>tr:hover {
+ color: hsl(300deg 100% 30%);
+ font-weight: bold;
+}
+
+.index1 {
+ position: fixed;
+ padding-left: 10px;
+}
+
+.title {
+ padding-left: 10px;
+ font-weight: 900;
+ font-size: 24px;
+}
+
+.subtitle {
+ padding-left: 10px;
+ font-weight: 300;
+ font-size: 16px;
+}
+
+.note {
+ border: 2px solid white;
+ border-radius: 5px;
+ color: white;
+ background-color: #333439;
+ outline: none;
+ text-align: center;
+ font-size: 20px;
+}
+
+.load {
+ margin: 3px;
+ padding: 5px;
+ border: 2px solid white;
+ border-radius: 5px;
+ background-color: dodgerblue;
+ font-size: 20px;
+ cursor: pointer;
+}
+
+.menu {
+ position: fixed;
+ left: 0;
+ width: 10%;
+ margin-top: 51px;
+ text-align: center;
+}
+
+.menu1 {
+ width: 10%;
+}
+
+.box {
+ height: calc(100vh - 60px);
+ width: 90%;
+ margin-top: 51px;
+ overflow: auto;
+}
+
+.menu-item {
+ margin: 10px;
+ padding: 20px;
+ border: 2px solid white;
+ border-radius: 5px;
+ color: darkgrey;
+ font-size: 40px;
+ cursor: pointer;
+}
+
+.box-item {
+ display: none;
+ height: 95%;
+ padding: 15px;
+ overflow-y: auto;
+}
+
+.box-items {
+ width: fit-content;
+ margin: 5px;
+ padding: 10px;
+ border: 2px solid white;
+ border-radius: 10px;
+}
+
+.Pay {
+ margin: 5px;
+ padding: 10px;
+ border-radius: 5px;
+ color: gold;
+ background-color: #333439;
+ font-weight: 900;
+ font-size: 40px;
+ cursor: pointer;
+ border-color: gold;
+}
+
+.warn {
+ padding: 5px;
+ color: gold;
+ font-size: 24px;
+}
+
+::selection {
+ color: #fff;
+ background: rgb(255 255 255 / 35%);
+}
+
+::-webkit-scrollbar {
+ height: 6px;
+ width: 6px;
+ background-color: rgb(255 255 255 / 8%);
+}
+
+::-webkit-scrollbar-thumb {
+ border-radius: 10px;
+ background-color: gray;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background-color: rgb(255 255 255 / 32%);
+}
+
+::-webkit-scrollbar-thumb:active {
+ background-color: rgb(255 255 255 / 8%);
+}
+
+.code-item {
+ margin: 10px;
+ padding: 10px;
+ border: 2px solid grey;
+ border-radius: 5px;
+}
+
+.code-title {
+ padding: 2px;
+ font-weight: 900;
+ font-size: 28px;
+}
+
+.code-subtitle {
+ padding: 2px;
+ font-weight: 300;
+ font-size: 22px;
+}
+
+.code-body {
+ padding: 2px;
+ font-size: 20px;
+}
+
+.studio {
+ color: gold;
+}
+
+.info-item {
+ margin: 10px;
+ padding: 15px;
+ border: 2px solid grey;
+ border-radius: 5px;
+}
+
+.info-title {
+ font-weight: 900;
+ font-size: 32px;
+}
+
+.info-note {
+ color: indianred;
+ font-weight: 600;
+}
+
+.info-body {
+ padding: 10px;
+ font-size: 24px;
+}
+
+.info-end {
+ padding: 5px;
+ font-weight: 400;
+ font-size: 18px;
+}
+
+.out {
+ border-radius: 5px;
+ color: white;
+ background-color: red;
+ font-size: 24px;
+ cursor: pointer;
+ border-color: white;
+}
+
+.info-box {
+ margin: 10px;
+ padding: 10px;
+}
+
+.alert-box {
+ position: absolute;
+ top: 25%;
+ left: 25%;
+ height: 50%;
+ width: 50%;
+ padding: 15px;
+ border: 2px solid white;
+ border-radius: 5px;
+ color: white;
+ background-color: rgb(75 9 9);
+ font-size: 28px;
+}
+
+.alert-box-button {
+ width: fit-content;
+ margin: 10px;
+ padding: 5px;
+ border: 2px solid blue;
+ border-radius: 5px;
+ background-color: darkblue;
+ font-size: 24px;
+ cursor: pointer;
+}
+
+.danger {
+ color: hsl(5deg 100% 85%);
+
+ &:hover {
+ color: hsl(5deg 100% 75%);
+ }
+}
+
+.primary {
+ color: hsl(214deg, 72%, 70%);
+
+ &:hover {
+ color: hsl(214deg, 72%, 60%);
+ }
+}
+
+.action {
+ text-decoration: underline;
+}
+
+@media screen and (max-width: 426px) {
+ body > .app-container > .content {
+ grid-template-columns: 44px 1fr;
+
+ > nav {
+ > button.nav-item,
+ > button.nav-button {
+ > .text {
+ opacity: 0;
+ overflow: hidden;
+ }
+ }
+ }
+ }
+}
+
+@media screen and (min-width: 768px) {
+ body > .app-container > .content {
+ grid-template-columns: 200px 1fr;
+ }
+}
diff --git a/src/user.pug b/src/user.pug
new file mode 100644
index 0000000..caba1b8
--- /dev/null
+++ b/src/user.pug
@@ -0,0 +1,523 @@
+html(lang="zh-Hant")
+
+ head
+ title#title TREM Service Panel
+ meta(charset="utf-8")
+ meta(name="viewport", content="width=device-width, initial-scale=1.0, user-scalable=no")
+ meta(name="description", content="用戶資訊面板")
+
+ //- Facebook Meta Tags
+ meta(property="og:site_name", content="探索科技 | ExpTech Studio")
+ meta(property="og:url", content="https://exptech.com.tw/api/v1/file/exptech/user.html")
+ meta(property="og:type", content="website")
+ meta(property="og:title", content="用戶資訊面板")
+ meta(property="og:description", content="管理你的 ExpTech 帳號")
+ meta(property="og:image", content="https://cdn.jsdelivr.net/gh/ExpTechTW/API@master/image/Icon/ExpTech.png")
+
+ //- Twitter Meta Tags
+ meta(name="twitter:card", content="summary")
+ meta(property="twitter:domain", content="exptech.com.tw")
+ meta(property="twitter:url", content="https://exptech.com.tw/api/v1/file/exptech/user.html")
+ meta(name="twitter:title", content="用戶資訊面板")
+ meta(name="twitter:description", content="管理你的 ExpTech 帳號")
+ meta(name="twitter:image", content="https://cdn.jsdelivr.net/gh/ExpTechTW/API@master/image/Icon/ExpTech.png")
+
+ link(rel="stylesheet", href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200")
+ link(rel="stylesheet", href="stylesheets/components/header.scss")
+ link(rel="stylesheet", href="stylesheets/user.scss")
+ body
+ .app-container
+ include ./components/header.pug
+ +header("TREM Service Panel")
+
+ .content
+ nav
+ include ./components/icon.pug
+ button.nav-item.active(type="button", data-view="home")
+ +icon("home")
+ span.text 首頁
+ button.nav-item(type="button", data-view="services")
+ +icon("api")
+ span.text 服務
+ button.nav-item(type="button", data-view="keys")
+ +icon("key")
+ span.text 金鑰
+ button.nav-item(type="button", data-view="status")
+ +icon("monitoring")
+ span.text 狀態
+ button.nav-item(type="button", data-view="devices")
+ +icon("devices")
+ span.text 設備
+ button.nav-item(type="button", data-view="applications")
+ +icon("apps")
+ span.text 程式
+ button.nav-item(type="button", data-view="charge")
+ +icon("add")
+ span.text 加值
+ button.nav-item(type="button", data-view="about")
+ +icon("info")
+ span.text 關於
+ button#logout.nav-button.danger
+ +icon("logout")
+ span.text 登出
+
+ .view-container
+ #home.view.active
+ .container
+ .view-header 帳戶資訊
+ .card-container
+ .card
+ .card-title 剩餘硬幣數量
+ .card-content
+ svg.bi.bi-coin(
+ style="color: gold"
+ width="36px"
+ height="36px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(d="M5.5 9.511c.076.954.83 1.697 2.182 1.785V12h.6v-.709c1.4-.098 2.218-.846 2.218-1.932 0-.987-.626-1.496-1.745-1.76l-.473-.112V5.57c.6.068.982.396 1.074.85h1.052c-.076-.919-.864-1.638-2.126-1.716V4h-.6v.719c-1.195.117-2.01.836-2.01 1.853 0 .9.606 1.472 1.613 1.707l.397.098v2.034c-.615-.093-1.022-.43-1.114-.9H5.5zm2.177-2.166c-.59-.137-.91-.416-.91-.836 0-.47.345-.822.915-.925v1.76h-.005zm.692 1.193c.717.166 1.048.435 1.048.91 0 .542-.412.914-1.135.982V8.518l.087.02z")
+ path(d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z")
+ path(d="M8 13.5a5.5 5.5 0 1 1 0-11 5.5 5.5 0 0 1 0 11zm0 .5A6 6 0 1 0 8 2a6 6 0 0 0 0 12z")
+ #coin.card-value
+
+ .card
+ .card-title 每日消耗數量
+ .card-content
+ svg.bi.bi-coin(
+ style="color: gold"
+ width="36px"
+ height="36px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(d="M5.5 9.511c.076.954.83 1.697 2.182 1.785V12h.6v-.709c1.4-.098 2.218-.846 2.218-1.932 0-.987-.626-1.496-1.745-1.76l-.473-.112V5.57c.6.068.982.396 1.074.85h1.052c-.076-.919-.864-1.638-2.126-1.716V4h-.6v.719c-1.195.117-2.01.836-2.01 1.853 0 .9.606 1.472 1.613 1.707l.397.098v2.034c-.615-.093-1.022-.43-1.114-.9H5.5zm2.177-2.166c-.59-.137-.91-.416-.91-.836 0-.47.345-.822.915-.925v1.76h-.005zm.692 1.193c.717.166 1.048.435 1.048.91 0 .542-.412.914-1.135.982V8.518l.087.02z")
+ path(d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z")
+ path(d="M8 13.5a5.5 5.5 0 1 1 0-11 5.5 5.5 0 0 1 0 11zm0 .5A6 6 0 1 0 8 2a6 6 0 0 0 0 12z")
+ #use.card-value
+
+ .card
+ .card-title 預計剩餘天數
+ .card-content
+ svg.bi.bi-graph-down-arrow(
+ style="color: red;"
+ width="36px"
+ height="36px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(
+ fill-rule="evenodd"
+ d="M0 0h1v15h15v1H0V0Zm10 11.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 0-1 0v2.6l-3.613-4.417a.5.5 0 0 0-.74-.037L7.06 8.233 3.404 3.206a.5.5 0 0 0-.808.588l4 5.5a.5.5 0 0 0 .758.06l2.609-2.61L13.445 11H10.5a.5.5 0 0 0-.5.5Z"
+ )
+ #day.card-value
+
+ .card
+ .card-title 客戶端連接數
+ .card-content
+ svg.bi.bi-speedometer(
+ style="color: lawngreen"
+ width="36px"
+ height="36px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(d="M8 2a.5.5 0 0 1 .5.5V4a.5.5 0 0 1-1 0V2.5A.5.5 0 0 1 8 2zM3.732 3.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 8a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 8zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 7.31A.91.91 0 1 0 8.85 8.569l3.434-4.297a.389.389 0 0 0-.029-.518z")
+ path(
+ fill-rule="evenodd"
+ d="M6.664 15.889A8 8 0 1 1 9.336.11a8 8 0 0 1-2.672 15.78zm-4.665-4.283A11.945 11.945 0 0 1 8 10c2.186 0 4.236.585 6.001 1.606a7 7 0 1 0-12.002 0z"
+ )
+ #client.card-value
+
+ // announcements
+ .view-header 公告
+ #announcement.announcement-container
+
+ // urls
+ .view-header 常用連結
+ .link-container
+ a.link.external(href="https://github.com/ExpTechTW", target="_blank", rel="noopener noreferrer")
+ .link-text GitHub
+ a.link.external(href="https://www.youtube.com/@exptech5327", target="_blank", rel="noopener noreferrer")
+ .link-text YouTube
+ a.link.external(href="https://exptech.com.tw/trem", target="_blank", rel="noopener noreferrer")
+ .link-text 線上展示
+ a.link.external(href="https://exptech.com.tw/api/v1/file/trem-infos.html", target="_blank", rel="noopener noreferrer")
+ .link-text 預警紀錄
+ a.link.external(href="https://docs.google.com/document/d/1MqWsmerVQs6VM-cJEG7ImtVlhCcEY7jRh8dVn0BscL0/view?rm=minimal", target="_blank", rel="noopener noreferrer")
+ .link-text 相關說明
+ a.link.external(href="https://www.google.com/maps/d/u/0/edit?mid=10dQPSTv3TN7Q0u-3CYnPf35JTeL_tDc", target="_blank", rel="noopener noreferrer")
+ .link-text 測站列表
+ a.link.external(href="https://stats.uptimerobot.com/KElQPHqKVk", target="_blank", rel="noopener noreferrer")
+ .link-text 伺服器狀態
+ a.link.external(href="https://exptech.com.tw/api/v1/file/status/index.html", target="_blank", rel="noopener noreferrer")
+ .link-text 伺服器流量
+
+ #services.view
+ .container
+ .view-header 可用服務列表
+ .table-wrapper
+ table
+ thead
+ tr
+ th 說明
+ th API
+ th 費用
+ th 服務
+ th 狀態
+ th 操作
+
+ tbody#table-service
+
+ .warn
+ div(style="display: flex; align-items: center;")
+ svg.bi.bi-exclamation-triangle-fill(
+ width="25px"
+ height="25px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z")
+
+ div(style="font-weight: 900; padding: 5px;")
+ | 注意
+ | WebSocket 模式下可以收到「較穩定快速的地震預警」
+
+ #keys.view
+ .container
+ .view-header 金鑰列表
+ div
+ input#note.note(
+ type="text"
+ placeholder="備註(可不填)"
+ )
+ button#create 創建金鑰
+
+ .table-wrapper
+ table
+ thead
+ tr
+ th Key(前10位)
+ th 創建時間
+ th 備註
+ th 操作
+ th 其他
+
+ tbody#table-key
+
+ #status.view
+ .container
+ .view-header 金鑰狀態列表
+ .table-wrapper
+ table
+ thead
+ tr
+ th Key(前10位)
+ th IP
+ th 初次連線時間
+ th 最後連線時間
+
+ tbody#table-status
+
+ .view-header 流量圖(近24小時)
+
+ canvas#myChart
+ div(style="font-size: 30px; font-weight: 900; padding: 10px;") 流量統計列表(近24小時)
+
+ .table-wrapper
+ table
+ thead
+ tr
+ th 路徑
+ th 請求類型
+ th 服務類型
+ th 次數
+
+ tbody#table-api
+
+ #devices.view
+ div(style="display: flex; align-items: center;")
+ div(style="font-size: 30px; font-weight: 900; padding: 10px;") 在線設備列表
+
+ .table-wrapper
+ table
+ thead
+ tr
+ th UUID(前10位)
+ th IP
+ th 連線時間
+
+ tbody#table-device
+ div(style="padding-top: 50px;")
+ input#eid.note(type="number", placeholder="EID")
+ button#add-device 新增裝置
+
+ div#device-setting(style="padding-top: 50px;display: none;")
+ div#config(style="font-size: 30px; font-weight: 900; padding: 10px;")
+ div: input#ssid.note(type="text", placeholder="SSID(exptech)")
+ div: input#pass.note(type="text", placeholder="Pass(1234567890)")
+ div: input#lon.note(type="number", placeholder="經度(120.2940045)")
+ div: input#lat.note(type="number", placeholder="緯度(22.967286)")
+ div: input#site.note(type="number", placeholder="場址值(1)")
+ button#device-config 配置
+ button#device-cancel 取消
+
+ div(style="font-size: 30px;font-weight: 900;padding: 10px;") 裝置列表(不計入客戶端連接數)
+ .table-wrapper
+ table(style="font-size: 18px;")
+ thead
+ tr
+ th EID
+ th 型號
+ th IP
+ th localIP
+ th 版本
+ th SSID
+ th RSSI
+ th Mac地址
+ th 最後連線時間
+ th 測試
+ th 設定
+ tbody#table-equipment
+
+ #applications.view
+ .application-container
+ .application
+ .application-name-container
+ .application-name TREM Lite
+ .application-version v1.6.5 (1.6.11)
+ .application-maintainer Maintained by whes1015
+ .application-description TREM Lite 是一款開源地震速報軟體,提供給您即時的地震資訊,利用自製的測站,顯示各地的即時震度,在地震發生的第一時間取得各管道發布的強震即時警報訊息。
+ .link-container
+ a.link(href="http://cdn.discordapp.com/attachments/1061979329279557632/1116057468984893521/TREM-Lite_Setup_1.6.5.exe", rel="noopener noreferrer", download)
+ +icon("download")
+ .link-text 下載 (Discord CDN)
+ a.link.external(href="https://github.com/ExpTechTW/TREM-Lite", target="_blank", rel="noopener noreferrer")
+ .link-text GitHub
+
+ .application
+ .application-name-container
+ .application-name TREM Plus
+ .application-version v6.0.178
+ .application-maintainer Maintained by yayacat
+ .application-description 各式功能聚集在一起的 TREM 客戶端。
+ .link-container
+ a.link.external(href="http://github.com/yayacat/TREM/releases/latest", target="_blank", rel="noopener noreferrer")
+ +icon("download")
+ .link-text 下載 (Github)
+
+ .application
+ .application-name-container
+ .application-name rts-map
+ .application-version v0.0.16
+ .application-maintainer Maintained by Kamiya
+ .application-description rts-map 即時觀測地圖。
+ .link-container
+ a.link(href="http://cdn.discordapp.com/attachments/1067331542294216724/1122623477485142116/rts-map_0.0.16.exe", rel="noopener noreferrer", download)
+ +icon("download")
+ .link-text 下載 (Discord CDN)
+
+ .application
+ .application-name-container
+ .application-name TREM Web
+ .application-version 網頁
+ .application-maintainer Maintained by whes1015
+ .application-description TREM 即時強震觀測網。
+ .link-container
+ a.link.external(href="http://exptech.com.tw/trem", target="_blank", rel="noopener noreferrer")
+ .link-text 網站
+
+ .application
+ .application-name-container
+ .application-name TREM SDMD
+ .application-version 網頁
+ .application-maintainer Maintained by whes1015
+ .application-description TREM Seismic Data Management System | TREM 地震資料管理系統。
+ .link-container
+ a.link.external(href="http://exptech.com.tw/api/v1/file/SDMS.html", target="_blank", rel="noopener noreferrer")
+ .link-text 網站
+
+ .application
+ .application-name-container
+ .application-name TREM Earthquake History
+ .application-version 網頁
+ .application-maintainer Maintained by whes1015, Kamiya
+ .application-description TREM 地震檢知紀錄。
+ .link-container
+ a.link.external(href="http://exptech.com.tw/api/v1/file/trem-infos.html", target="_blank", rel="noopener noreferrer")
+ .link-text 網站
+
+ .application
+ .application-name-container
+ .application-name CWB EEW History
+ .application-version 網頁
+ .application-maintainer Maintained by whes1015, Kamiya
+ .application-description 中央氣象局(CWB) 地震預警紀錄。
+ .link-container
+ a.link.external(href="http://exptech.com.tw/api/v1/file/eew-infos.html", target="_blank", rel="noopener noreferrer")
+ .link-text 網站
+
+ .application
+ .application-name-container
+ .application-name TREM Image
+ .application-version 網頁
+ .application-maintainer Maintained by whes1015
+ .application-description TREM 圖像。
+ .link-container
+ a.link.external(href="http://exptech.com.tw/api/v1/file/image.html", target="_blank", rel="noopener noreferrer")
+ .link-text 網站
+
+ #charge.view
+ .box-items(
+ onclick="Pay('1')"
+ style="background-color: dimgrey; cursor: pointer;"
+ )
+ div(style="font-size: 24px; font-weight: 900") 加值硬幣數量
+
+ div(style="display: flex; align-items: center;")
+ svg.bi.bi-database-fill-add(
+ style="color: darkorange"
+ width="45px"
+ height="45px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(d="M12.5 16a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Zm.5-5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0ZM8 1c-1.573 0-3.022.289-4.096.777C2.875 2.245 2 2.993 2 4s.875 1.755 1.904 2.223C4.978 6.711 6.427 7 8 7s3.022-.289 4.096-.777C13.125 5.755 14 5.007 14 4s-.875-1.755-1.904-2.223C11.022 1.289 9.573 1 8 1Z")
+ path(d="M2 7v-.839c.457.432 1.004.751 1.49.972C4.722 7.693 6.318 8 8 8s3.278-.307 4.51-.867c.486-.22 1.033-.54 1.49-.972V7c0 .424-.155.802-.411 1.133a4.51 4.51 0 0 0-4.815 1.843A12.31 12.31 0 0 1 8 10c-1.573 0-3.022-.289-4.096-.777C2.875 8.755 2 8.007 2 7Zm6.257 3.998L8 11c-1.682 0-3.278-.307-4.51-.867-.486-.22-1.033-.54-1.49-.972V10c0 1.007.875 1.755 1.904 2.223C4.978 12.711 6.427 13 8 13h.027a4.552 4.552 0 0 1 .23-2.002Zm-.002 3L8 14c-1.682 0-3.278-.307-4.51-.867-.486-.22-1.033-.54-1.49-.972V13c0 1.007.875 1.755 1.904 2.223C4.978 15.711 6.427 16 8 16c.536 0 1.058-.034 1.555-.097a4.507 4.507 0 0 1-1.3-1.905Z")
+
+
+ div(style="font-size: 45px; padding: 10px; text-align: end")
+ div(style="font-size: 45px") +100 硬幣
+ div(style="font-size: 22px; padding-right: 8px") NTD 100
+
+ .box-items(
+ onclick="Pay('2')"
+ style="background-color: darkslategrey; cursor: pointer;"
+ )
+ div(style="font-size: 24px; font-weight: 900") 加值硬幣數量
+
+ div(style="display: flex; align-items: center;")
+ svg.bi.bi-database-fill-add(
+ style="color: darkorange"
+ width="45px"
+ height="45px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(d="M12.5 16a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Zm.5-5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0ZM8 1c-1.573 0-3.022.289-4.096.777C2.875 2.245 2 2.993 2 4s.875 1.755 1.904 2.223C4.978 6.711 6.427 7 8 7s3.022-.289 4.096-.777C13.125 5.755 14 5.007 14 4s-.875-1.755-1.904-2.223C11.022 1.289 9.573 1 8 1Z")
+ path(d="M2 7v-.839c.457.432 1.004.751 1.49.972C4.722 7.693 6.318 8 8 8s3.278-.307 4.51-.867c.486-.22 1.033-.54 1.49-.972V7c0 .424-.155.802-.411 1.133a4.51 4.51 0 0 0-4.815 1.843A12.31 12.31 0 0 1 8 10c-1.573 0-3.022-.289-4.096-.777C2.875 8.755 2 8.007 2 7Zm6.257 3.998L8 11c-1.682 0-3.278-.307-4.51-.867-.486-.22-1.033-.54-1.49-.972V10c0 1.007.875 1.755 1.904 2.223C4.978 12.711 6.427 13 8 13h.027a4.552 4.552 0 0 1 .23-2.002Zm-.002 3L8 14c-1.682 0-3.278-.307-4.51-.867-.486-.22-1.033-.54-1.49-.972V13c0 1.007.875 1.755 1.904 2.223C4.978 15.711 6.427 16 8 16c.536 0 1.058-.034 1.555-.097a4.507 4.507 0 0 1-1.3-1.905Z")
+
+ div(style="font-size: 45px; padding: 10px; text-align: end")
+ div(style="font-size: 45px") +500 硬幣
+ div(style="font-size: 22px; padding-right: 8px") NTD 500
+
+ .box-items(
+ onclick="Pay('3')"
+ style="background-color: darkslateblue; cursor: pointer;"
+ )
+ div(style="font-size: 24px; font-weight: 900;") 加值硬幣數量
+ div(style="display: flex; align-items: center;")
+ svg.bi.bi-database-fill-add(
+ style="color: darkorange"
+ width="45px"
+ height="45px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(d="M12.5 16a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Zm.5-5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0ZM8 1c-1.573 0-3.022.289-4.096.777C2.875 2.245 2 2.993 2 4s.875 1.755 1.904 2.223C4.978 6.711 6.427 7 8 7s3.022-.289 4.096-.777C13.125 5.755 14 5.007 14 4s-.875-1.755-1.904-2.223C11.022 1.289 9.573 1 8 1Z")
+ path(d="M2 7v-.839c.457.432 1.004.751 1.49.972C4.722 7.693 6.318 8 8 8s3.278-.307 4.51-.867c.486-.22 1.033-.54 1.49-.972V7c0 .424-.155.802-.411 1.133a4.51 4.51 0 0 0-4.815 1.843A12.31 12.31 0 0 1 8 10c-1.573 0-3.022-.289-4.096-.777C2.875 8.755 2 8.007 2 7Zm6.257 3.998L8 11c-1.682 0-3.278-.307-4.51-.867-.486-.22-1.033-.54-1.49-.972V10c0 1.007.875 1.755 1.904 2.223C4.978 12.711 6.427 13 8 13h.027a4.552 4.552 0 0 1 .23-2.002Zm-.002 3L8 14c-1.682 0-3.278-.307-4.51-.867-.486-.22-1.033-.54-1.49-.972V13c0 1.007.875 1.755 1.904 2.223C4.978 15.711 6.427 16 8 16c.536 0 1.058-.034 1.555-.097a4.507 4.507 0 0 1-1.3-1.905Z")
+
+ div(style="font-size: 45px; padding: 10px; text-align: end;")
+ div(style="font-size: 45px;") +1000 硬幣
+ div(style="font-size: 22px; padding-right: 8px;") NTD 1000
+
+ form#Pay(
+ style="display: none"
+ action="https://ccore.newebpay.com/MPG/mpg_gateway"
+ method="POST"
+ )
+ input(type="text", name="MerchantID", value="MS149651414", hidden)
+ input#TradeInfo(type="text", name="TradeInfo", hidden)
+ input#TradeSha(type="text", name="TradeSha", hidden)
+ input(type="text", name="Version", value="2.0", hidden)
+ button.Pay(type="submit") 前往付款
+
+ #about.view
+ .container
+ .view-header TOS 服務條款
+ ol
+ li ExpTech 通過使用服務用戶被視為已同意#[span.info-note 使用條款]
+ li #[span.info-note 禁止未經允許的再分發] (開發團隊知情且允許的情況 不受此規範限制)
+ li 禁止轉售 TREM 提供之資訊
+ li 禁止違反法律法規或違反公共秩序和道德的行為
+ li TREM 使用 P2P 技術傳遞資訊
+ li 任何資訊均以#[span.info-note 中央氣象局(CWB)]發布之內容為準
+ li 所有非#[span.info-note 中央氣象局(CWB)]所提供之資料及其衍生服務均被視為#[span.info-note 進階功能]
+ li 不得於網路上傳播含「進階功能」之畫面 避免觸犯氣象法及造成社會大眾之誤導或錯誤理解其含義
+ li
+ | 購買進階功能將代表您已接受其存在資訊錯誤的#[span.info-note 風險],
+ | 應在購買前#[span.info-note 自行評估]。甲方一概不負責因上述原因所導致之一切後果
+ li 除以上條款外 任何開發團隊合理認為不適當的行為均不被允許
+
+ .info-end ExpTech Studio | 2023年07月12日 初稿
+
+ .view-header 資料來源
+ div 地震預警
+ div
+ ul
+ li: span 交通部中央氣象局 (CWB)
+ li: span 日本気象庁 (JMA)
+ li: span 防災科研 (NIED)
+ li: span 中国四川省地震局 (SCDZJ)
+ li: span 기상청 (KMA)
+
+ div 震度
+ div
+ ul
+ li: span 中央研究院 (SINICA)
+ li: span 臺灣即時地震監測 (TREM)
+
+ .view-header 貢獻者(Discord)
+ div ExpTech Studio
+ div
+ ul
+ li: span whes1015
+ li: span kamiya4047
+ li: span yayacat
+ li: span eggrollpvp
+
+ div ExpTech Family
+ div
+ ul
+ li: span __ellan
+ li: span xiaoan0711
+ li: span yawp93125
+ li: span yoyo0901
+ li: span xd_pisces
+ li: span tya8732
+ li: span xtw.littlecat
+ li: span cracks666666
+ li: span liangliang5102
+ li: span hy2seong
+
+ .info-end 包括但不限於上述列出之用戶 因為有這些人的付出,TREM 才能越來越好
+
+ .overlay-container
+ #alert-box.alert-box(style="display: none;")
+ div(style="display: flex; align-items: center; padding: 15px;")
+ svg.bi.bi-exclamation-octagon-fill(
+ style="color: red"
+ width="45px"
+ height="45px"
+ fill="currentColor"
+ viewBox="0 0 16 16"
+ )
+ path(d="M11.46.146A.5.5 0 0 0 11.107 0H4.893a.5.5 0 0 0-.353.146L.146 4.54A.5.5 0 0 0 0 4.893v6.214a.5.5 0 0 0 .146.353l4.394 4.394a.5.5 0 0 0 .353.146h6.214a.5.5 0 0 0 .353-.146l4.394-4.394a.5.5 0 0 0 .146-.353V4.893a.5.5 0 0 0-.146-.353L11.46.146zM8 4c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 4.995A.905.905 0 0 1 8 4zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z")
+
+ div(style="font-size: 40px; font-weight: 900; padding-left: 5px;") 警告
+
+ #alert-box-text(style="padding: 15px;")
+ #alert-box-button.alert-box-button 知道了
+
+ script(src="https://cdn.jsdelivr.net/npm/chart.js")
+ script(type="module", src="./scripts/user.js", module)