commit ba78899def915ec0aa0727d4ef85297410d488c0
Author: scout <1134087124@qq.com>
Date: Tue Dec 24 16:14:21 2024 +0800
初始化
diff --git a/.env b/.env
new file mode 100644
index 0000000..2d8026a
--- /dev/null
+++ b/.env
@@ -0,0 +1,8 @@
+ENV = 'development'
+
+VITE_BASE=/
+VUE_APP_PREVIEW=false
+VITE_BASE_API=http://172.16.100.93:9503
+VITE_EPR_BASEURL=http://114.218.158.24:9020
+VITE_SOCKET_API=ws://172.16.100.93:9504
+VUE_APP_WEBSITE_NAME="Lumen IM"
\ No newline at end of file
diff --git a/.env.electron b/.env.electron
new file mode 100644
index 0000000..be76da7
--- /dev/null
+++ b/.env.electron
@@ -0,0 +1,6 @@
+ENV = 'production'
+
+VITE_BASE=./
+VITE_ROUTER_MODE=hash
+VITE_BASE_API=https://xxx.xxx.com
+VITE_SOCKET_API=wss://xxx.xxx.com
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..1a87cea
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,7 @@
+# just a flag
+ENV = 'production'
+
+VITE_BASE=/
+VITE_ROUTER_MODE=history
+VITE_BASE_API=https://xxxx.xxx.com
+VITE_SOCKET_API=wss://xxxx.xxxx.com
\ No newline at end of file
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..319f8ac
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,23 @@
+/* eslint-env node */
+require('@rushstack/eslint-patch/modern-module-resolution')
+
+module.exports = {
+ env: {
+ node: true // 只需将该项设置为 true 即可
+ },
+ root: true,
+ 'extends': [
+ 'plugin:vue/vue3-essential',
+ 'eslint:recommended',
+ '@vue/eslint-config-typescript',
+ '@vue/eslint-config-prettier/skip-formatting'
+ ],
+ parserOptions: {
+ ecmaVersion: 'latest'
+ },
+ rules: {
+ 'vue/multi-word-component-names': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ "no-unused-vars":"off"
+ }
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e467976
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist_electron
+dist-ssr
+*.local
+makefile
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..66e2335
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://json.schemastore.org/prettierrc",
+ "semi": false,
+ "tabWidth": 2,
+ "singleQuote": true,
+ "printWidth": 100,
+ "trailingComma": "none"
+}
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..54bcea5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,87 @@
+# Lumen IM 即时聊天
+
+
+
+### 项目介绍
+
+Lumen IM 是一个网页版在线聊天项目,前端使用 Naive UI + Vue3,后端采用 GO 开发。
+
+### 功能模块
+
+- 支持私聊及群聊
+- 支持多种聊天消息类型 例如:文本消息、代码块、群投票、图片及其它类型文件,并支持文件下载
+- 支持聊天消息撤回、删除(批量删除)、转发消息(逐条转发、合并转发)
+- 支持编写笔记
+
+### 项目预览
+
+- 地址: [http://im.gzydong.com](http://im.gzydong.com)
+
+### 项目安装
+
+###### 下载安装
+
+```bash
+## 克隆项目源码包
+git clone https://gitee.com/gzydong/LumenIM.git
+或
+git clone https://github.com/gzydong/LumenIM.git
+
+## 安装项目依赖扩展组件
+yarn install
+
+# 启动本地开发环境
+yarn dev
+# 启动本地开发环境桌面客户端
+yarn electron:dev
+
+## 生产环境构建项目
+yarn build
+
+## 生产环境桌面客户端打包
+yarn electron:build
+```
+
+###### 修改 .env 配置信息
+
+```env
+VITE_BASE_API=http://127.0.0.1:9503
+VITE_SOCKET_API=ws://127.0.0.1:9504
+```
+
+###### 关于 Nginx 的一些配置
+
+```nginx
+server {
+ listen 80;
+ server_name www.yourdomain.com;
+
+ root /project-path/dist;
+ index index.html;
+
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+
+ location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
+ expires 7d;
+ }
+
+ location ~ .*\.(js|css)?$ {
+ expires 7d;
+ }
+}
+```
+
+### 项目源码
+
+| 代码仓库 | 前端源码 | 后端源码 |
+| -------- | ---------------------------------- | ---------------------------------- |
+| Github | https://github.com/gzydong/LumenIM | https://github.com/gzydong/go-chat |
+| 码云 | https://gitee.com/gzydong/LumenIM | https://gitee.com/gzydong/go-chat |
+
+#### 联系方式
+
+QQ作者 : 837215079
+
+### 如果你觉得还不错,请 Star , Fork 给作者鼓励一下。
diff --git a/build/icons/lumen-im-mac.png b/build/icons/lumen-im-mac.png
new file mode 100644
index 0000000..5ec94e9
Binary files /dev/null and b/build/icons/lumen-im-mac.png differ
diff --git a/build/icons/lumen-im-win.ico b/build/icons/lumen-im-win.ico
new file mode 100644
index 0000000..7f8f5db
Binary files /dev/null and b/build/icons/lumen-im-win.ico differ
diff --git a/build/icons/lumenim.icns b/build/icons/lumenim.icns
new file mode 100644
index 0000000..2b2bec9
Binary files /dev/null and b/build/icons/lumenim.icns differ
diff --git a/build/icons/lumenim.ico b/build/icons/lumenim.ico
new file mode 100644
index 0000000..7f8f5db
Binary files /dev/null and b/build/icons/lumenim.ico differ
diff --git a/build/icons/lumenim.png b/build/icons/lumenim.png
new file mode 100644
index 0000000..5ec94e9
Binary files /dev/null and b/build/icons/lumenim.png differ
diff --git a/electron/main.js b/electron/main.js
new file mode 100644
index 0000000..e9b733e
--- /dev/null
+++ b/electron/main.js
@@ -0,0 +1,92 @@
+// 控制应用生命周期和创建原生浏览器窗口的模组
+const { app, BrowserWindow, ipcMain, Menu, MenuItem } = require('electron')
+const path = require('path')
+
+const { shell } = require('electron')
+
+const NODE_ENV = process.env.NODE_ENV
+
+function loadHtmlUrl() {
+ return NODE_ENV === 'development'
+ ? `http://localhost:${process.env.PROT}`
+ : `file://${path.join(__dirname, '../dist/index.html')}`
+}
+
+function createWindow() {
+ // 创建浏览器窗口
+ const win = new BrowserWindow({
+ width: 1200,
+ height: 800,
+ minWidth: 900,
+ minHeight: 600,
+ frame: false,
+ titleBarStyle: 'hidden',
+ webPreferences: {
+ preload: path.join(__dirname, 'preload.js'),
+ contextIsolation: true,
+ },
+ })
+
+ // 加载 index.html
+ win.loadURL(loadHtmlUrl())
+
+ // 打开开发工具
+ if (NODE_ENV === 'development') {
+ win.webContents.openDevTools()
+ }
+
+ // 进入全屏模式
+ win.on('enter-full-screen', function () {
+ win.webContents.send('full-screen', 'enter')
+ })
+
+ // 退出全屏模式
+ win.on('leave-full-screen', function () {
+ win.webContents.send('full-screen', 'leave')
+ })
+
+ ipcMain.on('get-full-screen', (e, data) => {
+ e.returnValue = win.isFullScreen()
+ })
+
+ ipcMain.on('app-info', (e, data) => {
+ e.returnValue = {
+ platform: process.platform,
+ version: app.getVersion(),
+ appPath: app.getAppPath(),
+ }
+ })
+}
+
+// 这段程序将会在 Electron 结束初始化
+// 和创建浏览器窗口的时候调用
+// 部分 API 在 ready 事件触发后才能使用。
+app.whenReady().then(() => {
+ createWindow()
+
+ app.on('activate', function () {
+ // 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他
+ // 打开的窗口,那么程序会重新创建一个窗口。
+ if (BrowserWindow.getAllWindows().length === 0) createWindow()
+ })
+})
+
+// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此,通常对程序和它们在
+// 任务栏上的图标来说,应当保持活跃状态,直到用户使用 Cmd + Q 退出。
+app.on('window-all-closed', function () {
+ if (process.platform !== 'darwin') app.quit()
+})
+
+// 在这个文件中,你可以包含应用程序剩余的所有部分的代码,
+// 也可以拆分成几个文件,然后用 require 导入。
+
+ipcMain.on('ipc:set-badge', async (event, num) => {
+ if (process.platform === 'darwin') {
+ app.dock.setBadge(num > 99 ? '99+' : num)
+ }
+})
+
+ipcMain.on('ipc:open-link', async (event, link) => {
+ // Open a link in the default browser
+ shell.openExternal(link)
+})
diff --git a/electron/preload.js b/electron/preload.js
new file mode 100644
index 0000000..8d7895b
--- /dev/null
+++ b/electron/preload.js
@@ -0,0 +1,46 @@
+const { contextBridge, ipcRenderer } = require('electron')
+
+// 暴露方法给渲染进程调用
+contextBridge.exposeInMainWorld('electron', {
+ // 设置消息未读数
+ setBadge: num => {
+ ipcRenderer.send('ipc:set-badge', num == 0 ? '' : `${num}`)
+ },
+ // 获取窗口全屏状态
+ getFullScreenStatus: () => {
+ return ipcRenderer.sendSync('get-full-screen', '')
+ },
+ // 系统信息
+ getAppPlatform: () => {
+ return ipcRenderer.sendSync('app-info', '')
+ },
+
+ openLink: link => {
+ ipcRenderer.send('ipc:open-link', link)
+ },
+})
+
+// 窗口变化事件
+ipcRenderer.on('full-screen', function (event, value) {
+ // isFullScreenStatus = value == 'enter'
+
+ document.dispatchEvent(
+ new CustomEvent('full-screen-event', { detail: value })
+ )
+})
+
+// 触发自定义事件
+// document.dispatchEvent(new CustomEvent('myTestEvent', {num: i}))
+// document.addEventListener('myTestEvent', e => {console.log(e)})
+// 所有Node.js API都可以在预加载过程中使用。
+// 它拥有与Chrome扩展一样的沙盒。
+window.addEventListener('DOMContentLoaded', () => {
+ const replaceText = (selector, text) => {
+ const element = document.getElementById(selector)
+ if (element) element.innerText = text
+ }
+
+ for (const dependency of ['chrome', 'node', 'electron']) {
+ replaceText(`${dependency}-version`, process.versions[dependency])
+ }
+})
diff --git a/env.d.ts b/env.d.ts
new file mode 100644
index 0000000..a5628a4
--- /dev/null
+++ b/env.d.ts
@@ -0,0 +1,9 @@
+///
+
+declare module '*.vue' {
+ import { ComponentOptions } from 'vue'
+ const componentOptions: ComponentOptions
+ export default componentOptions
+}
+
+declare module 'quill-image-uploader'
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..5635e1e
--- /dev/null
+++ b/index.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+ Lumen IM 在线聊天
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7542876
--- /dev/null
+++ b/package.json
@@ -0,0 +1,103 @@
+{
+ "name": "LumenIM",
+ "private": true,
+ "version": "0.0.0",
+ "main": "electron/main.js",
+ "scripts": {
+ "dev": "vite --mode development --port 5273",
+ "build": "vite build",
+ "preview": "vite preview",
+ "electron": "wait-on tcp:5174 && cross-env NODE_ENV=development PROT=5174 electron .",
+ "electron:dev": "concurrently -k \"npm run dev\" \"npm run electron\"",
+ "electron:build": "vite build --mode electron && electron-builder --mac && electron-builder --win --x64",
+ "electron:build-mac": "vite build --mode electron && electron-builder --mac",
+ "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false",
+ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
+ "format": "prettier --write src/"
+ },
+ "dependencies": {
+ "@highlightjs/vue-plugin": "^2.1.0",
+ "@kangc/v-md-editor": "^2.3.18",
+ "@vueup/vue-quill": "^1.2.0",
+ "@vueuse/core": "^10.7.0",
+ "axios": "^1.6.2",
+ "highlight.js": "^11.5.0",
+ "js-audio-recorder": "^1.0.7",
+ "pinia": "^2.1.7",
+ "pinia-plugin-persistedstate": "^3.2.0",
+ "quill": "^1.3.7",
+ "quill-image-uploader": "^1.3.0",
+ "quill-mention": "^4.1.0",
+ "vue": "^3.3.11",
+ "vue-cropper": "^1.1.1",
+ "vue-router": "^4.2.5",
+ "vue-virtual-scroller": "^2.0.0-beta.8",
+ "vuedraggable": "^4.1.0",
+ "xgplayer": "^3.0.4"
+ },
+ "devDependencies": {
+ "@icon-park/vue-next": "^1.4.2",
+ "@rushstack/eslint-patch": "^1.3.3",
+ "@tsconfig/node18": "^18.2.2",
+ "@types/node": "^18.18.5",
+ "@types/vue": "^2.0.0",
+ "@vitejs/plugin-vue": "^4.4.0",
+ "@vitejs/plugin-vue-jsx": "^3.0.2",
+ "@vue/eslint-config-prettier": "^8.0.0",
+ "@vue/eslint-config-typescript": "^12.0.0",
+ "@vue/tsconfig": "^0.4.0",
+ "concurrently": "^7.3.0",
+ "cross-env": "^7.0.3",
+ "electron": "^19.1.9",
+ "electron-builder": "^23.6.0",
+ "eslint": "^8.49.0",
+ "eslint-config-prettier": "^9.0.0",
+ "eslint-plugin-prettier": "^5.0.1",
+ "eslint-plugin-vue": "^9.17.0",
+ "less": "^4.2.0",
+ "less-loader": "^11.1.3",
+ "naive-ui": "^2.35.0",
+ "npm-run-all2": "^6.1.1",
+ "prettier": "^3.1.0",
+ "typescript": "~5.2.0",
+ "vite": "^4.5.1",
+ "vite-plugin-compression": "^0.5.1",
+ "vue-tsc": "^1.8.25",
+ "wait-on": "^6.0.1"
+ },
+ "build": {
+ "appId": "com.gzydong.lumenim",
+ "productName": "LumenIM",
+ "copyright": "Copyright © 2023 LumenIM",
+ "mac": {
+ "category": "public.app-category.utilities",
+ "icon": "build/icons/lumen-im-mac.png"
+ },
+ "win": {
+ "icon": "build/icons/lumen-im-mac.png",
+ "target": [
+ {
+ "target": "nsis"
+ }
+ ]
+ },
+ "nsis": {
+ "oneClick": false,
+ "allowToChangeInstallationDirectory": true,
+ "installerIcon": "build/icons/lumen-im-win.ico",
+ "uninstallerIcon": "build/icons/lumen-im-win.ico",
+ "installerHeaderIcon": "build/icons/lumen-im-win.ico",
+ "createDesktopShortcut": true,
+ "createStartMenuShortcut": true,
+ "shortcutName": "lumeim-icon"
+ },
+ "files": [
+ "dist/**/*",
+ "electron/**/*"
+ ],
+ "directories": {
+ "buildResources": "assets",
+ "output": "dist_electron"
+ }
+ }
+}
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..7f8f5db
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 0000000..ee4f57d
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..907c3cd
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/api/article.js b/src/api/article.js
new file mode 100644
index 0000000..c999a50
--- /dev/null
+++ b/src/api/article.js
@@ -0,0 +1,138 @@
+import { post, get, upload } from '@/utils/request'
+import { getAccessToken } from '@/utils/auth'
+
+// -------- 笔记相关 --------
+
+// 查询用户文集分类服务接口
+export const ServeGetArticleList = (data) => {
+ return get('/api/v1/note/article/list', data)
+}
+
+// 编辑笔记服务接口
+export const ServeEditArticle = (data) => {
+ return post('/api/v1/note/article/editor', data)
+}
+
+// 删除笔记服务接口
+export const ServeDeleteArticle = (data) => {
+ return post('/api/v1/note/article/delete', data)
+}
+
+// 永久删除笔记回收站的笔记
+export const ServeForeverDeleteArticle = (data) => {
+ return post('/api/v1/note/article/forever/delete', data)
+}
+
+// 恢复笔记服务接口
+export const ServeRecoverArticle = (data) => {
+ return post('/api/v1/note/article/recover', data)
+}
+
+// 设置标记星号笔记服务接口
+export const ServeSetAsteriskArticle = (data) => {
+ return post('/api/v1/note/article/asterisk', data)
+}
+
+// 查询用户文集分类服务接口
+export const ServeGetArticleDetail = (data) => {
+ return get('/api/v1/note/article/detail', data)
+}
+
+// 移动笔记服务接口
+export const ServeMoveArticle = (data) => {
+ return post('/api/v1/note/article/move', data)
+}
+
+// 笔记图片上传服务接口
+export const ServeUploadArticleImg = (data) => {
+ return upload('/api/v1/note/article/upload/image', data)
+}
+
+// 更新笔记标签服务接口
+export const ServeUpdateArticleTag = (data) => {
+ return post('/api/v1/note/article/tag', data)
+}
+
+// -------- 笔记分类相关 --------
+
+// 查询用户文集分类服务接口
+export const ServeGetArticleClass = (data) => {
+ return get('/api/v1/note/class/list', data)
+}
+
+// 添加或编辑文集分类服务接口
+export const ServeEditArticleClass = (data) => {
+ return post('/api/v1/note/class/editor', data)
+}
+
+// 删除笔记分类服务接口
+export const ServeDeleteArticleClass = (data) => {
+ return post('/api/v1/note/class/delete', data)
+}
+
+// 笔记分类排序服务接口
+export const ServeArticleClassSort = (data) => {
+ return post('/api/v1/note/class/sort', data)
+}
+
+// 合并笔记分类服务接口
+export const ServeMergeArticleClass = (data) => {
+ return post('/api/v1/note/article/merge', data)
+}
+
+// -------- 笔记标签相关 --------
+
+// 获取笔记表标签服务接口
+export const ServeGetArticleTag = (data) => {
+ return get('/api/v1/note/tag/list', data)
+}
+
+// 添加或编辑笔记标签服务接口
+export const ServeEditArticleTag = (data) => {
+ return post('/api/v1/note/tag/editor', data)
+}
+
+// 删除笔记标签服务接口
+export const ServeDeleteArticleTag = (data) => {
+ return post('/api/v1/note/tag/delete', data)
+}
+
+// -------- 笔记附件相关 --------
+
+// 笔记附件上传服务接口
+export const ServeUploadArticleAnnex = (data) => {
+ return upload('/api/v1/note/annex/upload', data)
+}
+
+// 移除笔记附件服务接口
+export const ServeDeleteArticleAnnex = (data) => {
+ return post('/api/v1/note/annex/delete', data)
+}
+
+// 永久删除笔记附件回收站文件
+export const ServeForeverDeleteAnnex = (data) => {
+ return post('/api/v1/note/annex/forever/delete', data)
+}
+
+// 恢复笔记附件服务接口
+export const ServeRecoverArticleAnnex = (data) => {
+ return post('/api/v1/note/annex/recover', data)
+}
+
+// 笔记附件回收站列表服务接口
+export const ServeGetRecoverAnnexList = () => {
+ return get('/api/v1/note/annex/recover/list')
+}
+
+// 下载笔记附件服务接口
+export const ServeDownloadAnnex = (annex_id) => {
+ let api = import.meta.env.VITE_BASE_API
+ try {
+ let link = document.createElement('a')
+ // link.target = '_blank'
+ link.href = `${api}/api/v1/note/annex/download?annex_id=${annex_id}&token=${getAccessToken()}`
+ link.click()
+ } catch (e) {
+ console.error(e)
+ }
+}
diff --git a/src/api/auth.js b/src/api/auth.js
new file mode 100644
index 0000000..779fe4d
--- /dev/null
+++ b/src/api/auth.js
@@ -0,0 +1,27 @@
+// 授权相关接口
+import { post } from '@/utils/request'
+
+// 登录服务接口
+export const ServeLogin = (data) => {
+ return post('/api/v1/auth/login', data)
+}
+
+// 注册服务接口
+export const ServeRegister = (data) => {
+ return post('/api/v1/auth/register', data)
+}
+
+// 退出登录服务接口
+export const ServeLogout = (data) => {
+ return post('/api/v1/auth/logout', data)
+}
+
+// 刷新登录Token服务接口
+export const ServeRefreshToken = () => {
+ return post('/api/v1/auth/refresh-token')
+}
+
+// 找回密码服务
+export const ServeForgetPassword = (data) => {
+ return post('/api/v1/auth/forget', data)
+}
diff --git a/src/api/chat.js b/src/api/chat.js
new file mode 100644
index 0000000..ad87e6b
--- /dev/null
+++ b/src/api/chat.js
@@ -0,0 +1,88 @@
+import { post, get, upload } from '@/utils/request'
+
+// 获取聊天列表服务接口
+export const ServeGetTalkList = (data = {}) => {
+ return get('/api/v1/talk/list', data)
+}
+
+// 聊天列表创建服务接口
+export const ServeCreateTalkList = (data = {}) => {
+ return post('/api/v1/talk/create', data)
+}
+
+// 删除聊天列表服务接口
+export const ServeDeleteTalkList = (data = {}) => {
+ return post('/api/v1/talk/delete', data)
+}
+
+// 对话列表置顶服务接口
+export const ServeTopTalkList = (data = {}) => {
+ return post('/api/v1/talk/topping', data)
+}
+
+// 清除聊天消息未读数服务接口
+export const ServeClearTalkUnreadNum = (data = {}) => {
+ return post('/api/v1/talk/unread/clear', data)
+}
+
+// 获取聊天记录服务接口
+export const ServeTalkRecords = (data = {}) => {
+ return get('/api/v1/talk/records', data)
+}
+
+// 获取转发会话记录详情列表服务接口
+export const ServeGetForwardRecords = (data = {}) => {
+ return get('/api/v1/talk/records/forward', data)
+}
+
+// 对话列表置顶服务接口
+export const ServeSetNotDisturb = (data = {}) => {
+ return post('/api/v1/talk/disturb', data)
+}
+
+// 查找用户聊天记录服务接口
+export const ServeFindTalkRecords = (data = {}) => {
+ return get('/api/v1/talk/records/history', data)
+}
+
+// 搜索用户聊天记录服务接口
+export const ServeSearchTalkRecords = (data = {}) => {
+ return get('/api/v1/talk/search-chat-records', data)
+}
+
+export const ServeGetRecordsContext = (data = {}) => {
+ return get('/api/v1/talk/get-records-context', data)
+}
+
+// 发送代码块消息服务接口
+export const ServePublishMessage = (data = {}) => {
+ return post('/api/v1/talk/message/publish', data)
+}
+
+// 发送聊天文件服务接口
+export const ServeSendTalkFile = (data = {}) => {
+ return post('/api/v1/talk/message/file', data)
+}
+
+// 撤回消息服务接口
+export const ServeRevokeRecords = (data = {}) => {
+ return post('/api/v1/talk/message/revoke', data)
+}
+
+// 删除消息服务接口
+export const ServeRemoveRecords = (data = {}) => {
+ return post('/api/v1/talk/message/delete', data)
+}
+
+// 收藏表情包服务接口
+export const ServeCollectEmoticon = (data = {}) => {
+ return post('/api/v1/talk/message/collect', data)
+}
+
+export const ServeSendVote = (data = {}) => {
+ return post('/api/v1/talk/message/vote', data)
+}
+
+export const ServeConfirmVoteHandle = (data = {}) => {
+ return post('/api/v1/talk/message/vote/handle', data)
+}
diff --git a/src/api/common.js b/src/api/common.js
new file mode 100644
index 0000000..39d3745
--- /dev/null
+++ b/src/api/common.js
@@ -0,0 +1,11 @@
+import { post } from '@/utils/request'
+
+// 发送找回密码验证码
+export const ServeSendVerifyCode = (data) => {
+ return post('/api/v1/common/sms-code', data)
+}
+
+// 发送邮箱验证码服务接口
+export const ServeSendEmailCode = (data) => {
+ return post('/api/v1/common/email-code', data)
+}
diff --git a/src/api/contact.js b/src/api/contact.js
new file mode 100644
index 0000000..cfdba05
--- /dev/null
+++ b/src/api/contact.js
@@ -0,0 +1,63 @@
+import { post, get } from '@/utils/request'
+
+// 获取好友列表服务接口
+export const ServeGetContacts = (data) => {
+ return get('/api/v1/users/list', data)
+}
+
+// 解除好友关系服务接口
+export const ServeDeleteContact = (data) => {
+ return post('/api/v1/contact/delete', data)
+}
+
+// 修改好友备注服务接口
+export const ServeEditContactRemark = (data) => {
+ return post('/api/v1/contact/edit-remark', data)
+}
+
+// 搜索联系人
+export const ServeSearchContact = (data) => {
+ return get('/api/v1/contact/search', data)
+}
+
+// 好友申请服务接口
+export const ServeCreateContact = (data) => {
+ return post('/api/v1/contact/apply/create', data)
+}
+
+// 查询好友申请服务接口
+export const ServeGetContactApplyRecords = (data) => {
+ return get('/api/v1/contact/apply/records', data)
+}
+
+// 处理好友申请服务接口
+export const ServeApplyAccept = (data) => {
+ return post('/api/v1/contact/apply/accept', data)
+}
+
+export const ServeApplyDecline = (data) => {
+ return post('/api/v1/contact/apply/decline', data)
+}
+
+// 查询好友申请未读数量服务接口
+export const ServeFindFriendApplyNum = () => {
+ return get('/api/v1/contact/apply/unread-num')
+}
+
+// 搜索用户信息服务接口
+export const ServeSearchUser = (data) => {
+ return get('/api/v1/contact/detail', data)
+}
+
+// 搜索用户信息服务接口
+export const ServeContactGroupList = (data) => {
+ return get('/api/v1/contact/group/list', data)
+}
+
+export const ServeContactMoveGroup = (data) => {
+ return post('/api/v1/contact/move-group', data)
+}
+
+export const ServeContactGroupSave = (data) => {
+ return post('/api/v1/contact/group/save', data)
+}
diff --git a/src/api/emoticon.js b/src/api/emoticon.js
new file mode 100644
index 0000000..5423952
--- /dev/null
+++ b/src/api/emoticon.js
@@ -0,0 +1,30 @@
+import { post, get, upload } from '@/utils/request'
+
+// 查询用户表情包服务接口
+export const ServeFindUserEmoticon = () => {
+ return get('/api/v1/emoticon/list')
+}
+
+// 查询系统表情包服务接口
+export const ServeFindSysEmoticon = () => {
+ return get('/api/v1/emoticon/system/list')
+}
+
+// 设置用户表情包服务接口
+export const ServeSetUserEmoticon = (data) => {
+ return post('/api/v1/emoticon/system/install', data)
+}
+
+// 移除收藏表情包服务接口
+export const ServeDelCollectEmoticon = (data) => {
+ return post('/api/v1/emoticon/del-collect-emoticon', data)
+}
+
+// 上传表情包服务接口
+export const ServeUploadEmoticon = (data) => {
+ return upload('/api/v1/emoticon/customize/create', data)
+}
+
+export const ServeDeleteEmoticon = (data) => {
+ return upload('/api/v1/emoticon/customize/delete', data)
+}
diff --git a/src/api/group.js b/src/api/group.js
new file mode 100644
index 0000000..473dcfd
--- /dev/null
+++ b/src/api/group.js
@@ -0,0 +1,116 @@
+import { post, get } from '@/utils/request'
+
+// 查询用户群聊服务接口
+export const ServeGetGroups = () => {
+ return get('/api/v1/group/list')
+}
+
+export const ServeGroupOvertList = (data) => {
+ return get('/api/v1/group/overt/list', data)
+}
+
+// 获取群信息服务接口
+export const ServeGroupDetail = (data) => {
+ return get('/api/v1/group/detail', data)
+}
+
+// 创建群聊服务接口
+export const ServeCreateGroup = (data) => {
+ return post('/api/v1/group/create', data)
+}
+
+// 修改群信息
+export const ServeEditGroup = (data) => {
+ return post('/api/v1/group/setting', data)
+}
+
+// 邀请好友加入群聊服务接口
+export const ServeInviteGroup = (data) => {
+ return post('/api/v1/group/invite', data)
+}
+
+// 移除群聊成员服务接口
+export const ServeRemoveMembersGroup = (data) => {
+ return post('/api/v1/group/member/remove', data)
+}
+
+// 管理员解散群聊服务接口
+export const ServeDismissGroup = (data) => {
+ return post('/api/v1/group/dismiss', data)
+}
+
+export const ServeMuteGroup = (data) => {
+ return post('/api/v1/group/mute', data)
+}
+
+export const ServeOvertGroup = (data) => {
+ return post('/api/v1/group/overt', data)
+}
+
+// 用户退出群聊服务接口
+export const ServeSecedeGroup = (data) => {
+ return post('/api/v1/group/secede', data)
+}
+
+// 修改群聊名片服务接口
+export const ServeUpdateGroupCard = (data) => {
+ return post('/api/v1/group/member/remark', data)
+}
+
+// 获取用户可邀请加入群聊的好友列表
+export const ServeGetInviteFriends = (data) => {
+ return get('/api/v1/group/member/invites', data)
+}
+
+// 获取群聊成员列表
+export const ServeGetGroupMembers = (data) => {
+ return get('/api/v1/group/member/list', data)
+}
+
+// 获取群聊公告列表
+export const ServeGetGroupNotices = (data) => {
+ return get('/api/v1/group/notice/list', data)
+}
+
+// 编辑群公告
+export const ServeEditGroupNotice = (data) => {
+ return post('/api/v1/group/notice/edit', data)
+}
+
+export const ServeGetGroupApplyList = (data) => {
+ return get('/api/v1/group/apply/list', data)
+}
+
+export const ServeGetGroupApplyAll = (data) => {
+ return get('/api/v1/group/apply/all', data)
+}
+
+export const ServeDeleteGroupApply = (data) => {
+ return post('/api/v1/group/apply/decline', data)
+}
+
+export const ServeAgreeGroupApply = (data) => {
+ return post('/api/v1/group/apply/agree', data)
+}
+
+export const ServeCreateGroupApply = (data) => {
+ return post('/api/v1/group/apply/create', data)
+}
+
+export const ServeGroupApplyUnread = (data) => {
+ return get('/api/v1/group/apply/unread', data)
+}
+
+// 转让群主
+export const ServeGroupHandover = (data) => {
+ return post('/api/v1/group/handover', data)
+}
+
+// 分配管理员
+export const ServeGroupAssignAdmin = (data) => {
+ return post('/api/v1/group/assign-admin', data)
+}
+
+export const ServeGroupNoSpeak = (data) => {
+ return post('/api/v1/group/no-speak', data)
+}
diff --git a/src/api/organize.js b/src/api/organize.js
new file mode 100644
index 0000000..f30b416
--- /dev/null
+++ b/src/api/organize.js
@@ -0,0 +1,13 @@
+import { get } from '@/utils/request'
+
+export const ServeDepartmentList = () => {
+ return get('/api/v1/organize/department/all')
+}
+
+export const ServePersonnelList = () => {
+ return get('/api/v1/organize/personnel/all')
+}
+
+export const ServeCheckQiyeMember = () => {
+ return get('/api/v1/organize/member/check')
+}
diff --git a/src/api/upload.js b/src/api/upload.js
new file mode 100644
index 0000000..c6e9a17
--- /dev/null
+++ b/src/api/upload.js
@@ -0,0 +1,26 @@
+import { post, upload } from '@/utils/request'
+
+// 上传头像裁剪图片服务接口
+export const ServeUploadAvatar = (data) => {
+ return post('/api/v1/upload/avatar', data)
+}
+
+// 上传头像裁剪图片服务接口
+export const ServeUploadImage = (data) => {
+ return post('/api/v1/upload/image', data)
+}
+
+// 查询大文件拆分信息服务接口
+export const ServeFindFileSplitInfo = (data = {}) => {
+ return post('/api/v1/upload/multipart/initiate', data)
+}
+
+// 文件拆分上传服务接口
+export const ServeFileSubareaUpload = (data = {}, options = {}) => {
+ return upload('/api/v1/upload/multipart', data, options)
+}
+
+// 上传图片文件或者视频
+export const uploadImg = (data) => {
+ return post('/upload/img', data,{baseURL:import.meta.env.VITE_EPR_BASEURL})
+}
diff --git a/src/api/user.js b/src/api/user.js
new file mode 100644
index 0000000..76c55b7
--- /dev/null
+++ b/src/api/user.js
@@ -0,0 +1,31 @@
+import { post, get } from '@/utils/request'
+
+// 修改密码服务接口
+export const ServeUpdatePassword = (data) => {
+ return post('/api/v1/users/change/password', data)
+}
+
+// 修改手机号服务接口
+export const ServeUpdateMobile = (data) => {
+ return post('/api/v1/users/change/mobile', data)
+}
+
+// 修改手机号服务接口
+export const ServeUpdateEmail = (data) => {
+ return post('/api/v1/users/change/email', data)
+}
+
+// 修改个人信息服务接口
+export const ServeUpdateUserDetail = (data) => {
+ return post('/api/v1/users/change/detail', data)
+}
+
+// 查询用户信息服务接口
+export const ServeGetUserDetail = () => {
+ return get('/api/v1/users/detail')
+}
+
+// 获取用户相关设置信息
+export const ServeGetUserSetting = () => {
+ return get('/api/v1/users/setting')
+}
diff --git a/src/assets/css/contact.less b/src/assets/css/contact.less
new file mode 100644
index 0000000..a79a928
--- /dev/null
+++ b/src/assets/css/contact.less
@@ -0,0 +1,69 @@
+.title {
+ height: 60px;
+ line-height: 60px;
+ padding-left: 15px;
+ color: rgba(0, 0, 0, 0.85);
+ font-size: 20px;
+ font-weight: 500;
+ border-bottom: 1px solid var(--border-color);
+}
+
+.view-box {
+ padding: 15px;
+ padding-top: 0;
+ margin-top: 15px;
+
+ .view-list {
+ height: 60px;
+ margin: 5px 0;
+ padding: 5px;
+ display: flex;
+ padding-left: 0;
+ border: 1px solid transparent;
+ transition: padding 0.5s ease-in-out;
+
+ &:hover,
+ &.selectd {
+ border-radius: 2px;
+ padding: 5px 10px;
+ border: 1px solid rgb(80 138 254);
+ cursor: pointer;
+ }
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ .image {
+ width: 60px;
+ margin-right: 5px;
+ justify-content: flex-start;
+ }
+
+ .content {
+ flex: auto;
+
+ .name {
+ color: rgba(0, 0, 0, 0.65);
+ font-size: 15px;
+ height: 30px;
+ line-height: 30px;
+ font-weight: 500;
+ }
+
+ .desc {
+ height: 30px;
+ line-height: 30px;
+ color: rgba(0, 0, 0, 0.45);
+ font-size: 14px;
+ }
+ }
+
+ .tools {
+ width: 100px;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ }
+ }
+}
diff --git a/src/assets/css/define/global.less b/src/assets/css/define/global.less
new file mode 100644
index 0000000..96b14d1
--- /dev/null
+++ b/src/assets/css/define/global.less
@@ -0,0 +1,289 @@
+* {
+ margin: 0;
+ padding: 0;
+}
+
+@font-face {
+ font-family: 'Alibaba PuHuiTi 2.0 45';
+ src:
+ url('../../fonts/AlibabaPuHuiTi/AlibabaPuHuiTi_2_45_Light.woff2') format('woff2'),
+ url('../../fonts/AlibabaPuHuiTi/AlibabaPuHuiTi_2_45_Light.woff') format('woff');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+body,
+html {
+ height: 100%;
+ min-width: 500px;
+ color: #333;
+ font-size: 14px;
+ font-family:
+ LarkHackSafariFont,
+ LarkEmojiFont,
+ LarkChineseQuote,
+ -apple-system,
+ BlinkMacSystemFont,
+ Helvetica Neue,
+ Segoe UI,
+ PingFang SC,
+ Microsoft Yahei,
+ Arial,
+ Hiragino Sans GB,
+ sans-serif,
+ Apple Color Emoji,
+ Segoe UI Emoji,
+ Segoe UI Symbol,
+ Noto Color Emoji;
+}
+
+button,
+input,
+select,
+textarea {
+ font-size: 100%;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+}
+
+img {
+ border: 0;
+}
+
+a,
+img {
+ -webkit-touch-callout: none;
+}
+
+a {
+ text-decoration: none;
+ color: #333;
+}
+
+textarea {
+ resize: none;
+ outline: 0;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ border: none;
+ background: #fff;
+ font-family: 'Microsoft YaHei';
+}
+
+:focus {
+ outline: none;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.height100 {
+ height: 100%;
+}
+
+.o-hidden {
+ overflow: hidden;
+}
+
+.hidden {
+ overflow: hidden;
+}
+
+.el-container {
+ display: flex;
+ flex-direction: row;
+ flex: 1;
+ flex-basis: auto;
+ box-sizing: border-box;
+ min-width: 0;
+}
+
+.el-container.is-vertical,
+.el-drawer {
+ -webkit-box-orient: vertical;
+}
+
+.el-aside,
+.el-header {
+ -webkit-box-sizing: border-box;
+}
+
+.el-container.is-vertical {
+ flex-direction: column;
+}
+
+.el-aside,
+.el-header {
+ box-sizing: border-box;
+ flex-shrink: 0;
+}
+
+.el-aside {
+ overflow: auto;
+}
+
+.el-footer,
+.el-main {
+ -webkit-box-sizing: border-box;
+}
+
+.el-main {
+ display: block;
+ flex: 1;
+ flex-basis: auto;
+ overflow: auto;
+}
+
+.el-footer,
+.el-main {
+ box-sizing: border-box;
+}
+
+.el-footer {
+ flex-shrink: 0;
+}
+
+// 滚动条样式
+.me-scrollbar {
+ &::-webkit-scrollbar {
+ width: 3px;
+ height: 3px;
+ background-color: transparent;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ border-radius: 3px;
+ background-color: transparent;
+ }
+
+ &:hover {
+ &::-webkit-scrollbar {
+ background-color: var(--im-scrollbar);
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: var(--im-scrollbar-thumb);
+ }
+ }
+
+ &.me-scrollbar-thumb {
+ &::-webkit-scrollbar {
+ background-color: unset;
+ }
+ }
+}
+
+// 全局边框
+.bdr-t {
+ border-top: 1px solid var(--line-border-color);
+}
+
+.bdr-r {
+ border-right: 1px solid var(--line-border-color);
+}
+
+.bdr-b {
+ border-bottom: 1px solid var(--line-border-color);
+}
+
+.bdr-l {
+ border-left: 1px solid var(--line-border-color);
+}
+
+.badge {
+ font-size: 12px;
+ font-weight: 400;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 6px;
+ border-radius: 2px;
+ cursor: default;
+ user-select: none;
+ background-color: #dee0e3;
+ transform: scale(0.84);
+ transform-origin: left;
+ flex-shrink: 0;
+}
+
+.mt-l5 {
+ margin-left: 5px;
+}
+
+.mt-l15 {
+ margin-left: 15px;
+}
+
+.mt-t20 {
+ margin-top: 20px;
+}
+
+.mt-b10 {
+ margin-bottom: 10px;
+}
+
+.pd-10 {
+ padding: 10px;
+}
+.pd-t15 {
+ padding-top: 20px;
+}
+.pd-t20 {
+ padding-top: 20px;
+}
+
+.flex {
+ display: flex;
+}
+
+.flex-center {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.text-ellipsis {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.mention {
+ color: #2196f3;
+ padding: 0 2px;
+ cursor: pointer;
+}
+
+.modal-radius {
+ border-radius: 10px;
+}
+
+.n-drawer-container {
+ overflow: hidden;
+}
+
+.xg-options-list {
+ overflow: hidden !important;
+}
+
+.me-view-header {
+ height: 60px;
+ display: flex;
+ align-items: center;
+ padding: 0 15px;
+ justify-content: space-between;
+}
+
+.icon-rotate {
+ animation: rotate 1s linear infinite;
+}
+
+@keyframes rotate {
+ to {
+ transform: rotate(360deg);
+ }
+}
diff --git a/src/assets/css/define/theme.less b/src/assets/css/define/theme.less
new file mode 100644
index 0000000..cf71cad
--- /dev/null
+++ b/src/assets/css/define/theme.less
@@ -0,0 +1,75 @@
+// 默认主题
+html {
+ --im-primary-color: #1890ff;
+ --im-bg-color: #ffffff;
+ --line-border-color: #f5f5f5;
+ --border-color: #eeeaea;
+ --im-text-color: #333;
+ --im-text-color-grey: #333;
+ --im-active-bg-color: #f5f5f5;
+ --im-hover-bg-color: #f5f5f5;
+
+ --im-broadside-box-shadow: rgba(29, 35, 41, 0.05);
+
+ // note
+ --im-note-list-bg-color: #f4f6f9;
+
+ // 滚动条
+ --im-scrollbar: #e4e4e5;
+ --im-scrollbar-thumb: #c0bebc;
+
+ // message
+ --im-message-bg-color: #f7f7f7;
+ --im-message-border-color: #efeff5;
+ --im-message-left-bg-color: #eff0f1;
+ --im-message-left-text-color: #333;
+ --im-message-right-bg-color: #daf3fd;
+ --im-message-right-text-color: #333;
+}
+
+// 黑色主题
+html[theme-mode='dark'] {
+ --im-primary-color: #1890ff;
+ --im-bg-color: #202124;
+ --line-border-color: rgb(255 255 255 / 9%);
+ --border-color: rgb(255 255 255 / 9%);
+ --im-text-color: rgb(255 255 255 / 82%);
+ --im-text-color-grey: color: rgb(255 255 255 / 52%);
+ --im-active-bg-color: #2c2c32;
+ --im-hover-bg-color: #2c2c32;
+
+ --im-broadside-box-shadow: #201b1b;
+
+ // note
+ --im-note-list-bg-color: #2c2c32;
+
+ // 滚动条
+ --im-scrollbar: #e4e4e5;
+ --im-scrollbar-thumb: #625f5f;
+
+ // message
+ --im-message-bg-color: #28282c;
+ --im-message-border-color: rgb(255 255 255 / 9%);
+ --im-message-left-bg-color: #2c2c31;
+ --im-message-left-text-color: var(--im-text-color);
+ --im-message-right-bg-color: #2f2f38;
+ --im-message-right-bg-color: #35353f;
+ --im-message-right-text-color: var(--im-text-color);
+
+ ::selection {
+ background: #d3d3d3;
+ color: #555;
+ }
+ ::-moz-selection {
+ background: #d3d3d3;
+ color: #555;
+ }
+ ::-webkit-selection {
+ background: #d3d3d3;
+ color: #555;
+ }
+}
+
+body {
+ background-color: var(--im-bg-color);
+}
diff --git a/src/assets/css/dropsize.less b/src/assets/css/dropsize.less
new file mode 100644
index 0000000..ceb4074
--- /dev/null
+++ b/src/assets/css/dropsize.less
@@ -0,0 +1,47 @@
+.dropsize-col-resize {
+ cursor: col-resize !important;
+}
+
+.dropsize-row-resize {
+ cursor: row-resize !important;
+}
+
+.dropsize-line {
+ position: absolute;
+ cursor: col-resize;
+
+ &:hover,
+ &.dropsize-resizing {
+ background-color: #1890ff;
+ }
+
+ &.dropsize-line-top {
+ top: 0;
+ left: 0;
+ height: 2px;
+ width: 100%;
+ cursor: row-resize;
+ }
+
+ &.dropsize-line-bottom {
+ bottom: 0;
+ left: 0;
+ height: 2px;
+ width: 100%;
+ cursor: row-resize;
+ }
+
+ &.dropsize-line-left {
+ left: 0;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ }
+
+ &.dropsize-line-right {
+ right: 0;
+ top: 0;
+ width: 2px;
+ height: 100%;
+ }
+}
diff --git a/src/assets/css/editor-mention.less b/src/assets/css/editor-mention.less
new file mode 100644
index 0000000..bece2d0
--- /dev/null
+++ b/src/assets/css/editor-mention.less
@@ -0,0 +1,96 @@
+.ql-mention-list-container {
+ width: 160px;
+ max-height: 200px;
+ border: 1px solid #f0f0f0;
+ border-radius: 10px;
+ background-color: #ffffff;
+ box-shadow: 0 2px 12px 0 rgba(30, 30, 30, 0.08);
+ z-index: 9001;
+ overflow: auto;
+ padding: 3px;
+ padding-left: 6px;
+}
+
+.ql-mention-loading {
+ line-height: 44px;
+ padding: 0 20px;
+ vertical-align: middle;
+ font-size: 16px;
+}
+
+.ql-mention-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.ql-mention-list-item {
+ cursor: pointer;
+ line-height: 44px;
+ font-size: 16px;
+ vertical-align: middle;
+ padding: 0 10px;
+ overflow: hidden;
+}
+
+.ql-mention-list-item.disabled {
+ cursor: auto;
+}
+
+.ql-mention-list-item.selected {
+ background-color: var(--im-primary-color);
+ color: #fff;
+ text-decoration: none;
+ border-radius: 3px;
+}
+
+.mention {
+ height: 24px;
+ width: 65px;
+ border-radius: 6px;
+ background-color: #d3e1eb;
+ padding: 3px 0;
+ margin-right: 2px;
+ user-select: all;
+}
+
+.mention {
+ color: var(--im-primary-color);
+ background-color: transparent;
+
+ > span {
+ margin: 0 3px;
+ }
+}
+
+.ed-member-item {
+ height: 35px;
+ display: flex;
+ align-items: center;
+
+ img {
+ height: 22px;
+ width: 22px;
+ border-radius: 50%;
+ }
+
+ .nickname {
+ margin-left: 10px;
+ font-size: 13px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+}
+
+html[theme-mode='dark'] {
+ .ql-mention-list-container {
+ background-color: rgb(44 44 49);
+ color: #fff;
+ border: unset;
+
+ .ql-mention-list-item {
+ color: var(--im-text-color-grey);
+ }
+ }
+}
diff --git a/src/assets/css/login.less b/src/assets/css/login.less
new file mode 100644
index 0000000..61976b6
--- /dev/null
+++ b/src/assets/css/login.less
@@ -0,0 +1,169 @@
+#logo-name {
+ position: fixed;
+ width: 200px;
+ height: 38px;
+ font-size: 34px;
+ font-family:
+ Times New Roman,
+ Georgia,
+ Serif;
+ color: #2196f3;
+ top: 20px;
+ left: 50px;
+}
+
+.copyright {
+ position: absolute;
+ bottom: 30px;
+ left: 0;
+ right: 0;
+ width: 70%;
+ text-align: center;
+ margin: 0 auto;
+ font-size: 12px;
+ color: #b1a0a0;
+
+ span {
+ margin: 0 5px;
+ }
+
+ a {
+ color: #777272;
+ font-weight: 400;
+ }
+}
+
+.login-box {
+ position: fixed;
+ width: 350px;
+ min-height: 450px;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ border-radius: 10px;
+ border: 1px solid #e8e8e8;
+ padding: 10px 20px;
+
+ &.forget,
+ &.login {
+ height: 450px;
+ }
+ &.reister {
+ height: 485px;
+ }
+
+ .box-header {
+ height: 38px;
+ font-size: 22px;
+ line-height: 38px;
+ margin: 20px 0;
+ display: flex;
+ }
+
+ .helper {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ height: 38px;
+ margin-top: 15px;
+ }
+
+ .preview-account {
+ padding: 8px 0;
+ text-align: center;
+
+ p {
+ height: 25px;
+ line-height: 25px;
+ font-weight: 100;
+ font-size: 12px;
+ cursor: pointer;
+ }
+ }
+}
+
+@media screen and (max-height: 500px) {
+ .copyright {
+ display: none;
+ }
+}
+
+.fly-box {
+ .fly {
+ pointer-events: none;
+ position: fixed;
+ z-index: 100;
+ }
+
+ .bg-fly-circle1 {
+ left: 40px;
+ top: 100px;
+ width: 100px;
+ height: 100px;
+ border-radius: 50%;
+ background: linear-gradient(
+ to right,
+ rgba(100, 84, 239, 0.07) 0%,
+ rgba(48, 33, 236, 0.04) 100%
+ );
+ animation: move 2.5s linear infinite;
+ }
+
+ .bg-fly-circle2 {
+ left: 3%;
+ top: 60%;
+ width: 150px;
+ height: 150px;
+ border-radius: 50%;
+ background: linear-gradient(
+ to right,
+ rgba(100, 84, 239, 0.08) 0%,
+ rgba(48, 33, 236, 0.04) 100%
+ );
+ animation: move 3s linear infinite;
+ }
+
+ .bg-fly-circle3 {
+ right: 2%;
+ top: 140px;
+ width: 145px;
+ height: 145px;
+ border-radius: 50%;
+ background: linear-gradient(to right, rgba(100, 84, 239, 0.1) 0%, rgba(48, 33, 236, 0.04) 100%);
+ animation: move 2.5s linear infinite;
+ }
+
+ .bg-fly-circle4 {
+ right: 5%;
+ top: 60%;
+ width: 160px;
+ height: 160px;
+ border-radius: 50%;
+ background: linear-gradient(
+ to right,
+ rgba(100, 84, 239, 0.02) 0%,
+ rgba(48, 33, 236, 0.04) 100%
+ );
+ animation: move 3.5s linear infinite;
+ }
+}
+
+@keyframes move {
+ 0% {
+ transform: translateY(0px);
+ }
+
+ 50% {
+ transform: translateY(25px);
+ }
+
+ 100% {
+ transform: translateY(0px);
+ }
+}
+
+html[theme-mode='dark'] {
+ .login-box {
+ border: 1px solid #393939;
+ }
+}
diff --git a/src/assets/css/settting.less b/src/assets/css/settting.less
new file mode 100644
index 0000000..5f2e3d0
--- /dev/null
+++ b/src/assets/css/settting.less
@@ -0,0 +1,58 @@
+.title {
+ height: 60px;
+ line-height: 60px;
+ padding-left: 15px;
+ color: var(--im-text-color);
+ font-size: 20px;
+ font-weight: 500;
+ border-bottom: 1px solid var(--border-color);
+}
+
+.view-box {
+ padding: 15px;
+ padding-top: 0;
+
+ .view-list {
+ height: 70px;
+ margin: 5px 0;
+ border-bottom: 1px solid var(--border-color);
+ padding: 5px;
+ display: flex;
+ padding-left: 0;
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ .image {
+ width: 80px;
+ margin-right: 5px;
+ }
+
+ .content {
+ flex: auto;
+ color: var(--im-text-color);
+
+ .name {
+ font-size: 15px;
+ height: 40px;
+ line-height: 40px;
+ font-weight: 500;
+ }
+
+ .desc {
+ height: 30px;
+ line-height: 30px;
+ font-size: 14px;
+ color: #989898;
+ }
+ }
+
+ .tools {
+ width: 120px;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ }
+ }
+}
diff --git a/src/assets/fonts/AlibabaPuHuiTi/AlibabaPuHuiTi_2_45_Light.woff b/src/assets/fonts/AlibabaPuHuiTi/AlibabaPuHuiTi_2_45_Light.woff
new file mode 100644
index 0000000..e127931
Binary files /dev/null and b/src/assets/fonts/AlibabaPuHuiTi/AlibabaPuHuiTi_2_45_Light.woff differ
diff --git a/src/assets/fonts/AlibabaPuHuiTi/AlibabaPuHuiTi_2_45_Light.woff2 b/src/assets/fonts/AlibabaPuHuiTi/AlibabaPuHuiTi_2_45_Light.woff2
new file mode 100644
index 0000000..640fef0
Binary files /dev/null and b/src/assets/fonts/AlibabaPuHuiTi/AlibabaPuHuiTi_2_45_Light.woff2 differ
diff --git a/src/assets/image/0A039CDF.png b/src/assets/image/0A039CDF.png
new file mode 100644
index 0000000..0293a3b
Binary files /dev/null and b/src/assets/image/0A039CDF.png differ
diff --git a/src/assets/image/avatar.png b/src/assets/image/avatar.png
new file mode 100644
index 0000000..5e9fea0
Binary files /dev/null and b/src/assets/image/avatar.png differ
diff --git a/src/assets/image/background.jpeg b/src/assets/image/background.jpeg
new file mode 100644
index 0000000..098b552
Binary files /dev/null and b/src/assets/image/background.jpeg differ
diff --git a/src/assets/image/empty.svg b/src/assets/image/empty.svg
new file mode 100644
index 0000000..af13818
--- /dev/null
+++ b/src/assets/image/empty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/image/favicon.png b/src/assets/image/favicon.png
new file mode 100644
index 0000000..8121aa7
Binary files /dev/null and b/src/assets/image/favicon.png differ
diff --git a/src/assets/image/gitee-avatar.jpg b/src/assets/image/gitee-avatar.jpg
new file mode 100644
index 0000000..5dcfbd9
Binary files /dev/null and b/src/assets/image/gitee-avatar.jpg differ
diff --git a/src/assets/image/github-avatar.jpg b/src/assets/image/github-avatar.jpg
new file mode 100644
index 0000000..7d8316e
Binary files /dev/null and b/src/assets/image/github-avatar.jpg differ
diff --git a/src/assets/image/md.svg b/src/assets/image/md.svg
new file mode 100644
index 0000000..dc1431f
--- /dev/null
+++ b/src/assets/image/md.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/image/no-data.svg b/src/assets/image/no-data.svg
new file mode 100644
index 0000000..c6120bc
--- /dev/null
+++ b/src/assets/image/no-data.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/image/not-found.svg b/src/assets/image/not-found.svg
new file mode 100644
index 0000000..a80440e
--- /dev/null
+++ b/src/assets/image/not-found.svg
@@ -0,0 +1,1857 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/assets/image/notify.png b/src/assets/image/notify.png
new file mode 100644
index 0000000..c3c2f66
Binary files /dev/null and b/src/assets/image/notify.png differ
diff --git a/src/assets/image/welcome.svg b/src/assets/image/welcome.svg
new file mode 100644
index 0000000..21e8c6d
--- /dev/null
+++ b/src/assets/image/welcome.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/music.mp3 b/src/assets/music.mp3
new file mode 100644
index 0000000..2f50c05
Binary files /dev/null and b/src/assets/music.mp3 differ
diff --git a/src/components/base/Avatar.vue b/src/components/base/Avatar.vue
new file mode 100644
index 0000000..8a23450
--- /dev/null
+++ b/src/components/base/Avatar.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+ {{ username && username.substring(0, 1) }}
+
+
+
diff --git a/src/components/base/AvatarCropper.vue b/src/components/base/AvatarCropper.vue
new file mode 100644
index 0000000..3fb39c8
--- /dev/null
+++ b/src/components/base/AvatarCropper.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+ 保存头像
+
+
+
+
+
+
+
+
diff --git a/src/components/base/Loading.vue b/src/components/base/Loading.vue
new file mode 100644
index 0000000..63ee6e7
--- /dev/null
+++ b/src/components/base/Loading.vue
@@ -0,0 +1,305 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
数据加载中...
+
+
+
+
diff --git a/src/components/base/UploadsModal.vue b/src/components/base/UploadsModal.vue
new file mode 100644
index 0000000..cb94f10
--- /dev/null
+++ b/src/components/base/UploadsModal.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
diff --git a/src/components/base/Xtime.vue b/src/components/base/Xtime.vue
new file mode 100644
index 0000000..7d9acb0
--- /dev/null
+++ b/src/components/base/Xtime.vue
@@ -0,0 +1,41 @@
+
diff --git a/src/components/common/DialogApi.vue b/src/components/common/DialogApi.vue
new file mode 100644
index 0000000..6a33f01
--- /dev/null
+++ b/src/components/common/DialogApi.vue
@@ -0,0 +1,20 @@
+
diff --git a/src/components/common/MessageApi.vue b/src/components/common/MessageApi.vue
new file mode 100644
index 0000000..f6eb2e1
--- /dev/null
+++ b/src/components/common/MessageApi.vue
@@ -0,0 +1,19 @@
+
diff --git a/src/components/common/NotificationApi.vue b/src/components/common/NotificationApi.vue
new file mode 100644
index 0000000..e4e9bb3
--- /dev/null
+++ b/src/components/common/NotificationApi.vue
@@ -0,0 +1,20 @@
+
diff --git a/src/components/common/index.ts b/src/components/common/index.ts
new file mode 100644
index 0000000..126d09f
--- /dev/null
+++ b/src/components/common/index.ts
@@ -0,0 +1,5 @@
+import DialogApi from './DialogApi.vue'
+import MessageApi from './MessageApi.vue'
+import NotificationApi from './NotificationApi.vue'
+
+export { DialogApi, MessageApi, NotificationApi }
diff --git a/src/components/editor/Editor.vue b/src/components/editor/Editor.vue
new file mode 100644
index 0000000..a7b3495
--- /dev/null
+++ b/src/components/editor/Editor.vue
@@ -0,0 +1,703 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/editor/MeEditorCode.vue b/src/components/editor/MeEditorCode.vue
new file mode 100644
index 0000000..0975b47
--- /dev/null
+++ b/src/components/editor/MeEditorCode.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+ 语言类型:
+
+
+
+ {{ langText }}
+
+
+
+
+
+
+ {{ value.length }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/editor/MeEditorEmoticon.vue b/src/components/editor/MeEditorEmoticon.vue
new file mode 100644
index 0000000..706bc40
--- /dev/null
+++ b/src/components/editor/MeEditorEmoticon.vue
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 自定义
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/editor/MeEditorImage.vue b/src/components/editor/MeEditorImage.vue
new file mode 100644
index 0000000..2f9c0b0
--- /dev/null
+++ b/src/components/editor/MeEditorImage.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
![]()
+
+
+
+
+
+ 发送图片({{ fileFormatSize(state.size) }})
+
+
+
+
+
+
+
diff --git a/src/components/editor/MeEditorLocation.vue b/src/components/editor/MeEditorLocation.vue
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/editor/MeEditorRecorder.vue b/src/components/editor/MeEditorRecorder.vue
new file mode 100644
index 0000000..d0fcf94
--- /dev/null
+++ b/src/components/editor/MeEditorRecorder.vue
@@ -0,0 +1,331 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ status == 1 ? '正在录音' : '已暂停录音' }}
+ {{ countDownTime(duration) }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/editor/MeEditorVote.vue b/src/components/editor/MeEditorVote.vue
new file mode 100644
index 0000000..eef4628
--- /dev/null
+++ b/src/components/editor/MeEditorVote.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+ 公开投票
+ 匿名投票
+
+
+
+
+
+
+
+ 单选
+ 多选
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ String.fromCharCode(65 + i) }}.
+
+
+
+
+
+
+
+
+
+ 添加选项
+
+
+
+
+
+
+
+ 取消
+
+ 发起投票
+
+
+
+
+
+
+
diff --git a/src/components/editor/formats/emoji.ts b/src/components/editor/formats/emoji.ts
new file mode 100644
index 0000000..1453f77
--- /dev/null
+++ b/src/components/editor/formats/emoji.ts
@@ -0,0 +1,40 @@
+import Quill from 'quill'
+
+const ImageBlot = Quill.import('formats/image')
+
+class EmojiBlot extends ImageBlot {
+ static blotName = 'emoji'
+ static tagName = 'img'
+ static className = 'ed-emoji'
+
+ static create(value: HTMLImageElement) {
+ const node = super.create()
+
+ node.setAttribute('alt', value.alt)
+ node.setAttribute('src', value.src)
+ node.setAttribute('width', value.width)
+ node.setAttribute('height', value.height)
+ return node
+ }
+
+ static formats(node: HTMLImageElement) {
+ return {
+ alt: node.getAttribute('alt'),
+ src: node.getAttribute('src'),
+ width: node.getAttribute('width'),
+ height: node.getAttribute('height')
+ }
+ }
+
+ static value(node: HTMLImageElement) {
+ // 主要在有初始值时起作用
+ return {
+ alt: node.getAttribute('alt'),
+ src: node.getAttribute('src'),
+ width: node.getAttribute('width'),
+ height: node.getAttribute('height')
+ }
+ }
+}
+
+export default EmojiBlot
diff --git a/src/components/editor/formats/quote.ts b/src/components/editor/formats/quote.ts
new file mode 100644
index 0000000..b3a25c5
--- /dev/null
+++ b/src/components/editor/formats/quote.ts
@@ -0,0 +1,70 @@
+import Quill from 'quill'
+
+const BlockEmbed = Quill.import('blots/block/embed')
+
+class QuoteBlot extends BlockEmbed {
+ static blotName = 'quote'
+ static tagName = 'div'
+ static className = 'quote-card'
+
+ static create(value: any): any {
+ const node = super.create(value)
+
+ const { id, title, describe, image } = value
+
+ node.dataset.id = id
+ node.dataset.title = title
+ node.dataset.describe = describe
+ node.dataset.image = image
+
+ node.setAttribute('contenteditable', 'false')
+
+ const quoteCardContent = document.createElement('span')
+ quoteCardContent.classList.add('quote-card-content')
+
+ const close = document.createElement('span')
+ close.classList.add('quote-card-remove')
+ close.textContent = '×'
+ close.addEventListener('click', () => {
+ node.remove()
+ })
+
+ const quoteCardTitle = document.createElement('span')
+ quoteCardTitle.classList.add('quote-card-title')
+ quoteCardTitle.textContent = title
+ quoteCardTitle.appendChild(close)
+
+ quoteCardContent.appendChild(quoteCardTitle)
+
+ if (image.length == 0) {
+ const quoteCardMeta = document.createElement('span')
+ quoteCardMeta.classList.add('quote-card-meta')
+ quoteCardMeta.textContent = describe
+ quoteCardContent.appendChild(quoteCardMeta)
+ } else {
+ const iconImg = document.createElement('img')
+ iconImg.setAttribute('src', image)
+ iconImg.setAttribute('style', 'width:30px;height:30px;margin-right:10px;')
+ quoteCardContent.appendChild(iconImg)
+ }
+
+ node.ondblclick = () => {
+ console.log('quote card ondblclick')
+ }
+
+ node.appendChild(quoteCardContent)
+
+ return node
+ }
+
+ static value(node: HTMLElement): any {
+ return {
+ id: node.dataset.id,
+ title: node.dataset.title,
+ describe: node.dataset.describe,
+ image: node.dataset.image
+ }
+ }
+}
+
+export default QuoteBlot
diff --git a/src/components/editor/util.ts b/src/components/editor/util.ts
new file mode 100644
index 0000000..bb569b4
--- /dev/null
+++ b/src/components/editor/util.ts
@@ -0,0 +1,175 @@
+import { Delta } from '@vueup/vue-quill'
+
+interface Item {
+ type: number
+ content: string
+}
+
+interface AnalysisResp {
+ items: Item[]
+ mentions: any[]
+ mentionUids: number[]
+ msgType: number // 1 文本;2:图片;3图文混合消息
+ quoteId: string // 引用的消息ID
+}
+
+function removeLeadingNewlines(str: string) {
+ return str.replace(/^[\n\s]+/, '')
+}
+
+function removeTrailingNewlines(str: string) {
+ return str.replace(/[\n\s]+$/, '')
+}
+
+export function deltaToMessage(delta: Delta): AnalysisResp {
+ const resp: AnalysisResp = {
+ items: [],
+ mentions: [],
+ mentionUids: [],
+ quoteId: '',
+ msgType: 1
+ }
+
+ for (const iterator of delta.ops) {
+ const insert: any = iterator.insert
+
+ let node: any = null
+ if (resp.items.length) {
+ node = resp.items[resp.items.length - 1]
+ }
+
+ if (typeof insert === 'string') {
+ if (!insert || insert == '\n') continue
+
+ if (node && node.type == 1) {
+ node.content = node.content + insert
+ continue
+ }
+
+ resp.items.push({
+ type: 1,
+ content: insert
+ })
+
+ continue
+ }
+
+ // @好友
+ if (insert && insert.mention) {
+ const mention = insert.mention
+
+ resp.mentions.push({
+ name: `${mention.denotationChar}${mention.value}`,
+ atid: parseInt(mention.id)
+ })
+
+ if (node && node.type == 1) {
+ node.content = node.content + ` ${mention.denotationChar}${mention.value}`
+ continue
+ }
+
+ resp.items.push({
+ type: 1,
+ content: `${mention.denotationChar}${mention.value}`
+ })
+
+ continue
+ }
+
+ // 图片
+ if (insert && insert.image) {
+ resp.items.push({
+ type: 3,
+ content: insert.image
+ })
+ continue
+ }
+
+ // 表情
+ if (insert && insert.emoji) {
+ const { emoji } = insert
+
+ if (node && node.type == 1) {
+ node.content = node.content + emoji.alt
+ continue
+ }
+
+ resp.items.push({
+ type: 1,
+ content: emoji.alt
+ })
+
+ continue
+ }
+
+ if (insert && insert.quote) {
+ resp.quoteId = insert.quote.id
+ continue
+ }
+ }
+
+ // 去除前后多余空格
+ if (resp.items.length) {
+ if (resp.items[0].type == 1) {
+ resp.items[0].content = removeLeadingNewlines(resp.items[0].content)
+ }
+
+ if (resp.items[resp.items.length - 1].type == 1) {
+ resp.items[resp.items.length - 1].content = removeTrailingNewlines(
+ resp.items[resp.items.length - 1].content
+ )
+ }
+ }
+
+ if (resp.items.length > 1) {
+ resp.msgType = 12
+ }
+
+ if (resp.items.length == 1) {
+ resp.msgType = resp.items[0].type
+ }
+
+ resp.mentionUids = resp.mentions.map((item) => item.atid)
+
+ return resp
+}
+
+export function deltaToString(delta: Delta): string {
+ let content = ''
+
+ for (const o of delta.ops) {
+ const insert: any = o.insert
+
+ if (typeof insert === 'string') {
+ if (!insert || insert == '\n') continue
+
+ content += insert
+ continue
+ }
+
+ // @好友
+ if (insert && insert.mention) {
+ const { mention } = insert
+ content += ` ${mention.denotationChar}${mention.value} `
+ continue
+ }
+
+ // 图片
+ if (insert && insert.image) {
+ content += '[图片]'
+ continue
+ }
+
+ // 表情
+ if (insert && insert.emoji) {
+ content += insert.emoji.alt
+ continue
+ }
+ }
+
+ return content
+}
+
+export function isEmptyDelta(delta: Delta): boolean {
+ return delta.ops.length == 1 && delta.ops[0].insert == '\n'
+}
diff --git a/src/components/group/GroupApply.vue b/src/components/group/GroupApply.vue
new file mode 100644
index 0000000..b41e708
--- /dev/null
+++ b/src/components/group/GroupApply.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+ 提交
+
+
+
+
+
+
+
diff --git a/src/components/group/GroupLaunch.vue b/src/components/group/GroupLaunch.vue
new file mode 100644
index 0000000..894419c
--- /dev/null
+++ b/src/components/group/GroupLaunch.vue
@@ -0,0 +1,311 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.nickname }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/group/GroupNotice.vue b/src/components/group/GroupNotice.vue
new file mode 100644
index 0000000..0d2050b
--- /dev/null
+++ b/src/components/group/GroupNotice.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+ {{ item.nickname }}
+ 发表于 {{ item.created_at }}
+
+
+ {{ item.is_show ? '收起' : '展开' }}
+
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
+
diff --git a/src/components/group/GroupPanel.vue b/src/components/group/GroupPanel.vue
new file mode 100644
index 0000000..29e33af
--- /dev/null
+++ b/src/components/group/GroupPanel.vue
@@ -0,0 +1,484 @@
+
+
+
+
+
+
+
+
+
+
{{ state.detail.name }}
+
+
+
+
+
群名片:
+
+
+
+ 设置
+
+
+ 设置我的群名片
+
+
+
+ 确定
+
+
+
+
+
{{ state.detail.visit_card || '未设置' }}
+
+
+
+
+
群成员:
+
{{ members.length }}人
+
+
群主已开启“新成员入群可查看所有聊天记录
+
+
+
+
+
+ {{ state.detail.profile ? state.detail.profile : '暂无群简介' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.nickname ? item.nickname : '-' }}
+ 群主
+ 管理员
+
+
+ {{ item.remark || '-' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/group/manage/ApplyTab.vue b/src/components/group/manage/ApplyTab.vue
new file mode 100644
index 0000000..de88ea3
--- /dev/null
+++ b/src/components/group/manage/ApplyTab.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.nickname }}
+ {{ item.created_at }}
+
+
+
备注: {{ item.remark }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/group/manage/ConfigTab.vue b/src/components/group/manage/ConfigTab.vue
new file mode 100644
index 0000000..0ef7205
--- /dev/null
+++ b/src/components/group/manage/ConfigTab.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+ 点击解散
+
+ 确定要解散群聊吗? 此操作是不可逆的!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/group/manage/DetailTab.vue b/src/components/group/manage/DetailTab.vue
new file mode 100644
index 0000000..50fc544
--- /dev/null
+++ b/src/components/group/manage/DetailTab.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+ {{ modelDetail.name.substring(0, 1) }}
+
+ 上传头像
+
+
+
+
+
+
+
+
+
+
+
+ 保存信息
+
+
+
+
+
+
+
+
+
diff --git a/src/components/group/manage/MemberTab.vue b/src/components/group/manage/MemberTab.vue
new file mode 100644
index 0000000..03319e0
--- /dev/null
+++ b/src/components/group/manage/MemberTab.vue
@@ -0,0 +1,518 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.nickname || '未设置昵称' }}
+ ({{ item.remark }})
+
+
+ 群主
+ 管理员
+ 已禁言
+
+
+
+
+ {{ item.motto || '暂无简介' }}
+
+
+
+
+
+
+
+
+
+ {
+ dropdown.show = false
+ dropdown.item = {}
+ }
+ "
+ />
+
+
+
+
diff --git a/src/components/group/manage/NoticeEditor.vue b/src/components/group/manage/NoticeEditor.vue
new file mode 100644
index 0000000..c9a6f83
--- /dev/null
+++ b/src/components/group/manage/NoticeEditor.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+ 确定
+
+
+
+
+
+
+
diff --git a/src/components/group/manage/NoticeTab.vue b/src/components/group/manage/NoticeTab.vue
new file mode 100644
index 0000000..e90fc1b
--- /dev/null
+++ b/src/components/group/manage/NoticeTab.vue
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+ {{ item.updated_at }}
+
+
+
{{ item.content }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/group/manage/index.vue b/src/components/group/manage/index.vue
new file mode 100644
index 0000000..ec8f5b2
--- /dev/null
+++ b/src/components/group/manage/index.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/talk/ForwardRecord.vue b/src/components/talk/ForwardRecord.vue
new file mode 100644
index 0000000..d8c9f14
--- /dev/null
+++ b/src/components/talk/ForwardRecord.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/talk/HistoryRecord.vue b/src/components/talk/HistoryRecord.vue
new file mode 100644
index 0000000..82d806e
--- /dev/null
+++ b/src/components/talk/HistoryRecord.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ model.loadMore ? '数据加载中...' : '加载更多' }}
+
+
+
+
+
+
+
diff --git a/src/components/talk/message/AudioMessage.vue b/src/components/talk/message/AudioMessage.vue
new file mode 100644
index 0000000..3a6d8ce
--- /dev/null
+++ b/src/components/talk/message/AudioMessage.vue
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+
+
+
+
+
{{ durationDesc }}
+
+
+
diff --git a/src/components/talk/message/CodeMessage.vue b/src/components/talk/message/CodeMessage.vue
new file mode 100644
index 0000000..bd91c76
--- /dev/null
+++ b/src/components/talk/message/CodeMessage.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
diff --git a/src/components/talk/message/FileMessage.vue b/src/components/talk/message/FileMessage.vue
new file mode 100644
index 0000000..5991598
--- /dev/null
+++ b/src/components/talk/message/FileMessage.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
{{ getFileNameSuffix(extra.name) }}
+
+
+ {{ extra.name }}
+ ({{ fileFormatSize(extra.size) }})
+
+
文件已成功发送, 文件助手永久保存
+
+
+
+
+
+
+
diff --git a/src/components/talk/message/ForwardMessage.vue b/src/components/talk/message/ForwardMessage.vue
new file mode 100644
index 0000000..aa0a5f0
--- /dev/null
+++ b/src/components/talk/message/ForwardMessage.vue
@@ -0,0 +1,84 @@
+
+
+
+ {{ title }} 的会话记录
+
+
+ {{ record.nickname }}:
+ {{ record.text }}
+
+
+
+
+ 转发:聊天会话记录 ({{ extra.msg_ids.length }}条)
+
+
+
+
+
+
+
diff --git a/src/components/talk/message/GroupNoticeMessage.vue b/src/components/talk/message/GroupNoticeMessage.vue
new file mode 100644
index 0000000..520c2f2
--- /dev/null
+++ b/src/components/talk/message/GroupNoticeMessage.vue
@@ -0,0 +1,60 @@
+
+
+
+
+ 群公告
+ 《{{ extra.title }}》
+
+
+ {{ extra.content }}
+
+
+
+
+
diff --git a/src/components/talk/message/ImageMessage.vue b/src/components/talk/message/ImageMessage.vue
new file mode 100644
index 0000000..df3c846
--- /dev/null
+++ b/src/components/talk/message/ImageMessage.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
diff --git a/src/components/talk/message/LoginMessage.vue b/src/components/talk/message/LoginMessage.vue
new file mode 100644
index 0000000..7729e83
--- /dev/null
+++ b/src/components/talk/message/LoginMessage.vue
@@ -0,0 +1,67 @@
+
+
+
+ 登录操作通知
+ 登录时间:{{ extra.datetime }} (CST)
+ IP 地址:{{ extra.ip }}
+ 登录地点:{{ extra.address }}
+
+ 登录设备:{{ getExploreName(extra.agent) }} /
+ {{ getExploreOs(extra.agent) }}
+
+ 异常原因:{{ extra.reason }}
+
+
+
diff --git a/src/components/talk/message/MixedMessage.vue b/src/components/talk/message/MixedMessage.vue
new file mode 100644
index 0000000..4ab41be
--- /dev/null
+++ b/src/components/talk/message/MixedMessage.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/talk/message/RevokeMessage.vue b/src/components/talk/message/RevokeMessage.vue
new file mode 100644
index 0000000..a3da869
--- /dev/null
+++ b/src/components/talk/message/RevokeMessage.vue
@@ -0,0 +1,71 @@
+
+
+
+
+ 你撤回了一条消息 | {{ formatTime(datetime) }}
+ 对方撤回了一条消息 | {{ formatTime(datetime) }}
+
+ "{{ nickname }}" 撤回了一条消息 |
+ {{ formatTime(datetime) }}
+
+
+
+
+
diff --git a/src/components/talk/message/TextMessage.vue b/src/components/talk/message/TextMessage.vue
new file mode 100644
index 0000000..023241b
--- /dev/null
+++ b/src/components/talk/message/TextMessage.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
diff --git a/src/components/talk/message/UnknownMessage.vue b/src/components/talk/message/UnknownMessage.vue
new file mode 100644
index 0000000..df197df
--- /dev/null
+++ b/src/components/talk/message/UnknownMessage.vue
@@ -0,0 +1,23 @@
+
+
+
+ [{{ data.msg_type }}] 未知消息类型
+
+
+
diff --git a/src/components/talk/message/VideoMessage.vue b/src/components/talk/message/VideoMessage.vue
new file mode 100644
index 0000000..3967678
--- /dev/null
+++ b/src/components/talk/message/VideoMessage.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/talk/message/VoteMessage.vue b/src/components/talk/message/VoteMessage.vue
new file mode 100644
index 0000000..c856fd5
--- /dev/null
+++ b/src/components/talk/message/VoteMessage.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+
+
{{ option.key }}、 {{ option.value }}
+
{{ option.num }} 票 {{ option.progress }}%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ option.key }}、{{ option.value }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/talk/message/index.js b/src/components/talk/message/index.js
new file mode 100644
index 0000000..69cad73
--- /dev/null
+++ b/src/components/talk/message/index.js
@@ -0,0 +1,11 @@
+import { defineAsyncComponent } from 'vue'
+
+export function setComponents(app) {
+ // 动态导出当前目录下的组件
+ const modules = import.meta.glob(['./*.vue', './system/*.vue'])
+
+ for (const [key, value] of Object.entries(modules)) {
+ const name = key.slice(key.lastIndexOf('/') + 1, key.lastIndexOf('.'))
+ app.component(name, defineAsyncComponent(value))
+ }
+}
diff --git a/src/components/talk/message/system/SysGroupCancelMutedMessage.vue b/src/components/talk/message/system/SysGroupCancelMutedMessage.vue
new file mode 100644
index 0000000..28c8819
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupCancelMutedMessage.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysGroupCreateMessage.vue b/src/components/talk/message/system/SysGroupCreateMessage.vue
new file mode 100644
index 0000000..b2277ed
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupCreateMessage.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysGroupJoinMessage.vue b/src/components/talk/message/system/SysGroupJoinMessage.vue
new file mode 100644
index 0000000..9ca2792
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupJoinMessage.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysGroupMemberCancelMutedMessage.vue b/src/components/talk/message/system/SysGroupMemberCancelMutedMessage.vue
new file mode 100644
index 0000000..39e954d
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupMemberCancelMutedMessage.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysGroupMemberKickedMessage.vue b/src/components/talk/message/system/SysGroupMemberKickedMessage.vue
new file mode 100644
index 0000000..57a4236
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupMemberKickedMessage.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysGroupMemberMutedMessage.vue b/src/components/talk/message/system/SysGroupMemberMutedMessage.vue
new file mode 100644
index 0000000..c8ea9c4
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupMemberMutedMessage.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysGroupMemberQuitMessage.vue b/src/components/talk/message/system/SysGroupMemberQuitMessage.vue
new file mode 100644
index 0000000..7543e33
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupMemberQuitMessage.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysGroupMutedMessage.vue b/src/components/talk/message/system/SysGroupMutedMessage.vue
new file mode 100644
index 0000000..2d37def
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupMutedMessage.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysGroupTransferMessage.vue b/src/components/talk/message/system/SysGroupTransferMessage.vue
new file mode 100644
index 0000000..f9b0552
--- /dev/null
+++ b/src/components/talk/message/system/SysGroupTransferMessage.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/src/components/talk/message/system/SysTextMessage.vue b/src/components/talk/message/system/SysTextMessage.vue
new file mode 100644
index 0000000..559065a
--- /dev/null
+++ b/src/components/talk/message/system/SysTextMessage.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+ {{ extra.content }}
+
+
+
+
+
diff --git a/src/components/talk/message/system/sys-message.less b/src/components/talk/message/system/sys-message.less
new file mode 100644
index 0000000..2443ed0
--- /dev/null
+++ b/src/components/talk/message/system/sys-message.less
@@ -0,0 +1,43 @@
+.im-message-sys-text {
+ display: flex;
+ justify-content: center;
+
+ .sys-text {
+ margin: 10px auto;
+ background-color: #f5f5f5;
+ font-size: 11px;
+ line-height: 30px;
+ padding: 0 8px;
+ word-wrap: break-word;
+ color: #979191;
+ user-select: none;
+ font-weight: 300;
+ display: inline-block;
+ border-radius: 3px;
+ max-width: 80%;
+ text-align: center;
+
+ span {
+ margin: 0 5px;
+ }
+
+ a {
+ color: #939596;
+ cursor: pointer;
+ font-size: 12px;
+ font-weight: 400;
+
+ &:hover {
+ color: #1890ff;
+ }
+ }
+ }
+}
+
+html[theme-mode='dark'] {
+ .im-message-sys-text {
+ .sys-text {
+ background: unset;
+ }
+ }
+}
diff --git a/src/components/user/ContactModal.vue b/src/components/user/ContactModal.vue
new file mode 100644
index 0000000..e278080
--- /dev/null
+++ b/src/components/user/ContactModal.vue
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.remark || item.name }}
+
+ 群
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/user/EditorEmail.vue b/src/components/user/EditorEmail.vue
new file mode 100644
index 0000000..5f900c1
--- /dev/null
+++ b/src/components/user/EditorEmail.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获取验证码 ({{ lockTime }}s)
+
+
+
+
+
+
+ 取消
+
+ 保存修改
+
+
+
+
+
+
+
diff --git a/src/components/user/EditorMobile.vue b/src/components/user/EditorMobile.vue
new file mode 100644
index 0000000..8db2dab
--- /dev/null
+++ b/src/components/user/EditorMobile.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获取验证码 ({{ lockTime }}s)
+
+
+
+
+
+
+ 取消
+
+ 保存修改
+
+
+
+
+
+
+
diff --git a/src/components/user/EditorPassword.vue b/src/components/user/EditorPassword.vue
new file mode 100644
index 0000000..8d974a4
--- /dev/null
+++ b/src/components/user/EditorPassword.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+ 保存修改
+
+
+
+
+
+
+
diff --git a/src/components/user/UserCardModal.vue b/src/components/user/UserCardModal.vue
new file mode 100644
index 0000000..d92cc5c
--- /dev/null
+++ b/src/components/user/UserCardModal.vue
@@ -0,0 +1,463 @@
+
+
+
+
+
+
+
+
+
+
+ {{ state.motto || '编辑个签,展示我的独特态度。' }}
+
+
+
+
+ 工号 :
+ {{ state.job_num}}
+
+
+ 手机 :
+ {{ state.mobile }}
+
+
+ 昵称 :
+ {{ state.nickname || '-' }}
+
+
+ 性别 :
+ {{
+ state.gender == 1 ? '男' : state.gender == 2 ? '女' : '未知'
+ }}
+
+
+
备注 :
+
+
+
+ {{ state.remark || '未设置' }}
+
+
+
+ 设置备注
+
+
+
+
+ 确定
+
+
+
+
+
+ 邮箱 :
+ {{ state.email || '-' }}
+
+
+ 分组 :
+
+ {{ groupName }}
+
+
+
+ 入职时间 :
+ {{ state.enter_date}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/connect.ts b/src/connect.ts
new file mode 100644
index 0000000..9bf730f
--- /dev/null
+++ b/src/connect.ts
@@ -0,0 +1,183 @@
+import { h } from 'vue'
+import { NAvatar } from 'naive-ui'
+import { useTalkStore, useUserStore, useDialogueStore } from '@/store'
+import { notifyIcon } from '@/constant/default'
+import WsSocket from './plugins/ws-socket'
+import EventTalk from './event/talk'
+import EventKeyboard from './event/keyboard'
+import EventLogin from './event/login'
+import EventRevoke from './event/revoke'
+import { getAccessToken, isLoggedIn } from './utils/auth'
+
+const urlCallback = () => {
+ if (!isLoggedIn()) {
+ window.location.reload()
+ }
+
+ return `${import.meta.env.VITE_SOCKET_API}/wss/default.io?token=${getAccessToken()}`
+}
+
+class Connect {
+ private conn: WsSocket
+
+ constructor() {
+ this.conn = new WsSocket(urlCallback, {
+ onError: (evt: any) => {
+ console.log('Websocket 连接失败回调方法', evt)
+ },
+ // Websocket 连接成功回调方法
+ onOpen: () => {
+ // 更新 WebSocket 连接状态
+ useUserStore().updateSocketStatus(true)
+ useTalkStore().loadTalkList()
+ },
+ // Websocket 断开连接回调方法
+ onClose: () => {
+ // 更新 WebSocket 连接状态
+ useUserStore().updateSocketStatus(false)
+ }
+ })
+
+ this.bindEvents()
+ }
+
+ /**
+ * 连接
+ */
+ connect() {
+ this.conn.connection()
+ }
+
+ /**
+ * 断开连接
+ */
+ disconnect() {
+ this.conn.close()
+ }
+
+ /**
+ * 连接状态
+ * @returns WebSocket 连接状态
+ */
+ isConnect() {
+ if (!this.conn.connect) return false
+
+ return this.conn.connect.readyState === 1
+ }
+
+ /**
+ * 推送事件消息
+ * @param event 事件名
+ * @param data 数据
+ */
+ emit(event: string, data: any) {
+ this.conn.emit(event, data)
+ }
+
+ /**
+ * 绑定监听消息事件
+ */
+ bindEvents() {
+ this.onPing()
+ this.onPong()
+ this.onImMessage()
+ this.onImMessageRead()
+ this.onImContactStatus()
+ this.onImMessageRevoke()
+ this.onImMessageKeyboard()
+ }
+
+ onPing() {
+ this.conn.on('ping', () => this.emit('pong', ''))
+ }
+
+ onPong() {
+ this.conn.on('pong', () => {})
+ }
+
+ onImMessage() {
+ this.conn.on('im.message', (data: any) => new EventTalk(data))
+ }
+
+ onImMessageRead() {
+ this.conn.on('im.message.read', (data: any) => {
+ const dialogueStore = useDialogueStore()
+
+ if (dialogueStore.index_name !== `1_${data.sender_id}`) {
+ return
+ }
+
+ const { msg_ids = [] } = data
+
+ for (const msgid of msg_ids) {
+ dialogueStore.updateDialogueRecord({ msg_id: msgid, is_read: 1 })
+ }
+ })
+ }
+
+ onImContactStatus() {
+ // 好友在线状态事件
+ this.conn.on('im.contact.status', (data: any) => new EventLogin(data))
+ }
+
+ onImMessageKeyboard() {
+ // 好友键盘输入事件
+ this.conn.on('im.message.keyboard', (data: any) => new EventKeyboard(data))
+ }
+
+ // 即将废弃
+ onImMessageRevoke() {
+ // 消息撤回事件
+ this.conn.on('im.message.revoke', (data: any) => new EventRevoke(data))
+ }
+
+ onImContactApply() {
+ // 好友申请事件
+ this.conn.on('im.contact.apply', (data: any) => {
+ window['$notification'].create({
+ title: '好友申请通知',
+ content: data.remark,
+ description: `申请人: ${data.friend.nickname}`,
+ meta: data.friend.created_at,
+ avatar: () =>
+ h(NAvatar, {
+ size: 'small',
+ round: true,
+ src: notifyIcon,
+ style: 'background-color:#fff;'
+ }),
+ duration: 3000
+ })
+ useUserStore().isContactApply = true
+ })
+ }
+
+ onImGroupApply() {
+ // 群申请消息
+ this.conn.on('im.group.apply', () => {
+ window['$notification'].create({
+ title: '入群申请通知',
+ content: '有新的入群申请,请注意查收',
+ avatar: () =>
+ h(NAvatar, {
+ size: 'small',
+ round: true,
+ src: notifyIcon,
+ style: 'background-color:#fff;'
+ }),
+ duration: 30000
+ })
+
+ useUserStore().isGroupApply = true
+ })
+ }
+
+ onEventError() {
+ this.conn.on('event_error', (data: any) => {
+ window['$message'] && window['$message'].error(JSON.stringify(data))
+ })
+ }
+}
+
+// 导出单例
+export default new Connect()
diff --git a/src/constant/default.ts b/src/constant/default.ts
new file mode 100644
index 0000000..bef1379
--- /dev/null
+++ b/src/constant/default.ts
@@ -0,0 +1,21 @@
+import avatar from '../assets/image/notify.png'
+import notify from '../assets/image/notify.png'
+
+export const GenderOptions = [
+ {
+ label: '未知',
+ value: '0'
+ },
+ {
+ label: '男',
+ value: '1'
+ },
+ {
+ label: '女',
+ value: '2'
+ }
+]
+
+export const defAvatar = avatar
+
+export const notifyIcon = notify
diff --git a/src/constant/event-bus.ts b/src/constant/event-bus.ts
new file mode 100644
index 0000000..48c21f3
--- /dev/null
+++ b/src/constant/event-bus.ts
@@ -0,0 +1,8 @@
+export const enum ContactConst {
+ UpdateRemark = 'contact:update-remark'
+}
+
+export const enum EditorConst {
+ Mention = 'editor:mention',
+ Quote = 'editor:quote'
+}
diff --git a/src/constant/highlight.ts b/src/constant/highlight.ts
new file mode 100644
index 0000000..638b7c6
--- /dev/null
+++ b/src/constant/highlight.ts
@@ -0,0 +1,66 @@
+export const options = [
+ {
+ label: 'PHP',
+ value: 'php'
+ },
+ {
+ label: 'Java',
+ value: 'java'
+ },
+ {
+ label: 'Python',
+ value: 'python'
+ },
+ {
+ label: 'Golang',
+ value: 'go'
+ },
+ {
+ label: 'JavaScript',
+ value: 'javascript'
+ },
+ {
+ label: 'TypeScript',
+ value: 'typescript'
+ },
+ {
+ label: 'Json',
+ value: 'json'
+ },
+ {
+ label: 'Sql',
+ value: 'sql'
+ },
+ {
+ label: 'Rust',
+ value: 'rust'
+ },
+ {
+ label: 'Markdown',
+ value: 'markdown'
+ },
+ {
+ label: 'Nginx',
+ value: 'nginx'
+ },
+ {
+ label: 'Yaml',
+ value: 'yaml'
+ },
+ {
+ label: 'Protobuf',
+ value: 'protobuf'
+ },
+ {
+ label: 'Shell',
+ value: 'shell'
+ },
+ {
+ label: 'Makefile',
+ value: 'makefile'
+ },
+ {
+ label: 'Ini',
+ value: 'ini'
+ }
+]
diff --git a/src/constant/message.ts b/src/constant/message.ts
new file mode 100644
index 0000000..1ddfe37
--- /dev/null
+++ b/src/constant/message.ts
@@ -0,0 +1,96 @@
+export const ChatMsgTypeText = 1 // 文本消息
+export const ChatMsgTypeCode = 2 // 代码消息
+export const ChatMsgTypeImage = 3 // 图片文件
+export const ChatMsgTypeAudio = 4 // 语音文件
+export const ChatMsgTypeVideo = 5 // 视频文件
+export const ChatMsgTypeFile = 6 // 其它文件
+export const ChatMsgTypeLocation = 7 // 位置消息
+export const ChatMsgTypeCard = 8 // 名片消息
+export const ChatMsgTypeForward = 9 // 转发消息
+export const ChatMsgTypeLogin = 10 // 登录消息
+export const ChatMsgTypeVote = 11 // 投票消息
+export const ChatMsgTypeMixed = 12 // 混合消息
+export const ChatMsgTypeGroupNotice = 13 // 群公告消息
+
+export const ChatMsgSysText = 1000 // 系统文本消息
+export const ChatMsgSysGroupCreate = 1101 // 创建群聊消息
+export const ChatMsgSysGroupMemberJoin = 1102 // 加入群聊消息
+export const ChatMsgSysGroupMemberQuit = 1103 // 群成员退出群消息
+export const ChatMsgSysGroupMemberKicked = 1104 // 踢出群成员消息
+export const ChatMsgSysGroupMessageRevoke = 1105 // 管理员撤回成员消息
+export const ChatMsgSysGroupDismissed = 1106 // 群解散
+export const ChatMsgSysGroupMuted = 1107 // 群禁言
+export const ChatMsgSysGroupCancelMuted = 1108 // 群解除禁言
+export const ChatMsgSysGroupMemberMuted = 1109 // 群成员禁言
+export const ChatMsgSysGroupMemberCancelMuted = 1110 // 群成员解除禁言
+export const ChatMsgSysGroupNotice = 1111 // 编辑群公告
+export const ChatMsgSysGroupTransfer = 1113 // 变更群主
+
+export const ChatMsgTypeMapping = {
+ [ChatMsgTypeText]: '[文本消息]',
+ [ChatMsgTypeImage]: '[图片消息]',
+ [ChatMsgTypeAudio]: '[语音消息]',
+ [ChatMsgTypeVideo]: '[视频消息]',
+ [ChatMsgTypeFile]: '[文件消息]',
+ [ChatMsgTypeLocation]: '[位置消息]',
+ [ChatMsgTypeCard]: '[名片消息]',
+ [ChatMsgTypeForward]: '[转发消息]',
+ [ChatMsgTypeLogin]: '[登录消息]',
+ [ChatMsgTypeVote]: '[投票消息]',
+ [ChatMsgTypeCode]: '[代码消息]',
+ [ChatMsgTypeMixed]: '[图文消息]',
+ [ChatMsgTypeGroupNotice]: '[群公告]',
+ [ChatMsgSysText]: '[系统消息]',
+ [ChatMsgSysGroupCreate]: '[创建群消息]',
+ [ChatMsgSysGroupMemberJoin]: '[加入群消息]',
+ [ChatMsgSysGroupMemberQuit]: '[退出群消息]',
+ [ChatMsgSysGroupMemberKicked]: '[踢出群消息]',
+ [ChatMsgSysGroupMessageRevoke]: '[撤回消息]',
+ [ChatMsgSysGroupDismissed]: '[群解散消息]',
+ [ChatMsgSysGroupMuted]: '[群禁言消息]',
+ [ChatMsgSysGroupCancelMuted]: '[群解除禁言消息]',
+ [ChatMsgSysGroupMemberMuted]: '[群成员禁言消息]',
+ [ChatMsgSysGroupMemberCancelMuted]: '[群成员解除禁言消息]',
+ [ChatMsgSysGroupNotice]: '[群公告]'
+}
+
+// 消息类型 - 消息组件 映射关系
+export const MessageComponents = {
+ [ChatMsgTypeText]: 'text-message',
+ [ChatMsgTypeImage]: 'image-message',
+ [ChatMsgTypeAudio]: 'audio-message',
+ [ChatMsgTypeVideo]: 'video-message',
+ [ChatMsgTypeFile]: 'file-message',
+ [ChatMsgTypeLocation]: 'location-message',
+ [ChatMsgTypeCard]: 'user-card-message',
+ [ChatMsgTypeForward]: 'forward-message',
+ [ChatMsgTypeLogin]: 'login-message',
+ [ChatMsgTypeVote]: 'vote-message',
+ [ChatMsgTypeCode]: 'code-message',
+ [ChatMsgTypeMixed]: 'mixed-message',
+ [ChatMsgTypeGroupNotice]: 'group-notice-message',
+ [ChatMsgSysText]: 'sys-text-message',
+ [ChatMsgSysGroupCreate]: 'sys-group-create-message',
+ [ChatMsgSysGroupMemberJoin]: 'sys-group-join-message',
+ [ChatMsgSysGroupMemberQuit]: 'sys-group-member-quit-message',
+ [ChatMsgSysGroupMemberKicked]: 'sys-group-member-kicked-message',
+ // [ChatMsgSysGroupMessageRevoke]: '[撤回消息]',
+ // [ChatMsgSysGroupDismissed]: '[群解散消息]',
+ [ChatMsgSysGroupMuted]: 'sys-group-muted-message',
+ [ChatMsgSysGroupCancelMuted]: 'sys-group-cancel-muted-message',
+ [ChatMsgSysGroupMemberMuted]: 'sys-group-member-muted-message',
+ [ChatMsgSysGroupMemberCancelMuted]: 'sys-group-member-cancel-muted-message',
+ [ChatMsgSysGroupTransfer]: 'sys-group-transfer-message'
+}
+
+// 可转发的消息类型
+export const ForwardableMessageType = [
+ ChatMsgTypeText,
+ ChatMsgTypeCode,
+ ChatMsgTypeImage,
+ ChatMsgTypeAudio,
+ ChatMsgTypeVideo,
+ ChatMsgTypeFile,
+ ChatMsgTypeLocation,
+ ChatMsgTypeCard
+]
diff --git a/src/constant/theme.ts b/src/constant/theme.ts
new file mode 100644
index 0000000..756703c
--- /dev/null
+++ b/src/constant/theme.ts
@@ -0,0 +1,14 @@
+// 主题配置
+export const overrides = {
+ common: {
+ primaryColor: '#1890ff',
+ primaryColorHover: '#1890ff',
+ primaryColorPressed: '#1890ff',
+ primaryColorSuppl: '#1890ff',
+ bodyColor: '#ffffff'
+ },
+
+ Dialog: {
+ borderRadius: '10px'
+ }
+}
diff --git a/src/directive/dropsize.js b/src/directive/dropsize.js
new file mode 100644
index 0000000..cac2e66
--- /dev/null
+++ b/src/directive/dropsize.js
@@ -0,0 +1,104 @@
+import { storage } from '@/utils/storage'
+
+function getCacheKey(key, direction) {
+ if (!key.length) return ''
+
+ return `dropsize_${direction}_${key}`
+}
+
+export default {
+ mounted: function (el, binding) {
+ let { min, max, direction = 'right', key = '' } = binding.value
+
+ el.style.position = 'relative'
+ el.touch = { status: false, pageX: 0, pageY: 0, width: 0, height: 0 }
+
+ const cacheKey = getCacheKey(key, direction)
+ const cursor = ['left', 'right'].includes(direction) ? 'col-resize' : 'row-resize'
+
+ const linedom = document.createElement('div')
+ linedom.className = `dropsize-line dropsize-line-${direction}`
+
+ el.linedomMouseup = function () {
+ if (!el.touch.status) return
+
+ el.touch.status = false
+
+ linedom.classList.remove('dropsize-resizing')
+
+ document.querySelector('body').classList.remove(`dropsize-${cursor}`)
+ }
+
+ el.linedomMousemove = function (e) {
+ if (!el.touch.status) return
+
+ let width,
+ height = 0
+ switch (direction) {
+ case 'left':
+ case 'right':
+ if (direction == 'left') {
+ width = el.touch.width + el.touch.pageX - e.pageX
+ } else {
+ width = el.touch.width + e.pageX - el.touch.pageX
+ }
+
+ if (width < min) width = min
+ if (width > max) width = max
+
+ el.style.width = `${width}px`
+
+ cacheKey && storage.set(cacheKey, width)
+ break
+ case 'top':
+ case 'bottom':
+ if (direction == 'top') {
+ height = el.touch.height + el.touch.pageY - e.pageY
+ } else {
+ height = el.touch.height + e.pageY - el.touch.pageY
+ }
+
+ if (height < min) height = min
+ if (height > max) height = max
+
+ el.style.height = `${height}px`
+
+ cacheKey && storage.set(cacheKey, height)
+ break
+ }
+ }
+
+ linedom.addEventListener('mousedown', function (e) {
+ el.touch = {
+ status: true,
+ pageX: e.pageX,
+ pageY: e.pageY,
+ width: el.offsetWidth,
+ height: el.offsetHeight
+ }
+
+ this.classList.add('dropsize-resizing')
+
+ document.querySelector('body').classList.add(`dropsize-${cursor}`)
+
+ document.addEventListener('mouseup', el.linedomMouseup)
+ document.addEventListener('mousemove', el.linedomMousemove)
+ })
+
+ if (cacheKey) {
+ const value = storage.get(cacheKey)
+
+ if (direction == 'left' || direction == 'right') {
+ el.style.width = `${value}px`
+ } else {
+ el.style.height = `${value}px`
+ }
+ }
+
+ el.appendChild(linedom)
+ },
+ unmounted: function (el) {
+ document.removeEventListener('mousemove', el.linedomMouseup)
+ document.removeEventListener('mouseup', el.linedomMousemove)
+ }
+}
diff --git a/src/directive/focus.js b/src/directive/focus.js
new file mode 100644
index 0000000..b417197
--- /dev/null
+++ b/src/directive/focus.js
@@ -0,0 +1,7 @@
+export default {
+ mounted(el) {
+ setTimeout(() => {
+ el.focus()
+ }, 0)
+ }
+}
diff --git a/src/directive/index.ts b/src/directive/index.ts
new file mode 100644
index 0000000..3d86bb8
--- /dev/null
+++ b/src/directive/index.ts
@@ -0,0 +1,15 @@
+import dropsize from './dropsize'
+import focus from './focus'
+import loading from './loading'
+
+const directives = {
+ dropsize,
+ focus,
+ loading
+}
+
+export function setupDirective(app: any) {
+ for (const key in directives) {
+ app.directive(key, directives[key])
+ }
+}
diff --git a/src/directive/inner/loading.vue b/src/directive/inner/loading.vue
new file mode 100644
index 0000000..76b3d42
--- /dev/null
+++ b/src/directive/inner/loading.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
diff --git a/src/directive/loading.js b/src/directive/loading.js
new file mode 100644
index 0000000..a405c2c
--- /dev/null
+++ b/src/directive/loading.js
@@ -0,0 +1,55 @@
+import { createApp } from 'vue'
+import Loading from './inner/loading.vue'
+
+export default {
+ mounted(el, binding) {
+ const app = createApp(Loading)
+ const instance = app.mount(document.createElement('div'))
+ el.instance = instance
+
+ if (binding.value) {
+ if (el.style.position == '') {
+ el.dataset['position'] = true
+ }
+
+ if (el.style.overflow == '') {
+ el.dataset['overflow'] = true
+ }
+
+ appendEl(el)
+ }
+ },
+ updated(el, binding) {
+ if (binding.value !== binding.oldValue) {
+ binding.value ? appendEl(el) : removeEl(el)
+ }
+ }
+}
+
+// 插入元素
+const appendEl = (el) => {
+ // 给父元素加个定位,让loading元素定位
+ el.style.position = 'relative'
+ el.style.overflow = 'hidden'
+
+ el?.appendChild(el.instance.$el)
+}
+
+// 移除元素
+const removeEl = (el) => {
+ if (el.dataset['position']) {
+ el.style.position = ''
+ }
+
+ if (el.dataset['overflow']) {
+ el.style.overflow = ''
+ }
+
+ delete el.dataset['position']
+ delete el.dataset['overflow']
+
+ let $el = el.instance.$el
+ if (el?.contains($el)) {
+ el?.removeChild($el)
+ }
+}
diff --git a/src/event/base.js b/src/event/base.js
new file mode 100644
index 0000000..25fa0df
--- /dev/null
+++ b/src/event/base.js
@@ -0,0 +1,56 @@
+import { useUserStore, useDialogueStore } from '@/store'
+import router from '@/router'
+
+class Base {
+ /**
+ * 初始化
+ */
+ constructor() {}
+
+ /**
+ * 获取当前登录用户的ID
+ */
+ getAccountId() {
+ return useUserStore().uid
+ }
+
+ getTalkParams() {
+ let dialogueStore = useDialogueStore()
+
+ let { talk_type, receiver_id } = dialogueStore.talk
+
+ return {
+ talk_type,
+ receiver_id,
+ index_name: dialogueStore.index_name
+ }
+ }
+
+ /**
+ * 判断消息是否来自当前对话
+ *
+ * @param {Number} talk_type 聊天消息类型[1:私信;2:群聊;]
+ * @param {Number} sender_id 发送者ID
+ * @param {Number} receiver_id 接收者ID
+ */
+ isTalk(talk_type, sender_id, receiver_id) {
+ let params = this.getTalkParams()
+
+ if (talk_type != params.talk_type) {
+ return false
+ } else if (params.receiver_id == receiver_id || params.receiver_id == sender_id) {
+ return true
+ }
+
+ return false
+ }
+
+ /**
+ * 判断用户是否打开对话页
+ */
+ isTalkPage() {
+ return ['/message', '/'].includes(router.currentRoute.value.path)
+ }
+}
+
+export default Base
diff --git a/src/event/index.ts b/src/event/index.ts
new file mode 100644
index 0000000..52f8f4a
--- /dev/null
+++ b/src/event/index.ts
@@ -0,0 +1,4 @@
+export * from './keyboard'
+export * from './login'
+export * from './revoke'
+export * from './talk'
diff --git a/src/event/keyboard.js b/src/event/keyboard.js
new file mode 100644
index 0000000..2c1aff8
--- /dev/null
+++ b/src/event/keyboard.js
@@ -0,0 +1,49 @@
+import Base from './base'
+
+import { useDialogueStore } from '@/store'
+
+/**
+ * 键盘输入事件
+ */
+class Keyboard extends Base {
+ /**
+ * @var resource 资源
+ */
+ resource
+
+ /**
+ * 初始化构造方法
+ *
+ * @param {Object} resource Socket消息
+ */
+ constructor(resource) {
+ super()
+
+ this.resource = resource
+
+ this.handle()
+ }
+
+ handle() {
+ let params = this.getTalkParams()
+
+ // 判断当前是否正在对话
+ if (!params.index_name) {
+ return false
+ }
+
+ // 判断是否是私信
+ if (params.talk_type != 1) {
+ return false
+ }
+
+ // 判断消息是否来当前对话
+ if (params.receiver_id != this.resource.sender_id) {
+ return false
+ }
+
+ useDialogueStore().triggerKeyboard()
+ }
+}
+
+export default Keyboard
diff --git a/src/event/login.js b/src/event/login.js
new file mode 100644
index 0000000..bf13429
--- /dev/null
+++ b/src/event/login.js
@@ -0,0 +1,38 @@
+import Base from './base'
+import { useTalkStore, useDialogueStore } from '@/store'
+
+/**
+ * 好友状态事件
+ */
+class Login extends Base {
+ /**
+ * @var resource 资源
+ */
+ resource
+
+ /**
+ * 初始化构造方法
+ *
+ * @param {Object} resource Socket消息
+ */
+ constructor(resource) {
+ super()
+
+ this.resource = resource
+
+ this.handle()
+ }
+
+ handle() {
+ useTalkStore().updateItem({
+ index_name: `1_${this.resource.user_id}`,
+ is_online: this.resource.status
+ })
+
+ if (this.isTalk(1, this.resource.user_id, this.getAccountId())) {
+ useDialogueStore().setOnlineStatus(this.resource.status == 1)
+ }
+ }
+}
+
+export default Login
diff --git a/src/event/revoke.js b/src/event/revoke.js
new file mode 100644
index 0000000..b9768f9
--- /dev/null
+++ b/src/event/revoke.js
@@ -0,0 +1,88 @@
+import Base from './base'
+import { useDialogueStore, useTalkStore } from '@/store'
+import { parseTime } from '@/utils/datetime'
+
+/**
+ * 好友状态事件
+ */
+class Revoke extends Base {
+ /**
+ * @var resource 资源
+ */
+ resource
+
+ /**
+ * 发送者ID
+ */
+ sender_id = 0
+
+ /**
+ * 接收者ID
+ */
+ receiver_id = 0
+
+ /**
+ * 聊天类型[1:私聊;2:群聊;]
+ */
+ talk_type = 0
+
+ /**
+ * 初始化构造方法
+ *
+ * @param {Object} resource Socket消息
+ */
+ constructor(resource) {
+ super()
+
+ this.resource = resource
+ this.sender_id = resource.sender_id
+ this.receiver_id = resource.receiver_id
+ this.talk_type = resource.talk_type
+ this.msg_id = resource.msg_id
+
+ this.handle()
+ }
+
+ /**
+ * 判断消息发送者是否来自于我
+ * @returns
+ */
+ isCurrSender() {
+ return this.sender_id == this.getAccountId()
+ }
+
+ /**
+ * 获取对话索引
+ *
+ * @return String
+ */
+ getIndexName() {
+ if (this.talk_type == 2) {
+ return `${this.talk_type}_${this.receiver_id}`
+ }
+
+ let receiver_id = this.isCurrSender() ? this.receiver_id : this.sender_id
+
+ return `${this.talk_type}_${receiver_id}`
+ }
+
+ handle() {
+ useTalkStore().updateItem({
+ index_name: this.getIndexName(),
+ msg_text: this.resource.text,
+ updated_at: parseTime(new Date())
+ })
+
+ // 判断当前是否正在和好友对话
+ if (!this.isTalk(this.talk_type, this.receiver_id, this.sender_id)) {
+ return
+ }
+
+ useDialogueStore().updateDialogueRecord({
+ msg_id: this.msg_id,
+ is_revoke: 1
+ })
+ }
+}
+
+export default Revoke
diff --git a/src/event/talk.js b/src/event/talk.js
new file mode 100644
index 0000000..6858cc0
--- /dev/null
+++ b/src/event/talk.js
@@ -0,0 +1,228 @@
+import Base from './base'
+import { nextTick } from 'vue'
+import ws from '@/connect'
+import { parseTime } from '@/utils/datetime'
+import * as message from '@/constant/message'
+import { formatTalkItem, palyMusic, formatTalkRecord } from '@/utils/talk'
+import { isElectronMode } from '@/utils/common'
+import { ServeClearTalkUnreadNum, ServeCreateTalkList } from '@/api/chat'
+import { useTalkStore, useDialogueStore, useSettingsStore } from '@/store'
+
+/**
+ * 好友状态事件
+ */
+class Talk extends Base {
+ /**
+ * @var resource 资源
+ */
+ resource
+
+ /**
+ * 发送者ID
+ */
+ sender_id = 0
+
+ /**
+ * 接收者ID
+ */
+ receiver_id = 0
+
+ /**
+ * 聊天类型[1:私聊;2:群聊;]
+ */
+ talk_type = 0
+
+ /**
+ * 初始化构造方法
+ *
+ * @param {Object} resource Socket消息
+ */
+ constructor(resource) {
+ super()
+
+ this.sender_id = resource.sender_id
+ this.receiver_id = resource.receiver_id
+ this.talk_type = resource.talk_type
+ this.resource = resource.data
+
+ this.handle()
+ }
+
+ /**
+ * 判断消息发送者是否来自于我
+ * @returns
+ */
+ isCurrSender() {
+ return this.sender_id == this.getAccountId()
+ }
+
+ /**
+ * 获取对话索引
+ *
+ * @return String
+ */
+ getIndexName() {
+ if (this.talk_type == 2) {
+ return `${this.talk_type}_${this.receiver_id}`
+ }
+
+ let receiver_id = this.isCurrSender() ? this.receiver_id : this.sender_id
+
+ return `${this.talk_type}_${receiver_id}`
+ }
+
+ /**
+ * 获取聊天列表左侧的对话信息
+ */
+ getTalkText() {
+ let text = ''
+ if (this.resource.msg_type != message.ChatMsgTypeText) {
+ text = message.ChatMsgTypeMapping[this.resource.msg_type]
+ } else {
+ text = this.resource.extra.content.replace(/
/g, '')
+ }
+
+ return text
+ }
+
+ // 播放提示音
+ play() {
+ // 客户端有消息提示
+ if (isElectronMode()) return
+
+ useSettingsStore().isPromptTone && palyMusic()
+ }
+
+ handle() {
+ // 不是自己发送的消息则需要播放提示音
+ if (!this.isCurrSender()) {
+ this.play()
+ }
+
+ // 判断会话列表是否存在,不存在则创建
+ if (useTalkStore().findTalkIndex(this.getIndexName()) == -1) {
+ return this.addTalkItem()
+ }
+
+ // 判断当前是否正在和好友对话
+ if (this.isTalk(this.talk_type, this.receiver_id, this.sender_id)) {
+ this.insertTalkRecord()
+ } else {
+ this.updateTalkItem()
+ }
+ }
+
+ /**
+ * 显示消息提示
+ * @returns
+ */
+ showMessageNocice() {
+ if (useSettingsStore().isLeaveWeb) {
+ const notification = new Notification('LumenIM 在线聊天', {
+ dir: 'auto',
+ lang: 'zh-CN',
+ body: '您有新的消息请注意查收'
+ })
+
+ notification.onclick = () => {
+ notification.close()
+ }
+ } else {
+ window['$notification'].create({
+ title: '消息通知',
+ content: '您有新的消息请注意查收',
+ duration: 3000
+ })
+ }
+ }
+
+ /**
+ * 加载对接节点
+ */
+ addTalkItem() {
+ let receiver_id = this.sender_id
+ let talk_type = this.talk_type
+
+ if (talk_type == 1 && this.receiver_id != this.getAccountId()) {
+ receiver_id = this.receiver_id
+ } else if (talk_type == 2) {
+ receiver_id = this.receiver_id
+ }
+
+ ServeCreateTalkList({
+ talk_type,
+ receiver_id
+ }).then(({ code, data }) => {
+ if (code == 200) {
+ let item = formatTalkItem(data)
+ item.unread_num = 1
+ useTalkStore().addItem(item)
+ }
+ })
+ }
+
+ /**
+ * 插入对话记录
+ */
+ insertTalkRecord() {
+ let record = this.resource
+
+ // 群成员变化的消息,需要更新群成员列表
+ if ([1102, 1103, 1104].includes(record.msg_type)) {
+ useDialogueStore().updateGroupMembers()
+ }
+
+ useDialogueStore().addDialogueRecord(formatTalkRecord(this.getAccountId(), this.resource))
+
+ if (!this.isCurrSender()) {
+ // 推送已读消息
+ setTimeout(() => {
+ ws.emit('im.message.read', {
+ receiver_id: this.sender_id,
+ msg_ids: [this.resource.msg_id]
+ })
+ }, 1000)
+ }
+
+ // 获取聊天面板元素节点
+ const el = document.getElementById('imChatPanel')
+ if (!el) return
+
+ // 判断的滚动条是否在底部
+ const isBottom = Math.ceil(el.scrollTop) + el.clientHeight >= el.scrollHeight
+
+ if (isBottom || record.user_id == this.getAccountId()) {
+ nextTick(() => {
+ el.scrollTop = el.scrollHeight + 1000
+ })
+ } else {
+ useDialogueStore().setUnreadBubble()
+ }
+
+ useTalkStore().updateItem({
+ index_name: this.getIndexName(),
+ msg_text: this.getTalkText(),
+ updated_at: parseTime(new Date())
+ })
+
+ if (this.talk_type == 1 && this.getAccountId() !== this.sender_id) {
+ ServeClearTalkUnreadNum({
+ talk_type: 1,
+ receiver_id: this.sender_id
+ })
+ }
+ }
+
+ /**
+ * 更新对话列表记录
+ */
+ updateTalkItem() {
+ useTalkStore().updateMessage({
+ index_name: this.getIndexName(),
+ msg_text: this.getTalkText(),
+ updated_at: parseTime(new Date())
+ })
+ }
+}
+
+export default Talk
diff --git a/src/hooks/index.ts b/src/hooks/index.ts
new file mode 100644
index 0000000..77a1efa
--- /dev/null
+++ b/src/hooks/index.ts
@@ -0,0 +1,15 @@
+export * from './useAccessPrompt'
+export * from './useClickEvent'
+export * from './useConnectStatus'
+export * from './useEventBus'
+export * from './useFriendsMenu'
+export * from './useGroupListMenu'
+export * from './useInject'
+export * from './useSessionMenu'
+export * from './useSmsLock'
+export * from './useTalkRecord'
+export * from './useThemeMode'
+export * from './useUnreadMessage'
+export * from './useProvideUserModal'
+export * from './useUtil'
+export * from './useVisibilityChange'
diff --git a/src/hooks/useAccessPrompt.ts b/src/hooks/useAccessPrompt.ts
new file mode 100644
index 0000000..723dbdd
--- /dev/null
+++ b/src/hooks/useAccessPrompt.ts
@@ -0,0 +1,10 @@
+export const useAccessPrompt = () => {
+ // 3秒后获取用户浏览器权限
+ // setTimeout(() => {
+ // window['$notification'].create({
+ // title: '友情提示',
+ // content: '此站点仅供演示、学习所用,请勿进行非法操作、上传或发布违法资讯。',
+ // duration: 30000
+ // })
+ // }, 3000)
+}
diff --git a/src/hooks/useClickEvent.ts b/src/hooks/useClickEvent.ts
new file mode 100644
index 0000000..6677b38
--- /dev/null
+++ b/src/hooks/useClickEvent.ts
@@ -0,0 +1,35 @@
+import { isElectronMode, electron } from '@/utils/common'
+
+export const useClickEvent = () => {
+ const push = (el: any) => {
+ const href = el.getAttribute('href')
+
+ if (href) {
+ if (isElectronMode() && el.getAttribute('alt') === 'link') {
+ return electron().openLink(href)
+ }
+
+ return window.open(href)
+ }
+ }
+
+ document.body.addEventListener('click', (event: any) => {
+ const target = event.target
+
+ if (target.nodeName.toLocaleLowerCase() === 'a') {
+ // 判断是否匹配目标元素
+ if (event.preventDefault) {
+ // 对捕获到的 a 标签进行处理
+ event.preventDefault()
+ } else {
+ window.event.returnValue = false
+ }
+
+ console.log('====')
+ // 处理完 a 标签的内容,重新触发跳转,根据原来 a 标签页 target 来判断是否需要新窗口打开
+ push(target)
+ }
+ })
+
+ return {}
+}
diff --git a/src/hooks/useConnectStatus.ts b/src/hooks/useConnectStatus.ts
new file mode 100644
index 0000000..6d0eb54
--- /dev/null
+++ b/src/hooks/useConnectStatus.ts
@@ -0,0 +1,26 @@
+import { watchEffect } from 'vue'
+import { useRouter } from 'vue-router'
+import { useSettingsStore } from '@/store'
+import { isLoggedIn } from '@/utils/auth'
+import ws from '@/connect'
+
+export const useConnectStatus = () => {
+ const settingsStore = useSettingsStore()
+ const router = useRouter()
+
+ watchEffect(() => {
+ if (settingsStore.isLeaveWeb) {
+ return
+ }
+
+ const pathname = router.currentRoute.value.path
+
+ const paths = ['/auth/login', '/auth/register', '/auth/forget']
+
+ if (!paths.includes(pathname) && isLoggedIn()) {
+ !ws.isConnect() && ws.connect()
+ }
+ })
+
+ return {}
+}
diff --git a/src/hooks/useEventBus.ts b/src/hooks/useEventBus.ts
new file mode 100644
index 0000000..5f0d4c5
--- /dev/null
+++ b/src/hooks/useEventBus.ts
@@ -0,0 +1,29 @@
+import { onMounted, onUnmounted } from 'vue'
+import { bus } from '@/utils/event-bus'
+
+interface Event {
+ name: any
+ event: Function
+}
+
+export const useEventBus = (items: Event[]) => {
+ if (!items.length) return
+
+ onMounted(() => {
+ for (const item of items) {
+ bus.subscribe(item.name, item.event)
+ }
+ })
+
+ onUnmounted(() => {
+ for (const item of items) {
+ bus.unsubscribe(item.name, item.event)
+ }
+ })
+
+ const emit = (channel: string, data: any) => {
+ bus.emit(channel, data)
+ }
+
+ return { emit }
+}
diff --git a/src/hooks/useFriendsMenu.ts b/src/hooks/useFriendsMenu.ts
new file mode 100644
index 0000000..81b5e85
--- /dev/null
+++ b/src/hooks/useFriendsMenu.ts
@@ -0,0 +1,37 @@
+import { reactive } from 'vue'
+
+interface IDropdown {
+ options: any[]
+ show: boolean
+ x: number
+ y: number
+ item: any
+}
+
+export function useFriendsMenu() {
+ const dropdown: IDropdown = reactive({
+ options: [],
+ show: false,
+ x: 0,
+ y: 0,
+ item: {}
+ })
+
+ const showDropdownMenu = (e: any, item: any) => {
+ dropdown.item = Object.assign({}, item)
+
+ dropdown.options = []
+ dropdown.options.push({ label: '删除好友', key: 'delete' })
+
+ dropdown.x = e.clientX
+ dropdown.y = e.clientY
+ dropdown.show = true
+ }
+
+ const closeDropdownMenu = () => {
+ dropdown.show = false
+ dropdown.item = {}
+ }
+
+ return { dropdown, showDropdownMenu, closeDropdownMenu }
+}
diff --git a/src/hooks/useGroupListMenu.ts b/src/hooks/useGroupListMenu.ts
new file mode 100644
index 0000000..db8b51d
--- /dev/null
+++ b/src/hooks/useGroupListMenu.ts
@@ -0,0 +1,42 @@
+import { reactive } from 'vue'
+
+interface IDropdown {
+ options: any[]
+ show: boolean
+ x: number
+ y: number
+ item: any
+}
+
+export function useGroupListMenu() {
+ const dropdown: IDropdown = reactive({
+ options: [],
+ show: false,
+ x: 0,
+ y: 0,
+ item: {}
+ })
+
+ const showDropdownMenu = (e: any, item: any) => {
+ dropdown.item = Object.assign({}, item)
+
+ dropdown.options = []
+
+ dropdown.options.push({ label: '添加好友', key: 'delete2' })
+ dropdown.options.push({ label: '移出群聊', key: 'delete1' })
+ dropdown.options.push({ label: '禁止发言', key: 'delete3' })
+ dropdown.options.push({ label: '权限分配', key: 'delete4' })
+ dropdown.options.push({ label: '@群成员', key: 'delete5' })
+
+ dropdown.x = e.clientX
+ dropdown.y = e.clientY
+ dropdown.show = true
+ }
+
+ const closeDropdownMenu = () => {
+ dropdown.show = false
+ dropdown.item = {}
+ }
+
+ return { dropdown, showDropdownMenu, closeDropdownMenu }
+}
diff --git a/src/hooks/useInject.ts b/src/hooks/useInject.ts
new file mode 100644
index 0000000..10267e3
--- /dev/null
+++ b/src/hooks/useInject.ts
@@ -0,0 +1,11 @@
+import { inject } from 'vue'
+
+export function useInject() {
+ const user: any = inject('$user')
+
+ const showUserInfoModal = (uid: number) => {
+ user(uid)
+ }
+
+ return { showUserInfoModal }
+}
diff --git a/src/hooks/useProvideUserModal.ts b/src/hooks/useProvideUserModal.ts
new file mode 100644
index 0000000..3459280
--- /dev/null
+++ b/src/hooks/useProvideUserModal.ts
@@ -0,0 +1,20 @@
+import { ref, provide } from 'vue'
+
+export function useProvideUserModal() {
+ const isShow = ref(false)
+ const uid = ref(0)
+
+ const show = (id: number) => {
+ uid.value = id
+ isShow.value = true
+ }
+
+ const close = () => {
+ uid.value = 0
+ isShow.value = false
+ }
+
+ provide('$user', show)
+
+ return { isShow, uid, show, close }
+}
diff --git a/src/hooks/useSessionMenu.ts b/src/hooks/useSessionMenu.ts
new file mode 100644
index 0000000..3d2d1a5
--- /dev/null
+++ b/src/hooks/useSessionMenu.ts
@@ -0,0 +1,277 @@
+import { reactive, nextTick, computed, h, inject } from 'vue'
+import { ISession } from '@/types/chat'
+import { renderIcon } from '@/utils/util'
+import {
+ ArrowUp,
+ ArrowDown,
+ Logout,
+ Delete,
+ Clear,
+ Remind,
+ CloseRemind,
+ EditTwo,
+ IdCard
+} from '@icon-park/vue-next'
+import { ServeTopTalkList, ServeDeleteTalkList, ServeSetNotDisturb } from '@/api/chat'
+import { useDialogueStore, useTalkStore } from '@/store'
+import { ServeSecedeGroup } from '@/api/group'
+import { ServeDeleteContact, ServeEditContactRemark } from '@/api/contact'
+import { NInput } from 'naive-ui'
+
+interface IDropdown {
+ options: any[]
+ show: boolean
+ x: number
+ y: number
+ item: any
+}
+
+export function useSessionMenu() {
+ const dropdown: IDropdown = reactive({
+ options: [],
+ show: false,
+ x: 0,
+ y: 0,
+ item: {}
+ })
+
+ const dialogueStore = useDialogueStore()
+ const talkStore = useTalkStore()
+
+ const user: any = inject('$user')
+
+ // 当前会话索引
+ const indexName = computed(() => dialogueStore.index_name)
+
+ const onContextMenu = (e: any, item: ISession) => {
+ dropdown.show = false
+ dropdown.item = Object.assign({}, item)
+ dropdown.options = []
+
+ const options: any[] = []
+
+ if (item.talk_type == 1) {
+ options.push({
+ icon: renderIcon(IdCard),
+ label: '好友信息',
+ key: 'info'
+ })
+
+ options.push({
+ icon: renderIcon(EditTwo),
+ label: '修改备注',
+ key: 'remark'
+ })
+ }
+
+ options.push({
+ icon: renderIcon(item.is_top ? ArrowDown : ArrowUp),
+ label: item.is_top ? '取消置顶' : '会话置顶',
+ key: 'top'
+ })
+
+ options.push({
+ icon: renderIcon(item.is_disturb ? Remind : CloseRemind),
+ label: item.is_disturb ? '关闭免打扰' : '开启免打扰',
+ key: 'disturb'
+ })
+
+ options.push({
+ icon: renderIcon(Clear),
+ label: '移除会话',
+ key: 'remove'
+ })
+
+ if (item.talk_type == 1) {
+ options.push({
+ icon: renderIcon(Delete),
+ label: '删除好友',
+ key: 'delete_contact'
+ })
+ } else {
+ options.push({
+ icon: renderIcon(Logout),
+ label: '退出群聊',
+ key: 'signout_group'
+ })
+ }
+
+ dropdown.options = [...options]
+
+ nextTick(() => {
+ dropdown.show = true
+ dropdown.x = e.clientX
+ dropdown.y = e.clientY
+ })
+
+ e.preventDefault()
+ }
+
+ const onCloseContextMenu = () => {
+ dropdown.show = false
+ dropdown.item = {}
+ }
+
+ const onDeleteTalk = (index_name = '') => {
+ talkStore.delItem(index_name)
+
+ index_name === indexName.value && dialogueStore.$reset()
+ }
+
+ const onUserInfo = (item: ISession) => {
+ user(item.receiver_id)
+ }
+
+ // 移除会话
+ const onRemoveTalk = (item: ISession) => {
+ ServeDeleteTalkList({
+ list_id: item.id
+ }).then(({ code }) => {
+ if (code == 200) {
+ onDeleteTalk(item.index_name)
+ }
+ })
+ }
+
+ // 设置消息免打扰
+ const onSetDisturb = (item: ISession) => {
+ ServeSetNotDisturb({
+ talk_type: item.talk_type,
+ receiver_id: item.receiver_id,
+ is_disturb: item.is_disturb == 0 ? 1 : 0
+ }).then(({ code, message }) => {
+ if (code == 200) {
+ window['$message'].success('设置成功!')
+ talkStore.updateItem({
+ index_name: item.index_name,
+ is_disturb: item.is_disturb == 0 ? 1 : 0
+ })
+ } else {
+ window['$message'].error(message)
+ }
+ })
+ }
+
+ // 置顶会话
+ const onToTopTalk = (item: ISession) => {
+ if (item.is_top == 0 && talkStore.topItems.length >= 18) {
+ return window['$message'].info('置顶最多不能超过18个会话')
+ }
+
+ ServeTopTalkList({
+ list_id: item.id,
+ type: item.is_top == 0 ? 1 : 2
+ }).then(({ code, message }) => {
+ if (code == 200) {
+ talkStore.updateItem({
+ index_name: item.index_name,
+ is_top: item.is_top == 0 ? 1 : 0
+ })
+ } else {
+ window['$message'].error(message)
+ }
+ })
+ }
+
+ // 移除联系人
+ const onDeleteContact = (item: ISession) => {
+ const name = item.remark || item.name
+
+ window['$dialog'].create({
+ showIcon: false,
+ title: `删除 [${name}] 联系人?`,
+ content: '删除后不再接收对方任何消息。',
+ positiveText: '确定',
+ negativeText: '取消',
+ onPositiveClick: () => {
+ ServeDeleteContact({
+ friend_id: item.receiver_id
+ }).then(({ code, message }) => {
+ if (code == 200) {
+ window['$message'].success('删除联系人成功')
+ onDeleteTalk(item.index_name)
+ } else {
+ window['$message'].error(message)
+ }
+ })
+ }
+ })
+ }
+
+ // 退出群聊
+ const onSignOutGroup = (item: ISession) => {
+ window['$dialog'].create({
+ showIcon: false,
+ title: `退出 [${item.name}] 群聊?`,
+ content: '退出后不再接收此群的任何消息。',
+ positiveText: '确定',
+ negativeText: '取消',
+ onPositiveClick: () => {
+ ServeSecedeGroup({
+ group_id: item.receiver_id
+ }).then(({ code, message }) => {
+ if (code == 200) {
+ window['$message'].success('已退出群聊')
+ onDeleteTalk(item.index_name)
+ } else {
+ window['$message'].error(message)
+ }
+ })
+ }
+ })
+ }
+
+ const onChangeRemark = (item: ISession) => {
+ let remark = ''
+ window['$dialog'].create({
+ showIcon: false,
+ title: '修改备注',
+ content: () => {
+ return h(NInput, {
+ defaultValue: item.remark,
+ placeholder: '请输入备注信息',
+ style: { marginTop: '20px' },
+ onInput: (value) => (remark = value),
+ autofocus: true
+ })
+ },
+ negativeText: '取消',
+ positiveText: '修改备注',
+ onPositiveClick: () => {
+ ServeEditContactRemark({
+ friend_id: item.receiver_id,
+ remark: remark
+ }).then(({ code, message }) => {
+ if (code == 200) {
+ window['$message'].success('备注成功')
+ talkStore.updateItem({
+ index_name: item.index_name,
+ remark: remark
+ })
+ } else {
+ window['$message'].error(message)
+ }
+ })
+ }
+ })
+ }
+
+ // 会话列表右键菜单回调事件
+ const onContextMenuTalkHandle = (key: string) => {
+ // 注册回调事件
+ const evnets = {
+ info: onUserInfo,
+ top: onToTopTalk,
+ remove: onRemoveTalk,
+ disturb: onSetDisturb,
+ signout_group: onSignOutGroup,
+ delete_contact: onDeleteContact,
+ remark: onChangeRemark
+ }
+
+ dropdown.show = false
+ evnets[key] && evnets[key](dropdown.item)
+ }
+
+ return { dropdown, onContextMenu, onCloseContextMenu, onContextMenuTalkHandle, onToTopTalk }
+}
diff --git a/src/hooks/useSmsLock.ts b/src/hooks/useSmsLock.ts
new file mode 100644
index 0000000..6c0a001
--- /dev/null
+++ b/src/hooks/useSmsLock.ts
@@ -0,0 +1,24 @@
+import { ref, onUnmounted } from 'vue'
+import SmsLock from '@/plugins/sms-lock'
+
+export function useSmsLock(key: string, time = 60) {
+ const lockTime = ref(0)
+
+ // 初始化短信按钮锁
+ const lock = new SmsLock(key, time, (time) => {
+ lockTime.value = time
+ })
+
+ const start = () => {
+ return lock.start()
+ }
+
+ onUnmounted(() => {
+ lock.clear()
+ })
+
+ return {
+ lockTime,
+ start
+ }
+}
diff --git a/src/hooks/useTalkRecord.ts b/src/hooks/useTalkRecord.ts
new file mode 100644
index 0000000..aee0272
--- /dev/null
+++ b/src/hooks/useTalkRecord.ts
@@ -0,0 +1,153 @@
+import { reactive, computed, nextTick } from 'vue'
+import { ServeTalkRecords } from '@/api/chat'
+import { useDialogueStore } from '@/store'
+import { ITalkRecord } from '@/types/chat'
+import { formatTalkRecord } from '@/utils/talk'
+import { addClass, removeClass } from '@/utils/dom'
+
+interface Params {
+ receiver_id: number
+ talk_type: number
+ limit: number
+}
+
+export const useTalkRecord = (uid: number) => {
+ const dialogueStore = useDialogueStore()
+
+ const records = computed((): ITalkRecord[] => dialogueStore.records)
+
+ const location = reactive({
+ msgid: '',
+ num: 0
+ })
+
+ const loadConfig = reactive({
+ receiver_id: 0,
+ talk_type: 0,
+ status: 0,
+ cursor: 0
+ })
+
+ const onJumpMessage = (msgid: string) => {
+ const element = document.getElementById(msgid)
+ if (!element) {
+ if (location.msgid == '') {
+ location.msgid = msgid
+ location.num = 3
+ } else {
+ location.num--
+
+ if (location.num === 0) {
+ location.msgid = ''
+ location.num = 0
+ window['$message'].info('仅支持查看最近300条的记录')
+ return
+ }
+ }
+
+ const el = document.getElementById('imChatPanel')
+
+ return el?.scrollTo({
+ top: 0,
+ behavior: 'smooth'
+ })
+ }
+
+ location.msgid = ''
+ location.num = 0
+
+ element?.scrollIntoView({
+ behavior: 'smooth'
+ })
+
+ addClass(element, 'border')
+
+ setTimeout(() => {
+ element && removeClass(element, 'border')
+ }, 3000)
+ }
+
+ // 加载数据列表
+ const load = async (params: Params) => {
+ const request = {
+ talk_type: params.talk_type,
+ receiver_id: params.receiver_id,
+ cursor: loadConfig.cursor,
+ limit: 30
+ }
+
+ loadConfig.status = 0
+
+ let scrollHeight = 0
+ const el = document.getElementById('imChatPanel')
+ if (el) {
+ scrollHeight = el.scrollHeight
+ }
+
+ const { data, code } = await ServeTalkRecords(request)
+ if (code != 200) {
+ return (loadConfig.status = 1)
+ }
+
+ // 防止对话切换过快,数据渲染错误
+ if (
+ request.talk_type != loadConfig.talk_type ||
+ request.receiver_id != loadConfig.receiver_id
+ ) {
+ return (location.msgid = '')
+ }
+
+ const items = (data.items || []).map((item: ITalkRecord) => formatTalkRecord(uid, item))
+
+ if (request.cursor == 0) {
+ // 判断是否是初次加载
+ dialogueStore.clearDialogueRecord()
+ }
+
+ dialogueStore.unshiftDialogueRecord(items.reverse())
+
+ loadConfig.status = items.length >= request.limit ? 1 : 2
+
+ loadConfig.cursor = data.cursor
+
+ nextTick(() => {
+ const el = document.getElementById('imChatPanel')
+
+ if (el) {
+ if (request.cursor == 0) {
+ el.scrollTop = el.scrollHeight
+
+ setTimeout(() => {
+ el.scrollTop = el.scrollHeight + 1000
+ }, 50)
+ } else {
+ el.scrollTop = el.scrollHeight - scrollHeight
+ }
+ }
+
+ if (location.msgid) {
+ onJumpMessage(location.msgid)
+ }
+ })
+ }
+
+ const onRefreshLoad = () => {
+ if (loadConfig.status == 1) {
+ load({
+ receiver_id: loadConfig.receiver_id,
+ talk_type: loadConfig.talk_type,
+ limit: 30
+ })
+ }
+ }
+
+ const onLoad = (params: Params) => {
+ loadConfig.cursor = 0
+ loadConfig.receiver_id = params.receiver_id
+ loadConfig.talk_type = params.talk_type
+
+ load(params)
+ }
+
+ return { loadConfig, records, onLoad, onRefreshLoad, onJumpMessage }
+}
diff --git a/src/hooks/useThemeMode.ts b/src/hooks/useThemeMode.ts
new file mode 100644
index 0000000..f7cb75a
--- /dev/null
+++ b/src/hooks/useThemeMode.ts
@@ -0,0 +1,27 @@
+import { computed } from 'vue'
+import { useSettingsStore } from '@/store'
+import { overrides } from '@/constant/theme'
+import { darkTheme } from 'naive-ui'
+
+export function useThemeMode() {
+ const settingsStore = useSettingsStore()
+
+ const getDarkTheme = computed(() => {
+ const theme = settingsStore.darkTheme ? 'dark' : 'light'
+
+ document.documentElement.setAttribute('theme-mode', theme)
+
+ return settingsStore.darkTheme ? darkTheme : undefined
+ })
+
+ const getThemeOverride = computed(() => {
+ if (settingsStore.darkTheme) {
+ overrides.common.bodyColor = '#202124'
+ overrides.common.baseColor = '#ffffff'
+ }
+
+ return overrides
+ })
+
+ return { getDarkTheme, getThemeOverride }
+}
diff --git a/src/hooks/useUnreadMessage.ts b/src/hooks/useUnreadMessage.ts
new file mode 100644
index 0000000..e10a825
--- /dev/null
+++ b/src/hooks/useUnreadMessage.ts
@@ -0,0 +1,26 @@
+import { watchEffect } from 'vue'
+import { useTalkStore } from '@/store'
+import { isElectronMode, electron } from '@/utils/common'
+
+export const useUnreadMessage = () => {
+ const useTalk = useTalkStore()
+ const el = document.getElementsByTagName('title')[0]
+ const title = el.innerText
+
+ watchEffect(() => {
+ if (isElectronMode()) {
+ electron().setBadge(useTalk.talkUnreadNum)
+ } else {
+ setInterval(() => {
+ if (useTalk.talkUnreadNum > 0) {
+ el.innerText =
+ el.innerText == title ? `您有新的消息未读(${useTalk.talkUnreadNum})` : title
+ } else {
+ el.innerText = title
+ }
+ }, 1000)
+ }
+ })
+
+ return {}
+}
diff --git a/src/hooks/useUtil.ts b/src/hooks/useUtil.ts
new file mode 100644
index 0000000..641cb39
--- /dev/null
+++ b/src/hooks/useUtil.ts
@@ -0,0 +1,19 @@
+import { getCurrentInstance } from 'vue'
+import type { MessageApiInjection } from 'naive-ui/es/message/src/MessageProvider'
+import type { DialogApiInjection } from 'naive-ui/es/dialog/src/DialogProvider'
+import type { NotificationApiInjection } from 'naive-ui/es/notification/src/NotificationProvider'
+
+export function useUtil() {
+ const ctx = getCurrentInstance()
+
+ if (!ctx) {
+ throw new Error('useUtil must be called in setup function')
+ }
+
+ const useMessage: MessageApiInjection = ctx.appContext.config.globalProperties.$message
+ const useDialog: DialogApiInjection = ctx.appContext.config.globalProperties.$dialog
+ const useNotification: NotificationApiInjection =
+ ctx.appContext.config.globalProperties.$notification
+
+ return { useMessage, useDialog, useNotification }
+}
diff --git a/src/hooks/useVisibilityChange.ts b/src/hooks/useVisibilityChange.ts
new file mode 100644
index 0000000..4ff876f
--- /dev/null
+++ b/src/hooks/useVisibilityChange.ts
@@ -0,0 +1,44 @@
+import { onMounted, onUnmounted } from 'vue'
+import { useRouter } from 'vue-router'
+import { isLoggedIn } from '@/utils/auth'
+import { useSettingsStore } from '@/store'
+
+let once = false
+const paths = ['/auth/login', '/auth/register', '/auth/forget']
+
+export function useVisibilityChange() {
+ onMounted(() => {
+ document.addEventListener('visibilitychange', handle)
+ })
+
+ onUnmounted(() => {
+ document.removeEventListener('visibilitychange', handle)
+ })
+
+ return {}
+}
+
+function handle() {
+ useSettingsStore().isLeaveWeb = document.visibilityState === 'hidden'
+
+ if (document.visibilityState === 'hidden') {
+ return
+ }
+
+ if (isLoggedIn() || once) return
+
+ if (paths.includes(useRouter().currentRoute.value.path)) return
+
+ once = true
+
+ window['$dialog'].info({
+ title: '友情提示',
+ content: '当前登录已失效,请重新登录?',
+ positiveText: '立即登录?',
+ maskClosable: false,
+ onPositiveClick: () => {
+ once = false
+ useRouter().push('/auth/login')
+ }
+ })
+}
diff --git a/src/layout/MainLayout.vue b/src/layout/MainLayout.vue
new file mode 100644
index 0000000..824a9b4
--- /dev/null
+++ b/src/layout/MainLayout.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
diff --git a/src/layout/SubViewLayout.vue b/src/layout/SubViewLayout.vue
new file mode 100644
index 0000000..220bfc0
--- /dev/null
+++ b/src/layout/SubViewLayout.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
diff --git a/src/layout/component/AccountCard.vue b/src/layout/component/AccountCard.vue
new file mode 100644
index 0000000..f410c01
--- /dev/null
+++ b/src/layout/component/AccountCard.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+ 个性签名:
+
+ {{ store.motto || ' 编辑个签,展示我的独特态度。' }}
+
+
+
+
+
+
+
diff --git a/src/layout/component/Menu.vue b/src/layout/component/Menu.vue
new file mode 100644
index 0000000..97074a8
--- /dev/null
+++ b/src/layout/component/Menu.vue
@@ -0,0 +1,280 @@
+
+
+
+
+
+
+
diff --git a/src/layout/component/Sponsor.vue b/src/layout/component/Sponsor.vue
new file mode 100644
index 0000000..5506364
--- /dev/null
+++ b/src/layout/component/Sponsor.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+ 开源支持
+
+
+
+
+
+

+
支付宝
+
+
+

+
微信
+
+
+
+
+
+
+
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..e17c07a
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,24 @@
+import '@/assets/css/define/theme.less'
+import '@/assets/css/define/global.less'
+import '@/assets/css/dropsize.less'
+import { createApp } from 'vue'
+import router from './router'
+import App from './App.vue'
+import * as plugins from './plugins'
+
+async function bootstrap() {
+ const app = createApp(App)
+
+ app.use(router)
+
+ plugins.setPinia(app)
+ plugins.setHljsVuePlugin(app)
+ plugins.setupNaive(app)
+ plugins.setMdEditor(app)
+ plugins.setComponents(app)
+ plugins.setupDirective(app)
+
+ app.mount('#app')
+}
+
+bootstrap()
diff --git a/src/plugins/component.ts b/src/plugins/component.ts
new file mode 100644
index 0000000..c394f06
--- /dev/null
+++ b/src/plugins/component.ts
@@ -0,0 +1,12 @@
+import { App } from 'vue'
+import { setComponents as Components } from '@/components/talk/message'
+import Avatar from '@/components/base/Avatar.vue'
+
+export { setupDirective } from '@/directive'
+
+// 注册全局消息组件
+export function setComponents(app: App) {
+ Components(app)
+
+ app.component('im-avatar', Avatar)
+}
diff --git a/src/plugins/highlight.ts b/src/plugins/highlight.ts
new file mode 100644
index 0000000..ab622a8
--- /dev/null
+++ b/src/plugins/highlight.ts
@@ -0,0 +1,43 @@
+import hljsVuePlugin from '@highlightjs/vue-plugin'
+import 'highlight.js/styles/github.css'
+import 'highlight.js/lib/common'
+import hljs from 'highlight.js/lib/core'
+import php from 'highlight.js/lib/languages/php'
+import c from 'highlight.js/lib/languages/c'
+import go from 'highlight.js/lib/languages/go'
+import java from 'highlight.js/lib/languages/java'
+import python from 'highlight.js/lib/languages/python'
+import sql from 'highlight.js/lib/languages/sql'
+import json from 'highlight.js/lib/languages/json'
+import typescript from 'highlight.js/lib/languages/typescript'
+import javascript from 'highlight.js/lib/languages/javascript'
+import rust from 'highlight.js/lib/languages/rust'
+import markdown from 'highlight.js/lib/languages/markdown'
+import nginx from 'highlight.js/lib/languages/nginx'
+import yaml from 'highlight.js/lib/languages/yaml'
+import protobuf from 'highlight.js/lib/languages/protobuf'
+import shell from 'highlight.js/lib/languages/shell'
+import ini from 'highlight.js/lib/languages/ini'
+import makefile from 'highlight.js/lib/languages/makefile'
+
+hljs.registerLanguage('c', c)
+hljs.registerLanguage('php', php)
+hljs.registerLanguage('go', go)
+hljs.registerLanguage('java', java)
+hljs.registerLanguage('python', python)
+hljs.registerLanguage('sql', sql)
+hljs.registerLanguage('json', json)
+hljs.registerLanguage('typescript', typescript)
+hljs.registerLanguage('javascript', javascript)
+hljs.registerLanguage('rust', rust)
+hljs.registerLanguage('markdown', markdown)
+hljs.registerLanguage('nginx', nginx)
+hljs.registerLanguage('yaml', yaml)
+hljs.registerLanguage('protobuf', protobuf)
+hljs.registerLanguage('shell', shell)
+hljs.registerLanguage('ini', ini)
+hljs.registerLanguage('makefile', makefile)
+
+export function setHljsVuePlugin(app) {
+ app.use(hljsVuePlugin)
+}
diff --git a/src/plugins/index.ts b/src/plugins/index.ts
new file mode 100644
index 0000000..b61f112
--- /dev/null
+++ b/src/plugins/index.ts
@@ -0,0 +1,7 @@
+export * from './highlight'
+export * from './component'
+export * from './md-editor'
+export * from './naive-ui'
+export * from './sms-lock'
+export * from './ws-socket'
+export * from './pinia'
diff --git a/src/plugins/md-editor.ts b/src/plugins/md-editor.ts
new file mode 100644
index 0000000..0bd04f6
--- /dev/null
+++ b/src/plugins/md-editor.ts
@@ -0,0 +1,14 @@
+import { App } from 'vue'
+import VueMarkdownEditor from '@kangc/v-md-editor'
+import '@kangc/v-md-editor/lib/style/base-editor.css'
+import githubTheme from '@kangc/v-md-editor/lib/theme/github.js'
+import '@kangc/v-md-editor/lib/theme/style/github.css'
+import hljs from 'highlight.js'
+
+VueMarkdownEditor.use(githubTheme, {
+ Hljs: hljs
+})
+
+export function setMdEditor(app: App) {
+ app.use(VueMarkdownEditor)
+}
diff --git a/src/plugins/naive-ui.ts b/src/plugins/naive-ui.ts
new file mode 100644
index 0000000..7d89b08
--- /dev/null
+++ b/src/plugins/naive-ui.ts
@@ -0,0 +1,45 @@
+import { App } from 'vue'
+
+import {
+ // create naive ui
+ create,
+ // component
+ NButton,
+ NLayout,
+ NLayoutSider,
+ NLayoutHeader,
+ NLayoutContent,
+ NLayoutFooter,
+ NAvatar,
+ NIcon,
+ NInput,
+ NSpin,
+ NEmpty,
+ NModal,
+ NTag,
+ NSpace
+} from 'naive-ui'
+
+// 按需全局安装组件
+const naive = create({
+ components: [
+ NButton,
+ NLayout,
+ NLayoutSider,
+ NLayoutHeader,
+ NLayoutContent,
+ NLayoutFooter,
+ NAvatar,
+ NIcon,
+ NInput,
+ NSpin,
+ NEmpty,
+ NModal,
+ NTag,
+ NSpace
+ ]
+})
+
+export function setupNaive(app: App) {
+ app.use(naive)
+}
diff --git a/src/plugins/pinia.ts b/src/plugins/pinia.ts
new file mode 100644
index 0000000..d201fe5
--- /dev/null
+++ b/src/plugins/pinia.ts
@@ -0,0 +1,10 @@
+import { App } from 'vue'
+import { createPinia } from 'pinia'
+import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
+
+export function setPinia(app: App) {
+ const pinia = createPinia()
+ pinia.use(piniaPluginPersistedstate)
+
+ app.use(pinia)
+}
diff --git a/src/plugins/sms-lock.ts b/src/plugins/sms-lock.ts
new file mode 100644
index 0000000..90e1f81
--- /dev/null
+++ b/src/plugins/sms-lock.ts
@@ -0,0 +1,79 @@
+type callBack = (time: number) => void
+
+/**
+ * 短信倒计时锁
+ */
+class SmsLock {
+ // 计时器
+ timer: number | null = null
+
+ // 倒计时默认60秒
+ lockTime: number = 60
+
+ // 锁标记名称
+ lockName: string = ''
+
+ // 回调方法
+ callBack: callBack
+
+ /**
+ * 实例化构造方法
+ * @param purpose 唯一标识
+ * @param lockTime
+ * @param fn
+ */
+ constructor(purpose: string, lockTime = 60, fn: callBack) {
+ this.lockTime = lockTime
+
+ this.lockName = `SMSLOCK_${purpose}`
+
+ this.callBack = fn
+
+ this.compute()
+ }
+
+ // 开始计时
+ start() {
+ // 设置本地缓存
+ localStorage.setItem(this.lockName, `${this.getCurrentTime() + this.lockTime}`)
+
+ this.compute()
+ }
+
+ compute() {
+ this.clear()
+
+ const time = this.getExpireTime()
+
+ if (time === null) return
+
+ if (time <= this.getCurrentTime()) {
+ this.callBack(0)
+ localStorage.removeItem(this.lockName)
+ return
+ }
+
+ const t = time - this.getCurrentTime()
+
+ this.callBack(t)
+
+ this.timer = setTimeout(() => this.compute(), 1000)
+ }
+
+ // 获取当前时间
+ getCurrentTime(): number {
+ return Math.floor(new Date().getTime() / 1000)
+ }
+
+ // 获取过期时间
+ getExpireTime(): any {
+ return localStorage.getItem(this.lockName)
+ }
+
+ // 清除计时器
+ clear() {
+ this.timer && clearTimeout(this.timer)
+ }
+}
+
+export default SmsLock
diff --git a/src/plugins/ws-socket.js b/src/plugins/ws-socket.js
new file mode 100644
index 0000000..110ccff
--- /dev/null
+++ b/src/plugins/ws-socket.js
@@ -0,0 +1,262 @@
+const cache = new Set()
+
+class WsSocket {
+ /**
+ * Websocket 连接
+ *
+ * @var Websocket
+ */
+ connect
+
+ /**
+ * 配置信息
+ *
+ * @var Object
+ */
+ config = {
+ heartbeat: {
+ setInterval: null,
+ pingInterval: 20000,
+ pingTimeout: 60000
+ },
+ reconnect: {
+ lockReconnect: false,
+ setTimeout: null, // 计时器对象
+ time: 3000, // 重连间隔时间
+ number: 10000000 // 重连次数
+ }
+ }
+
+ // 最后心跳时间
+ lastTime = 0
+
+ /**
+ * 自定义绑定消息事件
+ *
+ * @var Array
+ */
+ onCallBacks = []
+
+ defaultEvent = {
+ onError: (evt) => {
+ console.log(evt)
+ },
+ onOpen: (evt) => {
+ console.log(evt)
+ },
+ onClose: (evt) => {
+ console.log(evt)
+ }
+ }
+
+ /**
+ * 创建 WsSocket 的实例
+ *
+ * @param {Function} urlCallBack url闭包函数
+ * @param {Object} events 原生 WebSocket 绑定事件
+ */
+ constructor(urlCallBack, events) {
+ this.urlCallBack = urlCallBack
+
+ // 定义 WebSocket 原生方法
+ this.events = Object.assign({}, this.defaultEvent, events)
+
+ this.on('connect', (data) => {
+ this.config.heartbeat.pingInterval = data.ping_interval * 1000
+ this.config.heartbeat.pingTimeout = data.ping_timeout * 1000
+ this.heartbeat()
+ this.connect.send('{"event":"ping"}')
+ })
+ }
+
+ /**
+ * 事件绑定
+ *
+ * @param {String} event 事件名
+ * @param {Function} callBack 回调方法
+ */
+ on(event, callBack) {
+ this.onCallBacks[event] = callBack
+
+ return this
+ }
+
+ /**
+ * 加载 WebSocket
+ */
+ loadSocket() {
+ const url = this.urlCallBack()
+
+ const connect = new WebSocket(url)
+ connect.onerror = this.onError.bind(this)
+ connect.onopen = this.onOpen.bind(this)
+ connect.onmessage = this.onMessage.bind(this)
+ connect.onclose = this.onClose.bind(this)
+
+ this.connect = connect
+ }
+
+ /**
+ * 连接 Websocket
+ */
+ connection() {
+ this.connect == null && this.loadSocket()
+ }
+
+ /**
+ * 掉线重连 Websocket
+ */
+ reconnect() {
+ // 没连接上会一直重连,设置延迟避免请求过多
+ clearTimeout(this.config.reconnect.setTimeout)
+
+ this.config.reconnect.setTimeout = setTimeout(() => {
+ this.connection()
+
+ console.log(`网络连接已断开,正在尝试重新连接...`)
+ }, this.config.reconnect.time)
+ }
+
+ /**
+ * 解析接受的消息
+ *
+ * @param {Object} evt Websocket 消息
+ */
+ onParse(evt) {
+ const { sid, event, content } = JSON.parse(evt.data)
+
+ return {
+ sid: sid,
+ event: event,
+ data: content,
+ orginData: evt.data
+ }
+ }
+
+ /**
+ * 打开连接
+ *
+ * @param {Object} evt Websocket 消息
+ */
+ onOpen(evt) {
+ this.lastTime = new Date().getTime()
+
+ this.events.onOpen(evt)
+
+ this.ping()
+ }
+
+ /**
+ * 关闭连接
+ *
+ * @param {Object} evt Websocket 消息
+ */
+ onClose(evt) {
+ this.events.onClose(evt)
+
+ this.connect && this.connect.close()
+
+ this.connect = null
+
+ evt.code == 1006 && this.reconnect()
+ }
+
+ /**
+ * 连接错误
+ *
+ * @param {Object} evt Websocket 消息
+ */
+ onError(evt) {
+ this.events.onError(evt)
+ this.connect.close()
+ this.connect = null
+ this.reconnect()
+ }
+
+ /**
+ * 接收消息
+ *
+ * @param {Object} evt Websocket 消息
+ */
+ onMessage(evt) {
+ this.lastTime = new Date().getTime()
+
+ let result = this.onParse(evt)
+
+ if (result.sid) {
+ if (cache.has(result.sid)) return
+
+ cache.add(result.sid)
+
+ this.connect.send(`{"event":"ack","sid":"${result.sid}"}`)
+ }
+
+ // 判断消息事件是否被绑定
+ if (Object.prototype.hasOwnProperty.call(this.onCallBacks, result.event)) {
+ this.onCallBacks[result.event](result.data, result.orginData)
+ } else {
+ console.warn(`WsSocket 消息事件[${result.event}]未绑定...`)
+ }
+ }
+
+ /**
+ * WebSocket 心跳检测
+ */
+ heartbeat() {
+ this.config.heartbeat.setInterval = setInterval(() => {
+ let t = new Date().getTime()
+
+ if (t - this.lastTime > this.config.heartbeat.pingTimeout) {
+ if (this.connect) {
+ this.connect.close()
+ }
+
+ this.reconnect()
+ } else {
+ this.ping()
+ }
+ }, this.config.heartbeat.pingInterval)
+ }
+
+ ping() {
+ this.connect.send('{"event":"ping"}')
+ }
+
+ /**
+ * 聊天发送数据
+ *
+ * @param {Object} mesage
+ */
+ send(mesage) {
+ if (typeof mesage == 'string') {
+ this.connect.send(mesage)
+ } else {
+ this.connect.send(JSON.stringify(mesage))
+ }
+ }
+
+ /**
+ * 关闭连接
+ */
+ close() {
+ this.connect.close()
+ }
+
+ /**
+ * 推送消息
+ *
+ * @param {String} event 事件名
+ * @param {Object} data 数据
+ */
+ emit(event, data) {
+ const content = JSON.stringify({ event, content: data })
+
+ if (this.connect && this.connect.readyState === 1) {
+ this.connect.send(content)
+ } else {
+ console.error('WebSocket 连接已关闭...', this.connect)
+ }
+ }
+}
+
+export default WsSocket
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..a6c549c
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,67 @@
+import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router'
+import { isLoggedIn } from '@/utils/auth'
+import MainLayout from '@/layout/MainLayout.vue'
+
+import SettingRouter from './modules/setting'
+import ContactRouter from './modules/contact'
+import AuthRouter from './modules/auth'
+
+const routes = [
+ {
+ path: '/',
+ name: 'home',
+ meta: { auth: true },
+ component: MainLayout,
+ redirect: '/message',
+ children: [
+ {
+ path: '/message',
+ name: 'message',
+ meta: { auth: true },
+ component: () => import('@/views/message/index.vue')
+ },
+ {
+ path: '/note',
+ name: 'note',
+ meta: { auth: true },
+ component: () => import('@/views/note/index.vue')
+ },
+ {
+ path: '/example',
+ name: 'example',
+ component: () => import('@/views/example/index.vue')
+ },
+ SettingRouter,
+ ContactRouter
+ ]
+ },
+ AuthRouter,
+ {
+ path: '/:pathMatch(.*)*',
+ name: '404 NotFound',
+ component: () => import('@/views/other/not-found.vue')
+ }
+]
+
+const getHistoryMode = () => {
+ return import.meta.env.VITE_ROUTER_MODE == 'hash' ? createWebHashHistory() : createWebHistory()
+}
+
+const router = createRouter({
+ history: getHistoryMode(),
+ routes,
+ strict: true,
+ scrollBehavior: () => ({ left: 0, top: 0 })
+})
+
+// 设置中间件,权限验证
+router.beforeEach((to) => {
+ if (to.meta?.auth && !isLoggedIn()) {
+ return {
+ path: '/auth/login',
+ query: { redirect: to.fullPath }
+ }
+ }
+})
+
+export default router
diff --git a/src/router/modules/auth.js b/src/router/modules/auth.js
new file mode 100644
index 0000000..29aa26e
--- /dev/null
+++ b/src/router/modules/auth.js
@@ -0,0 +1,23 @@
+export default {
+ path: '/auth',
+ name: 'auth',
+ redirect: '/auth/register',
+ component: () => import('@/views/auth/layout.vue'),
+ children: [
+ {
+ path: '/auth/login',
+ meta: { auth: false },
+ component: () => import('@/views/auth/login.vue')
+ },
+ {
+ path: '/auth/register',
+ meta: { auth: false },
+ component: () => import('@/views/auth/register.vue')
+ },
+ {
+ path: '/auth/forget',
+ meta: { auth: false },
+ component: () => import('@/views/auth/forget.vue')
+ }
+ ]
+}
diff --git a/src/router/modules/contact.js b/src/router/modules/contact.js
new file mode 100644
index 0000000..8590b4a
--- /dev/null
+++ b/src/router/modules/contact.js
@@ -0,0 +1,33 @@
+export default {
+ path: '/contact',
+ name: 'contact',
+ redirect: '/contact/friend',
+ component: () => import('@/views/contact/layout.vue'),
+ children: [
+ {
+ path: '/contact/organize',
+ meta: { auth: true },
+ component: () => import('@/views/contact/organize.vue')
+ },
+ {
+ path: '/contact/friend',
+ meta: { auth: true },
+ component: () => import('@/views/contact/friends.vue')
+ },
+ {
+ path: '/contact/apply',
+ meta: { auth: true },
+ component: () => import('@/views/contact/apply.vue')
+ },
+ {
+ path: '/contact/group',
+ meta: { auth: true },
+ component: () => import('@/views/contact/groups.vue')
+ },
+ {
+ path: '/contact/group/open',
+ meta: { auth: true },
+ component: () => import('@/views/contact/open-group.vue')
+ }
+ ]
+}
diff --git a/src/router/modules/setting.js b/src/router/modules/setting.js
new file mode 100644
index 0000000..61a8434
--- /dev/null
+++ b/src/router/modules/setting.js
@@ -0,0 +1,33 @@
+export default {
+ path: '/settings',
+ name: 'settings',
+ redirect: '/settings/detail',
+ component: () => import('@/views/setting/layout.vue'),
+ children: [
+ {
+ path: '/settings/detail',
+ meta: { auth: true },
+ component: () => import('@/views/setting/detail.vue')
+ },
+ {
+ path: '/settings/security',
+ meta: { auth: true },
+ component: () => import('@/views/setting/security.vue')
+ },
+ {
+ path: '/settings/binding',
+ meta: { auth: true },
+ component: () => import('@/views/setting/binding.vue')
+ },
+ {
+ path: '/settings/personalize',
+ meta: { auth: true },
+ component: () => import('@/views/setting/personalize.vue')
+ },
+ {
+ path: '/settings/notification',
+ meta: { auth: true },
+ component: () => import('@/views/setting/notification.vue')
+ }
+ ]
+}
diff --git a/src/store/index.ts b/src/store/index.ts
new file mode 100644
index 0000000..6eb3e3c
--- /dev/null
+++ b/src/store/index.ts
@@ -0,0 +1,8 @@
+export * from '@/store/modules/user'
+export * from '@/store/modules/settings'
+export * from '@/store/modules/talk'
+export * from '@/store/modules/editor'
+export * from '@/store/modules/dialogue'
+export * from '@/store/modules/editor-draft'
+export * from '@/store/modules/uploads'
+export * from '@/store/modules/note'
diff --git a/src/store/modules/dialogue.js b/src/store/modules/dialogue.js
new file mode 100644
index 0000000..1e942a9
--- /dev/null
+++ b/src/store/modules/dialogue.js
@@ -0,0 +1,231 @@
+import { defineStore } from 'pinia'
+import {
+ ServeRemoveRecords,
+ ServeRevokeRecords,
+ ServePublishMessage,
+ ServeCollectEmoticon
+} from '@/api/chat'
+import { ServeGetGroupMembers } from '@/api/group'
+import { useEditorStore } from './editor'
+
+// 键盘消息事件定时器
+let keyboardTimeout = null
+
+export const useDialogueStore = defineStore('dialogue', {
+ state: () => {
+ return {
+ // 对话索引(聊天对话的唯一索引)
+ index_name: '',
+
+ // 对话节点
+ talk: {
+ username: '',
+ talk_type: 0, // 对话来源[1:私聊;2:群聊]
+ receiver_id: 0
+ },
+
+ // 好友是否正在输入文字
+ keyboard: false,
+
+ // 对方是否在线
+ online: false,
+
+ // 聊天记录
+ records: [],
+
+ // 新消息提示
+ unreadBubble: 0,
+
+ // 是否开启多选操作模式
+ isOpenMultiSelect: false,
+
+ // 是否显示编辑器
+ isShowEditor: false,
+
+ // 是否显示会话列表
+ isShowSessionList: true,
+
+ // 群成员列表
+ members: [],
+
+ // 对话记录
+ items: {
+ '1_1': {
+ talk_type: 1, // 对话类型
+ receiver_id: 0, // 接收者ID
+ read_sequence: 0, // 当前已读的最后一条记录
+ records: []
+ }
+ }
+ }
+ },
+ getters: {
+ // 多选列表
+ selectItems: (state) => state.records.filter((item) => item.isCheck),
+ // 当前对话是否是群聊
+ isGroupTalk: (state) => state.talk.talk_type === 2
+ },
+ actions: {
+ // 更新在线状态
+ setOnlineStatus(status) {
+ this.online = status
+ },
+
+ // 更新对话信息
+ setDialogue(data = {}) {
+ this.online = data.is_online == 1
+ this.talk = {
+ username: data.remark || data.name,
+ talk_type: data.talk_type,
+ receiver_id: data.receiver_id
+ }
+
+ this.index_name = `${data.talk_type}_${data.receiver_id}`
+ this.records = []
+ this.unreadBubble = 0
+ this.isShowEditor = data?.is_robot === 0
+
+ this.members = []
+ if (data.talk_type == 2) {
+ this.updateGroupMembers()
+ }
+ },
+
+ // 更新提及列表
+ async updateGroupMembers() {
+ let { code, data } = await ServeGetGroupMembers({
+ group_id: this.talk.receiver_id
+ })
+
+ if (code != 200) return
+
+ this.members = data.items.map((o) => ({
+ id: o.user_id,
+ nickname: o.nickname,
+ avatar: o.avatar,
+ gender: o.gender,
+ leader: o.leader,
+ remark: o.remark,
+ online: false,
+ value: o.nickname
+ }))
+ },
+
+ // 清空对话记录
+ clearDialogueRecord() {
+ this.records = []
+ },
+
+ // 数组头部压入对话记录
+ unshiftDialogueRecord(records) {
+ this.records.unshift(...records)
+ },
+
+ // 推送对话记录
+ addDialogueRecord(record) {
+ // TOOD 需要通过 sequence 排序,保证消息一致性
+ // this.records.splice(index, 0, record)
+
+ this.records.push(record)
+ },
+
+ // 更新对话记录
+ updateDialogueRecord(params) {
+ const { msg_id = '' } = params
+
+ const item = this.records.find((item) => item.msg_id === msg_id)
+
+ item && Object.assign(item, params)
+ },
+
+ // 批量删除对话记录
+ batchDelDialogueRecord(msgIds = []) {
+ msgIds.forEach((msgid) => {
+ const index = this.records.findIndex((item) => item.msg_id === msgid)
+
+ if (index >= 0) this.records.splice(index, 1)
+ })
+ },
+
+ // 自增好友键盘输入事件
+ triggerKeyboard() {
+ this.keyboard = true
+
+ clearTimeout(keyboardTimeout)
+
+ keyboardTimeout = setTimeout(() => (this.keyboard = false), 2000)
+ },
+
+ setUnreadBubble(value) {
+ if (value === 0) {
+ this.unreadBubble = 0
+ } else {
+ this.unreadBubble++
+ }
+ },
+
+ // 关闭多选模式
+ closeMultiSelect() {
+ this.isOpenMultiSelect = false
+
+ for (const item of this.selectItems) {
+ if (item.isCheck) {
+ item.isCheck = false
+ }
+ }
+ },
+
+ // 删除聊天记录
+ ApiDeleteRecord(msgIds = []) {
+ ServeRemoveRecords({
+ talk_type: this.talk.talk_type,
+ receiver_id: this.talk.receiver_id,
+ msg_ids: msgIds
+ }).then((res) => {
+ if (res.code == 200) {
+ this.batchDelDialogueRecord(msgIds)
+ } else {
+ window['$message'].warning(res.message)
+ }
+ })
+ },
+
+ // 撤销聊天记录
+ ApiRevokeRecord(msg_id = '') {
+ ServeRevokeRecords({ msg_id }).then((res) => {
+ if (res.code == 200) {
+ this.updateDialogueRecord({ msg_id, is_revoke: 1 })
+ } else {
+ window['$message'].warning(res.message)
+ }
+ })
+ },
+
+ // 转发聊天记录
+ ApiForwardRecord(options) {
+ let data = {
+ type: 'forward',
+ receiver: {
+ talk_type: this.talk.talk_type,
+ receiver_id: this.talk.receiver_id
+ },
+ ...options
+ }
+
+ ServePublishMessage(data).then((res) => {
+ if (res.code == 200) {
+ this.closeMultiSelect()
+ }
+ })
+ },
+
+ ApiCollectImage(options) {
+ const { msg_id } = options
+
+ ServeCollectEmoticon({ msg_id }).then(() => {
+ useEditorStore().loadUserEmoticon()
+ window['$message'] && window['$message'].success('收藏成功')
+ })
+ }
+ }
+})
diff --git a/src/store/modules/editor-draft.js b/src/store/modules/editor-draft.js
new file mode 100644
index 0000000..524191f
--- /dev/null
+++ b/src/store/modules/editor-draft.js
@@ -0,0 +1,13 @@
+import { defineStore } from 'pinia'
+
+// 编辑器草稿
+export const useEditorDraftStore = defineStore('editor-draft', {
+ // 开启数据持久化
+ persist: true,
+ state: () => {
+ return {
+ items: {}
+ }
+ },
+ actions: {}
+})
diff --git a/src/store/modules/editor.js b/src/store/modules/editor.js
new file mode 100644
index 0000000..df42025
--- /dev/null
+++ b/src/store/modules/editor.js
@@ -0,0 +1,80 @@
+import { defineStore } from 'pinia'
+import { ServeFindUserEmoticon, ServeUploadEmoticon, ServeDeleteEmoticon } from '@/api/emoticon'
+import { ServeCollectEmoticon } from '@/api/chat'
+
+const message = window['$message']
+
+export const useEditorStore = defineStore('editor', {
+ state: () => {
+ return {
+ // 表包相关
+ emoticon: {
+ items: [
+ {
+ name: '系统表情',
+ icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAzFBMVEUAAAD7ywP7ywT80wH6wwb6xgX80wH6wwb7zwL7zgP5xAb7ywT5xAb5wgf7ywT80gH80gL7ywP80gH7ywT7zgP6yAX80wH5wQf80QL80wH6xgb81AH5wgf6xwX81AH5wQf81AH5wwb80gL5wQf7zgP5wgf80gH7zAP5wwb6ygT6xwX70AL7zgOudAD6xQb2wgXVnwLwvwPRmgLDigG1ewCxdwDgqQTcpgPYoQPrvALhsAG6gQHosgTntAP1yAPMlQLJkgLJkQK/hgG3fgAADXCMAAAAJnRSTlMATgT7znJxcHAM/fnz7uzs09HMqS4mJfry8u3t1tXVqqpcWy0tD14bIcIAAAGzSURBVDjLnZTXcsIwEEUdcAFCCy290GwgLHKld/7/n6IVljBGDgznxbtXZzSz9niVO+noP+X3dPq9/KN3kq2s/mVG+NKzUi2VKZkxSpnUpdeomBIqjbj38GpKeX0491ppM4F06+w+9JLMyJ2NF/MfXhpiXjGHnAqfPfN7hUz4nkvXxFKWiboI5u7sdDpz56LWmVgehswBgjVv1gHAnDdl9GpDjg0AM97MaGOLoxqOIjrHB8/ijeWB74gjHKdqCfqOFcHpn+oqFZ+sG3iiYvEWsUjFx1vERxT7N4Bi8VgOpAKPizgMFuQQrGTeKjgQfOIwVSyWAP5Acp8PwC7A16MNKCQAsAcX2AABwULDT8iiKQBM4t6EhlNW1RTKJys9Gm5IVCMbGnms/FQQ7RjvaezbDtcc26fBnrBGY2L2bYSQLSCLnTudursFIFvCjt7ClWGMjowXcMZiHB4Y/OdSw6A39kDgjXthrIrFUs/3OGQ5sV3XniyJiPL1yALI9RLJnS2VZi7Ra8aWVF7u5fl9groq89S6ZJEahbhWMFKKjK72EdU+tK6SSNv4VgvPzwX122gr9/EHUym1IM88uoYAAAAASUVORK5CYII='
+ },
+ {
+ name: '我的收藏',
+ icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAAC1klEQVRYw+2XX0hTcRTHP3eOCgOtNCOI/lBYvQSNXtL8t0yRgnI3yjCil7AQkggignwoiN7ypYcopB5cFtypkYRmm38yX6Sgl6YQRQSRpqWUhOhOD9vcmnO781p3D/vCYez3O7/z+9zf+e3uHEgpJXOlLDQhqmoB7MBhIA/YDKQDI8A7wAM0KZr2OdYGoqobgGqgBNgJ5ABTwEdgAGgF3Iqm+XQDiqqqwA0gN84DzgLNwBVF0z5FxNgYiFEFpMWJMwxcUjStLSagz+FYDtwDTiaYiZ9AncXlagzEqQLuABkJxmkEzllcrul5gD6Hwwo8ASoSDBquW4APuGggRhtw1OJyzQBYg6MiUm8QDuCCwfXgv/P1AfOf4Gzlka2ANxzYZM0AO9JaWt9bAEQ4L4JVBJLErCLUETwxETlo9pFFUcUcIMgWs2miaNMcoIhYzKaJoulwwAkg02yiCE2FAJHRJAQcDwGKeIFtZhNFaAjAf/dE+s1+r0SxgTlAEWkXEZLM2iHsv/hXRflrYLfZeQ3ozcpnHbZQigGBBvF/JoM1BLlCgCIPRcSbBKn1ikhzkOuvenCy/EAZ0GFyesszOp53RgUEmCgrdQInTIJzZnZ2VYcPzC+vRGoAG7D9P8MNAWcjB6P2JD9K7bvwNzTp/wluCti7qsv9VhcgwPfSkkOABiz7x3DTgLq6y/M02qQSa+X4/uJq4AHxu7LFygecWvOiu2khByVehDF70Rn8HVpc3wQlQE2Wu+duLCddm47ZC48D94EVSwT3Gzid5e59FM9R96l8KynYAzwGjFbfH4Bj2Z6+QT3OuivpbE/foAg2EZwGihSnCDa9cAmdYLhGi/dVAreB9TqXfAFq13a/bEl0r0Vf/JGi/AzgGlDLwv30TOBB6nN6+icXs4/hX+ZIUX4ucBOojJhqAS7n9PQPG4m/ZK+Or4V5BcD1wNer63pf9S1V7JRSMlN/AO6lbgA7RvQLAAAAAElFTkSuQmCC',
+ children: []
+ }
+ ]
+ }
+ }
+ },
+ actions: {
+ // 加载用户表情包
+ loadUserEmoticon() {
+ ServeFindUserEmoticon().then((res) => {
+ if (res.code == 200) {
+ const { collect_emoticon } = res.data
+
+ // 用户收藏的系统表情包
+ this.emoticon.items[1].children = collect_emoticon || []
+ }
+ })
+ },
+
+ // 收藏用户表情包
+ saveUserEmoticon(resoure) {
+ ServeCollectEmoticon({
+ record_id: resoure.record_id
+ }).then((res) => {
+ if (res.code == 200) {
+ this.loadUserEmoticon()
+ } else {
+ message.warning(res.message)
+ }
+ })
+ },
+
+ // 自定义上传用户表情包
+ uploadUserEmoticon(file) {
+ const data = new FormData()
+ data.append('emoticon', file)
+
+ ServeUploadEmoticon(data).then((res) => {
+ if (res.code == 200) {
+ this.emoticon.items[1].children.unshift(res.data)
+ } else {
+ message.warning(res.message)
+ }
+ })
+ },
+
+ // 自定义上传用户表情包
+ removeUserEmoticon(resoure) {
+ ServeDeleteEmoticon({
+ ids: [resoure.id].join(',')
+ }).then((res) => {
+ if (res.code == 200) {
+ this.emoticon.items[1].children.splice(resoure.index, 1)
+ message.success('删除成功')
+ } else {
+ message.warning(res.message)
+ }
+ })
+ }
+ }
+})
diff --git a/src/store/modules/note.ts b/src/store/modules/note.ts
new file mode 100644
index 0000000..dacb8b8
--- /dev/null
+++ b/src/store/modules/note.ts
@@ -0,0 +1,287 @@
+import { defineStore } from 'pinia'
+import {
+ ServeGetArticleDetail,
+ ServeGetArticleClass,
+ ServeGetArticleTag,
+ ServeGetArticleList,
+ ServeEditArticleClass,
+ ServeEditArticleTag,
+ ServeDeleteArticleClass,
+ ServeDeleteArticleTag
+} from '@/api/article'
+
+interface Tag {
+ id: number
+ tag_name: string
+ count: number
+}
+
+interface Class {
+ id: number
+ class_name: string
+ count: number
+ is_default: number
+}
+
+export interface NoteItem {
+ id: number
+ title: string
+ abstract: string
+ class_id: number
+ class_name: string
+ image: string
+ is_asterisk: number
+ status: number
+ tags_id: string
+ created_at: string
+ updated_at: string
+}
+
+export interface NoteFileItem {
+ id: number
+ created_at: string
+ original_name: string
+ size: number
+ suffix: string
+}
+
+interface NoteStoreState {
+ tags: Tag[]
+ class: Class[]
+ notes: {
+ loadStatus: number
+ params: {
+ page: number
+ keyword: string
+ find_type: number
+ cid: number
+ }
+ items: NoteItem[]
+ }
+ view: {
+ editorMode: string
+ loadId: number
+ loadStatus: number
+ detail: {
+ id: number
+ class_id: number
+ class_name: string
+ title: string
+ is_asterisk: number
+ status: number
+ tags: {
+ id: number
+ }[]
+ files: NoteFileItem[]
+ md_content: string
+ created_at: string
+ updated_at: string
+ }
+ }
+}
+
+export const useNoteStore = defineStore('note', {
+ state: (): NoteStoreState => {
+ return {
+ tags: [],
+ class: [],
+
+ notes: {
+ loadStatus: 0,
+ params: { page: 1, keyword: '', find_type: 1, cid: 0 },
+ items: []
+ },
+
+ view: {
+ editorMode: 'preview',
+ loadId: 0,
+ loadStatus: 0,
+ detail: {
+ id: 0,
+ class_id: 0,
+ title: '',
+ is_asterisk: 0,
+ status: 1,
+ tags: [],
+ files: [],
+ md_content: '',
+ created_at: '',
+ class_name: ''
+ }
+ }
+ }
+ },
+
+ actions: {
+ close() {
+ this.view.loadId = 0
+ },
+
+ addNewNote(class_id = 0) {
+ this.view.detail = {
+ class_id: class_id,
+ class_name: '',
+ created_at: '',
+ files: [],
+ id: 0,
+ is_asterisk: 0,
+ md_content: '',
+ status: 1,
+ tags: [],
+ title: '请编辑标题!!!'
+ }
+
+ this.view.loadId = 1
+ this.view.loadStatus = 1
+
+ this.setEditorMode('edit')
+
+ this.loadClass()
+ },
+
+ loadClass() {
+ ServeGetArticleClass().then(({ code, data }) => {
+ if (code != 200) return false
+
+ this.class = data.items
+ })
+ },
+
+ loadTags() {
+ ServeGetArticleTag().then(({ code, data }) => {
+ if (code != 200) return false
+
+ this.tags = data.tags
+ })
+ },
+
+ loadNoteList(params = {}, isReset = true) {
+ if (isReset) {
+ Object.assign(this.notes.params, { page: 1, keyword: '', find_type: 1, cid: 0 }, params)
+ } else {
+ Object.assign(this.notes.params, params)
+ }
+
+ this.notes.loadStatus = 0
+ this.notes.items = []
+ ServeGetArticleList(this.notes.params).then((res) => {
+ this.notes.items = res.data.items
+
+ this.notes.loadStatus = 1
+ })
+ },
+
+ updateNoteItem(id: number, params = {}) {
+ const item = this.notes.items.find((item) => item.id == id)
+
+ item && Object.assign(item, params)
+ },
+
+ // 加载详情信息
+ loadDetail(id: number) {
+ this.view.loadId = id
+ this.view.loadStatus = 0
+
+ this.setEditorMode('preview')
+
+ ServeGetArticleDetail({
+ article_id: id
+ }).then(({ code, data }) => {
+ if (code != 200 && data.id != this.view.loadId) {
+ return
+ }
+
+ this.view.loadStatus = 1
+
+ data.class_name = ''
+
+ this.view.detail = data
+
+ const node = this.class.find((item) => {
+ return item.id == data.class_id
+ })
+
+ if (node) {
+ this.view.detail.class_name = node.class_name || ''
+ }
+ })
+ },
+
+ // 修改编辑模式
+ setEditorMode(value: string) {
+ this.view.editorMode = value
+ },
+
+ // 修改收藏状态
+ setCollectionStatus(isTrue: boolean) {
+ this.view.detail.is_asterisk = isTrue ? 1 : 0
+ },
+
+ // 编辑分类
+ async editClass(class_id: number, class_name: string) {
+ const res = await ServeEditArticleClass({ class_id, class_name })
+
+ if (res && res.code === 200) {
+ if (class_id === 0) {
+ this.class.unshift({
+ id: res.data.id,
+ class_name,
+ count: 0,
+ is_default: 0
+ })
+ } else {
+ const item = this.class.find((item) => item.id === class_id)
+
+ item && Object.assign(item, { class_name })
+ }
+ }
+ },
+
+ async deleteClass(class_id: number) {
+ const res = await ServeDeleteArticleClass({ class_id })
+
+ if (res && res.code == 200) {
+ const index = this.class.findIndex((item) => item.id === class_id)
+
+ if (index >= 0) {
+ this.class.splice(index, 1)
+ }
+ } else {
+ window['$message'].info(res.message)
+ }
+ },
+
+ // 编辑标签
+ async editTag(tag_id: number, tag_name: string) {
+ const res = await ServeEditArticleTag({ tag_id, tag_name })
+
+ if (res && res.code === 200) {
+ if (tag_id === 0) {
+ this.tags.unshift({
+ id: res.data.id,
+ tag_name,
+ count: 0
+ })
+ } else {
+ const item = this.tags.find((item) => item.id === tag_id)
+
+ item && Object.assign(item, { tag_name })
+ }
+ }
+ },
+
+ async deleteTag(tag_id: number) {
+ const res = await ServeDeleteArticleTag({ tag_id })
+
+ if (res && res.code == 200) {
+ const index = this.tags.findIndex((item) => item.id === tag_id)
+
+ if (index >= 0) {
+ this.tags.splice(index, 1)
+ }
+ } else {
+ window['$message'].info(res.message)
+ }
+ }
+ }
+})
diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts
new file mode 100644
index 0000000..48eef34
--- /dev/null
+++ b/src/store/modules/settings.ts
@@ -0,0 +1,37 @@
+import { defineStore } from 'pinia'
+import { storage } from '@/utils/storage'
+
+export const useSettingsStore = defineStore('settings', {
+ state: () => {
+ return {
+ isPromptTone: storage.get('isPromptTone', false), // 新消息提示音
+ isKeyboard: storage.get('isKeyboard', false), // 是否推送键盘输入事件
+ isLeaveWeb: false, // 是否离开网页
+ isNotify: storage.get('isNotify', true), // 是否同意浏览器通知
+ isFullScreen: storage.get('isFullScreen', true), // 是否客户端全屏
+ darkTheme: storage.get('darkTheme', false)
+ }
+ },
+ actions: {
+ setPromptTone(value: boolean) {
+ this.isPromptTone = value
+ storage.set('isPromptTone', value, null)
+ },
+ setKeyboard(value: boolean) {
+ this.isKeyboard = value
+ storage.set('isKeyboard', value, null)
+ },
+ setFullScreen(value: boolean) {
+ this.isFullScreen = value
+ storage.set('isFullScreen', value, null)
+ },
+ setDarkTheme(value: boolean) {
+ this.darkTheme = value
+ storage.set('darkTheme', value, null)
+ },
+ setNotify(value: boolean) {
+ this.isNotify = value
+ storage.set('isNotify', value, null)
+ }
+ }
+})
diff --git a/src/store/modules/talk.ts b/src/store/modules/talk.ts
new file mode 100644
index 0000000..bdd7dfb
--- /dev/null
+++ b/src/store/modules/talk.ts
@@ -0,0 +1,156 @@
+import { defineStore } from 'pinia'
+import { ServeGetTalkList, ServeCreateTalkList } from '@/api/chat'
+import { formatTalkItem, ttime, KEY_INDEX_NAME } from '@/utils/talk'
+import { useEditorDraftStore } from './editor-draft'
+import { ISession } from '@/types/chat'
+
+interface TalkStoreState {
+ loadStatus: number
+ items: ISession[]
+}
+
+export const useTalkStore = defineStore('talk', {
+ state: (): TalkStoreState => {
+ return {
+ // 加载状态[1:未加载;2:加载中;3:加载完成;4:加载失败;]
+ loadStatus: 2,
+
+ // 会话列表
+ items: []
+ }
+ },
+ getters: {
+ // 过滤所有置顶对话列表
+ topItems: (state) => {
+ return state.items.filter((item: ISession) => item.is_top == 1)
+ },
+
+ // 对话列表
+ talkItems: (state) => {
+ return state.items.sort((a, b) => {
+ return ttime(b.updated_at) - ttime(a.updated_at)
+ })
+ },
+
+ // 消息未读数总计
+ talkUnreadNum: (state) => {
+ return state.items.reduce((total: number, item: ISession) => {
+ return total + item.unread_num
+ }, 0)
+ }
+ },
+ actions: {
+ findItem(index_name: string) {
+ return this.items.find((item: ISession) => item.index_name === index_name) as ISession
+ },
+
+ // 更新对话节点
+ updateItem(params: any) {
+ const item = this.items.find((item) => item.index_name === params.index_name)
+
+ item && Object.assign(item, params)
+ },
+
+ // 新增对话节点
+ addItem(params: any) {
+ this.items = [params, ...this.items]
+ },
+
+ // 移除对话节点
+ delItem(index_name: string) {
+ const i = this.items.findIndex((item) => item.index_name === index_name)
+
+ if (i >= 0) {
+ this.items.splice(i, 1)
+ }
+
+ this.items = [...this.items]
+ },
+
+ // 更新对话消息
+ updateMessage(params: any) {
+ const item = this.items.find((item) => item.index_name === params.index_name)
+
+ if (item) {
+ item.unread_num++
+ item.msg_text = params.msg_text
+ item.updated_at = params.updated_at
+ }
+ },
+
+ // 更新联系人备注
+ setRemark(params: any) {
+ const item = this.items.find((item) => item.index_name === `1_${params.user_id}`)
+
+ item && (item.remark = params.remark)
+ },
+
+ // 加载会话列表
+ loadTalkList() {
+ this.loadStatus = 2
+
+ const resp = ServeGetTalkList()
+
+ resp.then(({ code, data }) => {
+ if (code == 200) {
+ this.items = data.items.map((item: any) => {
+ const value = formatTalkItem(item)
+
+ const draft = useEditorDraftStore().items[value.index_name]
+ if (draft) {
+ value.draft_text = JSON.parse(draft).text || ''
+ }
+
+ if (value.is_robot == 1) {
+ value.is_online = 1
+ }
+
+ return value
+ })
+
+ this.loadStatus = 3
+ } else {
+ this.loadStatus = 4
+ }
+ })
+
+ resp.catch(() => {
+ this.loadStatus = 4
+ })
+ },
+
+ findTalkIndex(index_name: string) {
+ return this.items.findIndex((item: ISession) => item.index_name === index_name)
+ },
+
+ toTalk(talk_type: number, receiver_id: number, router: any) {
+ const route = {
+ path: '/message',
+ query: {
+ v: new Date().getTime()
+ }
+ }
+
+ if (this.findTalkIndex(`${talk_type}_${receiver_id}`) >= 0) {
+ sessionStorage.setItem(KEY_INDEX_NAME, `${talk_type}_${receiver_id}`)
+ return router.push(route)
+ }
+
+ ServeCreateTalkList({
+ talk_type,
+ receiver_id
+ }).then(({ code, data, message }) => {
+ if (code == 200) {
+ if (this.findTalkIndex(`${talk_type}_${receiver_id}`) === -1) {
+ this.addItem(formatTalkItem(data))
+ }
+
+ sessionStorage.setItem(KEY_INDEX_NAME, `${talk_type}_${receiver_id}`)
+ return router.push(route)
+ } else {
+ window['$message'].info(message)
+ }
+ })
+ }
+ }
+})
diff --git a/src/store/modules/uploads.ts b/src/store/modules/uploads.ts
new file mode 100644
index 0000000..0451d7b
--- /dev/null
+++ b/src/store/modules/uploads.ts
@@ -0,0 +1,125 @@
+import { defineStore } from 'pinia'
+import { ServeFindFileSplitInfo, ServeFileSubareaUpload } from '@/api/upload'
+import { ServeSendTalkFile } from '@/api/chat'
+
+// @ts-ignore
+const message = window.$message
+
+// 处理拆分上传文件
+function fileSlice(file: File, uploadId: string, eachSize: number) {
+ const splitNum = Math.ceil(file.size / eachSize) // 分片总数
+ const items: FormData[] = []
+
+ // 处理每个分片的上传操作
+ for (let i = 0; i < splitNum; i++) {
+ const start = i * eachSize
+ const end = Math.min(file.size, start + eachSize)
+
+ const form = new FormData()
+ form.append('file', file.slice(start, end))
+ form.append('upload_id', uploadId)
+ form.append('split_index', `${i + 1}`)
+ form.append('split_num', `${splitNum}`)
+
+ items.push(form)
+ }
+
+ return items
+}
+
+export const useUploadsStore = defineStore('uploads', {
+ state: () => {
+ return {
+ isShow: false,
+ items: []
+ }
+ },
+ getters: {
+ successCount: (state) => {
+ return state.items.filter((item: any) => {
+ return item.status === 2
+ }).length
+ }
+ },
+ actions: {
+ close() {
+ this.isShow = false
+ },
+
+ // 初始化上传
+ initUploadFile(file: File, talkType: number, receiverId: number, username: string) {
+ ServeFindFileSplitInfo({
+ file_name: file.name,
+ file_size: file.size
+ }).then((res) => {
+ if (res.code == 200) {
+ const { upload_id, split_size } = res.data
+
+ // @ts-ignore
+ this.items.unshift({
+ file: file,
+ talk_type: talkType,
+ receiver_id: receiverId,
+ upload_id: upload_id,
+ uploadIndex: 0,
+ percentage: 0,
+ status: 0, // 文件上传状态 0:等待上传 1:上传中 2:上传完成 3:网络异常
+ files: fileSlice(file, upload_id, split_size),
+ avatar: '',
+ username: username
+ })
+
+ this.triggerUpload(upload_id)
+ this.isShow = true
+ } else {
+ message.error(res.message)
+ }
+ })
+ },
+
+ // 获取分片文件数组索引
+ findItem(uploadId: string): any {
+ return this.items.find((item: any) => item.upload_id === uploadId)
+ },
+
+ // 触发上传
+ triggerUpload(uploadId: string) {
+ const item = this.findItem(uploadId)
+
+ const form = item.files[item.uploadIndex]
+
+ item.status = 1
+
+ ServeFileSubareaUpload(form)
+ .then((res) => {
+ if (res.code == 200) {
+ item.uploadIndex++
+
+ if (item.uploadIndex === item.files.length) {
+ item.status = 2
+ item.percentage = 100
+ this.sendUploadMessage(item)
+ } else {
+ const percentage = (item.uploadIndex / item.files.length) * 100
+ item.percentage = percentage.toFixed(1)
+ this.triggerUpload(uploadId)
+ }
+ } else {
+ item.status = 3
+ }
+ })
+ .catch(() => {
+ item.status = 3
+ })
+ },
+
+ // 发送上传消息
+ sendUploadMessage(item: any) {
+ ServeSendTalkFile({
+ upload_id: item.upload_id,
+ receiver_id: item.receiver_id,
+ talk_type: item.talk_type
+ })
+ }
+ }
+})
diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts
new file mode 100644
index 0000000..2dbc5cf
--- /dev/null
+++ b/src/store/modules/user.ts
@@ -0,0 +1,85 @@
+import { defineStore } from 'pinia'
+import { ServeGetUserSetting } from '@/api/user'
+import { ServeFindFriendApplyNum } from '@/api/contact'
+import { ServeGroupApplyUnread } from '@/api/group'
+import { delAccessToken } from '@/utils/auth'
+import { storage } from '@/utils/storage'
+
+interface UserStoreState {
+ uid: number
+ nickname: string
+ mobile: string
+ email: string
+ gender: number
+ motto: string
+ avatar: string
+ banner: string
+ online: boolean
+ isQiye: boolean
+ isContactApply: boolean
+ isGroupApply: boolean
+}
+
+export const useUserStore = defineStore('user', {
+ persist: true,
+ state: (): UserStoreState => {
+ return {
+ uid: 0, // 用户ID
+ mobile: '',
+ email: '',
+ nickname: '', // 用户昵称
+ gender: 0, // 性别
+ motto: '', // 个性签名
+ avatar: '',
+ banner: '', // 名片背景
+ online: false, // 在线状态
+ isQiye: false,
+ isContactApply: false,
+ isGroupApply: false
+ }
+ },
+ getters: {},
+ actions: {
+ // 设置用户登录状态
+ updateSocketStatus(status) {
+ this.online = status
+ },
+
+ logoutLogin() {
+ this.$reset()
+ storage.remove('user_info')
+ delAccessToken()
+ location.reload()
+ },
+
+ loadSetting() {
+ ServeGetUserSetting().then(({ code, data }) => {
+ if (code == 200) {
+ this.nickname = data.user_info.nickname
+ this.uid = data.user_info.uid
+ this.avatar = data.user_info.avatar
+
+ this.gender = data.user_info.gender
+ this.mobile = data.user_info.mobile || ''
+ this.email = data.user_info.email || ''
+ this.motto = data.user_info.motto
+ this.isQiye = data.user_info.is_qiye || false
+
+ storage.set('user_info', data)
+ }
+ })
+
+ ServeFindFriendApplyNum().then(({ code, data }) => {
+ if (code == 200) {
+ this.isContactApply = data.unread_num > 0
+ }
+ })
+
+ ServeGroupApplyUnread().then(({ code, data }) => {
+ if (code == 200) {
+ this.isGroupApply = data.unread_num > 0
+ }
+ })
+ }
+ }
+})
diff --git a/src/types/chat.ts b/src/types/chat.ts
new file mode 100644
index 0000000..ba84e30
--- /dev/null
+++ b/src/types/chat.ts
@@ -0,0 +1,125 @@
+// 会话最后一条消息
+export interface ISessionLastMessage {
+ msg_id: string // 消息ID
+ sequence: number // 消息时序ID(消息排序)
+ msg_type: number // 消息类型
+ user_id: number // 发送者ID
+ receiver_id: number // 接受者ID
+ content: string // 消息内容
+ mention: number[] // 提及列表
+}
+
+// 会话列表
+export interface ISession {
+ id: number // 会话id
+ index_name: string // 索引名称
+ talk_type: number // 聊天类型
+ receiver_id: number // 接收者id
+ name: string // 昵称
+ avatar: string // 头像
+ remark: string // 备注
+ is_disturb: number // 是否免打扰
+ is_online: number // 是否在线
+ is_robot: number // 是否机器人
+ is_top: number // 置顶
+ unread_num: number // 未读消息数
+ updated_at: string // 最后发送时间
+ content?: string // 消息内容
+ last_message?: ISessionLastMessage
+ draft_text?: string // 草稿文本
+}
+
+// 消息记录
+export interface ITalkRecord {
+ msg_id: string
+ sequence: number
+ talk_type: number
+ msg_type: number
+ user_id: number
+ receiver_id: number
+ nickname: string
+ avatar: string
+ is_revoke: number
+ is_mark: number
+ is_read: number
+ content: string
+ created_at: string
+ extra: any
+ isCheck: boolean
+ send_status: number
+ float: string
+}
+
+export interface ITalkRecordExtraText {
+ content: string
+ mentions?: number[]
+}
+
+export interface ITalkRecordExtraCode {
+ lang: string
+ code: string
+}
+
+export interface ITalkRecordExtraFile {
+ drive: number
+ name: string
+ path: string
+ size: number
+}
+
+export interface ITalkRecordExtraForward {
+ msg_ids: number[]
+ receiver_id: number
+ records: {
+ nickname: string
+ text: string
+ }[]
+ talk_type: number
+ user_id: number
+}
+
+export interface ITalkRecordExtraGroupNotice {
+ owner_id: number
+ owner_name: string
+ title: number
+ content: string
+}
+
+export interface ITalkRecordExtraVideo {
+ cover: string
+ url: string
+ duration: number
+ size: number
+}
+
+export interface ITalkRecordExtraMixed {
+ items: {
+ type: number
+ content: string
+ link: string
+ }[]
+}
+
+export interface ITalkRecordExtraAudio {
+ name: string
+ size: number
+ url: string
+ duration: number
+}
+
+export interface ITalkRecordExtraLogin {
+ ip: string
+ address: string
+ agent: string
+ platform: string
+ reason: string
+ datetime: string
+}
+
+export interface ITalkRecordExtraImage {
+ name: string
+ size: number
+ url: string
+ width: number
+ height: number
+}
diff --git a/src/types/global.ts b/src/types/global.ts
new file mode 100644
index 0000000..b217af5
--- /dev/null
+++ b/src/types/global.ts
@@ -0,0 +1,7 @@
+export interface StateDropdown {
+ options: any[]
+ show: boolean
+ dropdownX: number
+ dropdownY: number
+ item: any
+}
diff --git a/src/utils/auth.js b/src/utils/auth.js
new file mode 100644
index 0000000..0471821
--- /dev/null
+++ b/src/utils/auth.js
@@ -0,0 +1,38 @@
+import { storage } from './storage'
+
+const AccessToken = 'AUTH_TOKEN'
+
+/**
+ * 验证是否登录
+ *
+ * @returns token
+ */
+export function isLoggedIn() {
+ return getAccessToken() != ''
+}
+
+/**
+ * 获取登录授权 Token
+ *
+ * @returns token
+ */
+export function getAccessToken() {
+ // return storage.get(AccessToken) || ''
+ return '56709c6b4f221bf3ec01aa7891ba8b96acf881debefc9ebc0ed578471c55d6acd1b6f8034006018bd5d69b56e5afb5d38cab68e5387cef9cbacd59812deb3757c77604baf451445cab1e183fa3b442a15d18f590373771dcf2090e2c7fea7a47836139fd375901c5a45fe530e1bbc7fd08a441d60f0f934c75c338d11ca4c667d9d685b011b1254294d7166a2490aad45839042c93c525a93042728f0ce779dc1ce813277d00c98ab60eddadc5338ee4782d09064c126ecc4baa60a2d9f74503caba64d6f86a70bee6e5a51f3e33f704515d47a64dc5109df88372298119aceceeac599309f5e4eb17ede5fb35c2d5291acf4c1325363a04ddd3971c9671349650e7f042ee9a7a478d8a0867f444a1a338e8cee0acca96b3cd53474d9f6348ca3b9d8f5f10bb59277a9d2081d8f82dc5efa5618042d5df53932d4689a8b90fc4'
+}
+
+/**
+ * 设置登录授权 Token
+ *
+ * @returns token
+ */
+export function setAccessToken(token = '', expire = 60 * 60 * 2) {
+ return storage.set(AccessToken, token, expire) || ''
+}
+
+/**
+ * 删除登录授权 Token
+ */
+export function delAccessToken() {
+ storage.remove(AccessToken)
+}
diff --git a/src/utils/common.js b/src/utils/common.js
new file mode 100644
index 0000000..512ac2d
--- /dev/null
+++ b/src/utils/common.js
@@ -0,0 +1,198 @@
+import { createApp } from 'vue'
+
+/**
+ * 防抖函数
+ *
+ * @param {*} fn 回调方法
+ * @param {*} delay 延迟时间
+ * @returns
+ */
+export function debounce(fn, delay) {
+ let timer = null
+
+ return function () {
+ timer && clearTimeout(timer)
+
+ let content = this
+ let args = arguments
+ timer = setTimeout(() => {
+ fn.apply(content, args)
+ }, delay)
+ }
+}
+
+/**
+ * 节流函数
+ *
+ * @param {*} fn 回调方法
+ * @param {*} delay 延迟时间
+ * @returns
+ */
+export function throttle(fn, delay, call = function () {}) {
+ let lastTime = 0
+
+ return function () {
+ // 获取当前时间戳
+ let now = new Date().getTime()
+
+ // 如果当前时间减去上次时间大于限制时间时才执行
+ if (now - lastTime > delay) {
+ lastTime = now
+ fn.apply(this, arguments)
+ } else {
+ call()
+ }
+ }
+}
+
+/**
+ * 剪贴板复制功能
+ *
+ * @param {String} text 复制内容
+ * @param {Function} callback 复制成功回调方法
+ */
+export function clipboard(text, callback) {
+ navigator.clipboard
+ .writeText(text)
+ .then(() => {
+ callback && callback()
+ })
+ .catch(() => {
+ alert('Oops, unable to copy')
+ })
+}
+
+export async function clipboardImage(src, callback) {
+ const { state } = await navigator.permissions.query({
+ name: 'clipboard-write'
+ })
+
+ if (state != 'granted') return
+
+ try {
+ const data = await fetch(src)
+ const blob = await data.blob()
+
+ // navigator.clipboard.write 仅支持 png 图片
+ if (blob.type == 'image/png') {
+ await navigator.clipboard.write([
+ new ClipboardItem({
+ [blob.type]: blob
+ })
+ ])
+
+ return callback()
+ }
+
+ const objectURL = URL.createObjectURL(blob)
+
+ const img = new Image()
+ img.src = URL.createObjectURL(blob)
+ img.onload = () => {
+ const canvas = document.createElement('canvas')
+ const ctx = canvas.getContext('2d')
+
+ canvas.width = img.width
+ canvas.height = img.height
+ ctx.drawImage(img, 0, 0)
+
+ canvas.toBlob(
+ (blob) => {
+ const data = [new ClipboardItem({ [blob.type]: blob })]
+
+ navigator.clipboard
+ .write(data)
+ .then(() => {
+ callback()
+ })
+ .catch((err) => {
+ console.error(err)
+ })
+
+ URL.revokeObjectURL(objectURL)
+ },
+ 'image/png',
+ 1
+ )
+ }
+ } catch (err) {
+ console.error(err.name, err.message)
+ }
+}
+
+export function hashStrToHexColor(str) {
+ let hash = 0
+ for (let i = 0; i < str.length; i++) {
+ hash = str.charCodeAt(i) + ((hash << 5) - hash)
+ }
+ let color = '#'
+ for (let i = 0; i < 3; i++) {
+ const value = (hash >> (i * 8)) & 0xff
+ color += value.toString(16).padStart(2, '0')
+ }
+ return color
+}
+
+export function emitCall(event, data, fn) {
+ return { event: event, data: data, callBack: fn || function () {} }
+}
+
+// 判断是否是客户端模式
+export function isElectronMode() {
+ return electron() != undefined
+}
+
+export function electron() {
+ return window.electron
+}
+
+export function htmlDecode(input) {
+ return input
+ .replace(/&/g, '&')
+ .replace(/'/g, "'")
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/"/g, '"')
+}
+
+// 文件转 图片 关键函数 异步
+export function getVideoImage(file, time = 1) {
+ return new Promise((resolve) => {
+ let video = document.createElement('video')
+
+ const objectURL = URL.createObjectURL(file)
+
+ video.src = objectURL
+ video.currentTime = time
+ video.autoplay = true
+ video.muted = true
+
+ video.oncanplay = () => {
+ let canvas = document.createElement('canvas')
+ canvas.width = video.videoWidth
+ canvas.height = video.videoHeight
+
+ let ctx = canvas.getContext('2d')
+ ctx?.drawImage(video, 0, 0, canvas.width, canvas.height)
+
+ let data = {
+ url: canvas.toDataURL('image/jpeg', 1),
+ width: video.videoWidth,
+ height: video.videoHeight,
+ duration: video.duration,
+ file: null
+ }
+
+ canvas.toBlob((blob) => {
+ data.file = new File([blob], 'image.jpeg', {
+ type: blob.type,
+ lastModified: Date.now()
+ })
+
+ URL.revokeObjectURL(objectURL)
+
+ resolve(data)
+ }, 'image/jpeg')
+ }
+ })
+}
diff --git a/src/utils/datetime.js b/src/utils/datetime.js
new file mode 100644
index 0000000..e88bfd7
--- /dev/null
+++ b/src/utils/datetime.js
@@ -0,0 +1,158 @@
+/**
+ * 人性化时间显示
+ *
+ * @param {Object} datetime
+ */
+export function formatTime(datetime) {
+ if (datetime == null) return ''
+
+ datetime = datetime.replace(/-/g, '/')
+
+ let time = new Date()
+ let outTime = new Date(datetime)
+ if (/^[1-9]\d*$/.test(datetime)) {
+ outTime = new Date(parseInt(datetime) * 1000)
+ }
+
+ if (time.getTime() < outTime.getTime() || time.getFullYear() != outTime.getFullYear()) {
+ return parseTime(outTime, '{y}/{m}/{d} {h}:{i}')
+ }
+
+ if (time.getMonth() != outTime.getMonth()) {
+ return parseTime(outTime, '{m}/{d} {h}:{i}')
+ }
+
+ if (time.getDate() != outTime.getDate()) {
+ let day = outTime.getDate() - time.getDate()
+ if (day == -1) {
+ return parseTime(outTime, '昨天 {h}:{i}')
+ }
+
+ if (day == -2) {
+ return parseTime(outTime, '前天 {h}:{i}')
+ }
+
+ return parseTime(outTime, '{m}-{d} {h}:{i}')
+ }
+
+ let diff = time.getTime() - outTime.getTime()
+
+ if (time.getHours() != outTime.getHours() || diff > 30 * 60 * 1000) {
+ return parseTime(outTime, '{h}:{i}')
+ }
+
+ let minutes = outTime.getMinutes() - time.getMinutes()
+ if (minutes == 0) {
+ return '刚刚'
+ }
+
+ minutes = Math.abs(minutes)
+ return `${minutes}分钟前`
+}
+
+/**
+ * 时间格式化方法
+ *
+ * @param {(Object|string|number)} time
+ * @param {String} cFormat
+ * @returns {String | null}
+ */
+export function parseTime(time, cFormat) {
+ if (arguments.length === 0) {
+ return null
+ }
+
+ let date
+ const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
+ time = parseInt(time)
+ }
+ if (typeof time === 'number' && time.toString().length === 10) {
+ time = time * 1000
+ }
+
+ date = new Date(time.replace(/-/g, '/'))
+ }
+
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+
+ const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
+ const value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') {
+ return ['日', '一', '二', '三', '四', '五', '六'][value]
+ }
+
+ return value.toString().padStart(2, '0')
+ })
+
+ return time_str
+}
+
+/**
+ * 人性化显示时间
+ *
+ * @param {Object} datetime
+ */
+export function beautifyTime(datetime = '') {
+ if (datetime == null) {
+ return ''
+ }
+
+ datetime = datetime.replace(/-/g, '/')
+
+ let time = new Date()
+ let outTime = new Date(datetime)
+ if (/^[1-9]\d*$/.test(datetime)) {
+ outTime = new Date(parseInt(datetime) * 1000)
+ }
+
+ if (time.getTime() < outTime.getTime()) {
+ return parseTime(outTime, '{y}/{m}/{d}')
+ }
+
+ if (time.getFullYear() != outTime.getFullYear()) {
+ return parseTime(outTime, '{y}/{m}/{d}')
+ }
+
+ if (time.getMonth() != outTime.getMonth()) {
+ return parseTime(outTime, '{m}/{d}')
+ }
+
+ if (time.getDate() != outTime.getDate()) {
+ let day = outTime.getDate() - time.getDate()
+ if (day == -1) {
+ return parseTime(outTime, '昨天 {h}:{i}')
+ }
+
+ if (day == -2) {
+ return parseTime(outTime, '前天 {h}:{i}')
+ }
+
+ return parseTime(outTime, '{m}-{d}')
+ }
+
+ if (time.getHours() != outTime.getHours()) {
+ return parseTime(outTime, '{h}:{i}')
+ }
+
+ let minutes = outTime.getMinutes() - time.getMinutes()
+ if (minutes == 0) {
+ return '刚刚'
+ }
+
+ minutes = Math.abs(minutes)
+ return `${minutes}分钟前`
+}
diff --git a/src/utils/dom.ts b/src/utils/dom.ts
new file mode 100644
index 0000000..d16e443
--- /dev/null
+++ b/src/utils/dom.ts
@@ -0,0 +1,56 @@
+function trim(string: string) {
+ return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '')
+}
+
+/* istanbul ignore next */
+export function hasClass(el: Element, cls: string) {
+ if (!el || !cls) return false
+ if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.')
+ if (el.classList) {
+ return el.classList.contains(cls)
+ } else {
+ return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1
+ }
+}
+
+/* istanbul ignore next */
+export function addClass(el: Element, cls: string) {
+ if (!el) return
+ let curClass = el.className
+ const classes = (cls || '').split(' ')
+
+ for (let i = 0, j = classes.length; i < j; i++) {
+ const clsName = classes[i]
+ if (!clsName) continue
+
+ if (el.classList) {
+ el.classList.add(clsName)
+ } else if (!hasClass(el, clsName)) {
+ curClass += ' ' + clsName
+ }
+ }
+ if (!el.classList) {
+ el.className = curClass
+ }
+}
+
+/* istanbul ignore next */
+export function removeClass(el: Element, cls: string) {
+ if (!el || !cls) return
+ const classes = cls.split(' ')
+ let curClass = ' ' + el.className + ' '
+
+ for (let i = 0, j = classes.length; i < j; i++) {
+ const clsName = classes[i]
+ if (!clsName) continue
+
+ if (el.classList) {
+ el.classList.remove(clsName)
+ } else if (hasClass(el, clsName)) {
+ curClass = curClass.replace(' ' + clsName + ' ', ' ')
+ }
+ }
+ if (!el.classList) {
+ el.className = trim(curClass)
+ }
+}
diff --git a/src/utils/emojis.js b/src/utils/emojis.js
new file mode 100644
index 0000000..faa77a4
--- /dev/null
+++ b/src/utils/emojis.js
@@ -0,0 +1,241 @@
+/**
+ * 动态表情
+ */
+export const emojis = {
+ '[微笑]':
+ "
",
+ '[撇嘴]':
+ "
",
+ '[色]':
+ "
",
+ '[发呆]':
+ "
",
+ '[得意]':
+ "
",
+ '[流泪]':
+ "
",
+ '[害羞]':
+ "
",
+ '[闭嘴]':
+ "
",
+ '[睡]':
+ "
",
+ '[大哭]':
+ "
",
+ '[尴尬]':
+ "
",
+ '[发怒]':
+ "
",
+ '[调皮]':
+ "
",
+ '[呲牙]':
+ "
",
+ '[惊讶]':
+ "
",
+ '[难过]':
+ "
",
+ '[囧]':
+ "
",
+ '[抓狂]':
+ "
",
+ '[吐]':
+ "
",
+ '[偷笑]':
+ "
",
+ '[可爱]':
+ "
",
+ '[白眼]':
+ "
",
+ '[傲慢]':
+ "
",
+ '[困]':
+ "
",
+ '[惊恐]':
+ "
",
+ '[憨笑]':
+ "
",
+ '[大兵]':
+ "
",
+ '[咒骂]':
+ "
",
+ '[疑问]':
+ "
",
+ '[嘘]':
+ "
",
+ '[晕]':
+ "
",
+ '[衰]':
+ "
",
+ '[骷髅]':
+ "
",
+ '[敲打]':
+ "
",
+ '[再见]':
+ "
",
+ '[擦汗]':
+ "
",
+ '[抠鼻]':
+ "
",
+ '[鼓掌]':
+ "
",
+ '[坏笑]':
+ "
",
+ '[右哼哼]':
+ "
",
+ '[鄙视]':
+ "
",
+ '[委屈]':
+ "
",
+ '[快哭了]':
+ "
",
+ '[阴险]':
+ "
",
+ '[亲亲]':
+ "
",
+ '[可怜]':
+ "
",
+ '[笑脸]':
+ "
",
+ '[生病]':
+ "
",
+ '[脸红]':
+ "
",
+ '[破涕为笑]':
+ "
",
+ '[恐惧]':
+ "
",
+ '[失望]':
+ "
",
+ '[无语]':
+ "
",
+ '[嘿哈]':
+ "
",
+ '[捂脸]':
+ "
",
+ '[奸笑]':
+ "
",
+ '[机智]':
+ "
",
+ '[皱眉]':
+ "
",
+ '[耶]':
+ "
",
+ '[吃瓜]':
+ "
",
+ '[加油]':
+ "
",
+ '[汗]':
+ "
",
+ '[天啊]':
+ "
",
+ '[Emm]':
+ "
",
+ '[社会社会]':
+ "
",
+ '[旺柴]':
+ "
",
+ '[好的]':
+ "
",
+ '[打脸]':
+ "
",
+ '[哇]':
+ "
",
+ '[翻白眼]':
+ "
",
+ '[666]':
+ "
",
+ '[让我看看]':
+ "
",
+ '[叹气]':
+ "
",
+ '[苦涩]':
+ "
",
+ '[裂开]':
+ "
",
+ '[嘴唇]':
+ "
",
+ '[爱心]':
+ "
",
+ '[心碎]':
+ "
",
+ '[拥抱]':
+ "
",
+ '[强]':
+ "
",
+ '[弱]':
+ "
",
+ '[握手]':
+ "
",
+ '[胜利]':
+ "
",
+ '[抱拳]':
+ "
",
+ '[勾引]':
+ "
",
+ '[拳头]':
+ "
",
+ '[OK]':
+ "
",
+ '[合十]':
+ "
",
+ '[啤酒]':
+ "
",
+ '[咖啡]':
+ "
",
+ '[蛋糕]':
+ "
",
+ '[玫瑰]':
+ "
",
+ '[凋谢]':
+ "
",
+ '[菜刀]':
+ "
",
+ '[炸弹]':
+ "
",
+ '[便便]':
+ "
",
+ '[月亮]':
+ "
",
+ '[太阳]':
+ "
",
+ '[庆祝]':
+ "
",
+ '[礼物]':
+ "
",
+ '[红包]':
+ "
",
+ '[發]':
+ "
",
+ '[福]':
+ "
",
+ '[烟花]':
+ "
",
+ '[爆竹]':
+ "
",
+ '[猪头]':
+ "
",
+ '[跳跳]':
+ "
",
+ '[发抖]':
+ "
",
+ '[转圈]':
+ "
",
+}
+
+const emojisKeys = Object.keys(emojis)
+
+const regEmoji = emojisKeys
+ .map((value) => '|\\' + value)
+ .join('')
+ .replace('|', '')
+
+/**
+ * 替换表情文字
+ *
+ * @param {String} content 需要替换的字符串
+ */
+export function textReplaceEmoji(content) {
+ return content.replace(new RegExp(`(${regEmoji})`, 'gi'), ($0, $1) => {
+ return emojis[$1]
+ })
+}
diff --git a/src/utils/event-bus.ts b/src/utils/event-bus.ts
new file mode 100644
index 0000000..e77941d
--- /dev/null
+++ b/src/utils/event-bus.ts
@@ -0,0 +1,44 @@
+class EventBus {
+ private channels = {}
+
+ // 定义订阅方法
+ subscribe(channel: string, callback: Function) {
+ // 如果频道不存在,则创建一个新的频道
+ if (!this.channels[channel]) {
+ this.channels[channel] = []
+ }
+
+ // 将回调函数添加到频道的订阅者列表中
+ this.channels[channel].push(callback)
+ }
+
+ // 定义发布方法
+ emit(channel: string, data: any) {
+ // 如果频道不存在,则直接返回
+ if (!this.channels[channel]) {
+ return
+ }
+
+ // 遍历频道的订阅者列表,并依次调用回调函数
+ this.channels[channel].forEach((callback: Function) => {
+ callback(data)
+ })
+ }
+
+ unsubscribe(channel: string, callback: Function) {
+ // 如果频道不存在,则创建一个新的频道
+ if (!this.channels[channel]) {
+ this.channels[channel] = []
+ }
+
+ for (const index in this.channels[channel]) {
+ if (this.channels[channel][index] === callback) {
+ this.channels[channel].splice(index, 1)
+ }
+ }
+ }
+}
+
+export default EventBus
+
+export const bus = new EventBus()
diff --git a/src/utils/functions.js b/src/utils/functions.js
new file mode 100644
index 0000000..53cc0b1
--- /dev/null
+++ b/src/utils/functions.js
@@ -0,0 +1,106 @@
+import { getAccessToken } from '@/utils/auth'
+
+/**
+ * 通过图片url获取图片大小
+ *
+ * @param {String} imgsrc 例如图片名: D8x5f13a53dbc4b9_350x345.png
+ */
+export function getImageInfo(imgsrc) {
+ let data = {
+ width: 0,
+ height: 0
+ }
+
+ let arr = imgsrc.split('_')
+ if (arr.length == 1) return data
+
+ let info = arr[arr.length - 1].match(/\d+x\d+/g)
+ if (info == null) return data
+
+ info = info[0].split('x')
+
+ return {
+ width: parseInt(info[0]),
+ height: parseInt(info[1])
+ }
+}
+
+/**
+ * 文件下载方法
+ *
+ * @param {Number} msgid
+ */
+export function download(msg_id) {
+ let token = getAccessToken()
+ try {
+ let link = document.createElement('a')
+ // link.target = '_blank'
+ link.href = `${
+ import.meta.env.VITE_BASE_API
+ }/api/v1/talk/records/file/download?msg_id=${msg_id}&token=${token}`
+ link.click()
+ } catch (e) {
+ console.warn(e)
+ }
+}
+
+export function insertText(obj, str) {
+ if (document.selection) {
+ let sel = document.selection.createRange()
+ sel.text = str
+ } else if (typeof obj.selectionStart === 'number' && typeof obj.selectionEnd === 'number') {
+ let startPos = obj.selectionStart,
+ endPos = obj.selectionEnd,
+ cursorPos = startPos,
+ tmpStr = obj.value
+ obj.value = tmpStr.substring(0, startPos) + str + tmpStr.substring(endPos, tmpStr.length)
+ cursorPos += str.length
+ obj.selectionStart = obj.selectionEnd = cursorPos
+
+ obj.focus()
+ } else {
+ obj.value += str
+ }
+}
+
+export function countDownTime(second = 0) {
+ // 小于10 加0 处理
+ function formate0to9(arg) {
+ return arg < 10 ? `0${arg}` : arg
+ }
+
+ const hours = parseInt((second / 60 / 60) % 24, 10) //剩余的小时
+ const minutes = parseInt((second / 60) % 60, 10) //剩余的分钟
+ const seconds = parseInt(second % 60, 10) //剩余的秒数
+
+ return `${formate0to9(hours)}:${formate0to9(minutes)}:${formate0to9(seconds)}`
+}
+
+export function removeTags(str) {
+ return str.replace(/<\/?[^>]+>/gi, '')
+}
+
+export function downloadImage(src, name) {
+ let image = new Image()
+ image.setAttribute('crossOrigin', 'anonymous')
+ image.onload = function () {
+ let canvas = document.createElement('canvas')
+ canvas.width = image.width
+ canvas.height = image.height
+ let context = canvas.getContext('2d')
+ context.drawImage(image, 0, 0, image.width, image.height)
+ let url = canvas.toDataURL('image/png')
+ let a = document.createElement('a')
+ let event = new MouseEvent('click')
+ a.download = name || 'image.png'
+ a.href = url
+ a.dispatchEvent(event)
+ }
+ image.src = src
+}
+
+// 获取文件名后缀
+export const getFileNameSuffix = (name) => {
+ const arr = name.split('.')
+ return arr[arr.length - 1]
+}
diff --git a/src/utils/request.js b/src/utils/request.js
new file mode 100644
index 0000000..626977d
--- /dev/null
+++ b/src/utils/request.js
@@ -0,0 +1,107 @@
+import axios from 'axios'
+import { delAccessToken, getAccessToken } from '@/utils/auth'
+
+// 创建 axios 实例
+const request = axios.create({
+ // API 请求的默认前缀
+ baseURL: import.meta.env.VITE_BASE_API,
+
+ // 请求超时时间
+ timeout: 10000
+})
+
+let once = false
+
+/**
+ * 异常拦截处理器
+ *
+ * @param {*} error
+ */
+const errorHandler = (error) => {
+ // 判断是否是响应错误信息
+ if (error.response) {
+ if (error.response.status == 401) {
+ delAccessToken()
+
+ if (!once) {
+ once = true
+ window['$dialog'].info({
+ title: '友情提示',
+ content: '当前登录已失效,请重新登录?',
+ positiveText: '立即登录?',
+ maskClosable: false,
+ onPositiveClick: () => {
+ location.reload()
+ }
+ })
+ }
+ }
+ }
+
+ return Promise.reject(error)
+}
+
+// 请求拦截器
+request.interceptors.request.use((config) => {
+ const token = getAccessToken()
+
+ if (token) {
+ config.headers['Authorization'] = `Bearer ${token}`
+ }
+
+ return config
+}, errorHandler)
+
+// 响应拦截器
+request.interceptors.response.use((response) => response.data, errorHandler)
+
+/**
+ * GET 请求
+ *
+ * @param {String} url
+ * @param {Object} data
+ * @param {Object} options
+ * @returns {Promise}
+ */
+export const get = (url, data = {}, options = {}) => {
+ return request({
+ url,
+ params: data,
+ method: 'get',
+ ...options
+ })
+}
+
+/**
+ * POST 请求
+ *
+ * @param {String} url
+ * @param {Object} data
+ * @param {Object} options
+ * @returns {Promise}
+ */
+export const post = (url, data = {}, options = {}) => {
+ return request({
+ url,
+ method: 'post',
+ data: data,
+ ...options
+ })
+}
+
+/**
+ * 上传文件 POST 请求
+ *
+ * @param {String} url
+ * @param {Object} data
+ * @param {Object} options
+ * @returns {Promise}
+ */
+export const upload = (url, data = {}, options = {}) => {
+ return request({
+ url,
+ method: 'post',
+ data: data,
+ ...options
+ })
+}
diff --git a/src/utils/storage.ts b/src/utils/storage.ts
new file mode 100644
index 0000000..e57bcf3
--- /dev/null
+++ b/src/utils/storage.ts
@@ -0,0 +1,73 @@
+interface IStorage {
+ setItem(key: string, value: any): void
+ getItem(key: string): any
+ removeItem(key: string): void
+ clear(): void
+}
+
+class Storage {
+ // 缓存前缀
+ prefix = ''
+
+ // 缓存驱动
+ storage: IStorage = localStorage
+
+ constructor(prefix = '', storage: IStorage) {
+ this.prefix = prefix
+ this.storage = storage
+ }
+
+ cacheKey(key: string) {
+ return `${this.prefix}_${key}`.toUpperCase()
+ }
+
+ get(key: string, def: any = '') {
+ const item = this.storage.getItem(this.cacheKey(key))
+
+ if (!item) return def
+
+ try {
+ const { value, expire } = JSON.parse(item)
+
+ // 在有效期内直接返回
+ if (expire === null || expire >= Date.now()) {
+ return value
+ }
+
+ this.remove(key)
+ } catch (e) {
+ console.warn(e)
+ }
+
+ return def
+ }
+
+ /**
+ * 设置缓存
+ *
+ * @param {String} key // 缓存KEY
+ * @param {Any} value // 缓存值
+ * @param {Number|null} expire // 缓存时间单位秒
+ */
+ set(key: string, value: any, expire: number | null = 60 * 60 * 24) {
+ this.storage.setItem(
+ this.cacheKey(key),
+ JSON.stringify({
+ value,
+ expire: expire !== null ? new Date().getTime() + expire * 1000 : null
+ })
+ )
+ }
+
+ remove(key: string) {
+ this.storage.removeItem(this.cacheKey(key))
+ }
+
+ clear() {
+ this.storage.clear()
+ }
+}
+
+export default Storage
+
+export const storage = new Storage('im', localStorage)
diff --git a/src/utils/strings.js b/src/utils/strings.js
new file mode 100644
index 0000000..51f6758
--- /dev/null
+++ b/src/utils/strings.js
@@ -0,0 +1,80 @@
+/**
+ * 去除字符串控制
+ *
+ * @param {String} str
+ */
+export function trim(str, type = null) {
+ if (type) {
+ return str.replace(/(^\s*)|(\s*$)/g, '')
+ } else if (type == 'l') {
+ return str.replace(/(^\s*)/g, '')
+ } else {
+ return str.replace(/(\s*$)/g, '')
+ }
+}
+
+/**
+ * 隐藏用户手机号中间四位
+ *
+ * @param {String} phone 手机号
+ */
+export function hidePhone(phone) {
+ return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
+}
+
+/**
+ * Url 替换超链接
+ *
+ * @param {String} text 文本
+ * @param {String} color 超链接颜色
+ */
+export function textReplaceLink(text, color = '#409eff') {
+ let exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/gi
+ return text.replace(
+ exp,
+ `$1`
+ )
+}
+
+/**
+ * 文本 替换@信息
+ *
+ * @param {String} text 文本
+ * @param {String} color 超链接颜色
+ */
+export function textReplaceMention(text, color = '#2196F3') {
+ return text.replace(new RegExp(/@\S+/, 'g'), ($0, $1) => {
+ return `${$0}`
+ })
+}
+
+/**
+ * 格式化文件大小
+ *
+ * @param {string|number} value 文件大小(字节)
+ */
+export function fileFormatSize(value) {
+ if (null == value || value == '') {
+ return '0'
+ }
+
+ let unitArr = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
+ let index = 0
+ let srcsize = parseFloat(value)
+ index = Math.floor(Math.log(srcsize) / Math.log(1000))
+
+ let size = srcsize / Math.pow(1000, index)
+ size = size.toFixed(2) //保留的小数位数
+ return size + unitArr[index]
+}
+
+/**
+ * 获取文件后缀名
+ *
+ * @param {String} fileName
+ */
+export function fileSuffix(fileName) {
+ let ext = fileName.split('.')
+
+ return ext[ext.length - 1]
+}
diff --git a/src/utils/talk.js b/src/utils/talk.js
new file mode 100644
index 0000000..941c1a5
--- /dev/null
+++ b/src/utils/talk.js
@@ -0,0 +1,86 @@
+import { parseTime } from './datetime'
+
+export const KEY_INDEX_NAME = 'send_message_index_name'
+
+export function formatTalkRecord(uid, data) {
+ data.float = 'center'
+
+ if (data.user_id > 0) {
+ data.float = data.user_id == uid ? 'right' : 'left'
+ }
+
+ data.isCheck = false
+
+ return data
+}
+
+// 播放消息提示
+export function palyMusic(muted = false) {
+ let audio = document.getElementById('audio')
+ audio.currentTime = 0
+ audio.muted = muted
+ audio.play()
+}
+
+/**
+ * 格式化聊天对话列表数据
+ *
+ * @param {Object} params
+ */
+export function formatTalkItem(params) {
+ let options = {
+ id: 0,
+ talk_type: 1,
+ receiver_id: 0,
+ name: '未设置',
+ remark: '',
+ avatar: '',
+ is_disturb: 0,
+ is_top: 0,
+ is_online: 0,
+ is_robot: 0,
+ unread_num: 0,
+ content: '......',
+ draft_text: '',
+ msg_text: '',
+ index_name: '',
+ updated_at: parseTime(new Date())
+ }
+
+ options = { ...options, ...params }
+ options.index_name = `${options.talk_type}_${options.receiver_id}`
+
+ return options
+}
+
+/**
+ * 获取需要打开的对话索引值
+ *
+ * @returns
+ */
+export function getCacheIndexName() {
+ let index_name = sessionStorage.getItem(KEY_INDEX_NAME)
+
+ if (index_name) {
+ sessionStorage.removeItem(KEY_INDEX_NAME)
+ }
+
+ return index_name
+}
+
+/**
+ * 获取需要打开的对话索引值
+ *
+ * @returns
+ */
+export function setCacheIndexName(type, id) {
+ sessionStorage.setItem(KEY_INDEX_NAME, `${type}_${id}`)
+}
+
+export const ttime = (datetime) => {
+ if (datetime == undefined || datetime == '') {
+ return new Date().getTime()
+ }
+
+ return new Date(datetime.replace(/-/g, '/')).getTime()
+}
diff --git a/src/utils/util.ts b/src/utils/util.ts
new file mode 100644
index 0000000..5691059
--- /dev/null
+++ b/src/utils/util.ts
@@ -0,0 +1,25 @@
+import { h } from 'vue'
+import { NIcon } from 'naive-ui'
+
+export const renderIcon = (icon: any) => {
+ return () => {
+ return h(NIcon, null, {
+ default: () => h(icon)
+ })
+ }
+}
+
+/**
+ * 格式化日期
+ * @param date
+ * @returns String
+ */
+export const formattedDate = (date: Date) => {
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ const hours = String(date.getHours()).padStart(2, '0')
+ const minutes = String(date.getMinutes()).padStart(2, '0')
+ const seconds = String(date.getSeconds()).padStart(2, '0')
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
+}
diff --git a/src/utils/validate.js b/src/utils/validate.js
new file mode 100644
index 0000000..90552c0
--- /dev/null
+++ b/src/utils/validate.js
@@ -0,0 +1,44 @@
+/**
+ * 检测是否是字邮箱地址
+ *
+ * @param {String} value
+ */
+export const isEmail = (value) => {
+ return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(value)
+}
+
+/**
+ * 检测是否是手机号
+ *
+ * @param {String} value
+ */
+export const isMobile = (value) => {
+ return /^1[0-9]{10}$/.test(value)
+}
+
+/**
+ * 检测是否为url
+ *
+ * @param {String} value
+ */
+export const isURL = (value) => {
+ return /^http[s]?:\/\/.*/.test(value)
+}
+
+/**
+ * 检测是否为数字类型
+ *
+ * @param {*} value
+ */
+export const isNumber = (value) => {
+ return Object.prototype.toString.call(value).slice(8, -1) === 'Number'
+}
+
+/**
+ * 检测是否为 Booleanl 类型
+ *
+ * @param {*} value
+ */
+export const isBoolean = (value) => {
+ return Object.prototype.toString.call(value).slice(8, -1) === 'Boolean'
+}
diff --git a/src/views/auth/forget.vue b/src/views/auth/forget.vue
new file mode 100644
index 0000000..adfd286
--- /dev/null
+++ b/src/views/auth/forget.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获取验证码 ({{ lockTime }}s)
+
+
+
+
+
+
+
+
+ 立即找回
+
+
+
+
+ 注册账号
+
+ 已有账号,立即登录?
+
+
+
+
+
+
+
diff --git a/src/views/auth/layout.vue b/src/views/auth/layout.vue
new file mode 100644
index 0000000..abd1409
--- /dev/null
+++ b/src/views/auth/layout.vue
@@ -0,0 +1,36 @@
+
+
+
+ Lumen IM
+
+
+
+
+
+
+
+
+
diff --git a/src/views/auth/login.vue b/src/views/auth/login.vue
new file mode 100644
index 0000000..37213bb
--- /dev/null
+++ b/src/views/auth/login.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 立即登录
+
+
+
+
+ 找回密码
+
+ 还没有账号?立即注册
+
+
+
+
+
+
+
+
+
diff --git a/src/views/auth/register.vue b/src/views/auth/register.vue
new file mode 100644
index 0000000..6495dcb
--- /dev/null
+++ b/src/views/auth/register.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获取验证码 ({{ lockTime }}s)
+
+
+
+
+
+
+
+
+
+
+
+
+ 立即注册
+
+
+
+
+ 找回密码
+
+ 已有账号,立即登录?
+
+
+
+
+
+
+
diff --git a/src/views/contact/apply.vue b/src/views/contact/apply.vue
new file mode 100644
index 0000000..6fd4d58
--- /dev/null
+++ b/src/views/contact/apply.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
diff --git a/src/views/contact/friends.vue b/src/views/contact/friends.vue
new file mode 100644
index 0000000..1421c88
--- /dev/null
+++ b/src/views/contact/friends.vue
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/contact/groups.vue b/src/views/contact/groups.vue
new file mode 100644
index 0000000..9722e2c
--- /dev/null
+++ b/src/views/contact/groups.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/contact/inner/FriendApply.vue b/src/views/contact/inner/FriendApply.vue
new file mode 100644
index 0000000..94f86ce
--- /dev/null
+++ b/src/views/contact/inner/FriendApply.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.nickname }}
+ {{ parseTime(item.created_at, '{m}/{d} {h}:{i}') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确认要拒绝申请吗?
+
+
+
+
+
+
+
diff --git a/src/views/contact/inner/GroupApply.vue b/src/views/contact/inner/GroupApply.vue
new file mode 100644
index 0000000..8299fea
--- /dev/null
+++ b/src/views/contact/inner/GroupApply.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.group_name }}
+
+ {{ item.nickname }}
+
+ {{ parseTime(item.created_at, '{m}/{d} {h}:{i}') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/contact/inner/GroupCard.vue b/src/views/contact/inner/GroupCard.vue
new file mode 100644
index 0000000..a03cb0c
--- /dev/null
+++ b/src/views/contact/inner/GroupCard.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ username || '-' }}
+
+ 企业
+
+
+
{{ motto || '...' }}
+
+
+
+
+
+
diff --git a/src/views/contact/inner/GroupManage.vue b/src/views/contact/inner/GroupManage.vue
new file mode 100644
index 0000000..c9d7fb1
--- /dev/null
+++ b/src/views/contact/inner/GroupManage.vue
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/contact/inner/MemberCard.vue b/src/views/contact/inner/MemberCard.vue
new file mode 100644
index 0000000..1176fe0
--- /dev/null
+++ b/src/views/contact/inner/MemberCard.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ username || '-' }}
+
+
+
+
+
+
+
+
+
{{ motto || '...' }}
+
+
+
+
+
+
diff --git a/src/views/contact/inner/UserSearchModal.vue b/src/views/contact/inner/UserSearchModal.vue
new file mode 100644
index 0000000..4cb3c2f
--- /dev/null
+++ b/src/views/contact/inner/UserSearchModal.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+ 无法找到该用户,请检查搜索内容并重试!
+
+
+
+
+ 取消
+
+ 查询
+
+
+
+
+
+
+
diff --git a/src/views/contact/layout.vue b/src/views/contact/layout.vue
new file mode 100644
index 0000000..1061f3d
--- /dev/null
+++ b/src/views/contact/layout.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
diff --git a/src/views/contact/open-group.vue b/src/views/contact/open-group.vue
new file mode 100644
index 0000000..17e4de1
--- /dev/null
+++ b/src/views/contact/open-group.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 公开群聊可自行添加入群申请,待群主(管理员)同意后方可入群!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/contact/organize.vue b/src/views/contact/organize.vue
new file mode 100644
index 0000000..252879e
--- /dev/null
+++ b/src/views/contact/organize.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/example/index.vue b/src/views/example/index.vue
new file mode 100644
index 0000000..0784560
--- /dev/null
+++ b/src/views/example/index.vue
@@ -0,0 +1,5 @@
+
+ test
+
+
+
diff --git a/src/views/example/svg.svg b/src/views/example/svg.svg
new file mode 100644
index 0000000..ee4f57d
--- /dev/null
+++ b/src/views/example/svg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/views/message/index.vue b/src/views/message/index.vue
new file mode 100644
index 0000000..759d617
--- /dev/null
+++ b/src/views/message/index.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/IndexAmicable.vue b/src/views/message/inner/IndexAmicable.vue
new file mode 100644
index 0000000..8453f30
--- /dev/null
+++ b/src/views/message/inner/IndexAmicable.vue
@@ -0,0 +1,25 @@
+
+
+
+

+
LumenIM 欢迎您 (*^__^*)
+
+
+
+
+
diff --git a/src/views/message/inner/IndexContent.vue b/src/views/message/inner/IndexContent.vue
new file mode 100644
index 0000000..dfc3af7
--- /dev/null
+++ b/src/views/message/inner/IndexContent.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/IndexSider.vue b/src/views/message/inner/IndexSider.vue
new file mode 100644
index 0000000..fa0a9d1
--- /dev/null
+++ b/src/views/message/inner/IndexSider.vue
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/Skeleton.vue b/src/views/message/inner/Skeleton.vue
new file mode 100644
index 0000000..e0da38b
--- /dev/null
+++ b/src/views/message/inner/Skeleton.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/TalkItem.vue b/src/views/message/inner/TalkItem.vue
new file mode 100644
index 0000000..7ebaf8b
--- /dev/null
+++ b/src/views/message/inner/TalkItem.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ [草稿]
+
+
+
+ [在线]
+
+
+
+
+
+
+
+
+
+ {{ data.unread_num > 99 ? '99+' : data.unread_num }}
+
+
+
+
+
+ {{ data.unread_num > 99 ? '99+' : data.unread_num }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/panel/MultiSelectFooter.vue b/src/views/message/inner/panel/MultiSelectFooter.vue
new file mode 100644
index 0000000..547a4f0
--- /dev/null
+++ b/src/views/message/inner/panel/MultiSelectFooter.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+ 已选中:{{ dialogueStore.selectItems.length }} 条消息
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/panel/PanelContent.vue b/src/views/message/inner/panel/PanelContent.vue
new file mode 100644
index 0000000..101d56c
--- /dev/null
+++ b/src/views/message/inner/panel/PanelContent.vue
@@ -0,0 +1,648 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/panel/PanelFooter.vue b/src/views/message/inner/panel/PanelFooter.vue
new file mode 100644
index 0000000..32d536c
--- /dev/null
+++ b/src/views/message/inner/panel/PanelFooter.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/panel/PanelHeader.vue b/src/views/message/inner/panel/PanelHeader.vue
new file mode 100644
index 0000000..53e377d
--- /dev/null
+++ b/src/views/message/inner/panel/PanelHeader.vue
@@ -0,0 +1,285 @@
+
+
+
+
+
+
+
diff --git a/src/views/message/inner/panel/SkipBottom.vue b/src/views/message/inner/panel/SkipBottom.vue
new file mode 100644
index 0000000..c239714
--- /dev/null
+++ b/src/views/message/inner/panel/SkipBottom.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+ {{ dialogueStore.unreadBubble }} 条未读消息
+ 回到底部
+
+
+
+
+
diff --git a/src/views/message/inner/panel/menu.ts b/src/views/message/inner/panel/menu.ts
new file mode 100644
index 0000000..acab729
--- /dev/null
+++ b/src/views/message/inner/panel/menu.ts
@@ -0,0 +1,68 @@
+import { reactive } from 'vue'
+
+interface IDropdown {
+ options: any[]
+ show: boolean
+ x: number
+ y: number
+ item: any
+}
+
+const isRevoke = (uid: any, item: any): boolean => {
+ if (uid != item.user_id) {
+ return false
+ }
+
+ const datetime = item.created_at.replace(/-/g, '/')
+
+ const time = new Date().getTime() - Date.parse(datetime)
+
+ return Math.floor(time / 1000 / 60) <= 2
+}
+
+export function useMenu() {
+ const dropdown: IDropdown = reactive({
+ options: [],
+ show: false,
+ x: 0,
+ y: 0,
+ item: {}
+ })
+
+ const showDropdownMenu = (e: any, uid: number, item: any) => {
+ dropdown.item = Object.assign({}, item)
+
+ dropdown.options = []
+ if ([1, 3].includes(item.msg_type)) {
+ dropdown.options.push({ label: '复制', key: 'copy' })
+ }
+
+ if (isRevoke(uid, item)) {
+ dropdown.options.push({ label: `撤回`, key: 'revoke' })
+ }
+
+ dropdown.options.push({ label: '回复', key: 'quote' })
+ dropdown.options.push({ label: '删除', key: 'delete' })
+
+ dropdown.options.push({ label: '多选', key: 'multiSelect' })
+
+ if ([3, 4, 5].includes(item.msg_type)) {
+ dropdown.options.push({ label: '下载', key: 'download' })
+ }
+
+ if ([3].includes(item.msg_type)) {
+ dropdown.options.push({ label: '收藏', key: 'collect' })
+ }
+
+ dropdown.x = e.clientX
+ dropdown.y = e.clientY
+ dropdown.show = true
+ }
+
+ const closeDropdownMenu = () => {
+ dropdown.show = false
+ dropdown.item = {}
+ }
+
+ return { dropdown, showDropdownMenu, closeDropdownMenu }
+}
diff --git a/src/views/note/index.vue b/src/views/note/index.vue
new file mode 100644
index 0000000..99657f8
--- /dev/null
+++ b/src/views/note/index.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/src/views/note/inner/AnnexUploadModal.vue b/src/views/note/inner/AnnexUploadModal.vue
new file mode 100644
index 0000000..7cbb37a
--- /dev/null
+++ b/src/views/note/inner/AnnexUploadModal.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+ 附件列表({{ detail.files.length }})
+
+
+
+
+
暂无附件
+
+
+
{{ file.suffix }}
+
+
+
{{ file.original_name }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/note/inner/NoteEmpty.vue b/src/views/note/inner/NoteEmpty.vue
new file mode 100644
index 0000000..297c90c
--- /dev/null
+++ b/src/views/note/inner/NoteEmpty.vue
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/note/inner/NoteList.vue b/src/views/note/inner/NoteList.vue
new file mode 100644
index 0000000..ff320a7
--- /dev/null
+++ b/src/views/note/inner/NoteList.vue
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ note.title }}
+
+
+
+
+
+ {{ note.created_at.substring(0, 10) }}
+ {{ note.class_name }}
+
+
+ {{ note.abstract.replace(/[\r\n]/g, '').replace(/(<([^>]+)>)/gi, '') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/note/inner/NoteMenu.vue b/src/views/note/inner/NoteMenu.vue
new file mode 100644
index 0000000..6c53cb2
--- /dev/null
+++ b/src/views/note/inner/NoteMenu.vue
@@ -0,0 +1,452 @@
+
+
+
+
+
+
+ {
+ dropdownMenu.show = false
+ dropdownMenu.item = {}
+ }
+ "
+ />
+
+
+
+
+
diff --git a/src/views/note/inner/NoteView.vue b/src/views/note/inner/NoteView.vue
new file mode 100644
index 0000000..a2c0437
--- /dev/null
+++ b/src/views/note/inner/NoteView.vue
@@ -0,0 +1,435 @@
+
+
+
+
+
+
+
diff --git a/src/views/note/inner/RecycleModal.vue b/src/views/note/inner/RecycleModal.vue
new file mode 100644
index 0000000..61602be
--- /dev/null
+++ b/src/views/note/inner/RecycleModal.vue
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ note.created_at.substr(0, 10) }}
+ {{ note.class_name }}
+
+
+ {{ note.abstract.replace(/[\r\n]/g, '').replace(/(<([^>]+)>)/gi, '') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
所属笔记: {{ annex.title }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/note/inner/TagsClipModal.vue b/src/views/note/inner/TagsClipModal.vue
new file mode 100644
index 0000000..f1fe70c
--- /dev/null
+++ b/src/views/note/inner/TagsClipModal.vue
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
已选择:
+
+ {{ tag.tag_name }}
+
+
+
+
+
+
标签栏:
+
+ {{ tag.tag_name }}
+
+
+
+
+
+
diff --git a/src/views/other/not-found.vue b/src/views/other/not-found.vue
new file mode 100644
index 0000000..cf67d5d
--- /dev/null
+++ b/src/views/other/not-found.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+

+
+
+
404
+
抱歉,你访问的页面不存在...
+
+ 返回首页 ({{ second }}S)
+
+
+
+
+
+
diff --git a/src/views/setting/binding.vue b/src/views/setting/binding.vue
new file mode 100644
index 0000000..8c2c603
--- /dev/null
+++ b/src/views/setting/binding.vue
@@ -0,0 +1,55 @@
+
+
+
+
+ 绑定设置
+
+
+
+
+

+
+
+
绑定 github
+
当前未绑定github账号
+
+
+ 设置
+
+
+
+
+
+

+
+
+
绑定 gitee
+
当前未绑定gitee账号
+
+
+ 设置
+
+
+
+
+
+
+
diff --git a/src/views/setting/detail.vue b/src/views/setting/detail.vue
new file mode 100644
index 0000000..9703a04
--- /dev/null
+++ b/src/views/setting/detail.vue
@@ -0,0 +1,188 @@
+
+
+
+ 个人信息
+
+
+
+
+
+
+
+ {{ hidePhone(detail.mobile) }}
+
+ 修改
+
+
+
+ {{ detail.email }}
+
+ 修改
+
+
+
+
+
+
+
+
+ 男
+ 女
+ 保密
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存修改
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/setting/layout.vue b/src/views/setting/layout.vue
new file mode 100644
index 0000000..d3d09fb
--- /dev/null
+++ b/src/views/setting/layout.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
diff --git a/src/views/setting/notification.vue b/src/views/setting/notification.vue
new file mode 100644
index 0000000..fb93c6f
--- /dev/null
+++ b/src/views/setting/notification.vue
@@ -0,0 +1,88 @@
+
+
+
+
+ 通知设置
+
+
+
+
+
新消息提示音
+
新消息提示音 :{{ isPromptTone ? '已开启' : '已关闭' }}
+
+
+
+
+
+
+
+
+
推送键盘输入消息
+
推送键盘输入消息:{{ isKeyboard ? '已开启' : '已关闭' }}
+
+
+
+
+
+
+
+
+
消息通知
+
+ 消息通知:{{ isNotify ? '已开启' : '已关闭' }}
+
+
+ (当前未获得浏览器通知权限,
+ 点击获取权限)
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/setting/personalize.vue b/src/views/setting/personalize.vue
new file mode 100644
index 0000000..533685f
--- /dev/null
+++ b/src/views/setting/personalize.vue
@@ -0,0 +1,74 @@
+
+
+
+
+ 个性设置
+
+
+
+
+
主题颜色
+
当前主题颜色 :{{ darkTheme ? '浅色' : '深色' }}
+
+
+
+
+
+
+
+
+
主题模式
+
当前主题模式 :{{ isFullScreen ? '全屏模式' : '居中模式' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/setting/security.vue b/src/views/setting/security.vue
new file mode 100644
index 0000000..af79d01
--- /dev/null
+++ b/src/views/setting/security.vue
@@ -0,0 +1,68 @@
+
+
+
+
+ 安全设置
+
+
+
+
+
+
+
绑定手机
+
已绑定手机 :{{ hidePhone(userStore.mobile) }}
+
+
+ 修改
+
+
+
+
+
+
绑定邮箱
+
已绑定邮箱 :{{ userStore.email || '未设置' }}
+
+
+ 修改
+
+
+
+
+
+
+
+
+
+
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..7163544
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,43 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "esnext",
+ "moduleResolution": "node",
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "allowSyntheticDefaultImports": true,
+ "strictFunctionTypes": false,
+ "jsx": "preserve",
+ "baseUrl": ".",
+ "allowJs": true,
+ "sourceMap": true,
+ "esModuleInterop": true,
+ "resolveJsonModule": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "experimentalDecorators": true,
+ "noEmit": true,
+ "allowImportingTsExtensions": true,
+ "types": [
+ "vite/client"
+ ],
+ "noImplicitAny": false,
+ "skipLibCheck": true,
+ "paths": {
+ "@/*": [
+ "src/*"
+ ],
+ "/#/*": [
+ "types/*"
+ ]
+ }
+ },
+ "include": [
+ "env.d.ts",
+ "src/**/*.ts",
+ "src/**/*.d.ts",
+ "src/**/*.tsx",
+ "src/**/*.vue",
+ "assets/**/*.jpg"
+ ],
+}
\ No newline at end of file
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..75f40ad
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,31 @@
+import { defineConfig, loadEnv } from 'vite'
+import { fileURLToPath, URL } from 'node:url'
+import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx'
+import compressPlugin from 'vite-plugin-compression'
+
+// https://vitejs.dev/config/
+export default defineConfig(({ mode }) => {
+ // 根据当前工作目录中的 `mode` 加载 .env 文件
+ // 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。
+ const env = loadEnv(mode, process.cwd(), 'VITE')
+
+ return {
+ base: env.VITE_BASE,
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ },
+ extensions: ['.js', '.json', 'jsx', '.vue', '.ts'] // 使用路径别名时想要省略的后缀名,可以自己 增减
+ },
+ root: process.cwd(),
+ assetsInclude: ['./src/assets'],
+ plugins: [vue(), vueJsx({}), compressPlugin()],
+ define: {
+ __APP_ENV__: env.APP_ENV
+ },
+ build: {
+ chunkSizeWarningLimit: 1000
+ }
+ }
+})
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..35bd4a0
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,6252 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"7zip-bin@~5.1.1":
+ version "5.1.1"
+ resolved "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876"
+ integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==
+
+"@aashutoshrathi/word-wrap@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
+ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+
+"@ampproject/remapping@^2.2.0":
+ version "2.2.1"
+ resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244"
+ integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
+ dependencies:
+ "@babel/highlight" "^7.23.4"
+ chalk "^2.4.2"
+
+"@babel/compat-data@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98"
+ integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==
+
+"@babel/core@^7.23.3":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4"
+ integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.23.5"
+ "@babel/generator" "^7.23.6"
+ "@babel/helper-compilation-targets" "^7.23.6"
+ "@babel/helper-module-transforms" "^7.23.3"
+ "@babel/helpers" "^7.23.6"
+ "@babel/parser" "^7.23.6"
+ "@babel/template" "^7.22.15"
+ "@babel/traverse" "^7.23.6"
+ "@babel/types" "^7.23.6"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e"
+ integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
+ dependencies:
+ "@babel/types" "^7.23.6"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
+ jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
+ integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-compilation-targets@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
+ integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==
+ dependencies:
+ "@babel/compat-data" "^7.23.5"
+ "@babel/helper-validator-option" "^7.23.5"
+ browserslist "^4.22.2"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz#b04d915ce92ce363666f816a884cdcfc9be04953"
+ integrity sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-member-expression-to-functions" "^7.23.0"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.20"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ semver "^6.3.1"
+
+"@babel/helper-environment-visitor@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
+"@babel/helper-function-name@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+ integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.23.0"
+
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366"
+ integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==
+ dependencies:
+ "@babel/types" "^7.23.0"
+
+"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5":
+ version "7.22.15"
+ resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
+ integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+ dependencies:
+ "@babel/types" "^7.22.15"
+
+"@babel/helper-module-transforms@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1"
+ integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-module-imports" "^7.22.15"
+ "@babel/helper-simple-access" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/helper-validator-identifier" "^7.22.20"
+
+"@babel/helper-optimise-call-expression@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
+ integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-plugin-utils@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
+ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
+
+"@babel/helper-replace-supers@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793"
+ integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-member-expression-to-functions" "^7.22.15"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+
+"@babel/helper-simple-access@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
+ integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
+ integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+ integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83"
+ integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
+
+"@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+"@babel/helper-validator-option@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
+ integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
+
+"@babel/helpers@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.6.tgz#d03af2ee5fb34691eec0cda90f5ecbb4d4da145a"
+ integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/traverse" "^7.23.6"
+ "@babel/types" "^7.23.6"
+
+"@babel/highlight@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
+ integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.22.15", "@babel/parser@^7.23.5", "@babel/parser@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b"
+ integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==
+
+"@babel/plugin-syntax-jsx@^7.22.5":
+ version "7.23.3"
+ resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473"
+ integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-typescript@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f"
+ integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-typescript@^7.23.3":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz#aa36a94e5da8d94339ae3a4e22d40ed287feb34c"
+ integrity sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.23.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-typescript" "^7.23.3"
+
+"@babel/runtime@^7.14.0", "@babel/runtime@^7.21.0":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d"
+ integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.22.15", "@babel/template@^7.22.5":
+ version "7.22.15"
+ resolved "https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
+ integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
+ dependencies:
+ "@babel/code-frame" "^7.22.13"
+ "@babel/parser" "^7.22.15"
+ "@babel/types" "^7.22.15"
+
+"@babel/traverse@^7.22.5", "@babel/traverse@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5"
+ integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==
+ dependencies:
+ "@babel/code-frame" "^7.23.5"
+ "@babel/generator" "^7.23.6"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.23.6"
+ "@babel/types" "^7.23.6"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.npmmirror.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd"
+ integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
+"@braintree/sanitize-url@^6.0.1":
+ version "6.0.4"
+ resolved "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783"
+ integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==
+
+"@css-render/plugin-bem@^0.15.12":
+ version "0.15.12"
+ resolved "https://registry.npmmirror.com/@css-render/plugin-bem/-/plugin-bem-0.15.12.tgz#cd88e46a388e4786436bd622414da0aa6019af3b"
+ integrity sha512-Lq2jSOZn+wYQtsyaFj6QRz2EzAnd3iW5fZeHO1WSXQdVYwvwGX0ZiH3X2JQgtgYLT1yeGtrwrqJdNdMEUD2xTw==
+
+"@css-render/vue3-ssr@^0.15.10", "@css-render/vue3-ssr@^0.15.12":
+ version "0.15.12"
+ resolved "https://registry.npmmirror.com/@css-render/vue3-ssr/-/vue3-ssr-0.15.12.tgz#798d8dffadecd2bf8c80cbaab64e9df10be5626e"
+ integrity sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==
+
+"@develar/schema-utils@~2.6.5":
+ version "2.6.5"
+ resolved "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6"
+ integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==
+ dependencies:
+ ajv "^6.12.0"
+ ajv-keywords "^3.4.1"
+
+"@electron/get@^1.14.1":
+ version "1.14.1"
+ resolved "https://registry.npmmirror.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40"
+ integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==
+ dependencies:
+ debug "^4.1.1"
+ env-paths "^2.2.0"
+ fs-extra "^8.1.0"
+ got "^9.6.0"
+ progress "^2.0.3"
+ semver "^6.2.0"
+ sumchecker "^3.0.1"
+ optionalDependencies:
+ global-agent "^3.0.0"
+ global-tunnel-ng "^2.7.1"
+
+"@electron/universal@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmmirror.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339"
+ integrity sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ==
+ dependencies:
+ "@malept/cross-spawn-promise" "^1.1.0"
+ asar "^3.1.0"
+ debug "^4.3.1"
+ dir-compare "^2.4.0"
+ fs-extra "^9.0.1"
+ minimatch "^3.0.4"
+ plist "^3.0.4"
+
+"@emotion/hash@~0.8.0":
+ version "0.8.0"
+ resolved "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
+ integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
+
+"@esbuild/android-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
+ integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
+
+"@esbuild/android-arm@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
+ integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
+
+"@esbuild/android-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
+ integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
+
+"@esbuild/darwin-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
+ integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
+
+"@esbuild/darwin-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
+ integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
+
+"@esbuild/freebsd-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
+ integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
+
+"@esbuild/freebsd-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
+ integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
+
+"@esbuild/linux-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
+ integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
+
+"@esbuild/linux-arm@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
+ integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
+
+"@esbuild/linux-ia32@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
+ integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
+
+"@esbuild/linux-loong64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
+ integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
+
+"@esbuild/linux-mips64el@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
+ integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
+
+"@esbuild/linux-ppc64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
+ integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
+
+"@esbuild/linux-riscv64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
+ integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
+
+"@esbuild/linux-s390x@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
+ integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
+
+"@esbuild/linux-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
+ integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
+
+"@esbuild/netbsd-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
+ integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
+
+"@esbuild/openbsd-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
+ integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
+
+"@esbuild/sunos-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
+ integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
+
+"@esbuild/win32-arm64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
+ integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
+
+"@esbuild/win32-ia32@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
+ integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
+
+"@esbuild/win32-x64@0.18.20":
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
+ integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+ version "4.4.0"
+ resolved "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
+ version "4.10.0"
+ resolved "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
+ integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
+
+"@eslint/eslintrc@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
+ integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
+ 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"
+
+"@eslint/js@8.55.0":
+ version "8.55.0"
+ resolved "https://registry.npmmirror.com/@eslint/js/-/js-8.55.0.tgz#b721d52060f369aa259cf97392403cb9ce892ec6"
+ integrity sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==
+
+"@hapi/hoek@^9.0.0":
+ version "9.3.0"
+ resolved "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
+ integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==
+
+"@hapi/topo@^5.0.0":
+ version "5.1.0"
+ resolved "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012"
+ integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==
+ dependencies:
+ "@hapi/hoek" "^9.0.0"
+
+"@highlightjs/vue-plugin@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/@highlightjs/vue-plugin/-/vue-plugin-2.1.0.tgz#b7c41e3597a46975665b10cad57882cbde1d1594"
+ integrity sha512-E+bmk4ncca+hBEYRV2a+1aIzIV0VSY/e5ArjpuSN9IO7wBJrzUE2u4ESCwrbQD7sAy+jWQjkV5qCCWgc+pu7CQ==
+
+"@humanwhocodes/config-array@^0.11.13":
+ version "0.11.13"
+ resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297"
+ integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==
+ dependencies:
+ "@humanwhocodes/object-schema" "^2.0.1"
+ debug "^4.1.1"
+ minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044"
+ integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==
+
+"@icon-park/vue-next@^1.4.2":
+ version "1.4.2"
+ resolved "https://registry.npmmirror.com/@icon-park/vue-next/-/vue-next-1.4.2.tgz#818c048100401620e8112beb2636f10171b195cc"
+ integrity sha512-+QklF255wkfBOabY+xw6FAI0Bwln/RhdwCunNy/9sKdKuChtaU67QZqU67KGAvZUTeeBgsL+yaHHxqfQeGZXEQ==
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.3"
+ resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.1"
+ resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
+ integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15":
+ version "1.4.15"
+ resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.20"
+ resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
+ integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@juggle/resize-observer@^3.3.1":
+ version "3.4.0"
+ resolved "https://registry.npmmirror.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
+ integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
+
+"@kangc/v-md-editor@^2.3.18":
+ version "2.3.18"
+ resolved "https://registry.npmmirror.com/@kangc/v-md-editor/-/v-md-editor-2.3.18.tgz#e4e0aadd818a6d6f47610a533abd873d2fd6f4cf"
+ integrity sha512-wjI9lUQs4Ktn3gYru3C1hauOuOo2na5cF4ycHCgBZmIk08RjQVNbHO169yqkt9PMj6Djnl8W6ZknCBhTQfFbzQ==
+ dependencies:
+ "@babel/runtime" "^7.14.0"
+ "@vuepress/markdown" "^1.8.2"
+ codemirror "^5.61.1"
+ copy-to-clipboard "^3.3.1"
+ highlight.js "^10.7.2"
+ insert-text-at-cursor "^0.3.0"
+ katex "^0.13.11"
+ markdown-it "^12.3.2"
+ markdown-it-attrs "^4.0.0"
+ markdown-it-container "^3.0.0"
+ mermaid "^10.6.1"
+ prismjs "^1.23.0"
+ resize-observer-polyfill "^1.5.1"
+ vant "^3.1.3"
+ xss "^1.0.9"
+
+"@malept/cross-spawn-promise@^1.1.0":
+ version "1.1.1"
+ resolved "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d"
+ integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==
+ dependencies:
+ cross-spawn "^7.0.1"
+
+"@malept/flatpak-bundler@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.npmmirror.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858"
+ integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==
+ dependencies:
+ debug "^4.1.1"
+ fs-extra "^9.0.0"
+ lodash "^4.17.15"
+ tmp-promise "^3.0.2"
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+ integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+ dependencies:
+ call-me-maybe "^1.0.1"
+ glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.stat@^1.1.2":
+ version "1.1.3"
+ resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
+ integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@pkgr/utils@^2.4.2":
+ version "2.4.2"
+ resolved "https://registry.npmmirror.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc"
+ integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==
+ dependencies:
+ cross-spawn "^7.0.3"
+ fast-glob "^3.3.0"
+ is-glob "^4.0.3"
+ open "^9.1.0"
+ picocolors "^1.0.0"
+ tslib "^2.6.0"
+
+"@rushstack/eslint-patch@^1.3.3":
+ version "1.6.0"
+ resolved "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz#1898e7a7b943680d757417a47fb10f5fcc230b39"
+ integrity sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==
+
+"@sideway/address@^4.1.3":
+ version "4.1.4"
+ resolved "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0"
+ integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==
+ dependencies:
+ "@hapi/hoek" "^9.0.0"
+
+"@sideway/formula@^3.0.1":
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f"
+ integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==
+
+"@sideway/pinpoint@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df"
+ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
+
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
+"@tootallnate/once@2":
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
+ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
+
+"@tsconfig/node18@^18.2.2":
+ version "18.2.2"
+ resolved "https://registry.npmmirror.com/@tsconfig/node18/-/node18-18.2.2.tgz#81fb16ecff0d400b1cbadbf76713b50f331029ce"
+ integrity sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==
+
+"@types/d3-scale-chromatic@^3.0.0":
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644"
+ integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==
+
+"@types/d3-scale@^4.0.3":
+ version "4.0.8"
+ resolved "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb"
+ integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==
+ dependencies:
+ "@types/d3-time" "*"
+
+"@types/d3-time@*":
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be"
+ integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==
+
+"@types/debug@^4.0.0", "@types/debug@^4.1.6":
+ version "4.1.12"
+ resolved "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917"
+ integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==
+ dependencies:
+ "@types/ms" "*"
+
+"@types/fs-extra@^9.0.11":
+ version "9.0.13"
+ resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45"
+ integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/glob@^7.1.1":
+ version "7.2.0"
+ resolved "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+ integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/json-schema@^7.0.12":
+ version "7.0.15"
+ resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/katex@^0.16.2":
+ version "0.16.7"
+ resolved "https://registry.npmmirror.com/@types/katex/-/katex-0.16.7.tgz#03ab680ab4fa4fbc6cb46ecf987ecad5d8019868"
+ integrity sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==
+
+"@types/lodash-es@^4.17.9":
+ version "4.17.12"
+ resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b"
+ integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
+ dependencies:
+ "@types/lodash" "*"
+
+"@types/lodash@*", "@types/lodash@^4.14.198":
+ version "4.14.202"
+ resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8"
+ integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==
+
+"@types/mdast@^3.0.0":
+ version "3.0.15"
+ resolved "https://registry.npmmirror.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5"
+ integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==
+ dependencies:
+ "@types/unist" "^2"
+
+"@types/minimatch@*":
+ version "5.1.2"
+ resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
+ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
+
+"@types/ms@*":
+ version "0.7.34"
+ resolved "https://registry.npmmirror.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433"
+ integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
+
+"@types/node@*":
+ version "20.10.4"
+ resolved "https://registry.npmmirror.com/@types/node/-/node-20.10.4.tgz#b246fd84d55d5b1b71bf51f964bd514409347198"
+ integrity sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/node@^16.11.26":
+ version "16.18.68"
+ resolved "https://registry.npmmirror.com/@types/node/-/node-16.18.68.tgz#3155f64a961b3d8d10246c80657f9a7292e3421a"
+ integrity sha512-sG3hPIQwJLoewrN7cr0dwEy+yF5nD4D/4FxtQpFciRD/xwUzgD+G05uxZHv5mhfXo4F9Jkp13jjn0CC2q325sg==
+
+"@types/node@^18.18.5":
+ version "18.19.3"
+ resolved "https://registry.npmmirror.com/@types/node/-/node-18.19.3.tgz#e4723c4cb385641d61b983f6fe0b716abd5f8fc0"
+ integrity sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/normalize-package-data@^2.4.1":
+ version "2.4.4"
+ resolved "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
+ integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
+
+"@types/plist@^3.0.1":
+ version "3.0.5"
+ resolved "https://registry.npmmirror.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0"
+ integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==
+ dependencies:
+ "@types/node" "*"
+ xmlbuilder ">=11.0.1"
+
+"@types/semver@^7.5.0":
+ version "7.5.6"
+ resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339"
+ integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==
+
+"@types/unist@^2", "@types/unist@^2.0.0":
+ version "2.0.10"
+ resolved "https://registry.npmmirror.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc"
+ integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==
+
+"@types/verror@^1.10.3":
+ version "1.10.9"
+ resolved "https://registry.npmmirror.com/@types/verror/-/verror-1.10.9.tgz#420c32adb9a2dd50b3db4c8f96501e05a0e72941"
+ integrity sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==
+
+"@types/vue@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/@types/vue/-/vue-2.0.0.tgz#ec77b3d89591deb9ca5cb052368aa9c32be088e7"
+ integrity sha512-WDElkBv/o4lVwu6wYHB06AXs4Xo2fwDjJUpvPRc1QQdzkUSiGFjrYuSCy8raxLE5FObgKq8ND7R5gSZTFLK60w==
+ dependencies:
+ vue "*"
+
+"@types/web-bluetooth@^0.0.20":
+ version "0.0.20"
+ resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597"
+ integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==
+
+"@types/yargs-parser@*":
+ version "21.0.3"
+ resolved "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
+ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==
+
+"@types/yargs@^17.0.1":
+ version "17.0.32"
+ resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229"
+ integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@typescript-eslint/eslint-plugin@^6.7.0":
+ version "6.14.0"
+ resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz#fc1ab5f23618ba590c87e8226ff07a760be3dd7b"
+ integrity sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==
+ dependencies:
+ "@eslint-community/regexpp" "^4.5.1"
+ "@typescript-eslint/scope-manager" "6.14.0"
+ "@typescript-eslint/type-utils" "6.14.0"
+ "@typescript-eslint/utils" "6.14.0"
+ "@typescript-eslint/visitor-keys" "6.14.0"
+ debug "^4.3.4"
+ graphemer "^1.4.0"
+ ignore "^5.2.4"
+ natural-compare "^1.4.0"
+ semver "^7.5.4"
+ ts-api-utils "^1.0.1"
+
+"@typescript-eslint/parser@^6.7.0":
+ version "6.14.0"
+ resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.14.0.tgz#a2d6a732e0d2b95c73f6a26ae7362877cc1b4212"
+ integrity sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==
+ dependencies:
+ "@typescript-eslint/scope-manager" "6.14.0"
+ "@typescript-eslint/types" "6.14.0"
+ "@typescript-eslint/typescript-estree" "6.14.0"
+ "@typescript-eslint/visitor-keys" "6.14.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@6.14.0":
+ version "6.14.0"
+ resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz#53d24363fdb5ee0d1d8cda4ed5e5321272ab3d48"
+ integrity sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==
+ dependencies:
+ "@typescript-eslint/types" "6.14.0"
+ "@typescript-eslint/visitor-keys" "6.14.0"
+
+"@typescript-eslint/type-utils@6.14.0":
+ version "6.14.0"
+ resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz#ac9cb5ba0615c837f1a6b172feeb273d36e4f8af"
+ integrity sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "6.14.0"
+ "@typescript-eslint/utils" "6.14.0"
+ debug "^4.3.4"
+ ts-api-utils "^1.0.1"
+
+"@typescript-eslint/types@6.14.0":
+ version "6.14.0"
+ resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.14.0.tgz#935307f7a931016b7a5eb25d494ea3e1f613e929"
+ integrity sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==
+
+"@typescript-eslint/typescript-estree@6.14.0":
+ version "6.14.0"
+ resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz#90c7ddd45cd22139adf3d4577580d04c9189ac13"
+ integrity sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==
+ dependencies:
+ "@typescript-eslint/types" "6.14.0"
+ "@typescript-eslint/visitor-keys" "6.14.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.5.4"
+ ts-api-utils "^1.0.1"
+
+"@typescript-eslint/utils@6.14.0":
+ version "6.14.0"
+ resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.14.0.tgz#856a9e274367d99ffbd39c48128b93a86c4261e3"
+ integrity sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@types/json-schema" "^7.0.12"
+ "@types/semver" "^7.5.0"
+ "@typescript-eslint/scope-manager" "6.14.0"
+ "@typescript-eslint/types" "6.14.0"
+ "@typescript-eslint/typescript-estree" "6.14.0"
+ semver "^7.5.4"
+
+"@typescript-eslint/visitor-keys@6.14.0":
+ version "6.14.0"
+ resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz#1d1d486581819287de824a56c22f32543561138e"
+ integrity sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==
+ dependencies:
+ "@typescript-eslint/types" "6.14.0"
+ eslint-visitor-keys "^3.4.1"
+
+"@ungap/structured-clone@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
+ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
+"@vant/icons@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.npmmirror.com/@vant/icons/-/icons-1.8.0.tgz#36b13f2e628b533f6523a93a168cf02f07056674"
+ integrity sha512-sKfEUo2/CkQFuERxvkuF6mGQZDKu3IQdj5rV9Fm0weJXtchDSSQ+zt8qPCNUEhh9Y8shy5PzxbvAfOOkCwlCXg==
+
+"@vant/popperjs@^1.2.1":
+ version "1.3.0"
+ resolved "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz#e0eff017124b5b2352ef3b36a6df06277f4400f2"
+ integrity sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==
+
+"@vant/use@^1.4.2":
+ version "1.6.0"
+ resolved "https://registry.npmmirror.com/@vant/use/-/use-1.6.0.tgz#237df3091617255519552ca311ffdfea9de59001"
+ integrity sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==
+
+"@vitejs/plugin-vue-jsx@^3.0.2":
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz#9953fd9456539e1f0f253bf0fcd1289e66c67cd1"
+ integrity sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==
+ dependencies:
+ "@babel/core" "^7.23.3"
+ "@babel/plugin-transform-typescript" "^7.23.3"
+ "@vue/babel-plugin-jsx" "^1.1.5"
+
+"@vitejs/plugin-vue@^4.4.0":
+ version "4.5.2"
+ resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz#1212d81bc83680e14448fefe55abd9fe1ed49ed1"
+ integrity sha512-UGR3DlzLi/SaVBPX0cnSyE37vqxU3O6chn8l0HJNzQzDia6/Au2A4xKv+iIJW8w2daf80G7TYHhi1pAUjdZ0bQ==
+
+"@volar/language-core@1.11.1", "@volar/language-core@~1.11.1":
+ version "1.11.1"
+ resolved "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.11.1.tgz#ecdf12ea8dc35fb8549e517991abcbf449a5ad4f"
+ integrity sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==
+ dependencies:
+ "@volar/source-map" "1.11.1"
+
+"@volar/source-map@1.11.1", "@volar/source-map@~1.11.1":
+ version "1.11.1"
+ resolved "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.11.1.tgz#535b0328d9e2b7a91dff846cab4058e191f4452f"
+ integrity sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==
+ dependencies:
+ muggle-string "^0.3.1"
+
+"@volar/typescript@~1.11.1":
+ version "1.11.1"
+ resolved "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.11.1.tgz#ba86c6f326d88e249c7f5cfe4b765be3946fd627"
+ integrity sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==
+ dependencies:
+ "@volar/language-core" "1.11.1"
+ path-browserify "^1.0.1"
+
+"@vue/babel-helper-vue-transform-on@^1.1.5":
+ version "1.1.5"
+ resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz#a976486b21e108e545524fe41ffe3fc9bbc28c7f"
+ integrity sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==
+
+"@vue/babel-plugin-jsx@^1.1.5":
+ version "1.1.5"
+ resolved "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz#5088bae7dbb83531d94df3742ff650c12fd54973"
+ integrity sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==
+ dependencies:
+ "@babel/helper-module-imports" "^7.22.5"
+ "@babel/plugin-syntax-jsx" "^7.22.5"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.5"
+ "@babel/types" "^7.22.5"
+ "@vue/babel-helper-vue-transform-on" "^1.1.5"
+ camelcase "^6.3.0"
+ html-tags "^3.3.1"
+ svg-tags "^1.0.0"
+
+"@vue/compiler-core@3.3.11":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.3.11.tgz#9fa26f8c81b9b34365f94ce1ed4d0e6e6f94a2ac"
+ integrity sha512-h97/TGWBilnLuRaj58sxNrsUU66fwdRKLOLQ9N/5iNDfp+DZhYH9Obhe0bXxhedl8fjAgpRANpiZfbgWyruQ0w==
+ dependencies:
+ "@babel/parser" "^7.23.5"
+ "@vue/shared" "3.3.11"
+ estree-walker "^2.0.2"
+ source-map-js "^1.0.2"
+
+"@vue/compiler-dom@3.3.11", "@vue/compiler-dom@^3.3.0":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.11.tgz#36a76ea3a296d41bad133a6912cb0a847d969e4f"
+ integrity sha512-zoAiUIqSKqAJ81WhfPXYmFGwDRuO+loqLxvXmfUdR5fOitPoUiIeFI9cTTyv9MU5O1+ZZglJVTusWzy+wfk5hw==
+ dependencies:
+ "@vue/compiler-core" "3.3.11"
+ "@vue/shared" "3.3.11"
+
+"@vue/compiler-sfc@3.3.11":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.11.tgz#acfae240c875d067e0e2c9a4e2d910074408c73b"
+ integrity sha512-U4iqPlHO0KQeK1mrsxCN0vZzw43/lL8POxgpzcJweopmqtoYy9nljJzWDIQS3EfjiYhfdtdk9Gtgz7MRXnz3GA==
+ dependencies:
+ "@babel/parser" "^7.23.5"
+ "@vue/compiler-core" "3.3.11"
+ "@vue/compiler-dom" "3.3.11"
+ "@vue/compiler-ssr" "3.3.11"
+ "@vue/reactivity-transform" "3.3.11"
+ "@vue/shared" "3.3.11"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.5"
+ postcss "^8.4.32"
+ source-map-js "^1.0.2"
+
+"@vue/compiler-ssr@3.3.11":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.11.tgz#598942a73b64f2bd3f95908b104a7fbb55fc41a2"
+ integrity sha512-Zd66ZwMvndxRTgVPdo+muV4Rv9n9DwQ4SSgWWKWkPFebHQfVYRrVjeygmmDmPewsHyznCNvJ2P2d6iOOhdv8Qg==
+ dependencies:
+ "@vue/compiler-dom" "3.3.11"
+ "@vue/shared" "3.3.11"
+
+"@vue/devtools-api@^6.5.0":
+ version "6.5.1"
+ resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz#7f71f31e40973eeee65b9a64382b13593fdbd697"
+ integrity sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==
+
+"@vue/eslint-config-prettier@^8.0.0":
+ version "8.0.0"
+ resolved "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz#de5cb77ed483b43683d17a788808a0fa4e7bd07e"
+ integrity sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==
+ dependencies:
+ eslint-config-prettier "^8.8.0"
+ eslint-plugin-prettier "^5.0.0"
+
+"@vue/eslint-config-typescript@^12.0.0":
+ version "12.0.0"
+ resolved "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz#0ce22d97af5e4155f3f2e7b21a48cfde8a6f3365"
+ integrity sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==
+ dependencies:
+ "@typescript-eslint/eslint-plugin" "^6.7.0"
+ "@typescript-eslint/parser" "^6.7.0"
+ vue-eslint-parser "^9.3.1"
+
+"@vue/language-core@1.8.25":
+ version "1.8.25"
+ resolved "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.25.tgz#b44b4e3c244ba9b1b79cccf9eb7b046535a4676f"
+ integrity sha512-NJk/5DnAZlpvXX8BdWmHI45bWGLViUaS3R/RMrmFSvFMSbJKuEODpM4kR0F0Ofv5SFzCWuNiMhxameWpVdQsnA==
+ dependencies:
+ "@volar/language-core" "~1.11.1"
+ "@volar/source-map" "~1.11.1"
+ "@vue/compiler-dom" "^3.3.0"
+ "@vue/shared" "^3.3.0"
+ computeds "^0.0.1"
+ minimatch "^9.0.3"
+ muggle-string "^0.3.1"
+ path-browserify "^1.0.1"
+ vue-template-compiler "^2.7.14"
+
+"@vue/reactivity-transform@3.3.11":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.11.tgz#2bd486f4eff60c8724309925618891e722fcfadc"
+ integrity sha512-fPGjH0wqJo68A0wQ1k158utDq/cRyZNlFoxGwNScE28aUFOKFEnCBsvyD8jHn+0kd0UKVpuGuaZEQ6r9FJRqCg==
+ dependencies:
+ "@babel/parser" "^7.23.5"
+ "@vue/compiler-core" "3.3.11"
+ "@vue/shared" "3.3.11"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.5"
+
+"@vue/reactivity@3.3.11":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.11.tgz#91f8e6c9ac60a595a5278c836b197628fd947a0d"
+ integrity sha512-D5tcw091f0nuu+hXq5XANofD0OXnBmaRqMYl5B3fCR+mX+cXJIGNw/VNawBqkjLNWETrFW0i+xH9NvDbTPVh7g==
+ dependencies:
+ "@vue/shared" "3.3.11"
+
+"@vue/runtime-core@3.3.11":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.11.tgz#63defba57bc54c1dac68a95b56c2633b1419193d"
+ integrity sha512-g9ztHGwEbS5RyWaOpXuyIVFTschclnwhqEbdy5AwGhYOgc7m/q3NFwr50MirZwTTzX55JY8pSkeib9BX04NIpw==
+ dependencies:
+ "@vue/reactivity" "3.3.11"
+ "@vue/shared" "3.3.11"
+
+"@vue/runtime-dom@3.3.11":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.11.tgz#1146d8d280b0fec4d2e18c4a4c8f8121d0cecc09"
+ integrity sha512-OlhtV1PVpbgk+I2zl+Y5rQtDNcCDs12rsRg71XwaA2/Rbllw6mBLMi57VOn8G0AjOJ4Mdb4k56V37+g8ukShpQ==
+ dependencies:
+ "@vue/runtime-core" "3.3.11"
+ "@vue/shared" "3.3.11"
+ csstype "^3.1.2"
+
+"@vue/server-renderer@3.3.11":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.11.tgz#409aed8031a125791e2143552975ecd1958ad601"
+ integrity sha512-AIWk0VwwxCAm4wqtJyxBylRTXSy1wCLOKbWxHaHiu14wjsNYtiRCSgVuqEPVuDpErOlRdNnuRgipQfXRLjLN5A==
+ dependencies:
+ "@vue/compiler-ssr" "3.3.11"
+ "@vue/shared" "3.3.11"
+
+"@vue/shared@3.3.11", "@vue/shared@^3.3.0":
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.11.tgz#f6a038e15237edefcc90dbfe7edb806dd355c7bd"
+ integrity sha512-u2G8ZQ9IhMWTMXaWqZycnK4UthG1fA238CD+DP4Dm4WJi5hdUKKLg0RMRaRpDPNMdkTwIDkp7WtD0Rd9BH9fLw==
+
+"@vue/tsconfig@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz#f01e2f6089b5098136fb084a0dd0cdd4533b72b0"
+ integrity sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==
+
+"@vuepress/markdown@^1.8.2":
+ version "1.9.10"
+ resolved "https://registry.npmmirror.com/@vuepress/markdown/-/markdown-1.9.10.tgz#63df6c6137e2d6bac2d03b5911e4326484761ba7"
+ integrity sha512-sXTLjeZzH8SQuAL5AEH0hhsMljjNJbzWbBvzaj5yQCCdf+3sp/dJ0kwnBSnQjFPPnzPg5t3tLKGUYHyW0KiKzA==
+ dependencies:
+ "@vuepress/shared-utils" "1.9.10"
+ markdown-it "^8.4.1"
+ markdown-it-anchor "^5.0.2"
+ markdown-it-chain "^1.3.0"
+ markdown-it-emoji "^1.4.0"
+ markdown-it-table-of-contents "^0.4.0"
+ prismjs "^1.13.0"
+
+"@vuepress/shared-utils@1.9.10":
+ version "1.9.10"
+ resolved "https://registry.npmmirror.com/@vuepress/shared-utils/-/shared-utils-1.9.10.tgz#45aae7fcf07a2067fb340c71e5bd96837b48dfee"
+ integrity sha512-M9A3DocPih+V8dKK2Zg9FJQ/f3JZrYsdaM/vQ9F48l8bPlzxw5NvqXIYMK4kKcGEyerQNTWCudoCpLL5uiU0hg==
+ dependencies:
+ chalk "^2.3.2"
+ escape-html "^1.0.3"
+ fs-extra "^7.0.1"
+ globby "^9.2.0"
+ gray-matter "^4.0.1"
+ hash-sum "^1.0.2"
+ semver "^6.0.0"
+ toml "^3.0.0"
+ upath "^1.1.0"
+
+"@vueup/vue-quill@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/@vueup/vue-quill/-/vue-quill-1.2.0.tgz#cd0d93559256d069f639723dd91c044e8162c72a"
+ integrity sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==
+ dependencies:
+ quill "^1.3.7"
+ quill-delta "^4.2.2"
+
+"@vueuse/core@^10.7.0":
+ version "10.7.0"
+ resolved "https://registry.npmmirror.com/@vueuse/core/-/core-10.7.0.tgz#34f2f02f179dc0dcffc2be70d6b1233e011404b9"
+ integrity sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==
+ dependencies:
+ "@types/web-bluetooth" "^0.0.20"
+ "@vueuse/metadata" "10.7.0"
+ "@vueuse/shared" "10.7.0"
+ vue-demi ">=0.14.6"
+
+"@vueuse/metadata@10.7.0":
+ version "10.7.0"
+ resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.7.0.tgz#7b05e6cfd376aa9bb339a81e16a89c12f3e88c03"
+ integrity sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==
+
+"@vueuse/shared@10.7.0":
+ version "10.7.0"
+ resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.7.0.tgz#21e425cc5ede421e0cda38ac59a0beee6da86b1b"
+ integrity sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==
+ dependencies:
+ vue-demi ">=0.14.6"
+
+"@xmldom/xmldom@^0.8.8":
+ version "0.8.10"
+ resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
+ integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.9.0:
+ version "8.11.2"
+ resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b"
+ integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ajv-keywords@^3.4.1:
+ version "3.5.2"
+ resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ 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"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+app-builder-bin@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0"
+ integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==
+
+app-builder-lib@23.6.0:
+ version "23.6.0"
+ resolved "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-23.6.0.tgz#03cade02838c077db99d86212d61c5fc1d6da1a8"
+ integrity sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA==
+ dependencies:
+ "7zip-bin" "~5.1.1"
+ "@develar/schema-utils" "~2.6.5"
+ "@electron/universal" "1.2.1"
+ "@malept/flatpak-bundler" "^0.4.0"
+ async-exit-hook "^2.0.1"
+ bluebird-lst "^1.0.9"
+ builder-util "23.6.0"
+ builder-util-runtime "9.1.1"
+ chromium-pickle-js "^0.2.0"
+ debug "^4.3.4"
+ ejs "^3.1.7"
+ electron-osx-sign "^0.6.0"
+ electron-publish "23.6.0"
+ form-data "^4.0.0"
+ fs-extra "^10.1.0"
+ hosted-git-info "^4.1.0"
+ is-ci "^3.0.0"
+ isbinaryfile "^4.0.10"
+ js-yaml "^4.1.0"
+ lazy-val "^1.0.5"
+ minimatch "^3.1.2"
+ read-config-file "6.2.0"
+ sanitize-filename "^1.6.3"
+ semver "^7.3.7"
+ tar "^6.1.11"
+ temp-file "^3.4.0"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
+
+array-union@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==
+
+asar@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221"
+ integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==
+ dependencies:
+ chromium-pickle-js "^0.2.0"
+ commander "^5.0.0"
+ glob "^7.1.6"
+ minimatch "^3.0.4"
+ optionalDependencies:
+ "@types/glob" "^7.1.1"
+
+assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async-exit-hook@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3"
+ integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==
+
+async-validator@^4.2.5:
+ version "4.2.5"
+ resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
+ integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
+
+async@^3.2.3:
+ version "3.2.5"
+ resolved "https://registry.npmmirror.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66"
+ integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+axios@^0.25.0:
+ version "0.25.0"
+ resolved "https://registry.npmmirror.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a"
+ integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==
+ dependencies:
+ follow-redirects "^1.14.7"
+
+axios@^1.6.2:
+ version "1.6.2"
+ resolved "https://registry.npmmirror.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2"
+ integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==
+ dependencies:
+ follow-redirects "^1.15.0"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base64-js@^1.3.1, base64-js@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.npmmirror.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big-integer@^1.6.44:
+ version "1.6.52"
+ resolved "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85"
+ integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==
+
+bluebird-lst@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.npmmirror.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c"
+ integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==
+ dependencies:
+ bluebird "^3.5.5"
+
+bluebird@^3.5.0, bluebird@^3.5.5:
+ version "3.7.2"
+ resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+boolean@^3.0.1:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
+ integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
+
+bplist-parser@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e"
+ integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==
+ dependencies:
+ big-integer "^1.6.44"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+braces@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.22.2:
+ version "4.22.2"
+ resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b"
+ integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==
+ dependencies:
+ caniuse-lite "^1.0.30001565"
+ electron-to-chromium "^1.4.601"
+ node-releases "^2.0.14"
+ update-browserslist-db "^1.0.13"
+
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer-equal@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
+ integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==
+
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer@^5.1.0:
+ version "5.7.1"
+ resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+builder-util-runtime@9.1.1:
+ version "9.1.1"
+ resolved "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz#2da7b34e78a64ad14ccd070d6eed4662d893bd60"
+ integrity sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==
+ dependencies:
+ debug "^4.3.4"
+ sax "^1.2.4"
+
+builder-util@23.6.0:
+ version "23.6.0"
+ resolved "https://registry.npmmirror.com/builder-util/-/builder-util-23.6.0.tgz#1880ec6da7da3fd6fa19b8bd71df7f39e8d17dd9"
+ integrity sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ==
+ dependencies:
+ "7zip-bin" "~5.1.1"
+ "@types/debug" "^4.1.6"
+ "@types/fs-extra" "^9.0.11"
+ app-builder-bin "4.0.0"
+ bluebird-lst "^1.0.9"
+ builder-util-runtime "9.1.1"
+ chalk "^4.1.1"
+ cross-spawn "^7.0.3"
+ debug "^4.3.4"
+ fs-extra "^10.0.0"
+ http-proxy-agent "^5.0.0"
+ https-proxy-agent "^5.0.0"
+ is-ci "^3.0.0"
+ js-yaml "^4.1.0"
+ source-map-support "^0.5.19"
+ stat-mode "^1.0.0"
+ temp-file "^3.4.0"
+
+bundle-name@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a"
+ integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==
+ dependencies:
+ run-applescript "^5.0.0"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
+call-bind@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
+ integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
+ dependencies:
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.1"
+ set-function-length "^1.1.1"
+
+call-me-maybe@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa"
+ integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001565:
+ version "1.0.30001570"
+ resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz#b4e5c1fa786f733ab78fc70f592df6b3f23244ca"
+ integrity sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==
+
+chalk@^2.3.2, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+character-entities@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22"
+ integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chromium-pickle-js@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
+ integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==
+
+ci-info@^3.2.0:
+ version "3.9.0"
+ resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+ integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cli-truncate@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
+ integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
+ dependencies:
+ slice-ansi "^3.0.0"
+ string-width "^4.2.0"
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+clone-response@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3"
+ integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==
+ dependencies:
+ mimic-response "^1.0.0"
+
+clone@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
+
+codemirror@^5.61.1:
+ version "5.65.16"
+ resolved "https://registry.npmmirror.com/codemirror/-/codemirror-5.65.16.tgz#efc0661be6bf4988a6a1c2fe6893294638cdb334"
+ integrity sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+ integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@2.9.0:
+ version "2.9.0"
+ resolved "https://registry.npmmirror.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+ integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==
+ dependencies:
+ graceful-readlink ">= 1.0.0"
+
+commander@7:
+ version "7.2.0"
+ resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+commander@^2.20.3:
+ version "2.20.3"
+ resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+ integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+
+commander@^8.0.0:
+ version "8.3.0"
+ resolved "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+
+compare-version@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
+ integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==
+
+component-emitter@^1.2.1:
+ version "1.3.1"
+ resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
+ integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
+
+computeds@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz#215b08a4ba3e08a11ff6eee5d6d8d7166a97ce2e"
+ integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+concat-stream@^1.6.2:
+ version "1.6.2"
+ resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+concurrently@^7.3.0:
+ version "7.6.0"
+ resolved "https://registry.npmmirror.com/concurrently/-/concurrently-7.6.0.tgz#531a6f5f30cf616f355a4afb8f8fcb2bba65a49a"
+ integrity sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==
+ dependencies:
+ chalk "^4.1.0"
+ date-fns "^2.29.1"
+ lodash "^4.17.21"
+ rxjs "^7.0.0"
+ shell-quote "^1.7.3"
+ spawn-command "^0.0.2-1"
+ supports-color "^8.1.0"
+ tree-kill "^1.2.2"
+ yargs "^17.3.1"
+
+config-chain@^1.1.11:
+ version "1.1.13"
+ resolved "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
+ integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+copy-anything@^2.0.1:
+ version "2.0.6"
+ resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480"
+ integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==
+ dependencies:
+ is-what "^3.14.1"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==
+
+copy-to-clipboard@^3.3.1:
+ version "3.3.3"
+ resolved "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0"
+ integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==
+ dependencies:
+ toggle-selection "^1.0.6"
+
+core-util-is@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cose-base@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a"
+ integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==
+ dependencies:
+ layout-base "^1.0.0"
+
+cose-base@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmmirror.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01"
+ integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==
+ dependencies:
+ layout-base "^2.0.0"
+
+crc@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
+ integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==
+ dependencies:
+ buffer "^5.1.0"
+
+cross-env@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
+ integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
+ dependencies:
+ cross-spawn "^7.0.1"
+
+cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-render@^0.15.10, css-render@^0.15.12:
+ version "0.15.12"
+ resolved "https://registry.npmmirror.com/css-render/-/css-render-0.15.12.tgz#76be94066897bd3231a9b9412971ffc258ada66e"
+ integrity sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==
+ dependencies:
+ "@emotion/hash" "~0.8.0"
+ csstype "~3.0.5"
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssfilter@0.0.10:
+ version "0.0.10"
+ resolved "https://registry.npmmirror.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae"
+ integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==
+
+csstype@^3.1.2:
+ version "3.1.3"
+ resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+csstype@~3.0.5:
+ version "3.0.11"
+ resolved "https://registry.npmmirror.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33"
+ integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==
+
+cytoscape-cose-bilkent@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmmirror.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b"
+ integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==
+ dependencies:
+ cose-base "^1.0.0"
+
+cytoscape-fcose@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.npmmirror.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471"
+ integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==
+ dependencies:
+ cose-base "^2.2.0"
+
+cytoscape@^3.23.0:
+ version "3.28.0"
+ resolved "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.28.0.tgz#ba9398b514eea2db66d56ec43b7f22a9e9a60082"
+ integrity sha512-x7+BHQXN90Audv5xXvdOECmiKuZdeKeoqOmDuYoht4zDKSdObC0Z9AdJXFkXEQvXU8UndI6WnTz47TRI7duReg==
+ dependencies:
+ heap "^0.2.6"
+ lodash "^4.17.21"
+
+"d3-array@1 - 2":
+ version "2.12.1"
+ resolved "https://registry.npmmirror.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81"
+ integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==
+ dependencies:
+ internmap "^1.0.0"
+
+"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0:
+ version "3.2.4"
+ resolved "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5"
+ integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
+ dependencies:
+ internmap "1 - 2"
+
+d3-axis@3:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322"
+ integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==
+
+d3-brush@3:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c"
+ integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-drag "2 - 3"
+ d3-interpolate "1 - 3"
+ d3-selection "3"
+ d3-transition "3"
+
+d3-chord@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966"
+ integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==
+ dependencies:
+ d3-path "1 - 3"
+
+"d3-color@1 - 3", d3-color@3:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
+ integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
+
+d3-contour@4:
+ version "4.0.2"
+ resolved "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc"
+ integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==
+ dependencies:
+ d3-array "^3.2.0"
+
+d3-delaunay@6:
+ version "6.0.4"
+ resolved "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b"
+ integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==
+ dependencies:
+ delaunator "5"
+
+"d3-dispatch@1 - 3", d3-dispatch@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e"
+ integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
+
+"d3-drag@2 - 3", d3-drag@3:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba"
+ integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-selection "3"
+
+"d3-dsv@1 - 3", d3-dsv@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73"
+ integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==
+ dependencies:
+ commander "7"
+ iconv-lite "0.6"
+ rw "1"
+
+"d3-ease@1 - 3", d3-ease@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
+ integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
+
+d3-fetch@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22"
+ integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==
+ dependencies:
+ d3-dsv "1 - 3"
+
+d3-force@3:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4"
+ integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-quadtree "1 - 3"
+ d3-timer "1 - 3"
+
+"d3-format@1 - 3", d3-format@3:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641"
+ integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
+
+d3-geo@3:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e"
+ integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==
+ dependencies:
+ d3-array "2.5.0 - 3"
+
+d3-hierarchy@3:
+ version "3.1.2"
+ resolved "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6"
+ integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==
+
+"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
+ integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
+ dependencies:
+ d3-color "1 - 3"
+
+d3-path@1:
+ version "1.0.9"
+ resolved "https://registry.npmmirror.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
+ integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
+
+"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
+ integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
+
+d3-polygon@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398"
+ integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==
+
+"d3-quadtree@1 - 3", d3-quadtree@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f"
+ integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
+
+d3-random@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4"
+ integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==
+
+d3-sankey@^0.12.3:
+ version "0.12.3"
+ resolved "https://registry.npmmirror.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d"
+ integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==
+ dependencies:
+ d3-array "1 - 2"
+ d3-shape "^1.2.0"
+
+d3-scale-chromatic@3:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a"
+ integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==
+ dependencies:
+ d3-color "1 - 3"
+ d3-interpolate "1 - 3"
+
+d3-scale@4:
+ version "4.0.2"
+ resolved "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
+ integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
+ dependencies:
+ d3-array "2.10.0 - 3"
+ d3-format "1 - 3"
+ d3-interpolate "1.2.0 - 3"
+ d3-time "2.1.1 - 3"
+ d3-time-format "2 - 4"
+
+"d3-selection@2 - 3", d3-selection@3:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31"
+ integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
+
+d3-shape@3:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
+ integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
+ dependencies:
+ d3-path "^3.1.0"
+
+d3-shape@^1.2.0:
+ version "1.3.7"
+ resolved "https://registry.npmmirror.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
+ integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
+ dependencies:
+ d3-path "1"
+
+"d3-time-format@2 - 4", d3-time-format@4:
+ version "4.1.0"
+ resolved "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
+ integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
+ dependencies:
+ d3-time "1 - 3"
+
+"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
+ integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
+ dependencies:
+ d3-array "2 - 3"
+
+"d3-timer@1 - 3", d3-timer@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
+ integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
+
+"d3-transition@2 - 3", d3-transition@3:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f"
+ integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==
+ dependencies:
+ d3-color "1 - 3"
+ d3-dispatch "1 - 3"
+ d3-ease "1 - 3"
+ d3-interpolate "1 - 3"
+ d3-timer "1 - 3"
+
+d3-zoom@3:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3"
+ integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-drag "2 - 3"
+ d3-interpolate "1 - 3"
+ d3-selection "2 - 3"
+ d3-transition "2 - 3"
+
+d3@^7.4.0, d3@^7.8.2:
+ version "7.8.5"
+ resolved "https://registry.npmmirror.com/d3/-/d3-7.8.5.tgz#fde4b760d4486cdb6f0cc8e2cbff318af844635c"
+ integrity sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==
+ dependencies:
+ d3-array "3"
+ d3-axis "3"
+ d3-brush "3"
+ d3-chord "3"
+ d3-color "3"
+ d3-contour "4"
+ d3-delaunay "6"
+ d3-dispatch "3"
+ d3-drag "3"
+ d3-dsv "3"
+ d3-ease "3"
+ d3-fetch "3"
+ d3-force "3"
+ d3-format "3"
+ d3-geo "3"
+ d3-hierarchy "3"
+ d3-interpolate "3"
+ d3-path "3"
+ d3-polygon "3"
+ d3-quadtree "3"
+ d3-random "3"
+ d3-scale "4"
+ d3-scale-chromatic "3"
+ d3-selection "3"
+ d3-shape "3"
+ d3-time "3"
+ d3-time-format "4"
+ d3-timer "3"
+ d3-transition "3"
+ d3-zoom "3"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dagre-d3-es@7.0.10:
+ version "7.0.10"
+ resolved "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc"
+ integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==
+ dependencies:
+ d3 "^7.8.2"
+ lodash-es "^4.17.21"
+
+danmu.js@>=1.1.6:
+ version "1.1.13"
+ resolved "https://registry.npmmirror.com/danmu.js/-/danmu.js-1.1.13.tgz#615aa3099c662605018724d966b1967c65d7a48b"
+ integrity sha512-knFd0/cB2HA4FFWiA7eB2suc5vCvoHdqio33FyyCSfP7C+1A+zQcTvnvwfxaZhrxsGj4qaQI2I8XiTqedRaVmg==
+ dependencies:
+ event-emitter "^0.3.5"
+
+date-fns-tz@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/date-fns-tz/-/date-fns-tz-2.0.0.tgz#1b14c386cb8bc16fc56fe333d4fc34ae1d1099d5"
+ integrity sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==
+
+date-fns@^2.29.1, date-fns@^2.30.0:
+ version "2.30.0"
+ resolved "https://registry.npmmirror.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0"
+ integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+
+dayjs@^1.11.7:
+ version "1.11.10"
+ resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0"
+ integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==
+
+de-indent@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+ integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
+
+debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+decode-named-character-reference@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e"
+ integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==
+ dependencies:
+ character-entities "^2.0.0"
+
+decode-uri-component@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+ integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
+
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==
+ dependencies:
+ mimic-response "^1.0.0"
+
+deep-equal@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761"
+ integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==
+ dependencies:
+ is-arguments "^1.1.1"
+ is-date-object "^1.0.5"
+ is-regex "^1.1.4"
+ object-is "^1.1.5"
+ object-keys "^1.1.1"
+ regexp.prototype.flags "^1.5.1"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
+ integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==
+
+default-browser-id@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c"
+ integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==
+ dependencies:
+ bplist-parser "^0.2.0"
+ untildify "^4.0.0"
+
+default-browser@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da"
+ integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==
+ dependencies:
+ bundle-name "^3.0.0"
+ default-browser-id "^3.0.0"
+ execa "^7.1.1"
+ titleize "^3.0.0"
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+define-data-property@^1.0.1, define-data-property@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3"
+ integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
+ dependencies:
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+define-lazy-prop@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
+ integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
+
+define-properties@^1.1.3, define-properties@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delaunator@5:
+ version "5.0.0"
+ resolved "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b"
+ integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==
+ dependencies:
+ robust-predicates "^3.0.0"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+delegate@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
+ integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==
+
+dequal@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
+ integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+
+detect-node@^2.0.4:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
+ integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
+
+diff@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.npmmirror.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40"
+ integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==
+
+dir-compare@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.npmmirror.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631"
+ integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==
+ dependencies:
+ buffer-equal "1.0.0"
+ colors "1.0.3"
+ commander "2.9.0"
+ minimatch "3.0.4"
+
+dir-glob@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
+ integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+ dependencies:
+ path-type "^3.0.0"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+dmg-builder@23.6.0:
+ version "23.6.0"
+ resolved "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-23.6.0.tgz#d39d3871bce996f16c07d2cafe922d6ecbb2a948"
+ integrity sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==
+ dependencies:
+ app-builder-lib "23.6.0"
+ builder-util "23.6.0"
+ builder-util-runtime "9.1.1"
+ fs-extra "^10.0.0"
+ iconv-lite "^0.6.2"
+ js-yaml "^4.1.0"
+ optionalDependencies:
+ dmg-license "^1.0.11"
+
+dmg-license@^1.0.11:
+ version "1.0.11"
+ resolved "https://registry.npmmirror.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a"
+ integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==
+ dependencies:
+ "@types/plist" "^3.0.1"
+ "@types/verror" "^1.10.3"
+ ajv "^6.10.0"
+ crc "^3.8.0"
+ iconv-corefoundation "^1.1.7"
+ plist "^3.0.4"
+ smart-buffer "^4.0.2"
+ verror "^1.10.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dompurify@^3.0.5:
+ version "3.0.6"
+ resolved "https://registry.npmmirror.com/dompurify/-/dompurify-3.0.6.tgz#925ebd576d54a9531b5d76f0a5bef32548351dae"
+ integrity sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==
+
+dotenv-expand@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
+ integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
+
+dotenv@^9.0.2:
+ version "9.0.2"
+ resolved "https://registry.npmmirror.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05"
+ integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==
+
+downloadjs@1.4.7:
+ version "1.4.7"
+ resolved "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz#f69f96f940e0d0553dac291139865a3cd0101e3c"
+ integrity sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==
+
+duplexer3@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e"
+ integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==
+
+ejs@^3.1.7:
+ version "3.1.9"
+ resolved "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361"
+ integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==
+ dependencies:
+ jake "^10.8.5"
+
+electron-builder@^23.6.0:
+ version "23.6.0"
+ resolved "https://registry.npmmirror.com/electron-builder/-/electron-builder-23.6.0.tgz#c79050cbdce90ed96c5feb67c34e9e0a21b5331b"
+ integrity sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw==
+ dependencies:
+ "@types/yargs" "^17.0.1"
+ app-builder-lib "23.6.0"
+ builder-util "23.6.0"
+ builder-util-runtime "9.1.1"
+ chalk "^4.1.1"
+ dmg-builder "23.6.0"
+ fs-extra "^10.0.0"
+ is-ci "^3.0.0"
+ lazy-val "^1.0.5"
+ read-config-file "6.2.0"
+ simple-update-notifier "^1.0.7"
+ yargs "^17.5.1"
+
+electron-osx-sign@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmmirror.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8"
+ integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg==
+ dependencies:
+ bluebird "^3.5.0"
+ compare-version "^0.1.2"
+ debug "^2.6.8"
+ isbinaryfile "^3.0.2"
+ minimist "^1.2.0"
+ plist "^3.0.1"
+
+electron-publish@23.6.0:
+ version "23.6.0"
+ resolved "https://registry.npmmirror.com/electron-publish/-/electron-publish-23.6.0.tgz#ac9b469e0b07752eb89357dd660e5fb10b3d1ce9"
+ integrity sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg==
+ dependencies:
+ "@types/fs-extra" "^9.0.11"
+ builder-util "23.6.0"
+ builder-util-runtime "9.1.1"
+ chalk "^4.1.1"
+ fs-extra "^10.0.0"
+ lazy-val "^1.0.5"
+ mime "^2.5.2"
+
+electron-to-chromium@^1.4.601:
+ version "1.4.611"
+ resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.611.tgz#92d3a8f03110fbf5f99b054da97825f994fa480a"
+ integrity sha512-ZtRpDxrjHapOwxtv+nuth5ByB8clyn8crVynmRNGO3wG3LOp8RTcyZDqwaI6Ng6y8FCK2hVZmJoqwCskKbNMaw==
+
+electron@^19.1.9:
+ version "19.1.9"
+ resolved "https://registry.npmmirror.com/electron/-/electron-19.1.9.tgz#01995eea4014f7cdb2f616f5f3492d4ed6f5e4f0"
+ integrity sha512-XT5LkTzIHB+ZtD3dTmNnKjVBWrDWReCKt9G1uAFLz6uJMEVcIUiYO+fph5pLXETiBw/QZBx8egduMEfIccLx+g==
+ dependencies:
+ "@electron/get" "^1.14.1"
+ "@types/node" "^16.11.26"
+ extract-zip "^1.0.3"
+
+elkjs@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.npmmirror.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e"
+ integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+entities@~1.1.1:
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
+ integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+errno@^0.1.1:
+ version "0.1.8"
+ resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14:
+ version "0.10.62"
+ resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
+ integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
+ dependencies:
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.3"
+ next-tick "^1.1.0"
+
+es6-error@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+ integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
+
+es6-iterator@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+esbuild@^0.18.10:
+ version "0.18.20"
+ resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6"
+ integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.18.20"
+ "@esbuild/android-arm64" "0.18.20"
+ "@esbuild/android-x64" "0.18.20"
+ "@esbuild/darwin-arm64" "0.18.20"
+ "@esbuild/darwin-x64" "0.18.20"
+ "@esbuild/freebsd-arm64" "0.18.20"
+ "@esbuild/freebsd-x64" "0.18.20"
+ "@esbuild/linux-arm" "0.18.20"
+ "@esbuild/linux-arm64" "0.18.20"
+ "@esbuild/linux-ia32" "0.18.20"
+ "@esbuild/linux-loong64" "0.18.20"
+ "@esbuild/linux-mips64el" "0.18.20"
+ "@esbuild/linux-ppc64" "0.18.20"
+ "@esbuild/linux-riscv64" "0.18.20"
+ "@esbuild/linux-s390x" "0.18.20"
+ "@esbuild/linux-x64" "0.18.20"
+ "@esbuild/netbsd-x64" "0.18.20"
+ "@esbuild/openbsd-x64" "0.18.20"
+ "@esbuild/sunos-x64" "0.18.20"
+ "@esbuild/win32-arm64" "0.18.20"
+ "@esbuild/win32-ia32" "0.18.20"
+ "@esbuild/win32-x64" "0.18.20"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-prettier@^8.8.0:
+ version "8.10.0"
+ resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11"
+ integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==
+
+eslint-config-prettier@^9.0.0:
+ version "9.1.0"
+ resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f"
+ integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
+
+eslint-plugin-prettier@^5.0.0, eslint-plugin-prettier@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz#a3b399f04378f79f066379f544e42d6b73f11515"
+ integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==
+ dependencies:
+ prettier-linter-helpers "^1.0.0"
+ synckit "^0.8.5"
+
+eslint-plugin-vue@^9.17.0:
+ version "9.19.2"
+ resolved "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz#7ab83a001a1ac8bccae013c5b9cb5d2c644fb376"
+ integrity sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ natural-compare "^1.4.0"
+ nth-check "^2.1.1"
+ postcss-selector-parser "^6.0.13"
+ semver "^7.5.4"
+ vue-eslint-parser "^9.3.1"
+ xml-name-validator "^4.0.0"
+
+eslint-scope@^7.1.1, eslint-scope@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
+ integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint@^8.49.0:
+ version "8.55.0"
+ resolved "https://registry.npmmirror.com/eslint/-/eslint-8.55.0.tgz#078cb7b847d66f2c254ea1794fa395bf8e7e03f8"
+ integrity sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.6.1"
+ "@eslint/eslintrc" "^2.1.4"
+ "@eslint/js" "8.55.0"
+ "@humanwhocodes/config-array" "^0.11.13"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ "@ungap/structured-clone" "^1.2.0"
+ ajv "^6.12.4"
+ 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.2"
+ eslint-visitor-keys "^3.4.3"
+ espree "^9.6.1"
+ 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"
+ 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"
+ text-table "^0.2.0"
+
+espree@^9.3.1, espree@^9.6.0, espree@^9.6.1:
+ version "9.6.1"
+ resolved "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+ dependencies:
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.4.0, esquery@^1.4.2:
+ version "1.5.0"
+ resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+ integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+estree-walker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+event-emitter@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+eventemitter3@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
+ integrity sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==
+
+eventemitter3@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+evtd@^0.2.2, evtd@^0.2.4:
+ version "0.2.4"
+ resolved "https://registry.npmmirror.com/evtd/-/evtd-0.2.4.tgz#0aac39ba44d6926e6668948ac27618e0795b9d07"
+ integrity sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+execa@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.npmmirror.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9"
+ integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.1"
+ human-signals "^4.3.0"
+ is-stream "^3.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^5.1.0"
+ onetime "^6.0.0"
+ signal-exit "^3.0.7"
+ strip-final-newline "^3.0.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+ext@^1.1.2:
+ version "1.7.0"
+ resolved "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
+ integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+ dependencies:
+ type "^2.7.2"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extract-zip@^1.0.3:
+ version "1.7.0"
+ resolved "https://registry.npmmirror.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927"
+ integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==
+ dependencies:
+ concat-stream "^1.6.2"
+ debug "^2.6.9"
+ mkdirp "^0.5.4"
+ yauzl "^2.10.0"
+
+extsprintf@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
+ integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154"
+ integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==
+
+fast-diff@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
+ integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+
+fast-diff@^1.1.2:
+ version "1.3.0"
+ resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
+ integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
+
+fast-glob@^2.2.6:
+ version "2.2.7"
+ resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
+ integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+ dependencies:
+ "@mrmlnc/readdir-enhanced" "^2.2.1"
+ "@nodelib/fs.stat" "^1.1.2"
+ glob-parent "^3.1.0"
+ is-glob "^4.0.0"
+ merge2 "^1.2.3"
+ micromatch "^3.1.10"
+
+fast-glob@^3.2.9, fast-glob@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ 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"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastq@^1.6.0:
+ version "1.15.0"
+ resolved "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
+ integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
+ dependencies:
+ reusify "^1.0.4"
+
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
+ dependencies:
+ pend "~1.2.0"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+filelist@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
+ integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
+ dependencies:
+ minimatch "^5.0.1"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.3"
+ rimraf "^3.0.2"
+
+flatted@^3.2.9:
+ version "3.2.9"
+ resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf"
+ integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==
+
+follow-redirects@^1.14.7, follow-redirects@^1.15.0:
+ version "1.15.3"
+ resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a"
+ integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==
+ dependencies:
+ map-cache "^0.2.2"
+
+fs-extra@^10.0.0, fs-extra@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+ integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.0.0, fs-extra@^9.0.1:
+ version "9.1.0"
+ resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"
+ integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
+ dependencies:
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^6.0.0, get-stream@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob-parent@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob-to-regexp@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+ integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==
+
+glob@^7.1.3, glob@^7.1.6:
+ version "7.2.3"
+ resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ 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"
+
+global-agent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
+ integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==
+ dependencies:
+ boolean "^3.0.1"
+ es6-error "^4.1.1"
+ matcher "^3.0.0"
+ roarr "^2.15.3"
+ semver "^7.3.2"
+ serialize-error "^7.0.1"
+
+global-tunnel-ng@^2.7.1:
+ version "2.7.1"
+ resolved "https://registry.npmmirror.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f"
+ integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==
+ dependencies:
+ encodeurl "^1.0.2"
+ lodash "^4.17.10"
+ npm-conf "^1.1.3"
+ tunnel "^0.0.6"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^13.19.0:
+ version "13.24.0"
+ resolved "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+ dependencies:
+ type-fest "^0.20.2"
+
+globalthis@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+ integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ 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"
+
+globby@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.npmmirror.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
+ integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ array-union "^1.0.2"
+ dir-glob "^2.2.2"
+ fast-glob "^2.2.6"
+ glob "^7.1.3"
+ ignore "^4.0.3"
+ pify "^4.0.1"
+ slash "^2.0.0"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+got@^9.6.0:
+ version "9.6.0"
+ resolved "https://registry.npmmirror.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.11"
+ resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+"graceful-readlink@>= 1.0.0":
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+ integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+gray-matter@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798"
+ integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==
+ dependencies:
+ js-yaml "^3.13.1"
+ kind-of "^6.0.2"
+ section-matter "^1.0.0"
+ strip-bom-string "^1.0.0"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340"
+ integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+hash-sum@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+ integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==
+
+hasown@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
+ integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
+ dependencies:
+ function-bind "^1.1.2"
+
+he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+heap@^0.2.6:
+ version "0.2.7"
+ resolved "https://registry.npmmirror.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc"
+ integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==
+
+highlight.js@^10.7.2:
+ version "10.7.3"
+ resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
+ integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
+
+highlight.js@^11.5.0, highlight.js@^11.8.0:
+ version "11.9.0"
+ resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.9.0.tgz#04ab9ee43b52a41a047432c8103e2158a1b8b5b0"
+ integrity sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==
+
+hosted-git-info@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224"
+ integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+hosted-git-info@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322"
+ integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==
+ dependencies:
+ lru-cache "^10.0.1"
+
+html-tags@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce"
+ integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==
+
+http-cache-semantics@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
+ integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
+
+http-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
+ integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
+ dependencies:
+ "@tootallnate/once" "2"
+ agent-base "6"
+ debug "4"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+human-signals@^4.3.0:
+ version "4.3.1"
+ resolved "https://registry.npmmirror.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
+ integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
+
+iconv-corefoundation@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a"
+ integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==
+ dependencies:
+ cli-truncate "^2.1.0"
+ node-addon-api "^1.6.3"
+
+iconv-lite@0.6, iconv-lite@^0.6.2, iconv-lite@^0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore@^4.0.3:
+ version "4.0.6"
+ resolved "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+ignore@^5.2.0, ignore@^5.2.4:
+ version "5.3.0"
+ resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78"
+ integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==
+
+image-size@~0.5.0:
+ version "0.5.5"
+ resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+ integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.4:
+ version "1.3.8"
+ resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+insert-text-at-cursor@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmmirror.com/insert-text-at-cursor/-/insert-text-at-cursor-0.3.0.tgz#1819607680ec1570618347c4cd475e791faa25da"
+ integrity sha512-/nPtyeX9xPUvxZf+r0518B7uqNKlP+LqNJqSiXFEaa2T71rWIwTVXGH7hB9xO/EVdwa5/pWlFCPwShOW81XIxQ==
+
+"internmap@1 - 2":
+ version "2.0.3"
+ resolved "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
+ integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
+
+internmap@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95"
+ integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==
+
+is-accessor-descriptor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4"
+ integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==
+ dependencies:
+ hasown "^2.0.0"
+
+is-arguments@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-ci@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867"
+ integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==
+ dependencies:
+ ci-info "^3.2.0"
+
+is-core-module@^2.8.1:
+ version "2.13.1"
+ resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
+ integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+ dependencies:
+ hasown "^2.0.0"
+
+is-data-descriptor@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb"
+ integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==
+ dependencies:
+ hasown "^2.0.0"
+
+is-date-object@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.7"
+ resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33"
+ integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==
+ dependencies:
+ is-accessor-descriptor "^1.0.1"
+ is-data-descriptor "^1.0.1"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306"
+ integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==
+ dependencies:
+ is-accessor-descriptor "^1.0.1"
+ is-data-descriptor "^1.0.1"
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-docker@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
+ integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-inside-container@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
+ integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
+ dependencies:
+ is-docker "^3.0.0"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
+ integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+
+is-what@^3.14.1:
+ version "3.14.1"
+ resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
+ integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isbinaryfile@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
+ integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==
+ dependencies:
+ buffer-alloc "^1.2.0"
+
+isbinaryfile@^4.0.10:
+ version "4.0.10"
+ resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3"
+ integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+jake@^10.8.5:
+ version "10.8.7"
+ resolved "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f"
+ integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==
+ dependencies:
+ async "^3.2.3"
+ chalk "^4.0.2"
+ filelist "^1.0.4"
+ minimatch "^3.1.2"
+
+javascript-stringify@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
+ integrity sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==
+
+joi@^17.6.0:
+ version "17.11.0"
+ resolved "https://registry.npmmirror.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a"
+ integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==
+ dependencies:
+ "@hapi/hoek" "^9.0.0"
+ "@hapi/topo" "^5.0.0"
+ "@sideway/address" "^4.1.3"
+ "@sideway/formula" "^3.0.1"
+ "@sideway/pinpoint" "^2.0.0"
+
+js-audio-recorder@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmmirror.com/js-audio-recorder/-/js-audio-recorder-1.0.7.tgz#01501cb9eb143d57994b42bd5ae97974fda18908"
+ integrity sha512-JiDODCElVHGrFyjGYwYyNi7zCbKk9va9C77w+zCPMmi4C6ix7zsX2h3ddHugmo4dOTOTCym9++b/wVW9nC0IaA==
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-even-better-errors@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0"
+ integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json-stringify-safe@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+json5@^2.2.0, json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+katex@^0.13.11:
+ version "0.13.24"
+ resolved "https://registry.npmmirror.com/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905"
+ integrity sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==
+ dependencies:
+ commander "^8.0.0"
+
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
+keyv@^4.5.3:
+ version "4.5.4"
+ resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+khroma@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1"
+ integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+kleur@^4.0.3:
+ version "4.1.5"
+ resolved "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780"
+ integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==
+
+layout-base@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2"
+ integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==
+
+layout-base@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285"
+ integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==
+
+lazy-val@^1.0.4, lazy-val@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
+ integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
+
+less-loader@^11.1.3:
+ version "11.1.3"
+ resolved "https://registry.npmmirror.com/less-loader/-/less-loader-11.1.3.tgz#1bb62d6ca9bf00a177c02793b54baac40f9be694"
+ integrity sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==
+
+less@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmmirror.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450"
+ integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==
+ dependencies:
+ copy-anything "^2.0.1"
+ parse-node-version "^1.0.1"
+ tslib "^2.3.0"
+ optionalDependencies:
+ errno "^0.1.1"
+ graceful-fs "^4.1.2"
+ image-size "~0.5.0"
+ make-dir "^2.1.0"
+ mime "^1.4.1"
+ needle "^3.1.0"
+ source-map "~0.6.0"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lines-and-columns@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42"
+ integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==
+
+linkify-it@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmmirror.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf"
+ integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==
+ dependencies:
+ uc.micro "^1.0.1"
+
+linkify-it@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
+ integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
+ dependencies:
+ uc.micro "^1.0.1"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash-es@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+ integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+lodash.clonedeep@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+ integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@^10.0.1:
+ version "10.1.0"
+ resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484"
+ integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+magic-string@^0.30.5:
+ version "0.30.5"
+ resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9"
+ integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
+make-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==
+ dependencies:
+ object-visit "^1.0.0"
+
+markdown-it-anchor@^5.0.2:
+ version "5.3.0"
+ resolved "https://registry.npmmirror.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744"
+ integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==
+
+markdown-it-attrs@^4.0.0:
+ version "4.1.6"
+ resolved "https://registry.npmmirror.com/markdown-it-attrs/-/markdown-it-attrs-4.1.6.tgz#2bc331c7649d8c6396a0613c2bba1093f3e64da9"
+ integrity sha512-O7PDKZlN8RFMyDX13JnctQompwrrILuz2y43pW2GagcwpIIElkAdfeek+erHfxUOlXWPsjFeWmZ8ch1xtRLWpA==
+
+markdown-it-chain@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmmirror.com/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz#ccf6fe86c10266bafb4e547380dfd7f277cc17bc"
+ integrity sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==
+ dependencies:
+ webpack-chain "^4.9.0"
+
+markdown-it-container@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/markdown-it-container/-/markdown-it-container-3.0.0.tgz#1d19b06040a020f9a827577bb7dbf67aa5de9a5b"
+ integrity sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==
+
+markdown-it-emoji@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmmirror.com/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz#9bee0e9a990a963ba96df6980c4fddb05dfb4dcc"
+ integrity sha512-QCz3Hkd+r5gDYtS2xsFXmBYrgw6KuWcJZLCEkdfAuwzZbShCmCfta+hwAMq4NX/4xPzkSHduMKgMkkPUJxSXNg==
+
+markdown-it-table-of-contents@^0.4.0:
+ version "0.4.4"
+ resolved "https://registry.npmmirror.com/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz#3dc7ce8b8fc17e5981c77cc398d1782319f37fbc"
+ integrity sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==
+
+markdown-it@^12.3.2:
+ version "12.3.2"
+ resolved "https://registry.npmmirror.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90"
+ integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==
+ dependencies:
+ argparse "^2.0.1"
+ entities "~2.1.0"
+ linkify-it "^3.0.1"
+ mdurl "^1.0.1"
+ uc.micro "^1.0.5"
+
+markdown-it@^8.4.1:
+ version "8.4.2"
+ resolved "https://registry.npmmirror.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54"
+ integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==
+ dependencies:
+ argparse "^1.0.7"
+ entities "~1.1.1"
+ linkify-it "^2.0.0"
+ mdurl "^1.0.1"
+ uc.micro "^1.0.5"
+
+matcher@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
+ integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
+ dependencies:
+ escape-string-regexp "^4.0.0"
+
+mdast-util-from-markdown@^1.3.0:
+ version "1.3.1"
+ resolved "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0"
+ integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ decode-named-character-reference "^1.0.0"
+ mdast-util-to-string "^3.1.0"
+ micromark "^3.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-decode-string "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ unist-util-stringify-position "^3.0.0"
+ uvu "^0.5.0"
+
+mdast-util-to-string@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789"
+ integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+
+mdurl@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
+ integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+mermaid@^10.6.1:
+ version "10.6.1"
+ resolved "https://registry.npmmirror.com/mermaid/-/mermaid-10.6.1.tgz#701f4160484137a417770ce757ce1887a98c00fc"
+ integrity sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==
+ dependencies:
+ "@braintree/sanitize-url" "^6.0.1"
+ "@types/d3-scale" "^4.0.3"
+ "@types/d3-scale-chromatic" "^3.0.0"
+ cytoscape "^3.23.0"
+ cytoscape-cose-bilkent "^4.1.0"
+ cytoscape-fcose "^2.1.0"
+ d3 "^7.4.0"
+ d3-sankey "^0.12.3"
+ dagre-d3-es "7.0.10"
+ dayjs "^1.11.7"
+ dompurify "^3.0.5"
+ elkjs "^0.8.2"
+ khroma "^2.0.0"
+ lodash-es "^4.17.21"
+ mdast-util-from-markdown "^1.3.0"
+ non-layered-tidy-tree-layout "^2.0.2"
+ stylis "^4.1.3"
+ ts-dedent "^2.2.0"
+ uuid "^9.0.0"
+ web-worker "^1.2.0"
+
+micromark-core-commonmark@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8"
+ integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==
+ dependencies:
+ decode-named-character-reference "^1.0.0"
+ micromark-factory-destination "^1.0.0"
+ micromark-factory-label "^1.0.0"
+ micromark-factory-space "^1.0.0"
+ micromark-factory-title "^1.0.0"
+ micromark-factory-whitespace "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-chunked "^1.0.0"
+ micromark-util-classify-character "^1.0.0"
+ micromark-util-html-tag-name "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-resolve-all "^1.0.0"
+ micromark-util-subtokenize "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.1"
+ uvu "^0.5.0"
+
+micromark-factory-destination@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f"
+ integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-label@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68"
+ integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ uvu "^0.5.0"
+
+micromark-factory-space@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf"
+ integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-title@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1"
+ integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==
+ dependencies:
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-whitespace@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705"
+ integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==
+ dependencies:
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-character@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc"
+ integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-chunked@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b"
+ integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-classify-character@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d"
+ integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-combine-extensions@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84"
+ integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==
+ dependencies:
+ micromark-util-chunked "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-decode-numeric-character-reference@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6"
+ integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-decode-string@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c"
+ integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==
+ dependencies:
+ decode-named-character-reference "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5"
+ integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==
+
+micromark-util-html-tag-name@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588"
+ integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==
+
+micromark-util-normalize-identifier@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7"
+ integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-resolve-all@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188"
+ integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==
+ dependencies:
+ micromark-util-types "^1.0.0"
+
+micromark-util-sanitize-uri@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d"
+ integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-encode "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-subtokenize@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1"
+ integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==
+ dependencies:
+ micromark-util-chunked "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ uvu "^0.5.0"
+
+micromark-util-symbol@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142"
+ integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==
+
+micromark-util-types@^1.0.0, micromark-util-types@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283"
+ integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==
+
+micromark@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9"
+ integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==
+ dependencies:
+ "@types/debug" "^4.0.0"
+ debug "^4.0.0"
+ decode-named-character-reference "^1.0.0"
+ micromark-core-commonmark "^1.0.1"
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-chunked "^1.0.0"
+ micromark-util-combine-extensions "^1.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-encode "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-resolve-all "^1.0.0"
+ micromark-util-sanitize-uri "^1.0.0"
+ micromark-util-subtokenize "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.1"
+ uvu "^0.5.0"
+
+micromatch@^3.1.10:
+ version "3.1.10"
+ resolved "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mime@^2.5.2:
+ version "2.6.0"
+ resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+ integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+minimatch@3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^5.0.1:
+ version "5.1.6"
+ resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@^9.0.0, minimatch@^9.0.3:
+ version "9.0.3"
+ resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
+ integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@^3.0.0:
+ version "3.3.6"
+ resolved "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+ integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+ dependencies:
+ yallist "^4.0.0"
+
+minipass@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
+ integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+
+minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mitt@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/mitt/-/mitt-2.1.0.tgz#f740577c23176c6205b121b2973514eade1b2230"
+ integrity sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.4:
+ version "0.5.6"
+ resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+mkdirp@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mri@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
+ integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+muggle-string@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz#e524312eb1728c63dd0b2ac49e3282e6ed85963a"
+ integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==
+
+naive-ui@^2.35.0:
+ version "2.35.0"
+ resolved "https://registry.npmmirror.com/naive-ui/-/naive-ui-2.35.0.tgz#fe1fc2404694b4114486fa31e609e35714e8ed25"
+ integrity sha512-PdnLpOip1LQaKs5+rXLZoPDPQkTq26TnHWeABvUA2eOQjtHxE4+TQvj0Jq/W8clM2On/7jptoGmenLt48G3Bhg==
+ dependencies:
+ "@css-render/plugin-bem" "^0.15.12"
+ "@css-render/vue3-ssr" "^0.15.12"
+ "@types/katex" "^0.16.2"
+ "@types/lodash" "^4.14.198"
+ "@types/lodash-es" "^4.17.9"
+ async-validator "^4.2.5"
+ css-render "^0.15.12"
+ date-fns "^2.30.0"
+ date-fns-tz "^2.0.0"
+ evtd "^0.2.4"
+ highlight.js "^11.8.0"
+ lodash "^4.17.21"
+ lodash-es "^4.17.21"
+ seemly "^0.3.6"
+ treemate "^0.3.11"
+ vdirs "^0.1.8"
+ vooks "^0.2.12"
+ vueuc "^0.4.51"
+
+nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+needle@^3.1.0:
+ version "3.3.1"
+ resolved "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049"
+ integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==
+ dependencies:
+ iconv-lite "^0.6.3"
+ sax "^1.2.4"
+
+next-tick@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+ integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+node-addon-api@^1.6.3:
+ version "1.7.2"
+ resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d"
+ integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==
+
+node-releases@^2.0.14:
+ version "2.0.14"
+ resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
+ integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+
+non-layered-tidy-tree-layout@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmmirror.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804"
+ integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==
+
+normalize-package-data@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196"
+ integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==
+ dependencies:
+ hosted-git-info "^7.0.0"
+ is-core-module "^2.8.1"
+ semver "^7.3.5"
+ validate-npm-package-license "^3.0.4"
+
+normalize-url@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+npm-conf@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmmirror.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
+ integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
+ dependencies:
+ config-chain "^1.1.11"
+ pify "^3.0.0"
+
+npm-run-all2@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.npmmirror.com/npm-run-all2/-/npm-run-all2-6.1.1.tgz#afb58a18a4de1e226b2f4b5b44aaef0782ed81ce"
+ integrity sha512-lWLbkPZ5BSdXtN8lR+0rc8caKoPdymycpZksyDEC9MOBvfdwTXZ0uVhb7bMcGeXv2/BKtfQuo6Zn3zfc8rxNXA==
+ dependencies:
+ ansi-styles "^6.2.1"
+ cross-spawn "^7.0.3"
+ memorystream "^0.3.1"
+ minimatch "^9.0.0"
+ pidtree "^0.6.0"
+ read-pkg "^8.0.0"
+ shell-quote "^1.7.3"
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+npm-run-path@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
+ integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
+ dependencies:
+ path-key "^4.0.0"
+
+nth-check@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+ integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+ dependencies:
+ boolbase "^1.0.0"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-is@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==
+ dependencies:
+ isobject "^3.0.0"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+onetime@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
+ integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
+ dependencies:
+ mimic-fn "^4.0.0"
+
+open@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.npmmirror.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6"
+ integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==
+ dependencies:
+ default-browser "^4.0.0"
+ define-lazy-prop "^3.0.0"
+ is-inside-container "^1.0.0"
+ is-wsl "^2.2.0"
+
+optionator@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
+ integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
+ 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"
+
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+parchment@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz#aeded7ab938fe921d4c34bc339ce1168bc2ffde5"
+ integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^7.0.0:
+ version "7.1.1"
+ resolved "https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz#68f7e6f0edf88c54ab14c00eb700b753b14e2120"
+ integrity sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==
+ dependencies:
+ "@babel/code-frame" "^7.21.4"
+ error-ex "^1.3.2"
+ json-parse-even-better-errors "^3.0.0"
+ lines-and-columns "^2.0.3"
+ type-fest "^3.8.0"
+
+parse-node-version@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
+ integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==
+
+path-browserify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-key@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
+ integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+
+path-type@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+ integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+ dependencies:
+ pify "^3.0.0"
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pidtree@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c"
+ integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinia-plugin-persistedstate@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.0.tgz#9932ca2ae88aa6c0d6763bebc6447d7bd1f097d0"
+ integrity sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==
+
+pinia@^2.1.7:
+ version "2.1.7"
+ resolved "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz#4cf5420d9324ca00b7b4984d3fbf693222115bbc"
+ integrity sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==
+ dependencies:
+ "@vue/devtools-api" "^6.5.0"
+ vue-demi ">=0.14.5"
+
+plist@^3.0.1, plist@^3.0.4:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9"
+ integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==
+ dependencies:
+ "@xmldom/xmldom" "^0.8.8"
+ base64-js "^1.5.1"
+ xmlbuilder "^15.1.1"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
+
+postcss-selector-parser@^6.0.13:
+ version "6.0.13"
+ resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b"
+ integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss@^8.4.27, postcss@^8.4.32:
+ version "8.4.32"
+ resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9"
+ integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==
+
+prettier-linter-helpers@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
+ integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+ dependencies:
+ fast-diff "^1.1.2"
+
+prettier@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmmirror.com/prettier/-/prettier-3.1.1.tgz#6ba9f23165d690b6cbdaa88cb0807278f7019848"
+ integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==
+
+prismjs@^1.13.0, prismjs@^1.23.0:
+ version "1.29.0"
+ resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12"
+ integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+ integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+quill-delta@^3.6.2:
+ version "3.6.3"
+ resolved "https://registry.npmmirror.com/quill-delta/-/quill-delta-3.6.3.tgz#b19fd2b89412301c60e1ff213d8d860eac0f1032"
+ integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==
+ dependencies:
+ deep-equal "^1.0.1"
+ extend "^3.0.2"
+ fast-diff "1.1.2"
+
+quill-delta@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.npmmirror.com/quill-delta/-/quill-delta-4.2.2.tgz#015397d046e0a3bed087cd8a51f98c11a1b8f351"
+ integrity sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==
+ dependencies:
+ fast-diff "1.2.0"
+ lodash.clonedeep "^4.5.0"
+ lodash.isequal "^4.5.0"
+
+quill-image-uploader@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmmirror.com/quill-image-uploader/-/quill-image-uploader-1.3.0.tgz#cf5396e3bf792c350c946be2e592eea2a0b14c8f"
+ integrity sha512-vO43GEn93rGThje/MlotkQE9OV5nOKBZ4oKhn71L/EjrM/J2P/8iDDVd9GEwlsGsbskeJqPLopsSQ4HlVVIn6A==
+
+quill-mention@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmmirror.com/quill-mention/-/quill-mention-4.1.0.tgz#275f8e39d0d44930973700f79d0b4afcbf74b4b2"
+ integrity sha512-dT8HLYeuGU8yjjUr5SgdOusFSqQ7FQt/DWefz4V/L2omJsZ9CVYWepg3GyqV/evNDV7LQtfM7cadxtYD2bi2ew==
+ dependencies:
+ quill "^1.3.7"
+
+quill@^1.3.7:
+ version "1.3.7"
+ resolved "https://registry.npmmirror.com/quill/-/quill-1.3.7.tgz#da5b2f3a2c470e932340cdbf3668c9f21f9286e8"
+ integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==
+ dependencies:
+ clone "^2.1.1"
+ deep-equal "^1.0.1"
+ eventemitter3 "^2.0.3"
+ extend "^3.0.2"
+ parchment "^1.1.4"
+ quill-delta "^3.6.2"
+
+read-config-file@6.2.0:
+ version "6.2.0"
+ resolved "https://registry.npmmirror.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade"
+ integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==
+ dependencies:
+ dotenv "^9.0.2"
+ dotenv-expand "^5.1.0"
+ js-yaml "^4.1.0"
+ json5 "^2.2.0"
+ lazy-val "^1.0.4"
+
+read-pkg@^8.0.0:
+ version "8.1.0"
+ resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-8.1.0.tgz#6cf560b91d90df68bce658527e7e3eee75f7c4c7"
+ integrity sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.1"
+ normalize-package-data "^6.0.0"
+ parse-json "^7.0.0"
+ type-fest "^4.2.0"
+
+readable-stream@^2.2.2:
+ version "2.3.8"
+ resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+ integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+regenerator-runtime@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
+ integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e"
+ integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ set-function-name "^2.0.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+resize-observer-polyfill@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+ integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
+
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==
+ dependencies:
+ lowercase-keys "^1.0.0"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.0, rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+roarr@^2.15.3:
+ version "2.15.4"
+ resolved "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
+ integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
+ dependencies:
+ boolean "^3.0.1"
+ detect-node "^2.0.4"
+ globalthis "^1.0.1"
+ json-stringify-safe "^5.0.1"
+ semver-compare "^1.0.0"
+ sprintf-js "^1.1.2"
+
+robust-predicates@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771"
+ integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==
+
+rollup@^3.27.1:
+ version "3.29.4"
+ resolved "https://registry.npmmirror.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981"
+ integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+run-applescript@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmmirror.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c"
+ integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==
+ dependencies:
+ execa "^5.0.0"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+rw@1:
+ version "1.3.3"
+ resolved "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
+ integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==
+
+rxjs@^7.0.0, rxjs@^7.5.4:
+ version "7.8.1"
+ resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
+ integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
+ dependencies:
+ tslib "^2.1.0"
+
+sade@^1.7.3:
+ version "1.8.1"
+ resolved "https://registry.npmmirror.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701"
+ integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==
+ dependencies:
+ mri "^1.1.0"
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sanitize-filename@^1.6.3:
+ version "1.6.3"
+ resolved "https://registry.npmmirror.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378"
+ integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==
+ dependencies:
+ truncate-utf8-bytes "^1.0.0"
+
+sax@^1.2.4:
+ version "1.3.0"
+ resolved "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0"
+ integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==
+
+section-matter@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167"
+ integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==
+ dependencies:
+ extend-shallow "^2.0.1"
+ kind-of "^6.0.0"
+
+seemly@^0.3.6:
+ version "0.3.7"
+ resolved "https://registry.npmmirror.com/seemly/-/seemly-0.3.7.tgz#6c461e320f2257c536b793814bac893e44fbe1c4"
+ integrity sha512-3KtXoeQzmcjtOZqkOs82+AsdhKybu14x4VeTy0iCRvVKHinMSsv63aGidDJpAqWoLSLJUM220Wi8gPfRLKZoTg==
+
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+ integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
+
+semver@^5.6.0:
+ version "5.7.2"
+ resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.0.0, semver@^6.2.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.2, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.5.4:
+ version "7.5.4"
+ resolved "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+semver@~7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+serialize-error@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
+ integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
+ dependencies:
+ type-fest "^0.13.1"
+
+set-function-length@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
+ integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
+ dependencies:
+ define-data-property "^1.1.1"
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+set-function-name@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
+ integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
+ dependencies:
+ define-data-property "^1.0.1"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.0"
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@^1.7.3:
+ version "1.8.1"
+ resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
+ integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+
+signal-exit@^3.0.3, signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+simple-update-notifier@^1.0.7:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82"
+ integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==
+ dependencies:
+ semver "~7.0.0"
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
+ integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+smart-buffer@^4.0.2:
+ version "4.2.0"
+ resolved "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+sortablejs@1.14.0:
+ version "1.14.0"
+ resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8"
+ integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.5.19:
+ version "0.5.21"
+ resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+source-map@^0.6.0, source-map@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spawn-command@^0.0.2-1:
+ version "0.0.2-1"
+ resolved "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
+ integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==
+
+spdx-correct@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
+ integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.16"
+ resolved "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f"
+ integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
+ integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stat-mode@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465"
+ integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
+ integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-final-newline@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
+ integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+stylis@^4.1.3:
+ version "4.3.0"
+ resolved "https://registry.npmmirror.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c"
+ integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==
+
+sumchecker@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
+ integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
+ dependencies:
+ debug "^4.1.0"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+svg-tags@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+ integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
+
+synckit@^0.8.5:
+ version "0.8.6"
+ resolved "https://registry.npmmirror.com/synckit/-/synckit-0.8.6.tgz#b69b7fbce3917c2673cbdc0d87fb324db4a5b409"
+ integrity sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==
+ dependencies:
+ "@pkgr/utils" "^2.4.2"
+ tslib "^2.6.2"
+
+tar@^6.1.11:
+ version "6.2.0"
+ resolved "https://registry.npmmirror.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73"
+ integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^5.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+temp-file@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.npmmirror.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7"
+ integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==
+ dependencies:
+ async-exit-hook "^2.0.1"
+ fs-extra "^10.0.0"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+titleize@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53"
+ integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==
+
+tmp-promise@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7"
+ integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==
+ dependencies:
+ tmp "^0.2.0"
+
+tmp@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.npmmirror.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
+ integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
+ dependencies:
+ rimraf "^3.0.0"
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==
+ dependencies:
+ kind-of "^3.0.2"
+
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toggle-selection@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+ integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
+
+toml@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee"
+ integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==
+
+tree-kill@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+ integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+
+treemate@^0.3.11:
+ version "0.3.11"
+ resolved "https://registry.npmmirror.com/treemate/-/treemate-0.3.11.tgz#7d52f8f69ab9ce326f8d139e0a3d1ffb25e48222"
+ integrity sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==
+
+truncate-utf8-bytes@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
+ integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==
+ dependencies:
+ utf8-byte-length "^1.0.1"
+
+ts-api-utils@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331"
+ integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==
+
+ts-dedent@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5"
+ integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==
+
+tslib@^2.1.0, tslib@^2.3.0, tslib@^2.6.0, tslib@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
+ integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+
+tunnel@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.npmmirror.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
+ integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
+ integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^3.8.0:
+ version "3.13.1"
+ resolved "https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706"
+ integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==
+
+type-fest@^4.2.0:
+ version "4.8.3"
+ resolved "https://registry.npmmirror.com/type-fest/-/type-fest-4.8.3.tgz#6db08d9f44d596cd953f83020c7c56310c368d1c"
+ integrity sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.7.2:
+ version "2.7.2"
+ resolved "https://registry.npmmirror.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
+ integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
+
+typescript@~5.2.0:
+ version "5.2.2"
+ resolved "https://registry.npmmirror.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
+ integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
+
+uc.micro@^1.0.1, uc.micro@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.npmmirror.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
+ integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+unist-util-stringify-position@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d"
+ integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+untildify@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
+ integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
+
+upath@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+update-browserslist-db@^1.0.13:
+ version "1.0.13"
+ resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
+ integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==
+
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==
+ dependencies:
+ prepend-http "^2.0.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmmirror.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+utf8-byte-length@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.npmmirror.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
+ integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==
+
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+uuid@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
+ integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
+
+uvu@^0.5.0:
+ version "0.5.6"
+ resolved "https://registry.npmmirror.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df"
+ integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==
+ dependencies:
+ dequal "^2.0.0"
+ diff "^5.0.0"
+ kleur "^4.0.3"
+ sade "^1.7.3"
+
+validate-npm-package-license@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vant@^3.1.3:
+ version "3.6.12"
+ resolved "https://registry.npmmirror.com/vant/-/vant-3.6.12.tgz#a46045c74961744f27d5a6ffbc3bed592f0f4d0b"
+ integrity sha512-fLzwhpV0ZPQqxrTx6RU8mJVUqP7DSkpdXNeByKubp+O9vKYGcWRX9wFdEwApyy7qLZLLu+rU1Jw52d6lktPL4w==
+ dependencies:
+ "@vant/icons" "^1.8.0"
+ "@vant/popperjs" "^1.2.1"
+ "@vant/use" "^1.4.2"
+
+vdirs@^0.1.4, vdirs@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.npmmirror.com/vdirs/-/vdirs-0.1.8.tgz#a103bc43baca738f8dea912a7e9737154a19dbc2"
+ integrity sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==
+ dependencies:
+ evtd "^0.2.2"
+
+verror@^1.10.0:
+ version "1.10.1"
+ resolved "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb"
+ integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vite-plugin-compression@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.npmmirror.com/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz#a75b0d8f48357ebb377b65016da9f20885ef39b6"
+ integrity sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==
+ dependencies:
+ chalk "^4.1.2"
+ debug "^4.3.3"
+ fs-extra "^10.0.0"
+
+vite@^4.5.1:
+ version "4.5.1"
+ resolved "https://registry.npmmirror.com/vite/-/vite-4.5.1.tgz#3370986e1ed5dbabbf35a6c2e1fb1e18555b968a"
+ integrity sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==
+ dependencies:
+ esbuild "^0.18.10"
+ postcss "^8.4.27"
+ rollup "^3.27.1"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+vooks@^0.2.12, vooks@^0.2.4:
+ version "0.2.12"
+ resolved "https://registry.npmmirror.com/vooks/-/vooks-0.2.12.tgz#2b6e23330b77bac81c7f7a344c4ca3e9f4f6c373"
+ integrity sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==
+ dependencies:
+ evtd "^0.2.2"
+
+vue-cropper@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmmirror.com/vue-cropper/-/vue-cropper-1.1.1.tgz#e1d2729f7139182a893e8badcb8f33257aa2a40f"
+ integrity sha512-WsqKMpaBf9Osi1LQlE/5AKdD0nHWOy1asLXocaG8NomOWO07jiZi968+/PbMmnD0QbPJOumDQaGuGa13qys85A==
+
+vue-demi@>=0.14.5, vue-demi@>=0.14.6:
+ version "0.14.6"
+ resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz#dc706582851dc1cdc17a0054f4fec2eb6df74c92"
+ integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==
+
+vue-eslint-parser@^9.3.1:
+ version "9.3.2"
+ resolved "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz#6f9638e55703f1c77875a19026347548d93fd499"
+ integrity sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==
+ dependencies:
+ debug "^4.3.4"
+ eslint-scope "^7.1.1"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.1"
+ esquery "^1.4.0"
+ lodash "^4.17.21"
+ semver "^7.3.6"
+
+vue-observe-visibility@^2.0.0-alpha.1:
+ version "2.0.0-alpha.1"
+ resolved "https://registry.npmmirror.com/vue-observe-visibility/-/vue-observe-visibility-2.0.0-alpha.1.tgz#1e4eda7b12562161d58984b7e0dea676d83bdb13"
+ integrity sha512-flFbp/gs9pZniXR6fans8smv1kDScJ8RS7rEpMjhVabiKeq7Qz3D9+eGsypncjfIyyU84saU88XZ0zjbD6Gq/g==
+
+vue-resize@^2.0.0-alpha.1:
+ version "2.0.0-alpha.1"
+ resolved "https://registry.npmmirror.com/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz#43eeb79e74febe932b9b20c5c57e0ebc14e2df3a"
+ integrity sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==
+
+vue-router@^4.2.5:
+ version "4.2.5"
+ resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.5.tgz#b9e3e08f1bd9ea363fdd173032620bc50cf0e98a"
+ integrity sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==
+ dependencies:
+ "@vue/devtools-api" "^6.5.0"
+
+vue-template-compiler@^2.7.14:
+ version "2.7.15"
+ resolved "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz#ec88ba8ceafe0f17a528b89c57e01e02da92b0de"
+ integrity sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==
+ dependencies:
+ de-indent "^1.0.2"
+ he "^1.2.0"
+
+vue-tsc@^1.8.25:
+ version "1.8.25"
+ resolved "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.25.tgz#90cd03e71d28c5c4a8068167b232eb97cc96b77f"
+ integrity sha512-lHsRhDc/Y7LINvYhZ3pv4elflFADoEOo67vfClAfF2heVHpHmVquLSjojgCSIwzA4F0Pc4vowT/psXCYcfk+iQ==
+ dependencies:
+ "@volar/typescript" "~1.11.1"
+ "@vue/language-core" "1.8.25"
+ semver "^7.5.4"
+
+vue-virtual-scroller@^2.0.0-beta.8:
+ version "2.0.0-beta.8"
+ resolved "https://registry.npmmirror.com/vue-virtual-scroller/-/vue-virtual-scroller-2.0.0-beta.8.tgz#eeceda57e4faa5ba1763994c873923e2a956898b"
+ integrity sha512-b8/f5NQ5nIEBRTNi6GcPItE4s7kxNHw2AIHLtDp+2QvqdTjVN0FgONwX9cr53jWRgnu+HRLPaWDOR2JPI5MTfQ==
+ dependencies:
+ mitt "^2.1.0"
+ vue-observe-visibility "^2.0.0-alpha.1"
+ vue-resize "^2.0.0-alpha.1"
+
+vue@*, vue@^3.3.11:
+ version "3.3.11"
+ resolved "https://registry.npmmirror.com/vue/-/vue-3.3.11.tgz#898d97025f73cdb5fc4e3ae3fd07a54615232140"
+ integrity sha512-d4oBctG92CRO1cQfVBZp6WJAs0n8AK4Xf5fNjQCBeKCvMI1efGQ5E3Alt1slFJS9fZuPcFoiAiqFvQlv1X7t/w==
+ dependencies:
+ "@vue/compiler-dom" "3.3.11"
+ "@vue/compiler-sfc" "3.3.11"
+ "@vue/runtime-dom" "3.3.11"
+ "@vue/server-renderer" "3.3.11"
+ "@vue/shared" "3.3.11"
+
+vuedraggable@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz#edece68adb8a4d9e06accff9dfc9040e66852270"
+ integrity sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==
+ dependencies:
+ sortablejs "1.14.0"
+
+vueuc@^0.4.51:
+ version "0.4.51"
+ resolved "https://registry.npmmirror.com/vueuc/-/vueuc-0.4.51.tgz#35cd5364db4b71fc791a9823748711b91d910d49"
+ integrity sha512-pLiMChM4f+W8czlIClGvGBYo656lc2Y0/mXFSCydcSmnCR1izlKPGMgiYBGjbY9FDkFG8a2HEVz7t0DNzBWbDw==
+ dependencies:
+ "@css-render/vue3-ssr" "^0.15.10"
+ "@juggle/resize-observer" "^3.3.1"
+ css-render "^0.15.10"
+ evtd "^0.2.4"
+ seemly "^0.3.6"
+ vdirs "^0.1.4"
+ vooks "^0.2.4"
+
+wait-on@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmmirror.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e"
+ integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==
+ dependencies:
+ axios "^0.25.0"
+ joi "^17.6.0"
+ lodash "^4.17.21"
+ minimist "^1.2.5"
+ rxjs "^7.5.4"
+
+web-worker@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da"
+ integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==
+
+webpack-chain@^4.9.0:
+ version "4.12.1"
+ resolved "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-4.12.1.tgz#6c8439bbb2ab550952d60e1ea9319141906c02a6"
+ integrity sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==
+ dependencies:
+ deepmerge "^1.5.2"
+ javascript-stringify "^1.6.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+xgplayer-subtitles@3.0.10:
+ version "3.0.10"
+ resolved "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-3.0.10.tgz#5f47b199fe2b856fac58fa607c1dd9de1c28bc0e"
+ integrity sha512-zdpWLmQu2JhITDIEnV9LqtNMpPxOQf4zcwZ2yxVWjviPtb8CMPA0OBYJ/0uCvI5w2bBY6P7VKcr+r83FQ6PkeQ==
+ dependencies:
+ eventemitter3 "^4.0.7"
+
+xgplayer@^3.0.4:
+ version "3.0.10"
+ resolved "https://registry.npmmirror.com/xgplayer/-/xgplayer-3.0.10.tgz#9fca18716e1cf39787722c03174eae05cd225c90"
+ integrity sha512-lyqVKUOkMeTx9U1DXySHNso2vSfvt249nho+L5sDo+Mroa3dE9mOXJtMs2APG4xEUzj87SiKluh5ha9ytvUg1A==
+ dependencies:
+ danmu.js ">=1.1.6"
+ delegate "^3.2.0"
+ downloadjs "1.4.7"
+ eventemitter3 "^4.0.7"
+ xgplayer-subtitles "3.0.10"
+
+xml-name-validator@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
+ integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
+
+xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1:
+ version "15.1.1"
+ resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"
+ integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==
+
+xss@^1.0.9:
+ version "1.0.14"
+ resolved "https://registry.npmmirror.com/xss/-/xss-1.0.14.tgz#4f3efbde75ad0d82e9921cc3c95e6590dd336694"
+ integrity sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==
+ dependencies:
+ commander "^2.20.3"
+ cssfilter "0.0.10"
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.3.1, yargs@^17.5.1:
+ version "17.7.2"
+ resolved "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yauzl@^2.10.0:
+ version "2.10.0"
+ resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==