jazz
2023-12-05 aeb317703c9c82edb7c4c7ecc5985eef62864c7c
update_202312051941_项目-治疗室屏幕web-切图v1
19个文件已添加
14个文件已修改
3115 ■■■■■ 已修改文件
.babelrc 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
build/webpack.base.conf.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/index.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json 1384 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/css/common.css 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/login/login_left.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/login/login_mid.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/login/login_right.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/login/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/SvgIcon/index.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/xio_customer_select/index.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/xio_room_status_chg/index.vue 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/config/index.js 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/index.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/eye-open.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/eye.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/password.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/safecode.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svg/user.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/icons/svgo.yml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login/g_mockData.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login/getQueryObj.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login/index.vue 1030 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/room/detail.vue 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/room/list.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/auth.js 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/element-ui-preprocessing.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/fn.js 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/validate.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.babelrc
@@ -8,7 +8,7 @@
    }],
    "stage-2"
  ],
  "plugins": ["transform-vue-jsx", "transform-runtime"],
  "plugins": ["transform-vue-jsx", "transform-runtime"],
  "env": {
    "test": {
      "presets": ["env", "stage-2"]
build/webpack.base.conf.js
@@ -64,6 +64,10 @@
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.sass$/,
        loaders: ['style', 'css', 'sass']
      }
    ]
  },
config/index.js
@@ -3,7 +3,9 @@
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
function resolve(dir) {
  return path.join(__dirname, dir)
}
module.exports = {
  dev: {
@@ -20,7 +22,8 @@
        }
      },
      '/api_test': { // 测试环境
        target: 'http://192.168.31.69:8080',
        // target: 'http://192.168.31.69:8080',
        target: 'https://test6.phiskin.com/phi_appt/', // 新预约
        // target: 'http://hymctest.huoxiongit.com/',// 这个是你服务器开启的接口
        changeOrigin: true,// 是否跨域
        pathRewrite: {
@@ -82,5 +85,24 @@
    // `npm run build --report`
    // Set to `true` or `false` to always turn it on or off
    bundleAnalyzerReport: process.env.npm_config_report
  },
  // 配置使用stylus全局变量
  chainWebpack: config => {
    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()
  }
}
package-lock.json
@@ -10,6 +10,8 @@
      "dependencies": {
        "axios": "^0.19.2",
        "clipboard": "^2.0.6",
        "element-ui": "^2.15.6",
        "svg-sprite-loader": "^6.0.11",
        "vue": "^2.5.2",
        "vue-router": "^3.0.1",
        "vuex": "^3.5.1"
@@ -42,6 +44,7 @@
        "mockjs": "^1.1.0",
        "nightwatch": "^0.9.12",
        "node-notifier": "^5.1.2",
        "node-sass": "^4.14.1",
        "optimize-css-assets-webpack-plugin": "^3.2.0",
        "ora": "^1.2.0",
        "portfinder": "^1.0.13",
@@ -51,6 +54,7 @@
        "postcss-url": "^7.2.1",
        "postcss-viewport-units": "^0.1.6",
        "rimraf": "^2.6.0",
        "sass-loader": "^7.3.1",
        "selenium-server": "^3.0.1",
        "semver": "^5.3.0",
        "shelljs": "^0.7.6",
@@ -349,6 +353,12 @@
      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
      "dev": true
    },
    "node_modules/abbrev": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
      "dev": true
    },
    "node_modules/accepts": {
      "version": "1.3.7",
      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
@@ -460,6 +470,15 @@
      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
      "dev": true
    },
    "node_modules/amdefine": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
      "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
      "dev": true,
      "engines": {
        "node": ">=0.4.2"
      }
    },
    "node_modules/ansi-escapes": {
      "version": "4.3.2",
      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -491,7 +510,6 @@
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -500,7 +518,6 @@
      "version": "3.2.1",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
      "dev": true,
      "dependencies": {
        "color-convert": "^1.9.0"
      },
@@ -528,6 +545,16 @@
      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
      "dev": true
    },
    "node_modules/are-we-there-yet": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
      "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
      "dev": true,
      "dependencies": {
        "delegates": "^1.0.0",
        "readable-stream": "^2.0.6"
      }
    },
    "node_modules/argparse": {
      "version": "1.0.10",
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -541,7 +568,6 @@
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -550,7 +576,6 @@
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -559,7 +584,6 @@
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -621,7 +645,6 @@
      "version": "0.3.2",
      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -700,7 +723,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -741,11 +763,28 @@
      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
      "dev": true
    },
    "node_modules/async-foreach": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
      "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==",
      "dev": true,
      "engines": {
        "node": "*"
      }
    },
    "node_modules/async-limiter": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
      "dev": true
    },
    "node_modules/async-validator": {
      "version": "1.8.5",
      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
      "dependencies": {
        "babel-runtime": "6.x"
      }
    },
    "node_modules/asynckit": {
      "version": "0.4.0",
@@ -757,7 +796,6 @@
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
      "dev": true,
      "bin": {
        "atob": "bin/atob.js"
      },
@@ -1105,8 +1143,7 @@
    "node_modules/babel-helper-vue-jsx-merge-props": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==",
      "dev": true
      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
    },
    "node_modules/babel-helpers": {
      "version": "6.24.1",
@@ -1645,7 +1682,6 @@
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
      "dev": true,
      "dependencies": {
        "core-js": "^2.4.0",
        "regenerator-runtime": "^0.11.0"
@@ -1712,7 +1748,6 @@
      "version": "0.11.2",
      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
      "dev": true,
      "dependencies": {
        "cache-base": "^1.0.1",
        "class-utils": "^0.3.5",
@@ -1730,7 +1765,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^1.0.0"
      },
@@ -1742,7 +1776,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.0"
      },
@@ -1754,7 +1787,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.0"
      },
@@ -1766,7 +1798,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
      "dev": true,
      "dependencies": {
        "is-accessor-descriptor": "^1.0.0",
        "is-data-descriptor": "^1.0.0",
@@ -1780,7 +1811,6 @@
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -1825,7 +1855,6 @@
      "version": "5.2.2",
      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
      "dev": true,
      "engines": {
        "node": "*"
      }
@@ -1850,11 +1879,22 @@
        "file-uri-to-path": "1.0.0"
      }
    },
    "node_modules/block-stream": {
      "version": "0.0.9",
      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
      "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==",
      "dev": true,
      "dependencies": {
        "inherits": "~2.0.0"
      },
      "engines": {
        "node": "0.4 || >=0.5.8"
      }
    },
    "node_modules/bluebird": {
      "version": "3.7.2",
      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
      "dev": true
      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
    },
    "node_modules/bn.js": {
      "version": "5.1.3",
@@ -2195,7 +2235,6 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
      "dev": true,
      "dependencies": {
        "collection-visit": "^1.0.0",
        "component-emitter": "^1.2.1",
@@ -2318,10 +2357,24 @@
      "dev": true
    },
    "node_modules/caniuse-lite": {
      "version": "1.0.30001113",
      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001113.tgz",
      "integrity": "sha512-qMvjHiKH21zzM/VDZr6oosO6Ri3U0V2tC015jRXjOecwQCJtsU5zklTNTk31jQbIOP8gha0h1ccM/g0ECP+4BA==",
      "dev": true
      "version": "1.0.30001566",
      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz",
      "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==",
      "dev": true,
      "funding": [
        {
          "type": "opencollective",
          "url": "https://opencollective.com/browserslist"
        },
        {
          "type": "tidelift",
          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
        },
        {
          "type": "github",
          "url": "https://github.com/sponsors/ai"
        }
      ]
    },
    "node_modules/caseless": {
      "version": "0.12.0",
@@ -2359,7 +2412,6 @@
      "version": "2.4.2",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^3.2.1",
        "escape-string-regexp": "^1.0.5",
@@ -2486,7 +2538,6 @@
      "version": "0.3.6",
      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
      "dev": true,
      "dependencies": {
        "arr-union": "^3.1.0",
        "define-property": "^0.2.5",
@@ -2501,7 +2552,6 @@
      "version": "0.2.5",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^0.1.0"
      },
@@ -2590,6 +2640,29 @@
        "node": ">=0.8"
      }
    },
    "node_modules/clone-deep": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
      "dev": true,
      "dependencies": {
        "is-plain-object": "^2.0.4",
        "kind-of": "^6.0.2",
        "shallow-clone": "^3.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/clone-deep/node_modules/kind-of": {
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/co": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -2625,7 +2698,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
      "dev": true,
      "dependencies": {
        "map-visit": "^1.0.0",
        "object-visit": "^1.0.0"
@@ -2649,7 +2721,6 @@
      "version": "1.9.3",
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
      "dev": true,
      "dependencies": {
        "color-name": "1.1.3"
      }
@@ -2657,8 +2728,7 @@
    "node_modules/color-name": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
      "dev": true
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
    },
    "node_modules/color-string": {
      "version": "0.3.0",
@@ -2722,8 +2792,7 @@
    "node_modules/component-emitter": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
      "dev": true
      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
    },
    "node_modules/compressible": {
      "version": "2.0.18",
@@ -2798,6 +2867,12 @@
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
      "dev": true
    },
    "node_modules/console-control-strings": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
      "dev": true
    },
    "node_modules/consolidate": {
@@ -2879,7 +2954,6 @@
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -2925,7 +2999,6 @@
      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
      "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
      "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
      "dev": true,
      "hasInstallScript": true
    },
    "node_modules/core-util-is": {
@@ -3412,18 +3485,6 @@
        "type": "tidelift",
        "url": "https://tidelift.com/funding/github/npm/browserslist"
      }
    },
    "node_modules/cssnano-preset-advanced/node_modules/browserslist/node_modules/caniuse-lite": {
      "version": "1.0.30001124",
      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz",
      "integrity": "sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA==",
      "dev": true
    },
    "node_modules/cssnano-preset-advanced/node_modules/electron-to-chromium": {
      "version": "1.3.564",
      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.564.tgz",
      "integrity": "sha512-fNaYN3EtKQWLQsrKXui8mzcryJXuA0LbCLoizeX6oayG2emBaS5MauKjCPAvc29NEY4FpLHIUWiP+Y0Bfrs5dg==",
      "dev": true
    },
    "node_modules/cssnano-preset-advanced/node_modules/postcss": {
      "version": "7.0.32",
@@ -4393,7 +4454,6 @@
      "version": "2.6.9",
      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
      "dev": true,
      "dependencies": {
        "ms": "2.0.0"
      }
@@ -4411,7 +4471,6 @@
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
      "dev": true,
      "engines": {
        "node": ">=0.10"
      }
@@ -4451,6 +4510,14 @@
      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
      "dev": true
    },
    "node_modules/deepmerge": {
      "version": "1.5.2",
      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/define-properties": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -4467,7 +4534,6 @@
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^1.0.2",
        "isobject": "^3.0.1"
@@ -4480,7 +4546,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.0"
      },
@@ -4492,7 +4557,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.0"
      },
@@ -4504,7 +4568,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
      "dev": true,
      "dependencies": {
        "is-accessor-descriptor": "^1.0.0",
        "is-data-descriptor": "^1.0.0",
@@ -4518,7 +4581,6 @@
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -4583,6 +4645,12 @@
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
    },
    "node_modules/delegates": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
      "dev": true
    },
    "node_modules/depd": {
      "version": "1.1.2",
@@ -4721,7 +4789,6 @@
      "version": "0.2.2",
      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
      "dev": true,
      "dependencies": {
        "domelementtype": "^2.0.1",
        "entities": "^2.0.0"
@@ -4730,8 +4797,7 @@
    "node_modules/dom-serializer/node_modules/domelementtype": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
      "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
      "dev": true
      "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ=="
    },
    "node_modules/domain-browser": {
      "version": "1.2.0",
@@ -4746,23 +4812,25 @@
    "node_modules/domelementtype": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
      "dev": true
      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
    },
    "node_modules/domhandler": {
      "version": "2.4.2",
      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
      "dev": true,
      "dependencies": {
        "domelementtype": "1"
      }
    },
    "node_modules/domready": {
      "version": "1.0.8",
      "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz",
      "integrity": "sha512-uIzsOJUNk+AdGE9a6VDeessoMCzF8RrZvJCX/W8QtyfgdR6Uofn/MvRonih3OtCO79b2VDzDOymuiABrQ4z3XA=="
    },
    "node_modules/domutils": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
      "dev": true,
      "dependencies": {
        "dom-serializer": "0",
        "domelementtype": "1"
@@ -4824,10 +4892,26 @@
      }
    },
    "node_modules/electron-to-chromium": {
      "version": "1.3.533",
      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.533.tgz",
      "integrity": "sha512-YqAL+NXOzjBnpY+dcOKDlZybJDCOzgsq4koW3fvyty/ldTmsb4QazZpOWmVvZ2m0t5jbBf7L0lIGU3BUipwG+A==",
      "version": "1.4.603",
      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.603.tgz",
      "integrity": "sha512-Dvo5OGjnl7AZTU632dFJtWj0uJK835eeOVQIuRcmBmsFsTNn3cL05FqOyHAfGQDIoHfLhyJ1Tya3PJ0ceMz54g==",
      "dev": true
    },
    "node_modules/element-ui": {
      "version": "2.15.14",
      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.14.tgz",
      "integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==",
      "dependencies": {
        "async-validator": "~1.8.1",
        "babel-helper-vue-jsx-merge-props": "^2.0.0",
        "deepmerge": "^1.2.0",
        "normalize-wheel": "^1.0.1",
        "resize-observer-polyfill": "^1.5.0",
        "throttle-debounce": "^1.0.1"
      },
      "peerDependencies": {
        "vue": "^2.5.17"
      }
    },
    "node_modules/elliptic": {
      "version": "6.5.3",
@@ -4860,7 +4944,6 @@
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
      "dev": true,
      "engines": {
        "node": ">= 4"
      }
@@ -4901,8 +4984,7 @@
    "node_modules/entities": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
      "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
      "dev": true
      "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
    },
    "node_modules/errno": {
      "version": "0.1.7",
@@ -5058,9 +5140,9 @@
      }
    },
    "node_modules/escalade": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
      "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==",
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
      "dev": true,
      "engines": {
        "node": ">=6"
@@ -5076,7 +5158,6 @@
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
      "dev": true,
      "engines": {
        "node": ">=0.8.0"
      }
@@ -5558,7 +5639,6 @@
      "version": "2.1.4",
      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
      "dev": true,
      "dependencies": {
        "debug": "^2.3.3",
        "define-property": "^0.2.5",
@@ -5576,7 +5656,6 @@
      "version": "0.2.5",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^0.1.0"
      },
@@ -5588,7 +5667,6 @@
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
      "dev": true,
      "dependencies": {
        "is-extendable": "^0.1.0"
      },
@@ -5671,7 +5749,6 @@
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
      "dev": true,
      "dependencies": {
        "assign-symbols": "^1.0.0",
        "is-extendable": "^1.0.1"
@@ -5684,7 +5761,6 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
      "dev": true,
      "dependencies": {
        "is-plain-object": "^2.0.4"
      },
@@ -5710,7 +5786,6 @@
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
      "dev": true,
      "dependencies": {
        "array-unique": "^0.3.2",
        "define-property": "^1.0.0",
@@ -5729,7 +5804,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^1.0.0"
      },
@@ -5741,7 +5815,6 @@
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
      "dev": true,
      "dependencies": {
        "is-extendable": "^0.1.0"
      },
@@ -5753,7 +5826,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.0"
      },
@@ -5765,7 +5837,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.0"
      },
@@ -5777,7 +5848,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
      "dev": true,
      "dependencies": {
        "is-accessor-descriptor": "^1.0.0",
        "is-data-descriptor": "^1.0.0",
@@ -5791,7 +5861,6 @@
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -6080,7 +6149,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -6121,7 +6189,6 @@
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
      "dev": true,
      "dependencies": {
        "map-cache": "^0.2.2"
      },
@@ -6229,6 +6296,21 @@
        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
      }
    },
    "node_modules/fstream": {
      "version": "1.0.12",
      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
      "dev": true,
      "dependencies": {
        "graceful-fs": "^4.1.2",
        "inherits": "~2.0.0",
        "mkdirp": ">=0.5 0",
        "rimraf": "2"
      },
      "engines": {
        "node": ">=0.6"
      }
    },
    "node_modules/ftp": {
      "version": "0.3.10",
      "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
@@ -6267,16 +6349,72 @@
      "dev": true
    },
    "node_modules/function-bind": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
      "dev": true
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/functional-red-black-tree": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
      "dev": true
    },
    "node_modules/gauge": {
      "version": "2.7.4",
      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
      "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
      "dev": true,
      "dependencies": {
        "aproba": "^1.0.3",
        "console-control-strings": "^1.0.0",
        "has-unicode": "^2.0.0",
        "object-assign": "^4.1.0",
        "signal-exit": "^3.0.0",
        "string-width": "^1.0.1",
        "strip-ansi": "^3.0.1",
        "wide-align": "^1.1.0"
      }
    },
    "node_modules/gauge/node_modules/is-fullwidth-code-point": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
      "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
      "dev": true,
      "dependencies": {
        "number-is-nan": "^1.0.0"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/gauge/node_modules/string-width": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
      "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
      "dev": true,
      "dependencies": {
        "code-point-at": "^1.0.0",
        "is-fullwidth-code-point": "^1.0.0",
        "strip-ansi": "^3.0.0"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/gaze": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
      "dev": true,
      "dependencies": {
        "globule": "^1.0.0"
      },
      "engines": {
        "node": ">= 4.0.0"
      }
    },
    "node_modules/get-caller-file": {
      "version": "1.0.3",
@@ -6320,7 +6458,6 @@
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -6400,6 +6537,20 @@
        "node": ">=0.10.0"
      }
    },
    "node_modules/globule": {
      "version": "1.3.4",
      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz",
      "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==",
      "dev": true,
      "dependencies": {
        "glob": "~7.1.1",
        "lodash": "^4.17.21",
        "minimatch": "~3.0.2"
      },
      "engines": {
        "node": ">= 0.10"
      }
    },
    "node_modules/good-listener": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
@@ -6409,9 +6560,9 @@
      }
    },
    "node_modules/graceful-fs": {
      "version": "4.2.4",
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
      "version": "4.2.11",
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
      "dev": true
    },
    "node_modules/graceful-readlink": {
@@ -6490,7 +6641,6 @@
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
      "dev": true,
      "dependencies": {
        "ansi-regex": "^2.0.0"
      },
@@ -6502,7 +6652,6 @@
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
      "dev": true,
      "engines": {
        "node": ">=4"
      }
@@ -6519,11 +6668,16 @@
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/has-unicode": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
      "dev": true
    },
    "node_modules/has-value": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
      "dev": true,
      "dependencies": {
        "get-value": "^2.0.6",
        "has-values": "^1.0.0",
@@ -6537,7 +6691,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
      "dev": true,
      "dependencies": {
        "is-number": "^3.0.0",
        "kind-of": "^4.0.0"
@@ -6550,7 +6703,6 @@
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
      "dev": true,
      "dependencies": {
        "kind-of": "^3.0.2"
      },
@@ -6562,7 +6714,6 @@
      "version": "3.2.2",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
      "dev": true,
      "dependencies": {
        "is-buffer": "^1.1.5"
      },
@@ -6574,7 +6725,6 @@
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
      "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
      "dev": true,
      "dependencies": {
        "is-buffer": "^1.1.5"
      },
@@ -6646,11 +6796,21 @@
        "minimalistic-assert": "^1.0.1"
      }
    },
    "node_modules/hasown": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
      "dependencies": {
        "function-bind": "^1.1.2"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/he": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
      "dev": true,
      "bin": {
        "he": "bin/he"
      }
@@ -6800,7 +6960,6 @@
      "version": "3.10.1",
      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
      "dev": true,
      "dependencies": {
        "domelementtype": "^1.3.1",
        "domhandler": "^2.3.0",
@@ -6813,14 +6972,12 @@
    "node_modules/htmlparser2/node_modules/entities": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
      "dev": true
      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
    },
    "node_modules/htmlparser2/node_modules/readable-stream": {
      "version": "3.6.0",
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
      "dev": true,
      "dependencies": {
        "inherits": "^2.0.3",
        "string_decoder": "^1.1.1",
@@ -6975,6 +7132,17 @@
      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
      "dev": true
    },
    "node_modules/image-size": {
      "version": "0.5.5",
      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
      "bin": {
        "image-size": "bin/image-size.js"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/import-cwd": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
@@ -7037,6 +7205,18 @@
        "node": ">=0.8.19"
      }
    },
    "node_modules/in-publish": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
      "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
      "dev": true,
      "bin": {
        "in-install": "in-install.js",
        "in-publish": "in-publish.js",
        "not-in-install": "not-in-install.js",
        "not-in-publish": "not-in-publish.js"
      }
    },
    "node_modules/indent-string": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
@@ -7068,8 +7248,7 @@
    "node_modules/inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
      "dev": true
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    },
    "node_modules/inquirer": {
      "version": "7.3.3",
@@ -7337,7 +7516,6 @@
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
      "dev": true,
      "dependencies": {
        "kind-of": "^3.0.2"
      },
@@ -7376,8 +7554,7 @@
    "node_modules/is-buffer": {
      "version": "1.1.6",
      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
      "dev": true
      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
    },
    "node_modules/is-callable": {
      "version": "1.2.0",
@@ -7409,7 +7586,6 @@
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
      "dev": true,
      "dependencies": {
        "kind-of": "^3.0.2"
      },
@@ -7433,7 +7609,6 @@
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
      "dev": true,
      "dependencies": {
        "is-accessor-descriptor": "^0.1.6",
        "is-data-descriptor": "^0.1.4",
@@ -7447,7 +7622,6 @@
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -7465,7 +7639,6 @@
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -7568,7 +7741,6 @@
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -7577,7 +7749,6 @@
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
      "dev": true,
      "dependencies": {
        "isobject": "^3.0.1"
      },
@@ -7676,7 +7847,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -7707,8 +7877,7 @@
    "node_modules/isarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
      "dev": true
      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
    },
    "node_modules/isexe": {
      "version": "2.0.0",
@@ -7720,7 +7889,6 @@
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -7734,8 +7902,7 @@
    "node_modules/js-base64": {
      "version": "2.6.4",
      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
      "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
      "dev": true
      "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ=="
    },
    "node_modules/js-tokens": {
      "version": "3.0.2",
@@ -7861,7 +8028,6 @@
      "version": "3.2.2",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
      "dev": true,
      "dependencies": {
        "is-buffer": "^1.1.5"
      },
@@ -7962,7 +8128,6 @@
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
      "dev": true,
      "dependencies": {
        "big.js": "^5.2.2",
        "emojis-list": "^3.0.0",
@@ -7976,7 +8141,6 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
      "dev": true,
      "dependencies": {
        "minimist": "^1.2.0"
      },
@@ -8279,7 +8443,6 @@
      "version": "0.2.2",
      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -8297,7 +8460,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
      "dev": true,
      "dependencies": {
        "object-visit": "^1.0.0"
      },
@@ -8500,6 +8662,17 @@
      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
      "dev": true
    },
    "node_modules/merge-options": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz",
      "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==",
      "dependencies": {
        "is-plain-obj": "^1.1"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/methods": {
      "version": "1.1.2",
@@ -8728,8 +8901,7 @@
    "node_modules/minimist": {
      "version": "1.2.5",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
      "dev": true
      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
    },
    "node_modules/mississippi": {
      "version": "2.0.0",
@@ -8752,11 +8924,15 @@
        "node": ">=4.0.0"
      }
    },
    "node_modules/mitt": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.2.tgz",
      "integrity": "sha512-3btxP0O9iGADGWAkteQ8mzDtEspZqu4I32y4GZYCV5BrwtzdcRpF4dQgNdJadCrbBx7Lu6Sq9AVrerMHR0Hkmw=="
    },
    "node_modules/mixin-deep": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
      "dev": true,
      "dependencies": {
        "for-in": "^1.0.2",
        "is-extendable": "^1.0.1"
@@ -8769,7 +8945,6 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
      "dev": true,
      "dependencies": {
        "is-plain-object": "^2.0.4"
      },
@@ -8963,17 +9138,15 @@
      "dev": true
    },
    "node_modules/nan": {
      "version": "2.14.1",
      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
      "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
      "dev": true,
      "optional": true
      "version": "2.18.0",
      "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz",
      "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==",
      "dev": true
    },
    "node_modules/nanomatch": {
      "version": "1.2.13",
      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
      "dev": true,
      "dependencies": {
        "arr-diff": "^4.0.0",
        "array-unique": "^0.3.2",
@@ -8995,7 +9168,6 @@
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -9103,6 +9275,41 @@
        "node": ">= 4.5.0"
      }
    },
    "node_modules/node-gyp": {
      "version": "3.8.0",
      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
      "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
      "dev": true,
      "dependencies": {
        "fstream": "^1.0.0",
        "glob": "^7.0.3",
        "graceful-fs": "^4.1.2",
        "mkdirp": "^0.5.0",
        "nopt": "2 || 3",
        "npmlog": "0 || 1 || 2 || 3 || 4",
        "osenv": "0",
        "request": "^2.87.0",
        "rimraf": "2",
        "semver": "~5.3.0",
        "tar": "^2.0.0",
        "which": "1"
      },
      "bin": {
        "node-gyp": "bin/node-gyp.js"
      },
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/node-gyp/node_modules/semver": {
      "version": "5.3.0",
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
      "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==",
      "dev": true,
      "bin": {
        "semver": "bin/semver"
      }
    },
    "node_modules/node-libs-browser": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
@@ -9159,6 +9366,94 @@
      "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==",
      "dev": true
    },
    "node_modules/node-sass": {
      "version": "4.14.1",
      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
      "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
      "dev": true,
      "hasInstallScript": true,
      "dependencies": {
        "async-foreach": "^0.1.3",
        "chalk": "^1.1.1",
        "cross-spawn": "^3.0.0",
        "gaze": "^1.0.0",
        "get-stdin": "^4.0.1",
        "glob": "^7.0.3",
        "in-publish": "^2.0.0",
        "lodash": "^4.17.15",
        "meow": "^3.7.0",
        "mkdirp": "^0.5.1",
        "nan": "^2.13.2",
        "node-gyp": "^3.8.0",
        "npmlog": "^4.0.0",
        "request": "^2.88.0",
        "sass-graph": "2.2.5",
        "stdout-stream": "^1.4.0",
        "true-case-path": "^1.0.2"
      },
      "bin": {
        "node-sass": "bin/node-sass"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/node-sass/node_modules/ansi-styles": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
      "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/node-sass/node_modules/chalk": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
      "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^2.2.1",
        "escape-string-regexp": "^1.0.2",
        "has-ansi": "^2.0.0",
        "strip-ansi": "^3.0.0",
        "supports-color": "^2.0.0"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/node-sass/node_modules/cross-spawn": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
      "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==",
      "dev": true,
      "dependencies": {
        "lru-cache": "^4.0.1",
        "which": "^1.2.9"
      }
    },
    "node_modules/node-sass/node_modules/supports-color": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
      "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
      "dev": true,
      "engines": {
        "node": ">=0.8.0"
      }
    },
    "node_modules/nopt": {
      "version": "3.0.6",
      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
      "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
      "dev": true,
      "dependencies": {
        "abbrev": "1"
      },
      "bin": {
        "nopt": "bin/nopt.js"
      }
    },
    "node_modules/normalize-package-data": {
      "version": "2.5.0",
      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@@ -9204,6 +9499,11 @@
        "node": ">=4"
      }
    },
    "node_modules/normalize-wheel": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
      "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
    },
    "node_modules/npm-run-path": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@@ -9214,6 +9514,18 @@
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/npmlog": {
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
      "dev": true,
      "dependencies": {
        "are-we-there-yet": "~1.1.2",
        "console-control-strings": "~1.1.0",
        "gauge": "~2.7.3",
        "set-blocking": "~2.0.0"
      }
    },
    "node_modules/nth-check": {
@@ -9253,7 +9565,6 @@
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -9262,7 +9573,6 @@
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
      "dev": true,
      "dependencies": {
        "copy-descriptor": "^0.1.0",
        "define-property": "^0.2.5",
@@ -9276,7 +9586,6 @@
      "version": "0.2.5",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^0.1.0"
      },
@@ -9322,7 +9631,6 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
      "dev": true,
      "dependencies": {
        "isobject": "^3.0.0"
      },
@@ -9365,7 +9673,6 @@
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
      "dev": true,
      "dependencies": {
        "isobject": "^3.0.1"
      },
@@ -9610,6 +9917,16 @@
        "node": ">=0.10.0"
      }
    },
    "node_modules/osenv": {
      "version": "0.1.5",
      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
      "dev": true,
      "dependencies": {
        "os-homedir": "^1.0.0",
        "os-tmpdir": "^1.0.0"
      }
    },
    "node_modules/p-finally": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -9783,7 +10100,6 @@
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -9974,7 +10290,6 @@
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -9983,7 +10298,6 @@
      "version": "6.0.23",
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
      "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
      "dev": true,
      "dependencies": {
        "chalk": "^2.4.1",
        "source-map": "^0.6.1",
@@ -12219,6 +12533,14 @@
        "node": ">=0.8.0"
      }
    },
    "node_modules/postcss-prefix-selector": {
      "version": "1.16.0",
      "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz",
      "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==",
      "peerDependencies": {
        "postcss": ">4 <9"
      }
    },
    "node_modules/postcss-px-to-viewport-opt": {
      "version": "0.0.4",
      "resolved": "https://registry.npmjs.org/postcss-px-to-viewport-opt/-/postcss-px-to-viewport-opt-0.0.4.tgz",
@@ -12964,6 +13286,65 @@
        "node": ">=0.8.0"
      }
    },
    "node_modules/posthtml": {
      "version": "0.9.2",
      "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz",
      "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==",
      "dependencies": {
        "posthtml-parser": "^0.2.0",
        "posthtml-render": "^1.0.5"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/posthtml-parser": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz",
      "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==",
      "dependencies": {
        "htmlparser2": "^3.8.3",
        "isobject": "^2.1.0"
      }
    },
    "node_modules/posthtml-parser/node_modules/isobject": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
      "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
      "dependencies": {
        "isarray": "1.0.0"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/posthtml-rename-id": {
      "version": "1.0.12",
      "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz",
      "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==",
      "dependencies": {
        "escape-string-regexp": "1.0.5"
      }
    },
    "node_modules/posthtml-render": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz",
      "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==",
      "engines": {
        "node": ">=10"
      }
    },
    "node_modules/posthtml-svg-mode": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz",
      "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==",
      "dependencies": {
        "merge-options": "1.0.1",
        "posthtml": "^0.9.2",
        "posthtml-parser": "^0.2.1",
        "posthtml-render": "^1.0.6"
      }
    },
    "node_modules/prelude-ls": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -13169,7 +13550,6 @@
      "version": "4.3.4",
      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
      "dev": true,
      "dependencies": {
        "object-assign": "^4.1.0",
        "strict-uri-encode": "^1.0.0"
@@ -13400,8 +13780,7 @@
    "node_modules/regenerator-runtime": {
      "version": "0.11.1",
      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
      "dev": true
      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
    },
    "node_modules/regenerator-transform": {
      "version": "0.10.1",
@@ -13418,7 +13797,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
      "dev": true,
      "dependencies": {
        "extend-shallow": "^3.0.2",
        "safe-regex": "^1.1.0"
@@ -13522,7 +13900,6 @@
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -13531,7 +13908,6 @@
      "version": "1.6.1",
      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
      "dev": true,
      "engines": {
        "node": ">=0.10"
      }
@@ -13610,6 +13986,11 @@
      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
      "dev": true
    },
    "node_modules/resize-observer-polyfill": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
    },
    "node_modules/resolve": {
      "version": "1.17.0",
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
@@ -13647,8 +14028,7 @@
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
      "deprecated": "https://github.com/lydell/resolve-url#deprecated",
      "dev": true
      "deprecated": "https://github.com/lydell/resolve-url#deprecated"
    },
    "node_modules/restore-cursor": {
      "version": "2.0.0",
@@ -13667,7 +14047,6 @@
      "version": "0.1.15",
      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
      "dev": true,
      "engines": {
        "node": ">=0.12"
      }
@@ -13757,14 +14136,12 @@
    "node_modules/safe-buffer": {
      "version": "5.1.2",
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
      "dev": true
      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
    },
    "node_modules/safe-regex": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
      "dev": true,
      "dependencies": {
        "ret": "~0.1.10"
      }
@@ -13774,6 +14151,237 @@
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
      "dev": true
    },
    "node_modules/sass-graph": {
      "version": "2.2.5",
      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
      "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
      "dev": true,
      "dependencies": {
        "glob": "^7.0.0",
        "lodash": "^4.0.0",
        "scss-tokenizer": "^0.2.3",
        "yargs": "^13.3.2"
      },
      "bin": {
        "sassgraph": "bin/sassgraph"
      }
    },
    "node_modules/sass-graph/node_modules/ansi-regex": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/camelcase": {
      "version": "5.3.1",
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/cliui": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
      "dev": true,
      "dependencies": {
        "string-width": "^3.1.0",
        "strip-ansi": "^5.2.0",
        "wrap-ansi": "^5.1.0"
      }
    },
    "node_modules/sass-graph/node_modules/emoji-regex": {
      "version": "7.0.3",
      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
      "dev": true
    },
    "node_modules/sass-graph/node_modules/find-up": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
      "dev": true,
      "dependencies": {
        "locate-path": "^3.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/get-caller-file": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
      "dev": true,
      "engines": {
        "node": "6.* || 8.* || >= 10.*"
      }
    },
    "node_modules/sass-graph/node_modules/locate-path": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
      "dev": true,
      "dependencies": {
        "p-locate": "^3.0.0",
        "path-exists": "^3.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/p-limit": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
      "dev": true,
      "dependencies": {
        "p-try": "^2.0.0"
      },
      "engines": {
        "node": ">=6"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/sass-graph/node_modules/p-locate": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
      "dev": true,
      "dependencies": {
        "p-limit": "^2.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/p-try": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/require-main-filename": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
      "dev": true
    },
    "node_modules/sass-graph/node_modules/string-width": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
      "dev": true,
      "dependencies": {
        "emoji-regex": "^7.0.1",
        "is-fullwidth-code-point": "^2.0.0",
        "strip-ansi": "^5.1.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/strip-ansi": {
      "version": "5.2.0",
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
      "dev": true,
      "dependencies": {
        "ansi-regex": "^4.1.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/wrap-ansi": {
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
      "dev": true,
      "dependencies": {
        "ansi-styles": "^3.2.0",
        "string-width": "^3.0.0",
        "strip-ansi": "^5.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-graph/node_modules/yargs": {
      "version": "13.3.2",
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
      "dev": true,
      "dependencies": {
        "cliui": "^5.0.0",
        "find-up": "^3.0.0",
        "get-caller-file": "^2.0.1",
        "require-directory": "^2.1.1",
        "require-main-filename": "^2.0.0",
        "set-blocking": "^2.0.0",
        "string-width": "^3.0.0",
        "which-module": "^2.0.0",
        "y18n": "^4.0.0",
        "yargs-parser": "^13.1.2"
      }
    },
    "node_modules/sass-graph/node_modules/yargs-parser": {
      "version": "13.1.2",
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
      "dev": true,
      "dependencies": {
        "camelcase": "^5.0.0",
        "decamelize": "^1.2.0"
      }
    },
    "node_modules/sass-loader": {
      "version": "7.3.1",
      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz",
      "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==",
      "dev": true,
      "dependencies": {
        "clone-deep": "^4.0.1",
        "loader-utils": "^1.0.1",
        "neo-async": "^2.5.0",
        "pify": "^4.0.1",
        "semver": "^6.3.0"
      },
      "engines": {
        "node": ">= 6.9.0"
      },
      "peerDependencies": {
        "webpack": "^3.0.0 || ^4.0.0"
      }
    },
    "node_modules/sass-loader/node_modules/pify": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
      "dev": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/sass-loader/node_modules/semver": {
      "version": "6.3.1",
      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
      "dev": true,
      "bin": {
        "semver": "bin/semver.js"
      }
    },
    "node_modules/sax": {
      "version": "1.2.4",
@@ -13816,6 +14424,28 @@
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
      "dev": true
    },
    "node_modules/scss-tokenizer": {
      "version": "0.2.3",
      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
      "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==",
      "dev": true,
      "dependencies": {
        "js-base64": "^2.1.8",
        "source-map": "^0.4.2"
      }
    },
    "node_modules/scss-tokenizer/node_modules/source-map": {
      "version": "0.4.4",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
      "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
      "dev": true,
      "dependencies": {
        "amdefine": ">=0.0.4"
      },
      "engines": {
        "node": ">=0.8.0"
      }
    },
    "node_modules/select": {
      "version": "1.1.2",
@@ -13961,7 +14591,6 @@
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
      "dev": true,
      "dependencies": {
        "extend-shallow": "^2.0.1",
        "is-extendable": "^0.1.1",
@@ -13976,7 +14605,6 @@
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
      "dev": true,
      "dependencies": {
        "is-extendable": "^0.1.0"
      },
@@ -14007,6 +14635,27 @@
      },
      "bin": {
        "sha.js": "bin.js"
      }
    },
    "node_modules/shallow-clone": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.2"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/shallow-clone/node_modules/kind-of": {
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/shebang-command": {
@@ -14055,9 +14704,9 @@
      "dev": true
    },
    "node_modules/signal-exit": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
      "version": "3.0.7",
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
      "dev": true
    },
    "node_modules/simple-swizzle": {
@@ -14112,7 +14761,6 @@
      "version": "0.8.2",
      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
      "dev": true,
      "dependencies": {
        "base": "^0.11.1",
        "debug": "^2.2.0",
@@ -14131,7 +14779,6 @@
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
      "dev": true,
      "dependencies": {
        "define-property": "^1.0.0",
        "isobject": "^3.0.0",
@@ -14145,7 +14792,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^1.0.0"
      },
@@ -14157,7 +14803,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.0"
      },
@@ -14169,7 +14814,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^6.0.0"
      },
@@ -14181,7 +14825,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
      "dev": true,
      "dependencies": {
        "is-accessor-descriptor": "^1.0.0",
        "is-data-descriptor": "^1.0.0",
@@ -14195,7 +14838,6 @@
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -14204,7 +14846,6 @@
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
      "dev": true,
      "dependencies": {
        "kind-of": "^3.2.0"
      },
@@ -14216,7 +14857,6 @@
      "version": "0.2.5",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^0.1.0"
      },
@@ -14228,7 +14868,6 @@
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
      "dev": true,
      "dependencies": {
        "is-extendable": "^0.1.0"
      },
@@ -14240,7 +14879,6 @@
      "version": "0.5.7",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -14335,7 +14973,6 @@
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -14345,7 +14982,6 @@
      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
      "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
      "dev": true,
      "dependencies": {
        "atob": "^2.1.2",
        "decode-uri-component": "^0.2.0",
@@ -14376,8 +15012,7 @@
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
      "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
      "dev": true
      "deprecated": "See https://github.com/lydell/source-map-url#deprecated"
    },
    "node_modules/spdx-correct": {
      "version": "3.1.1",
@@ -14491,7 +15126,6 @@
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
      "dev": true,
      "dependencies": {
        "extend-shallow": "^3.0.0"
      },
@@ -14556,7 +15190,6 @@
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
      "dev": true,
      "dependencies": {
        "define-property": "^0.2.5",
        "object-copy": "^0.1.0"
@@ -14569,7 +15202,6 @@
      "version": "0.2.5",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
      "dev": true,
      "dependencies": {
        "is-descriptor": "^0.1.0"
      },
@@ -14584,6 +15216,15 @@
      "dev": true,
      "engines": {
        "node": ">= 0.6"
      }
    },
    "node_modules/stdout-stream": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
      "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
      "dev": true,
      "dependencies": {
        "readable-stream": "^2.0.1"
      }
    },
    "node_modules/stream-browserify": {
@@ -14629,7 +15270,6 @@
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -14638,7 +15278,6 @@
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
      "dev": true,
      "dependencies": {
        "safe-buffer": "~5.1.0"
      }
@@ -14707,7 +15346,6 @@
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
      "dev": true,
      "dependencies": {
        "ansi-regex": "^2.0.0"
      },
@@ -14844,12 +15482,310 @@
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
      "dev": true,
      "dependencies": {
        "has-flag": "^3.0.0"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/svg-baker": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz",
      "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==",
      "dependencies": {
        "bluebird": "^3.5.0",
        "clone": "^2.1.1",
        "he": "^1.1.1",
        "image-size": "^0.5.1",
        "loader-utils": "^1.1.0",
        "merge-options": "1.0.1",
        "micromatch": "3.1.0",
        "postcss": "^5.2.17",
        "postcss-prefix-selector": "^1.6.0",
        "posthtml-rename-id": "^1.0",
        "posthtml-svg-mode": "^1.0.3",
        "query-string": "^4.3.2",
        "traverse": "^0.6.6"
      }
    },
    "node_modules/svg-baker-runtime": {
      "version": "1.4.7",
      "resolved": "https://registry.npmjs.org/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz",
      "integrity": "sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==",
      "dependencies": {
        "deepmerge": "1.3.2",
        "mitt": "1.1.2",
        "svg-baker": "^1.7.0"
      }
    },
    "node_modules/svg-baker-runtime/node_modules/deepmerge": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz",
      "integrity": "sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/ansi-styles": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
      "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/braces": {
      "version": "2.3.2",
      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
      "dependencies": {
        "arr-flatten": "^1.1.0",
        "array-unique": "^0.3.2",
        "extend-shallow": "^2.0.1",
        "fill-range": "^4.0.0",
        "isobject": "^3.0.1",
        "repeat-element": "^1.1.2",
        "snapdragon": "^0.8.1",
        "snapdragon-node": "^2.0.1",
        "split-string": "^3.0.2",
        "to-regex": "^3.0.1"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/chalk": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
      "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
      "dependencies": {
        "ansi-styles": "^2.2.1",
        "escape-string-regexp": "^1.0.2",
        "has-ansi": "^2.0.0",
        "strip-ansi": "^3.0.0",
        "supports-color": "^2.0.0"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/chalk/node_modules/supports-color": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
      "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
      "engines": {
        "node": ">=0.8.0"
      }
    },
    "node_modules/svg-baker/node_modules/clone": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
      "engines": {
        "node": ">=0.8"
      }
    },
    "node_modules/svg-baker/node_modules/define-property": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
      "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
      "dependencies": {
        "is-descriptor": "^1.0.0"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/extend-shallow": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
      "dependencies": {
        "is-extendable": "^0.1.0"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/fill-range": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
      "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
      "dependencies": {
        "extend-shallow": "^2.0.1",
        "is-number": "^3.0.0",
        "repeat-string": "^1.6.1",
        "to-regex-range": "^2.1.0"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/has-flag": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
      "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/is-accessor-descriptor": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
      "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
      "dependencies": {
        "hasown": "^2.0.0"
      },
      "engines": {
        "node": ">= 0.10"
      }
    },
    "node_modules/svg-baker/node_modules/is-data-descriptor": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
      "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
      "dependencies": {
        "hasown": "^2.0.0"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/svg-baker/node_modules/is-descriptor": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
      "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
      "dependencies": {
        "is-accessor-descriptor": "^1.0.1",
        "is-data-descriptor": "^1.0.1"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/svg-baker/node_modules/is-number": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
      "dependencies": {
        "kind-of": "^3.0.2"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": {
      "version": "3.2.2",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
      "dependencies": {
        "is-buffer": "^1.1.5"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/kind-of": {
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/micromatch": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz",
      "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==",
      "dependencies": {
        "arr-diff": "^4.0.0",
        "array-unique": "^0.3.2",
        "braces": "^2.2.2",
        "define-property": "^1.0.0",
        "extend-shallow": "^2.0.1",
        "extglob": "^2.0.2",
        "fragment-cache": "^0.2.1",
        "kind-of": "^5.0.2",
        "nanomatch": "^1.2.1",
        "object.pick": "^1.3.0",
        "regex-not": "^1.0.0",
        "snapdragon": "^0.8.1",
        "to-regex": "^3.0.1"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/postcss": {
      "version": "5.2.18",
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
      "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
      "dependencies": {
        "chalk": "^1.1.3",
        "js-base64": "^2.1.9",
        "source-map": "^0.5.6",
        "supports-color": "^3.2.3"
      },
      "engines": {
        "node": ">=0.12"
      }
    },
    "node_modules/svg-baker/node_modules/source-map": {
      "version": "0.5.7",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-baker/node_modules/supports-color": {
      "version": "3.2.3",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
      "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
      "dependencies": {
        "has-flag": "^1.0.0"
      },
      "engines": {
        "node": ">=0.8.0"
      }
    },
    "node_modules/svg-baker/node_modules/to-regex-range": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
      "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
      "dependencies": {
        "is-number": "^3.0.0",
        "repeat-string": "^1.6.1"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svg-sprite-loader": {
      "version": "6.0.11",
      "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.11.tgz",
      "integrity": "sha512-TedsTf8wsHH6HgdwKjUveDZRC6q5gPloYV8A8/zZaRWP929J7x6TzQ6MvZFl+YYDJuJ0Akyuu/vNVJ+fbPuYXg==",
      "dependencies": {
        "bluebird": "^3.5.0",
        "deepmerge": "1.3.2",
        "domready": "1.0.8",
        "escape-string-regexp": "1.0.5",
        "loader-utils": "^1.1.0",
        "svg-baker": "^1.5.0",
        "svg-baker-runtime": "^1.4.7",
        "url-slug": "2.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/svg-sprite-loader/node_modules/deepmerge": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz",
      "integrity": "sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/svgo": {
@@ -14952,6 +15888,18 @@
        "node": ">=0.6"
      }
    },
    "node_modules/tar": {
      "version": "2.2.2",
      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
      "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
      "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.",
      "dev": true,
      "dependencies": {
        "block-stream": "*",
        "fstream": "^1.0.12",
        "inherits": "2"
      }
    },
    "node_modules/tcp-port-used": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz",
@@ -14983,6 +15931,14 @@
      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
      "dev": true
    },
    "node_modules/throttle-debounce": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==",
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/through": {
      "version": "2.3.8",
@@ -15075,7 +16031,6 @@
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
      "dev": true,
      "dependencies": {
        "kind-of": "^3.0.2"
      },
@@ -15087,7 +16042,6 @@
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
      "dev": true,
      "dependencies": {
        "define-property": "^2.0.2",
        "extend-shallow": "^3.0.2",
@@ -15139,6 +16093,14 @@
        "node": ">=0.8"
      }
    },
    "node_modules/traverse": {
      "version": "0.6.7",
      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz",
      "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==",
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/trim-newlines": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
@@ -15155,6 +16117,15 @@
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/true-case-path": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
      "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
      "dev": true,
      "dependencies": {
        "glob": "^7.1.2"
      }
    },
    "node_modules/tryer": {
@@ -15338,11 +16309,18 @@
        "node": ">=0.8.0"
      }
    },
    "node_modules/unidecode": {
      "version": "0.1.8",
      "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz",
      "integrity": "sha512-SdoZNxCWpN2tXTCrGkPF/0rL2HEq+i2gwRG1ReBvx8/0yTzC3enHfugOf8A9JBShVwwrRIkLX0YcDUGbzjbVCA==",
      "engines": {
        "node": ">= 0.4.12"
      }
    },
    "node_modules/union-value": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
      "dev": true,
      "dependencies": {
        "arr-union": "^3.1.0",
        "get-value": "^2.0.6",
@@ -15402,7 +16380,6 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
      "dev": true,
      "dependencies": {
        "has-value": "^0.3.1",
        "isobject": "^3.0.0"
@@ -15415,7 +16392,6 @@
      "version": "0.3.1",
      "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
      "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
      "dev": true,
      "dependencies": {
        "get-value": "^2.0.3",
        "has-values": "^0.1.4",
@@ -15429,7 +16405,6 @@
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
      "dev": true,
      "dependencies": {
        "isarray": "1.0.0"
      },
@@ -15441,7 +16416,6 @@
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
      "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -15475,8 +16449,7 @@
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
      "deprecated": "Please see https://github.com/lydell/urix#deprecated",
      "dev": true
      "deprecated": "Please see https://github.com/lydell/urix#deprecated"
    },
    "node_modules/url": {
      "version": "0.11.0",
@@ -15520,6 +16493,14 @@
        "requires-port": "^1.0.0"
      }
    },
    "node_modules/url-slug": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/url-slug/-/url-slug-2.0.0.tgz",
      "integrity": "sha512-aiNmSsVgrjCiJ2+KWPferjT46YFKoE8i0YX04BlMVDue022Xwhg/zYlnZ6V9/mP3p8Wj7LEp0myiTkC/p6sxew==",
      "dependencies": {
        "unidecode": "0.1.8"
      }
    },
    "node_modules/url/node_modules/punycode": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
@@ -15530,7 +16511,6 @@
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
      "dev": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -15547,8 +16527,7 @@
    "node_modules/util-deprecate": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
      "dev": true
      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
    },
    "node_modules/util.promisify": {
      "version": "1.0.1",
@@ -16774,6 +17753,15 @@
      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
      "dev": true
    },
    "node_modules/wide-align": {
      "version": "1.1.5",
      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
      "dev": true,
      "dependencies": {
        "string-width": "^1.0.2 || 2 || 3 || 4"
      }
    },
    "node_modules/window-size": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
package.json
@@ -15,6 +15,8 @@
  "dependencies": {
    "axios": "^0.19.2",
    "clipboard": "^2.0.6",
    "element-ui": "^2.15.6",
    "svg-sprite-loader": "^6.0.11",
    "vue": "^2.5.2",
    "vue-router": "^3.0.1",
    "vuex": "^3.5.1"
@@ -47,6 +49,7 @@
    "mockjs": "^1.1.0",
    "nightwatch": "^0.9.12",
    "node-notifier": "^5.1.2",
    "node-sass": "^4.14.1",
    "optimize-css-assets-webpack-plugin": "^3.2.0",
    "ora": "^1.2.0",
    "portfinder": "^1.0.13",
@@ -56,6 +59,7 @@
    "postcss-url": "^7.2.1",
    "postcss-viewport-units": "^0.1.6",
    "rimraf": "^2.6.0",
    "sass-loader": "^7.3.1",
    "selenium-server": "^3.0.1",
    "semver": "^5.3.0",
    "shelljs": "^0.7.6",
src/assets/css/common.css
@@ -43,7 +43,21 @@
    align-items: center;
    -webkit-align-items: center;
}
/* 水平居中 */
.flex-align-center{
    justify-content: center;
    -webkit-justify-content: center;
}
/* 水平居左 */
.flex-align-start{
    justify-content: start;
    -webkit-justify-content: start;
}
/* 水平居右 */
.flex-align-end{
    justify-content: end;
    -webkit-justify-content: end;
}
.flex-ver {-webkit-align-items: center;align-items: center;}
.flex-col {-webkit-flex-flow: column;flex-flow: column;}
.flex-end{
src/assets/login/login_left.png
src/assets/login/login_mid.png
src/assets/login/login_right.png
src/assets/login/logo.png
src/components/SvgIcon/index.vue
New file
@@ -0,0 +1,62 @@
<template>
  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
    <use :xlink:href="iconName" />
  </svg>
</template>
<script>
// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
import { isExternal } from '@/utils/validate'
export default {
  name: 'SvgIcon',
  props: {
    iconClass: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ''
    }
  },
  computed: {
    isExternal() {
      return isExternal(this.iconClass)
    },
    iconName() {
      return `#icon-${this.iconClass}`
    },
    svgClass() {
      if (this.className) {
        return 'svg-icon ' + this.className
      } else {
        return 'svg-icon'
      }
    },
    styleExternalIcon() {
      return {
        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
      }
    }
  }
}
</script>
<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
.svg-external-icon {
  background-color: currentColor;
  mask-size: cover!important;
  display: inline-block;
}
</style>
src/components/xio_customer_select/index.vue
@@ -1,6 +1,6 @@
<template>
  <div class="mask hide">
    <div class="xio_customer_select_dialog">
  <div v-if="isShow" class="mask" @click="hideDialog">
    <div class="xio_customer_select_dialog" @click.stop="noop">
      <div class="title">是否选择客人[张怀民],使用当前房间?</div>
      <div class="content flex flex-sb">
        <div class="tx flex-1" style="text-align: left;">医生:张怀民</div>
@@ -12,8 +12,8 @@
      </div>
      <div class="btn_box flex flex-center">
        <div class="flex flex-ver">
          <div class="btn_box__item flex flex-center">取消</div>
          <div class="btn_box__item flex flex-center">确定</div>
          <div class="btn_box__item flex flex-center" @click="cancel">取消</div>
          <div class="btn_box__item flex flex-center" @click="submit">确定</div>
        </div>
      </div>
    </div>
@@ -31,12 +31,34 @@
  },
  data() {
    return {
      isShow: false
      isShow: false,
      dialogData: {}
    }
  },
  methods: {
    toggleClick() {
      this.$emit('toggleClick')
    // 取消
    cancel() {
      this.$emit('cancel', {})
    },
    // 提交
    submit() {
      this.$emit('submit', {})
    },
    noop() {
      return
    },
    // 显示弹窗
    showDialog() {
      this.isShow = true
    },
    // 关闭弹窗
    hideDialog() {
      this.isShow = false
      this.dialogData = {}
    },
    // 数据初始化
    dataInit(data) {
      this.dialogData = data
    }
  }
}
src/components/xio_room_status_chg/index.vue
@@ -1,6 +1,40 @@
<template>
  <div class="mask">
    <div class="xio_room_status_chg_dialog"></div>
  <div v-if="isShow" class="mask" @click="hideDialog">
    <div class="xio_room_status_chg_dialog" @click.stop="noop">
      <div class="title">初始化房间状态(点击下方按钮直接更改房间状态)</div>
      <div class="btn_box flex flex-center">
        <div style="width: 100%;">
          <div class="line flex flex-ver flex-sb">
            <div class="btn_box_item flex flex-center white" @click="changeStatus('空闲')">
              <div class="flex flex-ver">
                <img class="icon" src="../../assets/img/free.png">
                <div class="tx">空闲</div>
              </div>
            </div>
            <div class="btn_box_item flex flex-center blue" @click="changeStatus('使用中')">
              <div class="flex flex-ver">
                <img class="icon" src="../../assets/img/using.png">
                <div class="tx white">使用中</div>
              </div>
            </div>
          </div>
          <div class="line flex flex-ver flex-sb">
            <div class="btn_box_item flex flex-center yellow" @click="changeStatus('客人休息')">
              <div class="flex flex-ver">
                <img class="icon" src="../../assets/img/rest.png">
                <div class="tx">客人休息</div>
              </div>
            </div>
            <div class="btn_box_item flex flex-center gray" @click="changeStatus('通知打扫')">
              <div class="flex flex-ver">
                <img class="icon" src="../../assets/img/clear.png">
                <div class="tx">通知打扫</div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
@@ -19,13 +53,87 @@
    }
  },
  methods: {
    toggleClick() {
      this.$emit('toggleClick')
    noop() {
      return
    },
    // 更换状态
    changeStatus(tx) {
      this.$emit('changeStatus', { statusTx: tx })
    },
    // 显示弹窗
    showDialog() {
      this.isShow = true
    },
    // 关闭弹窗
    hideDialog() {
      this.isShow = false
    }
  }
}
</script>
<style scoped>
.xio_room_status_chg_dialog {
  width: 1105px;
  min-height: 602px;
  border-radius: 10px;
  background-color: rgba(255,255,255,1);
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  z-index: 1;
}
.xio_room_status_chg_dialog .title {
  line-height: 37px;
  color: rgba(16,16,16,1);
  font-size: 26px;
  text-align: left;
  font-family: PingFangSC-medium;
  padding: 37px 31px 16px 31px;
}
.xio_room_status_chg_dialog .btn_box {
  padding: 0 193px;
}
.xio_room_status_chg_dialog .btn_box .line {
  width: 100%;
}
.xio_room_status_chg_dialog .btn_box_item {
  width: 250px;
  height: 120px;
  line-height: 20px;
  border-radius: 10px;
  text-align: center;
  box-shadow: 0px 2px 6px 0px rgba(206,206,206,0.86);
  margin-top: 76px;
}
.xio_room_status_chg_dialog .btn_box_item.white {
  background-color: rgba(255,255,255,1);
}
.xio_room_status_chg_dialog .btn_box_item.blue {
  background-color: rgba(46,77,124,1);
}
.xio_room_status_chg_dialog .btn_box_item.yellow {
  background-color: rgba(255,199,115,1);
}
.xio_room_status_chg_dialog .btn_box_item.gray {
  background-color: rgba(206,206,206,1);
}
.xio_room_status_chg_dialog .btn_box_item .icon {
  width: 60px;
  height: 60px;
  display: block;
  margin-right: 17px;
}
.xio_room_status_chg_dialog .btn_box_item .tx {
  line-height: 37px;
  color: rgba(51,51,51,1);
  font-size: 26px;
  text-align: center;
  font-family: PingFangSC-medium;
}
.xio_room_status_chg_dialog .btn_box_item .tx.white {
  color: #ffffff;
}
</style>
src/config/index.js
@@ -7,16 +7,21 @@
import appId from './appid.js'
var ismock = 1// 虚拟数据 0不使用 1使用
var istest = 0// 0线上 1本地 2测试环境
var ismock = 0// 虚拟数据 0不使用 1使用
var istest = 2// 0线上 1本地 2测试环境
var isConsole = 1// 是否屏蔽console 0屏蔽 1开放
var debug = isConsole
var isWxLoginType = 0 // 微信登录 0无 1静默微信登录snsapi_base 2手动微信登录snsapi_userinfo
var isTestView = 1
var localOnline = istest ? 0 : 1 // 本地连线上
// 打包后的环境
if (process.env && process.env.NODE_ENV !== 'development') {
  istest = 0
  ismock = 0
  isTestView = 0
  localOnline = 0
}
const pdomain = '/' // 线上
@@ -74,6 +79,8 @@
export default {
  ismock,
  istest,
  isTestView,
  localOnline,
  isWxLoginType,
  isConsole,
  debug,
src/icons/index.js
New file
@@ -0,0 +1,9 @@
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component
// register globally
Vue.component('svg-icon', SvgIcon)
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
src/icons/svg/eye-open.svg
New file
@@ -0,0 +1 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
src/icons/svg/eye.svg
New file
@@ -0,0 +1 @@
<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
src/icons/svg/password.svg
New file
@@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
src/icons/svg/safecode.svg
New file
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="40px" height="40.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#00AFAA" d="M511.92574 1023.975247C357.959389 1023.975247 71.50029 794.49855 71.50029 577.448076V163.162251c0-10.049894 8.416167-18.16902 18.837362-18.379424l24.95146-0.420808c0.953007 0 98.766196-1.967898 199.599304-41.895185 103.481725-40.843164 170.179849-87.936569 170.885322-88.419261l14.691162-10.421195a19.86463 19.86463 0 0 1 11.398956-3.601625 19.480951 19.480951 0 0 1 11.324696 3.539741l14.975826 10.507832c0.680719 0.482692 67.440727 47.526591 170.798685 88.419262 100.932121 39.927287 198.74531 41.895185 199.747825 41.895184l24.753432 0.420809c10.433572 0.210404 18.824985 8.32953 18.824986 18.379423l0.210404 414.285825c0 217.02572-286.508606 446.527171-440.6111 446.527171z m372.625797-812.568556c-37.860375-2.846645-117.516921-12.624251-200.267646-45.385419-84.557726-33.417134-146.725972-71.005221-172.358151-87.602398-25.557919 16.535293-87.763295 54.135757-172.296268 87.602398-82.602205 32.686908-162.03597 42.464514-200.416167 45.385419v366.041385c0 170.216979 249.576484 378.281957 372.712435 378.281957 47.724618 0 140.723264-38.726745 232.137691-123.767163 88.12222-81.909108 140.723264-177.07368 140.723264-254.490041z m-407.948946 435.660414a33.305744 33.305744 0 0 1-23.899439 10.049894 33.738929 33.738929 0 0 1-23.998453-10.037517l-101.674724-102.330691a34.345388 34.345388 0 0 1 0-48.269193 33.664668 33.664668 0 0 1 47.935022 0l77.738155 78.183717 196.269967-197.69329a33.590408 33.590408 0 0 1 47.910269 0 34.18449 34.18449 0 0 1 0 48.269194z m0 0" /></svg>
src/icons/svg/user.svg
New file
@@ -0,0 +1 @@
<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
src/icons/svgo.yml
New file
@@ -0,0 +1,22 @@
# replace default config
# multipass: true
# full: true
plugins:
  # - name
  #
  # or:
  # - name: false
  # - name: true
  #
  # or:
  # - name:
  #     param1: 1
  #     param2: 2
- removeAttrs:
    attrs:
      - 'fill'
      - 'fill-rule'
src/main.js
@@ -2,9 +2,10 @@
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
// 直接从core-js引入全局的polyfill
import 'core-js/fn/promise';
import 'core-js/fn/promise'
import Vue from 'vue'
import Element from 'element-ui'
import App from './App'
import router from './router' // 路由表
@@ -15,6 +16,12 @@
import Req from './utils/jun_httpInstall' // http 请求
import fn from './utils/g_fn_install'
import 'element-ui/lib/theme-chalk/index.css'
import 'element-ui/lib/theme-chalk/display.css'
import '@/icons' // icon
Vue.prototype.isTestView = config.isTestView
Vue.config.productionTip = false
Vue.config.devtools = config.devtools
@@ -23,7 +30,11 @@
  require('./mock.js')
}
Vue.config.productionTip = false
// Vue.use(element)
// 解决elementui下拉搜索框在ios上唤不起软键盘
import ElementUI from '@/utils/element-ui-preprocessing'
Vue.use(Element)
Vue.use(ElementUI)
Vue.use(Axios)
Vue.use(filter)
Vue.use(Req)
src/pages/login/g_mockData.js
New file
@@ -0,0 +1,69 @@
module.exports = {
  // login: {
  //   code: 100,
  //   msg: '',
  //   data: {
  //     adminToken: 'mockdAmintoken', // 登录凭证
  //     name: '潘多拉的臭嘴', // 用户名称
  //     // arr: ['sys_admin_see'], // 权限列表
  //     arr: ['sys_admin_see', 'sys_admin_add', 'sys_admin_edit', 'sys_admin_del', 'sys_admin_role_see',
  //       'sys_admin_role_add', 'sys_admin_role_edit', 'sys_admin_role_del', 'corp_user_schedule_see',
  //       'corp_user_schedule_add', 'corp_user_schedule_edit', 'corp_user_schedule_del', 'user_mp_banner_see',
  //       'user_mp_banner_add', 'user_mp_banner_edit', 'user_mp_banner_del', 'shop_see', 'shop_add', 'shop_edit',
  //       'shop_del', 'shop_device', 'corp_user_see', 'corp_user_add', 'corp_user_edit', 'corp_user_del',
  //       'change_assistant_see', 'ser_pro_material_see', 'service_project_see', 'service_project_add',
  //       'service_project_edit', 'service_project_del', 'service_topic_see', 'service_topic_add',
  //       'service_topic_edit', 'service_topic_del', 'service_project_order_see', 'service_project_order_edit',
  //       'goods_type_see', 'goods_type_add', 'goods_type_edit', 'goods_type_del', 'goods_see', 'goods_add', 'goods_edit',
  //       'goods_del', 'goods_inventory', 'goods_order_see', 'goods_order_edit', 'goods_index_banner_see',
  //       'goods_index_banner_add', 'goods_index_banner_edit', 'goods_index_banner_del', 'user_see', 'user_edit',
  //       'user_cash_see', 'user_cash_edit', 'distribute_relate', 'distribute_order', 'document_edit', 'operation_see',
  //       'coupon_see', 'coupon_add', 'coupon_edit', 'coupon_del', 'activity_see', 'activity_add', 'activity_edit', 'activity_del', 'system_set',
  //       // 门店
  //       'shop_see', 'shop_add', 'shop_edit', 'shop_del', 'shop_time', 'shop_time', 'doctor_schedule',
  //       // 顾问
  //       'corp_user_see', 'corp_user_list', 'corp_user_add', 'corp_user_edit', 'corp_user_del',
  //       // 顾问组
  //       'corp_user_team_see', 'corp_user_team_add', 'corp_user_team_edit', 'corp_user_team_delete',
  //       // 项目
  //       'project_type', 'project_see', 'project_add', 'project_edit', 'project_del', 'project_device',
  //       // 护士
  //       'nurse_see', 'nurse_add', 'nurse_edit', 'nurse_del',
  //       // 房间
  //       'room_see', 'room_add', 'room_edit', 'room_del', 'room_project', 'room_schedule',
  //       // 设备
  //       'device_see', 'device_add', 'device_edit', 'device_del', 'device_no', 'device_schedule',
  //       // 医生
  //       'doctor_see', 'doctor_add', 'doctor_edit', 'doctor_del', 'doctor_schedule',
  //       // 用户
  //       'user_see', 'user_add', 'user_edit', 'user_del',
  //       // 用户来源
  //       'user_from_see', 'user_from_add', 'user_from_edit', 'user_from_del',
  //       // 预约
  //       'appointment_see', 'appointment_add', 'appointment_edit', 'appointment_add', 'appointment_edit'
  //     ],
  //     tel: '13113113111',
  //     job: '工作人员',
  //     role: '超级管理员'
  //   }
  // },
  scanLoginTest: {
    'code': '100',
    'msg': 'SUCCESS',
    'data': {
      'roleList': [
        {
          'roleId': '7c5d1244034611edaaa6525400b8510a',
          'shopName': '静安店',
          'roleName': '系统维护员',
          'roleUniqueStr': 'admin',
          'id': '138ef33f123511ed91d1525400b8510a',
          'shopId': 'bb4e8a7d620d11ebb06bb8599f4cafbe'
        }
      ]
    }
  }
}
src/pages/login/getQueryObj.js
New file
@@ -0,0 +1,27 @@
export function getQueryObj() {
  let search = location.search.replace('?', '')
  const obj = {}
  if (!search) {
    return obj
  }
  if (search.indexOf('&') > -1) {
    search = search.split('&')
  } else {
    search = [search]
  }
  search.forEach(item => {
    const [key, value] = item.split('=')
    if (!obj[key]) {
      obj[key] = value
    } else {
      if (obj[key] instanceof Array) {
        obj[key].push(value)
      } else {
        obj[key] = [obj[key], value]
      }
    }
  })
  return obj
}
src/pages/login/index.vue
New file
@@ -0,0 +1,1030 @@
<template>
  <div class="login-container flex flex-ver">
    <div class="login-form">
      <!-- <div class="title-container flex flex-ver mb20">
        <img class="login_logo" src="../../assets/login/logo.png">
        <h3 class="title">芙艾预约管理系统</h3>
        <div class="title ml10">芙艾(P-HIS)医院管理系统</div>
        <h3 class="title ml10">昊芝综合医疗运营管理系统</h3>
      </div> -->
      <!-- 账号登录 -->
      <div v-if="loginType===0">
        <el-form ref="loginForm" :model="loginForm" :rules="loginRules" autocomplete="on" label-position="left">
          <el-form-item prop="username">
            <span class="svg-container">
              <svg-icon icon-class="user" />
            </span>
            <el-input
              ref="username"
              v-model="loginForm.username"
              placeholder="请输入账号"
              name="username"
              type="text"
              tabindex="1"
              autocomplete="on"
              @keyup.enter.native="handleLogin"
            />
          </el-form-item>
          <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
            <el-form-item prop="password">
              <span class="svg-container">
                <svg-icon icon-class="password" />
              </span>
              <el-input
                :key="passwordType"
                ref="password"
                v-model="loginForm.password"
                :type="passwordType"
                placeholder="请输入密码"
                name="password"
                tabindex="2"
                autocomplete="on"
                @keyup.native="checkCapslock"
                @blur="capsTooltip = false"
                @keyup.enter.native="handleLogin"
              />
              <span class="show-pwd" @click="showPwd">
                <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
              </span>
            </el-form-item>
          </el-tooltip>
          <div class="flex flex-start flex-sb">
            <el-form-item prop="safecode" class="flex-1">
              <span class="svg-container">
                <svg-icon icon-class="safecode" />
              </span>
              <el-input
                ref="safecode"
                v-model="loginForm.safecode"
                style="width: 70%"
                placeholder="请输入验证码"
                name="safecode"
                type="text"
                tabindex="3"
                autocomplete="off"
                @keyup.enter.native="handleLogin"
              />
              <el-image
                v-if="isTestView"
                class="safecode-img"
                :src="safecodeImg"
                fit="fill"
                @click="getSafeCodeImg"
              >
                <div slot="error" class="image-slot">
                  <i class="el-icon-picture-outline" />
                </div>
              </el-image>
            </el-form-item>
            <el-button v-if="!isTestView" class="ml10 mt5" :disabled="isShowCount" type="blackblue" @click="sendCode">
              {{ isShowCount ? secondCount + '秒后重发' : '发送验证码' }}
            </el-button>
          </div>
          <!-- <el-form-item prop="safecode">
            <span class="svg-container">
              <svg-icon icon-class="safecode" />
            </span>
            <el-input
              ref="safecode"
              v-model="loginForm.safecode"
              style="width: 60%"
              placeholder="请输入验证码"
              name="safecode"
              type="text"
              tabindex="3"
              autocomplete="off"
              @keyup.enter.native="handleLogin"
            />
            <el-image
              class="safecode-img"
              :src="safecodeImg"
              fit="fill"
              @click="getSafeCodeImg"
            >
              <div slot="error" class="image-slot">
                <i class="el-icon-picture-outline" />
              </div>
            </el-image>
          </el-form-item> -->
        </el-form>
        <div>
          <el-button :loading="loading" type="blackblue" style="width:100%;margin-bottom:20px;border-radius: 22px;" @click.native.prevent="handleLogin">登录</el-button>
        </div>
        <div>
          <el-button v-if="!isTestView" :loading="loading" plain style="width:100%;border-radius: 22px;" @click="loginType=1">切换扫码登录</el-button>
          <!-- <el-button v-else :loading="loading" plain style="width:100%;border-radius: 22px;" @click="simulateLogin">模拟扫码登录</el-button> -->
        </div>
        <!-- 企业微信直接带上state和code,无需再用按钮 -->
        <!-- <div>
          <el-button :loading="loading" plain style="width:100%;margin-top:20px;border-radius: 22px;" @click.native.prevent="handleWebLogin">网页登录</el-button>
        </div> -->
      </div>
      <!-- 扫码登录 -->
      <div v-if="loginType===1">
        <!-- 扫码 -->
        <div v-if="!show_role_list" id="wx_reg" class="flex flex-align-center" />
        <!-- 扫码回调后 -->
        <div v-if="show_role_list">
          <div class="role-list-title">请选择角色</div>
          <div class="role-list flex flex-wrap" :class="{'block-list': roleList.length<=4}">
            <!-- 20231117 long 加个双击进入 -->
            <div v-for="(item,index) in roleList" :key="index" class="item flex flex-ver" :class="{active:item.id == roleId}" @click="selectRole(item.id)" @dblclick="item.id == roleId?selectCodeLoginTest(roleId):noop()">
              <div class="flex-1">
                <div class="role-name ell">{{ item.roleName }}</div>
                <div class="shop-name ell">{{ item.shopName }}</div>
              </div>
              <i class="el-icon-check" />
            </div>
          </div>
          <div>
            <el-button v-if="isTestView" :loading="loading" :disabled="!roleId" type="blackblue" style="width: 100%;margin-bottom:20px;border-radius: 22px;" @click.native.prevent="selectCodeLoginTest(roleId)">{{ roleId ? '马上登录' : '选择角色后登录' }}</el-button>
            <el-button v-else :loading="loading" :disabled="!roleId" type="blackblue" style="width: 100%;margin-bottom:20px;border-radius: 22px;" @click.native.prevent="selectCodeLogin(roleId)">{{ roleId ? '马上登录' : '选择角色后登录' }}</el-button>
          </div>
          <div v-if="!isTestView">
            <el-button type="blackblue" style="width: 100%;margin-bottom:20px;border-radius: 22px;" @click.native.prevent="scanAgain">重新扫码<i class="el-icon-refresh-right el-icon--right" /></el-button>
          </div>
        </div>
        <!-- <el-button :loading="loading" plain style="width:100%;border-radius: 22px;" @click="loginType=0">切换账号登录<i class="el-icon-arrow-right el-icon--right" /></el-button> -->
        <!-- <el-button :loading="loading" plain style="width:100%;border-radius: 22px;" @click="loginType=0">切换登录方式<i class="el-icon-arrow-right el-icon--right" /></el-button> -->
      </div>
    </div>
  </div>
</template>
<script>
// 设置token和用户数据
import { setToken, setUserData } from '@/utils/auth' // get token from session
// 基础配置 - 获取当前环境
const baseConfig = require('../../config/index')
// 登录接口的 mockData
const g_mockData = require('./g_mockData.js')
// 获取参数方法
import { getQueryObj } from '@/pages/login/getQueryObj'
import Req from '../../utils/jun_httpInstall' // http 请求
export default {
  name: 'Login',
  components: {},
  data() {
    const validateUsername = (rule, value, callback) => {
      if (!value) {
        callback(new Error('请输入账号'))
      } else {
        callback()
      }
    }
    const validatePassword = (rule, value, callback) => {
      if (value ? value.length < 6 : !value) {
        callback(new Error('密码不能少于6位'))
      } else {
        callback()
      }
    }
    const validateSafecode = (rule, value, callback) => {
      if (!value) {
        callback(new Error('请输入验证码'))
      } else {
        callback()
      }
    }
    return {
      // 当前登陆环境
      localOnline: baseConfig.localOnline, // 本地连线上(和isTestView一起判断) 20230619 long
      loginForm: {
        username: '',
        password: '',
        safecode: '',
        checkedId: ''
      },
      loginRules: {
        username: [{ required: true, trigger: 'blur', validator: validateUsername }],
        password: [{ required: true, trigger: 'blur', validator: validatePassword }],
        safecode: [{ required: true, trigger: 'blur', validator: validateSafecode }]
      },
      passwordType: 'password',
      capsTooltip: false,
      loading: false,
      showDialog: false,
      redirect: undefined,
      otherQuery: {},
      // 测试服用图片验证码  线上用发送手机验证码
      safecodeImg: '',
      secondCount: 0, // 秒
      telCode: '', // 短信验证码
      messageId: '', // 发送成功
      isShowCount: false,
      timer: null,
      loginType: 0,
      // 20230216 long 用户重定向页面识别登录类型
      // 扫码登录STATE_SCAN、网页登录TATE_WEB
      state: '',
      STATE_SCAN: 'hx168',
      STATE_WEB: 'hx168_web',
      show_role_list: false, // 显示选择角色
      roleList: [],
      roleId: '',
      code: ''
    }
  },
  watch: {
    $route: {
      handler: function(route) {
        const query = route.query
        if (query) {
          this.redirect = query.redirect
          this.otherQuery = this.getOtherQuery(query)
        }
      },
      immediate: true
    },
    // 切换loginType
    loginType: {
      handler(loginType) {
        this.$nextTick(() => {
          if (loginType === 1) {
            if (baseConfig.ismock) {
              // this.$messageWarn('本地环境请使用密码登录')
              // this.loginType = 0
            } else {
              if (!this.show_role_list) {
                if (!this.isTestView) this.initCodeLogin()
              }
            }
          } else {
            this.initLoginData()
          }
        })
      },
      immediate: true
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      this.loginType = this.isTestView ? 0 : 1
      if (getQueryObj() && getQueryObj().loginType === '1') {
        this.loginType = 1
      }
      if (this.$route.query.logout) {
        // 清空企业微信登录code
        this.replaceNoCode()
        return
      }
      if (this.$route.query.logout_603) {
        // 清空企业微信登录code,清空redirect
        this.replaceNoCodeNoRedirect()
        return
      }
      const code = getQueryObj().code
      if (code) {
        this.state = getQueryObj().state
        this.code = code
        this.$nextTick(() => {
          this.codeLogin(code)
        })
      }
    },
    // 清空企业微信登录code
    replaceNoCode() {
      if (this.$route.query.isMiniprogram) { return }
      window.location.replace('//' + window.location.host + window.location.pathname + '#/login?redirect=' + this.$route.query.redirect)
    },
    // 清空企业微信登录code,清空redirect
    replaceNoCodeNoRedirect() {
      if (this.$route.query.isMiniprogram) { return }
      window.location.replace('//' + window.location.host + window.location.pathname + '#/login')
    },
    // 企业微信扫码登录 - 初始化
    initCodeLogin() {
      // 测试
      // this.selectCodeLogin(window.prompt('请输入角色id'))
      // return
      // 测试回调
      // this.wwLogin = new window.WwLogin({
      //   'id': 'wx_reg',
      //   'appid': 'wx23a7c266dcd048aa',
      //   'agentid': '1000050',
      //   'redirect_uri': 'http://test6.phiskin.com/assist/admin/employee/login/scanLogin',
      //   'state': 'hx168',
      //   'href': '',
      //   'lang': 'zh'
      // })
      if (this.code) {
        return
      }
      this.wwLogin = new window.WwLogin({
        'id': 'wx_reg',
        'appid': 'wx23a7c266dcd048aa',
        'agentid': '1000050',
        'redirect_uri': 'https://' + window.location.host + window.location.pathname,
        // 'redirect_uri': 'http://serv3.phiskin.com/appointment/adminweb_v2/index.html',
        // 'redirect_uri': 'http://test6.phiskin.com/adminwebV3/index.html', // 新版管理系统
        'state': this.STATE_SCAN,
        'href': '',
        'lang': 'zh'
      })
    },
    scanAgain() {
      this.code = ''
      this.show_role_list = false
      if (this.loginType === 1) {
        this.$nextTick(() => {
          this.initCodeLogin()
        })
      } else {
        this.loginType = 1
      }
    },
    // 网页登录
    handleWebLogin() {
      let redirect_uri = 'https://' + window.location.host + window.location.pathname
      redirect_uri = encodeURIComponent(redirect_uri)
      const appid = 'wx23a7c266dcd048aa'
      const response_type = 'code'
      const scope = 'snsapi_base'
      const state = this.STATE_WEB
      const agentid = '1000050'
      const loginUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=${response_type}&scope=${scope}&state=${state}&agentid=${agentid}#wechat_redirect`
      window.location.replace(loginUrl)
    },
    // 扫码登录回调
    codeLogin(code) {
      const { state, STATE_SCAN, STATE_WEB } = this
      let url = ''
      if (state === STATE_SCAN) url = 'admin/employee/login/scanLogin'
      if (state === STATE_WEB) url = 'admin/employee/login/webAuthLogin'
      if (this.localOnline && this.isTestView) url = 'admin/employee/login/scanLogin' // 本地连线上 20230619 long
      // state值不对,重新登录
      if (!url) {
        this.$alert('登录异常,请重新登录', '提示', {
          confirmButtonText: '重新登录',
          showClose: false,
          callback: action => {
            this.replaceNoCodeNoRedirect()
          }
        })
        return
      }
      Req.http.post({
        url: url,
        udData: { noToken: true },
        data: {
          code, state
        },
        mockData: { 'code': '100', 'msg': 'SUCCESS', 'data': { 'roleList': [{ 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '顾问', 'shopName': '新天地店', 'employeeId': '', 'roleUniqueStr': 'adviser_leader', 'id': '82c1a5fe0a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': 'MIC', 'shopName': '新天地店', 'employeeId': '', 'roleUniqueStr': 'mic', 'id': '82c1ca2f0a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '医生', 'shopName': '新天地店', 'employeeId': '', 'roleUniqueStr': 'doctor', 'id': '82c1eb980a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '护士', 'shopName': '新天地店', 'employeeId': '', 'roleUniqueStr': 'nurse', 'id': '82c20cde0a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '前台', 'shopName': '新天地店', 'employeeId': '', 'roleUniqueStr': 'reception', 'id': '82c22d150a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '店长', 'shopName': '新天地店', 'employeeId': '', 'roleUniqueStr': 'shopowner', 'id': '82c24da90a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '护士助理', 'shopName': '新天地店', 'employeeId': '', 'roleUniqueStr': 'nurse_assistant', 'id': '82c26d510a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }, { 'roleTypeId': '', 'createTime': { 'date': 22, 'hours': 17, 'seconds': 46, 'month': 8, 'timezoneOffset': -480, 'year': 121, 'minutes': 17, 'time': 1632302266607, 'day': 3 }, 'roleId': '82c1a5fe0a5011ec96245254007749be', 'roleName': '医生助理', 'shopName': '新天地店', 'employeeId': '', 'roleUniqueStr': 'doctor_assistant', 'id': '82c28d7d0a5011ec96245254007749be', 'shopId': '605e391b620d11ebb06bb8599f4cafbe', 'oldId': '', 'isDel': 0 }], 'employeeId': '476051fc000711ecbbe230d0422e31b5' }}
      }).then((inf) => {
        // this.afterLogin(inf)
        // 更改显示登录选项
        this.roleList = inf.roleList
        this.show_role_list = true
        // 切换登录模式
        this.loginType = 1
      }).catch((res) => {
        this.loading = false
        this.code = '' // 清空关键判断
        this.$messageError(res.msg)
        // 去掉code参数,刷新页面
        setTimeout(() => {
          this.replaceNoCodeNoRedirect()
        }, 1500)
      })
    },
    // 选择角色
    selectRole(id) {
      this.roleId = id
    },
    // 选择角色后登录
    selectCodeLogin(roleId) {
      if (!roleId) {
        this.$messageWarn('缺少选择角色id')
        return
      }
      Req.http.post({
        // 2022-06-23 登录新接口
        url: 'admin/employee/login/selectLoginRoleNew',
        // url: 'admin/employee/login/selectLoginRole',
        udData: { noToken: true },
        data: {
          roleId
        },
        mockData: g_mockData.login
      }).then((inf) => {
        this.afterLogin(inf)
      }).catch((res) => {
        this.loading = false
        this.$messageError(res.msg)
      })
    },
    // 发送验证码
    sendCode() {
      if (!this.loginForm.username) return this.$message.error('请输入账号')
      Req.http.post({
        url: 'admin/employee/login/sendVerifyCode',
        data: { account: this.loginForm.username },
        mockData: {
          code: 100,
          msg: '',
          data: {}
        }
      }).then((inf) => {
        this.getCode()
        this.$message.success('验证码发送成功')
      })
    },
    // 倒计时
    getCode() {
      const times = 60 // 倒计时时间
      if (!this.timer) {
        this.secondCount = times
        this.isShowCount = true
        this.timer = setInterval(() => {
          if (this.secondCount > 0 && this.secondCount <= times) {
            this.secondCount--
          } else {
            this.isShowCount = false
            clearInterval(this.timer)
            this.timer = null
          }
        }, 1000)
      }
    },
    // 密码登录 - 初始化
    initLoginData() {
      var loginData = localStorage.getItem('loginData')
      // console.log(loginData)
      // 获取保存的账号密码
      if (loginData) this.loginForm = JSON.parse(loginData)
      if (this.loginForm.username === '') {
        this.$refs.username && this.$refs.username.focus()
      } else if (this.loginForm.password === '') {
        this.$refs.password && this.$refs.password.focus()
      } else if (this.loginForm.safecode === '') {
        this.$refs.safecode && this.$refs.safecode.focus()
      }
      if (this.isTestView) this.getSafeCodeImg()
    },
    // 是否大写
    checkCapslock(e) {
      const { key } = e
      this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z')
    },
    // 切换密码显示
    showPwd() {
      if (this.passwordType === 'password') {
        this.passwordType = ''
      } else {
        this.passwordType = 'password'
      }
      this.$nextTick(() => {
        this.$refs.password.focus()
      })
    },
    // 获取验证码图
    getSafeCodeImg() {
      var checkedId = this.getCheckedId()
      Req.http.post({
        url: 'admin/create/cheked',
        data: { checkedId: checkedId },
        udData: { noToken: true },
        mockData: {
          code: 100,
          msg: '',
          data: {
            imgStr: 'xxxx'
          }
        }
      }).then((inf) => {
        this.safecodeImg = this.perfectSafeCode(inf.data.imgStr)
        this.loginForm.checkedId = checkedId
      })
    },
    // 补全验证码
    perfectSafeCode(img) {
      if (!img) return
      return `data:image/jpeg;base64,${img}`
    },
    // 登录后回调
    afterLogin(inf) {
      // 保存登录凭证
      setToken(inf.adminToken)
      // 保存账号密码
      var loginData = JSON.stringify({
        username: this.loginForm.username.trim()
      })
      // password: this.loginForm.password.trim() // 20210322 long 取消记住密码
      localStorage.setItem('loginData', loginData)
      sessionStorage.setItem('newAppTime', new Date()) //  存入时间 用于获取新的预约数
      // 保存用户数据
      setUserData(inf)
      this.loading = false
      // 登录成功跳转页面
      this.$messageSuc('登录成功')
      setTimeout(() => {
        // this.$router.push({ path: '/dashboard' })
        this.$router.push({ path: this.redirect || '/dashboard', query: this.otherQuery })
      }, 1000)
    },
    // 密码登录
    handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          const { username, password, safecode, checkedId } = this.loginForm
          const params = {
            account: username.trim(),
            password: password.trim(),
            checkedCode: safecode.trim()
          }
          this.loading = true
          // const url = this.isTestView ? 'admin/employee/login/accountLogin' : 'admin/loginNew'
          const url = this.isTestView ? 'admin/employee/login/accountLogin' : 'admin/employee/login/accountLogin/v2'
          if (this.isTestView) {
            params.checkedId = checkedId
          }
          Req.http.post({
            // url: 'admin/loginNew',
            url,
            data: params,
            udData: { noToken: true },
            // mockData: g_mockData.login
            mockData: g_mockData.scanLoginTest
          }).then((inf) => {
            this.loading = false
            this.loginType = 1
            this.jumpToRoomList()
            // this.show_role_list = true
            // this.roleList = inf.roleList || []
            /* if (this.isTestView) {
              this.loading = false
              this.loginType = 1
              this.show_role_list = true
              this.roleList = inf.roleList || []
            } else {
              this.afterLogin(inf)
            } */
          }).catch((res) => {
            this.loading = false
            this.$messageError(res.msg)
          })
        } else {
          console.log('表单验证失败')
          return false
        }
      })
    },
    // 跳转房间列表
    jumpToRoomList() {
      this.$router.push({
        path: `./room/list`
      })
    },
    // 获取route query对象
    getOtherQuery(query) {
      return Object.keys(query).reduce((acc, cur) => {
        if (cur !== 'redirect') {
          acc[cur] = query[cur]
        }
        return acc
      }, {})
    },
    // 测试服登录 👇
    // 测试扫码登录
    simulateLogin() {
      this.loginType = 1
      // 获取用户缓存权限信息
      // const userData = JSON.parse(getUserData())
      Req.http.post({
        url: 'admin/employee/login/scanLoginTest',
        data: {
          employeeId: '476051fc000711ecbbe230d0422e31b5' // 黄嘉荣员工id 476051fc000711ecbbe230d0422e31b5
          // employeeId: '3eb10b540b2b11ecb06bb8599f4cafbe' // 黄嘉荣员工id 3eb10b540b2b11ecb06bb8599f4cafbe - 和爷
        },
        mockData: g_mockData.scanLoginTest
      }).then((res) => {
        this.show_role_list = true
        this.roleList = res.roleList || []
      })
    },
    selectCodeLoginTest(id) {
      let url = 'admin/employee/login/selectLoginRoleNewTest'
      if (this.localOnline && this.isTestView) url = 'admin/employee/login/selectLoginRoleNew' // 本地连线上 20230619 long
      Req.http.post({
        url,
        data: {
          roleId: id
        },
        mockData: {
          code: 100,
          msg: '',
          data: {
            'adminToken': 'eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMzhlZjMzZjEyMzUxMWVkOTFkMTUyNTQwMGI4NTEwYSIsInN1YiI6ImxvZ2luX2FkbWluX2VtcGxveWVlIiwiaXNzIjoidXNlciIsImlhdCI6MTY3MzA4MTcwOSwiZXhwIjoxNjczMTI0MDA5fQ.s3QiYhK6EemOw9ksbxvM0jygnQxkHZwTWJ3JdAAFxkc',
            'name': '黄嘉荣',
            'tel': '15999971794',
            'imgUrl': 'https://phiskin-pre-1305571091.cos.ap-shanghai.myqcloud.com/member/3a82bead-4960-44c1-915f-467df3a80cf3.jpg',
            arr: [],
            arrNew: [],
            'employeeId': '476051fc000711ecbbe230d0422e31b5',
            'shopId': 'bb4e8a7d620d11ebb06bb8599f4cafbe',
            'roleName': 'admin',
            'dataAuth': {
              'warehouseList': [],
              'noAttributionData': 0,
              'roleId': '138ef33f123511ed91d1525400b8510a',
              'dataList': [
                {
                  'name': '静安店',
                  'id': 'bb4e8a7d620d11ebb06bb8599f4cafbe'
                },
                {
                  'name': '合肥店',
                  'id': '66c581244ebb11edbebb525400b8510a'
                },
                {
                  'name': '芙艾美容',
                  'id': '2baa4ed774f111ecb4d45254007749be'
                },
                {
                  'name': '倾选店',
                  'id': '2bab614774f111ecb4d45254007749be'
                },
                {
                  'name': '九方店',
                  'id': '2bac145474f111ecb4d45254007749be'
                },
                {
                  'name': '新天地店',
                  'id': '605e391b620d11ebb06bb8599f4cafbe'
                },
                {
                  'name': '静安国际及VIP门诊',
                  'id': '973f9b28620e11ebb06bb8599f4cafbe'
                },
                {
                  'name': '艾选店',
                  'id': '66cb53b84ebb11edbebb525400b8510a'
                },
                {
                  'name': '北京光华店',
                  'id': '66ca982f4ebb11edbebb525400b8510a'
                },
                {
                  'name': '东银店',
                  'id': 'b88e3cd8620d11ebb06bb8599f4cafbe'
                },
                {
                  'name': '杭州店',
                  'id': 'b96aa6d1620d11ebb06bb8599f4cafbe'
                },
                {
                  'name': '宁波海曙店',
                  'id': 'b9fbfd79620d11ebb06bb8599f4cafbe'
                },
                {
                  'name': '芙艾总部',
                  'id': 'd685ff306ca54b1ea06b707fb0f57659'
                },
                {
                  'name': '营销助手功能测试门店',
                  'id': 'd4b9ace5a01911ecb4d45254007749be'
                },
                {
                  'name': '古北店',
                  'id': 'fc9f34d2994711ecb4d45254007749be'
                }
              ]
            },
            'shopList': [
              {
                'carWay': '',
                'clinicName': '',
                'code': '',
                'maxAppNum': 0,
                'city': '',
                'departmentId': '',
                'colorStr': '',
                'doctorRelaxTime': '',
                'editTime': {
                  'date': 7,
                  'hours': 16,
                  'seconds': 10,
                  'month': 0,
                  'timezoneOffset': -480,
                  'year': 123,
                  'minutes': 55,
                  'time': 1673081710058,
                  'day': 6
                },
                'corpMpDepId': 0,
                'isUp': 0,
                'province': '',
                'subWay': '',
                'id': 'bb4e8a7d620d11ebb06bb8599f4cafbe',
                'addr': '',
                'institutionalCode': '',
                'apiId': '',
                'area': '',
                'sameTimeCustomerNum': 0,
                'shengMeiNum': 0,
                'workTime': '',
                'createTime': {
                  'date': 7,
                  'hours': 16,
                  'seconds': 10,
                  'month': 0,
                  'timezoneOffset': -480,
                  'year': 123,
                  'minutes': 55,
                  'time': 1673081710058,
                  'day': 6
                },
                'maxSwitchNum': 0,
                'name': '静安店',
                'clinicCode': '',
                'isDel': 0
              }
            ],
            'warehouseList': []
          }
        }
      }).then((inf) => {
        this.afterLogin(inf)
      }).catch((res) => {
        this.loading = false
        this.$messageError(res.msg)
      })
    },
    noop() {}
  }
}
</script>
<style lang="scss">
/* 修复input 背景不协调 和光标变色 */
/* Detail see https://github.com/PanJiaChen/vue-element-admin/pull/927 */
$bg:#283443;
$light_gray:#fff;
$gray_gray:#1B1E2F;
$cursor: #fff;
@supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
  .login-container .el-input input {
    color: $cursor;
  }
}
/* reset element-ui css */
.login-container {
  .el-input {
    display: inline-block;
    height: 47px;
    width: 70%;
    input {
      background: transparent;
      border: 0px;
      -webkit-appearance: none;
      border-radius: 0px;
      padding: 12px 5px 12px 15px;
      color: $gray_gray;
      height: 47px;
      caret-color: $gray_gray;
      &:-webkit-autofill {
        box-shadow: 0 0 0px 1000px #f0f1f6 inset !important;
        -webkit-text-fill-color: $gray_gray !important;
      }
    }
  }
  .el-form-item {
    border: 1px solid #2B3855;
    // background: rgba(0, 0, 0, 0.1);
    background: transparent;
    border-radius: 22px;
    color: #2B3855;
  }
}
</style>
<style lang="scss" scoped>
$bg:#2d3a4b;
$dark_gray:#889aa4;
$light_gray:#eee;
$gray_gray:#2B3855;
.login-container {
  min-height: 100vh;
  width: 100vw;
  position: relative;
  overflow: hidden;
  background: url('../../assets/login/login_left.png') 0 0 repeat-y, url('../../assets/login/login_mid.png') 15.2% 50% no-repeat,url('../../assets/login/login_right.png') 18% 0 no-repeat;
  background-size: 15% auto, 15px auto, cover;
  background-attachment: fixed;
  .login-logo {
    width: 40px;
    height: 40px;
  }
  .login-form {
    position: relative;
    width: 85%;
    max-width: 520px;
    padding: 30px 35px 130px;
    // padding: 160px 35px;
    // padding: 0 25px;
    margin: 0 auto;
    // margin-top: 18vh;
    // margin-left: 18%;
    overflow: hidden;
  }
  .tips {
    font-size: 14px;
    color: #fff;
    margin-bottom: 10px;
    span {
      &:first-of-type {
        margin-right: 16px;
      }
    }
  }
  .svg-container {
    padding: 6px 5px 6px 15px;
    color: $dark_gray;
    vertical-align: middle;
    width: 30px;
    display: inline-block;
  }
  .title-container {
    position: relative;
    margin-top: 100px;
    .title {
      font-size: 26px;
      color: $gray_gray;
      // margin: 0px auto 40px auto;
      text-align: left;
      font-weight: bold;
    }
  }
  .show-pwd {
    position: absolute;
    right: 10px;
    top: 7px;
    font-size: 16px;
    color: $dark_gray;
    cursor: pointer;
    user-select: none;
  }
  .safecode-img{
    width: 80px;
    height: 70%;
    position: absolute;
    right: 10px;
    top: 50%;
    transform: translateY(-50%);
    font-size: 30px;
    text-align: right;
    color: $light_gray;
    cursor: pointer;
  }
  .thirdparty-button {
    position: absolute;
    right: 0;
    bottom: 6px;
  }
  @media only screen and (max-width: 470px) {
    .thirdparty-button {
      display: none;
    }
  }
  // 企业微信扫码登录
  #wx_reg{
    padding: 30px 0 0;
    border: 1px solid rgba(255, 255, 255, 0.1);
    background: rgba(0, 0, 0, 0.1);
    border-radius: 12px;
    margin-bottom: 30px;
    iframe{
      width: 300px;
      height: 300px;
    }
  }
  .role-list-title{
    color: $gray_gray;
    margin-bottom: 20px;
    text-align: center;
    font-size: 18px;
    font-weight: bold;
    letter-spacing: 1px;
  }
  .role-list{
    // margin-bottom: 20px;
    .item{
      box-sizing: border-box;
      width: 47.5%;
      margin-right: 5%;
      padding: 10px 20px;
      border: 1px solid $gray_gray;
      background: transparent;
      border-radius: 12px;
      color: $gray_gray;
      margin-bottom: 5%;
      cursor: pointer;
      transition: background .1s ease;
      position: relative;
      &:nth-child(2n){
        margin-right: 0;
      }
      &:hover, &.active{
        background: rgba(43, 56, 85, 0.8);
        color: #fff;
      }
      .el-icon-check{
        font-size: 24px;
        font-weight: bold;
        color: #99FFCC;
        transition: opacity .1s ease;
        opacity: 0;
        position: absolute;
        right: 10px;
        bottom: 5px;
      }
      &.active .el-icon-check{
        opacity: 1;
      }
    }
    &.block-list .item{
      margin-right: 0;
      width: 100%;
    }
    .role-name{
      font-size: 16px;
      margin-bottom: 10px;
    }
    .shop-name{
      font-size: 14px;
      // color: #aaa;
    }
  }
}
</style>
src/pages/room/detail.vue
@@ -1,13 +1,13 @@
<!--room-detail.vue-->
<template>
  <div class="page">
    <div class="page_header flex flex-ver">
    <div class="page_header flex flex-ver" @click="back">
      <div class="left flex flex-ver">
        <img class="page_logo_1" src="../../assets/img/logo_1.png">
        <img class="page_logo_2" src="../../assets/img/logo_2.png">
      </div>
      <div class="right flex-1 flex flex-jcfe flex-ver">
        <div class="reset_btn flex flex-center">重置房间状态</div>
        <div class="reset_btn flex flex-center" @click="resetStatus">重置房间状态</div>
        <div class="page_date">
          <div class="page_week">{{ timeObj.week }}</div>
          <div class="page_day">{{ timeObj.date }}</div>
@@ -68,7 +68,7 @@
          <div class="guest_title flex flex-center">等待诊疗</div>
          <div class="guest_block flex-1">
            <div class="guest_list">
              <div v-for="(item, index) in list" :key="index" class="guest_list__row flex flex-ver">
              <div v-for="(item, index) in list" :key="index" class="guest_list__row flex flex-ver" @click="selectCustomer">
                <div class="guest_list__td flex flex-center">
                  <div>
                    <div class="tx">张*民</div>
@@ -140,7 +140,7 @@
          <div class="guest_title flex flex-center">等待诊疗</div>
          <div class="guest_block flex-1">
            <div class="guest_list">
              <div v-for="(item, index) in list" :key="index" class="guest_list__row flex flex-ver">
              <div v-for="(item, index) in list" :key="index" class="guest_list__row flex flex-ver" @click="selectCustomer">
                <div class="guest_list__td flex flex-center">
                  <div>
                    <div class="tx">张*民</div>
@@ -162,17 +162,24 @@
        </div>
      </div>
    </div>
    <XioCustomerSelect ref="XioCustomerSelect"></XioCustomerSelect>
    <!-- 选择客人弹窗 -->
    <XioCustomerSelect ref="XioCustomerSelect" @cancel="selectCustomerCancel" @submit="selectCustomerSubmit" />
    <!-- 更改房间状态窗 -->
    <XioRoomStatusChg ref="XioRoomStatusChg" @changeStatus="changeStatus" />
  </div>
</template>
<script>
// import Login from '../utils/jun_login.js'
// 选择客人弹窗
import XioCustomerSelect from '@/components/xio_customer_select'
// 更改房间状态窗
import XioRoomStatusChg from '@/components/xio_room_status_chg'
export default {
  name: 'RoomDetail',
  components: {
    XioCustomerSelect
    XioCustomerSelect,
    XioRoomStatusChg
  },
  inject: ['noop'],
  data() {
@@ -194,6 +201,39 @@
  methods: {
    init() {
      this.countGetTime(this, 'timeObj', 'detail')
    },
    // 返回
    back() {
      this.stopCountGetTime('detail')
      this.stopPollingAjaxFn('detail')
      this.$router.go(-1)
    },
    // 重置状态
    resetStatus() {
      // 打开弹窗
      this.$refs['XioRoomStatusChg'].showDialog()
    },
    // 更改房间状态
    changeStatus(opt) {
      console.log(opt.statusTx)
      // 关闭弹窗
      this.$refs['XioRoomStatusChg'].hideDialog()
    },
    // 选择客户
    selectCustomer(item = {}) {
      // 打开弹窗
      this.$refs['XioCustomerSelect'].showDialog()
      this.$refs['XioCustomerSelect'].dataInit(item)
    },
    // 选择客户取消
    selectCustomerCancel(opt) {
      console.log('cancel', opt)
      this.$refs['XioCustomerSelect'].hideDialog()
    },
    // 选择客户确定
    selectCustomerSubmit(opt) {
      console.log('submit', opt)
      this.$refs['XioCustomerSelect'].hideDialog()
    }
  }
}
src/pages/room/list.vue
@@ -2,7 +2,7 @@
<template>
  <div class="page">
    <div class="page_header flex flex-ver">
      <div class="left flex flex-ver">
      <div class="left flex flex-ver" @click="back">
        <img class="page_logo_1" src="../../assets/img/logo_1.png">
        <img class="page_logo_2" src="../../assets/img/logo_2.png">
      </div>
@@ -21,7 +21,7 @@
        <div class="list_block flex-1">
          <div class="list flex flex-ver flex-wrap">
            <!-- act -->
            <div v-for="(item, index) in list" :key="index" class="list__item flex flex-center">VIP诊疗室-1</div>
            <div v-for="(item, index) in list" :key="index" class="list__item flex flex-center" @click="selectRoom()">VIP诊疗室-1</div>
          </div>
        </div>
      </div>
@@ -55,6 +55,17 @@
  methods: {
    init() {
      this.countGetTime(this, 'timeObj', 'list')
    },
    // 返回
    back() {
      this.stopCountGetTime('list')
      this.stopPollingAjaxFn('list')
      this.$router.go(-1)
    },
    selectRoom(item = {}) {
      this.$router.push({
        path: `./detail?id=${item.id || ''}`
      })
    }
  }
}
src/router/index.js
@@ -15,7 +15,13 @@
      path: '/',
      name: 'root',
      // component: () => import('@/pages/index')
      component: () => import('@/pages/room/detail')
      component: () => import('@/pages/login/index')
      // component: () => import('@/pages/room/list')
    },
    {
      path: '/login',
      name: 'login',
      component: () => import('@/pages/login/index')
    },
    {
      path: '/index',
src/utils/auth.js
New file
@@ -0,0 +1,98 @@
// token
const TokenKey = 'adminToken'
export function getToken() {
  return sessionStorage.getItem(TokenKey)
}
export function setToken(token) {
  return sessionStorage.setItem(TokenKey, token)
}
export function removeToken() {
  return sessionStorage.removeItem(TokenKey)
}
// userData 存储当前登录账号信息
const userDataKey = 'userData'
export function getUserData() {
  return sessionStorage.getItem(userDataKey)
}
export function setUserData(data) {
  return sessionStorage.setItem(userDataKey, JSON.stringify(data))
}
export function removeUserData() {
  return sessionStorage.removeItem(userDataKey)
}
// userNameList 点击存储选中客户列表
const clientListKey = 'userNameList'
export function getClientList() {
  return sessionStorage.getItem(clientListKey)
}
export function setClientList(data) {
  return sessionStorage.setItem(clientListKey, JSON.stringify(data))
}
export function removeClientList() {
  return sessionStorage.removeItem(clientListKey)
}
// clientInfo 点击存储选中客户列表
const clientInfoKey = 'clientInfo'
export function getClientInfo() {
  return sessionStorage.getItem(clientInfoKey)
}
export function setClientInfo(data) {
  return sessionStorage.setItem(clientInfoKey, JSON.stringify(data))
}
export function removeClientInfo() {
  return sessionStorage.removeItem(clientInfoKey)
}
// userDatilsId 点击存储选中客户ID
const clientIdKey = 'userDatilsId'
export function getClientId() {
  return sessionStorage.getItem(clientIdKey)
}
export function setClientId(data) {
  return sessionStorage.setItem(clientIdKey, data)
}
export function removeClientId() {
  return sessionStorage.removeItem(clientIdKey)
}
// 获取登录用户水印图svg
export function getWaterMark(str) {
  const userData = JSON.parse(sessionStorage.getItem('userData'))
  var waterMarkText, telBack
  if (userData.tel)telBack = (userData.tel).substr(-4)
  if (userData.name)waterMarkText = userData.name
  if (telBack)waterMarkText = `${waterMarkText}(${telBack})`
  str && (waterMarkText = str)
  // console.log('11111111111111111111111111111',waterMarkText);
  const can = document.createElement('canvas')// 创建一个画布
  can.width = 140 // 设置宽度
  can.height = 140 // 高度
  const cans = can.getContext('2d')
  cans.rotate(-45 * Math.PI / 180) // 水印旋转角度    0 水平
  // cans.font = '80px' // 字体大小
  cans.font = '13px Georgia'
  cans.fillStyle = '#e9e9e9' // 水印的颜色
  cans.textAlign = 'left' // 设置文本内容的当前对齐方式
  cans.textBaseline = 'Middle' // 设置在绘制文本时使用的当前文本基线
  cans.globalAlpha = 1 // 透明度
  cans.fillText(waterMarkText, 0, can.height - 36) // 在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)
  // cans.fillText(str1, can.width / 3, can.height / 2.5) // 根据需求可添加多行水印,在方法中添加str1
  // console.log('1111111111111111111111', can)
  return can.toDataURL('image/png')
}
src/utils/element-ui-preprocessing.js
New file
@@ -0,0 +1,12 @@
// utils/element-ui-preprocessing.js
import ElementUI from 'element-ui'
// Fixes an issue with filters not working on mobile
ElementUI.Select.computed.readonly = function() {
  if (!this.filterable) return true
  // trade-off for IE input readonly problem: https://github.com/ElemeFE/element/issues/10403
  const isIE = !this.$isServer && !Number.isNaN(Number(document.documentMode))
  return !(this.filterable || this.multiple || !isIE) && !this.visible
}
export default ElementUI
src/utils/fn.js
@@ -330,6 +330,47 @@
  fn_obj[`timer_${pageKey}`] = null
}
/**
 * 轮询异步调用接口
 * @param {Object} page 页面对象this
 * @param {String} fnName 要轮询的方法名称
 * @param {String} pageKey 页面关键字
 * @param {Number} timeStamp 多少秒轮询
 */
function pollingAjaxFn(page, fnName, pageKey, timeStamp = 1000) {
  if (!page || !fnName || !pageKey) {
    return
  }
  page[fnName] && page[fnName]()
  fn_obj[`pollingTimer_${pageKey}`] = setTimeout(() => {
    pollingAjaxFn(page, fnName, pageKey, timeStamp)
  }, timeStamp)
}
/**
 * 停止轮询
 * @param {String} pageKey 页面关键词
 */
function stopPollingAjaxFn(pageKey) {
  clearTimeout(fn_obj[`pollingTimer_${pageKey}`])
  fn_obj[`pollingTimer_${pageKey}`] = null
}
// 随机12位数
function getCheckedId() {
  var s = []
  var hexDigits = '0123456789abcdef'
  for (var i = 0; i < 12; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
  }
  // s[14] = '4';
  // s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
  // s[8] = s[13] = s[18] = s[23] = '-'
  var uuid = s.join('')
  return uuid
}
var fn = {
  getLocalStorage,
  getSessionStorage,
@@ -358,6 +399,9 @@
  countGetTime,
  stopCountGetTime,
  pollingAjaxFn,
  stopPollingAjaxFn,
  getCheckedId,
  /**
     * 深拷贝
src/utils/validate.js
New file
@@ -0,0 +1,20 @@
/**
 * Created by PanJiaChen on 16/11/18.
 */
/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}
/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.indexOf(str.trim()) >= 0
}
vue.config.js
New file
@@ -0,0 +1,26 @@
'use strict'
const path = require('path')
function resolve(dir) {
  return path.join(__dirname, dir)
}
module.exports = {
  // 配置使用stylus全局变量
  chainWebpack: config => {
    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()
  }
}