├── .firebaserc ├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── firebase.json ├── functions ├── index.js ├── package.json └── yarn.lock └── tutorial ├── Datastore1.jpg ├── Datastore2.jpg ├── Firestore1.png ├── FormattingDocument.png ├── FormattingResult.png └── index.md /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 DoiT International 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | create-export: 2 | # Create PubSub topic 3 | gcloud --project=$$PROJECT pubsub topics create gslack 4 | 5 | # Create logging export with PubSub sink 6 | gcloud --project=$$PROJECT logging sinks create gslack \ 7 | pubsub.googleapis.com/projects/$$PROJECT/topics/gslack \ 8 | --log-filter "logName=projects/$$PROJECT/logs/cloudaudit.googleapis.com%2Factivity" 9 | 10 | # Set permissions on the new topic 11 | gcloud --project=$$PROJECT projects add-iam-policy-binding $$PROJECT \ 12 | --member=$$(gcloud --project $$PROJECT --format="value(writer_identity)" logging sinks describe gslack) \ 13 | --role='roles/pubsub.publisher' 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gSlack 2 | 3 | ## Prerequisites 4 | 5 | - Have a Google Cloud Platform project with billing & Cloud Build API enabled 6 | - Have access to a user with `Owner` role on the project 7 | - Have `gcloud` SDK and CLI installed on your machine ([quickstart](https://cloud.google.com/sdk/docs/quickstarts)) 8 | - Have [`firebase-tools`](https://firebase.google.com/docs/cli/) CLI installed on your machine 9 | 10 | ## Generate Slack API Token 11 | 12 | - Go to [https://.slack.com/apps/new/A0F7YS25R-bots]() 13 | - Enter a name for the bot to post with. (i.e. gcp-alert-service) 14 | - Click `Add bot integration`. 15 | - Wait until the UI displays the `API Token` and copy the string (i.e. xxxx-yyyyyyyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzz) 16 | 17 | ## Initialize Firebase environment 18 | 19 | - Make sure you are logged in with your `firebase` CLI tool. 20 | - Edit `` in [`.firebaserc`](.firebaserc) with your real project ID. 21 | - Run `$ firebase functions:config:set gslack.api_token="xxxx-yyyyyyyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzz"` (Replace with your slack API token) 22 | 23 | ## Deployment 24 | 25 | - Make sure your `gcloud` SDK and CLI environment is authenticated against the requested GCP project with a user that has Owner permissions. 26 | - Run `$ make create-export PROJECT=` - Replace `` with your project ID (Run once on the first deployment). 27 | - Deploy the function, run: `$ yarn deploy` or `$ npm run deploy` from the [functions](functions) dir. 28 | 29 | ## Firestore configuration 30 | 31 | - Navigate to your project's Firestore console. 32 | - Create a new collection named `"gSlack"` in Firestore. 33 | - Add documents to the new collection with the following schema: 34 | 35 | | Field Name | Type | Description | 36 | | ------------- | ------------- | ------------- | 37 | | channel | string | The destination slack channel, i.e. `general` or `@username` for private messages | 38 | | disabled | bool | Whether the rule is disabled; disabled rules will not be evaluated by the function | 39 | | test | string | Must be a a valid JS expression that returns a boolean. If it returns true the test passes. e.g. `$.protoPayload.serviceName==='cloudfunctions.googleapis.com'` | 40 | | message | string | Must be a a valid JS string template. It will be evaluated to produce the message. e.g. `This is the logname: ${$.logName}` | 41 | 42 | - Each document is a rule that will be evaluted by the function and will be posted to the corresponding slack channel if the evaluated test expression passes as `true`. 43 | - If you want to temporary disable a rule, simply update the `disabled` field to `true`. 44 | 45 | ## Function Message Payload Example 46 | 47 | The information received by the function for the log entry is something like this: 48 | 49 | ``` 50 | { 51 | protoPayload: { 52 | @type: "type.googleapis.com/google.cloud.audit.AuditLog" 53 | status: { 54 | } 55 | authenticationInfo: { 56 | principalEmail: "...@doit-intl.com" 57 | } 58 | requestMetadata: { 59 | callerIp: "..." 60 | callerSuppliedUserAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36,gzip(gfe)" 61 | } 62 | serviceName: "storage.googleapis.com" 63 | methodName: "storage.buckets.create" 64 | authorizationInfo: [ 65 | 0: { 66 | permission: "storage.buckets.create" 67 | granted: true 68 | } 69 | ] 70 | resourceName: "projects/_/buckets/bababab-vadim" 71 | serviceData: { 72 | @type: "type.googleapis.com/google.iam.v1.logging.AuditData" 73 | policyDelta: { 74 | bindingDeltas: [ 75 | 0: { 76 | action: "ADD" 77 | role: "roles/storage.legacyBucketOwner" 78 | member: "projectOwner:..." 79 | } 80 | 1: { 81 | action: "ADD" 82 | role: "roles/storage.legacyBucketOwner" 83 | member: "projectEditor:..." 84 | } 85 | 2: { 86 | action: "ADD" 87 | role: "roles/storage.legacyBucketReader" 88 | member: "projectViewer:..." 89 | } 90 | ] 91 | } 92 | } 93 | request: { 94 | defaultObjectAcl: { 95 | bindings: [ 96 | 0: { 97 | members: [ 98 | 0: "projectOwner:..." 99 | 1: "projectEditor:..." 100 | ] 101 | role: "roles/storage.legacyObjectOwner" 102 | } 103 | 1: { 104 | members: [ 105 | 0: "projectViewer:..." 106 | ] 107 | role: "roles/storage.legacyObjectReader" 108 | } 109 | ] 110 | @type: "type.googleapis.com/google.iam.v1.Policy" 111 | } 112 | } 113 | } 114 | insertId: "552D5EE8A9ED9.A65A379.EF01047D" 115 | resource: { 116 | type: "gcs_bucket" 117 | labels: { 118 | storage_class: "" 119 | location: "US-CENTRAL1" 120 | bucket_name: "bababab-vadim" 121 | project_id: "..." 122 | } 123 | } 124 | timestamp: "2017-06-26T05:07:46.673Z" 125 | severity: "NOTICE" 126 | logName: "projects/.../logs/cloudaudit.googleapis.com%2Factivity" 127 | receiveTimestamp: "2017-06-26T05:07:54.586745618Z" 128 | } 129 | ``` 130 | 131 | ## Fiestore Rules examples 132 | 133 | ### Google Cloud Storage Bucket Created/Deleted 134 | 135 | * Display bucket name, created/deleted, location, project and by who. 136 | 137 | * Document ID: `bucket-create-delete`: 138 | 139 | * Document Fields: 140 | 141 | ``` 142 | channel: "general", 143 | disabled: false, 144 | test: "$.protoPayload.serviceName==='storage.googleapis.com' && ( $.protoPayload.methodName==='storage.buckets.create' || $.protoPayload.methodName==='storage.buckets.delete')", 145 | message: "Bucket '${$.resource.labels.bucket_name}' was ${$.protoPayload.methodName==='storage.buckets.create'?'created':'deleted'} at location '${$.resource.labels.location}' by '${$.protoPayload.authenticationInfo.principalEmail}' in project '${$.resource.labels.project_id}'", 146 | attachments: null 147 | 148 | ``` 149 | 150 | * [Slack Message Formatting](https://api.slack.com/docs/message-formatting) 151 | 152 | Use the attachments field (type of array of maps) to add Slack message attachments instead of the default text message. 153 | 154 | One of 'message' or 'attachments' fields must not be null. 155 | 156 | ``` 157 | channel: "general", 158 | disabled: false, 159 | test: "$.protoPayload.serviceName==='storage.googleapis.com' && ( $.protoPayload.methodName==='storage.buckets.create' || $.protoPayload.methodName==='storage.buckets.delete')", 160 | message: null, 161 | attachments: [ 162 | { 163 | title: "Cloud Storage Notification", 164 | color: "${$.protoPayload.methodName==='storage.buckets.create'?'#36a64f':'#de1738'}", 165 | fields: [ 166 | { 167 | short: true, 168 | title: "Operation", 169 | value: "${$.protoPayload.methodName==='storage.buckets.create'?'Create':'Delete'}" 170 | }, 171 | { 172 | short: true, 173 | title: "Resource Name", 174 | value: "${$.resource.labels.bucket_name}" 175 | }, 176 | { 177 | short: true, 178 | title: "Project ID", 179 | value: "${$.resource.labels.project_id}" 180 | }, 181 | { 182 | short: true, 183 | title: "User", 184 | value: "${$.protoPayload.authenticationInfo.principalEmail}" 185 | }, 186 | ] 187 | } 188 | ] 189 | ``` 190 | 191 | ![alt text](./tutorial/FormattingDocument.png) 192 | ![alt text](./tutorial/FormattingResult.png) 193 | 194 | 195 | ### Google Compute Engine Instance Started/Stopped 196 | 197 | * Display instance name, started/stopped, zone, project and by who. 198 | 199 | * Document ID: `gce-start-stop`: 200 | 201 | * Document Fields: 202 | 203 | ``` 204 | channel: "devops", 205 | disabled: false, 206 | test: "$.protoPayload.serviceName==='compute.googleapis.com' && ( $.protoPayload.methodName==='v1.compute.instances.start' || $.protoPayload.methodName==='v1.compute.instances.stop') && $.operation.last", 207 | message: "Instance '${$.protoPayload.resourceName.split('/').slice(-1)[0]}' was ${$.protoPayload.methodName==='v1.compute.instances.start'?'started':'stopped'} at zone '${$.resource.labels.zone}' by '${$.protoPayload.authenticationInfo.principalEmail}' in project '${$.resource.labels.project_id}'", 208 | attachments: null 209 | ``` 210 | 211 | ### Google App Engine New Version Deployed 212 | 213 | * Display project, module, version and by who. 214 | 215 | * Document ID: `gae-new-version`: 216 | 217 | * Document Fields: 218 | 219 | ``` 220 | channel: "@user", 221 | disabled: false, 222 | test: "$.protoPayload.serviceName==='appengine.googleapis.com' && $.protoPayload.methodName==='google.appengine.v1.Versions.CreateVersion' && $.operation.last", 223 | message: "Google AppEngine version created with version ID '${$.resource.labels.version_id}' for module '${$.resource.labels.module_id}' by '${$.protoPayload.authenticationInfo.principalEmail}' in project '${$.resource.labels.project_id}'", 224 | attachments: null 225 | ``` 226 | 227 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /functions/index.js: -------------------------------------------------------------------------------- 1 | const functions = require("firebase-functions"); 2 | const admin = require("firebase-admin"); 3 | const { WebClient } = require("@slack/web-api"); 4 | 5 | admin.initializeApp(functions.config().firebase); 6 | 7 | const web = new WebClient(functions.config().gslack.api_token); 8 | const runtimeOpts = { 9 | timeoutSeconds: 30, 10 | memory: "256MB" 11 | }; 12 | 13 | const rules = []; 14 | admin 15 | .firestore() 16 | .collection("gSlack") 17 | .where("disabled", "==", false) 18 | .onSnapshot(querySnapshot => { 19 | querySnapshot.docChanges().forEach(change => { 20 | const rule = { 21 | id: change.doc.id, 22 | ...change.doc.data() 23 | }; 24 | if (change.type === "added") { 25 | rules.splice(change.newIndex, 0, rule); 26 | } 27 | if (change.type === "modified") { 28 | rules.splice(change.newIndex, 1, rule); 29 | } 30 | if (change.type === "removed") { 31 | rules.splice(change.oldIndex, 1); 32 | } 33 | }); 34 | }); 35 | 36 | function evalTest(data, test) { 37 | try { 38 | $ = data; 39 | return eval(`'use strict';(${test});`); 40 | } catch (err) { 41 | console.error(err, test); 42 | return false; 43 | } 44 | } 45 | 46 | function evalMessageText(data, message) { 47 | if (message) { 48 | try { 49 | $ = data; 50 | return eval(`'use strict';\`${message}\`;`); 51 | } catch (err) { 52 | console.error(err, message); 53 | return `Error: ${err} in rule message:\n ${message}`; 54 | } 55 | } 56 | } 57 | 58 | function evalMessageAttachments(data, attachments) { 59 | if (attachments) { 60 | try { 61 | $ = data; 62 | return JSON.parse( 63 | eval(`'use strict';\`${JSON.stringify(attachments)}\`;`) 64 | ); 65 | } catch (err) { 66 | console.error(err, attachments); 67 | return [ 68 | { 69 | title: "GSLACK ERROR", 70 | text: `Error: ${err} in rule attachments` 71 | } 72 | ]; 73 | } 74 | } 75 | } 76 | 77 | function sendSlack(data, rule) { 78 | return web.chat.postMessage({ 79 | as_user: true, 80 | channel: rule.channel, 81 | text: evalMessageText(data, rule.message), 82 | attachments: evalMessageAttachments(data, rule.attachments) 83 | }); 84 | } 85 | 86 | exports.gSlack = functions 87 | .runWith(runtimeOpts) 88 | .pubsub.topic("gslack") 89 | .onPublish((message, context) => { 90 | const data = message.json; 91 | return Promise.all( 92 | rules.map(rule => { 93 | if (evalTest(data, rule.test)) { 94 | return sendSlack(data, rule); 95 | } 96 | return Promise.resolve(); 97 | }) 98 | ); 99 | }); 100 | -------------------------------------------------------------------------------- /functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gslack", 3 | "description": "", 4 | "engines": { 5 | "node": "10" 6 | }, 7 | "scripts": { 8 | "serve": "firebase serve --only functions", 9 | "shell": "firebase functions:shell", 10 | "start": "npm run shell", 11 | "deploy": "firebase deploy --only functions:gSlack", 12 | "logs": "firebase functions:log" 13 | }, 14 | "dependencies": { 15 | "@slack/web-api": "^5.0.1", 16 | "firebase-admin": "~9.2.0", 17 | "firebase-functions": "^3.11.0" 18 | }, 19 | "private": true 20 | } 21 | -------------------------------------------------------------------------------- /functions/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@firebase/app-types@0.6.1": 6 | version "0.6.1" 7 | resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.6.1.tgz#dcbd23030a71c0c74fc95d4a3f75ba81653850e9" 8 | integrity sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg== 9 | 10 | "@firebase/auth-interop-types@0.1.5": 11 | version "0.1.5" 12 | resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz#9fc9bd7c879f16b8d1bb08373a0f48c3a8b74557" 13 | integrity sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw== 14 | 15 | "@firebase/component@0.1.19": 16 | version "0.1.19" 17 | resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.19.tgz#bd2ac601652c22576b574c08c40da245933dbac7" 18 | integrity sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ== 19 | dependencies: 20 | "@firebase/util" "0.3.2" 21 | tslib "^1.11.1" 22 | 23 | "@firebase/database-types@0.5.2", "@firebase/database-types@^0.5.2": 24 | version "0.5.2" 25 | resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.5.2.tgz#23bec8477f84f519727f165c687761e29958b63c" 26 | integrity sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g== 27 | dependencies: 28 | "@firebase/app-types" "0.6.1" 29 | 30 | "@firebase/database@^0.6.10": 31 | version "0.6.13" 32 | resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.6.13.tgz#b96fe0c53757dd6404ee085fdcb45c0f9f525c17" 33 | integrity sha512-NommVkAPzU7CKd1gyehmi3lz0K78q0KOfiex7Nfy7MBMwknLm7oNqKovXSgQV1PCLvKXvvAplDSFhDhzIf9obA== 34 | dependencies: 35 | "@firebase/auth-interop-types" "0.1.5" 36 | "@firebase/component" "0.1.19" 37 | "@firebase/database-types" "0.5.2" 38 | "@firebase/logger" "0.2.6" 39 | "@firebase/util" "0.3.2" 40 | faye-websocket "0.11.3" 41 | tslib "^1.11.1" 42 | 43 | "@firebase/logger@0.2.6": 44 | version "0.2.6" 45 | resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.2.6.tgz#3aa2ca4fe10327cabf7808bd3994e88db26d7989" 46 | integrity sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw== 47 | 48 | "@firebase/util@0.3.2": 49 | version "0.3.2" 50 | resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.3.2.tgz#87de27f9cffc2324651cabf6ec133d0a9eb21b52" 51 | integrity sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g== 52 | dependencies: 53 | tslib "^1.11.1" 54 | 55 | "@google-cloud/common@^3.3.0": 56 | version "3.4.0" 57 | resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-3.4.0.tgz#8951d0dc94c9dfd8af2b49ed125984dc71f1de6b" 58 | integrity sha512-bVMQlK4aZEeopo2oJwDUJiBhPVjRRQHfFCCv9JowmKS3L//PBHNDJzC/LxJixGZEU3fh3YXkUwm67JZ5TBCCNQ== 59 | dependencies: 60 | "@google-cloud/projectify" "^2.0.0" 61 | "@google-cloud/promisify" "^2.0.0" 62 | arrify "^2.0.1" 63 | duplexify "^4.1.1" 64 | ent "^2.2.0" 65 | extend "^3.0.2" 66 | google-auth-library "^6.0.0" 67 | retry-request "^4.1.1" 68 | teeny-request "^7.0.0" 69 | 70 | "@google-cloud/firestore@^4.0.0": 71 | version "4.4.0" 72 | resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-4.4.0.tgz#6cdbd462f32a8f94e138c57ef81195156c79e680" 73 | integrity sha512-nixsumd4C7eL+hHEgyihspzhBBNe3agsvNFRX0xfqO3uR/6ro4CUj9XdcCvdnSSd3yTyqKfdBSRK2fEj1jIbYg== 74 | dependencies: 75 | fast-deep-equal "^3.1.1" 76 | functional-red-black-tree "^1.0.1" 77 | google-gax "^2.2.0" 78 | 79 | "@google-cloud/paginator@^3.0.0": 80 | version "3.0.5" 81 | resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-3.0.5.tgz#9d6b96c421a89bd560c1bc2c197c7611ef21db6c" 82 | integrity sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw== 83 | dependencies: 84 | arrify "^2.0.0" 85 | extend "^3.0.2" 86 | 87 | "@google-cloud/projectify@^2.0.0": 88 | version "2.0.1" 89 | resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-2.0.1.tgz#13350ee609346435c795bbfe133a08dfeab78d65" 90 | integrity sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ== 91 | 92 | "@google-cloud/promisify@^2.0.0": 93 | version "2.0.3" 94 | resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-2.0.3.tgz#f934b5cdc939e3c7039ff62b9caaf59a9d89e3a8" 95 | integrity sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw== 96 | 97 | "@google-cloud/storage@^5.3.0": 98 | version "5.3.0" 99 | resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-5.3.0.tgz#cf86683911cce68829e46de544abb41947d29da2" 100 | integrity sha512-3t5UF3SZ14Bw2kcBHubCai6EIugU2GnQOstYWVSFuoO8IJ94RAaIOPq/dtexvQbUTpBTAGpd5smVR9WPL1mJVw== 101 | dependencies: 102 | "@google-cloud/common" "^3.3.0" 103 | "@google-cloud/paginator" "^3.0.0" 104 | "@google-cloud/promisify" "^2.0.0" 105 | arrify "^2.0.0" 106 | compressible "^2.0.12" 107 | concat-stream "^2.0.0" 108 | date-and-time "^0.14.0" 109 | duplexify "^3.5.0" 110 | extend "^3.0.2" 111 | gaxios "^3.0.0" 112 | gcs-resumable-upload "^3.1.0" 113 | hash-stream-validation "^0.2.2" 114 | mime "^2.2.0" 115 | mime-types "^2.0.8" 116 | onetime "^5.1.0" 117 | p-limit "^3.0.1" 118 | pumpify "^2.0.0" 119 | snakeize "^0.1.0" 120 | stream-events "^1.0.1" 121 | xdg-basedir "^4.0.0" 122 | 123 | "@grpc/grpc-js@~1.1.1": 124 | version "1.1.7" 125 | resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.1.7.tgz#d3d71c6da95397e2d63895ccc4a05e7572f7b7e6" 126 | integrity sha512-EuxMstI0u778dp0nk6Fe3gHXYPeV6FYsWOe0/QFwxv1NQ6bc5Wl/0Yxa4xl9uBlKElL6AIxuASmSfu7KEJhqiw== 127 | dependencies: 128 | "@grpc/proto-loader" "^0.6.0-pre14" 129 | "@types/node" "^12.12.47" 130 | google-auth-library "^6.0.0" 131 | semver "^6.2.0" 132 | 133 | "@grpc/proto-loader@^0.5.1": 134 | version "0.5.5" 135 | resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.5.tgz#6725e7a1827bdf8e92e29fbf4e9ef0203c0906a9" 136 | integrity sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ== 137 | dependencies: 138 | lodash.camelcase "^4.3.0" 139 | protobufjs "^6.8.6" 140 | 141 | "@grpc/proto-loader@^0.6.0-pre14": 142 | version "0.6.0-pre9" 143 | resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.0-pre9.tgz#0c6fe42f6c5ef9ce1b3cef7be64d5b09d6fe4d6d" 144 | integrity sha512-oM+LjpEjNzW5pNJjt4/hq1HYayNeQT+eGrOPABJnYHv7TyNPDNzkQ76rDYZF86X5swJOa4EujEMzQ9iiTdPgww== 145 | dependencies: 146 | "@types/long" "^4.0.1" 147 | lodash.camelcase "^4.3.0" 148 | long "^4.0.0" 149 | protobufjs "^6.9.0" 150 | yargs "^15.3.1" 151 | 152 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 153 | version "1.1.2" 154 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 155 | integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= 156 | 157 | "@protobufjs/base64@^1.1.2": 158 | version "1.1.2" 159 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 160 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 161 | 162 | "@protobufjs/codegen@^2.0.4": 163 | version "2.0.4" 164 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 165 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 166 | 167 | "@protobufjs/eventemitter@^1.1.0": 168 | version "1.1.0" 169 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 170 | integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= 171 | 172 | "@protobufjs/fetch@^1.1.0": 173 | version "1.1.0" 174 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 175 | integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= 176 | dependencies: 177 | "@protobufjs/aspromise" "^1.1.1" 178 | "@protobufjs/inquire" "^1.1.0" 179 | 180 | "@protobufjs/float@^1.0.2": 181 | version "1.0.2" 182 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 183 | integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= 184 | 185 | "@protobufjs/inquire@^1.1.0": 186 | version "1.1.0" 187 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 188 | integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= 189 | 190 | "@protobufjs/path@^1.1.2": 191 | version "1.1.2" 192 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 193 | integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= 194 | 195 | "@protobufjs/pool@^1.1.0": 196 | version "1.1.0" 197 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 198 | integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= 199 | 200 | "@protobufjs/utf8@^1.1.0": 201 | version "1.1.0" 202 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 203 | integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= 204 | 205 | "@slack/logger@^1.0.0": 206 | version "1.0.0" 207 | resolved "https://registry.yarnpkg.com/@slack/logger/-/logger-1.0.0.tgz#e529974c7111f8a62d794a79cd807eee1628088b" 208 | integrity sha512-QDYhQR/58xKfB5iquvQwfpxPsmKPP/5SuDp8hRhZeUluCHsP1qBCOc3sW2Xb3cydxK0PAEnkLbBJf/ezsGwtlA== 209 | dependencies: 210 | "@types/node" ">=8.9.0" 211 | 212 | "@slack/types@^1.0.0": 213 | version "1.0.0" 214 | resolved "https://registry.yarnpkg.com/@slack/types/-/types-1.0.0.tgz#1dc7a63b293c4911e474197585c3feda012df17a" 215 | integrity sha512-IktC4uD/CHfLQcSitKSmjmRu4a6+Nf/KzfS6dTgUlDzENhh26l8aESKAuIpvYD5VOOE6NxDDIAdPJOXBvUGxlg== 216 | 217 | "@slack/web-api@^5.0.1": 218 | version "5.0.1" 219 | resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-5.0.1.tgz#f46ecd2dd8b8104144082c079a4f53ec7737f327" 220 | integrity sha512-L2Nc8P+NjXH1yqnsNhqxsrbpW3Qv+//9X5PQqcM3bctDmvmwTuhuM1X208RVD2avhnC89aghY5PssyaayWj5sA== 221 | dependencies: 222 | "@slack/logger" "^1.0.0" 223 | "@slack/types" "^1.0.0" 224 | "@types/form-data" "^2.2.1" 225 | "@types/is-stream" "^1.1.0" 226 | "@types/node" ">=8.9.0" 227 | "@types/p-queue" "^2.3.2" 228 | axios "^0.18.0" 229 | eventemitter3 "^3.1.0" 230 | form-data "^2.3.3" 231 | is-stream "^1.1.0" 232 | p-queue "^2.4.2" 233 | p-retry "^4.0.0" 234 | 235 | "@tootallnate/once@1": 236 | version "1.1.2" 237 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" 238 | integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== 239 | 240 | "@types/body-parser@*": 241 | version "1.17.0" 242 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" 243 | integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== 244 | dependencies: 245 | "@types/connect" "*" 246 | "@types/node" "*" 247 | 248 | "@types/color-name@^1.1.1": 249 | version "1.1.1" 250 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 251 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 252 | 253 | "@types/connect@*": 254 | version "3.4.32" 255 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 256 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 257 | dependencies: 258 | "@types/node" "*" 259 | 260 | "@types/express-serve-static-core@*": 261 | version "4.16.2" 262 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.2.tgz#5ee8a22e602005be6767df6b2cba9879df3f75aa" 263 | integrity sha512-qgc8tjnDrc789rAQed8NoiFLV5VGcItA4yWNFphqGU0RcuuQngD00g3LHhWIK3HQ2XeDgVCmlNPDlqi3fWBHnQ== 264 | dependencies: 265 | "@types/node" "*" 266 | "@types/range-parser" "*" 267 | 268 | "@types/express@4.17.3": 269 | version "4.17.3" 270 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.3.tgz#38e4458ce2067873b09a73908df488870c303bd9" 271 | integrity sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg== 272 | dependencies: 273 | "@types/body-parser" "*" 274 | "@types/express-serve-static-core" "*" 275 | "@types/serve-static" "*" 276 | 277 | "@types/form-data@^2.2.1": 278 | version "2.2.1" 279 | resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" 280 | integrity sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ== 281 | dependencies: 282 | "@types/node" "*" 283 | 284 | "@types/is-stream@^1.1.0": 285 | version "1.1.0" 286 | resolved "https://registry.yarnpkg.com/@types/is-stream/-/is-stream-1.1.0.tgz#b84d7bb207a210f2af9bed431dc0fbe9c4143be1" 287 | integrity sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg== 288 | dependencies: 289 | "@types/node" "*" 290 | 291 | "@types/long@^4.0.0": 292 | version "4.0.0" 293 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" 294 | integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== 295 | 296 | "@types/long@^4.0.1": 297 | version "4.0.1" 298 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" 299 | integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== 300 | 301 | "@types/mime@*": 302 | version "2.0.1" 303 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" 304 | integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== 305 | 306 | "@types/node@*", "@types/node@>=8.9.0": 307 | version "11.13.6" 308 | resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.6.tgz#37ec75690830acb0d74ce3c6c43caab787081e85" 309 | integrity sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw== 310 | 311 | "@types/node@^10.1.0": 312 | version "10.14.5" 313 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.5.tgz#27733a949f5d9972d87109297cffb62207ace70f" 314 | integrity sha512-Ja7d4s0qyGFxjGeDq5S7Si25OFibSAHUi6i17UWnwNnpitADN7hah9q0Tl25gxuV5R1u2Bx+np6w4LHXfHyj/g== 315 | 316 | "@types/node@^10.10.0": 317 | version "10.17.35" 318 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.35.tgz#58058f29b870e6ae57b20e4f6e928f02b7129f56" 319 | integrity sha512-gXx7jAWpMddu0f7a+L+txMplp3FnHl53OhQIF9puXKq3hDGY/GjH+MF04oWnV/adPSCrbtHumDCFwzq2VhltWA== 320 | 321 | "@types/node@^12.12.47": 322 | version "12.12.62" 323 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.62.tgz#733923d73669188d35950253dd18a21570085d2b" 324 | integrity sha512-qAfo81CsD7yQIM9mVyh6B/U47li5g7cfpVQEDMfQeF8pSZVwzbhwU3crc0qG4DmpsebpJPR49AKOExQyJ05Cpg== 325 | 326 | "@types/node@^13.7.0": 327 | version "13.13.21" 328 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.21.tgz#e48d3c2e266253405cf404c8654d1bcf0d333e5c" 329 | integrity sha512-tlFWakSzBITITJSxHV4hg4KvrhR/7h3xbJdSFbYJBVzKubrASbnnIFuSgolUh7qKGo/ZeJPKUfbZ0WS6Jp14DQ== 330 | 331 | "@types/p-queue@^2.3.2": 332 | version "2.3.2" 333 | resolved "https://registry.yarnpkg.com/@types/p-queue/-/p-queue-2.3.2.tgz#16bc5fece69ef85efaf2bce8b13f3ebe39c5a1c8" 334 | integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ== 335 | 336 | "@types/range-parser@*": 337 | version "1.2.3" 338 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 339 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 340 | 341 | "@types/retry@^0.12.0": 342 | version "0.12.0" 343 | resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" 344 | integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== 345 | 346 | "@types/serve-static@*": 347 | version "1.13.2" 348 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" 349 | integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== 350 | dependencies: 351 | "@types/express-serve-static-core" "*" 352 | "@types/mime" "*" 353 | 354 | abort-controller@^3.0.0: 355 | version "3.0.0" 356 | resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" 357 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 358 | dependencies: 359 | event-target-shim "^5.0.0" 360 | 361 | accepts@~1.3.7: 362 | version "1.3.7" 363 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 364 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 365 | dependencies: 366 | mime-types "~2.1.24" 367 | negotiator "0.6.2" 368 | 369 | agent-base@6: 370 | version "6.0.1" 371 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" 372 | integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== 373 | dependencies: 374 | debug "4" 375 | 376 | ansi-regex@^5.0.0: 377 | version "5.0.0" 378 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 379 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 380 | 381 | ansi-styles@^4.0.0: 382 | version "4.2.1" 383 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 384 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 385 | dependencies: 386 | "@types/color-name" "^1.1.1" 387 | color-convert "^2.0.1" 388 | 389 | array-flatten@1.1.1: 390 | version "1.1.1" 391 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 392 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 393 | 394 | arrify@^2.0.0, arrify@^2.0.1: 395 | version "2.0.1" 396 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" 397 | integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== 398 | 399 | asynckit@^0.4.0: 400 | version "0.4.0" 401 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 402 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 403 | 404 | axios@^0.18.0: 405 | version "0.18.1" 406 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" 407 | integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== 408 | dependencies: 409 | follow-redirects "1.5.10" 410 | is-buffer "^2.0.2" 411 | 412 | base64-js@^1.3.0: 413 | version "1.3.0" 414 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 415 | integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== 416 | 417 | bignumber.js@^9.0.0: 418 | version "9.0.1" 419 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" 420 | integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== 421 | 422 | body-parser@1.19.0: 423 | version "1.19.0" 424 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 425 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 426 | dependencies: 427 | bytes "3.1.0" 428 | content-type "~1.0.4" 429 | debug "2.6.9" 430 | depd "~1.1.2" 431 | http-errors "1.7.2" 432 | iconv-lite "0.4.24" 433 | on-finished "~2.3.0" 434 | qs "6.7.0" 435 | raw-body "2.4.0" 436 | type-is "~1.6.17" 437 | 438 | buffer-equal-constant-time@1.0.1: 439 | version "1.0.1" 440 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 441 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 442 | 443 | buffer-from@^1.0.0: 444 | version "1.1.1" 445 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 446 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 447 | 448 | bytes@3.1.0: 449 | version "3.1.0" 450 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 451 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 452 | 453 | camelcase@^5.0.0: 454 | version "5.3.1" 455 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 456 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 457 | 458 | cliui@^6.0.0: 459 | version "6.0.0" 460 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" 461 | integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== 462 | dependencies: 463 | string-width "^4.2.0" 464 | strip-ansi "^6.0.0" 465 | wrap-ansi "^6.2.0" 466 | 467 | color-convert@^2.0.1: 468 | version "2.0.1" 469 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 470 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 471 | dependencies: 472 | color-name "~1.1.4" 473 | 474 | color-name@~1.1.4: 475 | version "1.1.4" 476 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 477 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 478 | 479 | combined-stream@^1.0.6: 480 | version "1.0.7" 481 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 482 | integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== 483 | dependencies: 484 | delayed-stream "~1.0.0" 485 | 486 | compressible@^2.0.12: 487 | version "2.0.16" 488 | resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" 489 | integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== 490 | dependencies: 491 | mime-db ">= 1.38.0 < 2" 492 | 493 | concat-stream@^2.0.0: 494 | version "2.0.0" 495 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" 496 | integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== 497 | dependencies: 498 | buffer-from "^1.0.0" 499 | inherits "^2.0.3" 500 | readable-stream "^3.0.2" 501 | typedarray "^0.0.6" 502 | 503 | configstore@^5.0.0: 504 | version "5.0.1" 505 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 506 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 507 | dependencies: 508 | dot-prop "^5.2.0" 509 | graceful-fs "^4.1.2" 510 | make-dir "^3.0.0" 511 | unique-string "^2.0.0" 512 | write-file-atomic "^3.0.0" 513 | xdg-basedir "^4.0.0" 514 | 515 | content-disposition@0.5.3: 516 | version "0.5.3" 517 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 518 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 519 | dependencies: 520 | safe-buffer "5.1.2" 521 | 522 | content-type@~1.0.4: 523 | version "1.0.4" 524 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 525 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 526 | 527 | cookie-signature@1.0.6: 528 | version "1.0.6" 529 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 530 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 531 | 532 | cookie@0.4.0: 533 | version "0.4.0" 534 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 535 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 536 | 537 | core-util-is@~1.0.0: 538 | version "1.0.2" 539 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 540 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 541 | 542 | cors@^2.8.5: 543 | version "2.8.5" 544 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 545 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 546 | dependencies: 547 | object-assign "^4" 548 | vary "^1" 549 | 550 | crypto-random-string@^2.0.0: 551 | version "2.0.0" 552 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 553 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 554 | 555 | date-and-time@^0.14.0: 556 | version "0.14.1" 557 | resolved "https://registry.yarnpkg.com/date-and-time/-/date-and-time-0.14.1.tgz#969634697b78956fb66b8be6fb0f39fbd631f2f6" 558 | integrity sha512-M4RggEH5OF2ZuCOxgOU67R6Z9ohjKbxGvAQz48vj53wLmL0bAgumkBvycR32f30pK+Og9pIR+RFDyChbaE4oLA== 559 | 560 | debug@2.6.9: 561 | version "2.6.9" 562 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 563 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 564 | dependencies: 565 | ms "2.0.0" 566 | 567 | debug@4, debug@^4.1.1: 568 | version "4.2.0" 569 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" 570 | integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== 571 | dependencies: 572 | ms "2.1.2" 573 | 574 | debug@=3.1.0: 575 | version "3.1.0" 576 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 577 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 578 | dependencies: 579 | ms "2.0.0" 580 | 581 | decamelize@^1.2.0: 582 | version "1.2.0" 583 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 584 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 585 | 586 | delayed-stream@~1.0.0: 587 | version "1.0.0" 588 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 589 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 590 | 591 | depd@~1.1.2: 592 | version "1.1.2" 593 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 594 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 595 | 596 | destroy@~1.0.4: 597 | version "1.0.4" 598 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 599 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 600 | 601 | dicer@^0.3.0: 602 | version "0.3.0" 603 | resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" 604 | integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== 605 | dependencies: 606 | streamsearch "0.1.2" 607 | 608 | dot-prop@^5.2.0: 609 | version "5.3.0" 610 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 611 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 612 | dependencies: 613 | is-obj "^2.0.0" 614 | 615 | duplexify@^3.5.0: 616 | version "3.7.1" 617 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" 618 | integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== 619 | dependencies: 620 | end-of-stream "^1.0.0" 621 | inherits "^2.0.1" 622 | readable-stream "^2.0.0" 623 | stream-shift "^1.0.0" 624 | 625 | duplexify@^4.0.0, duplexify@^4.1.1: 626 | version "4.1.1" 627 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" 628 | integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA== 629 | dependencies: 630 | end-of-stream "^1.4.1" 631 | inherits "^2.0.3" 632 | readable-stream "^3.1.1" 633 | stream-shift "^1.0.0" 634 | 635 | ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: 636 | version "1.0.11" 637 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 638 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 639 | dependencies: 640 | safe-buffer "^5.0.1" 641 | 642 | ee-first@1.1.1: 643 | version "1.1.1" 644 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 645 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 646 | 647 | emoji-regex@^8.0.0: 648 | version "8.0.0" 649 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 650 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 651 | 652 | encodeurl@~1.0.2: 653 | version "1.0.2" 654 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 655 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 656 | 657 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 658 | version "1.4.1" 659 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 660 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 661 | dependencies: 662 | once "^1.4.0" 663 | 664 | end-of-stream@^1.4.1: 665 | version "1.4.4" 666 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 667 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 668 | dependencies: 669 | once "^1.4.0" 670 | 671 | ent@^2.2.0: 672 | version "2.2.0" 673 | resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" 674 | integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= 675 | 676 | escape-html@~1.0.3: 677 | version "1.0.3" 678 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 679 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 680 | 681 | etag@~1.8.1: 682 | version "1.8.1" 683 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 684 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 685 | 686 | event-target-shim@^5.0.0: 687 | version "5.0.1" 688 | resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" 689 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 690 | 691 | eventemitter3@^3.1.0: 692 | version "3.1.0" 693 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" 694 | integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== 695 | 696 | express@^4.17.1: 697 | version "4.17.1" 698 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 699 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 700 | dependencies: 701 | accepts "~1.3.7" 702 | array-flatten "1.1.1" 703 | body-parser "1.19.0" 704 | content-disposition "0.5.3" 705 | content-type "~1.0.4" 706 | cookie "0.4.0" 707 | cookie-signature "1.0.6" 708 | debug "2.6.9" 709 | depd "~1.1.2" 710 | encodeurl "~1.0.2" 711 | escape-html "~1.0.3" 712 | etag "~1.8.1" 713 | finalhandler "~1.1.2" 714 | fresh "0.5.2" 715 | merge-descriptors "1.0.1" 716 | methods "~1.1.2" 717 | on-finished "~2.3.0" 718 | parseurl "~1.3.3" 719 | path-to-regexp "0.1.7" 720 | proxy-addr "~2.0.5" 721 | qs "6.7.0" 722 | range-parser "~1.2.1" 723 | safe-buffer "5.1.2" 724 | send "0.17.1" 725 | serve-static "1.14.1" 726 | setprototypeof "1.1.1" 727 | statuses "~1.5.0" 728 | type-is "~1.6.18" 729 | utils-merge "1.0.1" 730 | vary "~1.1.2" 731 | 732 | extend@^3.0.2: 733 | version "3.0.2" 734 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 735 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 736 | 737 | fast-deep-equal@^3.1.1: 738 | version "3.1.3" 739 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 740 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 741 | 742 | fast-text-encoding@^1.0.0: 743 | version "1.0.0" 744 | resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz#3e5ce8293409cfaa7177a71b9ca84e1b1e6f25ef" 745 | integrity sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ== 746 | 747 | faye-websocket@0.11.3: 748 | version "0.11.3" 749 | resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" 750 | integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== 751 | dependencies: 752 | websocket-driver ">=0.5.1" 753 | 754 | finalhandler@~1.1.2: 755 | version "1.1.2" 756 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 757 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 758 | dependencies: 759 | debug "2.6.9" 760 | encodeurl "~1.0.2" 761 | escape-html "~1.0.3" 762 | on-finished "~2.3.0" 763 | parseurl "~1.3.3" 764 | statuses "~1.5.0" 765 | unpipe "~1.0.0" 766 | 767 | find-up@^4.1.0: 768 | version "4.1.0" 769 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 770 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 771 | dependencies: 772 | locate-path "^5.0.0" 773 | path-exists "^4.0.0" 774 | 775 | firebase-admin@~9.2.0: 776 | version "9.2.0" 777 | resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-9.2.0.tgz#df5176e2d0c5711df6dbf7012320492a703538ea" 778 | integrity sha512-LhnMYl71B4gP1FlTLfwaYlOWhBCAcNF+byb2CPTfaW/T4hkp4qlXOgo2bws/zbAv5X9GTFqGir3KexMslVGsIA== 779 | dependencies: 780 | "@firebase/database" "^0.6.10" 781 | "@firebase/database-types" "^0.5.2" 782 | "@types/node" "^10.10.0" 783 | dicer "^0.3.0" 784 | jsonwebtoken "^8.5.1" 785 | node-forge "^0.10.0" 786 | optionalDependencies: 787 | "@google-cloud/firestore" "^4.0.0" 788 | "@google-cloud/storage" "^5.3.0" 789 | 790 | firebase-functions@^3.11.0: 791 | version "3.11.0" 792 | resolved "https://registry.yarnpkg.com/firebase-functions/-/firebase-functions-3.11.0.tgz#92f5a6af6a10641da6dc9b41b29974658b621a7b" 793 | integrity sha512-i1uMhZ/M6i5SCI3ulKo7EWX0/LD+I5o6N+sk0HbOWfzyWfOl0iJTvQkR3BVDcjrlhPVC4xG1bDTLxd+DTkLqaw== 794 | dependencies: 795 | "@types/express" "4.17.3" 796 | cors "^2.8.5" 797 | express "^4.17.1" 798 | lodash "^4.17.14" 799 | 800 | follow-redirects@1.5.10: 801 | version "1.5.10" 802 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" 803 | integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== 804 | dependencies: 805 | debug "=3.1.0" 806 | 807 | form-data@^2.3.3: 808 | version "2.3.3" 809 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 810 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 811 | dependencies: 812 | asynckit "^0.4.0" 813 | combined-stream "^1.0.6" 814 | mime-types "^2.1.12" 815 | 816 | forwarded@~0.1.2: 817 | version "0.1.2" 818 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 819 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 820 | 821 | fresh@0.5.2: 822 | version "0.5.2" 823 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 824 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 825 | 826 | functional-red-black-tree@^1.0.1: 827 | version "1.0.1" 828 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 829 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 830 | 831 | gaxios@^3.0.0: 832 | version "3.2.0" 833 | resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-3.2.0.tgz#11b6f0e8fb08d94a10d4d58b044ad3bec6dd486a" 834 | integrity sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q== 835 | dependencies: 836 | abort-controller "^3.0.0" 837 | extend "^3.0.2" 838 | https-proxy-agent "^5.0.0" 839 | is-stream "^2.0.0" 840 | node-fetch "^2.3.0" 841 | 842 | gcp-metadata@^4.1.0: 843 | version "4.2.0" 844 | resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-4.2.0.tgz#3b424355ccdc240ee07c5791e2fd6a60a283d89a" 845 | integrity sha512-vQZD57cQkqIA6YPGXM/zc+PIZfNRFdukWGsGZ5+LcJzesi5xp6Gn7a02wRJi4eXPyArNMIYpPET4QMxGqtlk6Q== 846 | dependencies: 847 | gaxios "^3.0.0" 848 | json-bigint "^1.0.0" 849 | 850 | gcs-resumable-upload@^3.1.0: 851 | version "3.1.1" 852 | resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz#67c766a0555d6a352f9651b7603337207167d0de" 853 | integrity sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A== 854 | dependencies: 855 | abort-controller "^3.0.0" 856 | configstore "^5.0.0" 857 | extend "^3.0.2" 858 | gaxios "^3.0.0" 859 | google-auth-library "^6.0.0" 860 | pumpify "^2.0.0" 861 | stream-events "^1.0.4" 862 | 863 | get-caller-file@^2.0.1: 864 | version "2.0.5" 865 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 866 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 867 | 868 | google-auth-library@^6.0.0: 869 | version "6.1.0" 870 | resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-6.1.0.tgz#db3bbe2b3add5783442c84efdcb1c061721c1bfb" 871 | integrity sha512-GbalszIADE1YPWhUyfFMrkLhFHnlAgoRcqGVW+MsLDPsuaOB5MRPk7NNafPDv9SherNE4EKzcYuxMJjaxzXMOw== 872 | dependencies: 873 | arrify "^2.0.0" 874 | base64-js "^1.3.0" 875 | ecdsa-sig-formatter "^1.0.11" 876 | fast-text-encoding "^1.0.0" 877 | gaxios "^3.0.0" 878 | gcp-metadata "^4.1.0" 879 | gtoken "^5.0.0" 880 | jws "^4.0.0" 881 | lru-cache "^6.0.0" 882 | 883 | google-gax@^2.2.0: 884 | version "2.9.0" 885 | resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-2.9.0.tgz#84edef8715d82c0f91a6e5485b8f2803d2690f00" 886 | integrity sha512-MFMwA7Fb8PEwjnYwfGXjZMidCNyMl3gSnvS/+kS8TQioJZQDpzK+W3dmwyNyig/U13+kbABqDnbkkAXJ5NiUkw== 887 | dependencies: 888 | "@grpc/grpc-js" "~1.1.1" 889 | "@grpc/proto-loader" "^0.5.1" 890 | "@types/long" "^4.0.0" 891 | abort-controller "^3.0.0" 892 | duplexify "^4.0.0" 893 | google-auth-library "^6.0.0" 894 | is-stream-ended "^0.1.4" 895 | node-fetch "^2.6.1" 896 | protobufjs "^6.9.0" 897 | retry-request "^4.0.0" 898 | 899 | google-p12-pem@^3.0.0: 900 | version "3.0.3" 901 | resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.0.3.tgz#673ac3a75d3903a87f05878f3c75e06fc151669e" 902 | integrity sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA== 903 | dependencies: 904 | node-forge "^0.10.0" 905 | 906 | graceful-fs@^4.1.2: 907 | version "4.1.15" 908 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 909 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 910 | 911 | gtoken@^5.0.0: 912 | version "5.0.3" 913 | resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.0.3.tgz#b76ef8e9a2fed6fef165e47f7d05b60c498e4d05" 914 | integrity sha512-Nyd1wZCMRc2dj/mAD0LlfQLcAO06uKdpKJXvK85SGrF5+5+Bpfil9u/2aw35ltvEHjvl0h5FMKN5knEU+9JrOg== 915 | dependencies: 916 | gaxios "^3.0.0" 917 | google-p12-pem "^3.0.0" 918 | jws "^4.0.0" 919 | mime "^2.2.0" 920 | 921 | hash-stream-validation@^0.2.2: 922 | version "0.2.4" 923 | resolved "https://registry.yarnpkg.com/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz#ee68b41bf822f7f44db1142ec28ba9ee7ccb7512" 924 | integrity sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ== 925 | 926 | http-errors@1.7.2: 927 | version "1.7.2" 928 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 929 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 930 | dependencies: 931 | depd "~1.1.2" 932 | inherits "2.0.3" 933 | setprototypeof "1.1.1" 934 | statuses ">= 1.5.0 < 2" 935 | toidentifier "1.0.0" 936 | 937 | http-errors@~1.7.2: 938 | version "1.7.3" 939 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 940 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 941 | dependencies: 942 | depd "~1.1.2" 943 | inherits "2.0.4" 944 | setprototypeof "1.1.1" 945 | statuses ">= 1.5.0 < 2" 946 | toidentifier "1.0.0" 947 | 948 | http-parser-js@>=0.4.0: 949 | version "0.5.0" 950 | resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" 951 | integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== 952 | 953 | http-proxy-agent@^4.0.0: 954 | version "4.0.1" 955 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" 956 | integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== 957 | dependencies: 958 | "@tootallnate/once" "1" 959 | agent-base "6" 960 | debug "4" 961 | 962 | https-proxy-agent@^5.0.0: 963 | version "5.0.0" 964 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 965 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 966 | dependencies: 967 | agent-base "6" 968 | debug "4" 969 | 970 | iconv-lite@0.4.24: 971 | version "0.4.24" 972 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 973 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 974 | dependencies: 975 | safer-buffer ">= 2.1.2 < 3" 976 | 977 | imurmurhash@^0.1.4: 978 | version "0.1.4" 979 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 980 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 981 | 982 | inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: 983 | version "2.0.3" 984 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 985 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 986 | 987 | inherits@2.0.4: 988 | version "2.0.4" 989 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 990 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 991 | 992 | ipaddr.js@1.9.1: 993 | version "1.9.1" 994 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 995 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 996 | 997 | is-buffer@^2.0.2: 998 | version "2.0.4" 999 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 1000 | integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== 1001 | 1002 | is-fullwidth-code-point@^3.0.0: 1003 | version "3.0.0" 1004 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1005 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1006 | 1007 | is-obj@^2.0.0: 1008 | version "2.0.0" 1009 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 1010 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 1011 | 1012 | is-stream-ended@^0.1.4: 1013 | version "0.1.4" 1014 | resolved "https://registry.yarnpkg.com/is-stream-ended/-/is-stream-ended-0.1.4.tgz#f50224e95e06bce0e356d440a4827cd35b267eda" 1015 | integrity sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw== 1016 | 1017 | is-stream@^1.1.0: 1018 | version "1.1.0" 1019 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1020 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 1021 | 1022 | is-stream@^2.0.0: 1023 | version "2.0.0" 1024 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 1025 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 1026 | 1027 | is-typedarray@^1.0.0: 1028 | version "1.0.0" 1029 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1030 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1031 | 1032 | isarray@~1.0.0: 1033 | version "1.0.0" 1034 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1035 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1036 | 1037 | json-bigint@^1.0.0: 1038 | version "1.0.0" 1039 | resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" 1040 | integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== 1041 | dependencies: 1042 | bignumber.js "^9.0.0" 1043 | 1044 | jsonwebtoken@^8.5.1: 1045 | version "8.5.1" 1046 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 1047 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 1048 | dependencies: 1049 | jws "^3.2.2" 1050 | lodash.includes "^4.3.0" 1051 | lodash.isboolean "^3.0.3" 1052 | lodash.isinteger "^4.0.4" 1053 | lodash.isnumber "^3.0.3" 1054 | lodash.isplainobject "^4.0.6" 1055 | lodash.isstring "^4.0.1" 1056 | lodash.once "^4.0.0" 1057 | ms "^2.1.1" 1058 | semver "^5.6.0" 1059 | 1060 | jwa@^1.4.1: 1061 | version "1.4.1" 1062 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 1063 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 1064 | dependencies: 1065 | buffer-equal-constant-time "1.0.1" 1066 | ecdsa-sig-formatter "1.0.11" 1067 | safe-buffer "^5.0.1" 1068 | 1069 | jwa@^2.0.0: 1070 | version "2.0.0" 1071 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" 1072 | integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== 1073 | dependencies: 1074 | buffer-equal-constant-time "1.0.1" 1075 | ecdsa-sig-formatter "1.0.11" 1076 | safe-buffer "^5.0.1" 1077 | 1078 | jws@^3.2.2: 1079 | version "3.2.2" 1080 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 1081 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1082 | dependencies: 1083 | jwa "^1.4.1" 1084 | safe-buffer "^5.0.1" 1085 | 1086 | jws@^4.0.0: 1087 | version "4.0.0" 1088 | resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" 1089 | integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== 1090 | dependencies: 1091 | jwa "^2.0.0" 1092 | safe-buffer "^5.0.1" 1093 | 1094 | locate-path@^5.0.0: 1095 | version "5.0.0" 1096 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1097 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1098 | dependencies: 1099 | p-locate "^4.1.0" 1100 | 1101 | lodash.camelcase@^4.3.0: 1102 | version "4.3.0" 1103 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 1104 | integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= 1105 | 1106 | lodash.includes@^4.3.0: 1107 | version "4.3.0" 1108 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 1109 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 1110 | 1111 | lodash.isboolean@^3.0.3: 1112 | version "3.0.3" 1113 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 1114 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 1115 | 1116 | lodash.isinteger@^4.0.4: 1117 | version "4.0.4" 1118 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 1119 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 1120 | 1121 | lodash.isnumber@^3.0.3: 1122 | version "3.0.3" 1123 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 1124 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 1125 | 1126 | lodash.isplainobject@^4.0.6: 1127 | version "4.0.6" 1128 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1129 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 1130 | 1131 | lodash.isstring@^4.0.1: 1132 | version "4.0.1" 1133 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 1134 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 1135 | 1136 | lodash.once@^4.0.0: 1137 | version "4.1.1" 1138 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 1139 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 1140 | 1141 | lodash@^4.17.14: 1142 | version "4.17.20" 1143 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 1144 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 1145 | 1146 | long@^4.0.0: 1147 | version "4.0.0" 1148 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 1149 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 1150 | 1151 | lru-cache@^6.0.0: 1152 | version "6.0.0" 1153 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1154 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1155 | dependencies: 1156 | yallist "^4.0.0" 1157 | 1158 | make-dir@^3.0.0: 1159 | version "3.1.0" 1160 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1161 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1162 | dependencies: 1163 | semver "^6.0.0" 1164 | 1165 | media-typer@0.3.0: 1166 | version "0.3.0" 1167 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1168 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1169 | 1170 | merge-descriptors@1.0.1: 1171 | version "1.0.1" 1172 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1173 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1174 | 1175 | methods@~1.1.2: 1176 | version "1.1.2" 1177 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1178 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1179 | 1180 | mime-db@1.40.0, "mime-db@>= 1.38.0 < 2": 1181 | version "1.40.0" 1182 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 1183 | integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 1184 | 1185 | mime-db@1.44.0: 1186 | version "1.44.0" 1187 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 1188 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 1189 | 1190 | mime-types@^2.0.8, mime-types@^2.1.12: 1191 | version "2.1.24" 1192 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 1193 | integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 1194 | dependencies: 1195 | mime-db "1.40.0" 1196 | 1197 | mime-types@~2.1.24: 1198 | version "2.1.27" 1199 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 1200 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 1201 | dependencies: 1202 | mime-db "1.44.0" 1203 | 1204 | mime@1.6.0: 1205 | version "1.6.0" 1206 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1207 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1208 | 1209 | mime@^2.2.0: 1210 | version "2.4.2" 1211 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" 1212 | integrity sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg== 1213 | 1214 | mimic-fn@^2.1.0: 1215 | version "2.1.0" 1216 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1217 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1218 | 1219 | ms@2.0.0: 1220 | version "2.0.0" 1221 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1222 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1223 | 1224 | ms@2.1.1, ms@^2.1.1: 1225 | version "2.1.1" 1226 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1227 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1228 | 1229 | ms@2.1.2: 1230 | version "2.1.2" 1231 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1232 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1233 | 1234 | negotiator@0.6.2: 1235 | version "0.6.2" 1236 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1237 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1238 | 1239 | node-fetch@^2.3.0, node-fetch@^2.6.1: 1240 | version "2.6.1" 1241 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 1242 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 1243 | 1244 | node-forge@^0.10.0: 1245 | version "0.10.0" 1246 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" 1247 | integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== 1248 | 1249 | object-assign@^4: 1250 | version "4.1.1" 1251 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1252 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1253 | 1254 | on-finished@~2.3.0: 1255 | version "2.3.0" 1256 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1257 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1258 | dependencies: 1259 | ee-first "1.1.1" 1260 | 1261 | once@^1.3.1, once@^1.4.0: 1262 | version "1.4.0" 1263 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1264 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1265 | dependencies: 1266 | wrappy "1" 1267 | 1268 | onetime@^5.1.0: 1269 | version "5.1.0" 1270 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1271 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1272 | dependencies: 1273 | mimic-fn "^2.1.0" 1274 | 1275 | p-limit@^2.2.0: 1276 | version "2.3.0" 1277 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1278 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1279 | dependencies: 1280 | p-try "^2.0.0" 1281 | 1282 | p-limit@^3.0.1: 1283 | version "3.0.2" 1284 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" 1285 | integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== 1286 | dependencies: 1287 | p-try "^2.0.0" 1288 | 1289 | p-locate@^4.1.0: 1290 | version "4.1.0" 1291 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1292 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1293 | dependencies: 1294 | p-limit "^2.2.0" 1295 | 1296 | p-queue@^2.4.2: 1297 | version "2.4.2" 1298 | resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-2.4.2.tgz#03609826682b743be9a22dba25051bd46724fc34" 1299 | integrity sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng== 1300 | 1301 | p-retry@^4.0.0: 1302 | version "4.1.0" 1303 | resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.1.0.tgz#9ce7cef2069e84bf590df3b8ec18d740109338d6" 1304 | integrity sha512-oepllyG9gX1qH4Sm20YAKxg1GA7L7puhvGnTfimi31P07zSIj7SDV6YtuAx9nbJF51DES+2CIIRkXs8GKqWJxA== 1305 | dependencies: 1306 | "@types/retry" "^0.12.0" 1307 | retry "^0.12.0" 1308 | 1309 | p-try@^2.0.0: 1310 | version "2.2.0" 1311 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1312 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1313 | 1314 | parseurl@~1.3.3: 1315 | version "1.3.3" 1316 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1317 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1318 | 1319 | path-exists@^4.0.0: 1320 | version "4.0.0" 1321 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1322 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1323 | 1324 | path-to-regexp@0.1.7: 1325 | version "0.1.7" 1326 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1327 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1328 | 1329 | process-nextick-args@~2.0.0: 1330 | version "2.0.0" 1331 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1332 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 1333 | 1334 | protobufjs@^6.8.6: 1335 | version "6.8.8" 1336 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" 1337 | integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== 1338 | dependencies: 1339 | "@protobufjs/aspromise" "^1.1.2" 1340 | "@protobufjs/base64" "^1.1.2" 1341 | "@protobufjs/codegen" "^2.0.4" 1342 | "@protobufjs/eventemitter" "^1.1.0" 1343 | "@protobufjs/fetch" "^1.1.0" 1344 | "@protobufjs/float" "^1.0.2" 1345 | "@protobufjs/inquire" "^1.1.0" 1346 | "@protobufjs/path" "^1.1.2" 1347 | "@protobufjs/pool" "^1.1.0" 1348 | "@protobufjs/utf8" "^1.1.0" 1349 | "@types/long" "^4.0.0" 1350 | "@types/node" "^10.1.0" 1351 | long "^4.0.0" 1352 | 1353 | protobufjs@^6.9.0: 1354 | version "6.10.1" 1355 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.1.tgz#e6a484dd8f04b29629e9053344e3970cccf13cd2" 1356 | integrity sha512-pb8kTchL+1Ceg4lFd5XUpK8PdWacbvV5SK2ULH2ebrYtl4GjJmS24m6CKME67jzV53tbJxHlnNOSqQHbTsR9JQ== 1357 | dependencies: 1358 | "@protobufjs/aspromise" "^1.1.2" 1359 | "@protobufjs/base64" "^1.1.2" 1360 | "@protobufjs/codegen" "^2.0.4" 1361 | "@protobufjs/eventemitter" "^1.1.0" 1362 | "@protobufjs/fetch" "^1.1.0" 1363 | "@protobufjs/float" "^1.0.2" 1364 | "@protobufjs/inquire" "^1.1.0" 1365 | "@protobufjs/path" "^1.1.2" 1366 | "@protobufjs/pool" "^1.1.0" 1367 | "@protobufjs/utf8" "^1.1.0" 1368 | "@types/long" "^4.0.1" 1369 | "@types/node" "^13.7.0" 1370 | long "^4.0.0" 1371 | 1372 | proxy-addr@~2.0.5: 1373 | version "2.0.6" 1374 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 1375 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 1376 | dependencies: 1377 | forwarded "~0.1.2" 1378 | ipaddr.js "1.9.1" 1379 | 1380 | pump@^3.0.0: 1381 | version "3.0.0" 1382 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1383 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1384 | dependencies: 1385 | end-of-stream "^1.1.0" 1386 | once "^1.3.1" 1387 | 1388 | pumpify@^2.0.0: 1389 | version "2.0.1" 1390 | resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-2.0.1.tgz#abfc7b5a621307c728b551decbbefb51f0e4aa1e" 1391 | integrity sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw== 1392 | dependencies: 1393 | duplexify "^4.1.1" 1394 | inherits "^2.0.3" 1395 | pump "^3.0.0" 1396 | 1397 | qs@6.7.0: 1398 | version "6.7.0" 1399 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1400 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1401 | 1402 | range-parser@~1.2.1: 1403 | version "1.2.1" 1404 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1405 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1406 | 1407 | raw-body@2.4.0: 1408 | version "2.4.0" 1409 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1410 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1411 | dependencies: 1412 | bytes "3.1.0" 1413 | http-errors "1.7.2" 1414 | iconv-lite "0.4.24" 1415 | unpipe "1.0.0" 1416 | 1417 | readable-stream@^2.0.0, readable-stream@~2.3.6: 1418 | version "2.3.6" 1419 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1420 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1421 | dependencies: 1422 | core-util-is "~1.0.0" 1423 | inherits "~2.0.3" 1424 | isarray "~1.0.0" 1425 | process-nextick-args "~2.0.0" 1426 | safe-buffer "~5.1.1" 1427 | string_decoder "~1.1.1" 1428 | util-deprecate "~1.0.1" 1429 | 1430 | readable-stream@^3.0.2: 1431 | version "3.3.0" 1432 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" 1433 | integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== 1434 | dependencies: 1435 | inherits "^2.0.3" 1436 | string_decoder "^1.1.1" 1437 | util-deprecate "^1.0.1" 1438 | 1439 | readable-stream@^3.1.1: 1440 | version "3.6.0" 1441 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1442 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1443 | dependencies: 1444 | inherits "^2.0.3" 1445 | string_decoder "^1.1.1" 1446 | util-deprecate "^1.0.1" 1447 | 1448 | require-directory@^2.1.1: 1449 | version "2.1.1" 1450 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1451 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1452 | 1453 | require-main-filename@^2.0.0: 1454 | version "2.0.0" 1455 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1456 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1457 | 1458 | retry-request@^4.0.0: 1459 | version "4.0.0" 1460 | resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-4.0.0.tgz#5c366166279b3e10e9d7aa13274467a05cb69290" 1461 | integrity sha512-S4HNLaWcMP6r8E4TMH52Y7/pM8uNayOcTDDQNBwsCccL1uI+Ol2TljxRDPzaNfbhOB30+XWP5NnZkB3LiJxi1w== 1462 | dependencies: 1463 | through2 "^2.0.0" 1464 | 1465 | retry-request@^4.1.1: 1466 | version "4.1.3" 1467 | resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-4.1.3.tgz#d5f74daf261372cff58d08b0a1979b4d7cab0fde" 1468 | integrity sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ== 1469 | dependencies: 1470 | debug "^4.1.1" 1471 | 1472 | retry@^0.12.0: 1473 | version "0.12.0" 1474 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 1475 | integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= 1476 | 1477 | safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1478 | version "5.1.2" 1479 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1480 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1481 | 1482 | "safer-buffer@>= 2.1.2 < 3": 1483 | version "2.1.2" 1484 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1485 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1486 | 1487 | semver@^5.6.0: 1488 | version "5.7.0" 1489 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 1490 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 1491 | 1492 | semver@^6.0.0: 1493 | version "6.0.0" 1494 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" 1495 | integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== 1496 | 1497 | semver@^6.2.0: 1498 | version "6.3.0" 1499 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1500 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1501 | 1502 | send@0.17.1: 1503 | version "0.17.1" 1504 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1505 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1506 | dependencies: 1507 | debug "2.6.9" 1508 | depd "~1.1.2" 1509 | destroy "~1.0.4" 1510 | encodeurl "~1.0.2" 1511 | escape-html "~1.0.3" 1512 | etag "~1.8.1" 1513 | fresh "0.5.2" 1514 | http-errors "~1.7.2" 1515 | mime "1.6.0" 1516 | ms "2.1.1" 1517 | on-finished "~2.3.0" 1518 | range-parser "~1.2.1" 1519 | statuses "~1.5.0" 1520 | 1521 | serve-static@1.14.1: 1522 | version "1.14.1" 1523 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 1524 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1525 | dependencies: 1526 | encodeurl "~1.0.2" 1527 | escape-html "~1.0.3" 1528 | parseurl "~1.3.3" 1529 | send "0.17.1" 1530 | 1531 | set-blocking@^2.0.0: 1532 | version "2.0.0" 1533 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1534 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1535 | 1536 | setprototypeof@1.1.1: 1537 | version "1.1.1" 1538 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1539 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1540 | 1541 | signal-exit@^3.0.2: 1542 | version "3.0.2" 1543 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1544 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1545 | 1546 | snakeize@^0.1.0: 1547 | version "0.1.0" 1548 | resolved "https://registry.yarnpkg.com/snakeize/-/snakeize-0.1.0.tgz#10c088d8b58eb076b3229bb5a04e232ce126422d" 1549 | integrity sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0= 1550 | 1551 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 1552 | version "1.5.0" 1553 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1554 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1555 | 1556 | stream-events@^1.0.1, stream-events@^1.0.4, stream-events@^1.0.5: 1557 | version "1.0.5" 1558 | resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" 1559 | integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== 1560 | dependencies: 1561 | stubs "^3.0.0" 1562 | 1563 | stream-shift@^1.0.0: 1564 | version "1.0.0" 1565 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 1566 | integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= 1567 | 1568 | streamsearch@0.1.2: 1569 | version "0.1.2" 1570 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 1571 | integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= 1572 | 1573 | string-width@^4.1.0, string-width@^4.2.0: 1574 | version "4.2.0" 1575 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1576 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1577 | dependencies: 1578 | emoji-regex "^8.0.0" 1579 | is-fullwidth-code-point "^3.0.0" 1580 | strip-ansi "^6.0.0" 1581 | 1582 | string_decoder@^1.1.1: 1583 | version "1.2.0" 1584 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" 1585 | integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== 1586 | dependencies: 1587 | safe-buffer "~5.1.0" 1588 | 1589 | string_decoder@~1.1.1: 1590 | version "1.1.1" 1591 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1592 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1593 | dependencies: 1594 | safe-buffer "~5.1.0" 1595 | 1596 | strip-ansi@^6.0.0: 1597 | version "6.0.0" 1598 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1599 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1600 | dependencies: 1601 | ansi-regex "^5.0.0" 1602 | 1603 | stubs@^3.0.0: 1604 | version "3.0.0" 1605 | resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" 1606 | integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= 1607 | 1608 | teeny-request@^7.0.0: 1609 | version "7.0.1" 1610 | resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-7.0.1.tgz#bdd41fdffea5f8fbc0d29392cb47bec4f66b2b4c" 1611 | integrity sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw== 1612 | dependencies: 1613 | http-proxy-agent "^4.0.0" 1614 | https-proxy-agent "^5.0.0" 1615 | node-fetch "^2.6.1" 1616 | stream-events "^1.0.5" 1617 | uuid "^8.0.0" 1618 | 1619 | through2@^2.0.0: 1620 | version "2.0.5" 1621 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" 1622 | integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== 1623 | dependencies: 1624 | readable-stream "~2.3.6" 1625 | xtend "~4.0.1" 1626 | 1627 | toidentifier@1.0.0: 1628 | version "1.0.0" 1629 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1630 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1631 | 1632 | tslib@^1.11.1: 1633 | version "1.13.0" 1634 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 1635 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 1636 | 1637 | type-is@~1.6.17, type-is@~1.6.18: 1638 | version "1.6.18" 1639 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1640 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1641 | dependencies: 1642 | media-typer "0.3.0" 1643 | mime-types "~2.1.24" 1644 | 1645 | typedarray-to-buffer@^3.1.5: 1646 | version "3.1.5" 1647 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1648 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1649 | dependencies: 1650 | is-typedarray "^1.0.0" 1651 | 1652 | typedarray@^0.0.6: 1653 | version "0.0.6" 1654 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1655 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 1656 | 1657 | unique-string@^2.0.0: 1658 | version "2.0.0" 1659 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1660 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1661 | dependencies: 1662 | crypto-random-string "^2.0.0" 1663 | 1664 | unpipe@1.0.0, unpipe@~1.0.0: 1665 | version "1.0.0" 1666 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1667 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1668 | 1669 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1670 | version "1.0.2" 1671 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1672 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1673 | 1674 | utils-merge@1.0.1: 1675 | version "1.0.1" 1676 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1677 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1678 | 1679 | uuid@^8.0.0: 1680 | version "8.3.0" 1681 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" 1682 | integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== 1683 | 1684 | vary@^1, vary@~1.1.2: 1685 | version "1.1.2" 1686 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1687 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1688 | 1689 | websocket-driver@>=0.5.1: 1690 | version "0.7.0" 1691 | resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" 1692 | integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= 1693 | dependencies: 1694 | http-parser-js ">=0.4.0" 1695 | websocket-extensions ">=0.1.1" 1696 | 1697 | websocket-extensions@>=0.1.1: 1698 | version "0.1.4" 1699 | resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" 1700 | integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== 1701 | 1702 | which-module@^2.0.0: 1703 | version "2.0.0" 1704 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1705 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1706 | 1707 | wrap-ansi@^6.2.0: 1708 | version "6.2.0" 1709 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 1710 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 1711 | dependencies: 1712 | ansi-styles "^4.0.0" 1713 | string-width "^4.1.0" 1714 | strip-ansi "^6.0.0" 1715 | 1716 | wrappy@1: 1717 | version "1.0.2" 1718 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1719 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1720 | 1721 | write-file-atomic@^3.0.0: 1722 | version "3.0.3" 1723 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1724 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1725 | dependencies: 1726 | imurmurhash "^0.1.4" 1727 | is-typedarray "^1.0.0" 1728 | signal-exit "^3.0.2" 1729 | typedarray-to-buffer "^3.1.5" 1730 | 1731 | xdg-basedir@^4.0.0: 1732 | version "4.0.0" 1733 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1734 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1735 | 1736 | xtend@~4.0.1: 1737 | version "4.0.1" 1738 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1739 | integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= 1740 | 1741 | y18n@^4.0.0: 1742 | version "4.0.0" 1743 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 1744 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 1745 | 1746 | yallist@^4.0.0: 1747 | version "4.0.0" 1748 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1749 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1750 | 1751 | yargs-parser@^18.1.2: 1752 | version "18.1.3" 1753 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" 1754 | integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== 1755 | dependencies: 1756 | camelcase "^5.0.0" 1757 | decamelize "^1.2.0" 1758 | 1759 | yargs@^15.3.1: 1760 | version "15.4.1" 1761 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" 1762 | integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== 1763 | dependencies: 1764 | cliui "^6.0.0" 1765 | decamelize "^1.2.0" 1766 | find-up "^4.1.0" 1767 | get-caller-file "^2.0.1" 1768 | require-directory "^2.1.1" 1769 | require-main-filename "^2.0.0" 1770 | set-blocking "^2.0.0" 1771 | string-width "^4.2.0" 1772 | which-module "^2.0.0" 1773 | y18n "^4.0.0" 1774 | yargs-parser "^18.1.2" 1775 | -------------------------------------------------------------------------------- /tutorial/Datastore1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doitintl/gSlack/9431bbf88f60db346b135f9e6ce1c65f77cf3038/tutorial/Datastore1.jpg -------------------------------------------------------------------------------- /tutorial/Datastore2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doitintl/gSlack/9431bbf88f60db346b135f9e6ce1c65f77cf3038/tutorial/Datastore2.jpg -------------------------------------------------------------------------------- /tutorial/Firestore1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doitintl/gSlack/9431bbf88f60db346b135f9e6ce1c65f77cf3038/tutorial/Firestore1.png -------------------------------------------------------------------------------- /tutorial/FormattingDocument.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doitintl/gSlack/9431bbf88f60db346b135f9e6ce1c65f77cf3038/tutorial/FormattingDocument.png -------------------------------------------------------------------------------- /tutorial/FormattingResult.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doitintl/gSlack/9431bbf88f60db346b135f9e6ce1c65f77cf3038/tutorial/FormattingResult.png -------------------------------------------------------------------------------- /tutorial/index.md: -------------------------------------------------------------------------------- 1 | # gSlack 2 | 3 | Many people have asked us how they might get notified by [Slack](https://slack.com/) of various events that originate within [Google Cloud Platform](https://cloud.google.com/). `Google Compute Engine` instances may start and stop, new `Google AppEngine` verions might be deployed and `Google Cloud Storage` bucket may be created or deleted. People would like to be notified of these and others via their `Slack` account. 4 | 5 | `gSlack` allows you to install a lightweight serverless solution into your 6 | own Google Cloud Platform project/s and easily configure the alerts you would like to receive. 7 | 8 | ## Objectives 9 | In this tutorial you will learn how to: 10 | - Enable `Slack` integration. 11 | - Create `Google PubSub` a topic. 12 | - Create `Google Stackdriver` log exports that write into the `PubSub` topic. 13 | - Configure permissions for the log exports to be written into the `PubSub`. 14 | - Configure and deploy a `Google CloudFunctions`(**beta**) serverless backend code to call the `Slack` API. 15 | - Configure the alerts to notify of. 16 | 17 | ## Before you begin 18 | This tutorial runs best when using a `*nix` operating system. 19 | 20 | If you don't have access to a `*nix` machine you may choose to use `Google Cloud Shell` using this [quickstart](https://cloud.google.com/shell/docs/quickstart). 21 | ### Prerequisites 22 | - You must have a `Google Cloud Platform` project with enabled billing. 23 | - You must have access to a user with `Owner` role on the project. 24 | - You must have `gcloud` SDK and CLI installed on your machine ([quickstart](https://cloud.google.com/sdk/docs/quickstarts)). 25 | - You must have a `Slack` account. 26 | 27 | **Please notice that some of the services used in this tutorial are still `beta versions` at the time of this writing and are subject to `different or no SLA`. Please consult the documentation before using this tutorial with any production critical workflow.** 28 | 29 | ### TL;DR 30 | If you wish to skip this step-by-step tutorial - you can use the quick setup by following the [README.md](./README.md) 31 | 32 | ## Setting up your project 33 | 34 | **Please remember to put your project ID where the text indicates so with: '``'** 35 | 36 | Make sure your `gcloud` SDK and CLI environment is authenticated against the requested GCP project with a user that has Owner permissions. 37 | 38 | ### 1) Create a topic 39 | Run the following command to create a `Google Cloud PubSub` topic: 40 | ``` 41 | $ gcloud --project= beta pubsub topics create gcp-alert-service 42 | ``` 43 | The command will take a few seconds to run. 44 | Once complete your project will contain a new topic that you can see at the [Google Cloud PubSub Console](https://console.cloud.google.com/cloudpubsub/topicList). 45 | We will use this topic as a sink to which log exports would write our events. 46 | 47 | ### 2) Create an export sink 48 | Run the following command to create the export sink: 49 | ``` 50 | $ gcloud --project= beta logging sinks create gcp_alert_service pubsub.googleapis.com/projects//topics/gcp-alert-service --log-filter "logName=projects//logs/cloudaudit.googleapis.com%2Factivity" 51 | ``` 52 | 53 | This command creates a log export that uses the specified filter to send all `Cloud Audit Logging` activity events into the topic we created before. 54 | 55 | You can see the new export sink at the [Log Exports Console](https://console.cloud.google.com/logs/exports). 56 | Notice the warning icon attached to it. 57 | 58 | As part of creating the export sink - a new service account was created. This service account is used to publish event into our topic. 59 | However this service account still lacks the permissions required to publish into `Google PubSub`. 60 | 61 | ### 3) Granting service account permissions 62 | Run the following command: 63 | ``` 64 | $ gcloud --project= projects add-iam-policy-binding --member=$(gcloud --project --format="value(writer_identity)" beta logging sinks describe gcp_alert_service) --role='roles/pubsub.publisher' 65 | ``` 66 | This command grants a `pubsub.publisher` role to the service account that was created previously. 67 | A few minutes after this command finishes you should see the warning icon removed from the export sink in the [Log Exports Console](https://console.cloud.google.com/logs/exports). 68 | 69 | ## Deploying the code 70 | At this stage we have a export log that pushes all audit events into the topic we created. 71 | To complete the application we need some code to recieve these events, filter them and use the `Slack` API to post messages on the desired `Slack` channel. 72 | One way to do so that uses a fully manaaged, auoscalable, serveless comupting service is by using [Google CloudFunctions](https://cloud.google.com/functions/). 73 | This service will deploy and scale our code as much as required for optmial performance. 74 | 75 | `Google CloudFunctions` use [Node.js](https://nodejs.org/en/) as a runtime platform which means our code will be written using Javascript. 76 | 77 | Before we can make a `Google CloudFunctions` deployment we must create a `Google Cloud Storage` bucket for staging and enable the `Google CloudFunctions API` for our project. 78 | 79 | ### 1) Create a staging bucket 80 | Run the following command: 81 | ``` 82 | $ gsutil mb -p gs://-gcp-alert-service 83 | ``` 84 | This command will create a new bucket for our deployment to stage in. 85 | 86 | ### 2) Enable `Google CloudFunction API` 87 | Run the following command: 88 | ``` 89 | $ gcloud --project= beta service-management enable cloudfunctions.googleapis.com 90 | ``` 91 | This command might take a few minutes. After it completes the `Google CloudFunctions` API will be enabled for your project. 92 | 93 | ### 3) Writing the code 94 | To deploy into `Google CloudFunctions` we will use two files: 95 | - A `package.json` file that describes the module, dependencies etc' 96 | - An `index.js` file that exports the code to be run. 97 | 98 | ### 4) Create a `package.json` file 99 | Create a file named `package.json`, copy the content from [this link](./package.json) into the file and save it locally. 100 | 101 | ### 5) Create an `index.js` file 102 | Create a file named `index.js`, copy the content from [this link](./index.js) into the file and save it locally. 103 | 104 | ### 6) Deploy the code 105 | Run the following command: 106 | ``` 107 | $ gcloud --project= beta functions deploy gcp-alert-service --stage-bucket -gcp-alert-service --trigger-topic gcp-alert-service --entry-point=pubsubLogSink --region=us-central1 108 | ``` 109 | This command will take a few minutes. 110 | When complete you will can see the deployed function [here](https://console.cloud.google.com/functions/list). 111 | 112 | ## Configuration 113 | Altough the code is deployed and events are being pushed - you will not yet recieve any `Slack` notifications. For that to happen the application must be configured. 114 | 115 | The application code deployed in the previous section uses [Google Cloud Datastore](https://cloud.google.com/datastore) to store configuration. 116 | `Google Cloud Datastore` is a fully managed, auto-scaling, serverless no-sql database. It allows fast updates and fetches as well as some degree of query support. 117 | 118 | The application needs to have a `Slack API Token` configuration to allow it positn new messages to a channel. 119 | 120 | You will also need to define the alerts you wish to be notified of. 121 | 122 | ### 1) Configuration console 123 | Open the [Google Cloud Datastore Console](https://console.cloud.google.com/datastore) in your favorite browser. 124 | 125 | ### 2) Generate a `Slack API Token` 126 | - Go to [https://.slack.com/apps/new/A0F7YS25R-bots]() 127 | - Enter a name for the bot to post with. (i.e. gcp-alert-service) 128 | - Click `Add bot integration`. 129 | - Wait until the UI displays the `API Token` and copy the string (i.e. xxxx-yyyyyyyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzz) 130 | ### 3) Configure the `Slack API Token` 131 | - Go back to the [Google Cloud Datastore Console](https://console.cloud.google.com/datastore) page. 132 | - Click `Create Entity` 133 | - Enter `Config` into the `Kind` textbox. 134 | - Add a property with a `Name` of '`name`' and `Value` of '`slackAPIToken`'. (Leave the `Type` as `String`) 135 | - Add another property with a `Name` of '`value`' and set the `Value` to the `Slack API Token` you generated in the previous step. (Leave the `Type` as `String`) 136 | - The result should look like this: 137 | ![alt text](./Datastore1.jpg) 138 | - Click `Create`. 139 | 140 | ### 4) Configure an alert 141 | - Click `Create Entity` 142 | - Enter `Test` into the `Kind` textbox. 143 | - Add a property with a `Name` of '`message`' and set the `Value` to the following (Leave the `Type` as `String`): 144 | ``` 145 | Bucket '${$.resource.labels.bucket_name}' was ${$.protoPayload.methodName==='storage.buckets.create'?'created':'deleted'} at location '${$.resource.labels.location}' with storage class '${$.resource.labels.storage_class}' by '${$.protoPayload.authenticationInfo.principalEmail}' in project '${$.resource.labels.project_id}' 146 | ``` 147 | - Add a property with a `Name` of '`test`' and set the `Value` to the following (Leave the `Type` as `String`): 148 | ``` 149 | $.protoPayload.serviceName==='storage.googleapis.com' && ( $.protoPayload.methodName==='storage.buckets.create' || $.protoPayload.methodName==='storage.buckets.delete') 150 | ``` 151 | - Finally add a property with a `Name` of '`slackChannel`' and set the `Value` to '`gcp`'. (Leave the `Type` as `String`) 152 | - The result should look like this: 153 | ![alt text](./Datastore2.jpg) 154 | - Click `Create`. 155 | - You can add more alerts by repeating step 4. See the [README](./README.md) for more examples. 156 | - After saving the configuration you should see slack messages being sent into a `Slack` channel named `gcp`. **Please make sure this channel exist and if not - create it.** 157 | ## Cleaning up 158 | 1) Go to [Google Cloud Logging Export Console](https://console.cloud.google.com/logs/exports) 159 | 1) Select the sinks created in this tutorial. 160 | 1) Click `Delete` and confirm in the popup. 161 | 1) Go to [Google PubSub Console](https://console.cloud.google.com/cloudpubsub/topicList) 162 | 1) Select the topic create in this tutorial. 163 | 1) Click `Delete` and confirm in the popup. 164 | 1) Go to [Google CloudFunctions Console](https://console.cloud.google.com/functions/list) 165 | 1) Select the function deployed in this tutorial. 166 | 1) Click `Delete` and confirm in the popup. 167 | 1) Go to [Google Cloud Storage Console](https://console.cloud.google.com/storage/browser) 168 | 1) Select the bucket created in this tutorial. 169 | 1) Click `Delete` and confirm in the popup. 170 | 1) Go to [Google Cloud Datastore Console](https://console.cloud.google.com/datastore) 171 | 1) Select all entities created in this tutorial. 172 | 1) Click `Delete` and confirm in the popup. 173 | --------------------------------------------------------------------------------