├── README.md ├── TODO.md ├── client ├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public │ ├── favicon.ico │ ├── img │ │ ├── discord.png │ │ ├── discord2.jpg │ │ ├── logo.png │ │ ├── twitch.jpg │ │ ├── twitch2.jpg │ │ ├── twitch3.jpg │ │ └── youtube.jpg │ └── index.html └── src │ ├── App.vue │ ├── assets │ └── logo.svg │ ├── components │ └── Message.vue │ ├── main.js │ ├── plugins │ └── vuetify.js │ ├── router.js │ ├── store.js │ └── views │ ├── Chat.vue │ ├── Home.vue │ └── LiveChat.vue ├── package-lock.json └── server ├── .env.sample ├── .eslintrc.js ├── .gitignore ├── .vscode └── launch.json ├── greetings.md ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── public └── callback.html └── src ├── followMessages.js ├── index.js ├── routes └── index.js └── socket.js /README.md: -------------------------------------------------------------------------------- 1 | # Live Chat Manager 2 | 3 | # THE SERVER CODE IS FULL OF COMMENTED OUT CODE SINCE I DO NOT STREAM ON YOUTUBE ANYMORE 4 | # THIS REPO WILL SOON BE DEPRECATED FOR A TWITCH ONLY SERVER 5 | 6 | A dashboard that allows me to manage incoming chat messages from YouTube and Twitch. 7 | 8 | ## Setup 9 | 10 | ### Server 11 | 12 | ```sh 13 | cd server 14 | npm install 15 | cp .env.sample .env #update .env 16 | npm run dev 17 | ``` 18 | 19 | #### Server Environment Variables 20 | 21 | | Variable | Example | Description | 22 | | - |:-:| -:| 23 | | GOOGLE_API_KEY | abc123 | Google API Key to retrieve streams and chat messages from YouTube API | 24 | | TWITCH_CLIENT_ID | abc123 | Twitch Client ID to retrieve twitch user images from Twitch API | 25 | | YOUTUBE_CHANNEL_ID | UCLNgu_OupwoeESgtab33CCw | YouTube channel ID to list streams for | 26 | | TWITCH_CHANNEL | #codinggarden | Twitch channel to listen for messages on | 27 | | TWITCH_TOKEN | abc123 | Twitch oauth token with permission to listen to channel points pub sub events 28 | 29 | ### Client 30 | 31 | ```sh 32 | cd client 33 | npm install 34 | npm run serve 35 | ``` 36 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | ## Cleanup 2 | 3 | * [x] Upgrade dependencies 4 | * [x] Get the current event chat id 5 | * [x] List out live events for channel 6 | 7 | ## Features 8 | 9 | * [ ] Purify and markdown render messages on the server! 10 | * [x] How many chat messages acknowledge vs need to acknowledge 11 | * [ ] Send a message... 12 | * [x] Search chat messages 13 | * [x] Label messages 14 | * Question 15 | * Hello / Hi 16 | * welcome,questions,suggestions,other conversations 17 | * [ ] Allow upvotes on chat messages 18 | * [ ] Bot auto answers questions 19 | * [ ] Discord chat integration 20 | - chats intermingled with youtube chat 21 | * [ ] Label messages from mods 22 | * [ ] group messages by user 23 | * [x] Show timestamp on messages 24 | * [ ] offline watch w/ live chat 25 | * [ ] button for marking all messages as acknowledge 26 | * [x] Allow markdown in chat message 27 | -------------------------------------------------------------------------------- /client/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | 4 | not ie <= 10 -------------------------------------------------------------------------------- /client/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,jsx,ts,tsx,vue}] 2 | indent_style = space 3 | indent_size = 2 4 | end_of_line = lf 5 | trim_trailing_whitespace = true 6 | insert_final_newline = true 7 | max_line_length = 100 8 | -------------------------------------------------------------------------------- /client/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | }, 6 | extends: [ 7 | 'plugin:vue/essential', 8 | '@vue/airbnb', 9 | ], 10 | rules: { 11 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 13 | 'no-param-reassign': 0, 14 | 'consistent-return': 0, 15 | 'array-callback-return': 0, 16 | 'no-self-assign': 0, 17 | }, 18 | parserOptions: { 19 | parser: 'babel-eslint', 20 | }, 21 | }; 22 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # client-v2 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Run your tests 19 | ``` 20 | npm run test 21 | ``` 22 | 23 | ### Lints and fixes files 24 | ``` 25 | npm run lint 26 | ``` 27 | 28 | ### Customize configuration 29 | See [Configuration Reference](https://cli.vuejs.org/config/). 30 | -------------------------------------------------------------------------------- /client/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | [ 4 | '@vue/app', 5 | { 6 | useBuiltIns: 'entry', 7 | }, 8 | ], 9 | ], 10 | }; 11 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client-v2", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "@babel/polyfill": "^7.8.7", 12 | "core-js": "^3.6.5", 13 | "dompurify": "^2.0.11", 14 | "marked": "^1.1.0", 15 | "socket.io-client": "^2.3.0", 16 | "timeago.js": "^4.0.2", 17 | "vue": "^2.6.11", 18 | "vue-router": "^3.2.0", 19 | "vuetify": "^2.2.29", 20 | "vuex": "^3.4.0" 21 | }, 22 | "devDependencies": { 23 | "@vue/cli-plugin-babel": "^4.3.1", 24 | "@vue/cli-plugin-eslint": "^4.3.1", 25 | "@vue/cli-service": "^4.3.1", 26 | "@vue/eslint-config-airbnb": "^5.0.2", 27 | "babel-eslint": "^10.1.0", 28 | "babel-loader": "^8.1.0", 29 | "eslint": "^7.1.0", 30 | "eslint-plugin-vue": "^6.2.2", 31 | "lint-staged": "^10.2.6", 32 | "sass": "^1.26.5", 33 | "sass-loader": "^8.0.2", 34 | "vue-cli-plugin-vuetify": "^2.0.5", 35 | "vue-template-compiler": "^2.6.11" 36 | }, 37 | "gitHooks": { 38 | "pre-commit": "lint-staged" 39 | }, 40 | "lint-staged": { 41 | "*.{js,vue}": [ 42 | "vue-cli-service lint", 43 | "git add" 44 | ] 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /client/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/img/discord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/discord.png -------------------------------------------------------------------------------- /client/public/img/discord2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/discord2.jpg -------------------------------------------------------------------------------- /client/public/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/logo.png -------------------------------------------------------------------------------- /client/public/img/twitch.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/twitch.jpg -------------------------------------------------------------------------------- /client/public/img/twitch2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/twitch2.jpg -------------------------------------------------------------------------------- /client/public/img/twitch3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/twitch3.jpg -------------------------------------------------------------------------------- /client/public/img/youtube.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/youtube.jpg -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | client-v2 9 | 10 | 11 | 12 | 13 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /client/src/App.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 26 | 27 | 36 | -------------------------------------------------------------------------------- /client/src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | Artboard 46 2 | -------------------------------------------------------------------------------- /client/src/components/Message.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 93 | 94 | 157 | -------------------------------------------------------------------------------- /client/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import App from './App.vue'; 3 | import router from './router'; 4 | import store from './store'; 5 | import vuetify from './plugins/vuetify'; 6 | import '@babel/polyfill'; 7 | 8 | Vue.config.productionTip = false; 9 | 10 | new Vue({ 11 | router, 12 | store, 13 | vuetify, 14 | render: (h) => h(App), 15 | }).$mount('#app'); 16 | -------------------------------------------------------------------------------- /client/src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuetify from 'vuetify'; 3 | import 'vuetify/dist/vuetify.min.css'; 4 | 5 | Vue.use(Vuetify); 6 | 7 | export default new Vuetify({ 8 | icons: { 9 | iconfont: 'mdi', 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /client/src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Router from 'vue-router'; 3 | import Home from './views/Home.vue'; 4 | import Chat from './views/Chat.vue'; 5 | import LiveChat from './views/LiveChat.vue'; 6 | 7 | Vue.use(Router); 8 | 9 | export default new Router({ 10 | routes: [ 11 | { 12 | path: '/', 13 | name: 'home', 14 | component: Home, 15 | }, 16 | { 17 | path: '/chat/:id', 18 | name: 'chat', 19 | component: Chat, 20 | }, 21 | { 22 | path: '/chat/:id/live', 23 | name: 'live-chat', 24 | component: LiveChat, 25 | }, 26 | ], 27 | }); 28 | -------------------------------------------------------------------------------- /client/src/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | 4 | Vue.use(Vuex); 5 | 6 | export default new Vuex.Store({ 7 | state: { 8 | 9 | }, 10 | mutations: { 11 | 12 | }, 13 | actions: { 14 | 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /client/src/views/Chat.vue: -------------------------------------------------------------------------------- 1 | 130 | 131 | 238 | 239 | 322 | -------------------------------------------------------------------------------- /client/src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 49 | -------------------------------------------------------------------------------- /client/src/views/LiveChat.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 105 | 106 | 176 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1 3 | } 4 | -------------------------------------------------------------------------------- /server/.env.sample: -------------------------------------------------------------------------------- 1 | GOOGLE_API_KEY= 2 | TWITCH_CLIENT_ID= 3 | YOUTUBE_CHANNEL_ID=UCLNgu_OupwoeESgtab33CCw 4 | TWITCH_CHANNEL=#codinggarden 5 | TWITCH_TOKEN=abc123 -------------------------------------------------------------------------------- /server/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | commonjs: true, 4 | es6: true, 5 | node: true, 6 | }, 7 | extends: [ 8 | 'airbnb-base', 9 | ], 10 | globals: { 11 | Atomics: 'readonly', 12 | SharedArrayBuffer: 'readonly', 13 | }, 14 | parserOptions: { 15 | ecmaVersion: 2018, 16 | }, 17 | rules: { 18 | 'no-param-reassign': 0, 19 | 'no-await-in-loop': 0, 20 | 'no-underscore-dangle': 0, 21 | 'no-plusplus': 0, 22 | 'camelcase': 0, 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Optional REPL history 57 | .node_repl_history 58 | 59 | # Output of 'npm pack' 60 | *.tgz 61 | 62 | # Yarn Integrity file 63 | .yarn-integrity 64 | 65 | # dotenv environment variables file 66 | .env 67 | .env.test 68 | 69 | # parcel-bundler cache (https://parceljs.org/) 70 | .cache 71 | 72 | # next.js build output 73 | .next 74 | 75 | # nuxt.js build output 76 | .nuxt 77 | 78 | # vuepress build output 79 | .vuepress/dist 80 | 81 | # Serverless directories 82 | .serverless/ 83 | 84 | # FuseBox cache 85 | .fusebox/ 86 | 87 | # DynamoDB Local files 88 | .dynamodb/ 89 | -------------------------------------------------------------------------------- /server/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "program": "${workspaceFolder}/src/index.js" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /server/greetings.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/server/greetings.md -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node src/index.js", 8 | "dev": "nodemon src/index.js", 9 | "lint": "eslint src/" 10 | }, 11 | "keywords": [], 12 | "author": "w3cj ", 13 | "license": "MIT", 14 | "dependencies": { 15 | "bad-words": "^3.0.3", 16 | "cors": "^2.8.5", 17 | "dotenv": "^8.2.0", 18 | "express": "^4.17.1", 19 | "monk": "^7.3.0", 20 | "morgan": "^1.10.0", 21 | "node-fetch": "^2.6.0", 22 | "socket.io": "^2.3.0", 23 | "tmi.js": "^1.5.0", 24 | "twitchps": "^1.5.0" 25 | }, 26 | "devDependencies": { 27 | "eslint": "^7.0.0", 28 | "eslint-config-airbnb-base": "^14.1.0", 29 | "eslint-plugin-import": "^2.20.2", 30 | "nodemon": "^2.0.4" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /server/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | cors: 2.8.5 3 | dotenv: 8.1.0 4 | express: 4.17.1 5 | morgan: 1.9.1 6 | node-fetch: 2.6.0 7 | passport: 0.4.0 8 | passport-google-oauth20: 2.0.0 9 | socket.io: 2.3.0 10 | devDependencies: 11 | eslint: 6.4.0 12 | eslint-config-airbnb-base: 14.0.0_a5075551116d142daa65813c845087dd 13 | eslint-plugin-import: 2.18.2_eslint@6.4.0 14 | nodemon: 1.19.2 15 | lockfileVersion: 5.1 16 | packages: 17 | /@babel/code-frame/7.5.5: 18 | dependencies: 19 | '@babel/highlight': 7.5.0 20 | dev: true 21 | resolution: 22 | integrity: sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== 23 | /@babel/highlight/7.5.0: 24 | dependencies: 25 | chalk: 2.4.2 26 | esutils: 2.0.3 27 | js-tokens: 4.0.0 28 | dev: true 29 | resolution: 30 | integrity: sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== 31 | /abbrev/1.1.1: 32 | dev: true 33 | resolution: 34 | integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 35 | /accepts/1.3.7: 36 | dependencies: 37 | mime-types: 2.1.24 38 | negotiator: 0.6.2 39 | dev: false 40 | engines: 41 | node: '>= 0.6' 42 | resolution: 43 | integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 44 | /acorn-jsx/5.0.2_acorn@7.1.0: 45 | dependencies: 46 | acorn: 7.1.0 47 | dev: true 48 | peerDependencies: 49 | acorn: ^6.0.0 || ^7.0.0 50 | resolution: 51 | integrity: sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== 52 | /acorn/7.1.0: 53 | dev: true 54 | engines: 55 | node: '>=0.4.0' 56 | hasBin: true 57 | resolution: 58 | integrity: sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== 59 | /after/0.8.2: 60 | dev: false 61 | resolution: 62 | integrity: sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= 63 | /ajv/6.10.2: 64 | dependencies: 65 | fast-deep-equal: 2.0.1 66 | fast-json-stable-stringify: 2.0.0 67 | json-schema-traverse: 0.4.1 68 | uri-js: 4.2.2 69 | dev: true 70 | resolution: 71 | integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== 72 | /ansi-align/2.0.0: 73 | dependencies: 74 | string-width: 2.1.1 75 | dev: true 76 | resolution: 77 | integrity: sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= 78 | /ansi-escapes/3.2.0: 79 | dev: true 80 | engines: 81 | node: '>=4' 82 | resolution: 83 | integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 84 | /ansi-regex/3.0.0: 85 | dev: true 86 | engines: 87 | node: '>=4' 88 | resolution: 89 | integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 90 | /ansi-regex/4.1.0: 91 | dev: true 92 | engines: 93 | node: '>=6' 94 | resolution: 95 | integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 96 | /ansi-styles/3.2.1: 97 | dependencies: 98 | color-convert: 1.9.3 99 | dev: true 100 | engines: 101 | node: '>=4' 102 | resolution: 103 | integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 104 | /anymatch/2.0.0: 105 | dependencies: 106 | micromatch: 3.1.10 107 | normalize-path: 2.1.1 108 | dev: true 109 | resolution: 110 | integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 111 | /argparse/1.0.10: 112 | dependencies: 113 | sprintf-js: 1.0.3 114 | dev: true 115 | resolution: 116 | integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 117 | /arr-diff/4.0.0: 118 | dev: true 119 | engines: 120 | node: '>=0.10.0' 121 | resolution: 122 | integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 123 | /arr-flatten/1.1.0: 124 | dev: true 125 | engines: 126 | node: '>=0.10.0' 127 | resolution: 128 | integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 129 | /arr-union/3.1.0: 130 | dev: true 131 | engines: 132 | node: '>=0.10.0' 133 | resolution: 134 | integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 135 | /array-flatten/1.1.1: 136 | dev: false 137 | resolution: 138 | integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 139 | /array-includes/3.0.3: 140 | dependencies: 141 | define-properties: 1.1.3 142 | es-abstract: 1.14.2 143 | dev: true 144 | engines: 145 | node: '>= 0.4' 146 | resolution: 147 | integrity: sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= 148 | /array-unique/0.3.2: 149 | dev: true 150 | engines: 151 | node: '>=0.10.0' 152 | resolution: 153 | integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 154 | /arraybuffer.slice/0.0.7: 155 | dev: false 156 | resolution: 157 | integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== 158 | /assign-symbols/1.0.0: 159 | dev: true 160 | engines: 161 | node: '>=0.10.0' 162 | resolution: 163 | integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 164 | /astral-regex/1.0.0: 165 | dev: true 166 | engines: 167 | node: '>=4' 168 | resolution: 169 | integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 170 | /async-each/1.0.3: 171 | dev: true 172 | resolution: 173 | integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 174 | /async-limiter/1.0.1: 175 | dev: false 176 | resolution: 177 | integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== 178 | /atob/2.1.2: 179 | dev: true 180 | engines: 181 | node: '>= 4.5.0' 182 | hasBin: true 183 | resolution: 184 | integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 185 | /backo2/1.0.2: 186 | dev: false 187 | resolution: 188 | integrity: sha1-MasayLEpNjRj41s+u2n038+6eUc= 189 | /balanced-match/1.0.0: 190 | dev: true 191 | resolution: 192 | integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 193 | /base/0.11.2: 194 | dependencies: 195 | cache-base: 1.0.1 196 | class-utils: 0.3.6 197 | component-emitter: 1.3.0 198 | define-property: 1.0.0 199 | isobject: 3.0.1 200 | mixin-deep: 1.3.2 201 | pascalcase: 0.1.1 202 | dev: true 203 | engines: 204 | node: '>=0.10.0' 205 | resolution: 206 | integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 207 | /base64-arraybuffer/0.1.5: 208 | dev: false 209 | engines: 210 | node: '>= 0.6.0' 211 | resolution: 212 | integrity: sha1-c5JncZI7Whl0etZmqlzUv5xunOg= 213 | /base64id/2.0.0: 214 | dev: false 215 | engines: 216 | node: ^4.5.0 || >= 5.9 217 | resolution: 218 | integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== 219 | /base64url/3.0.1: 220 | dev: false 221 | engines: 222 | node: '>=6.0.0' 223 | resolution: 224 | integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== 225 | /basic-auth/2.0.1: 226 | dependencies: 227 | safe-buffer: 5.1.2 228 | dev: false 229 | engines: 230 | node: '>= 0.8' 231 | resolution: 232 | integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 233 | /better-assert/1.0.2: 234 | dependencies: 235 | callsite: 1.0.0 236 | dev: false 237 | resolution: 238 | integrity: sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= 239 | /binary-extensions/1.13.1: 240 | dev: true 241 | engines: 242 | node: '>=0.10.0' 243 | resolution: 244 | integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== 245 | /blob/0.0.5: 246 | dev: false 247 | resolution: 248 | integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== 249 | /body-parser/1.19.0: 250 | dependencies: 251 | bytes: 3.1.0 252 | content-type: 1.0.4 253 | debug: 2.6.9 254 | depd: 1.1.2 255 | http-errors: 1.7.2 256 | iconv-lite: 0.4.24 257 | on-finished: 2.3.0 258 | qs: 6.7.0 259 | raw-body: 2.4.0 260 | type-is: 1.6.18 261 | dev: false 262 | engines: 263 | node: '>= 0.8' 264 | resolution: 265 | integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 266 | /boxen/1.3.0: 267 | dependencies: 268 | ansi-align: 2.0.0 269 | camelcase: 4.1.0 270 | chalk: 2.4.2 271 | cli-boxes: 1.0.0 272 | string-width: 2.1.1 273 | term-size: 1.2.0 274 | widest-line: 2.0.1 275 | dev: true 276 | engines: 277 | node: '>=4' 278 | resolution: 279 | integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== 280 | /brace-expansion/1.1.11: 281 | dependencies: 282 | balanced-match: 1.0.0 283 | concat-map: 0.0.1 284 | dev: true 285 | resolution: 286 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 287 | /braces/2.3.2: 288 | dependencies: 289 | arr-flatten: 1.1.0 290 | array-unique: 0.3.2 291 | extend-shallow: 2.0.1 292 | fill-range: 4.0.0 293 | isobject: 3.0.1 294 | repeat-element: 1.1.3 295 | snapdragon: 0.8.2 296 | snapdragon-node: 2.1.1 297 | split-string: 3.1.0 298 | to-regex: 3.0.2 299 | dev: true 300 | engines: 301 | node: '>=0.10.0' 302 | resolution: 303 | integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 304 | /bytes/3.1.0: 305 | dev: false 306 | engines: 307 | node: '>= 0.8' 308 | resolution: 309 | integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 310 | /cache-base/1.0.1: 311 | dependencies: 312 | collection-visit: 1.0.0 313 | component-emitter: 1.3.0 314 | get-value: 2.0.6 315 | has-value: 1.0.0 316 | isobject: 3.0.1 317 | set-value: 2.0.1 318 | to-object-path: 0.3.0 319 | union-value: 1.0.1 320 | unset-value: 1.0.0 321 | dev: true 322 | engines: 323 | node: '>=0.10.0' 324 | resolution: 325 | integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 326 | /callsite/1.0.0: 327 | dev: false 328 | resolution: 329 | integrity: sha1-KAOY5dZkvXQDi28JBRU+borxvCA= 330 | /callsites/3.1.0: 331 | dev: true 332 | engines: 333 | node: '>=6' 334 | resolution: 335 | integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 336 | /camelcase/4.1.0: 337 | dev: true 338 | engines: 339 | node: '>=4' 340 | resolution: 341 | integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 342 | /capture-stack-trace/1.0.1: 343 | dev: true 344 | engines: 345 | node: '>=0.10.0' 346 | resolution: 347 | integrity: sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== 348 | /chalk/2.4.2: 349 | dependencies: 350 | ansi-styles: 3.2.1 351 | escape-string-regexp: 1.0.5 352 | supports-color: 5.5.0 353 | dev: true 354 | engines: 355 | node: '>=4' 356 | resolution: 357 | integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 358 | /chardet/0.7.0: 359 | dev: true 360 | resolution: 361 | integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 362 | /chokidar/2.1.8: 363 | dependencies: 364 | anymatch: 2.0.0 365 | async-each: 1.0.3 366 | braces: 2.3.2 367 | glob-parent: 3.1.0 368 | inherits: 2.0.4 369 | is-binary-path: 1.0.1 370 | is-glob: 4.0.1 371 | normalize-path: 3.0.0 372 | path-is-absolute: 1.0.1 373 | readdirp: 2.2.1 374 | upath: 1.2.0 375 | dev: true 376 | optionalDependencies: 377 | fsevents: 1.2.9 378 | resolution: 379 | integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== 380 | /ci-info/1.6.0: 381 | dev: true 382 | resolution: 383 | integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== 384 | /class-utils/0.3.6: 385 | dependencies: 386 | arr-union: 3.1.0 387 | define-property: 0.2.5 388 | isobject: 3.0.1 389 | static-extend: 0.1.2 390 | dev: true 391 | engines: 392 | node: '>=0.10.0' 393 | resolution: 394 | integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 395 | /cli-boxes/1.0.0: 396 | dev: true 397 | engines: 398 | node: '>=0.10.0' 399 | resolution: 400 | integrity: sha1-T6kXw+WclKAEzWH47lCdplFocUM= 401 | /cli-cursor/2.1.0: 402 | dependencies: 403 | restore-cursor: 2.0.0 404 | dev: true 405 | engines: 406 | node: '>=4' 407 | resolution: 408 | integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 409 | /cli-width/2.2.0: 410 | dev: true 411 | resolution: 412 | integrity: sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 413 | /collection-visit/1.0.0: 414 | dependencies: 415 | map-visit: 1.0.0 416 | object-visit: 1.0.1 417 | dev: true 418 | engines: 419 | node: '>=0.10.0' 420 | resolution: 421 | integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 422 | /color-convert/1.9.3: 423 | dependencies: 424 | color-name: 1.1.3 425 | dev: true 426 | resolution: 427 | integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 428 | /color-name/1.1.3: 429 | dev: true 430 | resolution: 431 | integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 432 | /component-bind/1.0.0: 433 | dev: false 434 | resolution: 435 | integrity: sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= 436 | /component-emitter/1.2.1: 437 | dev: false 438 | resolution: 439 | integrity: sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= 440 | /component-emitter/1.3.0: 441 | dev: true 442 | resolution: 443 | integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 444 | /component-inherit/0.0.3: 445 | dev: false 446 | resolution: 447 | integrity: sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= 448 | /concat-map/0.0.1: 449 | dev: true 450 | resolution: 451 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 452 | /configstore/3.1.2: 453 | dependencies: 454 | dot-prop: 4.2.0 455 | graceful-fs: 4.2.2 456 | make-dir: 1.3.0 457 | unique-string: 1.0.0 458 | write-file-atomic: 2.4.3 459 | xdg-basedir: 3.0.0 460 | dev: true 461 | engines: 462 | node: '>=4' 463 | resolution: 464 | integrity: sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== 465 | /confusing-browser-globals/1.0.9: 466 | dev: true 467 | resolution: 468 | integrity: sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== 469 | /contains-path/0.1.0: 470 | dev: true 471 | engines: 472 | node: '>=0.10.0' 473 | resolution: 474 | integrity: sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= 475 | /content-disposition/0.5.3: 476 | dependencies: 477 | safe-buffer: 5.1.2 478 | dev: false 479 | engines: 480 | node: '>= 0.6' 481 | resolution: 482 | integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 483 | /content-type/1.0.4: 484 | dev: false 485 | engines: 486 | node: '>= 0.6' 487 | resolution: 488 | integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 489 | /cookie-signature/1.0.6: 490 | dev: false 491 | resolution: 492 | integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 493 | /cookie/0.3.1: 494 | dev: false 495 | engines: 496 | node: '>= 0.6' 497 | resolution: 498 | integrity: sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 499 | /cookie/0.4.0: 500 | dev: false 501 | engines: 502 | node: '>= 0.6' 503 | resolution: 504 | integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 505 | /copy-descriptor/0.1.1: 506 | dev: true 507 | engines: 508 | node: '>=0.10.0' 509 | resolution: 510 | integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 511 | /core-util-is/1.0.2: 512 | dev: true 513 | resolution: 514 | integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 515 | /cors/2.8.5: 516 | dependencies: 517 | object-assign: 4.1.1 518 | vary: 1.1.2 519 | dev: false 520 | engines: 521 | node: '>= 0.10' 522 | resolution: 523 | integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 524 | /create-error-class/3.0.2: 525 | dependencies: 526 | capture-stack-trace: 1.0.1 527 | dev: true 528 | engines: 529 | node: '>=0.10.0' 530 | resolution: 531 | integrity: sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= 532 | /cross-spawn/5.1.0: 533 | dependencies: 534 | lru-cache: 4.1.5 535 | shebang-command: 1.2.0 536 | which: 1.3.1 537 | dev: true 538 | resolution: 539 | integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 540 | /cross-spawn/6.0.5: 541 | dependencies: 542 | nice-try: 1.0.5 543 | path-key: 2.0.1 544 | semver: 5.7.1 545 | shebang-command: 1.2.0 546 | which: 1.3.1 547 | dev: true 548 | engines: 549 | node: '>=4.8' 550 | resolution: 551 | integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 552 | /crypto-random-string/1.0.0: 553 | dev: true 554 | engines: 555 | node: '>=4' 556 | resolution: 557 | integrity: sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= 558 | /debug/2.6.9: 559 | dependencies: 560 | ms: 2.0.0 561 | resolution: 562 | integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 563 | /debug/3.1.0: 564 | dependencies: 565 | ms: 2.0.0 566 | dev: false 567 | resolution: 568 | integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 569 | /debug/3.2.6: 570 | dependencies: 571 | ms: 2.1.2 572 | dev: true 573 | resolution: 574 | integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 575 | /debug/4.1.1: 576 | dependencies: 577 | ms: 2.1.2 578 | resolution: 579 | integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 580 | /decode-uri-component/0.2.0: 581 | dev: true 582 | engines: 583 | node: '>=0.10' 584 | resolution: 585 | integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 586 | /deep-extend/0.6.0: 587 | dev: true 588 | engines: 589 | node: '>=4.0.0' 590 | resolution: 591 | integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 592 | /deep-is/0.1.3: 593 | dev: true 594 | resolution: 595 | integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 596 | /define-properties/1.1.3: 597 | dependencies: 598 | object-keys: 1.1.1 599 | dev: true 600 | engines: 601 | node: '>= 0.4' 602 | resolution: 603 | integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 604 | /define-property/0.2.5: 605 | dependencies: 606 | is-descriptor: 0.1.6 607 | dev: true 608 | engines: 609 | node: '>=0.10.0' 610 | resolution: 611 | integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 612 | /define-property/1.0.0: 613 | dependencies: 614 | is-descriptor: 1.0.2 615 | dev: true 616 | engines: 617 | node: '>=0.10.0' 618 | resolution: 619 | integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 620 | /define-property/2.0.2: 621 | dependencies: 622 | is-descriptor: 1.0.2 623 | isobject: 3.0.1 624 | dev: true 625 | engines: 626 | node: '>=0.10.0' 627 | resolution: 628 | integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 629 | /depd/1.1.2: 630 | dev: false 631 | engines: 632 | node: '>= 0.6' 633 | resolution: 634 | integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 635 | /destroy/1.0.4: 636 | dev: false 637 | resolution: 638 | integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 639 | /doctrine/1.5.0: 640 | dependencies: 641 | esutils: 2.0.3 642 | isarray: 1.0.0 643 | dev: true 644 | engines: 645 | node: '>=0.10.0' 646 | resolution: 647 | integrity: sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= 648 | /doctrine/3.0.0: 649 | dependencies: 650 | esutils: 2.0.3 651 | dev: true 652 | engines: 653 | node: '>=6.0.0' 654 | resolution: 655 | integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 656 | /dot-prop/4.2.0: 657 | dependencies: 658 | is-obj: 1.0.1 659 | dev: true 660 | engines: 661 | node: '>=4' 662 | resolution: 663 | integrity: sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== 664 | /dotenv/8.1.0: 665 | dev: false 666 | engines: 667 | node: '>=8' 668 | resolution: 669 | integrity: sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA== 670 | /duplexer3/0.1.4: 671 | dev: true 672 | resolution: 673 | integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 674 | /ee-first/1.1.1: 675 | dev: false 676 | resolution: 677 | integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 678 | /emoji-regex/7.0.3: 679 | dev: true 680 | resolution: 681 | integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 682 | /encodeurl/1.0.2: 683 | dev: false 684 | engines: 685 | node: '>= 0.8' 686 | resolution: 687 | integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 688 | /engine.io-client/3.4.0: 689 | dependencies: 690 | component-emitter: 1.2.1 691 | component-inherit: 0.0.3 692 | debug: 4.1.1 693 | engine.io-parser: 2.2.0 694 | has-cors: 1.1.0 695 | indexof: 0.0.1 696 | parseqs: 0.0.5 697 | parseuri: 0.0.5 698 | ws: 6.1.4 699 | xmlhttprequest-ssl: 1.5.5 700 | yeast: 0.1.2 701 | dev: false 702 | resolution: 703 | integrity: sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA== 704 | /engine.io-parser/2.2.0: 705 | dependencies: 706 | after: 0.8.2 707 | arraybuffer.slice: 0.0.7 708 | base64-arraybuffer: 0.1.5 709 | blob: 0.0.5 710 | has-binary2: 1.0.3 711 | dev: false 712 | resolution: 713 | integrity: sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== 714 | /engine.io/3.4.0: 715 | dependencies: 716 | accepts: 1.3.7 717 | base64id: 2.0.0 718 | cookie: 0.3.1 719 | debug: 4.1.1 720 | engine.io-parser: 2.2.0 721 | ws: 7.1.2 722 | dev: false 723 | resolution: 724 | integrity: sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w== 725 | /error-ex/1.3.2: 726 | dependencies: 727 | is-arrayish: 0.2.1 728 | dev: true 729 | resolution: 730 | integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 731 | /es-abstract/1.14.2: 732 | dependencies: 733 | es-to-primitive: 1.2.0 734 | function-bind: 1.1.1 735 | has: 1.0.3 736 | has-symbols: 1.0.0 737 | is-callable: 1.1.4 738 | is-regex: 1.0.4 739 | object-inspect: 1.6.0 740 | object-keys: 1.1.1 741 | string.prototype.trimleft: 2.1.0 742 | string.prototype.trimright: 2.1.0 743 | dev: true 744 | engines: 745 | node: '>= 0.4' 746 | resolution: 747 | integrity: sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg== 748 | /es-to-primitive/1.2.0: 749 | dependencies: 750 | is-callable: 1.1.4 751 | is-date-object: 1.0.1 752 | is-symbol: 1.0.2 753 | dev: true 754 | engines: 755 | node: '>= 0.4' 756 | resolution: 757 | integrity: sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== 758 | /escape-html/1.0.3: 759 | dev: false 760 | resolution: 761 | integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 762 | /escape-string-regexp/1.0.5: 763 | dev: true 764 | engines: 765 | node: '>=0.8.0' 766 | resolution: 767 | integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 768 | /eslint-config-airbnb-base/14.0.0_a5075551116d142daa65813c845087dd: 769 | dependencies: 770 | confusing-browser-globals: 1.0.9 771 | eslint: 6.4.0 772 | eslint-plugin-import: 2.18.2_eslint@6.4.0 773 | object.assign: 4.1.0 774 | object.entries: 1.1.0 775 | dev: true 776 | engines: 777 | node: '>= 6' 778 | peerDependencies: 779 | eslint: ^5.16.0 || ^6.1.0 780 | eslint-plugin-import: ^2.18.2 781 | resolution: 782 | integrity: sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA== 783 | /eslint-import-resolver-node/0.3.2: 784 | dependencies: 785 | debug: 2.6.9 786 | resolve: 1.12.0 787 | dev: true 788 | resolution: 789 | integrity: sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== 790 | /eslint-module-utils/2.4.1: 791 | dependencies: 792 | debug: 2.6.9 793 | pkg-dir: 2.0.0 794 | dev: true 795 | engines: 796 | node: '>=4' 797 | resolution: 798 | integrity: sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== 799 | /eslint-plugin-import/2.18.2_eslint@6.4.0: 800 | dependencies: 801 | array-includes: 3.0.3 802 | contains-path: 0.1.0 803 | debug: 2.6.9 804 | doctrine: 1.5.0 805 | eslint: 6.4.0 806 | eslint-import-resolver-node: 0.3.2 807 | eslint-module-utils: 2.4.1 808 | has: 1.0.3 809 | minimatch: 3.0.4 810 | object.values: 1.1.0 811 | read-pkg-up: 2.0.0 812 | resolve: 1.12.0 813 | dev: true 814 | engines: 815 | node: '>=4' 816 | peerDependencies: 817 | eslint: 2.x - 6.x 818 | resolution: 819 | integrity: sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== 820 | /eslint-scope/5.0.0: 821 | dependencies: 822 | esrecurse: 4.2.1 823 | estraverse: 4.3.0 824 | dev: true 825 | engines: 826 | node: '>=8.0.0' 827 | resolution: 828 | integrity: sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 829 | /eslint-utils/1.4.2: 830 | dependencies: 831 | eslint-visitor-keys: 1.1.0 832 | dev: true 833 | engines: 834 | node: '>=6' 835 | resolution: 836 | integrity: sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== 837 | /eslint-visitor-keys/1.1.0: 838 | dev: true 839 | engines: 840 | node: '>=4' 841 | resolution: 842 | integrity: sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== 843 | /eslint/6.4.0: 844 | dependencies: 845 | '@babel/code-frame': 7.5.5 846 | ajv: 6.10.2 847 | chalk: 2.4.2 848 | cross-spawn: 6.0.5 849 | debug: 4.1.1 850 | doctrine: 3.0.0 851 | eslint-scope: 5.0.0 852 | eslint-utils: 1.4.2 853 | eslint-visitor-keys: 1.1.0 854 | espree: 6.1.1 855 | esquery: 1.0.1 856 | esutils: 2.0.3 857 | file-entry-cache: 5.0.1 858 | functional-red-black-tree: 1.0.1 859 | glob-parent: 5.1.0 860 | globals: 11.12.0 861 | ignore: 4.0.6 862 | import-fresh: 3.1.0 863 | imurmurhash: 0.1.4 864 | inquirer: 6.5.2 865 | is-glob: 4.0.1 866 | js-yaml: 3.13.1 867 | json-stable-stringify-without-jsonify: 1.0.1 868 | levn: 0.3.0 869 | lodash: 4.17.15 870 | minimatch: 3.0.4 871 | mkdirp: 0.5.1 872 | natural-compare: 1.4.0 873 | optionator: 0.8.2 874 | progress: 2.0.3 875 | regexpp: 2.0.1 876 | semver: 6.3.0 877 | strip-ansi: 5.2.0 878 | strip-json-comments: 3.0.1 879 | table: 5.4.6 880 | text-table: 0.2.0 881 | v8-compile-cache: 2.1.0 882 | dev: true 883 | engines: 884 | node: ^8.10.0 || ^10.13.0 || >=11.10.1 885 | hasBin: true 886 | resolution: 887 | integrity: sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA== 888 | /espree/6.1.1: 889 | dependencies: 890 | acorn: 7.1.0 891 | acorn-jsx: 5.0.2_acorn@7.1.0 892 | eslint-visitor-keys: 1.1.0 893 | dev: true 894 | engines: 895 | node: '>=6.0.0' 896 | resolution: 897 | integrity: sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ== 898 | /esprima/4.0.1: 899 | dev: true 900 | engines: 901 | node: '>=4' 902 | hasBin: true 903 | resolution: 904 | integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 905 | /esquery/1.0.1: 906 | dependencies: 907 | estraverse: 4.3.0 908 | dev: true 909 | engines: 910 | node: '>=0.6' 911 | resolution: 912 | integrity: sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== 913 | /esrecurse/4.2.1: 914 | dependencies: 915 | estraverse: 4.3.0 916 | dev: true 917 | engines: 918 | node: '>=4.0' 919 | resolution: 920 | integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 921 | /estraverse/4.3.0: 922 | dev: true 923 | engines: 924 | node: '>=4.0' 925 | resolution: 926 | integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 927 | /esutils/2.0.3: 928 | dev: true 929 | engines: 930 | node: '>=0.10.0' 931 | resolution: 932 | integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 933 | /etag/1.8.1: 934 | dev: false 935 | engines: 936 | node: '>= 0.6' 937 | resolution: 938 | integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 939 | /execa/0.7.0: 940 | dependencies: 941 | cross-spawn: 5.1.0 942 | get-stream: 3.0.0 943 | is-stream: 1.1.0 944 | npm-run-path: 2.0.2 945 | p-finally: 1.0.0 946 | signal-exit: 3.0.2 947 | strip-eof: 1.0.0 948 | dev: true 949 | engines: 950 | node: '>=4' 951 | resolution: 952 | integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 953 | /expand-brackets/2.1.4: 954 | dependencies: 955 | debug: 2.6.9 956 | define-property: 0.2.5 957 | extend-shallow: 2.0.1 958 | posix-character-classes: 0.1.1 959 | regex-not: 1.0.2 960 | snapdragon: 0.8.2 961 | to-regex: 3.0.2 962 | dev: true 963 | engines: 964 | node: '>=0.10.0' 965 | resolution: 966 | integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 967 | /express/4.17.1: 968 | dependencies: 969 | accepts: 1.3.7 970 | array-flatten: 1.1.1 971 | body-parser: 1.19.0 972 | content-disposition: 0.5.3 973 | content-type: 1.0.4 974 | cookie: 0.4.0 975 | cookie-signature: 1.0.6 976 | debug: 2.6.9 977 | depd: 1.1.2 978 | encodeurl: 1.0.2 979 | escape-html: 1.0.3 980 | etag: 1.8.1 981 | finalhandler: 1.1.2 982 | fresh: 0.5.2 983 | merge-descriptors: 1.0.1 984 | methods: 1.1.2 985 | on-finished: 2.3.0 986 | parseurl: 1.3.3 987 | path-to-regexp: 0.1.7 988 | proxy-addr: 2.0.5 989 | qs: 6.7.0 990 | range-parser: 1.2.1 991 | safe-buffer: 5.1.2 992 | send: 0.17.1 993 | serve-static: 1.14.1 994 | setprototypeof: 1.1.1 995 | statuses: 1.5.0 996 | type-is: 1.6.18 997 | utils-merge: 1.0.1 998 | vary: 1.1.2 999 | dev: false 1000 | engines: 1001 | node: '>= 0.10.0' 1002 | resolution: 1003 | integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 1004 | /extend-shallow/2.0.1: 1005 | dependencies: 1006 | is-extendable: 0.1.1 1007 | dev: true 1008 | engines: 1009 | node: '>=0.10.0' 1010 | resolution: 1011 | integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 1012 | /extend-shallow/3.0.2: 1013 | dependencies: 1014 | assign-symbols: 1.0.0 1015 | is-extendable: 1.0.1 1016 | dev: true 1017 | engines: 1018 | node: '>=0.10.0' 1019 | resolution: 1020 | integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 1021 | /external-editor/3.1.0: 1022 | dependencies: 1023 | chardet: 0.7.0 1024 | iconv-lite: 0.4.24 1025 | tmp: 0.0.33 1026 | dev: true 1027 | engines: 1028 | node: '>=4' 1029 | resolution: 1030 | integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 1031 | /extglob/2.0.4: 1032 | dependencies: 1033 | array-unique: 0.3.2 1034 | define-property: 1.0.0 1035 | expand-brackets: 2.1.4 1036 | extend-shallow: 2.0.1 1037 | fragment-cache: 0.2.1 1038 | regex-not: 1.0.2 1039 | snapdragon: 0.8.2 1040 | to-regex: 3.0.2 1041 | dev: true 1042 | engines: 1043 | node: '>=0.10.0' 1044 | resolution: 1045 | integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 1046 | /fast-deep-equal/2.0.1: 1047 | dev: true 1048 | resolution: 1049 | integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 1050 | /fast-json-stable-stringify/2.0.0: 1051 | dev: true 1052 | resolution: 1053 | integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 1054 | /fast-levenshtein/2.0.6: 1055 | dev: true 1056 | resolution: 1057 | integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 1058 | /figures/2.0.0: 1059 | dependencies: 1060 | escape-string-regexp: 1.0.5 1061 | dev: true 1062 | engines: 1063 | node: '>=4' 1064 | resolution: 1065 | integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 1066 | /file-entry-cache/5.0.1: 1067 | dependencies: 1068 | flat-cache: 2.0.1 1069 | dev: true 1070 | engines: 1071 | node: '>=4' 1072 | resolution: 1073 | integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 1074 | /fill-range/4.0.0: 1075 | dependencies: 1076 | extend-shallow: 2.0.1 1077 | is-number: 3.0.0 1078 | repeat-string: 1.6.1 1079 | to-regex-range: 2.1.1 1080 | dev: true 1081 | engines: 1082 | node: '>=0.10.0' 1083 | resolution: 1084 | integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 1085 | /finalhandler/1.1.2: 1086 | dependencies: 1087 | debug: 2.6.9 1088 | encodeurl: 1.0.2 1089 | escape-html: 1.0.3 1090 | on-finished: 2.3.0 1091 | parseurl: 1.3.3 1092 | statuses: 1.5.0 1093 | unpipe: 1.0.0 1094 | dev: false 1095 | engines: 1096 | node: '>= 0.8' 1097 | resolution: 1098 | integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 1099 | /find-up/2.1.0: 1100 | dependencies: 1101 | locate-path: 2.0.0 1102 | dev: true 1103 | engines: 1104 | node: '>=4' 1105 | resolution: 1106 | integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 1107 | /flat-cache/2.0.1: 1108 | dependencies: 1109 | flatted: 2.0.1 1110 | rimraf: 2.6.3 1111 | write: 1.0.3 1112 | dev: true 1113 | engines: 1114 | node: '>=4' 1115 | resolution: 1116 | integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 1117 | /flatted/2.0.1: 1118 | dev: true 1119 | resolution: 1120 | integrity: sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== 1121 | /for-in/1.0.2: 1122 | dev: true 1123 | engines: 1124 | node: '>=0.10.0' 1125 | resolution: 1126 | integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 1127 | /forwarded/0.1.2: 1128 | dev: false 1129 | engines: 1130 | node: '>= 0.6' 1131 | resolution: 1132 | integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 1133 | /fragment-cache/0.2.1: 1134 | dependencies: 1135 | map-cache: 0.2.2 1136 | dev: true 1137 | engines: 1138 | node: '>=0.10.0' 1139 | resolution: 1140 | integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 1141 | /fresh/0.5.2: 1142 | dev: false 1143 | engines: 1144 | node: '>= 0.6' 1145 | resolution: 1146 | integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 1147 | /fs.realpath/1.0.0: 1148 | dev: true 1149 | resolution: 1150 | integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1151 | /fsevents/1.2.9: 1152 | bundledDependencies: 1153 | - node-pre-gyp 1154 | dependencies: 1155 | nan: 2.14.0 1156 | dev: true 1157 | engines: 1158 | node: '>=4.0' 1159 | optional: true 1160 | requiresBuild: true 1161 | resolution: 1162 | integrity: sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== 1163 | /function-bind/1.1.1: 1164 | dev: true 1165 | resolution: 1166 | integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1167 | /functional-red-black-tree/1.0.1: 1168 | dev: true 1169 | resolution: 1170 | integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 1171 | /get-stream/3.0.0: 1172 | dev: true 1173 | engines: 1174 | node: '>=4' 1175 | resolution: 1176 | integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 1177 | /get-value/2.0.6: 1178 | dev: true 1179 | engines: 1180 | node: '>=0.10.0' 1181 | resolution: 1182 | integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 1183 | /glob-parent/3.1.0: 1184 | dependencies: 1185 | is-glob: 3.1.0 1186 | path-dirname: 1.0.2 1187 | dev: true 1188 | resolution: 1189 | integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 1190 | /glob-parent/5.1.0: 1191 | dependencies: 1192 | is-glob: 4.0.1 1193 | dev: true 1194 | engines: 1195 | node: '>= 6' 1196 | resolution: 1197 | integrity: sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== 1198 | /glob/7.1.4: 1199 | dependencies: 1200 | fs.realpath: 1.0.0 1201 | inflight: 1.0.6 1202 | inherits: 2.0.4 1203 | minimatch: 3.0.4 1204 | once: 1.4.0 1205 | path-is-absolute: 1.0.1 1206 | dev: true 1207 | resolution: 1208 | integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 1209 | /global-dirs/0.1.1: 1210 | dependencies: 1211 | ini: 1.3.5 1212 | dev: true 1213 | engines: 1214 | node: '>=4' 1215 | resolution: 1216 | integrity: sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= 1217 | /globals/11.12.0: 1218 | dev: true 1219 | engines: 1220 | node: '>=4' 1221 | resolution: 1222 | integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1223 | /got/6.7.1: 1224 | dependencies: 1225 | create-error-class: 3.0.2 1226 | duplexer3: 0.1.4 1227 | get-stream: 3.0.0 1228 | is-redirect: 1.0.0 1229 | is-retry-allowed: 1.2.0 1230 | is-stream: 1.1.0 1231 | lowercase-keys: 1.0.1 1232 | safe-buffer: 5.2.0 1233 | timed-out: 4.0.1 1234 | unzip-response: 2.0.1 1235 | url-parse-lax: 1.0.0 1236 | dev: true 1237 | engines: 1238 | node: '>=4' 1239 | resolution: 1240 | integrity: sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= 1241 | /graceful-fs/4.2.2: 1242 | dev: true 1243 | resolution: 1244 | integrity: sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== 1245 | /has-binary2/1.0.3: 1246 | dependencies: 1247 | isarray: 2.0.1 1248 | dev: false 1249 | resolution: 1250 | integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== 1251 | /has-cors/1.1.0: 1252 | dev: false 1253 | resolution: 1254 | integrity: sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= 1255 | /has-flag/3.0.0: 1256 | dev: true 1257 | engines: 1258 | node: '>=4' 1259 | resolution: 1260 | integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1261 | /has-symbols/1.0.0: 1262 | dev: true 1263 | engines: 1264 | node: '>= 0.4' 1265 | resolution: 1266 | integrity: sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 1267 | /has-value/0.3.1: 1268 | dependencies: 1269 | get-value: 2.0.6 1270 | has-values: 0.1.4 1271 | isobject: 2.1.0 1272 | dev: true 1273 | engines: 1274 | node: '>=0.10.0' 1275 | resolution: 1276 | integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 1277 | /has-value/1.0.0: 1278 | dependencies: 1279 | get-value: 2.0.6 1280 | has-values: 1.0.0 1281 | isobject: 3.0.1 1282 | dev: true 1283 | engines: 1284 | node: '>=0.10.0' 1285 | resolution: 1286 | integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 1287 | /has-values/0.1.4: 1288 | dev: true 1289 | engines: 1290 | node: '>=0.10.0' 1291 | resolution: 1292 | integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E= 1293 | /has-values/1.0.0: 1294 | dependencies: 1295 | is-number: 3.0.0 1296 | kind-of: 4.0.0 1297 | dev: true 1298 | engines: 1299 | node: '>=0.10.0' 1300 | resolution: 1301 | integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 1302 | /has/1.0.3: 1303 | dependencies: 1304 | function-bind: 1.1.1 1305 | dev: true 1306 | engines: 1307 | node: '>= 0.4.0' 1308 | resolution: 1309 | integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1310 | /hosted-git-info/2.8.4: 1311 | dev: true 1312 | resolution: 1313 | integrity: sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ== 1314 | /http-errors/1.7.2: 1315 | dependencies: 1316 | depd: 1.1.2 1317 | inherits: 2.0.3 1318 | setprototypeof: 1.1.1 1319 | statuses: 1.5.0 1320 | toidentifier: 1.0.0 1321 | dev: false 1322 | engines: 1323 | node: '>= 0.6' 1324 | resolution: 1325 | integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 1326 | /http-errors/1.7.3: 1327 | dependencies: 1328 | depd: 1.1.2 1329 | inherits: 2.0.4 1330 | setprototypeof: 1.1.1 1331 | statuses: 1.5.0 1332 | toidentifier: 1.0.0 1333 | dev: false 1334 | engines: 1335 | node: '>= 0.6' 1336 | resolution: 1337 | integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 1338 | /iconv-lite/0.4.24: 1339 | dependencies: 1340 | safer-buffer: 2.1.2 1341 | engines: 1342 | node: '>=0.10.0' 1343 | resolution: 1344 | integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1345 | /ignore-by-default/1.0.1: 1346 | dev: true 1347 | resolution: 1348 | integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 1349 | /ignore/4.0.6: 1350 | dev: true 1351 | engines: 1352 | node: '>= 4' 1353 | resolution: 1354 | integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 1355 | /import-fresh/3.1.0: 1356 | dependencies: 1357 | parent-module: 1.0.1 1358 | resolve-from: 4.0.0 1359 | dev: true 1360 | engines: 1361 | node: '>=6' 1362 | resolution: 1363 | integrity: sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== 1364 | /import-lazy/2.1.0: 1365 | dev: true 1366 | engines: 1367 | node: '>=4' 1368 | resolution: 1369 | integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 1370 | /imurmurhash/0.1.4: 1371 | dev: true 1372 | engines: 1373 | node: '>=0.8.19' 1374 | resolution: 1375 | integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= 1376 | /indexof/0.0.1: 1377 | dev: false 1378 | resolution: 1379 | integrity: sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= 1380 | /inflight/1.0.6: 1381 | dependencies: 1382 | once: 1.4.0 1383 | wrappy: 1.0.2 1384 | dev: true 1385 | resolution: 1386 | integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1387 | /inherits/2.0.3: 1388 | dev: false 1389 | resolution: 1390 | integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1391 | /inherits/2.0.4: 1392 | resolution: 1393 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1394 | /ini/1.3.5: 1395 | dev: true 1396 | resolution: 1397 | integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 1398 | /inquirer/6.5.2: 1399 | dependencies: 1400 | ansi-escapes: 3.2.0 1401 | chalk: 2.4.2 1402 | cli-cursor: 2.1.0 1403 | cli-width: 2.2.0 1404 | external-editor: 3.1.0 1405 | figures: 2.0.0 1406 | lodash: 4.17.15 1407 | mute-stream: 0.0.7 1408 | run-async: 2.3.0 1409 | rxjs: 6.5.3 1410 | string-width: 2.1.1 1411 | strip-ansi: 5.2.0 1412 | through: 2.3.8 1413 | dev: true 1414 | engines: 1415 | node: '>=6.0.0' 1416 | resolution: 1417 | integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== 1418 | /ipaddr.js/1.9.0: 1419 | dev: false 1420 | engines: 1421 | node: '>= 0.10' 1422 | resolution: 1423 | integrity: sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== 1424 | /is-accessor-descriptor/0.1.6: 1425 | dependencies: 1426 | kind-of: 3.2.2 1427 | dev: true 1428 | engines: 1429 | node: '>=0.10.0' 1430 | resolution: 1431 | integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 1432 | /is-accessor-descriptor/1.0.0: 1433 | dependencies: 1434 | kind-of: 6.0.2 1435 | dev: true 1436 | engines: 1437 | node: '>=0.10.0' 1438 | resolution: 1439 | integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 1440 | /is-arrayish/0.2.1: 1441 | dev: true 1442 | resolution: 1443 | integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 1444 | /is-binary-path/1.0.1: 1445 | dependencies: 1446 | binary-extensions: 1.13.1 1447 | dev: true 1448 | engines: 1449 | node: '>=0.10.0' 1450 | resolution: 1451 | integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= 1452 | /is-buffer/1.1.6: 1453 | dev: true 1454 | resolution: 1455 | integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1456 | /is-callable/1.1.4: 1457 | dev: true 1458 | engines: 1459 | node: '>= 0.4' 1460 | resolution: 1461 | integrity: sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 1462 | /is-ci/1.2.1: 1463 | dependencies: 1464 | ci-info: 1.6.0 1465 | dev: true 1466 | hasBin: true 1467 | resolution: 1468 | integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== 1469 | /is-data-descriptor/0.1.4: 1470 | dependencies: 1471 | kind-of: 3.2.2 1472 | dev: true 1473 | engines: 1474 | node: '>=0.10.0' 1475 | resolution: 1476 | integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 1477 | /is-data-descriptor/1.0.0: 1478 | dependencies: 1479 | kind-of: 6.0.2 1480 | dev: true 1481 | engines: 1482 | node: '>=0.10.0' 1483 | resolution: 1484 | integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 1485 | /is-date-object/1.0.1: 1486 | dev: true 1487 | engines: 1488 | node: '>= 0.4' 1489 | resolution: 1490 | integrity: sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 1491 | /is-descriptor/0.1.6: 1492 | dependencies: 1493 | is-accessor-descriptor: 0.1.6 1494 | is-data-descriptor: 0.1.4 1495 | kind-of: 5.1.0 1496 | dev: true 1497 | engines: 1498 | node: '>=0.10.0' 1499 | resolution: 1500 | integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 1501 | /is-descriptor/1.0.2: 1502 | dependencies: 1503 | is-accessor-descriptor: 1.0.0 1504 | is-data-descriptor: 1.0.0 1505 | kind-of: 6.0.2 1506 | dev: true 1507 | engines: 1508 | node: '>=0.10.0' 1509 | resolution: 1510 | integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 1511 | /is-extendable/0.1.1: 1512 | dev: true 1513 | engines: 1514 | node: '>=0.10.0' 1515 | resolution: 1516 | integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 1517 | /is-extendable/1.0.1: 1518 | dependencies: 1519 | is-plain-object: 2.0.4 1520 | dev: true 1521 | engines: 1522 | node: '>=0.10.0' 1523 | resolution: 1524 | integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 1525 | /is-extglob/2.1.1: 1526 | dev: true 1527 | engines: 1528 | node: '>=0.10.0' 1529 | resolution: 1530 | integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1531 | /is-fullwidth-code-point/2.0.0: 1532 | dev: true 1533 | engines: 1534 | node: '>=4' 1535 | resolution: 1536 | integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1537 | /is-glob/3.1.0: 1538 | dependencies: 1539 | is-extglob: 2.1.1 1540 | dev: true 1541 | engines: 1542 | node: '>=0.10.0' 1543 | resolution: 1544 | integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 1545 | /is-glob/4.0.1: 1546 | dependencies: 1547 | is-extglob: 2.1.1 1548 | dev: true 1549 | engines: 1550 | node: '>=0.10.0' 1551 | resolution: 1552 | integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1553 | /is-installed-globally/0.1.0: 1554 | dependencies: 1555 | global-dirs: 0.1.1 1556 | is-path-inside: 1.0.1 1557 | dev: true 1558 | engines: 1559 | node: '>=4' 1560 | resolution: 1561 | integrity: sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= 1562 | /is-npm/1.0.0: 1563 | dev: true 1564 | engines: 1565 | node: '>=0.10.0' 1566 | resolution: 1567 | integrity: sha1-8vtjpl5JBbQGyGBydloaTceTufQ= 1568 | /is-number/3.0.0: 1569 | dependencies: 1570 | kind-of: 3.2.2 1571 | dev: true 1572 | engines: 1573 | node: '>=0.10.0' 1574 | resolution: 1575 | integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 1576 | /is-obj/1.0.1: 1577 | dev: true 1578 | engines: 1579 | node: '>=0.10.0' 1580 | resolution: 1581 | integrity: sha1-PkcprB9f3gJc19g6iW2rn09n2w8= 1582 | /is-path-inside/1.0.1: 1583 | dependencies: 1584 | path-is-inside: 1.0.2 1585 | dev: true 1586 | engines: 1587 | node: '>=0.10.0' 1588 | resolution: 1589 | integrity: sha1-jvW33lBDej/cprToZe96pVy0gDY= 1590 | /is-plain-object/2.0.4: 1591 | dependencies: 1592 | isobject: 3.0.1 1593 | dev: true 1594 | engines: 1595 | node: '>=0.10.0' 1596 | resolution: 1597 | integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1598 | /is-promise/2.1.0: 1599 | dev: true 1600 | resolution: 1601 | integrity: sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 1602 | /is-redirect/1.0.0: 1603 | dev: true 1604 | engines: 1605 | node: '>=0.10.0' 1606 | resolution: 1607 | integrity: sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= 1608 | /is-regex/1.0.4: 1609 | dependencies: 1610 | has: 1.0.3 1611 | dev: true 1612 | engines: 1613 | node: '>= 0.4' 1614 | resolution: 1615 | integrity: sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= 1616 | /is-retry-allowed/1.2.0: 1617 | dev: true 1618 | engines: 1619 | node: '>=0.10.0' 1620 | resolution: 1621 | integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== 1622 | /is-stream/1.1.0: 1623 | dev: true 1624 | engines: 1625 | node: '>=0.10.0' 1626 | resolution: 1627 | integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 1628 | /is-symbol/1.0.2: 1629 | dependencies: 1630 | has-symbols: 1.0.0 1631 | dev: true 1632 | engines: 1633 | node: '>= 0.4' 1634 | resolution: 1635 | integrity: sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 1636 | /is-windows/1.0.2: 1637 | dev: true 1638 | engines: 1639 | node: '>=0.10.0' 1640 | resolution: 1641 | integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1642 | /isarray/1.0.0: 1643 | dev: true 1644 | resolution: 1645 | integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1646 | /isarray/2.0.1: 1647 | dev: false 1648 | resolution: 1649 | integrity: sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= 1650 | /isexe/2.0.0: 1651 | dev: true 1652 | resolution: 1653 | integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1654 | /isobject/2.1.0: 1655 | dependencies: 1656 | isarray: 1.0.0 1657 | dev: true 1658 | engines: 1659 | node: '>=0.10.0' 1660 | resolution: 1661 | integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 1662 | /isobject/3.0.1: 1663 | dev: true 1664 | engines: 1665 | node: '>=0.10.0' 1666 | resolution: 1667 | integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1668 | /js-tokens/4.0.0: 1669 | dev: true 1670 | resolution: 1671 | integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1672 | /js-yaml/3.13.1: 1673 | dependencies: 1674 | argparse: 1.0.10 1675 | esprima: 4.0.1 1676 | dev: true 1677 | hasBin: true 1678 | resolution: 1679 | integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1680 | /json-schema-traverse/0.4.1: 1681 | dev: true 1682 | resolution: 1683 | integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1684 | /json-stable-stringify-without-jsonify/1.0.1: 1685 | dev: true 1686 | resolution: 1687 | integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1688 | /kind-of/3.2.2: 1689 | dependencies: 1690 | is-buffer: 1.1.6 1691 | dev: true 1692 | engines: 1693 | node: '>=0.10.0' 1694 | resolution: 1695 | integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1696 | /kind-of/4.0.0: 1697 | dependencies: 1698 | is-buffer: 1.1.6 1699 | dev: true 1700 | engines: 1701 | node: '>=0.10.0' 1702 | resolution: 1703 | integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 1704 | /kind-of/5.1.0: 1705 | dev: true 1706 | engines: 1707 | node: '>=0.10.0' 1708 | resolution: 1709 | integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1710 | /kind-of/6.0.2: 1711 | dev: true 1712 | engines: 1713 | node: '>=0.10.0' 1714 | resolution: 1715 | integrity: sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 1716 | /latest-version/3.1.0: 1717 | dependencies: 1718 | package-json: 4.0.1 1719 | dev: true 1720 | engines: 1721 | node: '>=4' 1722 | resolution: 1723 | integrity: sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= 1724 | /levn/0.3.0: 1725 | dependencies: 1726 | prelude-ls: 1.1.2 1727 | type-check: 0.3.2 1728 | dev: true 1729 | engines: 1730 | node: '>= 0.8.0' 1731 | resolution: 1732 | integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 1733 | /load-json-file/2.0.0: 1734 | dependencies: 1735 | graceful-fs: 4.2.2 1736 | parse-json: 2.2.0 1737 | pify: 2.3.0 1738 | strip-bom: 3.0.0 1739 | dev: true 1740 | engines: 1741 | node: '>=4' 1742 | resolution: 1743 | integrity: sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= 1744 | /locate-path/2.0.0: 1745 | dependencies: 1746 | p-locate: 2.0.0 1747 | path-exists: 3.0.0 1748 | dev: true 1749 | engines: 1750 | node: '>=4' 1751 | resolution: 1752 | integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 1753 | /lodash/4.17.15: 1754 | dev: true 1755 | resolution: 1756 | integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 1757 | /lowercase-keys/1.0.1: 1758 | dev: true 1759 | engines: 1760 | node: '>=0.10.0' 1761 | resolution: 1762 | integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1763 | /lru-cache/4.1.5: 1764 | dependencies: 1765 | pseudomap: 1.0.2 1766 | yallist: 2.1.2 1767 | dev: true 1768 | resolution: 1769 | integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 1770 | /make-dir/1.3.0: 1771 | dependencies: 1772 | pify: 3.0.0 1773 | dev: true 1774 | engines: 1775 | node: '>=4' 1776 | resolution: 1777 | integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 1778 | /map-cache/0.2.2: 1779 | dev: true 1780 | engines: 1781 | node: '>=0.10.0' 1782 | resolution: 1783 | integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1784 | /map-visit/1.0.0: 1785 | dependencies: 1786 | object-visit: 1.0.1 1787 | dev: true 1788 | engines: 1789 | node: '>=0.10.0' 1790 | resolution: 1791 | integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1792 | /media-typer/0.3.0: 1793 | dev: false 1794 | engines: 1795 | node: '>= 0.6' 1796 | resolution: 1797 | integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1798 | /merge-descriptors/1.0.1: 1799 | dev: false 1800 | resolution: 1801 | integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1802 | /methods/1.1.2: 1803 | dev: false 1804 | engines: 1805 | node: '>= 0.6' 1806 | resolution: 1807 | integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1808 | /micromatch/3.1.10: 1809 | dependencies: 1810 | arr-diff: 4.0.0 1811 | array-unique: 0.3.2 1812 | braces: 2.3.2 1813 | define-property: 2.0.2 1814 | extend-shallow: 3.0.2 1815 | extglob: 2.0.4 1816 | fragment-cache: 0.2.1 1817 | kind-of: 6.0.2 1818 | nanomatch: 1.2.13 1819 | object.pick: 1.3.0 1820 | regex-not: 1.0.2 1821 | snapdragon: 0.8.2 1822 | to-regex: 3.0.2 1823 | dev: true 1824 | engines: 1825 | node: '>=0.10.0' 1826 | resolution: 1827 | integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1828 | /mime-db/1.40.0: 1829 | dev: false 1830 | engines: 1831 | node: '>= 0.6' 1832 | resolution: 1833 | integrity: sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 1834 | /mime-types/2.1.24: 1835 | dependencies: 1836 | mime-db: 1.40.0 1837 | dev: false 1838 | engines: 1839 | node: '>= 0.6' 1840 | resolution: 1841 | integrity: sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 1842 | /mime/1.6.0: 1843 | dev: false 1844 | engines: 1845 | node: '>=4' 1846 | hasBin: true 1847 | resolution: 1848 | integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1849 | /mimic-fn/1.2.0: 1850 | dev: true 1851 | engines: 1852 | node: '>=4' 1853 | resolution: 1854 | integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 1855 | /minimatch/3.0.4: 1856 | dependencies: 1857 | brace-expansion: 1.1.11 1858 | dev: true 1859 | resolution: 1860 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1861 | /minimist/0.0.8: 1862 | dev: true 1863 | resolution: 1864 | integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1865 | /minimist/1.2.0: 1866 | dev: true 1867 | resolution: 1868 | integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1869 | /mixin-deep/1.3.2: 1870 | dependencies: 1871 | for-in: 1.0.2 1872 | is-extendable: 1.0.1 1873 | dev: true 1874 | engines: 1875 | node: '>=0.10.0' 1876 | resolution: 1877 | integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== 1878 | /mkdirp/0.5.1: 1879 | dependencies: 1880 | minimist: 0.0.8 1881 | dev: true 1882 | hasBin: true 1883 | resolution: 1884 | integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1885 | /morgan/1.9.1: 1886 | dependencies: 1887 | basic-auth: 2.0.1 1888 | debug: 2.6.9 1889 | depd: 1.1.2 1890 | on-finished: 2.3.0 1891 | on-headers: 1.0.2 1892 | dev: false 1893 | engines: 1894 | node: '>= 0.8.0' 1895 | resolution: 1896 | integrity: sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== 1897 | /ms/2.0.0: 1898 | resolution: 1899 | integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1900 | /ms/2.1.1: 1901 | dev: false 1902 | resolution: 1903 | integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1904 | /ms/2.1.2: 1905 | resolution: 1906 | integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1907 | /mute-stream/0.0.7: 1908 | dev: true 1909 | resolution: 1910 | integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 1911 | /nan/2.14.0: 1912 | dev: true 1913 | optional: true 1914 | resolution: 1915 | integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 1916 | /nanomatch/1.2.13: 1917 | dependencies: 1918 | arr-diff: 4.0.0 1919 | array-unique: 0.3.2 1920 | define-property: 2.0.2 1921 | extend-shallow: 3.0.2 1922 | fragment-cache: 0.2.1 1923 | is-windows: 1.0.2 1924 | kind-of: 6.0.2 1925 | object.pick: 1.3.0 1926 | regex-not: 1.0.2 1927 | snapdragon: 0.8.2 1928 | to-regex: 3.0.2 1929 | dev: true 1930 | engines: 1931 | node: '>=0.10.0' 1932 | resolution: 1933 | integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1934 | /natural-compare/1.4.0: 1935 | dev: true 1936 | resolution: 1937 | integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1938 | /negotiator/0.6.2: 1939 | dev: false 1940 | engines: 1941 | node: '>= 0.6' 1942 | resolution: 1943 | integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1944 | /nice-try/1.0.5: 1945 | dev: true 1946 | resolution: 1947 | integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1948 | /node-fetch/2.6.0: 1949 | dev: false 1950 | engines: 1951 | node: 4.x || >=6.0.0 1952 | resolution: 1953 | integrity: sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 1954 | /nodemon/1.19.2: 1955 | dependencies: 1956 | chokidar: 2.1.8 1957 | debug: 3.2.6 1958 | ignore-by-default: 1.0.1 1959 | minimatch: 3.0.4 1960 | pstree.remy: 1.1.7 1961 | semver: 5.7.1 1962 | supports-color: 5.5.0 1963 | touch: 3.1.0 1964 | undefsafe: 2.0.2 1965 | update-notifier: 2.5.0 1966 | dev: true 1967 | engines: 1968 | node: '>=4' 1969 | hasBin: true 1970 | requiresBuild: true 1971 | resolution: 1972 | integrity: sha512-hRLYaw5Ihyw9zK7NF+9EUzVyS6Cvgc14yh8CAYr38tPxJa6UrOxwAQ351GwrgoanHCF0FalQFn6w5eoX/LGdJw== 1973 | /nopt/1.0.10: 1974 | dependencies: 1975 | abbrev: 1.1.1 1976 | dev: true 1977 | hasBin: true 1978 | resolution: 1979 | integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 1980 | /normalize-package-data/2.5.0: 1981 | dependencies: 1982 | hosted-git-info: 2.8.4 1983 | resolve: 1.12.0 1984 | semver: 5.7.1 1985 | validate-npm-package-license: 3.0.4 1986 | dev: true 1987 | resolution: 1988 | integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1989 | /normalize-path/2.1.1: 1990 | dependencies: 1991 | remove-trailing-separator: 1.1.0 1992 | dev: true 1993 | engines: 1994 | node: '>=0.10.0' 1995 | resolution: 1996 | integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 1997 | /normalize-path/3.0.0: 1998 | dev: true 1999 | engines: 2000 | node: '>=0.10.0' 2001 | resolution: 2002 | integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 2003 | /npm-run-path/2.0.2: 2004 | dependencies: 2005 | path-key: 2.0.1 2006 | dev: true 2007 | engines: 2008 | node: '>=4' 2009 | resolution: 2010 | integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 2011 | /oauth/0.9.15: 2012 | dev: false 2013 | resolution: 2014 | integrity: sha1-vR/vr2hslrdUda7VGWQS/2DPucE= 2015 | /object-assign/4.1.1: 2016 | dev: false 2017 | engines: 2018 | node: '>=0.10.0' 2019 | resolution: 2020 | integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 2021 | /object-component/0.0.3: 2022 | dev: false 2023 | resolution: 2024 | integrity: sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= 2025 | /object-copy/0.1.0: 2026 | dependencies: 2027 | copy-descriptor: 0.1.1 2028 | define-property: 0.2.5 2029 | kind-of: 3.2.2 2030 | dev: true 2031 | engines: 2032 | node: '>=0.10.0' 2033 | resolution: 2034 | integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 2035 | /object-inspect/1.6.0: 2036 | dev: true 2037 | resolution: 2038 | integrity: sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== 2039 | /object-keys/1.1.1: 2040 | dev: true 2041 | engines: 2042 | node: '>= 0.4' 2043 | resolution: 2044 | integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 2045 | /object-visit/1.0.1: 2046 | dependencies: 2047 | isobject: 3.0.1 2048 | dev: true 2049 | engines: 2050 | node: '>=0.10.0' 2051 | resolution: 2052 | integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 2053 | /object.assign/4.1.0: 2054 | dependencies: 2055 | define-properties: 1.1.3 2056 | function-bind: 1.1.1 2057 | has-symbols: 1.0.0 2058 | object-keys: 1.1.1 2059 | dev: true 2060 | engines: 2061 | node: '>= 0.4' 2062 | resolution: 2063 | integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 2064 | /object.entries/1.1.0: 2065 | dependencies: 2066 | define-properties: 1.1.3 2067 | es-abstract: 1.14.2 2068 | function-bind: 1.1.1 2069 | has: 1.0.3 2070 | dev: true 2071 | engines: 2072 | node: '>= 0.4' 2073 | resolution: 2074 | integrity: sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== 2075 | /object.pick/1.3.0: 2076 | dependencies: 2077 | isobject: 3.0.1 2078 | dev: true 2079 | engines: 2080 | node: '>=0.10.0' 2081 | resolution: 2082 | integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 2083 | /object.values/1.1.0: 2084 | dependencies: 2085 | define-properties: 1.1.3 2086 | es-abstract: 1.14.2 2087 | function-bind: 1.1.1 2088 | has: 1.0.3 2089 | dev: true 2090 | engines: 2091 | node: '>= 0.4' 2092 | resolution: 2093 | integrity: sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== 2094 | /on-finished/2.3.0: 2095 | dependencies: 2096 | ee-first: 1.1.1 2097 | dev: false 2098 | engines: 2099 | node: '>= 0.8' 2100 | resolution: 2101 | integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 2102 | /on-headers/1.0.2: 2103 | dev: false 2104 | engines: 2105 | node: '>= 0.8' 2106 | resolution: 2107 | integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 2108 | /once/1.4.0: 2109 | dependencies: 2110 | wrappy: 1.0.2 2111 | dev: true 2112 | resolution: 2113 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 2114 | /onetime/2.0.1: 2115 | dependencies: 2116 | mimic-fn: 1.2.0 2117 | dev: true 2118 | engines: 2119 | node: '>=4' 2120 | resolution: 2121 | integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 2122 | /optionator/0.8.2: 2123 | dependencies: 2124 | deep-is: 0.1.3 2125 | fast-levenshtein: 2.0.6 2126 | levn: 0.3.0 2127 | prelude-ls: 1.1.2 2128 | type-check: 0.3.2 2129 | wordwrap: 1.0.0 2130 | dev: true 2131 | engines: 2132 | node: '>= 0.8.0' 2133 | resolution: 2134 | integrity: sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= 2135 | /os-tmpdir/1.0.2: 2136 | dev: true 2137 | engines: 2138 | node: '>=0.10.0' 2139 | resolution: 2140 | integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 2141 | /p-finally/1.0.0: 2142 | dev: true 2143 | engines: 2144 | node: '>=4' 2145 | resolution: 2146 | integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 2147 | /p-limit/1.3.0: 2148 | dependencies: 2149 | p-try: 1.0.0 2150 | dev: true 2151 | engines: 2152 | node: '>=4' 2153 | resolution: 2154 | integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== 2155 | /p-locate/2.0.0: 2156 | dependencies: 2157 | p-limit: 1.3.0 2158 | dev: true 2159 | engines: 2160 | node: '>=4' 2161 | resolution: 2162 | integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 2163 | /p-try/1.0.0: 2164 | dev: true 2165 | engines: 2166 | node: '>=4' 2167 | resolution: 2168 | integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 2169 | /package-json/4.0.1: 2170 | dependencies: 2171 | got: 6.7.1 2172 | registry-auth-token: 3.4.0 2173 | registry-url: 3.1.0 2174 | semver: 5.7.1 2175 | dev: true 2176 | engines: 2177 | node: '>=4' 2178 | resolution: 2179 | integrity: sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= 2180 | /parent-module/1.0.1: 2181 | dependencies: 2182 | callsites: 3.1.0 2183 | dev: true 2184 | engines: 2185 | node: '>=6' 2186 | resolution: 2187 | integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 2188 | /parse-json/2.2.0: 2189 | dependencies: 2190 | error-ex: 1.3.2 2191 | dev: true 2192 | engines: 2193 | node: '>=0.10.0' 2194 | resolution: 2195 | integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 2196 | /parseqs/0.0.5: 2197 | dependencies: 2198 | better-assert: 1.0.2 2199 | dev: false 2200 | resolution: 2201 | integrity: sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= 2202 | /parseuri/0.0.5: 2203 | dependencies: 2204 | better-assert: 1.0.2 2205 | dev: false 2206 | resolution: 2207 | integrity: sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= 2208 | /parseurl/1.3.3: 2209 | dev: false 2210 | engines: 2211 | node: '>= 0.8' 2212 | resolution: 2213 | integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 2214 | /pascalcase/0.1.1: 2215 | dev: true 2216 | engines: 2217 | node: '>=0.10.0' 2218 | resolution: 2219 | integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 2220 | /passport-google-oauth20/2.0.0: 2221 | dependencies: 2222 | passport-oauth2: 1.5.0 2223 | dev: false 2224 | engines: 2225 | node: '>= 0.4.0' 2226 | resolution: 2227 | integrity: sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ== 2228 | /passport-oauth2/1.5.0: 2229 | dependencies: 2230 | base64url: 3.0.1 2231 | oauth: 0.9.15 2232 | passport-strategy: 1.0.0 2233 | uid2: 0.0.3 2234 | utils-merge: 1.0.1 2235 | dev: false 2236 | engines: 2237 | node: '>= 0.4.0' 2238 | resolution: 2239 | integrity: sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ== 2240 | /passport-strategy/1.0.0: 2241 | dev: false 2242 | engines: 2243 | node: '>= 0.4.0' 2244 | resolution: 2245 | integrity: sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= 2246 | /passport/0.4.0: 2247 | dependencies: 2248 | passport-strategy: 1.0.0 2249 | pause: 0.0.1 2250 | dev: false 2251 | engines: 2252 | node: '>= 0.4.0' 2253 | resolution: 2254 | integrity: sha1-xQlWkTR71a07XhgCOMORTRbwWBE= 2255 | /path-dirname/1.0.2: 2256 | dev: true 2257 | resolution: 2258 | integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 2259 | /path-exists/3.0.0: 2260 | dev: true 2261 | engines: 2262 | node: '>=4' 2263 | resolution: 2264 | integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 2265 | /path-is-absolute/1.0.1: 2266 | dev: true 2267 | engines: 2268 | node: '>=0.10.0' 2269 | resolution: 2270 | integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 2271 | /path-is-inside/1.0.2: 2272 | dev: true 2273 | resolution: 2274 | integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 2275 | /path-key/2.0.1: 2276 | dev: true 2277 | engines: 2278 | node: '>=4' 2279 | resolution: 2280 | integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 2281 | /path-parse/1.0.6: 2282 | dev: true 2283 | resolution: 2284 | integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 2285 | /path-to-regexp/0.1.7: 2286 | dev: false 2287 | resolution: 2288 | integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 2289 | /path-type/2.0.0: 2290 | dependencies: 2291 | pify: 2.3.0 2292 | dev: true 2293 | engines: 2294 | node: '>=4' 2295 | resolution: 2296 | integrity: sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= 2297 | /pause/0.0.1: 2298 | dev: false 2299 | resolution: 2300 | integrity: sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= 2301 | /pify/2.3.0: 2302 | dev: true 2303 | engines: 2304 | node: '>=0.10.0' 2305 | resolution: 2306 | integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 2307 | /pify/3.0.0: 2308 | dev: true 2309 | engines: 2310 | node: '>=4' 2311 | resolution: 2312 | integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 2313 | /pkg-dir/2.0.0: 2314 | dependencies: 2315 | find-up: 2.1.0 2316 | dev: true 2317 | engines: 2318 | node: '>=4' 2319 | resolution: 2320 | integrity: sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= 2321 | /posix-character-classes/0.1.1: 2322 | dev: true 2323 | engines: 2324 | node: '>=0.10.0' 2325 | resolution: 2326 | integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 2327 | /prelude-ls/1.1.2: 2328 | dev: true 2329 | engines: 2330 | node: '>= 0.8.0' 2331 | resolution: 2332 | integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 2333 | /prepend-http/1.0.4: 2334 | dev: true 2335 | engines: 2336 | node: '>=0.10.0' 2337 | resolution: 2338 | integrity: sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 2339 | /process-nextick-args/2.0.1: 2340 | dev: true 2341 | resolution: 2342 | integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 2343 | /progress/2.0.3: 2344 | dev: true 2345 | engines: 2346 | node: '>=0.4.0' 2347 | resolution: 2348 | integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 2349 | /proxy-addr/2.0.5: 2350 | dependencies: 2351 | forwarded: 0.1.2 2352 | ipaddr.js: 1.9.0 2353 | dev: false 2354 | engines: 2355 | node: '>= 0.10' 2356 | resolution: 2357 | integrity: sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== 2358 | /pseudomap/1.0.2: 2359 | dev: true 2360 | resolution: 2361 | integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 2362 | /pstree.remy/1.1.7: 2363 | dev: true 2364 | resolution: 2365 | integrity: sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== 2366 | /punycode/2.1.1: 2367 | dev: true 2368 | engines: 2369 | node: '>=6' 2370 | resolution: 2371 | integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 2372 | /qs/6.7.0: 2373 | dev: false 2374 | engines: 2375 | node: '>=0.6' 2376 | resolution: 2377 | integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 2378 | /range-parser/1.2.1: 2379 | dev: false 2380 | engines: 2381 | node: '>= 0.6' 2382 | resolution: 2383 | integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 2384 | /raw-body/2.4.0: 2385 | dependencies: 2386 | bytes: 3.1.0 2387 | http-errors: 1.7.2 2388 | iconv-lite: 0.4.24 2389 | unpipe: 1.0.0 2390 | dev: false 2391 | engines: 2392 | node: '>= 0.8' 2393 | resolution: 2394 | integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 2395 | /rc/1.2.8: 2396 | dependencies: 2397 | deep-extend: 0.6.0 2398 | ini: 1.3.5 2399 | minimist: 1.2.0 2400 | strip-json-comments: 2.0.1 2401 | dev: true 2402 | hasBin: true 2403 | resolution: 2404 | integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 2405 | /read-pkg-up/2.0.0: 2406 | dependencies: 2407 | find-up: 2.1.0 2408 | read-pkg: 2.0.0 2409 | dev: true 2410 | engines: 2411 | node: '>=4' 2412 | resolution: 2413 | integrity: sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= 2414 | /read-pkg/2.0.0: 2415 | dependencies: 2416 | load-json-file: 2.0.0 2417 | normalize-package-data: 2.5.0 2418 | path-type: 2.0.0 2419 | dev: true 2420 | engines: 2421 | node: '>=4' 2422 | resolution: 2423 | integrity: sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= 2424 | /readable-stream/2.3.6: 2425 | dependencies: 2426 | core-util-is: 1.0.2 2427 | inherits: 2.0.4 2428 | isarray: 1.0.0 2429 | process-nextick-args: 2.0.1 2430 | safe-buffer: 5.1.2 2431 | string_decoder: 1.1.1 2432 | util-deprecate: 1.0.2 2433 | dev: true 2434 | resolution: 2435 | integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 2436 | /readdirp/2.2.1: 2437 | dependencies: 2438 | graceful-fs: 4.2.2 2439 | micromatch: 3.1.10 2440 | readable-stream: 2.3.6 2441 | dev: true 2442 | engines: 2443 | node: '>=0.10' 2444 | resolution: 2445 | integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 2446 | /regex-not/1.0.2: 2447 | dependencies: 2448 | extend-shallow: 3.0.2 2449 | safe-regex: 1.1.0 2450 | dev: true 2451 | engines: 2452 | node: '>=0.10.0' 2453 | resolution: 2454 | integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 2455 | /regexpp/2.0.1: 2456 | dev: true 2457 | engines: 2458 | node: '>=6.5.0' 2459 | resolution: 2460 | integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 2461 | /registry-auth-token/3.4.0: 2462 | dependencies: 2463 | rc: 1.2.8 2464 | safe-buffer: 5.2.0 2465 | dev: true 2466 | resolution: 2467 | integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== 2468 | /registry-url/3.1.0: 2469 | dependencies: 2470 | rc: 1.2.8 2471 | dev: true 2472 | engines: 2473 | node: '>=0.10.0' 2474 | resolution: 2475 | integrity: sha1-PU74cPc93h138M+aOBQyRE4XSUI= 2476 | /remove-trailing-separator/1.1.0: 2477 | dev: true 2478 | resolution: 2479 | integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 2480 | /repeat-element/1.1.3: 2481 | dev: true 2482 | engines: 2483 | node: '>=0.10.0' 2484 | resolution: 2485 | integrity: sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 2486 | /repeat-string/1.6.1: 2487 | dev: true 2488 | engines: 2489 | node: '>=0.10' 2490 | resolution: 2491 | integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc= 2492 | /resolve-from/4.0.0: 2493 | dev: true 2494 | engines: 2495 | node: '>=4' 2496 | resolution: 2497 | integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 2498 | /resolve-url/0.2.1: 2499 | dev: true 2500 | resolution: 2501 | integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 2502 | /resolve/1.12.0: 2503 | dependencies: 2504 | path-parse: 1.0.6 2505 | dev: true 2506 | resolution: 2507 | integrity: sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== 2508 | /restore-cursor/2.0.0: 2509 | dependencies: 2510 | onetime: 2.0.1 2511 | signal-exit: 3.0.2 2512 | dev: true 2513 | engines: 2514 | node: '>=4' 2515 | resolution: 2516 | integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 2517 | /ret/0.1.15: 2518 | dev: true 2519 | engines: 2520 | node: '>=0.12' 2521 | resolution: 2522 | integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 2523 | /rimraf/2.6.3: 2524 | dependencies: 2525 | glob: 7.1.4 2526 | dev: true 2527 | hasBin: true 2528 | resolution: 2529 | integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 2530 | /run-async/2.3.0: 2531 | dependencies: 2532 | is-promise: 2.1.0 2533 | dev: true 2534 | engines: 2535 | node: '>=0.12.0' 2536 | resolution: 2537 | integrity: sha1-A3GrSuC91yDUFm19/aZP96RFpsA= 2538 | /rxjs/6.5.3: 2539 | dependencies: 2540 | tslib: 1.10.0 2541 | dev: true 2542 | engines: 2543 | npm: '>=2.0.0' 2544 | resolution: 2545 | integrity: sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== 2546 | /safe-buffer/5.1.2: 2547 | resolution: 2548 | integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2549 | /safe-buffer/5.2.0: 2550 | dev: true 2551 | resolution: 2552 | integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 2553 | /safe-regex/1.1.0: 2554 | dependencies: 2555 | ret: 0.1.15 2556 | dev: true 2557 | resolution: 2558 | integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 2559 | /safer-buffer/2.1.2: 2560 | resolution: 2561 | integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2562 | /semver-diff/2.1.0: 2563 | dependencies: 2564 | semver: 5.7.1 2565 | dev: true 2566 | engines: 2567 | node: '>=0.10.0' 2568 | resolution: 2569 | integrity: sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= 2570 | /semver/5.7.1: 2571 | dev: true 2572 | hasBin: true 2573 | resolution: 2574 | integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 2575 | /semver/6.3.0: 2576 | dev: true 2577 | hasBin: true 2578 | resolution: 2579 | integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 2580 | /send/0.17.1: 2581 | dependencies: 2582 | debug: 2.6.9 2583 | depd: 1.1.2 2584 | destroy: 1.0.4 2585 | encodeurl: 1.0.2 2586 | escape-html: 1.0.3 2587 | etag: 1.8.1 2588 | fresh: 0.5.2 2589 | http-errors: 1.7.3 2590 | mime: 1.6.0 2591 | ms: 2.1.1 2592 | on-finished: 2.3.0 2593 | range-parser: 1.2.1 2594 | statuses: 1.5.0 2595 | dev: false 2596 | engines: 2597 | node: '>= 0.8.0' 2598 | resolution: 2599 | integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 2600 | /serve-static/1.14.1: 2601 | dependencies: 2602 | encodeurl: 1.0.2 2603 | escape-html: 1.0.3 2604 | parseurl: 1.3.3 2605 | send: 0.17.1 2606 | dev: false 2607 | engines: 2608 | node: '>= 0.8.0' 2609 | resolution: 2610 | integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 2611 | /set-value/2.0.1: 2612 | dependencies: 2613 | extend-shallow: 2.0.1 2614 | is-extendable: 0.1.1 2615 | is-plain-object: 2.0.4 2616 | split-string: 3.1.0 2617 | dev: true 2618 | engines: 2619 | node: '>=0.10.0' 2620 | resolution: 2621 | integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== 2622 | /setprototypeof/1.1.1: 2623 | dev: false 2624 | resolution: 2625 | integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 2626 | /shebang-command/1.2.0: 2627 | dependencies: 2628 | shebang-regex: 1.0.0 2629 | dev: true 2630 | engines: 2631 | node: '>=0.10.0' 2632 | resolution: 2633 | integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 2634 | /shebang-regex/1.0.0: 2635 | dev: true 2636 | engines: 2637 | node: '>=0.10.0' 2638 | resolution: 2639 | integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 2640 | /signal-exit/3.0.2: 2641 | dev: true 2642 | resolution: 2643 | integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 2644 | /slice-ansi/2.1.0: 2645 | dependencies: 2646 | ansi-styles: 3.2.1 2647 | astral-regex: 1.0.0 2648 | is-fullwidth-code-point: 2.0.0 2649 | dev: true 2650 | engines: 2651 | node: '>=6' 2652 | resolution: 2653 | integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 2654 | /snapdragon-node/2.1.1: 2655 | dependencies: 2656 | define-property: 1.0.0 2657 | isobject: 3.0.1 2658 | snapdragon-util: 3.0.1 2659 | dev: true 2660 | engines: 2661 | node: '>=0.10.0' 2662 | resolution: 2663 | integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 2664 | /snapdragon-util/3.0.1: 2665 | dependencies: 2666 | kind-of: 3.2.2 2667 | dev: true 2668 | engines: 2669 | node: '>=0.10.0' 2670 | resolution: 2671 | integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 2672 | /snapdragon/0.8.2: 2673 | dependencies: 2674 | base: 0.11.2 2675 | debug: 2.6.9 2676 | define-property: 0.2.5 2677 | extend-shallow: 2.0.1 2678 | map-cache: 0.2.2 2679 | source-map: 0.5.7 2680 | source-map-resolve: 0.5.2 2681 | use: 3.1.1 2682 | dev: true 2683 | engines: 2684 | node: '>=0.10.0' 2685 | resolution: 2686 | integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 2687 | /socket.io-adapter/1.1.1: 2688 | dev: false 2689 | resolution: 2690 | integrity: sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= 2691 | /socket.io-client/2.3.0: 2692 | dependencies: 2693 | backo2: 1.0.2 2694 | base64-arraybuffer: 0.1.5 2695 | component-bind: 1.0.0 2696 | component-emitter: 1.2.1 2697 | debug: 4.1.1 2698 | engine.io-client: 3.4.0 2699 | has-binary2: 1.0.3 2700 | has-cors: 1.1.0 2701 | indexof: 0.0.1 2702 | object-component: 0.0.3 2703 | parseqs: 0.0.5 2704 | parseuri: 0.0.5 2705 | socket.io-parser: 3.3.0 2706 | to-array: 0.1.4 2707 | dev: false 2708 | resolution: 2709 | integrity: sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== 2710 | /socket.io-parser/3.3.0: 2711 | dependencies: 2712 | component-emitter: 1.2.1 2713 | debug: 3.1.0 2714 | isarray: 2.0.1 2715 | dev: false 2716 | resolution: 2717 | integrity: sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== 2718 | /socket.io-parser/3.4.0: 2719 | dependencies: 2720 | component-emitter: 1.2.1 2721 | debug: 4.1.1 2722 | isarray: 2.0.1 2723 | dev: false 2724 | resolution: 2725 | integrity: sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ== 2726 | /socket.io/2.3.0: 2727 | dependencies: 2728 | debug: 4.1.1 2729 | engine.io: 3.4.0 2730 | has-binary2: 1.0.3 2731 | socket.io-adapter: 1.1.1 2732 | socket.io-client: 2.3.0 2733 | socket.io-parser: 3.4.0 2734 | dev: false 2735 | resolution: 2736 | integrity: sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg== 2737 | /source-map-resolve/0.5.2: 2738 | dependencies: 2739 | atob: 2.1.2 2740 | decode-uri-component: 0.2.0 2741 | resolve-url: 0.2.1 2742 | source-map-url: 0.4.0 2743 | urix: 0.1.0 2744 | dev: true 2745 | resolution: 2746 | integrity: sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 2747 | /source-map-url/0.4.0: 2748 | dev: true 2749 | resolution: 2750 | integrity: sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 2751 | /source-map/0.5.7: 2752 | dev: true 2753 | engines: 2754 | node: '>=0.10.0' 2755 | resolution: 2756 | integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 2757 | /spdx-correct/3.1.0: 2758 | dependencies: 2759 | spdx-expression-parse: 3.0.0 2760 | spdx-license-ids: 3.0.5 2761 | dev: true 2762 | resolution: 2763 | integrity: sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 2764 | /spdx-exceptions/2.2.0: 2765 | dev: true 2766 | resolution: 2767 | integrity: sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== 2768 | /spdx-expression-parse/3.0.0: 2769 | dependencies: 2770 | spdx-exceptions: 2.2.0 2771 | spdx-license-ids: 3.0.5 2772 | dev: true 2773 | resolution: 2774 | integrity: sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 2775 | /spdx-license-ids/3.0.5: 2776 | dev: true 2777 | resolution: 2778 | integrity: sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 2779 | /split-string/3.1.0: 2780 | dependencies: 2781 | extend-shallow: 3.0.2 2782 | dev: true 2783 | engines: 2784 | node: '>=0.10.0' 2785 | resolution: 2786 | integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 2787 | /sprintf-js/1.0.3: 2788 | dev: true 2789 | resolution: 2790 | integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 2791 | /static-extend/0.1.2: 2792 | dependencies: 2793 | define-property: 0.2.5 2794 | object-copy: 0.1.0 2795 | dev: true 2796 | engines: 2797 | node: '>=0.10.0' 2798 | resolution: 2799 | integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 2800 | /statuses/1.5.0: 2801 | dev: false 2802 | engines: 2803 | node: '>= 0.6' 2804 | resolution: 2805 | integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 2806 | /string-width/2.1.1: 2807 | dependencies: 2808 | is-fullwidth-code-point: 2.0.0 2809 | strip-ansi: 4.0.0 2810 | dev: true 2811 | engines: 2812 | node: '>=4' 2813 | resolution: 2814 | integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 2815 | /string-width/3.1.0: 2816 | dependencies: 2817 | emoji-regex: 7.0.3 2818 | is-fullwidth-code-point: 2.0.0 2819 | strip-ansi: 5.2.0 2820 | dev: true 2821 | engines: 2822 | node: '>=6' 2823 | resolution: 2824 | integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 2825 | /string.prototype.trimleft/2.1.0: 2826 | dependencies: 2827 | define-properties: 1.1.3 2828 | function-bind: 1.1.1 2829 | dev: true 2830 | engines: 2831 | node: '>= 0.4' 2832 | resolution: 2833 | integrity: sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== 2834 | /string.prototype.trimright/2.1.0: 2835 | dependencies: 2836 | define-properties: 1.1.3 2837 | function-bind: 1.1.1 2838 | dev: true 2839 | engines: 2840 | node: '>= 0.4' 2841 | resolution: 2842 | integrity: sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== 2843 | /string_decoder/1.1.1: 2844 | dependencies: 2845 | safe-buffer: 5.1.2 2846 | dev: true 2847 | resolution: 2848 | integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2849 | /strip-ansi/4.0.0: 2850 | dependencies: 2851 | ansi-regex: 3.0.0 2852 | dev: true 2853 | engines: 2854 | node: '>=4' 2855 | resolution: 2856 | integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2857 | /strip-ansi/5.2.0: 2858 | dependencies: 2859 | ansi-regex: 4.1.0 2860 | dev: true 2861 | engines: 2862 | node: '>=6' 2863 | resolution: 2864 | integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 2865 | /strip-bom/3.0.0: 2866 | dev: true 2867 | engines: 2868 | node: '>=4' 2869 | resolution: 2870 | integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 2871 | /strip-eof/1.0.0: 2872 | dev: true 2873 | engines: 2874 | node: '>=0.10.0' 2875 | resolution: 2876 | integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 2877 | /strip-json-comments/2.0.1: 2878 | dev: true 2879 | engines: 2880 | node: '>=0.10.0' 2881 | resolution: 2882 | integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2883 | /strip-json-comments/3.0.1: 2884 | dev: true 2885 | engines: 2886 | node: '>=8' 2887 | resolution: 2888 | integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== 2889 | /supports-color/5.5.0: 2890 | dependencies: 2891 | has-flag: 3.0.0 2892 | dev: true 2893 | engines: 2894 | node: '>=4' 2895 | resolution: 2896 | integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2897 | /table/5.4.6: 2898 | dependencies: 2899 | ajv: 6.10.2 2900 | lodash: 4.17.15 2901 | slice-ansi: 2.1.0 2902 | string-width: 3.1.0 2903 | dev: true 2904 | engines: 2905 | node: '>=6.0.0' 2906 | resolution: 2907 | integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 2908 | /term-size/1.2.0: 2909 | dependencies: 2910 | execa: 0.7.0 2911 | dev: true 2912 | engines: 2913 | node: '>=4' 2914 | resolution: 2915 | integrity: sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= 2916 | /text-table/0.2.0: 2917 | dev: true 2918 | resolution: 2919 | integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 2920 | /through/2.3.8: 2921 | dev: true 2922 | resolution: 2923 | integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 2924 | /timed-out/4.0.1: 2925 | dev: true 2926 | engines: 2927 | node: '>=0.10.0' 2928 | resolution: 2929 | integrity: sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= 2930 | /tmp/0.0.33: 2931 | dependencies: 2932 | os-tmpdir: 1.0.2 2933 | dev: true 2934 | engines: 2935 | node: '>=0.6.0' 2936 | resolution: 2937 | integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 2938 | /to-array/0.1.4: 2939 | dev: false 2940 | resolution: 2941 | integrity: sha1-F+bBH3PdTz10zaek/zI46a2b+JA= 2942 | /to-object-path/0.3.0: 2943 | dependencies: 2944 | kind-of: 3.2.2 2945 | dev: true 2946 | engines: 2947 | node: '>=0.10.0' 2948 | resolution: 2949 | integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 2950 | /to-regex-range/2.1.1: 2951 | dependencies: 2952 | is-number: 3.0.0 2953 | repeat-string: 1.6.1 2954 | dev: true 2955 | engines: 2956 | node: '>=0.10.0' 2957 | resolution: 2958 | integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 2959 | /to-regex/3.0.2: 2960 | dependencies: 2961 | define-property: 2.0.2 2962 | extend-shallow: 3.0.2 2963 | regex-not: 1.0.2 2964 | safe-regex: 1.1.0 2965 | dev: true 2966 | engines: 2967 | node: '>=0.10.0' 2968 | resolution: 2969 | integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 2970 | /toidentifier/1.0.0: 2971 | dev: false 2972 | engines: 2973 | node: '>=0.6' 2974 | resolution: 2975 | integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 2976 | /touch/3.1.0: 2977 | dependencies: 2978 | nopt: 1.0.10 2979 | dev: true 2980 | hasBin: true 2981 | resolution: 2982 | integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 2983 | /tslib/1.10.0: 2984 | dev: true 2985 | resolution: 2986 | integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 2987 | /type-check/0.3.2: 2988 | dependencies: 2989 | prelude-ls: 1.1.2 2990 | dev: true 2991 | engines: 2992 | node: '>= 0.8.0' 2993 | resolution: 2994 | integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 2995 | /type-is/1.6.18: 2996 | dependencies: 2997 | media-typer: 0.3.0 2998 | mime-types: 2.1.24 2999 | dev: false 3000 | engines: 3001 | node: '>= 0.6' 3002 | resolution: 3003 | integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 3004 | /uid2/0.0.3: 3005 | dev: false 3006 | resolution: 3007 | integrity: sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= 3008 | /undefsafe/2.0.2: 3009 | dependencies: 3010 | debug: 2.6.9 3011 | dev: true 3012 | resolution: 3013 | integrity: sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= 3014 | /union-value/1.0.1: 3015 | dependencies: 3016 | arr-union: 3.1.0 3017 | get-value: 2.0.6 3018 | is-extendable: 0.1.1 3019 | set-value: 2.0.1 3020 | dev: true 3021 | engines: 3022 | node: '>=0.10.0' 3023 | resolution: 3024 | integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== 3025 | /unique-string/1.0.0: 3026 | dependencies: 3027 | crypto-random-string: 1.0.0 3028 | dev: true 3029 | engines: 3030 | node: '>=4' 3031 | resolution: 3032 | integrity: sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= 3033 | /unpipe/1.0.0: 3034 | dev: false 3035 | engines: 3036 | node: '>= 0.8' 3037 | resolution: 3038 | integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 3039 | /unset-value/1.0.0: 3040 | dependencies: 3041 | has-value: 0.3.1 3042 | isobject: 3.0.1 3043 | dev: true 3044 | engines: 3045 | node: '>=0.10.0' 3046 | resolution: 3047 | integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 3048 | /unzip-response/2.0.1: 3049 | dev: true 3050 | engines: 3051 | node: '>=4' 3052 | resolution: 3053 | integrity: sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= 3054 | /upath/1.2.0: 3055 | dev: true 3056 | engines: 3057 | node: '>=4' 3058 | resolution: 3059 | integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== 3060 | /update-notifier/2.5.0: 3061 | dependencies: 3062 | boxen: 1.3.0 3063 | chalk: 2.4.2 3064 | configstore: 3.1.2 3065 | import-lazy: 2.1.0 3066 | is-ci: 1.2.1 3067 | is-installed-globally: 0.1.0 3068 | is-npm: 1.0.0 3069 | latest-version: 3.1.0 3070 | semver-diff: 2.1.0 3071 | xdg-basedir: 3.0.0 3072 | dev: true 3073 | engines: 3074 | node: '>=4' 3075 | resolution: 3076 | integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== 3077 | /uri-js/4.2.2: 3078 | dependencies: 3079 | punycode: 2.1.1 3080 | dev: true 3081 | resolution: 3082 | integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 3083 | /urix/0.1.0: 3084 | dev: true 3085 | resolution: 3086 | integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 3087 | /url-parse-lax/1.0.0: 3088 | dependencies: 3089 | prepend-http: 1.0.4 3090 | dev: true 3091 | engines: 3092 | node: '>=0.10.0' 3093 | resolution: 3094 | integrity: sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= 3095 | /use/3.1.1: 3096 | dev: true 3097 | engines: 3098 | node: '>=0.10.0' 3099 | resolution: 3100 | integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 3101 | /util-deprecate/1.0.2: 3102 | dev: true 3103 | resolution: 3104 | integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 3105 | /utils-merge/1.0.1: 3106 | dev: false 3107 | engines: 3108 | node: '>= 0.4.0' 3109 | resolution: 3110 | integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 3111 | /v8-compile-cache/2.1.0: 3112 | dev: true 3113 | resolution: 3114 | integrity: sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== 3115 | /validate-npm-package-license/3.0.4: 3116 | dependencies: 3117 | spdx-correct: 3.1.0 3118 | spdx-expression-parse: 3.0.0 3119 | dev: true 3120 | resolution: 3121 | integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 3122 | /vary/1.1.2: 3123 | dev: false 3124 | engines: 3125 | node: '>= 0.8' 3126 | resolution: 3127 | integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 3128 | /which/1.3.1: 3129 | dependencies: 3130 | isexe: 2.0.0 3131 | dev: true 3132 | hasBin: true 3133 | resolution: 3134 | integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 3135 | /widest-line/2.0.1: 3136 | dependencies: 3137 | string-width: 2.1.1 3138 | dev: true 3139 | engines: 3140 | node: '>=4' 3141 | resolution: 3142 | integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== 3143 | /wordwrap/1.0.0: 3144 | dev: true 3145 | resolution: 3146 | integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= 3147 | /wrappy/1.0.2: 3148 | dev: true 3149 | resolution: 3150 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 3151 | /write-file-atomic/2.4.3: 3152 | dependencies: 3153 | graceful-fs: 4.2.2 3154 | imurmurhash: 0.1.4 3155 | signal-exit: 3.0.2 3156 | dev: true 3157 | resolution: 3158 | integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== 3159 | /write/1.0.3: 3160 | dependencies: 3161 | mkdirp: 0.5.1 3162 | dev: true 3163 | engines: 3164 | node: '>=4' 3165 | resolution: 3166 | integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 3167 | /ws/6.1.4: 3168 | dependencies: 3169 | async-limiter: 1.0.1 3170 | dev: false 3171 | resolution: 3172 | integrity: sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== 3173 | /ws/7.1.2: 3174 | dependencies: 3175 | async-limiter: 1.0.1 3176 | dev: false 3177 | resolution: 3178 | integrity: sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg== 3179 | /xdg-basedir/3.0.0: 3180 | dev: true 3181 | engines: 3182 | node: '>=4' 3183 | resolution: 3184 | integrity: sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= 3185 | /xmlhttprequest-ssl/1.5.5: 3186 | dev: false 3187 | engines: 3188 | node: '>=0.4.0' 3189 | resolution: 3190 | integrity: sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= 3191 | /yallist/2.1.2: 3192 | dev: true 3193 | resolution: 3194 | integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 3195 | /yeast/0.1.2: 3196 | dev: false 3197 | resolution: 3198 | integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk= 3199 | specifiers: 3200 | cors: ^2.8.5 3201 | dotenv: ^8.1.0 3202 | eslint: ^6.4.0 3203 | eslint-config-airbnb-base: ^14.0.0 3204 | eslint-plugin-import: ^2.18.2 3205 | express: ^4.17.1 3206 | morgan: ^1.9.1 3207 | node-fetch: ^2.6.0 3208 | nodemon: ^1.19.2 3209 | passport: ^0.4.0 3210 | passport-google-oauth20: ^2.0.0 3211 | socket.io: ^2.2.0 3212 | -------------------------------------------------------------------------------- /server/public/callback.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Logging in... 7 | 8 | 16 | 17 | 18 |

Logging in...

19 | 26 | 27 | -------------------------------------------------------------------------------- /server/src/followMessages.js: -------------------------------------------------------------------------------- 1 | module.exports = [ 2 | '{{username}} just followed - glhf!', 3 | '{{username}} just followed. Everyone, look busy!', 4 | '{{username}} followed. You must construct additional pylons.', 5 | 'Ermagherd. {{username}} followed.', 6 | 'Welcome, {{username}}. Stay awhile and listen.', 7 | 'Welcome, {{username}}. We were expecting you ( ͡° ͜ʖ ͡°)', 8 | 'Welcome, {{username}}. We hope you brought pizza.', 9 | 'A wild {{username}} followed.', 10 | 'Swoooosh. {{username}} just followed.', 11 | 'Brace yourselves. {{username}} just followed.', 12 | '{{username}} just followed. Hide your bananas.', 13 | 'Challenger approaching - {{username}} has followed!', 14 | 'Never gonna give {{username}} up. Never gonna let {{username}} down.', 15 | 'Hey! Listen! {{username}} has followed!', 16 | "We've been expecting you {{username}}", 17 | "{{username}} has followed! It's super effective!", 18 | 'Cheers, love! {{username}} followed!', 19 | '{{username}} followed, as the prophecy foretold.', 20 | 'Roses are red, violets are blue, {{username}} followed.', 21 | ]; 22 | -------------------------------------------------------------------------------- /server/src/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const morgan = require('morgan'); 3 | const cors = require('cors'); 4 | const http = require('http'); 5 | const socketIO = require('socket.io'); 6 | 7 | require('dotenv').config(); 8 | 9 | const app = express(); 10 | const server = http.Server(app); 11 | const io = socketIO(server); 12 | 13 | const { router } = require('./routes'); 14 | const socket = require('./socket'); 15 | 16 | socket.setIO(io); 17 | 18 | app.use(morgan('dev')); 19 | app.use(cors()); 20 | 21 | app.get('/', (req, res) => { 22 | res.json({ 23 | message: '🦄🌈✨Hello World! 🌈✨🦄', 24 | }); 25 | }); 26 | 27 | app.use(express.static('public')); 28 | app.use('/', router); 29 | 30 | function notFound(req, res, next) { 31 | res.status(404); 32 | const error = new Error(`Not Found - ${req.originalUrl}`); 33 | next(error); 34 | } 35 | 36 | // eslint-disable-next-line 37 | function errorHandler(err, req, res, next) { 38 | res.status(res.statusCode || 500); 39 | res.json({ 40 | message: err.message, 41 | stack: err.stack, 42 | }); 43 | } 44 | 45 | app.use(notFound); 46 | app.use(errorHandler); 47 | 48 | const port = process.env.PORT || 5000; 49 | server.listen(port, () => { 50 | console.log('Listening on port', port); 51 | }); 52 | -------------------------------------------------------------------------------- /server/src/routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const fetch = require('node-fetch'); 3 | const tmi = require('tmi.js'); 4 | const TPS = require('twitchps'); 5 | const Filter = require('bad-words'); 6 | const db = require('monk')('localhost/chat-manager'); 7 | 8 | const events = db.get('events'); 9 | 10 | const socket = require('../socket'); 11 | const followMessages = require('../followMessages'); 12 | 13 | const router = express.Router(); 14 | 15 | // const MESSAGES_URL = 'https://www.googleapis.com/youtube/v3/liveChat/messages'; 16 | const listening = {}; 17 | const badWordFilter = new Filter({ placeHolder: '💚' }); 18 | 19 | const getRandomFollowMessage = () => followMessages[ 20 | Math.floor(Math.random() * followMessages.length) 21 | ]; 22 | 23 | const youtubeChannelEmotes = { 24 | ':cdgSeedling:': 'https://yt3.ggpht.com/TZQBMEOI6HJIvCAdr_0lt-Y9RuibZpDCb-Gih7xxY2vBVZ93a4c_hKcL5GRKafLaIPvCee3ar3c=w24-h24-c-k-nd', 25 | ':cdgCJsmile:': 'https://yt3.ggpht.com/EHQaFtWsiqyoA8I-xDEUk_GASHbF-IzTolMXctwNXeu9JZ5br9quyWqhY8YOeVWRYKVa__h1ZHw=w24-h24-c-k-nd', 26 | ':cdgCJthink:': 'https://yt3.ggpht.com/A2rEpbhkn2z3Em8aOg1_8dVdvOR_iR7Bd9ChVgtLzfhLOh76jb_KIJj2fJNCRstazTm9fNBWC6Y=w24-h24-c-k-nd', 27 | ':cdgCJpixel:': 'https://yt3.ggpht.com/8VysDeeBLAo5QRLhmka6H0Z9cIuFISC4O6HswiYqHEnhmZAlGqOHN_pM2kyhU04qL79XkOmmvQ=w24-h24-c-k-nd', 28 | ':cdgAlca:': 'https://yt3.ggpht.com/B4CCyqp0k6R6ktde8iHY1w_MJz2qlffNyGH7eJQFP-l2HjBwSGd-SHWvzS8VIiwM-A_zdP6GIjg', 29 | ':cdgCJS:': 'https://yt3.ggpht.com/uVcMtvwFgMErnBjl9C5RA5dIsxyfEH2jhXKvSyHbSdjQUd-IUF68xpI9DJ8N8VJkz704ln1ClQ', 30 | ':cdgBJS:': 'https://yt3.ggpht.com/i5WW1DZXRiQLv4d813kt_4GDYF6OJ5n59vMdq2QQ7eFC-dcFOkWAVn5q1JtJjSTnEsQ2hvPRPg', 31 | ':cdgYerba:': 'https://yt3.ggpht.com/-7EPZ9U7Jhxa0j9ATpaxVPIaBW_h_IFMA8e6-ggm6ed6Cnk9PJ6qQ3oJDbjq3gnFdbtiaoYSQ6s=w48-h48-c-k-nd', 32 | }; 33 | const youtubeEmotes = { 34 | ':yt:': 'https://yt3.ggpht.com/m6yqTzfmHlsoKKEZRSZCkqf6cGSeHtStY4rIeeXLAk4N9GY_yw3dizdZoxTrjLhlY4r_rkz3GA=w24-h24-c-k-nd', 35 | ':oops:': 'https://yt3.ggpht.com/qByNS7xmuQXsb_5hxW2ggxwQZRN8-biWVnnKuL5FK1zudxIeim48zRVPk6DRq_HgaeKltHhm=w24-h24-c-k-nd', 36 | ':buffering:': 'https://yt3.ggpht.com/foWgzjN0ggMAA0CzDPfPZGyuGwv_7D7Nf6FGLAiomW5RRXj0Fs2lDqs2U6L52Z4J2Zb-D5tCUAA=w24-h24-c-k-nd', 37 | ':stayhome:': 'https://yt3.ggpht.com/u3QDxda8o4jrk_b01YtJYKb57l8Zw8ks8mCwGkiZ5hC5cQP_iszbsggxIWquZhuLRBzl5IEM2w=w24-h24-c-k-nd', 38 | ':dothefive:': 'https://yt3.ggpht.com/ktU04FFgK_a6yaXCS1US-ReFkLjD22XllcIMOyBRHuYKLsrxpVxsauV1gSC2RPraMJWXpWcY=w24-h24-c-k-nd', 39 | ':elbowbump:': 'https://yt3.ggpht.com/gt39CIfizoIAce9a8IzjfrADV5CjTbSyFKUlLMXzYILxJRjwAgYQQJ9PXXxnRvrnTec7ZpfHN4k=w24-h24-c-k-nd', 40 | ':goodvibes:': 'https://yt3.ggpht.com/6LPOiCw9bYr3ZXe8AhUoIMpDe_0BglC4mBmi-uC4kLDqDIuPu4J3ErgV0lEhgzXiBluq-I8j=w24-h24-c-k-nd', 41 | ':thanksdoc:': 'https://yt3.ggpht.com/Av7Vf8FxIp0_dQg4cJrPcGmmL7v9RXraOXMp0ZBDN693ewoMTHbbS7D7V3GXpbtZPSNcRLHTQw=w24-h24-c-k-nd', 42 | ':videocall:': 'https://yt3.ggpht.com/bP-4yir3xZBWh-NKO4eGJJglr8m4dRnHrAKAXikaOJ0E5YFNkJ6IyAz3YhHMyukQ1kJNgQAo=w24-h24-c-k-nd', 43 | ':virtualhug:': 'https://yt3.ggpht.com/-o0Di2mE5oaqf_lb_RI3igd0fptmldMWF9kyQpqKWkdAd7M4cT5ZKzDwlmSSXdcBp3zVLJ41yg=w24-h24-c-k-nd', 44 | ':yougotthis:': 'https://yt3.ggpht.com/WxLUGtJzyLd4dcGaWnmcQnw9lTu9BW3_pEuCp6kcM2pxF5p5J28PvcYIXWh6uCm78LxGJVGn9g=w24-h24-c-k-nd', 45 | ':sanitizer:': 'https://yt3.ggpht.com/4PaPj_5jR1lkidYakZ4EkxVqNr0Eqp4g0xvlYt_gZqjTtVeyHBszqf57nB9s6uLh7d2QtEhEWEc=w24-h24-c-k-nd', 46 | ':takeout:': 'https://yt3.ggpht.com/ehUiXdRyvel0hba-BopQoDWTvM9ogZcMPaaAeR6IA9wkocdG21aFVN_IylxRGHtl2mE6L9jg1Do=w24-h24-c-k-nd', 47 | ':hydrate:': 'https://yt3.ggpht.com/Plqt3RM7NBy-R_eA90cIjzMEzo8guwE0KqJ9QBeCkPEWO7FvUqKU_Vq03Lmv9XxMrG6A3Ouwpg=w24-h24-c-k-nd', 48 | ':chillwcat:': 'https://yt3.ggpht.com/ZN5h05TnuFQmbzgGvIfk3bgrV-_Wp8bAbecOqw92s2isI6GLHbYjTyZjcqf0rKQ5t4jBtlumzw=w24-h24-c-k-nd', 49 | ':chillwdog:': 'https://yt3.ggpht.com/jiaOCnfLX0rqed1sISxULaO7T-ktq2GEPizX9snaxvMLxQOMmWXMmAVGyIbYeFS2IvrMpxvFcQ=w24-h24-c-k-nd', 50 | ':elbowcough:': 'https://yt3.ggpht.com/kWObU3wBMdHS43q6-ib2KJ-iC5tWqe7QcEITaNApbXEZfrik9E57_ve_BEPHO86z4Xrv8ikMdW0=w24-h24-c-k-nd', 51 | ':learning:': 'https://yt3.ggpht.com/LiS1vw8KUXmczimKGfA-toRYXOcV1o-9aGSNRF0dGLk15Da2KTAsU-DXkIao-S7-kCkSnJwt=w24-h24-c-k-nd', 52 | ':washhands:': 'https://yt3.ggpht.com/66Fn-0wiOmLDkoKk4FSa9vD0yymtWEulbbQK2x-kTBswQ2auer_2ftvmrJGyMMoqEGNjJtipBA=w24-h24-c-k-nd', 53 | ':socialdist:': 'https://yt3.ggpht.com/0WD780vTqUcS0pFq423D8WRuA_T8NKdTbRztChITI9jgOqOxD2r6dthbu86P6fIggDR6omAPfnQ=w24-h24-c-k-nd', 54 | ':shelterin:': 'https://yt3.ggpht.com/KgaktgJ3tmEFB-gMtjUcuHd6UKq50b-S3PbHEOSUbJG7UddPoJSmrIzysXA77jJp5oRNLWG84Q=w24-h24-c-k-nd', 55 | }; 56 | 57 | const youtubeEmoteRegex = new RegExp(Object.keys(youtubeEmotes).join('|'), 'g'); 58 | const youtubeChannelEmoteRegex = new RegExp(Object.keys(youtubeChannelEmotes).join('|'), 'g'); 59 | 60 | let lastUpdated = {}; 61 | 62 | const bttvEmotes = {}; 63 | let bttvRegex; 64 | const ffzEmotes = {}; 65 | let ffzRegex; 66 | 67 | async function getBttvEmotes() { 68 | const bttvResponse = await fetch('https://api.betterttv.net/3/cached/emotes/global'); 69 | let emotes = await bttvResponse.json(); 70 | const bttvChannelResponse = await fetch('https://api.betterttv.net/3/cached/users/twitch/413856795'); 71 | const { channelEmotes, sharedEmotes } = await bttvChannelResponse.json(); 72 | emotes = emotes.concat(channelEmotes).concat(sharedEmotes); 73 | let regexStr = ''; 74 | emotes.forEach(({ code, id }, i) => { 75 | bttvEmotes[code] = id; 76 | regexStr += code.replace(/\(/, '\\(').replace(/\)/, '\\)') + (i === emotes.length - 1 ? '' : '|'); 77 | }); 78 | bttvRegex = new RegExp(`(?<=^|\\s)(${regexStr})(?=$|\\s)`, 'g'); 79 | console.log(bttvEmotes); 80 | console.log(bttvRegex); 81 | } 82 | 83 | async function getFfzEmotes() { 84 | const ffzResponse = await fetch('https://api.frankerfacez.com/v1/set/global'); 85 | const ffzChannelResponse = await fetch('https://api.frankerfacez.com/v1/room/codinggarden'); 86 | const { sets } = await ffzResponse.json(); 87 | const { sets: channelSets } = await ffzChannelResponse.json(); 88 | let regexStr = ''; 89 | const appendEmotes = ({ name, urls }, i, emotes) => { 90 | ffzEmotes[name] = `https:${Object.values(urls).pop()}`; 91 | regexStr += name + (i === emotes.length - 1 ? '' : '|'); 92 | }; 93 | sets[3].emoticons.forEach(appendEmotes); 94 | regexStr += '|'; 95 | channelSets[609613].emoticons.forEach(appendEmotes); 96 | ffzRegex = new RegExp(`(?<=^|\\s)(${regexStr})(?=$|\\s)`, 'g'); 97 | console.log(ffzEmotes); 98 | console.log(ffzRegex); 99 | } 100 | 101 | getBttvEmotes(); 102 | getFfzEmotes(); 103 | 104 | const countries = new Map(); 105 | 106 | async function getCountries() { 107 | const response = await fetch('https://restcountries.eu/rest/v2/all?fields=alpha2Code;name;altSpellings;'); 108 | const json = await response.json(); 109 | json.forEach((country) => { 110 | const item = { 111 | code: country.alpha2Code.toLowerCase(), 112 | name: country.name, 113 | }; 114 | countries.set(item.code, item); 115 | countries.set(country.name.toLowerCase(), item); 116 | country.altSpellings.forEach((alt) => { 117 | countries.set(alt.toLowerCase(), item); 118 | }); 119 | }); 120 | } 121 | 122 | getCountries(); 123 | 124 | const twitchClient = new tmi.Client({ 125 | options: { 126 | debug: true, 127 | }, 128 | connection: { 129 | reconnect: true, 130 | secure: true, 131 | }, 132 | channels: [process.env.TWITCH_CHANNEL], 133 | }); 134 | 135 | async function updateDB(liveChat) { 136 | try { 137 | await events.update({ 138 | id: liveChat.id, 139 | }, { 140 | $set: { 141 | ...liveChat, 142 | }, 143 | }); 144 | } catch (error) { 145 | console.error(error); 146 | } 147 | } 148 | 149 | // const init_topics = [{ 150 | // topic: 'dashboard-activity-feed.413856795', 151 | // token: process.env.TWITCH_TOKEN, 152 | // }]; 153 | 154 | const init_topics = [{ 155 | topic: 'channel-points-channel-v1.413856795', 156 | token: process.env.TWITCH_TOKEN, 157 | }]; 158 | 159 | async function getLatestMessages(io, liveChatId) { 160 | if (listening[liveChatId]) return; 161 | const nextPageToken = ''; 162 | listening[liveChatId] = true; 163 | 164 | const params = new URLSearchParams({ 165 | liveChatId, 166 | part: 'snippet,authorDetails', 167 | maxResults: 2000, 168 | key: process.env.GOOGLE_API_KEY, 169 | }); 170 | 171 | const liveChat = await events.findOne({ 172 | id: liveChatId, 173 | }); 174 | delete liveChat._id; 175 | 176 | twitchClient.connect(); 177 | 178 | twitchClient.on('messagedeleted', async (channel, username, deletedMessage, userstate) => { 179 | const id = userstate['target-msg-id']; 180 | delete liveChat.messagesById[id]; 181 | const originalMessageIndex = liveChat.messages.findIndex((m) => m.id == id); 182 | liveChat.messages.splice(originalMessageIndex, 1); 183 | io.emit(`message-deleted/${liveChatId}`, id); 184 | await updateDB(liveChat); 185 | }); 186 | const followAuthor = { 187 | channelId: 43, 188 | channelUrl: 'https://twitch.tv/samwisegardener', 189 | displayName: '👋 Follow 👋', 190 | isChatOwner: false, 191 | isChatModerator: false, 192 | isChatSponsor: false, 193 | isChatFounder: false, 194 | isVip: false, 195 | isVerified: false, 196 | profileImageUrl: 'https://i.imgur.com/rD7b0Ki.png', 197 | }; 198 | twitchClient.on('message', async (channel, userstate, message) => { 199 | const channelId = userstate['user-id']; 200 | userstate.badges = userstate.badges || {}; 201 | const isChatModerator = !!(userstate.badges.moderator || userstate.badges.broadcaster); 202 | const shouldUpdate = (message === '!refreshuser') && (isChatModerator || (!lastUpdated[channelId]) || (lastUpdated[channelId] < Date.now() - (30 * 60 * 1000))); 203 | if (shouldUpdate || !liveChat.authorsById[channelId]) { 204 | lastUpdated[channelId] = Date.now(); 205 | const response = await fetch(`https://api.twitch.tv/kraken/users/${channelId}`, { 206 | method: 'GET', 207 | headers: { 208 | 'Client-ID': process.env.TWITCH_CLIENT_ID, 209 | Accept: 'application/vnd.twitchtv.v5+json', 210 | }, 211 | }); 212 | 213 | const json = await response.json(); 214 | console.log(json); 215 | const { 216 | logo: profileImageUrl, 217 | } = json; 218 | 219 | const author = { 220 | channelId, 221 | channelUrl: `https://twitch.tv/${userstate.username}`, 222 | displayName: userstate['display-name'], 223 | isChatOwner: false, 224 | isChatModerator, 225 | isChatSponsor: !!(userstate.badges.founder || userstate.badges.subscriber), 226 | isChatFounder: !!userstate.badges.founder, 227 | isVip: !!userstate.badges.vip, 228 | isVerified: false, 229 | profileImageUrl, 230 | }; 231 | liveChat.authorsById[channelId] = author; 232 | io.emit(`authors/${liveChatId}`, [author]); 233 | await updateDB(liveChat); 234 | } else { 235 | liveChat.authorsById[channelId] = { 236 | ...liveChat.authorsById[channelId], 237 | displayName: userstate['display-name'], 238 | isChatModerator: !!(userstate.badges.moderator || userstate.badges.broadcaster), 239 | isChatSponsor: !!(userstate.badges.founder || userstate.badges.subscriber), 240 | isChatFounder: !!userstate.badges.founder, 241 | isVip: !!userstate.badges.vip, 242 | }; 243 | } 244 | 245 | if (message.startsWith('!team')) { 246 | const team = message.split(' ')[1]; 247 | const author = liveChat.authorsById[channelId]; 248 | if (team && author) { 249 | if (team === 'clear') { 250 | delete author.team; 251 | } else { 252 | author.team = team.toLowerCase(); 253 | } 254 | io.emit(`authors/${liveChatId}`, [author]); 255 | await updateDB(liveChat); 256 | return; 257 | } 258 | } 259 | 260 | if (message.startsWith('!flag') || message.startsWith('!country')) { 261 | const lookup = message.split(' ')[1]; 262 | const author = liveChat.authorsById[channelId]; 263 | if (lookup && author) { 264 | if (lookup === 'clear') { 265 | delete author.country; 266 | delete author.country_name; 267 | } else { 268 | const country = countries.get(lookup.toLowerCase()); 269 | if (country) { 270 | author.country = country.code; 271 | author.country_name = country.name; 272 | } 273 | } 274 | io.emit(`authors/${liveChatId}`, [author]); 275 | await updateDB(liveChat); 276 | return; 277 | } 278 | } 279 | 280 | if (userstate.username === 'streamlabs') { 281 | const followedUsername = (message.match(/Thank you for following on Twitch (.*)!/) || [])[1]; 282 | if (followedUsername) { 283 | const contents = getRandomFollowMessage().replace(/\{\{username\}\}/g, followedUsername); 284 | const event = { 285 | id: userstate.id, 286 | message: contents, 287 | unfilteredMessage: contents, 288 | publishedAt: new Date(+userstate['tmi-sent-ts']), 289 | channelId, 290 | platform: 'twitch', 291 | author: followAuthor, 292 | highlighted: false, 293 | follow: true, 294 | }; 295 | liveChat.messagesById[event.id] = event; 296 | liveChat.messages.push(event); 297 | io.emit(`messages/${liveChatId}`, [event]); 298 | return updateDB(liveChat); 299 | } 300 | } 301 | 302 | let messageWithEmotes = ''; 303 | if (userstate.emotes) { 304 | const emoteIds = Object.keys(userstate.emotes); 305 | const emoteStart = emoteIds.reduce((starts, id) => { 306 | userstate.emotes[id].forEach((startEnd) => { 307 | const [start, end] = startEnd.split('-'); 308 | starts[start] = { 309 | emoteUrl: `![](https://static-cdn.jtvnw.net/emoticons/v1/${id}/2.0)`, 310 | end, 311 | }; 312 | }); 313 | return starts; 314 | }, {}); 315 | const parts = Array.from(message); 316 | for (let i = 0; i < parts.length; i++) { 317 | const char = parts[i]; 318 | const emoteInfo = emoteStart[i]; 319 | if (emoteInfo) { 320 | messageWithEmotes += emoteInfo.emoteUrl; 321 | i = emoteInfo.end; 322 | } else { 323 | messageWithEmotes += char; 324 | } 325 | } 326 | } 327 | 328 | const event = { 329 | id: userstate.id, 330 | message: (liveChat.authorsById[channelId].isChatModerator) ? (messageWithEmotes || message).replace(youtubeChannelEmoteRegex, (emote) => `![](${youtubeChannelEmotes[emote]}#emote)`) : badWordFilter.clean(messageWithEmotes || message), 331 | unfilteredMessage: messageWithEmotes || message, 332 | publishedAt: new Date(+userstate['tmi-sent-ts']), 333 | channelId, 334 | platform: 'twitch', 335 | author: liveChat.authorsById[channelId], 336 | highlighted: userstate['msg-id'] === 'highlighted-message', 337 | }; 338 | 339 | event.message = event.message.replace(bttvRegex, (name) => `![${name}](https://cdn.betterttv.net/emote/${bttvEmotes[name]}/2x#emote)`); 340 | event.message = event.message.replace(ffzRegex, (name) => `![](${ffzEmotes[name]}#emote)`); 341 | event.message = event.message.replace(youtubeEmoteRegex, (emote) => `![](${youtubeEmotes[emote]}#emote)`); 342 | // event.message = cleanMessage(event.message); 343 | liveChat.messagesById[event.id] = event; 344 | liveChat.messages.push(event); 345 | io.emit(`messages/${liveChatId}`, [event]); 346 | await updateDB(liveChat); 347 | }); 348 | 349 | const pubSub = new TPS({ 350 | init_topics, 351 | reconnect: true, 352 | debug: false, 353 | }); 354 | 355 | const rewardAuthor = { 356 | channelId: 42, 357 | channelUrl: 'https://twitch.tv/samwisegardener', 358 | displayName: '🎉 Reward Redemption 🎉', 359 | isChatOwner: false, 360 | isChatModerator: false, 361 | isChatSponsor: false, 362 | isChatFounder: false, 363 | isVip: false, 364 | isVerified: false, 365 | profileImageUrl: 'https://i.imgur.com/pukCZL7.png', 366 | }; 367 | 368 | pubSub.on('channel-points', async (data) => { 369 | try { 370 | const { redemption } = data; 371 | const message = `${redemption.user.display_name || redemption.user.login} has redeemed:

${redemption.reward.title}

${redemption.reward.prompt}

`; 372 | const event = { 373 | id: redemption.id, 374 | message, 375 | unfilteredMessage: message, 376 | publishedAt: new Date(data.timestamp), 377 | channelId: 42, 378 | platform: 'twitch', 379 | author: rewardAuthor, 380 | reward: true, 381 | rewardId: redemption.reward.id, 382 | }; 383 | liveChat.messagesById[event.id] = event; 384 | liveChat.messages.push(event); 385 | io.emit(`messages/${liveChatId}`, [event]); 386 | await updateDB(liveChat); 387 | } catch (error) { 388 | console.log('error sending redemption message', data, error); 389 | } 390 | }); 391 | 392 | // do { 393 | // let url = `${MESSAGES_URL}?${params}`; 394 | // if (nextPageToken) { 395 | // url += `&pageToken=${nextPageToken}`; 396 | // } 397 | // const response = await fetch(url); 398 | // const result = await response.json(); 399 | 400 | // if (response.ok) { 401 | // const newAuthors = []; 402 | 403 | // if (result.items && result.items.length > 0) { 404 | // // eslint-disable-next-line 405 | // const newMessages = result.items.map((item) => { 406 | // const { 407 | // id, 408 | // snippet, 409 | // authorDetails, 410 | // } = item; 411 | 412 | // if (!liveChat.authorsById[authorDetails.channelId]) { 413 | // liveChat.authorsById[authorDetails.channelId] = authorDetails; 414 | // newAuthors.push(authorDetails); 415 | // } 416 | 417 | // const cleanMessage = badWordFilter.clean(snippet.displayMessage); 418 | 419 | // const message = { 420 | // id, 421 | // message: (authorDetails.isChatOwner || authorDetails.isChatModerator || authorDetails.isChatSponsor) ? cleanMessage.replace(youtubeChannelEmoteRegex, (emote) => `![](${youtubeChannelEmotes[emote]}#emote)`) : cleanMessage, 422 | // unfilteredMessage: snippet.displayMessage, 423 | // publishedAt: snippet.publishedAt, 424 | // channelId: authorDetails.channelId, 425 | // platform: 'youtube', 426 | // author: authorDetails, 427 | // }; 428 | 429 | // message.message = message.message.replace(bttvRegex, (name) => `![${name}](https://cdn.betterttv.net/emote/${bttvEmotes[name]}/2x#emote)`); 430 | // message.message = message.message.replace(ffzRegex, (name) => `![](${ffzEmotes[name]}#emote)`); 431 | // message.message = message.message.replace(youtubeEmoteRegex, (emote) => `![](${youtubeEmotes[emote]}#emote)`); 432 | 433 | // if (snippet.type === 'superChatEvent') { 434 | // message.superChat = snippet.superChatDetails; 435 | // } 436 | 437 | // liveChat.messagesById[id] = message; 438 | // return message; 439 | // }); 440 | 441 | // if (newMessages.length > 0) { 442 | // newMessages.sort((a, b) => +new Date(a.publishedAt) - +new Date(b.publishedAt)); 443 | // liveChat.messages = liveChat.messages.concat(newMessages); 444 | // if (newAuthors.length > 0) { 445 | // io.emit(`authors/${liveChatId}`, newAuthors); 446 | // } 447 | // io.emit(`messages/${liveChatId}`, newMessages); 448 | // } 449 | // await updateDB(liveChat); 450 | // } 451 | // } else { 452 | // console.error(JSON.stringify(result, null, 2)); 453 | // } 454 | 455 | // nextPageToken = result.nextPageToken; 456 | 457 | // await new Promise((resolve) => { 458 | // setTimeout(resolve, result.pollingIntervalMillis); 459 | // }); 460 | // } while (nextPageToken); 461 | } 462 | 463 | router.get('/messages', async (req, res, next) => { 464 | const { 465 | id, 466 | } = req.query; 467 | if (!id) return next(new Error('Invalid chat id.')); 468 | let liveChat = await events.findOne({ 469 | id, 470 | }); 471 | if (!liveChat) { 472 | liveChat = await events.insert({ 473 | id, 474 | messages: [], 475 | messagesById: {}, 476 | authorsById: {}, 477 | team: {}, 478 | }); 479 | } 480 | if (!listening[id]) { 481 | getLatestMessages(socket.io, id); 482 | } 483 | return res.json(liveChat.messages); 484 | }); 485 | 486 | router.get('/authors', async (req, res, next) => { 487 | const { 488 | id, 489 | } = req.query; 490 | if (!id) return next(new Error('Invalid chat id.')); 491 | let liveChat = await events.findOne({ 492 | id, 493 | }); 494 | if (!liveChat) { 495 | liveChat = await events.insert({ 496 | id, 497 | messages: [], 498 | messagesById: {}, 499 | authorsById: {}, 500 | team: {}, 501 | }); 502 | } 503 | if (!listening[id]) { 504 | getLatestMessages(socket.io, id); 505 | } 506 | return res.json(liveChat.authorsById); 507 | }); 508 | 509 | async function getEvents(eventType) { 510 | const params = new URLSearchParams({ 511 | part: 'snippet', 512 | channelId: process.env.YOUTUBE_CHANNEL_ID, 513 | key: process.env.GOOGLE_API_KEY, 514 | type: 'video', 515 | eventType, 516 | }); 517 | 518 | const url = `https://www.googleapis.com/youtube/v3/search?${params}`; 519 | const response = await fetch(url); 520 | const json = await response.json(); 521 | console.log(json); 522 | return json; 523 | } 524 | 525 | router.get('/streams', async (req, res) => { 526 | const [liveEvents, upcomingEvents] = await Promise.all([ 527 | getEvents('live'), 528 | getEvents('upcoming'), 529 | ]); 530 | 531 | const events = [].concat(liveEvents.items || [], upcomingEvents.items || []); 532 | 533 | if (events.length) { 534 | const liveStreams = await Promise.all( 535 | events.map(async (video) => { 536 | const videoParams = new URLSearchParams({ 537 | part: 'liveStreamingDetails', 538 | id: video.id.videoId, 539 | key: process.env.GOOGLE_API_KEY, 540 | }); 541 | const videoUrl = `https://www.googleapis.com/youtube/v3/videos?${videoParams}`; 542 | const videoResponse = await fetch(videoUrl); 543 | const data = await videoResponse.json(); 544 | // eslint-disable-next-line 545 | video.snippet.liveChatId = data.items[0].liveStreamingDetails.activeLiveChatId; 546 | return { 547 | ...video, 548 | ...video.id, 549 | ...data.items[0], 550 | }; 551 | }), 552 | ); 553 | res.json(liveStreams); 554 | } else { 555 | res.json([]); 556 | } 557 | }); 558 | 559 | module.exports = { 560 | getLatestMessages, 561 | router, 562 | }; 563 | -------------------------------------------------------------------------------- /server/src/socket.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | io: null, 3 | setIO(io) { 4 | this.io = io; 5 | } 6 | }; 7 | --------------------------------------------------------------------------------