├── frontend ├── .env.development ├── .gitignore ├── .prettierrc ├── src │ ├── index.css │ ├── assets │ │ └── logo.png │ ├── components │ │ ├── Logo.vue │ │ ├── Loading.vue │ │ ├── Header.vue │ │ └── HelloWorld.vue │ ├── main.js │ ├── router.js │ ├── api │ │ └── index.js │ ├── App.vue │ └── views │ │ ├── index.vue │ │ └── login.vue ├── public │ └── favicon.ico ├── postcss.config.js ├── jsconfig.json ├── .editorconfig ├── tailwind.config.js ├── index.html ├── package.json └── vite.config.js ├── test.js ├── backend ├── static │ ├── favicon.ico │ ├── activity.json.gz │ ├── assets │ │ ├── logo.03d6d6da.png │ │ ├── index.1a8beb0e.js.gz │ │ ├── index.fcdd9895.css.gz │ │ ├── vendor.baa403e4.js.gz │ │ ├── element-icons.9c88a535.woff │ │ ├── element-icons.de5eb258.ttf │ │ └── index.fcdd9895.css │ ├── index.html │ └── activity.json ├── ecosystem.config.js ├── .env.example ├── package.json ├── ql.js ├── app.js ├── .gitignore ├── utils │ └── USER_AGENT.js ├── user.js ├── sendNotify.js └── pnpm-lock.yaml ├── README.md └── .gitignore /frontend/.env.development: -------------------------------------------------------------------------------- 1 | VITE_API_BASE_URL=http://localhost:5701/api -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | process.env.NOTIFY = false; 2 | console.log(process.env.NOTIFY || true) -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /backend/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/favicon.ico -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/frontend/src/assets/logo.png -------------------------------------------------------------------------------- /backend/static/activity.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/activity.json.gz -------------------------------------------------------------------------------- /backend/static/assets/logo.03d6d6da.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/logo.03d6d6da.png -------------------------------------------------------------------------------- /backend/static/assets/index.1a8beb0e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/index.1a8beb0e.js.gz -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /backend/static/assets/index.fcdd9895.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/index.fcdd9895.css.gz -------------------------------------------------------------------------------- /backend/static/assets/vendor.baa403e4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/vendor.baa403e4.js.gz -------------------------------------------------------------------------------- /backend/static/assets/element-icons.9c88a535.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/element-icons.9c88a535.woff -------------------------------------------------------------------------------- /backend/static/assets/element-icons.de5eb258.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oevery/ninja/HEAD/backend/static/assets/element-icons.de5eb258.ttf -------------------------------------------------------------------------------- /backend/ecosystem.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [ 3 | { 4 | name: 'ninja', 5 | script: './app.js', 6 | }, 7 | ], 8 | }; 9 | -------------------------------------------------------------------------------- /frontend/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["src/*"] 6 | } 7 | }, 8 | "exclude": ["node_modules", "dist"] 9 | } 10 | -------------------------------------------------------------------------------- /backend/.env.example: -------------------------------------------------------------------------------- 1 | # 是否允许添加账号 不允许添加时则只允许已有账号登录 2 | ALLOW_ADD=true 3 | 4 | #允许添加账号的最大数量 5 | ALLOW_NUM=40 6 | 7 | # Ninja 运行端口 8 | NINJA_PORT=5701 9 | 10 | # Ninja 是否发送通知 11 | NINJA_NOTIFY=true 12 | 13 | # user-agent 14 | # NINJA_UA="" 15 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /frontend/src/components/Logo.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | -------------------------------------------------------------------------------- /frontend/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], 3 | important: '#app', 4 | darkMode: false, // or 'media' or 'class' 5 | theme: { 6 | extend: {}, 7 | }, 8 | variants: { 9 | extend: {}, 10 | }, 11 | plugins: [], 12 | } 13 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Ninja 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.1.1", 3 | "scripts": { 4 | "dev": "nodemon app.js" 5 | }, 6 | "engines": { 7 | "node": ">=14" 8 | }, 9 | "dependencies": { 10 | "@koa/cors": "^3.1.0", 11 | "@koa/router": "^10.1.0", 12 | "axios": "^0.21.1", 13 | "dotenv": "^10.0.0", 14 | "got": "^11.8.2", 15 | "koa": "^2.13.1", 16 | "koa-body": "^4.2.0", 17 | "koa-log4": "^2.3.2", 18 | "koa-static": "^5.0.0", 19 | "nodemon": "^2.0.12", 20 | "qrcode": "^1.4.4" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /frontend/src/components/Loading.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /backend/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Ninja 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /frontend/src/main.js: -------------------------------------------------------------------------------- 1 | import { ElButton, ElInput, ElMessage } from 'element-plus' 2 | import 'element-plus/lib/theme-chalk/base.css' 3 | import { createApp } from 'vue' 4 | import App from './App.vue' 5 | import './index.css' 6 | import router from './router' 7 | 8 | const components = [ElButton, ElInput, ElMessage] 9 | const plugins = [ElMessage] 10 | 11 | const app = createApp(App) 12 | 13 | components.forEach((component) => { 14 | app.component(component.name, component) 15 | }) 16 | 17 | plugins.forEach((plugin) => { 18 | app.use(plugin) 19 | }) 20 | 21 | app.use(router) 22 | app.mount('#app') 23 | -------------------------------------------------------------------------------- /frontend/src/router.js: -------------------------------------------------------------------------------- 1 | import Index from '@/views/index.vue' 2 | import Login from '@/views/login.vue' 3 | import { createRouter, createWebHashHistory } from 'vue-router' 4 | 5 | const routes = [ 6 | { path: '/', component: Index }, 7 | { path: '/login', component: Login }, 8 | ] 9 | 10 | const router = createRouter({ 11 | history: createWebHashHistory(), 12 | routes, 13 | }) 14 | 15 | // router.beforeEach((to, from, next) => { 16 | // if (!localStorage.getItem('eid') && to.path !== '/login') 17 | // next({ path: '/login' }) 18 | // else next() 19 | // }) 20 | 21 | export default router 22 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.0", 3 | "scripts": { 4 | "dev": "vite", 5 | "build": "vite build", 6 | "serve": "vite preview" 7 | }, 8 | "dependencies": { 9 | "element-plus": "^1.0.2-beta.62", 10 | "ky": "^0.28.5", 11 | "vue": "^3.1.5", 12 | "vue-router": "^4.0.10" 13 | }, 14 | "devDependencies": { 15 | "@vitejs/plugin-vue": "^1.2.5", 16 | "@vue/compiler-sfc": "^3.1.5", 17 | "autoprefixer": "^10.3.1", 18 | "postcss": "^8.3.6", 19 | "tailwindcss": "^2.2.7", 20 | "vite": "^2.4.3", 21 | "vite-plugin-async-catch": "^0.1.7", 22 | "vite-plugin-style-import": "^1.0.1" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/components/Header.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | 21 | 29 | -------------------------------------------------------------------------------- /frontend/src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 28 | 29 | 34 | -------------------------------------------------------------------------------- /frontend/src/api/index.js: -------------------------------------------------------------------------------- 1 | import ky from 'ky' 2 | 3 | const VITE_API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api' 4 | 5 | const api = ky.create({ prefixUrl: VITE_API_BASE_URL, retry: { limit: 0 } }) 6 | 7 | export function getInfoAPI() { 8 | return api.get('info').json() 9 | } 10 | 11 | export function CKLoginAPI(body) { 12 | return api.post('cklogin', { json: body }).json() 13 | } 14 | 15 | export function getQrcodeAPI() { 16 | return api.get('qrcode').json() 17 | } 18 | 19 | export function checkLoginAPI(body) { 20 | return api.post('check', { json: body }).json() 21 | } 22 | 23 | export function getUserInfoAPI(eid) { 24 | const searchParams = new URLSearchParams() 25 | searchParams.set('eid', eid) 26 | return api.get('userinfo', { searchParams: searchParams }).json() 27 | } 28 | 29 | export function delAccountAPI(body) { 30 | return api.post('delaccount', { json: body }).json() 31 | } 32 | -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import vue from '@vitejs/plugin-vue' 2 | import path from 'path' 3 | import { defineConfig } from 'vite' 4 | import AsyncCatch from 'vite-plugin-async-catch' 5 | import styleImport from 'vite-plugin-style-import' 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | plugins: [ 10 | vue(), 11 | AsyncCatch({ catchCode: `console.error(e)` }), 12 | styleImport({ 13 | libs: [ 14 | { 15 | libraryName: 'element-plus', 16 | esModule: true, 17 | ensureStyleFile: true, 18 | resolveStyle: (name) => { 19 | return `element-plus/lib/theme-chalk/${name}.css` 20 | }, 21 | resolveComponent: (name) => { 22 | return `element-plus/lib/${name}` 23 | }, 24 | }, 25 | ], 26 | }), 27 | ], 28 | resolve: { 29 | alias: { 30 | '@': path.resolve(__dirname, 'src'), 31 | }, 32 | }, 33 | build: { 34 | outDir: '../backend/static', 35 | }, 36 | }) 37 | -------------------------------------------------------------------------------- /backend/static/activity.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "玩一玩(可找到大多数活动)", 4 | "address": "京东 APP 首页-频道-边玩边赚", 5 | "href": "https://funearth.m.jd.com/babelDiy/Zeus/3BB1rymVZUo4XmicATEUSDUgHZND/index.html" 6 | }, 7 | { 8 | "name": "宠汪汪", 9 | "address": "京东APP-首页/玩一玩/我的-宠汪汪" 10 | }, 11 | { 12 | "name": "东东萌宠", 13 | "address": "京东APP-首页/玩一玩/我的-东东萌宠" 14 | }, 15 | { 16 | "name": "东东农场", 17 | "address": "京东APP-首页/玩一玩/我的-东东农场" 18 | }, 19 | { 20 | "name": "东东工厂", 21 | "address": "京东APP-首页/玩一玩/我的-东东工厂" 22 | }, 23 | { 24 | "name": "东东超市", 25 | "address": "京东APP-首页/玩一玩/我的-东东超市" 26 | }, 27 | { 28 | "name": "领现金", 29 | "address": "京东APP-首页/玩一玩/我的-领现金" 30 | }, 31 | { 32 | "name": "东东健康社区", 33 | "address": "京东APP-首页/玩一玩/我的-东东健康社区" 34 | }, 35 | { 36 | "name": "京喜农场", 37 | "address": "京喜APP-我的-京喜农场" 38 | }, 39 | { 40 | "name": "京喜牧场", 41 | "address": "京喜APP-我的-京喜牧场" 42 | }, 43 | { 44 | "name": "京喜工厂", 45 | "address": "京喜APP-我的-京喜工厂" 46 | }, 47 | { 48 | "name": "京喜财富岛", 49 | "address": "京喜APP-我的-京喜财富岛" 50 | }, 51 | { 52 | "name": "京东极速版红包", 53 | "address": "京东极速版APP-我的-红包" 54 | } 55 | ] 56 | -------------------------------------------------------------------------------- /frontend/src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | 16 | -------------------------------------------------------------------------------- /backend/ql.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const got = require('got'); 4 | require('dotenv').config(); 5 | const { readFile } = require('fs/promises'); 6 | const path = require('path'); 7 | 8 | const qlDir = process.env.QL_DIR || '/ql'; 9 | const authFile = path.join(qlDir, 'config/auth.json'); 10 | 11 | const api = got.extend({ 12 | prefixUrl: process.env.QL_URL || 'http://localhost:5600', 13 | retry: { limit: 0 }, 14 | }); 15 | 16 | async function getToken() { 17 | const authConfig = JSON.parse(await readFile(authFile)); 18 | return authConfig.token; 19 | } 20 | 21 | module.exports.getEnvs = async () => { 22 | const token = await getToken(); 23 | const body = await api({ 24 | url: 'api/envs', 25 | searchParams: { 26 | searchValue: 'JD_COOKIE', 27 | t: Date.now(), 28 | }, 29 | headers: { 30 | Accept: 'application/json', 31 | authorization: `Bearer ${token}`, 32 | }, 33 | }).json(); 34 | return body.data; 35 | }; 36 | 37 | module.exports.getEnvsCount = async () => { 38 | const data = await this.getEnvs(); 39 | return data.length; 40 | }; 41 | 42 | module.exports.addEnv = async (cookie, remarks) => { 43 | const token = await getToken(); 44 | const body = await api({ 45 | method: 'post', 46 | url: 'api/envs', 47 | params: { t: Date.now() }, 48 | json: [{ 49 | name: 'JD_COOKIE', 50 | value: cookie, 51 | remarks, 52 | }], 53 | headers: { 54 | Accept: 'application/json', 55 | authorization: `Bearer ${token}`, 56 | 'Content-Type': 'application/json;charset=UTF-8', 57 | }, 58 | }).json(); 59 | return body; 60 | }; 61 | 62 | module.exports.updateEnv = async (cookie, eid, remarks) => { 63 | const token = await getToken(); 64 | const body = await api({ 65 | method: 'put', 66 | url: 'api/envs', 67 | params: { t: Date.now() }, 68 | json: { 69 | name: 'JD_COOKIE', 70 | value: cookie, 71 | _id: eid, 72 | remarks, 73 | }, 74 | headers: { 75 | Accept: 'application/json', 76 | authorization: `Bearer ${token}`, 77 | 'Content-Type': 'application/json;charset=UTF-8', 78 | }, 79 | }).json(); 80 | return body; 81 | }; 82 | 83 | module.exports.delEnv = async (eid) => { 84 | const token = await getToken(); 85 | const body = await api({ 86 | method: 'delete', 87 | url: 'api/envs', 88 | params: { t: Date.now() }, 89 | body: JSON.stringify([eid]), 90 | headers: { 91 | Accept: 'application/json', 92 | authorization: `Bearer ${token}`, 93 | 'Content-Type': 'application/json;charset=UTF-8', 94 | }, 95 | }).json(); 96 | return body; 97 | }; 98 | -------------------------------------------------------------------------------- /backend/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Koa = require('koa'); 4 | const cors = require('@koa/cors'); 5 | const Router = require('@koa/router'); 6 | const body = require('koa-body'); 7 | const serve = require('koa-static'); 8 | const User = require('./user'); 9 | const packageJson = require('./package.json'); 10 | 11 | // Create express instance 12 | const app = new Koa(); 13 | const router = new Router(); 14 | 15 | const handler = async (ctx, next) => { 16 | try { 17 | await next(); 18 | if (ctx.body?.data.message) { 19 | ctx.body.message = ctx.body.data.message; 20 | ctx.body.data.message = undefined; 21 | } 22 | } catch (err) { 23 | console.log(err); 24 | ctx.status = err.statusCode || err.status || 500; 25 | ctx.body = { 26 | code: err.status || err.statusCode || 500, 27 | message: err.message, 28 | }; 29 | } 30 | }; 31 | 32 | app.use(serve('static')); 33 | app.use(cors()); 34 | app.use(handler); 35 | app.use(router.routes()).use(router.allowedMethods()); 36 | 37 | router.get('/api/status', (ctx) => { 38 | ctx.body = { 39 | code: 200, 40 | data: { 41 | version: packageJson.version, 42 | }, 43 | message: 'Ninja is already.', 44 | }; 45 | }); 46 | 47 | router.get('/api/info', async (ctx) => { 48 | const data = await User.getPoolInfo(); 49 | ctx.body = { data }; 50 | }); 51 | 52 | router.get('/api/qrcode', async (ctx) => { 53 | const user = new User({}); 54 | await user.getQRConfig(); 55 | ctx.body = { 56 | data: { 57 | token: user.token, 58 | okl_token: user.okl_token, 59 | cookies: user.cookies, 60 | QRCode: user.QRCode, 61 | ua: user.ua, 62 | }, 63 | }; 64 | }); 65 | 66 | router.post('/api/check', body(), async (ctx) => { 67 | const body = ctx.request.body; 68 | const user = new User(body); 69 | const data = await user.checkQRLogin(); 70 | ctx.body = { data }; 71 | }); 72 | 73 | router.post('/api/cklogin', body(), async (ctx) => { 74 | const body = ctx.request.body; 75 | const user = new User(body); 76 | const data = await user.CKLogin(); 77 | ctx.body = { data }; 78 | }); 79 | 80 | router.get('/api/userinfo', async (ctx) => { 81 | const query = ctx.query; 82 | const eid = query.eid; 83 | const user = new User({ eid }); 84 | const data = await user.getUserInfoByEid(); 85 | ctx.body = { data }; 86 | }); 87 | 88 | router.post('/api/delaccount', body(), async (ctx) => { 89 | const body = ctx.request.body; 90 | const eid = body.eid; 91 | const user = new User({ eid }); 92 | const data = await user.delUserByEid(); 93 | ctx.body = { data }; 94 | }); 95 | 96 | router.post('/api/update/remark', body(), async (ctx) => { 97 | const body = ctx.request.body; 98 | const eid = body.eid; 99 | const remark = body.remark; 100 | const user = new User({ eid, remark }); 101 | const data = await user.updateRemark(); 102 | ctx.body = { data }; 103 | }); 104 | 105 | router.get('/api/users', async (ctx) => { 106 | if (ctx.host.startsWith('localhost')) { 107 | const data = await User.getUsers(); 108 | ctx.body = { data }; 109 | } else { 110 | ctx.body = { 111 | code: 401, 112 | message: '该接口仅能通过 localhost 访问', 113 | }; 114 | } 115 | }); 116 | 117 | const port = process.env.NINJA_PORT || 5701; 118 | console.log('Start Ninja success! listening port: ' + port); 119 | app.listen(port); 120 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,macos,linux 4 | 5 | ### Linux ### 6 | *~ 7 | 8 | # temporary files which can be created if a process still has a handle open of a deleted file 9 | .fuse_hidden* 10 | 11 | # KDE directory preferences 12 | .directory 13 | 14 | # Linux trash folder which might appear on any partition or disk 15 | .Trash-* 16 | 17 | # .nfs files are created when an open file is removed but is still being accessed 18 | .nfs* 19 | 20 | ### macOS ### 21 | # General 22 | .DS_Store 23 | .AppleDouble 24 | .LSOverride 25 | 26 | # Icon must end with two \r 27 | Icon 28 | 29 | 30 | # Thumbnails 31 | ._* 32 | 33 | # Files that might appear in the root of a volume 34 | .DocumentRevisions-V100 35 | .fseventsd 36 | .Spotlight-V100 37 | .TemporaryItems 38 | .Trashes 39 | .VolumeIcon.icns 40 | .com.apple.timemachine.donotpresent 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | 49 | ### Node ### 50 | # Logs 51 | logs 52 | *.log 53 | npm-debug.log* 54 | yarn-debug.log* 55 | yarn-error.log* 56 | lerna-debug.log* 57 | .pnpm-debug.log* 58 | 59 | # Diagnostic reports (https://nodejs.org/api/report.html) 60 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 61 | 62 | # Runtime data 63 | pids 64 | *.pid 65 | *.seed 66 | *.pid.lock 67 | 68 | # Directory for instrumented libs generated by jscoverage/JSCover 69 | lib-cov 70 | 71 | # Coverage directory used by tools like istanbul 72 | coverage 73 | *.lcov 74 | 75 | # nyc test coverage 76 | .nyc_output 77 | 78 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 79 | .grunt 80 | 81 | # Bower dependency directory (https://bower.io/) 82 | bower_components 83 | 84 | # node-waf configuration 85 | .lock-wscript 86 | 87 | # Compiled binary addons (https://nodejs.org/api/addons.html) 88 | build/Release 89 | 90 | # Dependency directories 91 | node_modules/ 92 | jspm_packages/ 93 | 94 | # Snowpack dependency directory (https://snowpack.dev/) 95 | web_modules/ 96 | 97 | # TypeScript cache 98 | *.tsbuildinfo 99 | 100 | # Optional npm cache directory 101 | .npm 102 | 103 | # Optional eslint cache 104 | .eslintcache 105 | 106 | # Microbundle cache 107 | .rpt2_cache/ 108 | .rts2_cache_cjs/ 109 | .rts2_cache_es/ 110 | .rts2_cache_umd/ 111 | 112 | # Optional REPL history 113 | .node_repl_history 114 | 115 | # Output of 'npm pack' 116 | *.tgz 117 | 118 | # Yarn Integrity file 119 | .yarn-integrity 120 | 121 | # dotenv environment variables file 122 | .env 123 | .env.test 124 | .env.production 125 | 126 | # parcel-bundler cache (https://parceljs.org/) 127 | .cache 128 | .parcel-cache 129 | 130 | # Next.js build output 131 | .next 132 | out 133 | 134 | # Nuxt.js build / generate output 135 | .nuxt 136 | dist 137 | 138 | # Gatsby files 139 | .cache/ 140 | # Comment in the public line in if your project uses Gatsby and not Next.js 141 | # https://nextjs.org/blog/next-9-1#public-directory-support 142 | # public 143 | 144 | # vuepress build output 145 | .vuepress/dist 146 | 147 | # Serverless directories 148 | .serverless/ 149 | 150 | # FuseBox cache 151 | .fusebox/ 152 | 153 | # DynamoDB Local files 154 | .dynamodb/ 155 | 156 | # TernJS port file 157 | .tern-port 158 | 159 | # Stores VSCode versions used for testing VSCode extensions 160 | .vscode-test 161 | 162 | # yarn v2 163 | .yarn/cache 164 | .yarn/unplugged 165 | .yarn/build-state.yml 166 | .yarn/install-state.gz 167 | .pnp.* 168 | 169 | ### Windows ### 170 | # Windows thumbnail cache files 171 | Thumbs.db 172 | Thumbs.db:encryptable 173 | ehthumbs.db 174 | ehthumbs_vista.db 175 | 176 | # Dump file 177 | *.stackdump 178 | 179 | # Folder config file 180 | [Dd]esktop.ini 181 | 182 | # Recycle Bin used on file shares 183 | $RECYCLE.BIN/ 184 | 185 | # Windows Installer files 186 | *.cab 187 | *.msi 188 | *.msix 189 | *.msm 190 | *.msp 191 | 192 | # Windows shortcuts 193 | *.lnk 194 | 195 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 196 | 197 | ql -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ninja 2 | 3 | 一次对于 koa2 vue3 vite 的简单尝试 4 | 5 | ## 说明 6 | 7 | Ninja 仅供学习参考使用,请于下载后的 24 小时内删除,本人不对使用过程中出现的任何问题负责,包括但不限于 `数据丢失` `数据泄露`。 8 | 9 | Ninja 仅支持 qinglong 2.8.2+ 10 | 11 | [TG 频道](https://t.me/joinchat/sHKuteb_lfdjNmZl) 12 | 13 | ## 特性 14 | 15 | - [x] 扫码,跳转登录添加/更新 cookie 16 | - [x] 添加/更新 cookie 后发送通知 17 | - [x] 扫码发送通知可关闭 18 | - [x] 添加备注并将通知中的 pt_pin nickName 修改为备注 19 | - [x] 默认备注为昵称 20 | - [x] 添加扫码推送卡片 21 | - [ ] 替换 cookie 失效通知 22 | - [ ] 登录界面展示自定义标语 23 | - [ ] 支持多容器,多面板 24 | - [ ] 采用自己的数据库,实现无视面板替换通知备注 25 | - [ ] 账号管理面板 26 | 27 | ## 文档 28 | 29 | ### 容器内 30 | 31 | 1. 容器映射 5701 端口,ninja 目录至宿主机 32 | 33 | 例(docker-compose): 34 | 35 | ```diff 36 | version: "3" 37 | services: 38 | qinglong: 39 | image: whyour/qinglong:latest 40 | container_name: qinglong 41 | restart: unless-stopped 42 | tty: true 43 | ports: 44 | - 5700:5700 45 | + - 5701:5701 46 | environment: 47 | - ENABLE_HANGUP=true 48 | - ENABLE_WEB_PANEL=true 49 | volumes: 50 | - ./config:/ql/config 51 | - ./log:/ql/log 52 | - ./db:/ql/db 53 | - ./repo:/ql/repo 54 | - ./raw:/ql/raw 55 | - ./scripts:/ql/scripts 56 | - ./jbot:/ql/jbot 57 | + - ./ninja:/ql/ninja 58 | ``` 59 | 60 | 例(docker-run): 61 | 62 | ```diff 63 | docker run -dit \ 64 | -v $PWD/ql/config:/ql/config \ 65 | -v $PWD/ql/log:/ql/log \ 66 | -v $PWD/ql/db:/ql/db \ 67 | -v $PWD/ql/repo:/ql/repo \ 68 | -v $PWD/ql/raw:/ql/raw \ 69 | -v $PWD/ql/scripts:/ql/scripts \ 70 | -v $PWD/ql/jbot:/ql/jbot \ 71 | + -v $PWD/ql/ninja:/ql/ninja \ 72 | -p 5700:5700 \ 73 | + -p 5701:5701 \ 74 | --name qinglong \ 75 | --hostname qinglong \ 76 | --restart unless-stopped \ 77 | whyour/qinglong:latest 78 | ``` 79 | 80 | 2. 进容器内执行以下命令 81 | 82 | **进容器内执行以下命令** 83 | 84 | ```bash 85 | git clone https://github.com/MoonBegonia/ninja.git /ql/ninja 86 | cd /ql/ninja/backend 87 | pnpm install 88 | pm2 start 89 | cp sendNotify.js /ql/scripts/sendNotify.js 90 | ``` 91 | 92 | 3. 将以下内容粘贴到 `extra.sh`(重启后自动更新并启动 Ninja) 93 | 94 | ```bash 95 | cd /ql/ninja/backend 96 | git checkout . 97 | git pull 98 | pnpm install 99 | pm2 start 100 | cp sendNotify.js /ql/scripts/sendNotify.js 101 | ``` 102 | 103 | ### 容器外 104 | 105 | 此种方式需要宿主机安装 `node` `pnpm` 等环境,不做过多介绍。 106 | 107 | 使用此种方法无法跟随青龙一起启动,**无法发送扫码通知**,请知悉。 108 | 109 | ```bash 110 | git clone git clone https://github.com/MoonBegonia/ninja.git 111 | cd ninja/backend 112 | pnpm install 113 | # 复制 sendNotify.js 到容器内 scripts 目录,`qinglong` 为容器名 114 | sudo docker cp sendNotify.js qinglong:/ql/scripts/sendNotify.js 115 | cp .env.example .env 116 | # 修改env文件 117 | vi .env 118 | node app.js 119 | ``` 120 | 121 | 在 `.env` 文件中添加以下内容: 122 | 123 | ```bash 124 | QL_DIR=qinglong 容器的本地路径 125 | QL_URL=http://localhost:5700 126 | ``` 127 | 128 | `node app.js` 想要在后台运行可以使用 `&` `nohup` `screen` 等命令。 129 | 130 | ### Ninja 环境变量 131 | 132 | 目前支持的环境变量有: 133 | 134 | - `ALLOW_ADD`: 是否允许添加账号 不允许添加时则只允许已有账号登录(默认 `true`) 135 | - `ALLOW_NUM`: 允许添加账号的最大数量(默认 `40`) 136 | - `NINJA_PORT`: Ninja 运行端口(默认 `5701`) 137 | - `NINJA_NOTIFY`: 是否开启通知功能(默认 `true`) 138 | - `NINJA_UA`: 自定义 UA,默认为随机 139 | 140 | 配置方式: 141 | 142 | ```bash 143 | cd /ql/ninja/backend 144 | cp .env.example .env 145 | vi .env 146 | pm2 start 147 | ``` 148 | 149 | **修改完成后需要 `pm2 start` 重启生效 !!!** 150 | 151 | ### SendNotify 环境变量 152 | 153 | **此环境变量在青龙中配置!!!** 154 | 155 | - `NOTIFY_SKIP_LIST`: 通知黑名单,使用 `&` 分隔,例如 `东东乐园&东东萌宠`; 156 | 157 | ### Ninja 自定义 158 | 159 | 自定义推送二维码:将 `push.jpg` 文件添加到 `/ql/ninja/backend/static/` 目录下刷新网页即可。 160 | 161 | 自定义常见活动:修改 `/ql/backend/static/activity.json` 即可 162 | 163 | ## 注意事项 164 | 165 | - 重启后务必执行一次 `ql extra` 保证 Ninja 配置成功。 166 | 167 | - 更新 Ninja 只需要在**容器**中 `ninja/backend` 目录执行 `git pull` 然后 `pm2 start` 168 | 169 | - Qinglong 需要在登录状态(`auth.json` 中有 token) 170 | 171 | ## 常见问题 172 | 173 | Q:为什么我 `git pull` 失败? 174 | A:一般是修改过文件,先运行一次 `git checkout .` 再 `git pull`。还是不行就删了重拉。 175 | 176 | Q:为什么访问不了? 177 | A:一般为端口映射错误/失败,请自行检查配置文件。 178 | 179 | Q:为什么访问白屏? 180 | A:使用现代的浏览器,而不是古代的。 181 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,macos,linux 4 | 5 | ### Linux ### 6 | *~ 7 | 8 | # temporary files which can be created if a process still has a handle open of a deleted file 9 | .fuse_hidden* 10 | 11 | # KDE directory preferences 12 | .directory 13 | 14 | # Linux trash folder which might appear on any partition or disk 15 | .Trash-* 16 | 17 | # .nfs files are created when an open file is removed but is still being accessed 18 | .nfs* 19 | 20 | ### macOS ### 21 | # General 22 | .DS_Store 23 | .AppleDouble 24 | .LSOverride 25 | 26 | # Icon must end with two \r 27 | Icon 28 | 29 | 30 | # Thumbnails 31 | ._* 32 | 33 | # Files that might appear in the root of a volume 34 | .DocumentRevisions-V100 35 | .fseventsd 36 | .Spotlight-V100 37 | .TemporaryItems 38 | .Trashes 39 | .VolumeIcon.icns 40 | .com.apple.timemachine.donotpresent 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | 49 | ### Node ### 50 | # Logs 51 | logs 52 | *.log 53 | npm-debug.log* 54 | yarn-debug.log* 55 | yarn-error.log* 56 | lerna-debug.log* 57 | .pnpm-debug.log* 58 | 59 | # Diagnostic reports (https://nodejs.org/api/report.html) 60 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 61 | 62 | # Runtime data 63 | pids 64 | *.pid 65 | *.seed 66 | *.pid.lock 67 | 68 | # Directory for instrumented libs generated by jscoverage/JSCover 69 | lib-cov 70 | 71 | # Coverage directory used by tools like istanbul 72 | coverage 73 | *.lcov 74 | 75 | # nyc test coverage 76 | .nyc_output 77 | 78 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 79 | .grunt 80 | 81 | # Bower dependency directory (https://bower.io/) 82 | bower_components 83 | 84 | # node-waf configuration 85 | .lock-wscript 86 | 87 | # Compiled binary addons (https://nodejs.org/api/addons.html) 88 | build/Release 89 | 90 | # Dependency directories 91 | node_modules/ 92 | jspm_packages/ 93 | 94 | # Snowpack dependency directory (https://snowpack.dev/) 95 | web_modules/ 96 | 97 | # TypeScript cache 98 | *.tsbuildinfo 99 | 100 | # Optional npm cache directory 101 | .npm 102 | 103 | # Optional eslint cache 104 | .eslintcache 105 | 106 | # Microbundle cache 107 | .rpt2_cache/ 108 | .rts2_cache_cjs/ 109 | .rts2_cache_es/ 110 | .rts2_cache_umd/ 111 | 112 | # Optional REPL history 113 | .node_repl_history 114 | 115 | # Output of 'npm pack' 116 | *.tgz 117 | 118 | # Yarn Integrity file 119 | .yarn-integrity 120 | 121 | # dotenv environment variables file 122 | .env 123 | .env.test 124 | .env.production 125 | 126 | # parcel-bundler cache (https://parceljs.org/) 127 | .cache 128 | .parcel-cache 129 | 130 | # Next.js build output 131 | .next 132 | out 133 | 134 | # Nuxt.js build / generate output 135 | .nuxt 136 | dist 137 | 138 | # Gatsby files 139 | .cache/ 140 | # Comment in the public line in if your project uses Gatsby and not Next.js 141 | # https://nextjs.org/blog/next-9-1#public-directory-support 142 | # public 143 | 144 | # vuepress build output 145 | .vuepress/dist 146 | 147 | # Serverless directories 148 | .serverless/ 149 | 150 | # FuseBox cache 151 | .fusebox/ 152 | 153 | # DynamoDB Local files 154 | .dynamodb/ 155 | 156 | # TernJS port file 157 | .tern-port 158 | 159 | # Stores VSCode versions used for testing VSCode extensions 160 | .vscode-test 161 | 162 | # yarn v2 163 | .yarn/cache 164 | .yarn/unplugged 165 | .yarn/build-state.yml 166 | .yarn/install-state.gz 167 | .pnp.* 168 | 169 | ### Windows ### 170 | # Windows thumbnail cache files 171 | Thumbs.db 172 | Thumbs.db:encryptable 173 | ehthumbs.db 174 | ehthumbs_vista.db 175 | 176 | # Dump file 177 | *.stackdump 178 | 179 | # Folder config file 180 | [Dd]esktop.ini 181 | 182 | # Recycle Bin used on file shares 183 | $RECYCLE.BIN/ 184 | 185 | # Windows Installer files 186 | *.cab 187 | *.msi 188 | *.msix 189 | *.msm 190 | *.msp 191 | 192 | # Windows shortcuts 193 | *.lnk 194 | 195 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 196 | 197 | ql 198 | 199 | node_modules 200 | .DS_Store 201 | dist 202 | dist-ssr 203 | *.local -------------------------------------------------------------------------------- /frontend/src/views/index.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 173 | -------------------------------------------------------------------------------- /frontend/src/views/login.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 181 | 182 | 183 | -------------------------------------------------------------------------------- /backend/utils/USER_AGENT.js: -------------------------------------------------------------------------------- 1 | const USER_AGENTS = [ 2 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36', 3 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 4 | 'jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36', 5 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36', 6 | 'jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36', 7 | 'jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 8 | 'jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 9 | 'jdapp;iPhone;10.0.2;13.5;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 10 | 'jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 11 | 'jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 12 | 'jdapp;iPhone;10.0.2;13.7;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 13 | 'jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 14 | 'jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 15 | 'jdapp;iPhone;10.0.2;13.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 16 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 17 | 'jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36', 18 | 'jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36', 19 | 'jdapp;iPhone;10.0.2;11.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79', 20 | 'jdapp;android;10.0.2;10;;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36', 21 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36', 22 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36', 23 | 'jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36', 24 | 'jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36', 25 | 'jdapp;android;10.0.2;8.0.0;network/wifi;Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36', 26 | 'jdapp;iPhone;10.0.2;14.0.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 27 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36', 28 | 'jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 29 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 30 | 'jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 31 | 'jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36', 32 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36', 33 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 34 | 'jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 35 | 'jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Premium Edition Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36', 36 | 'jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36', 37 | 'jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 38 | ]; 39 | /** 40 | * 生成随机数字 41 | * @param {number} min 最小值(包含) 42 | * @param {number} max 最大值(不包含) 43 | */ 44 | function randomNumber(min = 0, max = 100) { 45 | return Math.min(Math.floor(min + Math.random() * (max - min)), max); 46 | } 47 | 48 | const RANDOM_UA = USER_AGENTS[randomNumber(0, USER_AGENTS.length)]; 49 | 50 | const GET_RANDOM_TIME_UA = () => { 51 | return 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0'; 52 | }; 53 | 54 | module.exports = { 55 | RANDOM_UA, 56 | GET_RANDOM_TIME_UA, 57 | }; 58 | -------------------------------------------------------------------------------- /backend/user.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable camelcase */ 2 | 'use strict'; 3 | 4 | const got = require('got'); 5 | require('dotenv').config(); 6 | const QRCode = require('qrcode'); 7 | const { addEnv, delEnv, getEnvs, getEnvsCount, updateEnv } = require('./ql'); 8 | const path = require('path'); 9 | const qlDir = process.env.QL_DIR || '/ql'; 10 | const notifyFile = path.join(qlDir, 'shell/notify.sh'); 11 | const { exec } = require('child_process'); 12 | const { GET_RANDOM_TIME_UA } = require('./utils/USER_AGENT'); 13 | 14 | const api = got.extend({ 15 | retry: { limit: 0 }, 16 | responseType: 'json', 17 | }); 18 | 19 | module.exports = class User { 20 | ua; 21 | pt_key; 22 | pt_pin; 23 | cookie; 24 | eid; 25 | timestamp; 26 | nickName; 27 | token; 28 | okl_token; 29 | cookies; 30 | QRCode; 31 | remark; 32 | #s_token; 33 | 34 | constructor({ token, okl_token, cookies, pt_key, pt_pin, cookie, eid, remarks, remark, ua }) { 35 | this.token = token; 36 | this.okl_token = okl_token; 37 | this.cookies = cookies; 38 | this.pt_key = pt_key; 39 | this.pt_pin = pt_pin; 40 | this.cookie = cookie; 41 | this.eid = eid; 42 | this.remark = remark; 43 | this.ua = ua; 44 | 45 | if (pt_key && pt_pin) { 46 | this.cookie = 'pt_key=' + this.pt_key + ';pt_pin=' + this.pt_pin + ';'; 47 | } 48 | 49 | if (cookie) { 50 | this.pt_pin = cookie.match(/pt_pin=(.*?);/)[1]; 51 | this.pt_key = cookie.match(/pt_key=(.*?);/)[1]; 52 | } 53 | 54 | if (remarks) { 55 | this.remark = remarks.match(/remark=(.*?);/) && remarks.match(/remark=(.*?);/)[1]; 56 | } 57 | } 58 | 59 | async getQRConfig() { 60 | this.ua = this.ua || process.env.NINJA_UA || GET_RANDOM_TIME_UA(); 61 | const taskUrl = `https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=${Date.now()}&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`; 62 | const response = await api({ 63 | url: taskUrl, 64 | headers: { 65 | Connection: 'Keep-Alive', 66 | 'Content-Type': 'application/x-www-form-urlencoded', 67 | Accept: 'application/json, text/plain, */*', 68 | 'Accept-Language': 'zh-cn', 69 | Referer: taskUrl, 70 | 'User-Agent': this.ua, 71 | Host: 'plogin.m.jd.com', 72 | }, 73 | }); 74 | const headers = response.headers; 75 | const data = response.body; 76 | await this.#formatSetCookies(headers, data); 77 | 78 | if (!this.#s_token) { 79 | throw new Error('二维码创建失败!'); 80 | } 81 | 82 | const nowTime = Date.now(); 83 | // eslint-disable-next-line prettier/prettier 84 | const taskPostUrl = `https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token=${ 85 | this.#s_token 86 | }&v=${nowTime}&remember=true`; 87 | 88 | const configRes = await api({ 89 | method: 'post', 90 | url: taskPostUrl, 91 | body: `lang=chs&appid=300&source=wq_passport&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${nowTime}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action`, 92 | headers: { 93 | Connection: 'Keep-Alive', 94 | 'Content-Type': 'application/x-www-form-urlencoded', 95 | Accept: 'application/json, text/plain, */*', 96 | 'Accept-Language': 'zh-cn', 97 | Referer: taskUrl, 98 | 'User-Agent': this.ua, 99 | Host: 'plogin.m.jd.com', 100 | Cookie: this.cookies, 101 | }, 102 | }); 103 | const configHeaders = configRes.headers; 104 | const configData = configRes.body; 105 | 106 | this.token = configData.token; 107 | if (this.token) 108 | this.QRCode = await QRCode.toDataURL( 109 | `https://plogin.m.jd.com/cgi-bin/m/tmauth?appid=300&client_type=m&token=${this.token}` 110 | ); 111 | const cookies = configHeaders['set-cookie'][0]; 112 | this.okl_token = cookies.substring(cookies.indexOf('=') + 1, cookies.indexOf(';')); 113 | } 114 | 115 | async checkQRLogin() { 116 | if (!this.token || !this.okl_token || !this.cookies) { 117 | throw new Error('初始化登录请求失败!'); 118 | } 119 | const nowTime = Date.now(); 120 | const loginUrl = `https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${nowTime}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`; 121 | const getUserCookieUrl = `https://plogin.m.jd.com/cgi-bin/m/tmauthchecktoken?&token=${this.token}&ou_state=0&okl_token=${this.okl_token}`; 122 | const response = await api({ 123 | method: 'POST', 124 | url: getUserCookieUrl, 125 | body: `lang=chs&appid=300&source=wq_passport&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${nowTime}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action`, 126 | headers: { 127 | Connection: 'Keep-Alive', 128 | 'Content-Type': 'application/x-www-form-urlencoded; Charset=UTF-8', 129 | Accept: 'application/json, text/plain, */*', 130 | 'Accept-Language': 'zh-cn', 131 | Referer: loginUrl, 132 | 'User-Agent': this.ua, 133 | Cookie: this.cookies, 134 | }, 135 | }); 136 | const data = response.body; 137 | const headers = response.headers; 138 | if (data.errcode === 0) { 139 | const pt_key = headers['set-cookie'][1]; 140 | this.pt_key = pt_key.substring(pt_key.indexOf('=') + 1, pt_key.indexOf(';')); 141 | const pt_pin = headers['set-cookie'][2]; 142 | this.pt_pin = pt_pin.substring(pt_pin.indexOf('=') + 1, pt_pin.indexOf(';')); 143 | this.cookie = 'pt_key=' + this.pt_key + ';pt_pin=' + this.pt_pin + ';'; 144 | 145 | const result = await this.CKLogin(); 146 | result.errcode = 0; 147 | return result; 148 | } 149 | 150 | return { 151 | errcode: data.errcode, 152 | message: data.message, 153 | }; 154 | } 155 | 156 | async CKLogin() { 157 | let message; 158 | await this.#getNickname(); 159 | const envs = await getEnvs(); 160 | const poolInfo = await User.getPoolInfo(); 161 | const env = await envs.find((item) => item.value.match(/pt_pin=(.*?);/)[1] === this.pt_pin); 162 | if (!env) { 163 | // 新用户 164 | if (!poolInfo.allowAdd) { 165 | throw new UserError('管理员已关闭注册,去其他地方看看吧', 210, 200); 166 | } else if (poolInfo.marginCount === 0) { 167 | throw new UserError('本站已到达注册上限,你来晚啦', 211, 200); 168 | } else { 169 | const remarks = `remark=${this.nickName};`; 170 | const body = await addEnv(this.cookie, remarks); 171 | if (body.code !== 200) { 172 | throw new UserError(body.message || '添加账户错误,请重试', 220, body.code || 200); 173 | } 174 | this.eid = body.data[0]._id; 175 | this.timestamp = body.data[0].timestamp; 176 | message = `注册成功,${this.nickName}`; 177 | this.#sendNotify('Ninja 运行通知', `用户 ${this.nickName}(${decodeURIComponent(this.pt_pin)}) 已上线`); 178 | } 179 | } else { 180 | this.eid = env._id; 181 | const body = await updateEnv(this.cookie, this.eid); 182 | if (body.code !== 200) { 183 | throw new UserError(body.message || '更新账户错误,请重试', 221, body.code || 200); 184 | } 185 | this.timestamp = body.data.timestamp; 186 | message = `欢迎回来,${this.nickName}`; 187 | this.#sendNotify('Ninja 运行通知', `用户 ${this.nickName}(${decodeURIComponent(this.pt_pin)}) 已更新 CK`); 188 | } 189 | return { 190 | nickName: this.nickName, 191 | eid: this.eid, 192 | timestamp: this.timestamp, 193 | message, 194 | }; 195 | } 196 | 197 | async getUserInfoByEid() { 198 | const envs = await getEnvs(); 199 | const env = await envs.find((item) => item._id === this.eid); 200 | if (!env) { 201 | throw new UserError('没有找到这个账户,重新登录试试看哦', 230, 200); 202 | } 203 | this.cookie = env.value; 204 | this.timestamp = env.timestamp; 205 | const remarks = env.remarks; 206 | if (remarks) { 207 | this.remark = remarks.match(/remark=(.*?);/) && remarks.match(/remark=(.*?);/)[1]; 208 | } 209 | await this.#getNickname(); 210 | return { 211 | nickName: this.nickName, 212 | eid: this.eid, 213 | timestamp: this.timestamp, 214 | remark: this.remark, 215 | }; 216 | } 217 | 218 | async updateRemark() { 219 | if (!this.eid || !this.remark || this.remark.replace(/(^\s*)|(\s*$)/g, '') === '') { 220 | throw new UserError('参数错误', 240, 200); 221 | } 222 | 223 | const envs = await getEnvs(); 224 | const env = await envs.find((item) => item._id === this.eid); 225 | if (!env) { 226 | throw new UserError('没有找到这个账户,重新登录试试看哦', 230, 200); 227 | } 228 | this.cookie = env.value; 229 | 230 | const remarks = `remark=${this.remark};`; 231 | 232 | const updateEnvBody = await updateEnv(this.cookie, this.eid, remarks); 233 | if (updateEnvBody.code !== 200) { 234 | throw new UserError('更新/上传备注出错,请重试', 241, 200); 235 | } 236 | 237 | return { 238 | message: '更新/上传备注成功', 239 | }; 240 | } 241 | 242 | async delUserByEid() { 243 | await this.getUserInfoByEid(); 244 | const body = await delEnv(this.eid); 245 | if (body.code !== 200) { 246 | throw new UserError(body.message || '删除账户错误,请重试', 240, body.code || 200); 247 | } 248 | this.#sendNotify('Ninja 运行通知', `用户 ${this.nickName}(${decodeURIComponent(this.pt_pin)}) 删号跑路了`); 249 | return { 250 | message: '账户已移除', 251 | }; 252 | } 253 | 254 | static async getPoolInfo() { 255 | const count = await getEnvsCount(); 256 | const allowCount = (process.env.ALLOW_NUM || 40) - count; 257 | return { 258 | marginCount: allowCount >= 0 ? allowCount : 0, 259 | allowAdd: Boolean(process.env.ALLOW_ADD) || true, 260 | }; 261 | } 262 | 263 | static async getUsers() { 264 | const envs = await getEnvs(); 265 | const result = envs.map(async (env) => { 266 | const user = new User({ cookie: env.value, remarks: env.remarks }); 267 | await user.#getNickname(true); 268 | return { 269 | pt_pin: user.pt_pin, 270 | nickName: user.nickName, 271 | remark: user.remark || user.nickName, 272 | }; 273 | }); 274 | return Promise.all(result); 275 | } 276 | 277 | async #getNickname(nocheck) { 278 | const body = await api({ 279 | url: `https://me-api.jd.com/user_new/info/GetJDUserInfoUnion?orgFlag=JD_PinGou_New&callSource=mainorder&channel=4&isHomewhite=0&sceneval=2&_=${Date.now()}&sceneval=2&g_login_type=1&g_ty=ls`, 280 | headers: { 281 | Accept: '*/*', 282 | 'Accept-Encoding': 'gzip, deflate, br', 283 | 'Accept-Language': 'zh-cn', 284 | Connection: 'keep-alive', 285 | Cookie: this.cookie, 286 | Referer: 'https://home.m.jd.com/myJd/newhome.action', 287 | 'User-Agent': 288 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', 289 | Host: 'me-api.jd.com', 290 | }, 291 | }).json(); 292 | if (!body.data?.userInfo && !nocheck) { 293 | throw new UserError('获取用户信息失败,请检查您的 cookie !', 201, 200); 294 | } 295 | this.nickName = body.data?.userInfo.baseInfo.nickname || decodeURIComponent(this.pt_pin); 296 | } 297 | 298 | #formatSetCookies(headers, body) { 299 | return new Promise((resolve) => { 300 | let guid, lsid, ls_token; 301 | this.#s_token = body.s_token; 302 | guid = headers['set-cookie'][0]; 303 | guid = guid.substring(guid.indexOf('=') + 1, guid.indexOf(';')); 304 | lsid = headers['set-cookie'][2]; 305 | lsid = lsid.substring(lsid.indexOf('=') + 1, lsid.indexOf(';')); 306 | ls_token = headers['set-cookie'][3]; 307 | ls_token = ls_token.substring(ls_token.indexOf('=') + 1, ls_token.indexOf(';')); 308 | this.cookies = `guid=${guid};lang=chs;lsid=${lsid};ls_token=${ls_token};`; 309 | resolve(); 310 | }); 311 | } 312 | 313 | #sendNotify(title, content) { 314 | const notify = process.env.NINJA_NOTIFY || true; 315 | if (!notify) { 316 | console.log('Ninja 通知已关闭\n' + title + '\n' + content + '\n' + '已跳过发送'); 317 | return; 318 | } 319 | exec(`${notifyFile} "${title}" "${content}"`, (error, stdout, stderr) => { 320 | if (error) { 321 | console.log(stderr); 322 | } else { 323 | console.log(stdout); 324 | } 325 | }); 326 | } 327 | }; 328 | 329 | class UserError extends Error { 330 | constructor(message, status, statusCode) { 331 | super(message); 332 | this.name = 'UserError'; 333 | this.status = status; 334 | this.statusCode = statusCode || 200; 335 | } 336 | } 337 | -------------------------------------------------------------------------------- /backend/sendNotify.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: lxk0301 https://gitee.com/lxk0301 3 | * @Date: 2020-08-19 16:12:40 4 | * @Last Modified by: whyour 5 | * @Last Modified time: 2021-5-1 15:00:54 6 | * sendNotify 推送通知功能 7 | * @param text 通知头 8 | * @param desp 通知体 9 | * @param params 某些推送通知方式点击弹窗可跳转, 例:{ url: 'https://abc.com' } 10 | * @param author 作者仓库等信息 例:`本通知 By:https://github.com/whyour/qinglong` 11 | */ 12 | 13 | const querystring = require('querystring'); 14 | const $ = new Env(); 15 | const timeout = 15000; //超时时间(单位毫秒) 16 | // =======================================go-cqhttp通知设置区域=========================================== 17 | //gobot_url 填写请求地址http://127.0.0.1/send_private_msg 18 | //gobot_token 填写在go-cqhttp文件设置的访问密钥 19 | //gobot_qq 填写推送到个人QQ或者QQ群号 20 | //go-cqhttp相关API https://docs.go-cqhttp.org/api 21 | let GOBOT_URL = ''; // 推送到个人QQ: http://127.0.0.1/send_private_msg 群:http://127.0.0.1/send_group_msg 22 | let GOBOT_TOKEN = ''; //访问密钥 23 | let GOBOT_QQ = ''; // 如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群 24 | 25 | // =======================================微信server酱通知设置区域=========================================== 26 | //此处填你申请的SCKEY. 27 | //(环境变量名 PUSH_KEY) 28 | let SCKEY = ''; 29 | 30 | // =======================================Bark App通知设置区域=========================================== 31 | //此处填你BarkAPP的信息(IP/设备码,例如:https://api.day.app/XXXXXXXX) 32 | let BARK_PUSH = ''; 33 | //BARK app推送铃声,铃声列表去APP查看复制填写 34 | let BARK_SOUND = ''; 35 | //BARK app推送消息的分组, 默认为"QingLong" 36 | let BARK_GROUP = 'QingLong'; 37 | 38 | // =======================================telegram机器人通知设置区域=========================================== 39 | //此处填你telegram bot 的Token,telegram机器人通知推送必填项.例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw 40 | //(环境变量名 TG_BOT_TOKEN) 41 | let TG_BOT_TOKEN = ''; 42 | //此处填你接收通知消息的telegram用户的id,telegram机器人通知推送必填项.例如:129xxx206 43 | //(环境变量名 TG_USER_ID) 44 | let TG_USER_ID = ''; 45 | //tg推送HTTP代理设置(不懂可忽略,telegram机器人通知推送功能中非必填) 46 | let TG_PROXY_HOST = ''; //例如:127.0.0.1(环境变量名:TG_PROXY_HOST) 47 | let TG_PROXY_PORT = ''; //例如:1080(环境变量名:TG_PROXY_PORT) 48 | let TG_PROXY_AUTH = ''; //tg代理配置认证参数 49 | //Telegram api自建的反向代理地址(不懂可忽略,telegram机器人通知推送功能中非必填),默认tg官方api(环境变量名:TG_API_HOST) 50 | let TG_API_HOST = 'api.telegram.org'; 51 | // =======================================钉钉机器人通知设置区域=========================================== 52 | //此处填你钉钉 bot 的webhook,例如:5a544165465465645d0f31dca676e7bd07415asdasd 53 | //(环境变量名 DD_BOT_TOKEN) 54 | let DD_BOT_TOKEN = ''; 55 | //密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串 56 | let DD_BOT_SECRET = ''; 57 | 58 | // =======================================企业微信机器人通知设置区域=========================================== 59 | //此处填你企业微信机器人的 webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa 60 | //(环境变量名 QYWX_KEY) 61 | let QYWX_KEY = ''; 62 | 63 | // =======================================企业微信应用消息通知设置区域=========================================== 64 | /* 65 | 此处填你企业微信应用消息的值(详见文档 https://work.weixin.qq.com/api/doc/90000/90135/90236) 66 | 环境变量名 QYWX_AM依次填入 corpid,corpsecret,touser(注:多个成员ID使用|隔开),agentid,消息类型(选填,不填默认文本消息类型) 67 | 注意用,号隔开(英文输入法的逗号),例如:wwcff56746d9adwers,B-791548lnzXBE6_BWfxdf3kSTMJr9vFEPKAbh6WERQ,mingcheng,1000001,2COXgjH2UIfERF2zxrtUOKgQ9XklUqMdGSWLBoW_lSDAdafat 68 | 可选推送消息类型(推荐使用图文消息(mpnews)): 69 | - 文本卡片消息: 0 (数字零) 70 | - 文本消息: 1 (数字一) 71 | - 图文消息(mpnews): 素材库图片id, 可查看此教程(http://note.youdao.com/s/HMiudGkb)或者(https://note.youdao.com/ynoteshare1/index.html?id=1a0c8aff284ad28cbd011b29b3ad0191&type=note) 72 | */ 73 | let QYWX_AM = ''; 74 | 75 | // =======================================iGot聚合推送通知设置区域=========================================== 76 | //此处填您iGot的信息(推送key,例如:https://push.hellyw.com/XXXXXXXX) 77 | let IGOT_PUSH_KEY = ''; 78 | 79 | // =======================================push+设置区域======================================= 80 | //官方文档:http://www.pushplus.plus/ 81 | //PUSH_PLUS_TOKEN:微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送 82 | //PUSH_PLUS_USER: 一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送) 83 | let PUSH_PLUS_TOKEN = ''; 84 | let PUSH_PLUS_USER = ''; 85 | 86 | //==========================云端环境变量的判断与接收========================= 87 | if (process.env.GOBOT_URL) { 88 | GOBOT_URL = process.env.GOBOT_URL; 89 | } 90 | if (process.env.GOBOT_TOKEN) { 91 | GOBOT_TOKEN = process.env.GOBOT_TOKEN; 92 | } 93 | if (process.env.GOBOT_QQ) { 94 | GOBOT_QQ = process.env.GOBOT_QQ; 95 | } 96 | 97 | if (process.env.PUSH_KEY) { 98 | SCKEY = process.env.PUSH_KEY; 99 | } 100 | 101 | if (process.env.QQ_SKEY) { 102 | QQ_SKEY = process.env.QQ_SKEY; 103 | } 104 | 105 | if (process.env.QQ_MODE) { 106 | QQ_MODE = process.env.QQ_MODE; 107 | } 108 | 109 | if (process.env.BARK_PUSH) { 110 | if (process.env.BARK_PUSH.indexOf('https') > -1 || process.env.BARK_PUSH.indexOf('http') > -1) { 111 | //兼容BARK自建用户 112 | BARK_PUSH = process.env.BARK_PUSH; 113 | } else { 114 | BARK_PUSH = `https://api.day.app/${process.env.BARK_PUSH}`; 115 | } 116 | if (process.env.BARK_SOUND) { 117 | BARK_SOUND = process.env.BARK_SOUND; 118 | } 119 | if (process.env.BARK_GROUP) { 120 | BARK_GROUP = process.env.BARK_GROUP; 121 | } 122 | } else { 123 | if (BARK_PUSH && BARK_PUSH.indexOf('https') === -1 && BARK_PUSH.indexOf('http') === -1) { 124 | //兼容BARK本地用户只填写设备码的情况 125 | BARK_PUSH = `https://api.day.app/${BARK_PUSH}`; 126 | } 127 | } 128 | if (process.env.TG_BOT_TOKEN) { 129 | TG_BOT_TOKEN = process.env.TG_BOT_TOKEN; 130 | } 131 | if (process.env.TG_USER_ID) { 132 | TG_USER_ID = process.env.TG_USER_ID; 133 | } 134 | if (process.env.TG_PROXY_AUTH) TG_PROXY_AUTH = process.env.TG_PROXY_AUTH; 135 | if (process.env.TG_PROXY_HOST) TG_PROXY_HOST = process.env.TG_PROXY_HOST; 136 | if (process.env.TG_PROXY_PORT) TG_PROXY_PORT = process.env.TG_PROXY_PORT; 137 | if (process.env.TG_API_HOST) TG_API_HOST = process.env.TG_API_HOST; 138 | 139 | if (process.env.DD_BOT_TOKEN) { 140 | DD_BOT_TOKEN = process.env.DD_BOT_TOKEN; 141 | if (process.env.DD_BOT_SECRET) { 142 | DD_BOT_SECRET = process.env.DD_BOT_SECRET; 143 | } 144 | } 145 | 146 | if (process.env.QYWX_KEY) { 147 | QYWX_KEY = process.env.QYWX_KEY; 148 | } 149 | 150 | if (process.env.QYWX_AM) { 151 | QYWX_AM = process.env.QYWX_AM; 152 | } 153 | 154 | if (process.env.IGOT_PUSH_KEY) { 155 | IGOT_PUSH_KEY = process.env.IGOT_PUSH_KEY; 156 | } 157 | 158 | if (process.env.PUSH_PLUS_TOKEN) { 159 | PUSH_PLUS_TOKEN = process.env.PUSH_PLUS_TOKEN; 160 | } 161 | if (process.env.PUSH_PLUS_USER) { 162 | PUSH_PLUS_USER = process.env.PUSH_PLUS_USER; 163 | } 164 | //==========================云端环境变量的判断与接收========================= 165 | 166 | /** 167 | * sendNotify 推送通知功能 168 | * @param text 通知头 169 | * @param desp 通知体 170 | * @param params 某些推送通知方式点击弹窗可跳转, 例:{ url: 'https://abc.com' } 171 | * @param author 作者仓库等信息 例:`本通知 By:https://github.com/whyour/qinglong` 172 | * @returns {Promise} 173 | */ 174 | async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By:https://github.com/whyour/qinglong') { 175 | try { 176 | const notifySkipList = process.env.NOTIFY_SKIP_LIST ? process.env.NOTIFY_SKIP_LIST.split('&') : []; 177 | const titleIndex = notifySkipList.findIndex((item) => item === text); 178 | 179 | if (titleIndex !== -1) { 180 | console.log(`${text} 在推送黑名单中,已跳过推送`); 181 | return; 182 | } 183 | 184 | const got = require('got'); 185 | 186 | const body = await got('http://localhost:5701/api/users').json(); 187 | const users = body.data; 188 | 189 | for (const user of users) { 190 | if (user.pt_pin && user.nickName && user.remark) { 191 | desp = desp.replace(new RegExp(`${user.pt_pin}|${user.nickName}`, 'gm'), user.remark); 192 | } 193 | } 194 | 195 | } catch (error) { 196 | console.error(error); 197 | } 198 | 199 | //提供6种通知 200 | desp += author; //增加作者信息,防止被贩卖等 201 | await Promise.all([ 202 | serverNotify(text, desp), //微信server酱 203 | pushPlusNotify(text, desp), //pushplus(推送加) 204 | ]); 205 | //由于上述两种微信通知需点击进去才能查看到详情,故text(标题内容)携带了账号序号以及昵称信息,方便不点击也可知道是哪个京东哪个活动 206 | text = text.match(/.*?(?=\s?-)/g) ? text.match(/.*?(?=\s?-)/g)[0] : text; 207 | await Promise.all([ 208 | BarkNotify(text, desp, params), //iOS Bark APP 209 | tgBotNotify(text, desp), //telegram 机器人 210 | ddBotNotify(text, desp), //钉钉机器人 211 | qywxBotNotify(text, desp), //企业微信机器人 212 | qywxamNotify(text, desp), //企业微信应用消息推送 213 | iGotNotify(text, desp, params), //iGot 214 | gobotNotify(text, desp), //go-cqhttp 215 | ]); 216 | } 217 | 218 | function gobotNotify(text, desp, time = 2100) { 219 | return new Promise((resolve) => { 220 | if (GOBOT_URL) { 221 | const options = { 222 | url: `${GOBOT_URL}?access_token=${GOBOT_TOKEN}&${GOBOT_QQ}`, 223 | body: `message=${text}\n${desp}`, 224 | headers: { 225 | 'Content-Type': 'application/x-www-form-urlencoded', 226 | }, 227 | timeout, 228 | }; 229 | setTimeout(() => { 230 | $.post(options, (err, resp, data) => { 231 | try { 232 | if (err) { 233 | console.log('发送go-cqhttp通知调用API失败!!\n'); 234 | console.log(err); 235 | } else { 236 | data = JSON.parse(data); 237 | if (data.retcode === 0) { 238 | console.log('go-cqhttp发送通知消息成功🎉\n'); 239 | } else if (data.retcode === 100) { 240 | console.log(`go-cqhttp发送通知消息异常: ${data.errmsg}\n`); 241 | } else { 242 | console.log(`go-cqhttp发送通知消息异常\n${JSON.stringify(data)}`); 243 | } 244 | } 245 | } catch (e) { 246 | $.logErr(e, resp); 247 | } finally { 248 | resolve(data); 249 | } 250 | }); 251 | }, time); 252 | } else { 253 | resolve(); 254 | } 255 | }); 256 | } 257 | 258 | function serverNotify(text, desp, time = 2100) { 259 | return new Promise((resolve) => { 260 | if (SCKEY) { 261 | //微信server酱推送通知一个\n不会换行,需要两个\n才能换行,故做此替换 262 | desp = desp.replace(/[\n\r]/g, '\n\n'); 263 | const options = { 264 | url: SCKEY.includes('SCT') ? `https://sctapi.ftqq.com/${SCKEY}.send` : `https://sc.ftqq.com/${SCKEY}.send`, 265 | body: `text=${text}&desp=${desp}`, 266 | headers: { 267 | 'Content-Type': 'application/x-www-form-urlencoded', 268 | }, 269 | timeout, 270 | }; 271 | setTimeout(() => { 272 | $.post(options, (err, resp, data) => { 273 | try { 274 | if (err) { 275 | console.log('发送通知调用API失败!!\n'); 276 | console.log(err); 277 | } else { 278 | data = JSON.parse(data); 279 | //server酱和Server酱·Turbo版的返回json格式不太一样 280 | if (data.errno === 0 || data.data.errno === 0) { 281 | console.log('server酱发送通知消息成功🎉\n'); 282 | } else if (data.errno === 1024) { 283 | // 一分钟内发送相同的内容会触发 284 | console.log(`server酱发送通知消息异常: ${data.errmsg}\n`); 285 | } else { 286 | console.log(`server酱发送通知消息异常\n${JSON.stringify(data)}`); 287 | } 288 | } 289 | } catch (e) { 290 | $.logErr(e, resp); 291 | } finally { 292 | resolve(data); 293 | } 294 | }); 295 | }, time); 296 | } else { 297 | resolve(); 298 | } 299 | }); 300 | } 301 | 302 | function CoolPush(text, desp) { 303 | return new Promise((resolve) => { 304 | if (QQ_SKEY) { 305 | let options = { 306 | url: `https://push.xuthus.cc/${QQ_MODE}/${QQ_SKEY}`, 307 | headers: { 308 | 'Content-Type': 'application/json', 309 | }, 310 | }; 311 | 312 | // 已知敏感词 313 | text = text.replace(/京豆/g, '豆豆'); 314 | desp = desp.replace(/京豆/g, ''); 315 | desp = desp.replace(/🐶/g, ''); 316 | desp = desp.replace(/红包/g, 'H包'); 317 | 318 | switch (QQ_MODE) { 319 | case 'email': 320 | options.json = { 321 | t: text, 322 | c: desp, 323 | }; 324 | break; 325 | default: 326 | options.body = `${text}\n\n${desp}`; 327 | } 328 | 329 | let pushMode = function (t) { 330 | switch (t) { 331 | case 'send': 332 | return '个人'; 333 | case 'group': 334 | return 'QQ群'; 335 | case 'wx': 336 | return '微信'; 337 | case 'ww': 338 | return '企业微信'; 339 | case 'email': 340 | return '邮件'; 341 | default: 342 | return '未知方式'; 343 | } 344 | }; 345 | 346 | $.post(options, (err, resp, data) => { 347 | try { 348 | if (err) { 349 | console.log(`发送${pushMode(QQ_MODE)}通知调用API失败!!\n`); 350 | console.log(err); 351 | } else { 352 | data = JSON.parse(data); 353 | if (data.code === 200) { 354 | console.log(`酷推发送${pushMode(QQ_MODE)}通知消息成功🎉\n`); 355 | } else if (data.code === 400) { 356 | console.log(`QQ酷推(Cool Push)发送${pushMode(QQ_MODE)}推送失败:${data.msg}\n`); 357 | } else if (data.code === 503) { 358 | console.log(`QQ酷推出错,${data.message}:${data.data}\n`); 359 | } else { 360 | console.log(`酷推推送异常: ${JSON.stringify(data)}`); 361 | } 362 | } 363 | } catch (e) { 364 | $.logErr(e, resp); 365 | } finally { 366 | resolve(data); 367 | } 368 | }); 369 | } else { 370 | resolve(); 371 | } 372 | }); 373 | } 374 | 375 | function BarkNotify(text, desp, params = {}) { 376 | return new Promise((resolve) => { 377 | if (BARK_PUSH) { 378 | const options = { 379 | url: `${BARK_PUSH}/${encodeURIComponent(text)}/${encodeURIComponent( 380 | desp 381 | )}?sound=${BARK_SOUND}&group=${BARK_GROUP}&${querystring.stringify(params)}`, 382 | headers: { 383 | 'Content-Type': 'application/x-www-form-urlencoded', 384 | }, 385 | timeout, 386 | }; 387 | $.get(options, (err, resp, data) => { 388 | try { 389 | if (err) { 390 | console.log('Bark APP发送通知调用API失败!!\n'); 391 | console.log(err); 392 | } else { 393 | data = JSON.parse(data); 394 | if (data.code === 200) { 395 | console.log('Bark APP发送通知消息成功🎉\n'); 396 | } else { 397 | console.log(`${data.message}\n`); 398 | } 399 | } 400 | } catch (e) { 401 | $.logErr(e, resp); 402 | } finally { 403 | resolve(); 404 | } 405 | }); 406 | } else { 407 | resolve(); 408 | } 409 | }); 410 | } 411 | 412 | function tgBotNotify(text, desp) { 413 | return new Promise((resolve) => { 414 | if (TG_BOT_TOKEN && TG_USER_ID) { 415 | const options = { 416 | url: `https://${TG_API_HOST}/bot${TG_BOT_TOKEN}/sendMessage`, 417 | body: `chat_id=${TG_USER_ID}&text=${text}\n\n${desp}&disable_web_page_preview=true`, 418 | headers: { 419 | 'Content-Type': 'application/x-www-form-urlencoded', 420 | }, 421 | timeout, 422 | }; 423 | if (TG_PROXY_HOST && TG_PROXY_PORT) { 424 | const tunnel = require('tunnel'); 425 | const agent = { 426 | https: tunnel.httpsOverHttp({ 427 | proxy: { 428 | host: TG_PROXY_HOST, 429 | port: TG_PROXY_PORT * 1, 430 | proxyAuth: TG_PROXY_AUTH, 431 | }, 432 | }), 433 | }; 434 | Object.assign(options, { agent }); 435 | } 436 | $.post(options, (err, resp, data) => { 437 | try { 438 | if (err) { 439 | console.log('telegram发送通知消息失败!!\n'); 440 | console.log(err); 441 | } else { 442 | data = JSON.parse(data); 443 | if (data.ok) { 444 | console.log('Telegram发送通知消息成功🎉。\n'); 445 | } else if (data.error_code === 400) { 446 | console.log('请主动给bot发送一条消息并检查接收用户ID是否正确。\n'); 447 | } else if (data.error_code === 401) { 448 | console.log('Telegram bot token 填写错误。\n'); 449 | } 450 | } 451 | } catch (e) { 452 | $.logErr(e, resp); 453 | } finally { 454 | resolve(data); 455 | } 456 | }); 457 | } else { 458 | resolve(); 459 | } 460 | }); 461 | } 462 | function ddBotNotify(text, desp) { 463 | return new Promise((resolve) => { 464 | const options = { 465 | url: `https://oapi.dingtalk.com/robot/send?access_token=${DD_BOT_TOKEN}`, 466 | json: { 467 | msgtype: 'text', 468 | text: { 469 | content: ` ${text}\n\n${desp}`, 470 | }, 471 | }, 472 | headers: { 473 | 'Content-Type': 'application/json', 474 | }, 475 | timeout, 476 | }; 477 | if (DD_BOT_TOKEN && DD_BOT_SECRET) { 478 | const crypto = require('crypto'); 479 | const dateNow = Date.now(); 480 | const hmac = crypto.createHmac('sha256', DD_BOT_SECRET); 481 | hmac.update(`${dateNow}\n${DD_BOT_SECRET}`); 482 | const result = encodeURIComponent(hmac.digest('base64')); 483 | options.url = `${options.url}×tamp=${dateNow}&sign=${result}`; 484 | $.post(options, (err, resp, data) => { 485 | try { 486 | if (err) { 487 | console.log('钉钉发送通知消息失败!!\n'); 488 | console.log(err); 489 | } else { 490 | data = JSON.parse(data); 491 | if (data.errcode === 0) { 492 | console.log('钉钉发送通知消息成功🎉。\n'); 493 | } else { 494 | console.log(`${data.errmsg}\n`); 495 | } 496 | } 497 | } catch (e) { 498 | $.logErr(e, resp); 499 | } finally { 500 | resolve(data); 501 | } 502 | }); 503 | } else if (DD_BOT_TOKEN) { 504 | $.post(options, (err, resp, data) => { 505 | try { 506 | if (err) { 507 | console.log('钉钉发送通知消息失败!!\n'); 508 | console.log(err); 509 | } else { 510 | data = JSON.parse(data); 511 | if (data.errcode === 0) { 512 | console.log('钉钉发送通知消息完成。\n'); 513 | } else { 514 | console.log(`${data.errmsg}\n`); 515 | } 516 | } 517 | } catch (e) { 518 | $.logErr(e, resp); 519 | } finally { 520 | resolve(data); 521 | } 522 | }); 523 | } else { 524 | resolve(); 525 | } 526 | }); 527 | } 528 | 529 | function qywxBotNotify(text, desp) { 530 | return new Promise((resolve) => { 531 | const options = { 532 | url: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${QYWX_KEY}`, 533 | json: { 534 | msgtype: 'text', 535 | text: { 536 | content: ` ${text}\n\n${desp}`, 537 | }, 538 | }, 539 | headers: { 540 | 'Content-Type': 'application/json', 541 | }, 542 | timeout, 543 | }; 544 | if (QYWX_KEY) { 545 | $.post(options, (err, resp, data) => { 546 | try { 547 | if (err) { 548 | console.log('企业微信发送通知消息失败!!\n'); 549 | console.log(err); 550 | } else { 551 | data = JSON.parse(data); 552 | if (data.errcode === 0) { 553 | console.log('企业微信发送通知消息成功🎉。\n'); 554 | } else { 555 | console.log(`${data.errmsg}\n`); 556 | } 557 | } 558 | } catch (e) { 559 | $.logErr(e, resp); 560 | } finally { 561 | resolve(data); 562 | } 563 | }); 564 | } else { 565 | resolve(); 566 | } 567 | }); 568 | } 569 | 570 | function ChangeUserId(desp) { 571 | const QYWX_AM_AY = QYWX_AM.split(','); 572 | if (QYWX_AM_AY[2]) { 573 | const userIdTmp = QYWX_AM_AY[2].split('|'); 574 | let userId = ''; 575 | for (let i = 0; i < userIdTmp.length; i++) { 576 | const count = '账号' + (i + 1); 577 | const count2 = '签到号 ' + (i + 1); 578 | if (desp.match(count2)) { 579 | userId = userIdTmp[i]; 580 | } 581 | } 582 | if (!userId) userId = QYWX_AM_AY[2]; 583 | return userId; 584 | } else { 585 | return '@all'; 586 | } 587 | } 588 | 589 | function qywxamNotify(text, desp) { 590 | return new Promise((resolve) => { 591 | if (QYWX_AM) { 592 | const QYWX_AM_AY = QYWX_AM.split(','); 593 | const options_accesstoken = { 594 | url: `https://qyapi.weixin.qq.com/cgi-bin/gettoken`, 595 | json: { 596 | corpid: `${QYWX_AM_AY[0]}`, 597 | corpsecret: `${QYWX_AM_AY[1]}`, 598 | }, 599 | headers: { 600 | 'Content-Type': 'application/json', 601 | }, 602 | timeout, 603 | }; 604 | $.post(options_accesstoken, (err, resp, data) => { 605 | html = desp.replace(/\n/g, '
'); 606 | var json = JSON.parse(data); 607 | accesstoken = json.access_token; 608 | let options; 609 | 610 | switch (QYWX_AM_AY[4]) { 611 | case '0': 612 | options = { 613 | msgtype: 'textcard', 614 | textcard: { 615 | title: `${text}`, 616 | description: `${desp}`, 617 | url: 'https://github.com/whyour/qinglong', 618 | btntxt: '更多', 619 | }, 620 | }; 621 | break; 622 | 623 | case '1': 624 | options = { 625 | msgtype: 'text', 626 | text: { 627 | content: `${text}\n\n${desp}`, 628 | }, 629 | }; 630 | break; 631 | 632 | default: 633 | options = { 634 | msgtype: 'mpnews', 635 | mpnews: { 636 | articles: [ 637 | { 638 | title: `${text}`, 639 | thumb_media_id: `${QYWX_AM_AY[4]}`, 640 | author: `智能助手`, 641 | content_source_url: ``, 642 | content: `${html}`, 643 | digest: `${desp}`, 644 | }, 645 | ], 646 | }, 647 | }; 648 | } 649 | if (!QYWX_AM_AY[4]) { 650 | //如不提供第四个参数,则默认进行文本消息类型推送 651 | options = { 652 | msgtype: 'text', 653 | text: { 654 | content: `${text}\n\n${desp}`, 655 | }, 656 | }; 657 | } 658 | options = { 659 | url: `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accesstoken}`, 660 | json: { 661 | touser: `${ChangeUserId(desp)}`, 662 | agentid: `${QYWX_AM_AY[3]}`, 663 | safe: '0', 664 | ...options, 665 | }, 666 | headers: { 667 | 'Content-Type': 'application/json', 668 | }, 669 | }; 670 | 671 | $.post(options, (err, resp, data) => { 672 | try { 673 | if (err) { 674 | console.log('成员ID:' + ChangeUserId(desp) + '企业微信应用消息发送通知消息失败!!\n'); 675 | console.log(err); 676 | } else { 677 | data = JSON.parse(data); 678 | if (data.errcode === 0) { 679 | console.log('成员ID:' + ChangeUserId(desp) + '企业微信应用消息发送通知消息成功🎉。\n'); 680 | } else { 681 | console.log(`${data.errmsg}\n`); 682 | } 683 | } 684 | } catch (e) { 685 | $.logErr(e, resp); 686 | } finally { 687 | resolve(data); 688 | } 689 | }); 690 | }); 691 | } else { 692 | resolve(); 693 | } 694 | }); 695 | } 696 | 697 | function iGotNotify(text, desp, params = {}) { 698 | return new Promise((resolve) => { 699 | if (IGOT_PUSH_KEY) { 700 | // 校验传入的IGOT_PUSH_KEY是否有效 701 | const IGOT_PUSH_KEY_REGX = new RegExp('^[a-zA-Z0-9]{24}$'); 702 | if (!IGOT_PUSH_KEY_REGX.test(IGOT_PUSH_KEY)) { 703 | console.log('您所提供的IGOT_PUSH_KEY无效\n'); 704 | resolve(); 705 | return; 706 | } 707 | const options = { 708 | url: `https://push.hellyw.com/${IGOT_PUSH_KEY.toLowerCase()}`, 709 | body: `title=${text}&content=${desp}&${querystring.stringify(params)}`, 710 | headers: { 711 | 'Content-Type': 'application/x-www-form-urlencoded', 712 | }, 713 | timeout, 714 | }; 715 | $.post(options, (err, resp, data) => { 716 | try { 717 | if (err) { 718 | console.log('发送通知调用API失败!!\n'); 719 | console.log(err); 720 | } else { 721 | if (typeof data === 'string') data = JSON.parse(data); 722 | if (data.ret === 0) { 723 | console.log('iGot发送通知消息成功🎉\n'); 724 | } else { 725 | console.log(`iGot发送通知消息失败:${data.errMsg}\n`); 726 | } 727 | } 728 | } catch (e) { 729 | $.logErr(e, resp); 730 | } finally { 731 | resolve(data); 732 | } 733 | }); 734 | } else { 735 | resolve(); 736 | } 737 | }); 738 | } 739 | 740 | function pushPlusNotify(text, desp) { 741 | return new Promise((resolve) => { 742 | if (PUSH_PLUS_TOKEN) { 743 | desp = desp.replace(/[\n\r]/g, '
'); // 默认为html, 不支持plaintext 744 | const body = { 745 | token: `${PUSH_PLUS_TOKEN}`, 746 | title: `${text}`, 747 | content: `${desp}`, 748 | topic: `${PUSH_PLUS_USER}`, 749 | }; 750 | const options = { 751 | url: `https://www.pushplus.plus/send`, 752 | body: JSON.stringify(body), 753 | headers: { 754 | 'Content-Type': ' application/json', 755 | }, 756 | timeout, 757 | }; 758 | $.post(options, (err, resp, data) => { 759 | try { 760 | if (err) { 761 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败!!\n`); 762 | console.log(err); 763 | } else { 764 | data = JSON.parse(data); 765 | if (data.code === 200) { 766 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息完成。\n`); 767 | } else { 768 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败:${data.msg}\n`); 769 | } 770 | } 771 | } catch (e) { 772 | $.logErr(e, resp); 773 | } finally { 774 | resolve(data); 775 | } 776 | }); 777 | } else { 778 | resolve(); 779 | } 780 | }); 781 | } 782 | 783 | module.exports = { 784 | sendNotify, 785 | BARK_PUSH, 786 | }; 787 | 788 | // prettier-ignore 789 | function Env(t, s) { return new (class { constructor(t, s) { (this.name = t), (this.data = null), (this.dataFile = 'box.dat'), (this.logs = []), (this.logSeparator = '\n'), (this.startTime = new Date().getTime()), Object.assign(this, s), this.log('', `\ud83d\udd14${this.name}, \u5f00\u59cb!`); } isNode() { return 'undefined' != typeof module && !!module.exports; } isQuanX() { return 'undefined' != typeof $task; } isSurge() { return 'undefined' != typeof $httpClient && 'undefined' == typeof $loon; } isLoon() { return 'undefined' != typeof $loon; } getScript(t) { return new Promise((s) => { $.get({ url: t }, (t, e, i) => s(i)); }); } runScript(t, s) { return new Promise((e) => { let i = this.getdata('@chavy_boxjs_userCfgs.httpapi'); i = i ? i.replace(/\n/g, '').trim() : i; let o = this.getdata('@chavy_boxjs_userCfgs.httpapi_timeout'); (o = o ? 1 * o : 20), (o = s && s.timeout ? s.timeout : o); const [h, a] = i.split('@'), r = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: t, mock_type: 'cron', timeout: o }, headers: { 'X-Key': h, Accept: '*/*' }, }; $.post(r, (t, s, i) => e(i)); }).catch((t) => this.logErr(t)); } loaddata() { if (!this.isNode()) return {}; { (this.fs = this.fs ? this.fs : require('fs')), (this.path = this.path ? this.path : require('path')); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s); if (!e && !i) return {}; { const i = e ? t : s; try { return JSON.parse(this.fs.readFileSync(i)); } catch (t) { return {}; } } } } writedata() { if (this.isNode()) { (this.fs = this.fs ? this.fs : require('fs')), (this.path = this.path ? this.path : require('path')); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s), o = JSON.stringify(this.data); e ? this.fs.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o); } } lodash_get(t, s, e) { const i = s.replace(/\[(\d+)\]/g, '.$1').split('.'); let o = t; for (const t of i) if (((o = Object(o)[t]), void 0 === o)) return e; return o; } lodash_set(t, s, e) { return Object(t) !== t ? t : (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []), (s .slice(0, -1) .reduce( (t, e, i) => (Object(t[e]) === t[e] ? t[e] : (t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {})), t )[s[s.length - 1]] = e), t); } getdata(t) { let s = this.getval(t); if (/^@/.test(t)) { const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t), o = e ? this.getval(e) : ''; if (o) try { const t = JSON.parse(o); s = t ? this.lodash_get(t, i, '') : s; } catch (t) { s = ''; } } return s; } setdata(t, s) { let e = !1; if (/^@/.test(s)) { const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s), h = this.getval(i), a = i ? ('null' === h ? null : h || '{}') : '{}'; try { const s = JSON.parse(a); this.lodash_set(s, o, t), (e = this.setval(JSON.stringify(s), i)); } catch (s) { const h = {}; this.lodash_set(h, o, t), (e = this.setval(JSON.stringify(h), i)); } } else e = $.setval(t, s); return e; } getval(t) { return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? ((this.data = this.loaddata()), this.data[t]) : (this.data && this.data[t]) || null; } setval(t, s) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : this.isNode() ? ((this.data = this.loaddata()), (this.data[s] = t), this.writedata(), !0) : (this.data && this.data[s]) || null; } initGotEnv(t) { (this.got = this.got ? this.got : require('got')), (this.cktough = this.cktough ? this.cktough : require('tough-cookie')), (this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar()), t && ((t.headers = t.headers ? t.headers : {}), void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)); } get(t, s = () => {}) { t.headers && (delete t.headers['Content-Type'], delete t.headers['Content-Length']), this.isSurge() || this.isLoon() ? $httpClient.get(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i); }) : this.isQuanX() ? $task.fetch(t).then( (t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t) ) : this.isNode() && (this.initGotEnv(t), this.got(t) .on('redirect', (t, s) => { try { const e = t.headers['set-cookie'].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(e, null), (s.cookieJar = this.ckjar); } catch (t) { this.logErr(t); } }) .then( (t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t) )); } post(t, s = () => {}) { if ( (t.body && t.headers && !t.headers['Content-Type'] && (t.headers['Content-Type'] = 'application/x-www-form-urlencoded'), delete t.headers['Content-Length'], this.isSurge() || this.isLoon()) ) $httpClient.post(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i); }); else if (this.isQuanX()) (t.method = 'POST'), $task.fetch(t).then( (t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t) ); else if (this.isNode()) { this.initGotEnv(t); const { url: e, ...i } = t; this.got.post(e, i).then( (t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t) ); } } time(t) { let s = { 'M+': new Date().getMonth() + 1, 'd+': new Date().getDate(), 'H+': new Date().getHours(), 'm+': new Date().getMinutes(), 's+': new Date().getSeconds(), 'q+': Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + '').substr(4 - RegExp.$1.length))); for (let e in s) new RegExp('(' + e + ')').test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ('00' + s[e]).substr(('' + s[e]).length))); return t; } msg(s = t, e = '', i = '', o) { const h = (t) => !t || (!this.isLoon() && this.isSurge()) ? t : 'string' == typeof t ? this.isLoon() ? t : this.isQuanX() ? { 'open-url': t } : void 0 : 'object' == typeof t && (t['open-url'] || t['media-url']) ? this.isLoon() ? t['open-url'] : this.isQuanX() ? t : void 0 : void 0; $.isMute || (this.isSurge() || this.isLoon() ? $notification.post(s, e, i, h(o)) : this.isQuanX() && $notify(s, e, i, h(o))), this.logs.push('', '==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============='), this.logs.push(s), e && this.logs.push(e), i && this.logs.push(i); } log(...t) { t.length > 0 ? (this.logs = [...this.logs, ...t]) : console.log(this.logs.join(this.logSeparator)); } logErr(t, s) { const e = !this.isSurge() && !this.isQuanX() && !this.isLoon(); e ? $.log('', `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : $.log('', `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t); } wait(t) { return new Promise((s) => setTimeout(s, t)); } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log('', `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t); } })(t, s); } 790 | -------------------------------------------------------------------------------- /backend/static/assets/index.fcdd9895.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8";:root{--el-button-primary-border-color:var(--el-color-primary);--el-button-success-border-color:var(--el-color-success);--el-button-warning-border-color:var(--el-color-warning);--el-button-danger-border-color:var(--el-color-danger);--el-button-info-border-color:var(--el-color-info);--el-button-divide-border-color:rgba(255, 255, 255, 0.5)}.el-button{display:inline-block;line-height:1;min-height:40px;white-space:nowrap;cursor:pointer;background:var(--el-button-default-background-color);border:var(--el-border-base);border-color:var(--el-button-default-border-color);color:var(--el-button-default-font-color);-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:var(--el-button-font-weight);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:var(--el-border-radius-base)}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:var(--el-color-primary);border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:var(--el-color-white);border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:var(--el-color-white);outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:var(--el-button-disabled-font-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-background-color);border-color:var(--el-button-disabled-border-color)}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:var(--el-color-white);border-color:var(--el-button-disabled-border-color);color:var(--el-button-disabled-font-color)}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:"";position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:var(--el-border-radius-round);padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#fff;background-color:#409eff;border-color:#409eff}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#fff}.el-button--primary.is-active,.el-button--primary:active{border-color:#3a8ee6;color:#fff;background:#3a8ee6}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#fff;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409eff;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409eff;border-color:#409eff;color:#fff}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#fff}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#fff}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#fff;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67c23a;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67c23a;border-color:#67c23a;color:#fff}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#fff}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#fff}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#fff;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#e6a23c;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#e6a23c;border-color:#e6a23c;color:#fff}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#fff}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#fff}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#fff;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#f56c6c;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#f56c6c;border-color:#f56c6c;color:#fff}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#fff;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#fff}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#fff}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#fff;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#fff}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#fff;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--medium{min-height:36px;padding:10px 20px;font-size:14px;border-radius:var(--el-border-radius-base)}.el-button--mini,.el-button--small{font-size:12px;border-radius:calc(var(--el-border-radius-base) - 1px)}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:20px}.el-button--small{min-height:32px;padding:9px 15px}.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:15px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini{min-height:28px}.el-button--mini.is-circle{padding:15px}.el-button--text{border-color:transparent;color:var(--el-color-primary);background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;border-color:transparent;background-color:transparent}.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover{border-color:transparent}.el-button-group .el-button--danger:last-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:last-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:last-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:last-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:last-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child),.el-button-group>.el-dropdown>.el-button{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--danger:first-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:first-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:first-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:first-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:first-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-right-color:var(--el-button-divide-border-color)}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table;content:""}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-top-right-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base);border-top-left-radius:var(--el-border-radius-base);border-bottom-left-radius:var(--el-border-radius-base)}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:var(--el-border-radius-round)}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0}.el-overlay,.v-modal{position:fixed;height:100%;left:0}.el-dialog__wrapper,.el-overlay{top:0;right:0;bottom:0;overflow:auto}:root{--el-popup-modal-background-color:var(--el-color-black);--el-popup-modal-opacity:0.5;--el-dialog-background-color:var(--el-color-white);--el-dialog-box-shadow:0 1px 3px rgba(0, 0, 0, 0.3);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:20px}.v-modal-enter{-webkit-animation:v-modal-in var(--el-transition-duration-fast) ease;animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{-webkit-animation:v-modal-out var(--el-transition-duration-fast) ease forwards;animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{top:0;width:100%;opacity:var(--el-popup-modal-opacity);background:var(--el-popup-modal-background-color)}.el-popup-parent--hidden{overflow:hidden}.el-overlay{z-index:2000;background-color:rgba(0,0,0,.5)}.el-overlay .el-overlay-root{height:0}.el-dialog{position:relative;margin:0 auto 50px;background:var(--el-dialog-background-color);border-radius:var(--el-border-radius-small);-webkit-box-shadow:var(--el-dialog-box-shadow);box-shadow:var(--el-dialog-box-shadow);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;left:0;margin:0}.el-dialog__header{padding:var(--el-dialog-padding-primary);padding-bottom:10px}.el-dialog__headerbtn{position:absolute;top:var(--el-dialog-padding-primary);right:var(--el-dialog-padding-primary);padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:var(--el-message-close-size)}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info)}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{line-height:var(--el-dialog-font-line-height);font-size:var(--el-dialog-title-font-size);color:var(--el-text-color-primary)}.el-dialog__body{padding:calc(var(--el-dialog-padding-primary) + 10px) var(--el-dialog-padding-primary);color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size);word-break:break-all}.el-dialog__footer{padding:var(--el-dialog-padding-primary);padding-top:10px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px calc(var(--el-dialog-padding-primary) + 5px) 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:modal-fade-in var(--el-transition-duration)!important;animation:modal-fade-in var(--el-transition-duration)!important}.dialog-fade-enter-active .el-dialog{-webkit-animation:dialog-fade-in var(--el-transition-duration);animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{-webkit-animation:modal-fade-out var(--el-transition-duration);animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-dialog{-webkit-animation:dialog-fade-out var(--el-transition-duration);animation:dialog-fade-out var(--el-transition-duration)}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@-webkit-keyframes modal-fade-in{0%{opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes modal-fade-in{0%{opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes modal-fade-out{0%{opacity:1}100%{opacity:0}}@keyframes modal-fade-out{0%{opacity:1}100%{opacity:0}}.el-input__inner,.el-textarea__inner{background-image:none;-webkit-transition:var(--el-border-transition-base);width:100%}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:var(--el-font-size-base)}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:inherit;color:var(--el-text-color-regular);background-color:#fff;border:1px solid #dcdfe6;border-radius:var(--el-border-radius-base);-webkit-transition:var(--el-border-transition-base);transition:var(--el-border-transition-base)}.el-textarea__inner::-webkit-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner::-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea__inner:hover{border-color:var(--el-text-color-placeholder)}.el-textarea__inner:focus{outline:0;border-color:#409eff}.el-textarea .el-input__count{color:var(--el-color-info);background:#fff;position:absolute;font-size:12px;line-height:14px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{border-color:var(--el-color-danger)}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{position:relative;font-size:var(--el-font-size-base);display:inline-block;width:100%;line-height:40px}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:var(--el-text-color-placeholder);font-size:14px;cursor:pointer;-webkit-transition:var(--el-color-transition-base);transition:var(--el-color-transition-base)}.el-input .el-input__clear:hover{color:var(--el-text-color-secondary)}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--el-color-info);font-size:12px}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input,.el-input__inner{font-size:inherit}.el-input .el-input__count .el-input__count-inner{background:#fff;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#fff;border-radius:var(--el-border-radius-base);border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-block;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:var(--el-border-transition-base);transition:var(--el-border-transition-base)}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all var(--el-transition-duration);text-align:center;height:100%;color:var(--el-text-color-placeholder)}.el-input__inner::-webkit-input-placeholder{color:var(--el-text-color-placeholder)}.el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-input__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input__inner::-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input__inner:hover{border-color:var(--el-text-color-placeholder)}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409eff;outline:0}.el-input__suffix{right:5px;-webkit-transition:all var(--el-transition-duration);transition:all var(--el-transition-duration);pointer-events:none}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px;-webkit-transition:all var(--el-transition-duration);transition:all var(--el-transition-duration)}.el-input__icon{width:25px;text-align:center;-webkit-transition:all var(--el-transition-duration);transition:all var(--el-transition-duration);line-height:40px}.el-input__icon:after{content:"";height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-exceed .el-input__inner{border-color:var(--el-color-danger)}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--suffix--password-clear .el-input__inner{padding-right:55px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px;line-height:36px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px;line-height:32px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px;line-height:28px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#f5f7fa;color:var(--el-color-info);vertical-align:middle;display:table-cell;position:relative;border:1px solid #dcdfe6;border-radius:var(--el-border-radius-base);padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}:root{--el-message-min-width:380px;--el-message-background-color:#edf2fc;--el-message-padding:15px 15px 15px 20px;--el-message-close-icon-color:var(--el-text-color-placeholder);--el-message-close-hover-color:var(--el-text-color-secondary);--el-message-success-font-color:var(--el-color-success);--el-message-info-font-color:var(--el-color-info);--el-message-warning-font-color:var(--el-color-warning);--el-message-error-font-color:var(--el-color-error)}.el-message{min-width:var(--el-message-min-width);-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:var(--el-border-radius-base);border-width:var(--el-border-width-base);border-style:var(--el-border-style-base);border-color:var(--el-border-color-lighter);position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:var(--el-message-background-color);-webkit-transition:opacity var(--el-transition-duration),top .4s,-webkit-transform .4s;transition:opacity var(--el-transition-duration),top .4s,-webkit-transform .4s;transition:opacity var(--el-transition-duration),transform .4s,top .4s;transition:opacity var(--el-transition-duration),transform .4s,top .4s,-webkit-transform .4s;overflow:hidden;padding:var(--el-message-padding);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:var(--el-message-success-font-color)}.el-message--info{background-color:#f4f4f5;border-color:#e9e9eb}.el-message--info .el-message__content{color:var(--el-message-info-font-color)}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:var(--el-message-warning-font-color)}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:var(--el-message-error-font-color)}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:var(--el-message-close-icon-color);font-size:var(--el-message-close-size)}.el-message__closeBtn:focus{outline-width:0}.el-message__closeBtn:hover{color:var(--el-message-close-hover-color)}.el-message .el-icon-success{color:var(--el-message-success-font-color)}.el-message .el-icon-info{color:var(--el-message-info-font-color)}.el-message .el-icon-warning{color:var(--el-message-warning-font-color)}.el-message .el-icon-error{color:var(--el-message-error-font-color)}.el-message-fade-enter-from,.el-message-fade-leave-to{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}:root{--el-color-primary:#409eff;--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-light-1:#53a8ff;--el-color-primary-light-2:#66b1ff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-4:#8cc5ff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-6:#b3d8ff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-success:#67c23a;--el-color-success-light:#e1f3d8;--el-color-success-lighter:#f0f9eb;--el-color-warning:#e6a23c;--el-color-warning-light:#faecd8;--el-color-warning-lighter:#fdf6ec;--el-color-danger:#f56c6c;--el-color-danger-light:#fde2e2;--el-color-danger-lighter:#fef0f0;--el-color-error:#f56c6c;--el-color-error-light:#fde2e2;--el-color-error-lighter:#fef0f0;--el-color-info:#909399;--el-color-info-light:#e9e9eb;--el-color-info-lighter:#f4f4f5;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#c0c4cc;--el-border-color-base:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-background-color-base:#f5f7fa;--el-link-color:var(--el-color-primary-light-2);--el-link-hover-color:var(--el-color-primary);--el-border-width-base:1px;--el-border-style-base:solid;--el-border-color-hover:var(--el-text-color-placeholder);--el-border-base:var(--el-border-width-base) var(--el-border-style-base) var(--el-border-color-base);--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-box-shadow-base:0 2px 4px rgba(0, 0, 0, 0.12),0 0 6px rgba(0, 0, 0, 0.04);--el-box-shadow-light:0 2px 12px 0 rgba(0, 0, 0, 0.1);--el-svg-monochrome-grey:#dcdde0;--el-fill-base:var(--el-color-white);--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-font-color-disabled-base:#bbb;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-disabled-fill-base:var(--el-background-color-base);--el-disabled-color-base:var(--el-text-color-placeholder);--el-disabled-border-base:var(--el-border-color-light);--el-button-font-weight:var(--el-font-weight-primary);--el-button-default-font-color:var(--el-text-color-regular);--el-button-default-background-color:var(--el-color-white);--el-button-default-border-color:var(--el-border-color-base);--el-button-disabled-font-color:var(--el-text-color-placeholder);--el-button-disabled-background-color:var(--el-color-white);--el-button-disabled-border-color:var(--el-border-color-light);--el-message-close-size:16px;--el-transition-duration:0.3s;--el-transition-duration-fast:0.2s;--el-ease-in-out-bezier-function:cubic-bezier(0.645, 0.045, 0.355, 1);--el-fast-bezier-transition:cubic-bezier(0.23, 1, 0.32, 1);--el-all-transition:all var(--el-transition-duration) var(--el-ease-in-out-bezier-function);--el-fade-transition:opacity var(--el-transition-duration) var(--el-fast-bezier-transition);--el-md-fade-transition:transform var(--el-transition-duration) var(--el-fast-bezier-transition),opacity var(--el-transition-duration) var(--el-fast-bezier-transition);--el-fade-linear-transition:opacity var(--el-transition-duration-fast) linear;--el-border-transition-base:border-color var(--el-transition-duration-fast) var(--el-ease-in-out-bezier-function);--el-color-transition-base:color var(--el-transition-duration-fast) var(--el-ease-in-out-bezier-function)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:var(--el-fade-linear-transition);transition:var(--el-fade-linear-transition)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:var(--el-fade-linear-transition);transition:var(--el-fade-linear-transition)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1);transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1);transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:var(--el-md-fade-transition);transition:var(--el-md-fade-transition);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:var(--el-md-fade-transition);transition:var(--el-md-fade-transition);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1);-webkit-transition:var(--el-md-fade-transition);transition:var(--el-md-fade-transition);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.collapse-transition{-webkit-transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out;transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{-webkit-transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out;transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter-from,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1);transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}@font-face{font-family:element-icons;src:url(/assets/element-icons.9c88a535.woff) format("woff"),url(/assets/element-icons.de5eb258.ttf) format("truetype");font-weight:400;font-display:"auto";font-style:normal}[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:""}.el-icon-ice-cream-square:before{content:""}.el-icon-lollipop:before{content:""}.el-icon-potato-strips:before{content:""}.el-icon-milk-tea:before{content:""}.el-icon-ice-drink:before{content:""}.el-icon-ice-tea:before{content:""}.el-icon-coffee:before{content:""}.el-icon-orange:before{content:""}.el-icon-pear:before{content:""}.el-icon-apple:before{content:""}.el-icon-cherry:before{content:""}.el-icon-watermelon:before{content:""}.el-icon-grape:before{content:""}.el-icon-refrigerator:before{content:""}.el-icon-goblet-square-full:before{content:""}.el-icon-goblet-square:before{content:""}.el-icon-goblet-full:before{content:""}.el-icon-goblet:before{content:""}.el-icon-cold-drink:before{content:""}.el-icon-coffee-cup:before{content:""}.el-icon-water-cup:before{content:""}.el-icon-hot-water:before{content:""}.el-icon-ice-cream:before{content:""}.el-icon-dessert:before{content:""}.el-icon-sugar:before{content:""}.el-icon-tableware:before{content:""}.el-icon-burger:before{content:""}.el-icon-knife-fork:before{content:""}.el-icon-fork-spoon:before{content:""}.el-icon-chicken:before{content:""}.el-icon-food:before{content:""}.el-icon-dish-1:before{content:""}.el-icon-dish:before{content:""}.el-icon-moon-night:before{content:""}.el-icon-moon:before{content:""}.el-icon-cloudy-and-sunny:before{content:""}.el-icon-partly-cloudy:before{content:""}.el-icon-cloudy:before{content:""}.el-icon-sunny:before{content:""}.el-icon-sunset:before{content:""}.el-icon-sunrise-1:before{content:""}.el-icon-sunrise:before{content:""}.el-icon-heavy-rain:before{content:""}.el-icon-lightning:before{content:""}.el-icon-light-rain:before{content:""}.el-icon-wind-power:before{content:""}.el-icon-baseball:before{content:""}.el-icon-soccer:before{content:""}.el-icon-football:before{content:""}.el-icon-basketball:before{content:""}.el-icon-ship:before{content:""}.el-icon-truck:before{content:""}.el-icon-bicycle:before{content:""}.el-icon-mobile-phone:before{content:""}.el-icon-service:before{content:""}.el-icon-key:before{content:""}.el-icon-unlock:before{content:""}.el-icon-lock:before{content:""}.el-icon-watch:before{content:""}.el-icon-watch-1:before{content:""}.el-icon-timer:before{content:""}.el-icon-alarm-clock:before{content:""}.el-icon-map-location:before{content:""}.el-icon-delete-location:before{content:""}.el-icon-add-location:before{content:""}.el-icon-location-information:before{content:""}.el-icon-location-outline:before{content:""}.el-icon-location:before{content:""}.el-icon-place:before{content:""}.el-icon-discover:before{content:""}.el-icon-first-aid-kit:before{content:""}.el-icon-trophy-1:before{content:""}.el-icon-trophy:before{content:""}.el-icon-medal:before{content:""}.el-icon-medal-1:before{content:""}.el-icon-stopwatch:before{content:""}.el-icon-mic:before{content:""}.el-icon-copy-document:before{content:""}.el-icon-full-screen:before{content:""}.el-icon-switch-button:before{content:""}.el-icon-aim:before{content:""}.el-icon-crop:before{content:""}.el-icon-odometer:before{content:""}.el-icon-time:before{content:""}.el-icon-bangzhu:before{content:""}.el-icon-close-notification:before{content:""}.el-icon-microphone:before{content:""}.el-icon-turn-off-microphone:before{content:""}.el-icon-position:before{content:""}.el-icon-postcard:before{content:""}.el-icon-message:before{content:""}.el-icon-chat-line-square:before{content:""}.el-icon-chat-dot-square:before{content:""}.el-icon-chat-dot-round:before{content:""}.el-icon-chat-square:before{content:""}.el-icon-chat-line-round:before{content:""}.el-icon-chat-round:before{content:""}.el-icon-set-up:before{content:""}.el-icon-turn-off:before{content:""}.el-icon-open:before{content:""}.el-icon-connection:before{content:""}.el-icon-link:before{content:""}.el-icon-cpu:before{content:""}.el-icon-thumb:before{content:""}.el-icon-female:before{content:""}.el-icon-male:before{content:""}.el-icon-guide:before{content:""}.el-icon-news:before{content:""}.el-icon-price-tag:before{content:""}.el-icon-discount:before{content:""}.el-icon-wallet:before{content:""}.el-icon-coin:before{content:""}.el-icon-money:before{content:""}.el-icon-bank-card:before{content:""}.el-icon-box:before{content:""}.el-icon-present:before{content:""}.el-icon-sell:before{content:""}.el-icon-sold-out:before{content:""}.el-icon-shopping-bag-2:before{content:""}.el-icon-shopping-bag-1:before{content:""}.el-icon-shopping-cart-2:before{content:""}.el-icon-shopping-cart-1:before{content:""}.el-icon-shopping-cart-full:before{content:""}.el-icon-smoking:before{content:""}.el-icon-no-smoking:before{content:""}.el-icon-house:before{content:""}.el-icon-table-lamp:before{content:""}.el-icon-school:before{content:""}.el-icon-office-building:before{content:""}.el-icon-toilet-paper:before{content:""}.el-icon-notebook-2:before{content:""}.el-icon-notebook-1:before{content:""}.el-icon-files:before{content:""}.el-icon-collection:before{content:""}.el-icon-receiving:before{content:""}.el-icon-suitcase-1:before{content:""}.el-icon-suitcase:before{content:""}.el-icon-film:before{content:""}.el-icon-collection-tag:before{content:""}.el-icon-data-analysis:before{content:""}.el-icon-pie-chart:before{content:""}.el-icon-data-board:before{content:""}.el-icon-data-line:before{content:""}.el-icon-reading:before{content:""}.el-icon-magic-stick:before{content:""}.el-icon-coordinate:before{content:""}.el-icon-mouse:before{content:""}.el-icon-brush:before{content:""}.el-icon-headset:before{content:""}.el-icon-umbrella:before{content:""}.el-icon-scissors:before{content:""}.el-icon-mobile:before{content:""}.el-icon-attract:before{content:""}.el-icon-monitor:before{content:""}.el-icon-search:before{content:""}.el-icon-takeaway-box:before{content:""}.el-icon-paperclip:before{content:""}.el-icon-printer:before{content:""}.el-icon-document-add:before{content:""}.el-icon-document:before{content:""}.el-icon-document-checked:before{content:""}.el-icon-document-copy:before{content:""}.el-icon-document-delete:before{content:""}.el-icon-document-remove:before{content:""}.el-icon-tickets:before{content:""}.el-icon-folder-checked:before{content:""}.el-icon-folder-delete:before{content:""}.el-icon-folder-remove:before{content:""}.el-icon-folder-add:before{content:""}.el-icon-folder-opened:before{content:""}.el-icon-folder:before{content:""}.el-icon-edit-outline:before{content:""}.el-icon-edit:before{content:""}.el-icon-date:before{content:""}.el-icon-c-scale-to-original:before{content:""}.el-icon-view:before{content:""}.el-icon-loading:before{content:""}.el-icon-rank:before{content:""}.el-icon-sort-down:before{content:""}.el-icon-sort-up:before{content:""}.el-icon-sort:before{content:""}.el-icon-finished:before{content:""}.el-icon-refresh-left:before{content:""}.el-icon-refresh-right:before{content:""}.el-icon-refresh:before{content:""}.el-icon-video-play:before{content:""}.el-icon-video-pause:before{content:""}.el-icon-d-arrow-right:before{content:""}.el-icon-d-arrow-left:before{content:""}.el-icon-arrow-up:before{content:""}.el-icon-arrow-down:before{content:""}.el-icon-arrow-right:before{content:""}.el-icon-arrow-left:before{content:""}.el-icon-top-right:before{content:""}.el-icon-top-left:before{content:""}.el-icon-top:before{content:""}.el-icon-bottom:before{content:""}.el-icon-right:before{content:""}.el-icon-back:before{content:""}.el-icon-bottom-right:before{content:""}.el-icon-bottom-left:before{content:""}.el-icon-caret-top:before{content:""}.el-icon-caret-bottom:before{content:""}.el-icon-caret-right:before{content:""}.el-icon-caret-left:before{content:""}.el-icon-d-caret:before{content:""}.el-icon-share:before{content:""}.el-icon-menu:before{content:""}.el-icon-s-grid:before{content:""}.el-icon-s-check:before{content:""}.el-icon-s-data:before{content:""}.el-icon-s-opportunity:before{content:""}.el-icon-s-custom:before{content:""}.el-icon-s-claim:before{content:""}.el-icon-s-finance:before{content:""}.el-icon-s-comment:before{content:""}.el-icon-s-flag:before{content:""}.el-icon-s-marketing:before{content:""}.el-icon-s-shop:before{content:""}.el-icon-s-open:before{content:""}.el-icon-s-management:before{content:""}.el-icon-s-ticket:before{content:""}.el-icon-s-release:before{content:""}.el-icon-s-home:before{content:""}.el-icon-s-promotion:before{content:""}.el-icon-s-operation:before{content:""}.el-icon-s-unfold:before{content:""}.el-icon-s-fold:before{content:""}.el-icon-s-platform:before{content:""}.el-icon-s-order:before{content:""}.el-icon-s-cooperation:before{content:""}.el-icon-bell:before{content:""}.el-icon-message-solid:before{content:""}.el-icon-video-camera:before{content:""}.el-icon-video-camera-solid:before{content:""}.el-icon-camera:before{content:""}.el-icon-camera-solid:before{content:""}.el-icon-download:before{content:""}.el-icon-upload2:before{content:""}.el-icon-upload:before{content:""}.el-icon-picture-outline-round:before{content:""}.el-icon-picture-outline:before{content:""}.el-icon-picture:before{content:""}.el-icon-close:before{content:""}.el-icon-check:before{content:""}.el-icon-plus:before{content:""}.el-icon-minus:before{content:""}.el-icon-help:before{content:""}.el-icon-s-help:before{content:""}.el-icon-circle-close:before{content:""}.el-icon-circle-check:before{content:""}.el-icon-circle-plus-outline:before{content:""}.el-icon-remove-outline:before{content:""}.el-icon-zoom-out:before{content:""}.el-icon-zoom-in:before{content:""}.el-icon-error:before{content:""}.el-icon-success:before{content:""}.el-icon-circle-plus:before{content:""}.el-icon-remove:before{content:""}.el-icon-info:before{content:""}.el-icon-question:before{content:""}.el-icon-warning-outline:before{content:""}.el-icon-warning:before{content:""}.el-icon-goods:before{content:""}.el-icon-s-goods:before{content:""}.el-icon-star-off:before{content:""}.el-icon-star-on:before{content:""}.el-icon-more-outline:before{content:""}.el-icon-more:before{content:""}.el-icon-phone-outline:before{content:""}.el-icon-phone:before{content:""}.el-icon-user:before{content:""}.el-icon-user-solid:before{content:""}.el-icon-setting:before{content:""}.el-icon-s-tools:before{content:""}.el-icon-delete:before{content:""}.el-icon-delete-solid:before{content:""}.el-icon-eleme:before{content:""}.el-icon-platform-eleme:before{content:""}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}@keyframes rotating{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}100%{-webkit-transform:rotateZ(360deg);transform:rotateZ(360deg)}}a[data-v-4b23e37a]{color:#42b983}.NinjaLogo{-webkit-animation:1s appear;animation:1s appear}@-webkit-keyframes appear{0%{opacity:0}}@keyframes appear{0%{opacity:0}}.header[data-v-1f23ce5f]{height:4rem;--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity));--tw-shadow:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.header-wrapper[data-v-1f23ce5f]{margin:auto;display:flex;height:100%;width:91.666667%;max-width:64rem;align-items:center;justify-content:space-between;font-size:1.5rem;line-height:2rem;font-weight:700}/*! tailwindcss v2.2.7 | MIT License | https://tailwindcss.com *//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */*,::after,::before{box-sizing:border-box}html{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}body{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji'}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}fieldset{margin:0;padding:0}ol,ul{list-style:none;margin:0;padding:0}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}body{font-family:inherit;line-height:inherit}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:currentColor}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::after,::before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}#app .absolute{position:absolute}#app .z-50{z-index:50}#app .m-auto{margin:auto}#app .my-4{margin-top:1rem;margin-bottom:1rem}#app .mt-4{margin-top:1rem}#app .ml-0{margin-left:0}#app .ml-2{margin-left:.5rem}#app .flex{display:flex}#app .table{display:table}#app .hidden{display:none}#app .h-10{height:2.5rem}#app .h-16{height:4rem}#app .h-full{height:100%}#app .h-screen{height:100vh}#app .w-10{width:2.5rem}#app .w-48{width:12rem}#app .w-11\/12{width:91.666667%}#app .w-full{width:100%}#app .w-screen{width:100vw}#app .max-w-5xl{max-width:64rem}@-webkit-keyframes spin{to{transform:rotate(360deg)}}@keyframes spin{to{transform:rotate(360deg)}}@-webkit-keyframes ping{100%,75%{transform:scale(2);opacity:0}}@keyframes ping{100%,75%{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,100%{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(0.8,0,1,1);animation-timing-function:cubic-bezier(0.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,0.2,1);animation-timing-function:cubic-bezier(0,0,0.2,1)}}@keyframes bounce{0%,100%{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(0.8,0,1,1);animation-timing-function:cubic-bezier(0.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,0.2,1);animation-timing-function:cubic-bezier(0,0,0.2,1)}}#app .select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#app .flex-col{flex-direction:column}#app .items-center{align-items:center}#app .justify-center{justify-content:center}#app .justify-between{justify-content:space-between}#app .rounded-full{border-radius:9999px}#app .bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}#app .bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}#app .bg-opacity-30{--tw-bg-opacity:0.3}#app .px-2{padding-left:.5rem;padding-right:.5rem}#app .py-1{padding-top:.25rem;padding-bottom:.25rem}#app .pt-6{padding-top:1.5rem}#app .pr-2{padding-right:.5rem}#app .pb-4{padding-bottom:1rem}#app .pl-3{padding-left:.75rem}#app .text-center{text-align:center}#app .text-xs{font-size:.75rem;line-height:1rem}#app .text-base{font-size:1rem;line-height:1.5rem}#app .text-2xl{font-size:1.5rem;line-height:2rem}#app .font-normal{font-weight:400}#app .font-bold{font-weight:700}#app .leading-6{line-height:1.5rem}#app .leading-normal{line-height:1.5}#app .text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}*,::after,::before{--tw-shadow:0 0 #0000}#app .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}*,::after,::before{--tw-ring-inset:var(--tw-empty, );/*!*//*!*/--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59, 130, 246, 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000}#app .drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}#app .backdrop-filter{--tw-backdrop-blur:var(--tw-empty, );/*!*//*!*/--tw-backdrop-brightness:var(--tw-empty, );/*!*//*!*/--tw-backdrop-contrast:var(--tw-empty, );/*!*//*!*/--tw-backdrop-grayscale:var(--tw-empty, );/*!*//*!*/--tw-backdrop-hue-rotate:var(--tw-empty, );/*!*//*!*/--tw-backdrop-invert:var(--tw-empty, );/*!*//*!*/--tw-backdrop-opacity:var(--tw-empty, );/*!*//*!*/--tw-backdrop-saturate:var(--tw-empty, );/*!*//*!*/--tw-backdrop-sepia:var(--tw-empty, );/*!*//*!*/-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}#app .backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}#app .transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}*,::after,::before{box-sizing:border-box;margin:0}#app{font-family:'Source Sans Pro',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:16px;word-spacing:1px;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;box-sizing:border-box;display:flex;min-height:100vh;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex-direction:column;--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.main{flex:1 1 0%}.content{margin:auto;width:91.666667%;max-width:64rem}.card{margin:auto;margin-top:1.25rem;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity));--tw-shadow:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.card-header{border-bottom-width:1px;padding:1rem}.card-title{font-size:1.125rem;line-height:1.75rem;font-weight:500}.card-subtitle{font-size:.875rem;line-height:1.25rem;font-weight:400;--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-footer{padding-right:1rem;padding-bottom:1rem;padding-left:1rem;text-align:right}a{--tw-text-opacity:1!important;color:rgba(96,165,250,var(--tw-text-opacity))!important} -------------------------------------------------------------------------------- /backend/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@koa/cors': ^3.1.0 5 | '@koa/router': ^10.1.0 6 | axios: ^0.21.1 7 | dotenv: ^10.0.0 8 | got: ^11.8.2 9 | koa: ^2.13.1 10 | koa-body: ^4.2.0 11 | koa-log4: ^2.3.2 12 | koa-static: ^5.0.0 13 | nodemon: ^2.0.12 14 | qrcode: ^1.4.4 15 | 16 | dependencies: 17 | '@koa/cors': 3.1.0 18 | '@koa/router': 10.1.0 19 | axios: 0.21.1 20 | dotenv: 10.0.0 21 | got: 11.8.2 22 | koa: 2.13.1 23 | koa-body: 4.2.0 24 | koa-log4: 2.3.2 25 | koa-static: 5.0.0 26 | nodemon: 2.0.12 27 | qrcode: 1.4.4 28 | 29 | packages: 30 | 31 | /@koa/cors/3.1.0: 32 | resolution: {integrity: sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q==} 33 | engines: {node: '>= 8.0.0'} 34 | dependencies: 35 | vary: 1.1.2 36 | dev: false 37 | 38 | /@koa/router/10.1.0: 39 | resolution: {integrity: sha512-QZiCDn8Fd9vVN0qCWw81fToF5GMdtyPD04fIOHXiCCmXB6sznhjHMd3xbVS2ZxrgLWrcN8s6tIItEv0wuXt2Ow==} 40 | engines: {node: '>= 8.0.0'} 41 | dependencies: 42 | debug: 4.3.2 43 | http-errors: 1.8.0 44 | koa-compose: 4.1.0 45 | methods: 1.1.2 46 | path-to-regexp: 6.2.0 47 | transitivePeerDependencies: 48 | - supports-color 49 | dev: false 50 | 51 | /@sindresorhus/is/0.14.0: 52 | resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} 53 | engines: {node: '>=6'} 54 | dev: false 55 | 56 | /@sindresorhus/is/4.0.1: 57 | resolution: {integrity: sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==} 58 | engines: {node: '>=10'} 59 | dev: false 60 | 61 | /@szmarczak/http-timer/1.1.2: 62 | resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} 63 | engines: {node: '>=6'} 64 | dependencies: 65 | defer-to-connect: 1.1.3 66 | dev: false 67 | 68 | /@szmarczak/http-timer/4.0.6: 69 | resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} 70 | engines: {node: '>=10'} 71 | dependencies: 72 | defer-to-connect: 2.0.1 73 | dev: false 74 | 75 | /@types/cacheable-request/6.0.2: 76 | resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} 77 | dependencies: 78 | '@types/http-cache-semantics': 4.0.1 79 | '@types/keyv': 3.1.2 80 | '@types/node': 16.4.3 81 | '@types/responselike': 1.0.0 82 | dev: false 83 | 84 | /@types/formidable/1.2.3: 85 | resolution: {integrity: sha512-Ibu3TyzldPvzTK1yus5+uPDwN5m6pXCcO0c0rPKA1uce5ERjqP5AX9reKEqQFVlCScqjbQgitIQEOLlb6qd7Sw==} 86 | dependencies: 87 | '@types/node': 16.4.3 88 | dev: false 89 | 90 | /@types/http-cache-semantics/4.0.1: 91 | resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} 92 | dev: false 93 | 94 | /@types/keyv/3.1.2: 95 | resolution: {integrity: sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==} 96 | dependencies: 97 | '@types/node': 16.4.3 98 | dev: false 99 | 100 | /@types/node/16.4.3: 101 | resolution: {integrity: sha512-GKM4FLMkWDc0sfx7tXqPWkM6NBow1kge0fgQh0bOnlqo4iT1kvTvMEKE0c1RtUGnbLlGRXiAA8SumE//90uKAg==} 102 | dev: false 103 | 104 | /@types/responselike/1.0.0: 105 | resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} 106 | dependencies: 107 | '@types/node': 16.4.3 108 | dev: false 109 | 110 | /abbrev/1.1.1: 111 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 112 | dev: false 113 | 114 | /accepts/1.3.7: 115 | resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==} 116 | engines: {node: '>= 0.6'} 117 | dependencies: 118 | mime-types: 2.1.31 119 | negotiator: 0.6.2 120 | dev: false 121 | 122 | /ansi-align/3.0.0: 123 | resolution: {integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==} 124 | dependencies: 125 | string-width: 3.1.0 126 | dev: false 127 | 128 | /ansi-regex/4.1.0: 129 | resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==} 130 | engines: {node: '>=6'} 131 | dev: false 132 | 133 | /ansi-regex/5.0.0: 134 | resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} 135 | engines: {node: '>=8'} 136 | dev: false 137 | 138 | /ansi-styles/3.2.1: 139 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 140 | engines: {node: '>=4'} 141 | dependencies: 142 | color-convert: 1.9.3 143 | dev: false 144 | 145 | /ansi-styles/4.3.0: 146 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 147 | engines: {node: '>=8'} 148 | dependencies: 149 | color-convert: 2.0.1 150 | dev: false 151 | 152 | /any-promise/1.3.0: 153 | resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} 154 | dev: false 155 | 156 | /anymatch/3.1.2: 157 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 158 | engines: {node: '>= 8'} 159 | dependencies: 160 | normalize-path: 3.0.0 161 | picomatch: 2.3.0 162 | dev: false 163 | 164 | /axios/0.21.1: 165 | resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==} 166 | dependencies: 167 | follow-redirects: 1.14.1 168 | transitivePeerDependencies: 169 | - debug 170 | dev: false 171 | 172 | /balanced-match/1.0.2: 173 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 174 | dev: false 175 | 176 | /base64-js/1.5.1: 177 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 178 | dev: false 179 | 180 | /binary-extensions/2.2.0: 181 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 182 | engines: {node: '>=8'} 183 | dev: false 184 | 185 | /boxen/4.2.0: 186 | resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==} 187 | engines: {node: '>=8'} 188 | dependencies: 189 | ansi-align: 3.0.0 190 | camelcase: 5.3.1 191 | chalk: 3.0.0 192 | cli-boxes: 2.2.1 193 | string-width: 4.2.2 194 | term-size: 2.2.1 195 | type-fest: 0.8.1 196 | widest-line: 3.1.0 197 | dev: false 198 | 199 | /brace-expansion/1.1.11: 200 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 201 | dependencies: 202 | balanced-match: 1.0.2 203 | concat-map: 0.0.1 204 | dev: false 205 | 206 | /braces/3.0.2: 207 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 208 | engines: {node: '>=8'} 209 | dependencies: 210 | fill-range: 7.0.1 211 | dev: false 212 | 213 | /buffer-alloc-unsafe/1.1.0: 214 | resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} 215 | dev: false 216 | 217 | /buffer-alloc/1.2.0: 218 | resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} 219 | dependencies: 220 | buffer-alloc-unsafe: 1.1.0 221 | buffer-fill: 1.0.0 222 | dev: false 223 | 224 | /buffer-fill/1.0.0: 225 | resolution: {integrity: sha1-+PeLdniYiO858gXNY39o5wISKyw=} 226 | dev: false 227 | 228 | /buffer-from/1.1.1: 229 | resolution: {integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==} 230 | dev: false 231 | 232 | /buffer/5.7.1: 233 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 234 | dependencies: 235 | base64-js: 1.5.1 236 | ieee754: 1.2.1 237 | dev: false 238 | 239 | /bytes/3.1.0: 240 | resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} 241 | engines: {node: '>= 0.8'} 242 | dev: false 243 | 244 | /cache-content-type/1.0.1: 245 | resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} 246 | engines: {node: '>= 6.0.0'} 247 | dependencies: 248 | mime-types: 2.1.31 249 | ylru: 1.2.1 250 | dev: false 251 | 252 | /cacheable-lookup/5.0.4: 253 | resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} 254 | engines: {node: '>=10.6.0'} 255 | dev: false 256 | 257 | /cacheable-request/6.1.0: 258 | resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} 259 | engines: {node: '>=8'} 260 | dependencies: 261 | clone-response: 1.0.2 262 | get-stream: 5.2.0 263 | http-cache-semantics: 4.1.0 264 | keyv: 3.1.0 265 | lowercase-keys: 2.0.0 266 | normalize-url: 4.5.1 267 | responselike: 1.0.2 268 | dev: false 269 | 270 | /cacheable-request/7.0.2: 271 | resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} 272 | engines: {node: '>=8'} 273 | dependencies: 274 | clone-response: 1.0.2 275 | get-stream: 5.2.0 276 | http-cache-semantics: 4.1.0 277 | keyv: 4.0.3 278 | lowercase-keys: 2.0.0 279 | normalize-url: 6.1.0 280 | responselike: 2.0.0 281 | dev: false 282 | 283 | /call-bind/1.0.2: 284 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 285 | dependencies: 286 | function-bind: 1.1.1 287 | get-intrinsic: 1.1.1 288 | dev: false 289 | 290 | /camelcase/5.3.1: 291 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 292 | engines: {node: '>=6'} 293 | dev: false 294 | 295 | /chalk/3.0.0: 296 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 297 | engines: {node: '>=8'} 298 | dependencies: 299 | ansi-styles: 4.3.0 300 | supports-color: 7.2.0 301 | dev: false 302 | 303 | /chokidar/3.5.2: 304 | resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} 305 | engines: {node: '>= 8.10.0'} 306 | dependencies: 307 | anymatch: 3.1.2 308 | braces: 3.0.2 309 | glob-parent: 5.1.2 310 | is-binary-path: 2.1.0 311 | is-glob: 4.0.1 312 | normalize-path: 3.0.0 313 | readdirp: 3.6.0 314 | optionalDependencies: 315 | fsevents: 2.3.2 316 | dev: false 317 | 318 | /ci-info/2.0.0: 319 | resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} 320 | dev: false 321 | 322 | /circular-json/0.5.9: 323 | resolution: {integrity: sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==} 324 | deprecated: CircularJSON is in maintenance only, flatted is its successor. 325 | dev: false 326 | 327 | /cli-boxes/2.2.1: 328 | resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} 329 | engines: {node: '>=6'} 330 | dev: false 331 | 332 | /cliui/5.0.0: 333 | resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} 334 | dependencies: 335 | string-width: 3.1.0 336 | strip-ansi: 5.2.0 337 | wrap-ansi: 5.1.0 338 | dev: false 339 | 340 | /clone-response/1.0.2: 341 | resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=} 342 | dependencies: 343 | mimic-response: 1.0.1 344 | dev: false 345 | 346 | /co-body/5.2.0: 347 | resolution: {integrity: sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==} 348 | dependencies: 349 | inflation: 2.0.0 350 | qs: 6.10.1 351 | raw-body: 2.4.1 352 | type-is: 1.6.18 353 | dev: false 354 | 355 | /co/4.6.0: 356 | resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} 357 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 358 | dev: false 359 | 360 | /color-convert/1.9.3: 361 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 362 | dependencies: 363 | color-name: 1.1.3 364 | dev: false 365 | 366 | /color-convert/2.0.1: 367 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 368 | engines: {node: '>=7.0.0'} 369 | dependencies: 370 | color-name: 1.1.4 371 | dev: false 372 | 373 | /color-name/1.1.3: 374 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 375 | dev: false 376 | 377 | /color-name/1.1.4: 378 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 379 | dev: false 380 | 381 | /concat-map/0.0.1: 382 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 383 | dev: false 384 | 385 | /configstore/5.0.1: 386 | resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} 387 | engines: {node: '>=8'} 388 | dependencies: 389 | dot-prop: 5.3.0 390 | graceful-fs: 4.2.6 391 | make-dir: 3.1.0 392 | unique-string: 2.0.0 393 | write-file-atomic: 3.0.3 394 | xdg-basedir: 4.0.0 395 | dev: false 396 | 397 | /content-disposition/0.5.3: 398 | resolution: {integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==} 399 | engines: {node: '>= 0.6'} 400 | dependencies: 401 | safe-buffer: 5.1.2 402 | dev: false 403 | 404 | /content-type/1.0.4: 405 | resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} 406 | engines: {node: '>= 0.6'} 407 | dev: false 408 | 409 | /cookies/0.8.0: 410 | resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} 411 | engines: {node: '>= 0.8'} 412 | dependencies: 413 | depd: 2.0.0 414 | keygrip: 1.1.0 415 | dev: false 416 | 417 | /core-util-is/1.0.2: 418 | resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} 419 | dev: false 420 | 421 | /crypto-random-string/2.0.0: 422 | resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} 423 | engines: {node: '>=8'} 424 | dev: false 425 | 426 | /date-format/1.2.0: 427 | resolution: {integrity: sha1-YV6CjiM90aubua4JUODOzPpuytg=} 428 | engines: {node: '>=4.0'} 429 | dev: false 430 | 431 | /debug/2.6.9: 432 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 433 | dependencies: 434 | ms: 2.0.0 435 | dev: false 436 | 437 | /debug/3.1.0: 438 | resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} 439 | dependencies: 440 | ms: 2.0.0 441 | dev: false 442 | 443 | /debug/3.2.7: 444 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 445 | dependencies: 446 | ms: 2.1.3 447 | dev: false 448 | 449 | /debug/4.3.2: 450 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} 451 | engines: {node: '>=6.0'} 452 | peerDependencies: 453 | supports-color: '*' 454 | peerDependenciesMeta: 455 | supports-color: 456 | optional: true 457 | dependencies: 458 | ms: 2.1.2 459 | dev: false 460 | 461 | /decamelize/1.2.0: 462 | resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} 463 | engines: {node: '>=0.10.0'} 464 | dev: false 465 | 466 | /decompress-response/3.3.0: 467 | resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=} 468 | engines: {node: '>=4'} 469 | dependencies: 470 | mimic-response: 1.0.1 471 | dev: false 472 | 473 | /decompress-response/6.0.0: 474 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 475 | engines: {node: '>=10'} 476 | dependencies: 477 | mimic-response: 3.1.0 478 | dev: false 479 | 480 | /deep-equal/1.0.1: 481 | resolution: {integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=} 482 | dev: false 483 | 484 | /deep-extend/0.6.0: 485 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 486 | engines: {node: '>=4.0.0'} 487 | dev: false 488 | 489 | /defer-to-connect/1.1.3: 490 | resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} 491 | dev: false 492 | 493 | /defer-to-connect/2.0.1: 494 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} 495 | engines: {node: '>=10'} 496 | dev: false 497 | 498 | /delegates/1.0.0: 499 | resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} 500 | dev: false 501 | 502 | /depd/1.1.2: 503 | resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} 504 | engines: {node: '>= 0.6'} 505 | dev: false 506 | 507 | /depd/2.0.0: 508 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 509 | engines: {node: '>= 0.8'} 510 | dev: false 511 | 512 | /destroy/1.0.4: 513 | resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} 514 | dev: false 515 | 516 | /dijkstrajs/1.0.2: 517 | resolution: {integrity: sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==} 518 | dev: false 519 | 520 | /dot-prop/5.3.0: 521 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 522 | engines: {node: '>=8'} 523 | dependencies: 524 | is-obj: 2.0.0 525 | dev: false 526 | 527 | /dotenv/10.0.0: 528 | resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} 529 | engines: {node: '>=10'} 530 | dev: false 531 | 532 | /duplexer3/0.1.4: 533 | resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=} 534 | dev: false 535 | 536 | /ee-first/1.1.1: 537 | resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} 538 | dev: false 539 | 540 | /emoji-regex/7.0.3: 541 | resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} 542 | dev: false 543 | 544 | /emoji-regex/8.0.0: 545 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 546 | dev: false 547 | 548 | /encodeurl/1.0.2: 549 | resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} 550 | engines: {node: '>= 0.8'} 551 | dev: false 552 | 553 | /end-of-stream/1.4.4: 554 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 555 | dependencies: 556 | once: 1.4.0 557 | dev: false 558 | 559 | /escape-goat/2.1.1: 560 | resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} 561 | engines: {node: '>=8'} 562 | dev: false 563 | 564 | /escape-html/1.0.3: 565 | resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} 566 | dev: false 567 | 568 | /fill-range/7.0.1: 569 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 570 | engines: {node: '>=8'} 571 | dependencies: 572 | to-regex-range: 5.0.1 573 | dev: false 574 | 575 | /find-up/3.0.0: 576 | resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} 577 | engines: {node: '>=6'} 578 | dependencies: 579 | locate-path: 3.0.0 580 | dev: false 581 | 582 | /follow-redirects/1.14.1: 583 | resolution: {integrity: sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==} 584 | engines: {node: '>=4.0'} 585 | peerDependencies: 586 | debug: '*' 587 | peerDependenciesMeta: 588 | debug: 589 | optional: true 590 | dev: false 591 | 592 | /formidable/1.2.2: 593 | resolution: {integrity: sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==} 594 | dev: false 595 | 596 | /fresh/0.5.2: 597 | resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} 598 | engines: {node: '>= 0.6'} 599 | dev: false 600 | 601 | /fsevents/2.3.2: 602 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 603 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 604 | os: [darwin] 605 | dev: false 606 | optional: true 607 | 608 | /function-bind/1.1.1: 609 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 610 | dev: false 611 | 612 | /get-caller-file/2.0.5: 613 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 614 | engines: {node: 6.* || 8.* || >= 10.*} 615 | dev: false 616 | 617 | /get-intrinsic/1.1.1: 618 | resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} 619 | dependencies: 620 | function-bind: 1.1.1 621 | has: 1.0.3 622 | has-symbols: 1.0.2 623 | dev: false 624 | 625 | /get-stream/4.1.0: 626 | resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} 627 | engines: {node: '>=6'} 628 | dependencies: 629 | pump: 3.0.0 630 | dev: false 631 | 632 | /get-stream/5.2.0: 633 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 634 | engines: {node: '>=8'} 635 | dependencies: 636 | pump: 3.0.0 637 | dev: false 638 | 639 | /glob-parent/5.1.2: 640 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 641 | engines: {node: '>= 6'} 642 | dependencies: 643 | is-glob: 4.0.1 644 | dev: false 645 | 646 | /global-dirs/2.1.0: 647 | resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} 648 | engines: {node: '>=8'} 649 | dependencies: 650 | ini: 1.3.7 651 | dev: false 652 | 653 | /got/11.8.2: 654 | resolution: {integrity: sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==} 655 | engines: {node: '>=10.19.0'} 656 | dependencies: 657 | '@sindresorhus/is': 4.0.1 658 | '@szmarczak/http-timer': 4.0.6 659 | '@types/cacheable-request': 6.0.2 660 | '@types/responselike': 1.0.0 661 | cacheable-lookup: 5.0.4 662 | cacheable-request: 7.0.2 663 | decompress-response: 6.0.0 664 | http2-wrapper: 1.0.3 665 | lowercase-keys: 2.0.0 666 | p-cancelable: 2.1.1 667 | responselike: 2.0.0 668 | dev: false 669 | 670 | /got/9.6.0: 671 | resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} 672 | engines: {node: '>=8.6'} 673 | dependencies: 674 | '@sindresorhus/is': 0.14.0 675 | '@szmarczak/http-timer': 1.1.2 676 | cacheable-request: 6.1.0 677 | decompress-response: 3.3.0 678 | duplexer3: 0.1.4 679 | get-stream: 4.1.0 680 | lowercase-keys: 1.0.1 681 | mimic-response: 1.0.1 682 | p-cancelable: 1.1.0 683 | to-readable-stream: 1.0.0 684 | url-parse-lax: 3.0.0 685 | dev: false 686 | 687 | /graceful-fs/4.2.6: 688 | resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} 689 | dev: false 690 | 691 | /has-flag/3.0.0: 692 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 693 | engines: {node: '>=4'} 694 | dev: false 695 | 696 | /has-flag/4.0.0: 697 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 698 | engines: {node: '>=8'} 699 | dev: false 700 | 701 | /has-symbols/1.0.2: 702 | resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==} 703 | engines: {node: '>= 0.4'} 704 | dev: false 705 | 706 | /has-yarn/2.1.0: 707 | resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} 708 | engines: {node: '>=8'} 709 | dev: false 710 | 711 | /has/1.0.3: 712 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 713 | engines: {node: '>= 0.4.0'} 714 | dependencies: 715 | function-bind: 1.1.1 716 | dev: false 717 | 718 | /http-assert/1.4.1: 719 | resolution: {integrity: sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==} 720 | engines: {node: '>= 0.8'} 721 | dependencies: 722 | deep-equal: 1.0.1 723 | http-errors: 1.7.3 724 | dev: false 725 | 726 | /http-cache-semantics/4.1.0: 727 | resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} 728 | dev: false 729 | 730 | /http-errors/1.6.3: 731 | resolution: {integrity: sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=} 732 | engines: {node: '>= 0.6'} 733 | dependencies: 734 | depd: 1.1.2 735 | inherits: 2.0.3 736 | setprototypeof: 1.1.0 737 | statuses: 1.5.0 738 | dev: false 739 | 740 | /http-errors/1.7.3: 741 | resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} 742 | engines: {node: '>= 0.6'} 743 | dependencies: 744 | depd: 1.1.2 745 | inherits: 2.0.4 746 | setprototypeof: 1.1.1 747 | statuses: 1.5.0 748 | toidentifier: 1.0.0 749 | dev: false 750 | 751 | /http-errors/1.8.0: 752 | resolution: {integrity: sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==} 753 | engines: {node: '>= 0.6'} 754 | dependencies: 755 | depd: 1.1.2 756 | inherits: 2.0.4 757 | setprototypeof: 1.2.0 758 | statuses: 1.5.0 759 | toidentifier: 1.0.0 760 | dev: false 761 | 762 | /http2-wrapper/1.0.3: 763 | resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} 764 | engines: {node: '>=10.19.0'} 765 | dependencies: 766 | quick-lru: 5.1.1 767 | resolve-alpn: 1.2.0 768 | dev: false 769 | 770 | /iconv-lite/0.4.24: 771 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 772 | engines: {node: '>=0.10.0'} 773 | dependencies: 774 | safer-buffer: 2.1.2 775 | dev: false 776 | 777 | /ieee754/1.2.1: 778 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 779 | dev: false 780 | 781 | /ignore-by-default/1.0.1: 782 | resolution: {integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk=} 783 | dev: false 784 | 785 | /import-lazy/2.1.0: 786 | resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=} 787 | engines: {node: '>=4'} 788 | dev: false 789 | 790 | /imurmurhash/0.1.4: 791 | resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} 792 | engines: {node: '>=0.8.19'} 793 | dev: false 794 | 795 | /inflation/2.0.0: 796 | resolution: {integrity: sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=} 797 | engines: {node: '>= 0.8.0'} 798 | dev: false 799 | 800 | /inherits/2.0.3: 801 | resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=} 802 | dev: false 803 | 804 | /inherits/2.0.4: 805 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 806 | dev: false 807 | 808 | /ini/1.3.7: 809 | resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==} 810 | dev: false 811 | 812 | /ini/1.3.8: 813 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 814 | dev: false 815 | 816 | /is-binary-path/2.1.0: 817 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 818 | engines: {node: '>=8'} 819 | dependencies: 820 | binary-extensions: 2.2.0 821 | dev: false 822 | 823 | /is-ci/2.0.0: 824 | resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} 825 | hasBin: true 826 | dependencies: 827 | ci-info: 2.0.0 828 | dev: false 829 | 830 | /is-extglob/2.1.1: 831 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 832 | engines: {node: '>=0.10.0'} 833 | dev: false 834 | 835 | /is-fullwidth-code-point/2.0.0: 836 | resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} 837 | engines: {node: '>=4'} 838 | dev: false 839 | 840 | /is-fullwidth-code-point/3.0.0: 841 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 842 | engines: {node: '>=8'} 843 | dev: false 844 | 845 | /is-generator-function/1.0.9: 846 | resolution: {integrity: sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==} 847 | engines: {node: '>= 0.4'} 848 | dev: false 849 | 850 | /is-glob/4.0.1: 851 | resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} 852 | engines: {node: '>=0.10.0'} 853 | dependencies: 854 | is-extglob: 2.1.1 855 | dev: false 856 | 857 | /is-installed-globally/0.3.2: 858 | resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==} 859 | engines: {node: '>=8'} 860 | dependencies: 861 | global-dirs: 2.1.0 862 | is-path-inside: 3.0.3 863 | dev: false 864 | 865 | /is-npm/4.0.0: 866 | resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==} 867 | engines: {node: '>=8'} 868 | dev: false 869 | 870 | /is-number/7.0.0: 871 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 872 | engines: {node: '>=0.12.0'} 873 | dev: false 874 | 875 | /is-obj/2.0.0: 876 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 877 | engines: {node: '>=8'} 878 | dev: false 879 | 880 | /is-path-inside/3.0.3: 881 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 882 | engines: {node: '>=8'} 883 | dev: false 884 | 885 | /is-typedarray/1.0.0: 886 | resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} 887 | dev: false 888 | 889 | /is-yarn-global/0.3.0: 890 | resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} 891 | dev: false 892 | 893 | /isarray/1.0.0: 894 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} 895 | dev: false 896 | 897 | /isarray/2.0.5: 898 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 899 | dev: false 900 | 901 | /json-buffer/3.0.0: 902 | resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=} 903 | dev: false 904 | 905 | /json-buffer/3.0.1: 906 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 907 | dev: false 908 | 909 | /keygrip/1.1.0: 910 | resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} 911 | engines: {node: '>= 0.6'} 912 | dependencies: 913 | tsscmp: 1.0.6 914 | dev: false 915 | 916 | /keyv/3.1.0: 917 | resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} 918 | dependencies: 919 | json-buffer: 3.0.0 920 | dev: false 921 | 922 | /keyv/4.0.3: 923 | resolution: {integrity: sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==} 924 | dependencies: 925 | json-buffer: 3.0.1 926 | dev: false 927 | 928 | /koa-body/4.2.0: 929 | resolution: {integrity: sha512-wdGu7b9amk4Fnk/ytH8GuWwfs4fsB5iNkY8kZPpgQVb04QZSv85T0M8reb+cJmvLE8cjPYvBzRikD3s6qz8OoA==} 930 | dependencies: 931 | '@types/formidable': 1.2.3 932 | co-body: 5.2.0 933 | formidable: 1.2.2 934 | dev: false 935 | 936 | /koa-compose/3.2.1: 937 | resolution: {integrity: sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=} 938 | dependencies: 939 | any-promise: 1.3.0 940 | dev: false 941 | 942 | /koa-compose/4.1.0: 943 | resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} 944 | dev: false 945 | 946 | /koa-convert/1.2.0: 947 | resolution: {integrity: sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=} 948 | engines: {node: '>= 4'} 949 | dependencies: 950 | co: 4.6.0 951 | koa-compose: 3.2.1 952 | dev: false 953 | 954 | /koa-log4/2.3.2: 955 | resolution: {integrity: sha512-1RXEvN+DlMgdEsVWW2MH8vZly9KGWdqryo6jmTWuVZWSmZEH/Hfp3lZ1SCtpD9Lmvkke5i6FzQrFucYUnmwFEQ==} 956 | dependencies: 957 | log4js: 3.0.6 958 | dev: false 959 | 960 | /koa-send/5.0.1: 961 | resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} 962 | engines: {node: '>= 8'} 963 | dependencies: 964 | debug: 4.3.2 965 | http-errors: 1.8.0 966 | resolve-path: 1.4.0 967 | transitivePeerDependencies: 968 | - supports-color 969 | dev: false 970 | 971 | /koa-static/5.0.0: 972 | resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} 973 | engines: {node: '>= 7.6.0'} 974 | dependencies: 975 | debug: 3.2.7 976 | koa-send: 5.0.1 977 | transitivePeerDependencies: 978 | - supports-color 979 | dev: false 980 | 981 | /koa/2.13.1: 982 | resolution: {integrity: sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==} 983 | engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} 984 | dependencies: 985 | accepts: 1.3.7 986 | cache-content-type: 1.0.1 987 | content-disposition: 0.5.3 988 | content-type: 1.0.4 989 | cookies: 0.8.0 990 | debug: 3.1.0 991 | delegates: 1.0.0 992 | depd: 2.0.0 993 | destroy: 1.0.4 994 | encodeurl: 1.0.2 995 | escape-html: 1.0.3 996 | fresh: 0.5.2 997 | http-assert: 1.4.1 998 | http-errors: 1.8.0 999 | is-generator-function: 1.0.9 1000 | koa-compose: 4.1.0 1001 | koa-convert: 1.2.0 1002 | on-finished: 2.3.0 1003 | only: 0.0.2 1004 | parseurl: 1.3.3 1005 | statuses: 1.5.0 1006 | type-is: 1.6.18 1007 | vary: 1.1.2 1008 | dev: false 1009 | 1010 | /latest-version/5.1.0: 1011 | resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} 1012 | engines: {node: '>=8'} 1013 | dependencies: 1014 | package-json: 6.5.0 1015 | dev: false 1016 | 1017 | /locate-path/3.0.0: 1018 | resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} 1019 | engines: {node: '>=6'} 1020 | dependencies: 1021 | p-locate: 3.0.0 1022 | path-exists: 3.0.0 1023 | dev: false 1024 | 1025 | /log4js/3.0.6: 1026 | resolution: {integrity: sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==} 1027 | engines: {node: '>=6.0'} 1028 | dependencies: 1029 | circular-json: 0.5.9 1030 | date-format: 1.2.0 1031 | debug: 3.2.7 1032 | rfdc: 1.3.0 1033 | streamroller: 0.7.0 1034 | dev: false 1035 | 1036 | /lowercase-keys/1.0.1: 1037 | resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} 1038 | engines: {node: '>=0.10.0'} 1039 | dev: false 1040 | 1041 | /lowercase-keys/2.0.0: 1042 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 1043 | engines: {node: '>=8'} 1044 | dev: false 1045 | 1046 | /make-dir/3.1.0: 1047 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 1048 | engines: {node: '>=8'} 1049 | dependencies: 1050 | semver: 6.3.0 1051 | dev: false 1052 | 1053 | /media-typer/0.3.0: 1054 | resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} 1055 | engines: {node: '>= 0.6'} 1056 | dev: false 1057 | 1058 | /methods/1.1.2: 1059 | resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} 1060 | engines: {node: '>= 0.6'} 1061 | dev: false 1062 | 1063 | /mime-db/1.48.0: 1064 | resolution: {integrity: sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==} 1065 | engines: {node: '>= 0.6'} 1066 | dev: false 1067 | 1068 | /mime-types/2.1.31: 1069 | resolution: {integrity: sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==} 1070 | engines: {node: '>= 0.6'} 1071 | dependencies: 1072 | mime-db: 1.48.0 1073 | dev: false 1074 | 1075 | /mimic-response/1.0.1: 1076 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 1077 | engines: {node: '>=4'} 1078 | dev: false 1079 | 1080 | /mimic-response/3.1.0: 1081 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1082 | engines: {node: '>=10'} 1083 | dev: false 1084 | 1085 | /minimatch/3.0.4: 1086 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 1087 | dependencies: 1088 | brace-expansion: 1.1.11 1089 | dev: false 1090 | 1091 | /minimist/1.2.5: 1092 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 1093 | dev: false 1094 | 1095 | /mkdirp/0.5.5: 1096 | resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} 1097 | hasBin: true 1098 | dependencies: 1099 | minimist: 1.2.5 1100 | dev: false 1101 | 1102 | /ms/2.0.0: 1103 | resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} 1104 | dev: false 1105 | 1106 | /ms/2.1.2: 1107 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1108 | dev: false 1109 | 1110 | /ms/2.1.3: 1111 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1112 | dev: false 1113 | 1114 | /negotiator/0.6.2: 1115 | resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==} 1116 | engines: {node: '>= 0.6'} 1117 | dev: false 1118 | 1119 | /nodemon/2.0.12: 1120 | resolution: {integrity: sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==} 1121 | engines: {node: '>=8.10.0'} 1122 | hasBin: true 1123 | requiresBuild: true 1124 | dependencies: 1125 | chokidar: 3.5.2 1126 | debug: 3.2.7 1127 | ignore-by-default: 1.0.1 1128 | minimatch: 3.0.4 1129 | pstree.remy: 1.1.8 1130 | semver: 5.7.1 1131 | supports-color: 5.5.0 1132 | touch: 3.1.0 1133 | undefsafe: 2.0.3 1134 | update-notifier: 4.1.3 1135 | dev: false 1136 | 1137 | /nopt/1.0.10: 1138 | resolution: {integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=} 1139 | hasBin: true 1140 | dependencies: 1141 | abbrev: 1.1.1 1142 | dev: false 1143 | 1144 | /normalize-path/3.0.0: 1145 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1146 | engines: {node: '>=0.10.0'} 1147 | dev: false 1148 | 1149 | /normalize-url/4.5.1: 1150 | resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} 1151 | engines: {node: '>=8'} 1152 | dev: false 1153 | 1154 | /normalize-url/6.1.0: 1155 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} 1156 | engines: {node: '>=10'} 1157 | dev: false 1158 | 1159 | /object-inspect/1.11.0: 1160 | resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==} 1161 | dev: false 1162 | 1163 | /on-finished/2.3.0: 1164 | resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=} 1165 | engines: {node: '>= 0.8'} 1166 | dependencies: 1167 | ee-first: 1.1.1 1168 | dev: false 1169 | 1170 | /once/1.4.0: 1171 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 1172 | dependencies: 1173 | wrappy: 1.0.2 1174 | dev: false 1175 | 1176 | /only/0.0.2: 1177 | resolution: {integrity: sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=} 1178 | dev: false 1179 | 1180 | /p-cancelable/1.1.0: 1181 | resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} 1182 | engines: {node: '>=6'} 1183 | dev: false 1184 | 1185 | /p-cancelable/2.1.1: 1186 | resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} 1187 | engines: {node: '>=8'} 1188 | dev: false 1189 | 1190 | /p-limit/2.3.0: 1191 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1192 | engines: {node: '>=6'} 1193 | dependencies: 1194 | p-try: 2.2.0 1195 | dev: false 1196 | 1197 | /p-locate/3.0.0: 1198 | resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} 1199 | engines: {node: '>=6'} 1200 | dependencies: 1201 | p-limit: 2.3.0 1202 | dev: false 1203 | 1204 | /p-try/2.2.0: 1205 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1206 | engines: {node: '>=6'} 1207 | dev: false 1208 | 1209 | /package-json/6.5.0: 1210 | resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} 1211 | engines: {node: '>=8'} 1212 | dependencies: 1213 | got: 9.6.0 1214 | registry-auth-token: 4.2.1 1215 | registry-url: 5.1.0 1216 | semver: 6.3.0 1217 | dev: false 1218 | 1219 | /parseurl/1.3.3: 1220 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1221 | engines: {node: '>= 0.8'} 1222 | dev: false 1223 | 1224 | /path-exists/3.0.0: 1225 | resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} 1226 | engines: {node: '>=4'} 1227 | dev: false 1228 | 1229 | /path-is-absolute/1.0.1: 1230 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 1231 | engines: {node: '>=0.10.0'} 1232 | dev: false 1233 | 1234 | /path-to-regexp/6.2.0: 1235 | resolution: {integrity: sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==} 1236 | dev: false 1237 | 1238 | /picomatch/2.3.0: 1239 | resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} 1240 | engines: {node: '>=8.6'} 1241 | dev: false 1242 | 1243 | /pngjs/3.4.0: 1244 | resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} 1245 | engines: {node: '>=4.0.0'} 1246 | dev: false 1247 | 1248 | /prepend-http/2.0.0: 1249 | resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=} 1250 | engines: {node: '>=4'} 1251 | dev: false 1252 | 1253 | /process-nextick-args/2.0.1: 1254 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1255 | dev: false 1256 | 1257 | /pstree.remy/1.1.8: 1258 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 1259 | dev: false 1260 | 1261 | /pump/3.0.0: 1262 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1263 | dependencies: 1264 | end-of-stream: 1.4.4 1265 | once: 1.4.0 1266 | dev: false 1267 | 1268 | /pupa/2.1.1: 1269 | resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} 1270 | engines: {node: '>=8'} 1271 | dependencies: 1272 | escape-goat: 2.1.1 1273 | dev: false 1274 | 1275 | /qrcode/1.4.4: 1276 | resolution: {integrity: sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==} 1277 | engines: {node: '>=4'} 1278 | hasBin: true 1279 | dependencies: 1280 | buffer: 5.7.1 1281 | buffer-alloc: 1.2.0 1282 | buffer-from: 1.1.1 1283 | dijkstrajs: 1.0.2 1284 | isarray: 2.0.5 1285 | pngjs: 3.4.0 1286 | yargs: 13.3.2 1287 | dev: false 1288 | 1289 | /qs/6.10.1: 1290 | resolution: {integrity: sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==} 1291 | engines: {node: '>=0.6'} 1292 | dependencies: 1293 | side-channel: 1.0.4 1294 | dev: false 1295 | 1296 | /quick-lru/5.1.1: 1297 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1298 | engines: {node: '>=10'} 1299 | dev: false 1300 | 1301 | /raw-body/2.4.1: 1302 | resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} 1303 | engines: {node: '>= 0.8'} 1304 | dependencies: 1305 | bytes: 3.1.0 1306 | http-errors: 1.7.3 1307 | iconv-lite: 0.4.24 1308 | unpipe: 1.0.0 1309 | dev: false 1310 | 1311 | /rc/1.2.8: 1312 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1313 | hasBin: true 1314 | dependencies: 1315 | deep-extend: 0.6.0 1316 | ini: 1.3.8 1317 | minimist: 1.2.5 1318 | strip-json-comments: 2.0.1 1319 | dev: false 1320 | 1321 | /readable-stream/2.3.7: 1322 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1323 | dependencies: 1324 | core-util-is: 1.0.2 1325 | inherits: 2.0.4 1326 | isarray: 1.0.0 1327 | process-nextick-args: 2.0.1 1328 | safe-buffer: 5.1.2 1329 | string_decoder: 1.1.1 1330 | util-deprecate: 1.0.2 1331 | dev: false 1332 | 1333 | /readdirp/3.6.0: 1334 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1335 | engines: {node: '>=8.10.0'} 1336 | dependencies: 1337 | picomatch: 2.3.0 1338 | dev: false 1339 | 1340 | /registry-auth-token/4.2.1: 1341 | resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==} 1342 | engines: {node: '>=6.0.0'} 1343 | dependencies: 1344 | rc: 1.2.8 1345 | dev: false 1346 | 1347 | /registry-url/5.1.0: 1348 | resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} 1349 | engines: {node: '>=8'} 1350 | dependencies: 1351 | rc: 1.2.8 1352 | dev: false 1353 | 1354 | /require-directory/2.1.1: 1355 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} 1356 | engines: {node: '>=0.10.0'} 1357 | dev: false 1358 | 1359 | /require-main-filename/2.0.0: 1360 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 1361 | dev: false 1362 | 1363 | /resolve-alpn/1.2.0: 1364 | resolution: {integrity: sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA==} 1365 | dev: false 1366 | 1367 | /resolve-path/1.4.0: 1368 | resolution: {integrity: sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=} 1369 | engines: {node: '>= 0.8'} 1370 | dependencies: 1371 | http-errors: 1.6.3 1372 | path-is-absolute: 1.0.1 1373 | dev: false 1374 | 1375 | /responselike/1.0.2: 1376 | resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=} 1377 | dependencies: 1378 | lowercase-keys: 1.0.1 1379 | dev: false 1380 | 1381 | /responselike/2.0.0: 1382 | resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==} 1383 | dependencies: 1384 | lowercase-keys: 2.0.0 1385 | dev: false 1386 | 1387 | /rfdc/1.3.0: 1388 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} 1389 | dev: false 1390 | 1391 | /safe-buffer/5.1.2: 1392 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1393 | dev: false 1394 | 1395 | /safer-buffer/2.1.2: 1396 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1397 | dev: false 1398 | 1399 | /semver-diff/3.1.1: 1400 | resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} 1401 | engines: {node: '>=8'} 1402 | dependencies: 1403 | semver: 6.3.0 1404 | dev: false 1405 | 1406 | /semver/5.7.1: 1407 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1408 | hasBin: true 1409 | dev: false 1410 | 1411 | /semver/6.3.0: 1412 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1413 | hasBin: true 1414 | dev: false 1415 | 1416 | /set-blocking/2.0.0: 1417 | resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} 1418 | dev: false 1419 | 1420 | /setprototypeof/1.1.0: 1421 | resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} 1422 | dev: false 1423 | 1424 | /setprototypeof/1.1.1: 1425 | resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} 1426 | dev: false 1427 | 1428 | /setprototypeof/1.2.0: 1429 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1430 | dev: false 1431 | 1432 | /side-channel/1.0.4: 1433 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1434 | dependencies: 1435 | call-bind: 1.0.2 1436 | get-intrinsic: 1.1.1 1437 | object-inspect: 1.11.0 1438 | dev: false 1439 | 1440 | /signal-exit/3.0.3: 1441 | resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} 1442 | dev: false 1443 | 1444 | /statuses/1.5.0: 1445 | resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} 1446 | engines: {node: '>= 0.6'} 1447 | dev: false 1448 | 1449 | /streamroller/0.7.0: 1450 | resolution: {integrity: sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==} 1451 | engines: {node: '>=0.12.0'} 1452 | dependencies: 1453 | date-format: 1.2.0 1454 | debug: 3.2.7 1455 | mkdirp: 0.5.5 1456 | readable-stream: 2.3.7 1457 | dev: false 1458 | 1459 | /string-width/3.1.0: 1460 | resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} 1461 | engines: {node: '>=6'} 1462 | dependencies: 1463 | emoji-regex: 7.0.3 1464 | is-fullwidth-code-point: 2.0.0 1465 | strip-ansi: 5.2.0 1466 | dev: false 1467 | 1468 | /string-width/4.2.2: 1469 | resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==} 1470 | engines: {node: '>=8'} 1471 | dependencies: 1472 | emoji-regex: 8.0.0 1473 | is-fullwidth-code-point: 3.0.0 1474 | strip-ansi: 6.0.0 1475 | dev: false 1476 | 1477 | /string_decoder/1.1.1: 1478 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1479 | dependencies: 1480 | safe-buffer: 5.1.2 1481 | dev: false 1482 | 1483 | /strip-ansi/5.2.0: 1484 | resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} 1485 | engines: {node: '>=6'} 1486 | dependencies: 1487 | ansi-regex: 4.1.0 1488 | dev: false 1489 | 1490 | /strip-ansi/6.0.0: 1491 | resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} 1492 | engines: {node: '>=8'} 1493 | dependencies: 1494 | ansi-regex: 5.0.0 1495 | dev: false 1496 | 1497 | /strip-json-comments/2.0.1: 1498 | resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} 1499 | engines: {node: '>=0.10.0'} 1500 | dev: false 1501 | 1502 | /supports-color/5.5.0: 1503 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1504 | engines: {node: '>=4'} 1505 | dependencies: 1506 | has-flag: 3.0.0 1507 | dev: false 1508 | 1509 | /supports-color/7.2.0: 1510 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1511 | engines: {node: '>=8'} 1512 | dependencies: 1513 | has-flag: 4.0.0 1514 | dev: false 1515 | 1516 | /term-size/2.2.1: 1517 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 1518 | engines: {node: '>=8'} 1519 | dev: false 1520 | 1521 | /to-readable-stream/1.0.0: 1522 | resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} 1523 | engines: {node: '>=6'} 1524 | dev: false 1525 | 1526 | /to-regex-range/5.0.1: 1527 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1528 | engines: {node: '>=8.0'} 1529 | dependencies: 1530 | is-number: 7.0.0 1531 | dev: false 1532 | 1533 | /toidentifier/1.0.0: 1534 | resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} 1535 | engines: {node: '>=0.6'} 1536 | dev: false 1537 | 1538 | /touch/3.1.0: 1539 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1540 | hasBin: true 1541 | dependencies: 1542 | nopt: 1.0.10 1543 | dev: false 1544 | 1545 | /tsscmp/1.0.6: 1546 | resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} 1547 | engines: {node: '>=0.6.x'} 1548 | dev: false 1549 | 1550 | /type-fest/0.8.1: 1551 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 1552 | engines: {node: '>=8'} 1553 | dev: false 1554 | 1555 | /type-is/1.6.18: 1556 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1557 | engines: {node: '>= 0.6'} 1558 | dependencies: 1559 | media-typer: 0.3.0 1560 | mime-types: 2.1.31 1561 | dev: false 1562 | 1563 | /typedarray-to-buffer/3.1.5: 1564 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 1565 | dependencies: 1566 | is-typedarray: 1.0.0 1567 | dev: false 1568 | 1569 | /undefsafe/2.0.3: 1570 | resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==} 1571 | dependencies: 1572 | debug: 2.6.9 1573 | dev: false 1574 | 1575 | /unique-string/2.0.0: 1576 | resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} 1577 | engines: {node: '>=8'} 1578 | dependencies: 1579 | crypto-random-string: 2.0.0 1580 | dev: false 1581 | 1582 | /unpipe/1.0.0: 1583 | resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} 1584 | engines: {node: '>= 0.8'} 1585 | dev: false 1586 | 1587 | /update-notifier/4.1.3: 1588 | resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==} 1589 | engines: {node: '>=8'} 1590 | dependencies: 1591 | boxen: 4.2.0 1592 | chalk: 3.0.0 1593 | configstore: 5.0.1 1594 | has-yarn: 2.1.0 1595 | import-lazy: 2.1.0 1596 | is-ci: 2.0.0 1597 | is-installed-globally: 0.3.2 1598 | is-npm: 4.0.0 1599 | is-yarn-global: 0.3.0 1600 | latest-version: 5.1.0 1601 | pupa: 2.1.1 1602 | semver-diff: 3.1.1 1603 | xdg-basedir: 4.0.0 1604 | dev: false 1605 | 1606 | /url-parse-lax/3.0.0: 1607 | resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=} 1608 | engines: {node: '>=4'} 1609 | dependencies: 1610 | prepend-http: 2.0.0 1611 | dev: false 1612 | 1613 | /util-deprecate/1.0.2: 1614 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 1615 | dev: false 1616 | 1617 | /vary/1.1.2: 1618 | resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} 1619 | engines: {node: '>= 0.8'} 1620 | dev: false 1621 | 1622 | /which-module/2.0.0: 1623 | resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} 1624 | dev: false 1625 | 1626 | /widest-line/3.1.0: 1627 | resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} 1628 | engines: {node: '>=8'} 1629 | dependencies: 1630 | string-width: 4.2.2 1631 | dev: false 1632 | 1633 | /wrap-ansi/5.1.0: 1634 | resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} 1635 | engines: {node: '>=6'} 1636 | dependencies: 1637 | ansi-styles: 3.2.1 1638 | string-width: 3.1.0 1639 | strip-ansi: 5.2.0 1640 | dev: false 1641 | 1642 | /wrappy/1.0.2: 1643 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1644 | dev: false 1645 | 1646 | /write-file-atomic/3.0.3: 1647 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 1648 | dependencies: 1649 | imurmurhash: 0.1.4 1650 | is-typedarray: 1.0.0 1651 | signal-exit: 3.0.3 1652 | typedarray-to-buffer: 3.1.5 1653 | dev: false 1654 | 1655 | /xdg-basedir/4.0.0: 1656 | resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} 1657 | engines: {node: '>=8'} 1658 | dev: false 1659 | 1660 | /y18n/4.0.3: 1661 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 1662 | dev: false 1663 | 1664 | /yargs-parser/13.1.2: 1665 | resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} 1666 | dependencies: 1667 | camelcase: 5.3.1 1668 | decamelize: 1.2.0 1669 | dev: false 1670 | 1671 | /yargs/13.3.2: 1672 | resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} 1673 | dependencies: 1674 | cliui: 5.0.0 1675 | find-up: 3.0.0 1676 | get-caller-file: 2.0.5 1677 | require-directory: 2.1.1 1678 | require-main-filename: 2.0.0 1679 | set-blocking: 2.0.0 1680 | string-width: 3.1.0 1681 | which-module: 2.0.0 1682 | y18n: 4.0.3 1683 | yargs-parser: 13.1.2 1684 | dev: false 1685 | 1686 | /ylru/1.2.1: 1687 | resolution: {integrity: sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==} 1688 | engines: {node: '>= 4.0.0'} 1689 | dev: false 1690 | --------------------------------------------------------------------------------