From 6e5e7230f71baba1b2932d45bb24d7161cae5bc4 Mon Sep 17 00:00:00 2001 From: Michael Henke <433270+aphex3k@users.noreply.github.com> Date: Thu, 21 May 2020 17:24:16 -0700 Subject: [PATCH] Rewrite for version 1.2 --- .eslintrc.json | 62 +- .gitignore | 2 + .jshintrc | 4 - .npmignore | 4 + .travis.yml | 42 +- README.md | 35 +- config.schema.json | 16 + index.js | 20 - lib/AddressResponse.d.ts | 5 - lib/AddressResponse.js | 2 - lib/Bloomsky.d.ts | 33 - lib/Bloomsky.js | 629 ------ lib/Ffmpeg.d.ts | 34 - lib/Ffmpeg.js | 368 ---- lib/PlatformAccessory.d.ts | 36 - lib/PlatformAccessory.js | 2 - lib/Session.d.ts | 9 - lib/Session.js | 2 - lib/SnapshotRequest.d.ts | 5 - lib/SnapshotRequest.js | 2 - lib/Station.d.ts | 16 - lib/Station.js | 2 - lib/StreamController.d.ts | 8 - lib/StreamController.js | 2 - lib/StreamRequest.d.ts | 10 - lib/StreamRequest.js | 2 - lib/StreamResponse.d.ts | 9 - lib/StreamResponse.js | 2 - nodemon.json | 9 + package-lock.json | 3400 +++++++++++++++++++++----------- package.json | 72 +- preview.jpeg | Bin 76207 -> 0 bytes src/AddressResponse.ts | 6 - src/AudioResponse.d.ts | 7 - src/BaseResponse.d.ts | 10 - src/Bloomsky.ts | 566 ------ src/Ffmpeg.ts | 414 ---- src/PlatformAccessory.ts | 141 +- src/Session.ts | 15 - src/SnapshotRequest.ts | 6 - src/Station.d.ts | 18 + src/Station.ts | 18 - src/StreamController.ts | 9 - src/StreamRequest.ts | 12 - src/StreamResponse.ts | 11 - src/VideoResponse.d.ts | 10 - src/homebridge.d.ts | 41 - src/index.ts | 10 + src/platform.ts | 250 +++ src/settings.ts | 9 + src/streamingDelegate.ts | 269 +++ standalone.js | 98 - test.spec.ts | 276 --- testing-config/api-result.json | 55 - testing-config/config.json | 21 - tsconfig.json | 22 +- tslint.json | 13 - yarn.lock | 2039 ------------------- 58 files changed, 3068 insertions(+), 6122 deletions(-) delete mode 100644 .jshintrc create mode 100644 config.schema.json delete mode 100644 index.js delete mode 100644 lib/AddressResponse.d.ts delete mode 100644 lib/AddressResponse.js delete mode 100644 lib/Bloomsky.d.ts delete mode 100644 lib/Bloomsky.js delete mode 100644 lib/Ffmpeg.d.ts delete mode 100644 lib/Ffmpeg.js delete mode 100644 lib/PlatformAccessory.d.ts delete mode 100644 lib/PlatformAccessory.js delete mode 100644 lib/Session.d.ts delete mode 100644 lib/Session.js delete mode 100644 lib/SnapshotRequest.d.ts delete mode 100644 lib/SnapshotRequest.js delete mode 100644 lib/Station.d.ts delete mode 100644 lib/Station.js delete mode 100644 lib/StreamController.d.ts delete mode 100644 lib/StreamController.js delete mode 100644 lib/StreamRequest.d.ts delete mode 100644 lib/StreamRequest.js delete mode 100644 lib/StreamResponse.d.ts delete mode 100644 lib/StreamResponse.js create mode 100644 nodemon.json delete mode 100644 preview.jpeg delete mode 100644 src/AddressResponse.ts delete mode 100644 src/AudioResponse.d.ts delete mode 100644 src/BaseResponse.d.ts delete mode 100644 src/Bloomsky.ts delete mode 100644 src/Ffmpeg.ts delete mode 100644 src/Session.ts delete mode 100644 src/SnapshotRequest.ts create mode 100644 src/Station.d.ts delete mode 100644 src/Station.ts delete mode 100644 src/StreamController.ts delete mode 100644 src/StreamRequest.ts delete mode 100644 src/StreamResponse.ts delete mode 100644 src/VideoResponse.d.ts delete mode 100644 src/homebridge.d.ts create mode 100644 src/index.ts create mode 100644 src/platform.ts create mode 100644 src/settings.ts create mode 100644 src/streamingDelegate.ts delete mode 100644 standalone.js delete mode 100644 test.spec.ts delete mode 100644 testing-config/api-result.json delete mode 100644 testing-config/config.json delete mode 100644 tslint.json delete mode 100644 yarn.lock diff --git a/.eslintrc.json b/.eslintrc.json index 22c23e5..48cf0f4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,32 +1,34 @@ { - "env": { - "browser": false, - "node": true, - "es6": false - }, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaVersion": 2017, - "sourceType": "module" - }, - "rules": { - "indent": [ - "error", - "tab" - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double" - ], - "semi": [ - "error", - "always" - ], - "no-console":"off", - "no-unused-vars":"error" - } + "parser": "@typescript-eslint/parser", + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" // uses the recommended rules from the @typescript-eslint/eslint-plugin + ], + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "ignorePatterns": ["dist", "src/streamingDelegate.ts"], + "rules": { + "quotes": ["warn", "double"], + "indent": ["warn", 2, { "SwitchCase": 1 }], + "linebreak-style": ["warn", "unix"], + "semi": ["warn", "always"], + "comma-dangle": ["off", "always-multiline"], + "dot-notation": "warn", + "eqeqeq": "warn", + "curly": ["warn", "all"], + "brace-style": ["warn"], + "prefer-arrow-callback": ["warn"], + "max-len": ["warn", 140], + "no-console": ["warn"], // use the provided Homebridge log method instead + "lines-between-class-members": [ + "warn", + "always", + { "exceptAfterSingleLine": true } + ], + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-non-null-assertion": "off" + } } diff --git a/.gitignore b/.gitignore index 01b9f03..b8dd556 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,5 @@ typings/ # End of https://www.gitignore.io/api/node persist + +dist \ No newline at end of file diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index af28da2..0000000 --- a/.jshintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "esversion": 6, - "node": true - } diff --git a/.npmignore b/.npmignore index 71cba64..7ce7abe 100644 --- a/.npmignore +++ b/.npmignore @@ -39,3 +39,7 @@ persist/ src/ testing-config/ *.code-workspace +.eslintrc +.jshintrc +.travis.yml +.eslintignore diff --git a/.travis.yml b/.travis.yml index 8ac3be6..cd96d4e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,26 @@ language: node_js + node_js: - - 6.14.4 - - 8.11.1 - - 8.12.0 - - 10.13.0 - - 11.1.0 -before_install: -- curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - -- echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list -- sudo apt-get update && sudo apt-get install yarn -- yarn global add jshint tslint typescript homebridge eslint -- homebridge --version + - node + - 10 + - 11 + +env: + - workerCount=3 + +matrix: + fast_finish: true + +install: + - npm install + +cache: + directories: + - node_modules + +git: + depth: 1 + script: -- tslint -c ./tslint.json --project . -- tsc -- eslint -c .eslintrc.json *.js -- jshint -c .jshintrc *.js -- npm --verbose test -- node --version | grep -v v6.*.* && npm --dry-run publish || echo Skipping publish dry-run for node 6.x -- DEBUG=* timeout -k 20s -s SIGINT 15s homebridge -Q -P ./ -U ./testing-config ; test $? == 124 -- timeout -k 20s -s SIGINT 15s node standalone.js ; test $? == 124 + - npm run lint + - npm run build diff --git a/README.md b/README.md index 60534c2..74d40b1 100644 --- a/README.md +++ b/README.md @@ -19,13 +19,12 @@ If you have a newer version, you can help me out with the support. ## Installation -1. Install `ffmpeg` on your computer with *libx264* or (*h264_omx* for Raspberry Pi) +1. Install `ffmpeg` on your computer with _libx264_ or (_h264_omx_ for Raspberry Pi) 1. Make sure your homebridge setup is current. 1. Follow the official [homebridge installation instructions](https://github.com/nfarina/homebridge#installation) if you haven't done so yet 1. Install this plugin using: `npm install -g homebridge-bloomsky` 1. Edit `config.json` and add the platform. 1. Run/Restart Homebridge -1. _Optionally_ `npm install -g sharp` on modern platforms for improved performance when generating snapshot images ### Configuration Example @@ -36,25 +35,22 @@ Add this configuration information to your homebridge `config.json` in the { "platform": "Bloomsky", "apiKey": "your-api-key-here==", - "apiUrl": "https://api.bloomsky.com/api/skydata/", - "vcodec": "libx264", - "debug": false + "apiUrl": "https://api.bloomsky.com/api/skydata/" } ``` -Property Name | Value | Required -------------- | ----- | -------- -`platform` | Must be `Bloomsky` | yes -`apiKey` | Your personal [Bloomsky API](#bloomsky-api) authorization key | yes -`apiUrl` | Use default value for official public Bloomsky API: `https://api.bloomsky.com/api/skydata/` | no -`vcodec` | `libx264` by default, use `h264_omx` for Raspberry Pi | no -`debug` | If set to `true`, will log more information during runtime and try to update camera preview more often, defaults to `false` | no +| Property Name | Value | Required | +| ------------- | ------------------------------------------------------------------------------------------- | -------- | +| `platform` | Must be `Bloomsky` | yes | +| `apiKey` | Your personal [Bloomsky API](#bloomsky-api) authorization key | yes | +| `apiUrl` | Use default value for official public Bloomsky API: `https://api.bloomsky.com/api/skydata/` | no | ## Bloomsky API The BloomSky API provides the most recent data from your own devices! Follow these steps to obtain your own personal Bloomsky API key: + 1. Sign in to your Bloomsky account at: https://dashboard.bloomsky.com 1. In the left hand menu, select [Developers](https://dashboard.bloomsky.com/user#api) 1. The pop-up will show your personal API key @@ -62,6 +58,7 @@ Follow these steps to obtain your own personal Bloomsky API key: ## Donations Donations are very welcome and accepted at the following addresses: + - BTC: `3QTxu56V2gNdq1VznL7ftw3B4megXq5bix` - LTC: `MFDLN62hMNYDLMAWx4W6Z45nhDDLDjDUV7` @@ -70,13 +67,13 @@ Donations are very welcome and accepted at the following addresses: > Copyright 2018 Michael Henke > > Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +> you may not use this file except in compliance with the License. +> You may obtain a copy of the License at > -> http://www.apache.org/licenses/LICENSE-2.0 +> http://www.apache.org/licenses/LICENSE-2.0 > > Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +> distributed under the License is distributed on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +> See the License for the specific language governing permissions and +> limitations under the License. diff --git a/config.schema.json b/config.schema.json new file mode 100644 index 0000000..21bd99a --- /dev/null +++ b/config.schema.json @@ -0,0 +1,16 @@ +{ + "pluginAlias": "ExampleHomebridgePlugin", + "pluginType": "platform", + "singular": true, + "schema": { + "type": "object", + "properties": { + "name": { + "title": "Name", + "type": "string", + "required": true, + "default": "Example Dynamic Platform" + } + } + } +} \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 90ab7e5..0000000 --- a/index.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; - -var Bloomsky = require("./lib/Bloomsky").Bloomsky; - -module.exports = function(homebridge) { - console.log("homebridge API version: " + homebridge.version); - - // Accessory must be created from PlatformAccessory Constructor - Bloomsky.Accessory = homebridge.platformAccessory; - - // Service and Characteristic are from hap-nodejs - Bloomsky.Service = homebridge.hap.Service; - Bloomsky.Characteristic = homebridge.hap.Characteristic; - Bloomsky.Hap = homebridge.hap; - Bloomsky.UUIDGen = homebridge.hap.uuid; - - // For platform plugin to be considered as dynamic platform plugin, - // registerPlatform(pluginName, platformName, constructor, dynamic), dynamic must be true - homebridge.registerPlatform("homebridge-bloomsky", "Bloomsky", Bloomsky, true); -}; diff --git a/lib/AddressResponse.d.ts b/lib/AddressResponse.d.ts deleted file mode 100644 index 26355f2..0000000 --- a/lib/AddressResponse.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare class AddressResponse { - address: string; - type: string; -} -export { AddressResponse }; diff --git a/lib/AddressResponse.js b/lib/AddressResponse.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/AddressResponse.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/Bloomsky.d.ts b/lib/Bloomsky.d.ts deleted file mode 100644 index 45e5cd1..0000000 --- a/lib/Bloomsky.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import API from "./homebridge"; -import { FFMPEG } from "./Ffmpeg"; -import { IStation } from "./Station"; -import { PlatformAccessory } from "./PlatformAccessory"; -export { Bloomsky }; -export default class Bloomsky { - static Accessory: PlatformAccessory; - static Service: HAPNodeJS.Service; - static Characteristic: HAPNodeJS.Characteristic; - static Hap: HAPNodeJS.HAPNodeJS; - static UUIDGen: HAPNodeJS.uuid; - timeout: NodeJS.Timeout | undefined; - accessories: PlatformAccessory[]; - log: (text: string) => void; - private apiKey; - private apiUrl; - private vcodec; - private api; - private latestData; - private debug; - constructor(log: (text: string) => void, config: any, api: API); - configureAccessory(accessory: PlatformAccessory): void; - addAccessory(station: IStation): void; - updateAccessory(station: IStation): void; - removeAccessory(): void; - temporaryFilenameForStationUuid(uuid: string): string; - getFfmpegForStationWithUuid(uuid: string): FFMPEG; - private updateData; - private stationNeedsToBeRegistered; - private updateExistingAccessories; - private registerNewAccessories; - private updateAccessoriesReachability; -} diff --git a/lib/Bloomsky.js b/lib/Bloomsky.js deleted file mode 100644 index 0ec8592..0000000 --- a/lib/Bloomsky.js +++ /dev/null @@ -1,629 +0,0 @@ -"use strict"; -var __awaiter = - (this && this.__awaiter) || - function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done - ? resolve(result.value) - : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; -var __generator = - (this && this.__generator) || - function (thisArg, body) { - var _ = { - label: 0, - sent: function () { - if (t[0] & 1) throw t[1]; - return t[1]; - }, - trys: [], - ops: [], - }, - f, - y, - t, - g; - return ( - (g = { next: verb(0), throw: verb(1), return: verb(2) }), - typeof Symbol === "function" && - (g[Symbol.iterator] = function () { - return this; - }), - g - ); - function verb(n) { - return function (v) { - return step([n, v]); - }; - } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) - try { - if ( - ((f = 1), - y && - (t = - op[0] & 2 - ? y["return"] - : op[0] - ? y["throw"] || ((t = y["return"]) && t.call(y), 0) - : y.next) && - !(t = t.call(y, op[1])).done) - ) - return t; - if (((y = 0), t)) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: - t = op; - break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if ( - !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && - (op[0] === 6 || op[0] === 2) - ) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; - } - if (op[0] & 5) throw op[1]; - return { value: op[0] ? op[1] : void 0, done: true }; - } - }; -Object.defineProperty(exports, "__esModule", { value: true }); -var Client = require("typed-rest-client"); -var fs = require("fs"); -var http = require("http"); -var Ffmpeg_1 = require("./Ffmpeg"); -var Bloomsky = /** @class */ (function () { - // Platform constructor - // config may be null - // api may be null if launched from old homebridge version - function Bloomsky(log, config, api) { - if (Bloomsky.Accessory === undefined) { - throw Error("Accessory undefined"); - } - if (Bloomsky.Service === undefined) { - throw Error("Service undefined"); - } - if (Bloomsky.Characteristic === undefined) { - throw Error("Characteristic undefined"); - } - if (Bloomsky.Hap === undefined) { - throw Error("Hap undefined"); - } - if (Bloomsky.UUIDGen === undefined) { - throw Error("UUIDGen undefined"); - } - this.log = log; - this.accessories = []; - this.apiKey = config.apiKey; - this.apiUrl = config.apiUrl || "https://api.bloomsky.com/api/skydata/"; - this.vcodec = config.vcodec || "libx264"; - this.latestData = []; - this.debug = config.debug; - this.log("Bloomsky Init"); - var platform = this; - if (api) { - // Save the API object as plugin needs to register new accessory via this object - platform.api = api; - // Listen to event "didFinishLaunching", this means homebridge already finished loading cached accessories. - // Platform Plugin should only register new accessory that doesn't exist in homebridge after this event. - // Or start discover new accessories. - platform.api.on( - "didFinishLaunching", - function () { - platform.log("didFinishLaunching"); - platform.updateData().catch(function (clientError) { - platform.log(clientError); - }); - }.bind(this) - ); - platform.api.on("publishCameraAccessories", function () { - platform.log("publishCameraAccessories"); - }); - } else { - platform.updateData().catch(function (clientError) { - platform.log(clientError); - }); - } - } - // Function invoked when homebridge tries to restore cached accessory. - // Developer can configure accessory here (like setup event handler). - // Update current value. - Bloomsky.prototype.configureAccessory = function (accessory) { - if (this.debug) { - this.log("configuring accessory... " + accessory.displayName); - } - var platform = this; - var ffmpeg = this.getFfmpegForStationWithUuid(accessory.UUID); - try { - accessory.configureCameraSource(ffmpeg); - } catch (_a) { - accessory.cameraSource = ffmpeg; - } - for (var index in ffmpeg.services) { - if (ffmpeg.hasOwnProperty(index)) { - var service = ffmpeg.services[index]; - try { - accessory.removeService(service); - } catch (_b) { - if (this.debug) { - this.log("unable to remove existing camera service"); - } - } finally { - accessory.addService(service); - if (this.debug) { - this.log("added camera service: " + service.displayName); - } - } - } - } - // Do not add any existing services... but this is a good place to add services to earlier registered accessories - this.accessories.push(accessory); - // Set the accessory to reachable if plugin can currently process the accessory, - // otherwise set to false and update the reachability later by invoking - // accessory.updateReachability() - if (this.latestData != null && this.latestData.length > 0) { - if (this.debug) { - this.log("Configure Accessory " + accessory.displayName); - } - var stations = platform.latestData.filter(function (station) { - return accessory.UUID === Bloomsky.UUIDGen.generate(station.DeviceID); - }); - accessory.reachable = stations.length === 1 && stations[0] !== undefined; - if (accessory.reachable) { - this.updateAccessory(stations[0]); - } - } else { - if (this.debug) { - this.log("Can't Configure Accessory " + accessory.displayName); - } - accessory.reachable = false; - } - }; - // add accessory dynamically from outside event - Bloomsky.prototype.addAccessory = function (station) { - if (this.debug) { - this.log("Add Accessory: " + station.DeviceID); - } - var uuid = Bloomsky.UUIDGen.generate(station.DeviceID); - var newAccessory = new Bloomsky.Accessory(station.DeviceName, uuid); - var cameraSource = this.getFfmpegForStationWithUuid(uuid); - var countBefore = newAccessory.services.length; - newAccessory.configureCameraSource(cameraSource); - if (cameraSource.services.length === 0) { - throw Error("Camera Control came without services..."); - } else { - for (var _i = 0, _a = newAccessory.services; _i < _a.length; _i++) { - var service = _a[_i]; - if (this.debug) { - this.log( - service.UUID + - (service.subtype !== undefined ? "." + service.subtype : "") - ); - } - } - } - if (newAccessory.services.length <= countBefore) { - throw Error( - "Camera Control Service Registration failed... +" + - (cameraSource.services.length - countBefore) - ); - // } else if ( - // newAccessory.cameraSource !== cameraSource || - // newAccessory.services.length < cameraSource.services.length - // ) { - // throw Error( - // "Camera Control Service Registration failed... +" + - // (cameraSource.services.length - countBefore) - // ); - } else { - if (this.debug) { - this.log( - "Registered " + - (cameraSource.services.length - countBefore) + - " Camera Control Services" - ); - } - } - newAccessory - .addService(Bloomsky.Service.TemperatureSensor, "Temperature") - .getCharacteristic(Bloomsky.Characteristic.CurrentTemperature) - .updateValue(station.Data.Temperature); - newAccessory - .addService(Bloomsky.Service.LightSensor, "Luminance") - .getCharacteristic(Bloomsky.Characteristic.CurrentAmbientLightLevel) - .updateValue(station.Data.Luminance); - newAccessory - .addService(Bloomsky.Service.HumiditySensor, "Humidity") - .getCharacteristic(Bloomsky.Characteristic.CurrentRelativeHumidity) - .updateValue(station.Data.Humidity); - newAccessory - .addService(Bloomsky.Service.MotionSensor, "Rain") - .getCharacteristic(Bloomsky.Characteristic.MotionDetected) - .updateValue(station.Data.Rain); - newAccessory - .addService(Bloomsky.Service.OccupancySensor, "Night") - .getCharacteristic(Bloomsky.Characteristic.OccupancyDetected) - .updateValue(station.Data.Night); - // I only have a Sky 1 model so I can only make a guess about the battery level - // for this specific model. - if (station.Data.DeviceType === "SKY1") { - // clamp battery level between 0 and 100 - var batteryLevel = Math.max( - 0, - Math.min(100, (100 / 2600) * station.Data.Voltage) - ); - var batteryService = newAccessory.addService( - Bloomsky.Service.BatteryService, - "Battery" - ); - batteryService - .getCharacteristic(Bloomsky.Characteristic.BatteryLevel) - .updateValue(batteryLevel); - batteryService - .getCharacteristic(Bloomsky.Characteristic.ChargingState) - .updateValue(2); - batteryService - .getCharacteristic(Bloomsky.Characteristic.StatusLowBattery) - .updateValue(batteryLevel < 20); - } - var informationService = newAccessory.getService( - Bloomsky.Service.AccessoryInformation - ); - if (!informationService) { - informationService = newAccessory.addService( - Bloomsky.Service.AccessoryInformation, - station.DeviceName - ); - } - informationService - .getCharacteristic(Bloomsky.Characteristic.Manufacturer) - .updateValue("Bloomsky"); - informationService - .getCharacteristic(Bloomsky.Characteristic.Model) - .updateValue(station.Data.DeviceType); - informationService - .getCharacteristic(Bloomsky.Characteristic.SerialNumber) - .updateValue(station.DeviceID); - informationService - .getCharacteristic(Bloomsky.Characteristic.Identify) - .updateValue(false); - informationService - .getCharacteristic(Bloomsky.Characteristic.Name) - .updateValue(station.DeviceName); - informationService - .getCharacteristic(Bloomsky.Characteristic.FirmwareRevision) - .updateValue(station.Data.DeviceType); - if (this.debug) { - this.accessories.push(newAccessory); - } - this.log("new accessory pushed..."); - if (this.api !== undefined) { - // https://github.com/nfarina/homebridge/wiki/Supporting-IP-Camera - this.api.publishCameraAccessories( - "homebridge-bloomsky", - this.accessories - ); - } else { - throw TypeError("this.api UNDEFINED!!!"); - } - if (this.debug) { - this.log("new accessory registered..."); - } - if (this.debug) { - var output = ""; - for (var property in newAccessory) { - if (newAccessory.hasOwnProperty(property)) { - output += property + ": " + newAccessory[property] + "; "; - } - } - this.log(output); - } - }; - // add accessory dynamically from outside event - Bloomsky.prototype.updateAccessory = function (station) { - if (this.debug) { - this.log("Update Accessory"); - } - var platform = this; - var stationUuid = Bloomsky.UUIDGen.generate(station.DeviceID); - var accessory = platform.accessories.filter(function (anyAccessory) { - return anyAccessory.UUID === stationUuid; - })[0]; - accessory - .getService(Bloomsky.Service.TemperatureSensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentTemperature) - .updateValue(station.Data.Temperature); - accessory - .getService(Bloomsky.Service.LightSensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentAmbientLightLevel) - .updateValue(station.Data.Luminance); - accessory - .getService(Bloomsky.Service.HumiditySensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentRelativeHumidity) - .updateValue(station.Data.Humidity); - accessory - .getService(Bloomsky.Service.MotionSensor) - .getCharacteristic(Bloomsky.Characteristic.MotionDetected) - .updateValue(station.Data.Rain); - accessory - .getService(Bloomsky.Service.OccupancySensor) - .getCharacteristic(Bloomsky.Characteristic.OccupancyDetected) - .updateValue(station.Data.Night); - var informationService = accessory.getService( - Bloomsky.Service.AccessoryInformation - ); - informationService - .getCharacteristic(Bloomsky.Characteristic.Manufacturer) - .updateValue("Bloomsky"); - informationService - .getCharacteristic(Bloomsky.Characteristic.Model) - .updateValue(station.Data.DeviceType); - informationService - .getCharacteristic(Bloomsky.Characteristic.SerialNumber) - .updateValue(station.DeviceID); - informationService - .getCharacteristic(Bloomsky.Characteristic.Identify) - .updateValue(false); - informationService - .getCharacteristic(Bloomsky.Characteristic.Name) - .updateValue(station.DeviceName); - informationService - .getCharacteristic(Bloomsky.Characteristic.FirmwareRevision) - .updateValue(station.Data.DeviceType); - // I only have a Sky 1 model so I can only make a guess about the battery level - // for this specific model. - if (station.Data.DeviceType === "SKY1") { - // clamp battery level between 0 and 100 - var batteryLevel = Math.max( - 0, - Math.min(100, (100 / 2600) * station.Data.Voltage) - ); - var batteryService = accessory.getService( - Bloomsky.Service.BatteryService - ); - batteryService - .getCharacteristic(Bloomsky.Characteristic.BatteryLevel) - .updateValue(batteryLevel); - batteryService - .getCharacteristic(Bloomsky.Characteristic.ChargingState) - .updateValue(2); - batteryService - .getCharacteristic(Bloomsky.Characteristic.StatusLowBattery) - .updateValue(batteryLevel < 20); - } - var file = fs.createWriteStream( - this.temporaryFilenameForStationUuid(accessory.UUID) - ); - file.on("finish", function () { - file.close(); - if (platform.debug) { - platform.log("temporary file updated..."); - } - }); - http.get(station.Data.ImageURL, function (response) { - response.pipe(file); - platform.log("temporary file written"); - }); - }; - // remove accessory dynamically from outside event - Bloomsky.prototype.removeAccessory = function () { - if (this.debug) { - this.log("Remove Accessory"); - } - if (this.api !== undefined) { - this.api.unregisterPlatformAccessories( - "homebridge-bloomsky", - "Bloomsky", - this.accessories - ); - } - this.accessories = []; - }; - Bloomsky.prototype.temporaryFilenameForStationUuid = function (uuid) { - return uuid + ".jpg"; - }; - Bloomsky.prototype.getFfmpegForStationWithUuid = function (uuid) { - var filename = this.temporaryFilenameForStationUuid(uuid); - var ffmpeg = new Ffmpeg_1.FFMPEG( - Bloomsky.UUIDGen, - Bloomsky.Hap, - { - name: uuid, - videoConfig: { - debug: this.debug, - maxHeight: 640, - maxStreams: 1, - maxWidth: 640, - source: "-loop 1 -i " + filename, - vcodec: this.vcodec, - }, - }, - this.log, - "ffmpeg", - filename - ); - return ffmpeg; - }; - Bloomsky.prototype.updateData = function () { - return __awaiter(this, void 0, void 0, function () { - var platform_1, requestOptions, client, response, error; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!(this.apiKey === undefined)) return [3 /*break*/, 1]; - if (this.debug) { - this.log("Skipping updating data..."); - } - return [3 /*break*/, 3]; - case 1: - platform_1 = this; - requestOptions = { - additionalHeaders: { Authorization: this.apiKey }, - }; - client = new Client.RestClient("NodeJS"); - if (platform_1.debug) { - this.log("updateData"); - } - return [ - 4 /*yield*/, - client - .get(this.apiUrl + "?unit=intl", requestOptions) - .catch(function (clientError) { - if (platform_1.debug) { - platform_1.log(clientError); - } - }), - ]; - case 2: - response = _a.sent(); - error = response; - if (error !== undefined && error.detail) { - platform_1.log(error.detail); - } else if (response != null) { - if (response.result != null) { - platform_1.latestData = response.result; - } - if (response != null && platform_1.latestData.length > 0) { - if (platform_1.accessories.length > 0) { - platform_1.updateExistingAccessories(); - } - platform_1.registerNewAccessories(); - platform_1.updateAccessoriesReachability(); - } - } - platform_1.timeout = setTimeout( - function () { - platform_1.updateData().catch(function (clientError) { - platform_1.log(clientError); - }); - }.bind(platform_1), - platform_1.debug ? 30000 : 150000 - ); // 2.5 minutes, 10 seconds for debugging - platform_1.timeout.unref(); - _a.label = 3; - case 3: - return [2 /*return*/]; - } - }); - }); - }; - Bloomsky.prototype.stationNeedsToBeRegistered = function (station) { - if (this.debug) { - this.log("stationNeedsToBeRegistered: " + station); - } - var stationUuid = Bloomsky.UUIDGen.generate(station.DeviceID).valueOf(); - return ( - this.accessories.filter(function (accessory) { - return accessory.UUID.valueOf() === stationUuid; - }).length === 0 - ); - }; - Bloomsky.prototype.updateExistingAccessories = function () { - var _this = this; - if (this.debug) { - this.log("updateExistingAccessories"); - } - var platform = this; - if (this.debug) { - this.log(platform.latestData.toString()); - } - var registeredAccessories = platform.latestData.filter(function (station) { - return !_this.stationNeedsToBeRegistered(station); - }); - for (var i = 0, len = registeredAccessories.length; i < len; i++) { - var station = registeredAccessories[i]; - platform.updateAccessory(station); - } - }; - Bloomsky.prototype.registerNewAccessories = function () { - var _this = this; - if (this.debug) { - this.log("registerNewAccessories"); - } - var platform = this; - if (platform.latestData.length === 0) { - return; - } - var unregisteredAccessories = platform.latestData.filter(function ( - station - ) { - return _this.stationNeedsToBeRegistered(station); - }); - for (var i = 0, len = unregisteredAccessories.length; i < len; i++) { - platform.addAccessory(unregisteredAccessories[i]); - } - }; - Bloomsky.prototype.updateAccessoriesReachability = function () { - if (this.debug) { - this.log("Update Reachability"); - } - for (var _i = 0, _a = this.accessories; _i < _a.length; _i++) { - var accessory = _a[_i]; - // accessory.updateReachability(this.latestData != null); // Reachability update is no longer being supported - accessory.reachable = this.latestData != null; - } - }; - return Bloomsky; -})(); -exports.Bloomsky = Bloomsky; -exports.default = Bloomsky; diff --git a/lib/Ffmpeg.d.ts b/lib/Ffmpeg.d.ts deleted file mode 100644 index ff7fe46..0000000 --- a/lib/Ffmpeg.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { SessionInfo } from "./Session"; -import { SnapshotRequest } from "./SnapshotRequest"; -import { StreamController } from "./StreamController"; -import { StreamRequest } from "./StreamRequest"; -import { StreamResponse } from "./StreamResponse"; -export default class FFMPEG implements HAPNodeJS.CameraSource { - streamController: any; - streamControllers: StreamController[]; - cameraControllers: any[]; - pendingSessions: SessionInfo[]; - ongoingSessions: SessionInfo[]; - services: HAPNodeJS.Service[]; - name: string; - uuid: HAPNodeJS.uuid; - service: any; - private log; - private vcodec; - private videoProcessor; - private fps; - private maxBitrate; - private debug; - private ffmpegSource; - private ffmpegImageSource; - private stillImageFilename; - private sharp; - constructor(uuidfunc: HAPNodeJS.uuid, hap: any, cameraConfig: any, log: (text: string) => void, videoProcessor: string, stillImageFilename: string); - handleCloseConnection(connectionID: any): void; - handleSnapshotRequest(request: SnapshotRequest, callback: (error: any, Buffer: any) => any): void; - prepareStream(request: StreamRequest, callback: (response: StreamResponse) => void): void; - handleStreamRequest(request: StreamRequest): void; - createCameraControlService(): void; - private _createStreamControllers; -} -export { FFMPEG }; diff --git a/lib/Ffmpeg.js b/lib/Ffmpeg.js deleted file mode 100644 index e3e36d6..0000000 --- a/lib/Ffmpeg.js +++ /dev/null @@ -1,368 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var child_process_1 = require("child_process"); -var crypto = require("crypto"); -var ip = require("ip"); -var Jimp = require("jimp"); -var optional = require("optional"); -var FFMPEG = /** @class */ (function () { - function FFMPEG(uuidfunc, hap, cameraConfig, log, videoProcessor, stillImageFilename) { - this.streamControllers = []; - this.cameraControllers = []; - this.pendingSessions = []; - this.ongoingSessions = []; - this.services = []; - if (uuidfunc === undefined) { - throw Error("UUIDGen undefined"); - } - if (hap.Service === undefined) { - throw Error("Service undefined"); - } - if (log === undefined) { - throw Error("Log undefined"); - } - if (hap.StreamController === undefined) { - throw Error("StreamController undefined"); - } - if (cameraConfig.videoConfig.debug) { - log("FFMPEG constructor"); - } - this.sharp = optional("sharp"); - this.uuid = uuidfunc; - this.service = hap.Service; - this.log = log; - this.streamController = hap.StreamController; - var ffmpegOpt = cameraConfig.videoConfig; - this.name = cameraConfig.name; - this.vcodec = ffmpegOpt.vcodec; - this.videoProcessor = videoProcessor || "ffmpeg"; - this.fps = ffmpegOpt.maxFPS || 10; - this.maxBitrate = ffmpegOpt.maxBitrate || 300; - this.debug = ffmpegOpt.debug || false; - if (this.debug) { - log("Debug loggin enabled..."); - } - if (!ffmpegOpt.source) { - throw new Error("Missing source for camera."); - } - this.ffmpegSource = ffmpegOpt.source; - this.ffmpegImageSource = ffmpegOpt.stillImageSource; - this.stillImageFilename = stillImageFilename; - var numberOfStreams = ffmpegOpt.maxStreams || 2; - var options = { - audio: { - codecs: [ - { - samplerate: 24, - type: "OPUS", - }, - { - samplerate: 16, - type: "AAC-eld", - }, - ], - comfort_noise: false, - }, - disable_audio_proxy: false, - proxy: false, - srtp: true, - video: { - codec: { - levels: [0, 1, 2], - profiles: [0, 1, 2], - }, - resolutions: [ - [640, 640, 30], - [640, 640, 15], - [640, 480, 30], - [640, 480, 15], - [640, 360, 30], - [640, 360, 15], - [480, 360, 30], - [480, 360, 15], - [480, 270, 30], - [480, 270, 15], - [320, 240, 30], - [320, 240, 15], - [320, 180, 30], - [320, 180, 15], - ], - }, - }; - this.createCameraControlService(); - if (this.cameraControllers.length < 1) { - throw Error("Did not push camera controller..."); - } - this._createStreamControllers(numberOfStreams, options); - } - FFMPEG.prototype.handleCloseConnection = function (connectionID) { - if (this.debug) { - this.log("closing connection for " + this.streamControllers.length + " stream(s)..."); - } - this.streamControllers.forEach(function (controller) { - controller.handleCloseConnection(connectionID); - }); - }; - // Image request: {width: number, height: number} - // Please override this and invoke callback(error, image buffer) when the snapshot is ready - FFMPEG.prototype.handleSnapshotRequest = function (request, callback) { - var _this = this; - var dir = __dirname; - if (dir.endsWith("/lib")) { - dir = dir.replace("/lib", ""); - } - var path = dir + "/" + this.stillImageFilename; - if (this.debug) { - this.log("Delivering snapshot at path: " + path); - } - if (this.sharp == null) { - if (this.debug) { - this.log("... using Jimp"); - } - Jimp.read(path) - .then(function (image) { - image - .resize(request.width, Jimp.AUTO) - .crop(0, (image.bitmap.height - request.height) / 2, request.width, request.height) - .quality(90) - .getBuffer(Jimp.MIME_JPEG, function (error, buffer) { - if (error !== null) { - if (_this.debug) { - _this.log("Error getting buffer for snapshot: " + error); - } - callback(error, undefined); - } - else { - callback(undefined, buffer); - } - }); - }) - .catch(function (error) { - if (_this.debug) { - _this.log("Error reading snapshot at path: " + error); - } - callback(error, undefined); - }); - } - else { - if (this.debug) { - this.log("... using Sharp"); - } - this.sharp(path) - .resize(request.width, request.height) - .toBuffer() - .then(function (data) { return callback(undefined, data); }) - .catch(function (error) { return callback(error, undefined); }); - } - }; - FFMPEG.prototype.prepareStream = function (request, callback) { - if (this.debug) { - this.log("prepareStream"); - } - var sessionInfo = {}; - var sessionID = request.sessionID; - var targetAddress = request.targetAddress; - sessionInfo.address = targetAddress; - var response = {}; - var videoInfo = request.video; - if (videoInfo) { - var targetPort = videoInfo.port; - var srtpKey = videoInfo.srtp_key; - var srtpSalt = videoInfo.srtp_salt; - if (this.debug) { - this.log("srtpKey.length=" + srtpKey.length + ", srtpSalt.length=" + srtpSalt.length); - } - // SSRC is a 32 bit integer that is unique per stream - var ssrcSource = crypto.randomBytes(4); - ssrcSource[0] = 0; - var ssrc = ssrcSource.readInt32BE(0, true); - this.fps = videoInfo.fps || this.fps; - var videoResp = { - fps: videoInfo.fps, - height: videoInfo.height, - max_bit_rate: videoInfo.max_bit_rate, - port: targetPort, - srtp_key: srtpKey, - srtp_salt: srtpSalt, - ssrc: ssrc, - width: videoInfo.width, - }; - response.video = videoResp; - sessionInfo.video_port = targetPort; - sessionInfo.video_srtp = Buffer.concat([srtpKey, srtpSalt]); - sessionInfo.video_ssrc = ssrc; - } - var audioInfo = request.audio; - if (audioInfo) { - var targetPort = audioInfo.port; - var srtpKey = audioInfo.srtp_key; - var srtpSalt = audioInfo.srtp_salt; - // SSRC is a 32 bit integer that is unique per stream - var ssrcSource = crypto.randomBytes(4); - ssrcSource[0] = 0; - var ssrc = ssrcSource.readInt32BE(0, true); - var audioResp = { - port: targetPort, - srtp_key: srtpKey, - srtp_salt: srtpSalt, - ssrc: ssrc, - }; - response.audio = audioResp; - sessionInfo.audio_port = targetPort; - sessionInfo.audio_port = Buffer.concat([srtpKey, srtpSalt]); - sessionInfo.audio_ssrc = ssrc; - } - var currentAddress = ip.address(); - var addressResp = { - address: currentAddress, - type: "v6", - }; - if (ip.isV4Format(currentAddress)) { - addressResp.type = "v4"; - } - response.address = addressResp; - this.pendingSessions[this.uuid.unparse(sessionID, 0)] = sessionInfo; - callback(response); - }; - FFMPEG.prototype.handleStreamRequest = function (request) { - var _this = this; - if (this.debug) { - this.log("handleStreamRequest"); - } - var platform = this; - var sessionID = request.sessionID; - var requestType = request.type; - if (sessionID) { - var sessionIdentifier = this.uuid.unparse(sessionID, 0); - var sessionInfo = this.pendingSessions[sessionIdentifier]; - if (requestType === "start" && sessionInfo) { - var width = 640; - var height = 640; - var fps = this.fps || 15; - var vbitrate = this.maxBitrate; - var vcodec = this.vcodec || "libx264"; - var packetsize = 1316; // 188 376 - var videoInfo = request.video; - if (videoInfo) { - width = videoInfo.width; - height = videoInfo.height; - var expectedFPS = videoInfo.fps; - if (expectedFPS < fps) { - fps = expectedFPS; - } - if (videoInfo.max_bit_rate < vbitrate) { - vbitrate = videoInfo.max_bit_rate; - } - } - var targetAddress = sessionInfo.address; - var targetVideoPort = sessionInfo.video_port; - var videoKey = sessionInfo.video_srtp; - var videoSsrc = sessionInfo.video_ssrc; - var ffmpegCommand = "-threads 0 -an -re -r 1" + - " " + this.ffmpegSource + - " -vf fps=" + fps + - " -map 0:0" + - " -f mp4 -vcodec " + vcodec + - " -preset faster" + - " -pix_fmt yuv420p -an" + - " -r " + fps + - " -g " + (fps * 2) + - " -movflags frag_keyframe+empty_moov -tune stillimage" + - " -b:v " + vbitrate + "k" + - " -bufsize " + vbitrate + "k" + - " -maxrate " + vbitrate + "k" + - " -payload_type 99" + - " -ssrc " + videoSsrc + - " -f rtp" + - " -srtp_out_suite AES_CM_128_HMAC_SHA1_80" + - " -srtp_out_params " + videoKey.toString("base64") + - " srtp://" + targetAddress + ":" + targetVideoPort + - "?rtcpport=" + targetVideoPort + - "&localrtcpport=" + targetVideoPort + - "&pkt_size=" + packetsize; - var ffmpeg = child_process_1.spawn(this.videoProcessor, ffmpegCommand.split(" "), { env: process.env }); - this.log("Start streaming video from " + this.name + " with " + width + "x" + height + "@" + vbitrate + "kBit"); - if (this.debug) { - this.log("ffmpeg " + ffmpegCommand); - } - ffmpeg.stdout.on("data", function (data) { - // Do not log to the console if debugging is turned off - if (platform.debug) { - platform.log(data.toString()); - } - }); - // Always setup hook on stderr. - // Without this streaming stops within one to two minutes. - ffmpeg.stderr.on("data", function (data) { - // Do not log to the console if debugging is turned off - if (platform.debug) { - platform.log(data.toString()); - } - }); - ffmpeg.on("error", function (error) { - platform.log("An error occurs while making stream request"); - if (platform.debug) { - platform.log(error); - } - }); - ffmpeg.on("close", function (code) { - if (code == null || code === 0 || code === 255) { - platform.log("Stopped streaming"); - } - else { - platform.log("ERROR: FFmpeg exited with code " + code); - for (var _i = 0, _a = _this.streamControllers; _i < _a.length; _i++) { - var controller = _a[_i]; - if (controller.sessionIdentifier === sessionID) { - controller.forceStop(); - } - } - } - }); - this.ongoingSessions[sessionIdentifier] = ffmpeg; - delete this.pendingSessions[sessionIdentifier]; - } - else if (requestType === "stop") { - var ffmpegProcess = this.ongoingSessions[sessionIdentifier]; - if (ffmpegProcess) { - ffmpegProcess.kill("SIGTERM"); - } - delete this.ongoingSessions[sessionIdentifier]; - } - } - }; - FFMPEG.prototype.createCameraControlService = function () { - if (this.service.CameraControl === undefined) { - throw Error("CameraControl undefined"); - } - if (this.debug) { - this.log("createCameraControlService"); - } - var controlService = new this.service.CameraControl(); - this.services.push(controlService); - this.cameraControllers.push(controlService); - if (this.services.filter(function (s) { return s === controlService; }).length < 1) { - throw Error("Failed to register Camera Control Service..."); - } - }; - // Private - FFMPEG.prototype._createStreamControllers = function (maxStreams, options) { - if (this.debug) { - this.log("_createStreamControllers"); - } - for (var i = 0; i < maxStreams; i++) { - if (this.debug) { - this.log("adding StreamController #" + (i + 1) + "/" + maxStreams); - } - var streamController = new this.streamController(i, options, this); - this.services.push(streamController.service); - this.streamControllers.push(streamController); - } - if (this.debug) { - this.log(this.streamControllers.length + "/" + maxStreams + " stream controllers registered"); - } - }; - return FFMPEG; -}()); -exports.FFMPEG = FFMPEG; -exports.default = FFMPEG; diff --git a/lib/PlatformAccessory.d.ts b/lib/PlatformAccessory.d.ts deleted file mode 100644 index efeadaa..0000000 --- a/lib/PlatformAccessory.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -declare interface PlatformAccessory extends HAPNodeJS.Accessory { - displayName: string; - username: string; - pincode: string; - UUID: string; - aid: string; - bridged: boolean; - bridgedAccessories: HAPNodeJS.Accessory[]; - reachable: boolean; - category: HAPNodeJS.Accessory.Categories; - services: HAPNodeJS.Service[]; - cameraSource: HAPNodeJS.CameraSource; - Categories: typeof HAPNodeJS.Accessory.Categories; - new (displayName: string, category: string): PlatformAccessory; - new (displayName: string, uuid: string, subtype: number): PlatformAccessory; - addService(service: HAPNodeJS.Service | Function | HAPNodeJS.PredefinedService): HAPNodeJS.Service; - addService(service: HAPNodeJS.Service | HAPNodeJS.PredefinedService, displayName: string): HAPNodeJS.Service; - removeService(service: HAPNodeJS.Service): HAPNodeJS.Service; - removeService(service: HAPNodeJS.Service, displayName: string): HAPNodeJS.Service; - getService(service: HAPNodeJS.Service | HAPNodeJS.PredefinedService): HAPNodeJS.Service; - getService(name: string): HAPNodeJS.Service; - updateReachability(reachable: boolean): void; - addBridgedAccessory(accessory: HAPNodeJS.Accessory, deferUpdate: boolean): HAPNodeJS.Accessory; - addBridgedAccessories(accessories: HAPNodeJS.Accessory[]): void; - removeBridgedAccessory(accessory: HAPNodeJS.Accessory, deferUpdate: boolean): void; - removeBridgedAccessories(accessories: HAPNodeJS.Accessory[]): void; - getCharacteristicByIID(iid: string): HAPNodeJS.Characteristic; - getBridgedAccessoryByAID(aid: string): HAPNodeJS.Accessory; - findCharacteristic(aid: string, iid: string): HAPNodeJS.Accessory; - configureCameraSource(cameraSource: HAPNodeJS.CameraSource): void; - toHAP(opt: any): JSON; - publish(info: HAPNodeJS.PublishInfo, allowInsecureRequest: boolean): void; - destroy(): void; - setupURI(): string; -} -export { PlatformAccessory }; diff --git a/lib/PlatformAccessory.js b/lib/PlatformAccessory.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/PlatformAccessory.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/Session.d.ts b/lib/Session.d.ts deleted file mode 100644 index 4c1326f..0000000 --- a/lib/Session.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare class SessionInfo { - address: any; - video_port: any; - video_srtp: Buffer; - video_ssrc: number; - audio_port: any; - audio_ssrc: number; -} -export { SessionInfo }; diff --git a/lib/Session.js b/lib/Session.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/Session.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/SnapshotRequest.d.ts b/lib/SnapshotRequest.d.ts deleted file mode 100644 index fb89aba..0000000 --- a/lib/SnapshotRequest.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare class SnapshotRequest { - width: number; - height: number; -} -export { SnapshotRequest }; diff --git a/lib/SnapshotRequest.js b/lib/SnapshotRequest.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/SnapshotRequest.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/Station.d.ts b/lib/Station.d.ts deleted file mode 100644 index 8e44c52..0000000 --- a/lib/Station.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { URL } from "url"; -export declare interface IStation { - DeviceID: string; - DeviceName: string; - Data: IStationData; -} -export declare interface IStationData { - Temperature: number; - Luminance: number; - Humidity: number; - Rain: boolean; - Night: boolean; - Voltage: number; - DeviceType: string; - ImageURL: URL; -} diff --git a/lib/Station.js b/lib/Station.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/Station.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/StreamController.d.ts b/lib/StreamController.d.ts deleted file mode 100644 index e5606c9..0000000 --- a/lib/StreamController.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare class StreamController { - service: HAPNodeJS.Service; - sessionIdentifier: any; - constructor(identifier: any, options: any, cameraSource: HAPNodeJS.CameraSource); - forceStop(): void; - handleCloseConnection(connectionID: any): void; -} -export { StreamController }; diff --git a/lib/StreamController.js b/lib/StreamController.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/StreamController.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/StreamRequest.d.ts b/lib/StreamRequest.d.ts deleted file mode 100644 index 237fe0b..0000000 --- a/lib/StreamRequest.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { AudioResponse } from "./AudioResponse"; -import { VideoResponse } from "./VideoResponse"; -declare class StreamRequest { - sessionID: any; - type: any; - video: VideoResponse; - targetAddress: string; - audio: AudioResponse | undefined; -} -export { StreamRequest }; diff --git a/lib/StreamRequest.js b/lib/StreamRequest.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/StreamRequest.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/StreamResponse.d.ts b/lib/StreamResponse.d.ts deleted file mode 100644 index 5929628..0000000 --- a/lib/StreamResponse.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AddressResponse } from "./AddressResponse"; -import { AudioResponse } from "./AudioResponse"; -import { VideoResponse } from "./VideoResponse"; -declare class StreamResponse { - video: VideoResponse; - audio: AudioResponse; - address: AddressResponse; -} -export { StreamResponse }; diff --git a/lib/StreamResponse.js b/lib/StreamResponse.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/StreamResponse.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..43d9a23 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,9 @@ +{ + "watch": [ + "src" + ], + "ext": "ts", + "ignore": [], + "exec": "tsc && homebridge -I -D", + "signal": "SIGTERM" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2723f07..f66ab12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,362 +1,266 @@ { "name": "homebridge-bloomsky", - "version": "1.1.14", + "version": "1.2.0-alpha.1", "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/polyfill": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", - "integrity": "sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==", - "requires": { - "core-js": "^2.5.7", - "regenerator-runtime": "^0.11.1" - } - }, - "@jimp/bmp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.5.4.tgz", - "integrity": "sha512-P/ezH1FuoM3FwS0Dm2ZGkph4x5/rPBzFLEZor7KQkmGUnYEIEG4o0BUcAWFmJOp2HgzbT6O2SfrpJNBOcVACzQ==", + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "bmp-js": "^0.1.0", - "core-js": "^2.5.7" + "@babel/highlight": "^7.8.3" } }, - "@jimp/core": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.5.4.tgz", - "integrity": "sha512-n3uvHy2ndUKItmbhnRO8xmU8J6KR+v6CQxO9sbeUDpSc3VXc1PkqrA8ZsCVFCjnDFcGBXL+MJeCTyQzq5W9Crw==", - "requires": { - "@jimp/utils": "^0.5.0", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "core-js": "^2.5.7", - "exif-parser": "^0.1.12", - "file-type": "^9.0.0", - "load-bmfont": "^1.3.1", - "mkdirp": "0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" - } + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true }, - "@jimp/custom": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.5.4.tgz", - "integrity": "sha512-tLfyJoyouDl2J3RPFGfDzTtE+4S8ljqJUmLzy/cmx1n7+xS5TpLPdPskp7UaeAfNTqdF4CNAm94KYoxTZdj2mg==", + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, "requires": { - "@jimp/core": "^0.5.4", - "core-js": "^2.5.7" + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@jimp/gif": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.5.0.tgz", - "integrity": "sha512-HVB4c7b8r/yCpjhCjVNPRFLuujTav5UPmcQcFJjU6aIxmne6e29rAjRJEv3UMamHDGSu/96PzOsPZBO5U+ZGww==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "omggif": "^1.0.9" - } + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true }, - "@jimp/jpeg": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.5.4.tgz", - "integrity": "sha512-YaPWm+YSGCThNE/jLMckM3Qs6uaMxd/VsHOnEaqu5tGA4GFbfVaWHjKqkNGAFuiNV+HdgKlNcCOF3of+elvzqQ==", + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "jpeg-js": "^0.3.4" + "defer-to-connect": "^1.0.1" } }, - "@jimp/plugin-blit": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.5.4.tgz", - "integrity": "sha512-WqDYOugv76hF1wnKy7+xPGf9PUbcm9vPW28/jHWn1hjbb2GnusJ2fVEFad76J/1SPfhrQ2Uebf2QCWJuLmOqZg==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/chai": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", + "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", + "dev": true }, - "@jimp/plugin-blur": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.5.0.tgz", - "integrity": "sha512-5k0PXCA1RTJdITL7yMAyZ5tGQjKLHqFvwdXj/PCoBo5PuMyr0x6qfxmQEySixGk/ZHdDxMi80vYxHdKHjNNgjg==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true }, - "@jimp/plugin-color": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.5.5.tgz", - "integrity": "sha512-hWeOqNCmLguGYLhSvBrpfCvlijsMEVaLZAOod62s1rzWnujozyKOzm2eZe+W3To6mHbp5RGJNVrIwHBWMab4ug==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "tinycolor2": "^1.4.1" - } + "@types/debug": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.31.tgz", + "integrity": "sha512-LS1MCPaQKqspg7FvexuhmDbWUhE2yIJ+4AgVIyObfc06/UKZ8REgxGNjZc82wPLWmbeOm7S+gSsLgo75TanG4A==", + "dev": true }, - "@jimp/plugin-contain": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.5.4.tgz", - "integrity": "sha512-8YJh4FI3S69unri0nJsWeqVLeVGA77N2R0Ws16iSuCCD/5UnWd9FeWRrSbKuidBG6TdMBaG2KUqSYZeHeH9GOQ==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true }, - "@jimp/plugin-cover": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.5.4.tgz", - "integrity": "sha512-2Rur7b44WiDDgizUI2M2uYWc1RmfhU5KjKS1xXruobjQ0tXkf5xlrPXSushq0hB6Ne0Ss6wv0+/6eQ8WeGHU2w==", + "@types/ip": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/ip/-/ip-0.0.31.tgz", + "integrity": "sha512-oYk8aalgfCt7XfEu66Sjwz/aQjfRtQkjNSXwrUGqyRoQbOymAc156fUNTwn1cSCEEwuPPzMy7fGPmKcFLoaIkA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "@types/node": "*" } }, - "@jimp/plugin-crop": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.5.4.tgz", - "integrity": "sha512-6t0rqn4VazquGk48tO6hFBrQ+nkvC+A1RnR6UM/m8ZtG2/yjpwF0MXcpgJI1Fb+a4Ug7BY1fu2GPcZOhnAVK/g==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true }, - "@jimp/plugin-displace": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.5.0.tgz", - "integrity": "sha512-Bec7SQvnmKia4hOXEDjeNVx7vo/1bWqjuV6NO8xbNQcAO3gaCl91c9FjMDhsfAVb0Ou6imhbIuFPrLxorXsecQ==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/node": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz", + "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==", + "dev": true }, - "@jimp/plugin-dither": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.5.0.tgz", - "integrity": "sha512-We2WJQsD/Lm8oqBFp/vUv9/5r2avyenL+wNNu/s2b1HqA5O4sPGrjHy9K6vIov0NroQGCQ3bNznLkTmjiHKBcg==", + "@typescript-eslint/eslint-plugin": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "@typescript-eslint/experimental-utils": "2.34.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" } }, - "@jimp/plugin-flip": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.5.0.tgz", - "integrity": "sha512-D/ehBQxLMNR7oNd80KXo4tnSET5zEm5mR70khYOTtTlfti/DlLp3qOdjPOzfLyAdqO7Ly4qCaXrIsnia+pfPrA==", + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" } }, - "@jimp/plugin-gaussian": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.5.0.tgz", - "integrity": "sha512-Ln4kgxblv0/YzLBDb/J8DYPLhDzKH87Y8yHh5UKv3H+LPKnLaEG3L4iKTE9ivvdocnjmrtTFMYcWv2ERSPeHcg==", + "@typescript-eslint/parser": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-visitor-keys": "^1.1.0" } }, - "@jimp/plugin-invert": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.5.0.tgz", - "integrity": "sha512-/vyKeIi3T7puf+8ruWovTjzDC585EnTwJ+lGOOUYiNPsdn4JDFe1B3xd+Ayv9aCQbXDIlPElZaM9vd/+wqDiIQ==", + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } } }, - "@jimp/plugin-mask": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.5.4.tgz", - "integrity": "sha512-mUJ04pCrUWaJGXPjgoVbzhIQB8cVobj2ZEFlGO3BEAjyylYMrdJlNlsER8dd7UuJ2L/a4ocWtFDdsnuicnBghQ==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, - "@jimp/plugin-normalize": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.5.4.tgz", - "integrity": "sha512-Q5W0oEz9wxsjuhvHAJynI/OqXZcmqEAuRONQId7Aw5ulCXSOg9C4y2a67EO7aZAt55T+zMVxI9UpVUpzVvO6hw==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true }, - "@jimp/plugin-print": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.5.4.tgz", - "integrity": "sha512-DOZr5TY9WyMWFBD37oz7KpTEBVioFIHQF/gH5b3O5jjFyj4JPMkw7k3kVBve9lIrzIYrvLqe0wH59vyAwpeEFg==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "load-bmfont": "^1.4.0" - } + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true }, - "@jimp/plugin-resize": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.5.4.tgz", - "integrity": "sha512-lXNprNAT0QY1D1vG/1x6urUTlWuZe2dfL29P81ApW2Yfcio471+oqo45moX5FLS0q24xU600g7cHGf2/TzqSfA==", + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "@jimp/plugin-rotate": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.5.4.tgz", - "integrity": "sha512-SIdUpMc8clObMchy8TnjgHgcXEQM992z5KavgiuOnCuBlsmSHtE3MrXTOyMW0Dn3gqapV9Y5vygrLm/BVtCCsg==", + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } } }, - "@jimp/plugin-scale": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.5.0.tgz", - "integrity": "sha512-5InIOr3cNtrS5aQ/uaosNf28qLLc0InpNGKFmGFTv8oqZqLch6PtDTjDBZ1GGWsPdA/ljy4Qyy7mJO1QBmgQeQ==", + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } - }, - "@jimp/plugins": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.5.5.tgz", - "integrity": "sha512-9oF6LbSM/K7YkFCcxaPaD8NUkL/ZY8vT8NIGfQ/NpX+tKQtcsLHcRavHpUC+M1xXShv/QGx9OdBV/jgiu82QYg==", - "requires": { - "@jimp/plugin-blit": "^0.5.4", - "@jimp/plugin-blur": "^0.5.0", - "@jimp/plugin-color": "^0.5.5", - "@jimp/plugin-contain": "^0.5.4", - "@jimp/plugin-cover": "^0.5.4", - "@jimp/plugin-crop": "^0.5.4", - "@jimp/plugin-displace": "^0.5.0", - "@jimp/plugin-dither": "^0.5.0", - "@jimp/plugin-flip": "^0.5.0", - "@jimp/plugin-gaussian": "^0.5.0", - "@jimp/plugin-invert": "^0.5.0", - "@jimp/plugin-mask": "^0.5.4", - "@jimp/plugin-normalize": "^0.5.4", - "@jimp/plugin-print": "^0.5.4", - "@jimp/plugin-resize": "^0.5.4", - "@jimp/plugin-rotate": "^0.5.4", - "@jimp/plugin-scale": "^0.5.0", - "core-js": "^2.5.7", - "timm": "^1.6.1" - } - }, - "@jimp/png": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.5.4.tgz", - "integrity": "sha512-J2NU7368zihF1HUZdmpXsL/Hhyf+I3ubmK+6Uz3Uoyvtk1VS7dO3L0io6fJQutfWmPZ4bvu6Ry022oHjbi6QCA==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "pngjs": "^3.3.3" - } - }, - "@jimp/tiff": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.5.4.tgz", - "integrity": "sha512-hr7Zq3eWjAZ+itSwuAObIWMRNv7oHVM3xuEDC2ouP7HfE7woBtyhCyfA7u12KlgtM57gKWeogXqTlewRGVzx6g==", - "requires": { - "core-js": "^2.5.7", - "utif": "^2.0.1" - } - }, - "@jimp/types": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.5.4.tgz", - "integrity": "sha512-nbZXM6TsdpnYHIBd8ZuoxGpvmxc2SqiggY30/bhOP/VJQoDBzm2v/20Ywz5M0snpIK2SdYG52eZPNjfjqUP39w==", - "requires": { - "@jimp/bmp": "^0.5.4", - "@jimp/gif": "^0.5.0", - "@jimp/jpeg": "^0.5.4", - "@jimp/png": "^0.5.4", - "@jimp/tiff": "^0.5.4", - "core-js": "^2.5.7", - "timm": "^1.6.1" - } - }, - "@jimp/utils": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.5.0.tgz", - "integrity": "sha512-7H9RFVU+Li2XmEko0GGyzy7m7JjSc7qa+m8l3fUzYg2GtwASApjKF/LSG2AUQCUmDKFLdfIEVjxvKvZUJFEmpw==", - "requires": { - "core-js": "^2.5.7" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } } }, - "@types/chai": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", - "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", - "dev": true - }, - "@types/debug": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.31.tgz", - "integrity": "sha512-LS1MCPaQKqspg7FvexuhmDbWUhE2yIJ+4AgVIyObfc06/UKZ8REgxGNjZc82wPLWmbeOm7S+gSsLgo75TanG4A==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "@types/ip": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@types/ip/-/ip-0.0.31.tgz", - "integrity": "sha512-oYk8aalgfCt7XfEu66Sjwz/aQjfRtQkjNSXwrUGqyRoQbOymAc156fUNTwn1cSCEEwuPPzMy7fGPmKcFLoaIkA==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "@types/node": "*" + "color-convert": "^1.9.0" } }, - "@types/mocha": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", - "dev": true - }, - "@types/node": { - "version": "10.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.4.tgz", - "integrity": "sha512-0aFZiYCvoxyKP/Mg6PvqBb2UtWGIPf63r6rOAvRBrgyJOfanbL60yUH2U4FSpg+Yn6FW+JVYWtzn6hLTy745Fg==", - "dev": true - }, - "@types/sharp": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.21.0.tgz", - "integrity": "sha512-BmsCha5/lx2Afz2zwNo9F2txlkZ9HQf49N94lzSFmj5Oc7NfRMZguwVIhytb65qdY2zNF+azovzDNso6JUZpOw==", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "@types/node": "*" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -366,22 +270,23 @@ "sprintf-js": "~1.0.2" } }, - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true }, "async-wait-until": { "version": "1.2.4", @@ -389,15 +294,13 @@ "integrity": "sha512-H7ZR3cu1THxrJiDgevu+PgbyT0o5P/9nsCZj70ckruJCMWt/UOQmGo65wKWvEQN69MJk140x5/Z01ZQjzfwyOw==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "array-filter": "^1.0.0" } }, "balanced-match": { @@ -406,36 +309,93 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "bindings": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, - "bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" - }, "bonjour-hap": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.1.tgz", - "integrity": "sha512-JqJXX5+i1NRGt8GyIPb+nBNjwrHbWe5Pb+HSuRMG/B62tPRHQ4Jyv3yX7hy1pHfRrV2OhnWpd+ljBtMb24R5rA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.10.tgz", + "integrity": "sha512-vaqa4uUST8K5rj9QGe6GaSJ+6rQ24KzgkjdyZvoTpbKBti5xL/m8H9Dp9VmPdo434OAetqU5PKAn5izucrKEBA==", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", + "array-flatten": "^2.1.2", + "deep-equal": "^2.0.2", + "ip": "^1.1.5", + "multicast-dns": "^7.2.2", "multicast-dns-service-types": "^1.1.0" } }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -446,86 +406,139 @@ "concat-map": "0.0.1" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "fill-range": "^7.0.1" } }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "child_process": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", "integrity": "sha1-sffn/HPSXn/R1FWtyU4UODAYK1o=" }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -542,13 +555,10 @@ "dev": true }, "commander": { - "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", + "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", + "dev": true }, "concat-map": { "version": "0.0.1", @@ -556,179 +566,514 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } }, - "curve25519-n": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/curve25519-n/-/curve25519-n-1.4.0.tgz", - "integrity": "sha512-ihQ3M/Aj9PVbsNwuul1/PNnyFurl9ejZGJWw/361+SS9hEFLiM2ttde+BXiu3ooc4AQiIx2y1gEcGLTpLRAjKg==", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "bindings": "~1.3.0", - "nan": "^2.10.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decimal.js": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-7.5.1.tgz", - "integrity": "sha512-1K5Y6MykxQYfHBcFfAj2uBaLmwreq4MsjsvrlgcEOvg+X82IeeXlIVIVkBMiypksu+yo9vcYP6lfU3qTedofSQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, "requires": { - "type-detect": "^4.0.0" + "mimic-response": "^1.0.0" } }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz", + "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.5", + "es-get-iterator": "^1.1.0", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.0.5", + "isarray": "^2.0.5", + "object-is": "^1.1.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "buffer-indexof": "^1.0.0" + "object-keys": "^1.0.12" } }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true }, - "ed25519-hap": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/ed25519-hap/-/ed25519-hap-0.0.5.tgz", - "integrity": "sha512-6RPUW9BdnUjYz5lGjRfM0sOMa8d43sjWFFchGJhGKkevoZvB0oVp1ES9oDUK+QJoJO8EoJlgawNsxG2yvlMbYg==", + "dns-packet": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", + "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", "dev": true, "requires": { - "bindings": "^1.2.1", - "nan": "^2.10.0" + "ip": "^1.1.5", + "safe-buffer": "^5.1.1" } }, - "enhanced-resolve": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz", - "integrity": "sha1-oRXDJQS2MC6Fp2Jp16V8zdli41k=", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.3.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.3" + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "prr": "~1.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "fast-srp-hap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz", - "integrity": "sha1-N3Ek0Za8alFXquWze/X6NbtK0tk=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz", + "integrity": "sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA==", "dev": true }, - "file-type": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", - "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, "requires": { - "is-callable": "^1.1.3" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "futoin-hkdf": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.3.2.tgz", + "integrity": "sha512-3EVi3ETTyJg5PSXlxLCaUVVn0pSbDf62L3Gwxne7Uq+d8adOSNWQAad4gg7WToHkcgnCJb3Wlb1P8r4Evj4GPw==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -739,57 +1084,81 @@ "path-is-absolute": "^1.0.0" } }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" + "is-glob": "^4.0.1" } }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "requires": { + "ini": "^1.3.5" + } }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "hap-nodejs": { - "version": "0.4.47", - "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.4.47.tgz", - "integrity": "sha512-R+wybsxAP/R/NT3WazdY7ErAgyee1zRqvpHgTUkR5mkQHp88z46hcm50kVkFEYRHlpLclBBCqioP6EksHIOsbw==", - "dev": true, - "requires": { - "bonjour-hap": "^3.5.1", - "buffer-shims": "^1.0.0", - "curve25519-n": "^1.2.0", - "debug": "^2.2.0", - "decimal.js": "^7.2.3", - "ed25519-hap": "^0.0.5", - "fast-srp-hap": "^1.0.1", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.7.3.tgz", + "integrity": "sha512-kCPwdRizCPJk43eTSMtW2LtCh+it8rTYW7aGkhW8qFKPS4z5JQilpggvVJvdfmSy5l+L5F0/UyKwkeM/KsdrHA==", + "dev": true, + "requires": { + "bonjour-hap": "~3.5.8", + "debug": "^4.1.1", + "decimal.js": "^10.2.0", + "fast-srp-hap": "2.0.1", + "futoin-hkdf": "~1.3.2", "ip": "^1.1.3", - "node-persist": "^0.0.11" + "node-persist": "^0.0.11", + "tweetnacl": "^1.0.3" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "function-bind": "^1.1.1" } }, "has-flag": { @@ -798,738 +1167,1539 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, "homebridge": { - "version": "0.4.45", - "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-0.4.45.tgz", - "integrity": "sha512-zcyI0r4qF2hPmqrP5y45bz7sar3EdQSiqydXFuuTHeXmE4qnGZaxo+/4n3GYK22Yvp/wWBH3yxmm0ZGr+JyChQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-1.1.0.tgz", + "integrity": "sha512-OMs+1A2G6lkMOrAk0o1nmj8S3XkhwrInVwRDiyLB3aHRQS02KQ/Egv1stV9vDhjib86v3y3MLHIYYzbxKHLjPA==", "dev": true, "requires": { - "chalk": "^1.1.1", - "commander": "2.8.1", - "hap-nodejs": "0.4.47", - "node-persist": "^0.0.8", - "qrcode-terminal": "^0.11.0", - "semver": "5.0.3" + "chalk": "^3.0.0", + "commander": "5.0.0", + "hap-nodejs": "^0.7.3", + "node-persist": "^0.0.11", + "qrcode-terminal": "^0.12.0", + "semver": "^7.3.2", + "source-map-support": "^0.5.19" }, "dependencies": { - "mkdirp": { - "version": "0.3.5", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, - "node-persist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.8.tgz", - "integrity": "sha1-pWxzm8b/2c7vGcDo2JWXkX8Ikkk=", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "mkdirp": "~0.3.5", - "q": "~1.1.1" + "has-flag": "^4.0.0" } } } }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "safer-buffer": ">= 2.1.2 < 3" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-function": { + "ignore-by-default": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "jimp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.5.6.tgz", - "integrity": "sha512-H0nHTu6KgAgQzDxa38ew2dXbnRzKm1w5uEyhMIxqwCQVjwgarOjjkV/avbNLxfxRHAFaNp4rGIc/qm8P+uhX9A==", + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, "requires": { - "@babel/polyfill": "^7.0.0", - "@jimp/custom": "^0.5.4", - "@jimp/plugins": "^0.5.5", - "@jimp/types": "^0.5.4", - "core-js": "^2.5.7" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "jpeg-js": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.4.tgz", - "integrity": "sha512-6IzjQxvnlT8UlklNmDXIJMWxijULjqGrzgqc0OG7YadZdvm7KPQ1j0ehmQQHckgEWOfgpptzcnWgESovxudpTA==" + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "load-bmfont": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", - "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, - "make-error": { + "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "memory-fs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" }, "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "ms": "2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "color-name": "~1.1.4" } - } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typed-array": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", + "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.0", + "es-abstract": "^1.17.4", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", + "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", + "dev": true, + "requires": { + "dns-packet": "^4.0.0", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-persist": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", + "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", + "dev": true, + "requires": { + "mkdirp": "~0.5.1", + "q": "~1.1.1" + } + }, + "nodemon": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", + "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==", + "dev": true, + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optional": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", + "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "q": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", + "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", + "dev": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "dev": true + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "registry-auth-token": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" } }, - "mocha-logger": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/mocha-logger/-/mocha-logger-1.0.6.tgz", - "integrity": "sha512-D7Z3r1RkyaJOnlgokODdzt9p4ut0m3DVzEKp3r3tgeXIpdxp54z049Vc0EEh5hkhudfRN0dfUD10Fcj2WuOO3w==", + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "mocha": "^5.1.1" + "shebang-regex": "^1.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", "dev": true, "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "dev": true - }, - "nock": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/nock/-/nock-9.6.1.tgz", - "integrity": "sha512-EDgl/WgNQ0C1BZZlASOQkQdE6tAWXJi8QQlugqzN64JJkvZ7ILijZuG24r4vCC7yOfnm6HKpne5AGExLGCeBWg==", + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, "requires": { - "chai": "^4.1.2", - "debug": "^3.1.0", - "deep-equal": "^1.0.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.5", - "mkdirp": "^0.5.0", - "propagate": "^1.0.0", - "qs": "^6.5.1", - "semver": "^5.5.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true } } }, - "node-persist": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", - "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { - "mkdirp": "~0.5.1", - "q": "~1.1.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "omggif": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.9.tgz", - "integrity": "sha1-3LcCTazVDFK00wPwSALJHAV8dl8=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "wrappy": "1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==" - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" - }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" - }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, "requires": { - "for-each": "^0.3.2", - "trim": "0.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" - }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" - }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, "requires": { - "pngjs": "^3.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" } }, - "pngjs": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz", - "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q==" - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "propagate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", - "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=" - }, - "prr": { + "string.prototype.trimstart": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, - "q": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", - "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", - "dev": true + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } }, - "qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha1-/8bCii/Av7RwUrR+I/T0RqX7254=", + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "has-flag": "^3.0.0" } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } } }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", "dev": true }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "os-tmpdir": "~1.0.2" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "is-number": "^7.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "nopt": "~1.0.10" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "ts-node": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.1.tgz", + "integrity": "sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, - "tern": { - "version": "0.22.3", - "resolved": "https://registry.npmjs.org/tern/-/tern-0.22.3.tgz", - "integrity": "sha512-A2C8GbR6uJWjHUwxtxF14oY1g8oJDEhM+n9ugRowX+jr8JHgNUeOLrYTOi/LV/JK9KHpxnYwyuhnal9YDXeeDQ==", + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "dev": true, "requires": { - "acorn": "^5.4.0", - "enhanced-resolve": "^2.2.2", - "glob": "^7.1.1", - "minimatch": "^3.0.3", - "resolve-from": "2.0.0" + "tslib": "^1.8.1" } }, - "thunky": { + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "tweetnacl": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", "dev": true }, - "timm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.1.tgz", - "integrity": "sha512-hqDTYi/bWuDxL2i6T3v6nrvkAQ/1Bc060GSkVEQZp02zTSTB4CHSKsOkliequCftQaNRcjRqUZmpGWs5FfhrNg==" + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + "typed-rest-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.7.3.tgz", + "integrity": "sha512-CwTpx/TkRHGZoHkJhBcp4X8K3/WtlzSHVQR0OIFnt10j4tgy4ypgq/SrrgVpA1s6tAL49Q6J3R5C0Cgfh2ddqA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "1.8.3" + } }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.2.tgz", + "integrity": "sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw==", + "dev": true + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "requires": { + "debug": "^2.2.0" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, - "tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "crypto-random-string": "^2.0.0" + } + }, + "update-notifier": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", + "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" }, "dependencies": { "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "tslib": "^1.8.1" + "punycode": "^2.1.0" } }, - "tunnel": { - "version": "0.0.4", - "resolved": "http://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true }, - "typed-rest-client": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.0.11.tgz", - "integrity": "sha512-Iz2/p1EkJp8laAIlW/4h+3u+eJqmslosrX2wK1ofM74fCnRpM/EAPM+psjcQKomlNQrInKLPp/JYnsH4ZuzhQQ==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { - "nock": "9.6.1", - "tunnel": "0.0.4", - "underscore": "1.8.3" + "isexe": "^2.0.0" } }, - "typescript": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", - "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", - "dev": true + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "dev": true, + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } }, - "utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "which-typed-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", + "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", + "dev": true, "requires": { - "pako": "^1.0.5" + "available-typed-arrays": "^1.0.2", + "es-abstract": "^1.17.5", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrappy": { @@ -1538,45 +2708,37 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "mkdirp": "^0.5.1" } }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true } } diff --git a/package.json b/package.json index 4276292..09b6b99 100644 --- a/package.json +++ b/package.json @@ -1,55 +1,53 @@ { + "displayName": "Homebridge Bloomsky", "name": "homebridge-bloomsky", - "version": "1.2", + "version": "1.2.0-alpha.2", "description": "Homebridge plugin for Bloomsky weather stations", - "main": "index.js", - "devDependencies": { - "@types/chai": "^4.1.6", - "@types/debug": "0.0.31", - "@types/ip": "0.0.31", - "@types/mocha": "^5.2.5", - "@types/node": "^10.12.0", - "@types/sharp": "^0.21.0", - "async-wait-until": "^1.2.4", - "chai": "^4.2.0", - "hap-nodejs": "^0.4.47", - "homebridge": ">=0.4.42", - "mocha": "^7.1.2", - "mocha-logger": "^1.0.6", - "tern": "^0.22.3", - "ts-node": "^7.0.1", - "tslint": "^5.11.0", - "typescript": "^3.1.3" - }, - "scripts": { - "test": "mocha -r ts-node/register **/*.spec.ts", - "standalone": "node standalone.js" - }, + "author": "Michael Henke", + "license": "Apache-2.0", "repository": { "type": "git", "url": "git+https://github.com/aphex3k/homebridge-bloomsky.git" }, - "keywords": [ - "homebridge-plugin", - "bloomsky" - ], - "author": "Michael Henke", - "license": "Apache-2.0", "bugs": { "url": "https://github.com/aphex3k/homebridge-bloomsky/issues" }, "homepage": "https://github.com/aphex3k/homebridge-bloomsky#readme", + "engines": { + "node": ">=10.17.0", + "homebridge": ">0.4.53", + "npm": ">=6.4.1" + }, + "main": "dist/index.js", + "scripts": { + "lint": "eslint src/**.ts", + "watch": "npm run build && npm link && nodemon", + "build": "rimraf ./dist && tsc --build tsconfig.json", + "prepublishOnly": "npm run lint && npm run build" + }, + "keywords": [ + "homebridge-plugin", + "bloomsky" + ], "dependencies": { "child_process": "^1.0.2", "ip": "^1.1.5", - "jimp": "^0.5.6", "optional": "^0.1.4", "typed-rest-client": "^1.0.9" }, - "engines": { - "node": ">=6.2.2", - "homebridge": ">=0.4.42", - "npm": ">=6.4.1" - }, - "optionalDependencies": {} + "devDependencies": { + "@types/chai": "^4.1.6", + "@types/debug": "0.0.31", + "@types/ip": "0.0.31", + "@types/node": "^14.0.1", + "@typescript-eslint/eslint-plugin": "^2.34.0", + "@typescript-eslint/parser": "^2.34.0", + "async-wait-until": "^1.2.4", + "eslint": "^6.8.0", + "homebridge": "^1.1.0", + "nodemon": "^2.0.4", + "rimraf": "^3.0.2", + "ts-node": "^8.10.1", + "typescript": "^3.9.2" + } } diff --git a/preview.jpeg b/preview.jpeg deleted file mode 100644 index 5c295ba0a67529f63a38f5555ed11ba09598ffe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76207 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 lRe<8^H(A|jX-CAG(CJn# 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�Q&y<-pXgqbh~%kS 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 z void; - - private apiKey: string; - private apiUrl: string; - private vcodec: string; - private api: API | undefined; - private latestData: IStation[]; - private debug: boolean; - - // Platform constructor - // config may be null - // api may be null if launched from old homebridge version - constructor(log: (text: string) => void, config: any, api: API) { - if (Bloomsky.Accessory === undefined) { - throw Error("Accessory undefined"); - } - if (Bloomsky.Service === undefined) { - throw Error("Service undefined"); - } - if (Bloomsky.Characteristic === undefined) { - throw Error("Characteristic undefined"); - } - if (Bloomsky.Hap === undefined) { - throw Error("Hap undefined"); - } - if (Bloomsky.UUIDGen === undefined) { - throw Error("UUIDGen undefined"); - } - - this.log = log; - this.accessories = [] as PlatformAccessory[]; - this.apiKey = config.apiKey; - this.apiUrl = config.apiUrl || "https://api.bloomsky.com/api/skydata/"; - this.vcodec = config.vcodec || "libx264"; - this.latestData = [] as IStation[]; - this.debug = config.debug; - - this.log("Bloomsky Init"); - - const platform = this; - - if (api) { - // Save the API object as plugin needs to register new accessory via this object - platform.api = api; - - // Listen to event "didFinishLaunching", this means homebridge already finished loading cached accessories. - // Platform Plugin should only register new accessory that doesn't exist in homebridge after this event. - // Or start discover new accessories. - - platform.api.on( - "didFinishLaunching", - function () { - platform.log("didFinishLaunching"); - - platform.updateData().catch((clientError) => { - platform.log(clientError); - }); - }.bind(this) - ); - - platform.api.on("publishCameraAccessories", function () { - platform.log("publishCameraAccessories"); - }); - } else { - platform.updateData().catch((clientError) => { - platform.log(clientError); - }); - } - } - - // Function invoked when homebridge tries to restore cached accessory. - // Developer can configure accessory here (like setup event handler). - // Update current value. - public configureAccessory(accessory: PlatformAccessory) { - if (this.debug) { - this.log("configuring accessory... " + accessory.displayName); - } - - const platform = this; - const ffmpeg = this.getFfmpegForStationWithUuid(accessory.UUID); - - try { - accessory.configureCameraSource(ffmpeg); - } catch { - accessory.cameraSource = ffmpeg; - } - - for (const index in ffmpeg.services) { - if (ffmpeg.hasOwnProperty(index)) { - const service = ffmpeg.services[index]; - try { - accessory.removeService(service); - } catch { - if (this.debug) { - this.log("unable to remove existing camera service"); - } - } finally { - accessory.addService(service); - if (this.debug) { - this.log("added camera service: " + service.displayName); - } - } - } - } - - // Do not add any existing services... but this is a good place to add services to earlier registered accessories - - this.accessories.push(accessory); - // Set the accessory to reachable if plugin can currently process the accessory, - // otherwise set to false and update the reachability later by invoking - // accessory.updateReachability() - if (this.latestData != null && this.latestData.length > 0) { - if (this.debug) { - this.log("Configure Accessory " + accessory.displayName); - } - const stations = platform.latestData.filter( - (station) => - accessory.UUID === Bloomsky.UUIDGen.generate(station.DeviceID) - ); - - accessory.reachable = stations.length === 1 && stations[0] !== undefined; - - if (accessory.reachable) { - this.updateAccessory(stations[0]); - } - } else { - if (this.debug) { - this.log("Can't Configure Accessory " + accessory.displayName); - } - accessory.reachable = false; - } - } - - // add accessory dynamically from outside event - public addAccessory(station: IStation) { - if (this.debug) { - this.log("Add Accessory: " + station.DeviceID); - } - - const uuid = Bloomsky.UUIDGen.generate(station.DeviceID); - const newAccessory = new Bloomsky.Accessory(station.DeviceName, uuid); - const cameraSource = this.getFfmpegForStationWithUuid(uuid); - const countBefore = newAccessory.services.length; - - newAccessory.configureCameraSource(cameraSource); - - if (cameraSource.services.length === 0) { - throw Error("Camera Control came without services..."); - } else { - for (const service of newAccessory.services) { - if (this.debug) { - this.log( - service.UUID + - (service.subtype !== undefined ? "." + service.subtype : "") - ); - } - } - } - - if ( - newAccessory.services.length <= countBefore || - newAccessory.cameraSource !== cameraSource || - newAccessory.services.length < cameraSource.services.length - ) { - throw Error( - "Camera Control Service Registration failed... +" + - (cameraSource.services.length - countBefore) - ); - } else { - if (this.debug) { - this.log( - "Registered " + - (cameraSource.services.length - countBefore) + - " Camera Control Services" - ); - } - } - - newAccessory - .addService(Bloomsky.Service.TemperatureSensor, "Temperature") - .getCharacteristic(Bloomsky.Characteristic.CurrentTemperature) - .updateValue(station.Data.Temperature); - - newAccessory - .addService(Bloomsky.Service.LightSensor, "Luminance") - .getCharacteristic(Bloomsky.Characteristic.CurrentAmbientLightLevel) - .updateValue(station.Data.Luminance); - - newAccessory - .addService(Bloomsky.Service.HumiditySensor, "Humidity") - .getCharacteristic(Bloomsky.Characteristic.CurrentRelativeHumidity) - .updateValue(station.Data.Humidity); - - newAccessory - .addService(Bloomsky.Service.MotionSensor, "Rain") - .getCharacteristic(Bloomsky.Characteristic.MotionDetected) - .updateValue(station.Data.Rain); - - newAccessory - .addService(Bloomsky.Service.OccupancySensor, "Night") - .getCharacteristic(Bloomsky.Characteristic.OccupancyDetected) - .updateValue(station.Data.Night); - - // I only have a Sky 1 model so I can only make a guess about the battery level - // for this specific model. - if (station.Data.DeviceType === "SKY1") { - // clamp battery level between 0 and 100 - const batteryLevel = Math.max( - 0, - Math.min(100, (100 / 2600) * station.Data.Voltage) - ); - - const batteryService = newAccessory.addService( - Bloomsky.Service.BatteryService, - "Battery" - ); - batteryService - .getCharacteristic(Bloomsky.Characteristic.BatteryLevel) - .updateValue(batteryLevel); - batteryService - .getCharacteristic(Bloomsky.Characteristic.ChargingState) - .updateValue(2); - batteryService - .getCharacteristic(Bloomsky.Characteristic.StatusLowBattery) - .updateValue(batteryLevel < 20); - } - - let informationService = newAccessory.getService( - Bloomsky.Service.AccessoryInformation - ); - - if (!informationService) { - informationService = newAccessory.addService( - Bloomsky.Service.AccessoryInformation, - station.DeviceName - ); - } - informationService - .getCharacteristic(Bloomsky.Characteristic.Manufacturer) - .updateValue("Bloomsky"); - informationService - .getCharacteristic(Bloomsky.Characteristic.Model) - .updateValue(station.Data.DeviceType); - informationService - .getCharacteristic(Bloomsky.Characteristic.SerialNumber) - .updateValue(station.DeviceID); - informationService - .getCharacteristic(Bloomsky.Characteristic.Identify) - .updateValue(false); - informationService - .getCharacteristic(Bloomsky.Characteristic.Name) - .updateValue(station.DeviceName); - informationService - .getCharacteristic(Bloomsky.Characteristic.FirmwareRevision) - .updateValue(station.Data.DeviceType); - - if (this.debug) { - this.accessories.push(newAccessory); - } - - this.log("new accessory pushed..."); - - if (this.api !== undefined) { - // https://github.com/nfarina/homebridge/wiki/Supporting-IP-Camera - this.api.publishCameraAccessories( - "homebridge-bloomsky", - this.accessories - ); - } else { - throw TypeError("this.api UNDEFINED!!!"); - } - - if (this.debug) { - this.log("new accessory registered..."); - } - - if (this.debug) { - let output = ""; - for (const property in newAccessory) { - if (newAccessory.hasOwnProperty(property)) { - output += property + ": " + newAccessory[property] + "; "; - } - } - this.log(output); - } - } - - // add accessory dynamically from outside event - public updateAccessory(station: IStation) { - if (this.debug) { - this.log("Update Accessory"); - } - - const platform = this; - const stationUuid = Bloomsky.UUIDGen.generate(station.DeviceID); - const accessory = platform.accessories.filter( - (anyAccessory) => anyAccessory.UUID === stationUuid - )[0] as PlatformAccessory; - - accessory - .getService(Bloomsky.Service.TemperatureSensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentTemperature) - .updateValue(station.Data.Temperature); - - accessory - .getService(Bloomsky.Service.LightSensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentAmbientLightLevel) - .updateValue(station.Data.Luminance); - - accessory - .getService(Bloomsky.Service.HumiditySensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentRelativeHumidity) - .updateValue(station.Data.Humidity); - - accessory - .getService(Bloomsky.Service.MotionSensor) - .getCharacteristic(Bloomsky.Characteristic.MotionDetected) - .updateValue(station.Data.Rain); - - accessory - .getService(Bloomsky.Service.OccupancySensor) - .getCharacteristic(Bloomsky.Characteristic.OccupancyDetected) - .updateValue(station.Data.Night); - - const informationService = accessory.getService( - Bloomsky.Service.AccessoryInformation - ); - informationService - .getCharacteristic(Bloomsky.Characteristic.Manufacturer) - .updateValue("Bloomsky"); - informationService - .getCharacteristic(Bloomsky.Characteristic.Model) - .updateValue(station.Data.DeviceType); - informationService - .getCharacteristic(Bloomsky.Characteristic.SerialNumber) - .updateValue(station.DeviceID); - informationService - .getCharacteristic(Bloomsky.Characteristic.Identify) - .updateValue(false); - informationService - .getCharacteristic(Bloomsky.Characteristic.Name) - .updateValue(station.DeviceName); - informationService - .getCharacteristic(Bloomsky.Characteristic.FirmwareRevision) - .updateValue(station.Data.DeviceType); - - // I only have a Sky 1 model so I can only make a guess about the battery level - // for this specific model. - if (station.Data.DeviceType === "SKY1") { - // clamp battery level between 0 and 100 - const batteryLevel = Math.max( - 0, - Math.min(100, (100 / 2600) * station.Data.Voltage) - ); - - const batteryService = accessory.getService( - Bloomsky.Service.BatteryService - ); - batteryService - .getCharacteristic(Bloomsky.Characteristic.BatteryLevel) - .updateValue(batteryLevel); - batteryService - .getCharacteristic(Bloomsky.Characteristic.ChargingState) - .updateValue(2); - batteryService - .getCharacteristic(Bloomsky.Characteristic.StatusLowBattery) - .updateValue(batteryLevel < 20); - } - - const file = fs.createWriteStream( - this.temporaryFilenameForStationUuid(accessory.UUID) - ); - file.on("finish", function () { - file.close(); - if (platform.debug) { - platform.log("temporary file updated..."); - } - }); - http.get(station.Data.ImageURL, function (response) { - response.pipe(file); - platform.log("temporary file written"); - }); - } - - // remove accessory dynamically from outside event - public removeAccessory() { - if (this.debug) { - this.log("Remove Accessory"); - } - - if (this.api !== undefined) { - this.api.unregisterPlatformAccessories( - "homebridge-bloomsky", - "Bloomsky", - this.accessories - ); - } - this.accessories = [] as PlatformAccessory[]; - } - - public temporaryFilenameForStationUuid(uuid: string): string { - return uuid + ".jpg"; - } - - public getFfmpegForStationWithUuid(uuid: string): FFMPEG { - const filename = this.temporaryFilenameForStationUuid(uuid); - - const ffmpeg = new FFMPEG( - Bloomsky.UUIDGen, - Bloomsky.Hap, - { - name: uuid, - videoConfig: { - debug: this.debug, - maxHeight: 640, - maxStreams: 1, - maxWidth: 640, - source: "-loop 1 -i " + filename, - vcodec: this.vcodec, - }, - }, - this.log, - "ffmpeg", - filename - ); - - return ffmpeg; - } - - private async updateData() { - if (this.apiKey === undefined) { - if (this.debug) { - this.log("Skipping updating data..."); - } - } else { - const platform = this; - - const requestOptions: Client.IRequestOptions = { - additionalHeaders: { Authorization: this.apiKey } as IHeaders, - }; - - const client = new Client.RestClient("NodeJS"); - - if (platform.debug) { - this.log("updateData"); - } - - const response = await client - .get(this.apiUrl + "?unit=intl", requestOptions) - .catch((clientError) => { - if (platform.debug) { - platform.log(clientError); - } - }); - - const error: any = response as any; - if (error !== undefined && error.detail) { - platform.log(error.detail); - } else if (response != null) { - if (response.result != null) { - platform.latestData = response.result; - } - - if (response != null && platform.latestData.length > 0) { - if (platform.accessories.length > 0) { - platform.updateExistingAccessories(); - } - platform.registerNewAccessories(); - platform.updateAccessoriesReachability(); - } - } - - platform.timeout = setTimeout( - function () { - platform.updateData().catch((clientError) => { - platform.log(clientError); - }); - }.bind(platform), - platform.debug ? 30000 : 150000 - ); // 2.5 minutes, 10 seconds for debugging - platform.timeout.unref(); - } - } - - private stationNeedsToBeRegistered(station: IStation) { - if (this.debug) { - this.log("stationNeedsToBeRegistered: " + station); - } - const stationUuid = Bloomsky.UUIDGen.generate(station.DeviceID).valueOf(); - return ( - this.accessories.filter( - (accessory) => accessory.UUID.valueOf() === stationUuid - ).length === 0 - ); - } - - private updateExistingAccessories() { - if (this.debug) { - this.log("updateExistingAccessories"); - } - const platform = this; - - if (this.debug) { - this.log(platform.latestData.toString()); - } - - const registeredAccessories = platform.latestData.filter( - (station) => !this.stationNeedsToBeRegistered(station) - ); - - for (let i = 0, len = registeredAccessories.length; i < len; i++) { - const station = registeredAccessories[i]; - platform.updateAccessory(station); - } - } - - private registerNewAccessories() { - if (this.debug) { - this.log("registerNewAccessories"); - } - const platform = this; - - if (platform.latestData.length === 0) { - return; - } - const unregisteredAccessories = platform.latestData.filter((station) => - this.stationNeedsToBeRegistered(station) - ); - - for (let i = 0, len = unregisteredAccessories.length; i < len; i++) { - platform.addAccessory(unregisteredAccessories[i]); - } - } - - private updateAccessoriesReachability() { - if (this.debug) { - this.log("Update Reachability"); - } - for (const accessory of this.accessories) { - // accessory.updateReachability(this.latestData != null); // Reachability update is no longer being supported - accessory.reachable = this.latestData != null; - } - } -} diff --git a/src/Ffmpeg.ts b/src/Ffmpeg.ts deleted file mode 100644 index 63f3b88..0000000 --- a/src/Ffmpeg.ts +++ /dev/null @@ -1,414 +0,0 @@ -import { spawn } from "child_process"; -import * as crypto from "crypto"; -import hapnodejs = require("hap-nodejs"); -import * as ip from "ip"; -import Jimp = require("jimp"); -import optional = require("optional"); -import { AddressResponse } from "./AddressResponse"; -import { AudioResponse } from "./AudioResponse"; -import { SessionInfo } from "./Session"; -import { SnapshotRequest } from "./SnapshotRequest"; -import { StreamController } from "./StreamController"; -import { StreamRequest } from "./StreamRequest"; -import { StreamResponse } from "./StreamResponse"; -import { VideoResponse } from "./VideoResponse"; - -export default class FFMPEG implements HAPNodeJS.CameraSource { - public streamController: any; - public streamControllers: StreamController[] = []; - public cameraControllers: any[] = []; - public pendingSessions: SessionInfo[] = []; - public ongoingSessions: SessionInfo[] = []; - public services: HAPNodeJS.Service[] = []; - public name: string; - public uuid: HAPNodeJS.uuid; - public service: any; - - private log: (text: string) => void; - private vcodec: string; - private videoProcessor: string; - private fps: number; - private maxBitrate: number; - private debug: boolean; - private ffmpegSource: string; - private ffmpegImageSource: string; - private stillImageFilename: string; - private sharp: any; - - constructor( - uuidfunc: HAPNodeJS.uuid, - hap: any, - cameraConfig: any, - log: (text: string) => void, - videoProcessor: string, - stillImageFilename: string) { - - if (uuidfunc === undefined) { throw Error("UUIDGen undefined"); } - if (hap.Service === undefined) { throw Error("Service undefined"); } - if (log === undefined) { throw Error("Log undefined"); } - if (hap.StreamController === undefined) { throw Error("StreamController undefined"); } - - if (cameraConfig.videoConfig.debug) { log("FFMPEG constructor"); } - - this.sharp = optional("sharp"); - - this.uuid = uuidfunc; - this.service = hap.Service; - this.log = log; - this.streamController = hap.StreamController; - - const ffmpegOpt = cameraConfig.videoConfig; - this.name = cameraConfig.name; - this.vcodec = ffmpegOpt.vcodec; - this.videoProcessor = videoProcessor || "ffmpeg"; - this.fps = ffmpegOpt.maxFPS || 10; - this.maxBitrate = ffmpegOpt.maxBitrate || 300; - this.debug = ffmpegOpt.debug || false; - - if (this.debug) { log("Debug loggin enabled..."); } - - if (!ffmpegOpt.source) { - throw new Error("Missing source for camera."); - } - - this.ffmpegSource = ffmpegOpt.source; - this.ffmpegImageSource = ffmpegOpt.stillImageSource; - this.stillImageFilename = stillImageFilename; - - const numberOfStreams: number = ffmpegOpt.maxStreams || 2; - - const options = { - audio: { - codecs: [ - { - samplerate: 24, // 8, 16, 24 KHz - type: "OPUS", // Audio Codec - }, - { - samplerate: 16, - type: "AAC-eld", - }, - ], - comfort_noise: false, - }, - disable_audio_proxy: false, // If proxy = true, you can opt out audio proxy via this - proxy: false, // Requires RTP/RTCP MUX Proxy - srtp: true, // Supports SRTP AES_CM_128_HMAC_SHA1_80 encryption - video: { - codec: { - levels: [0, 1, 2], // Enum, please refer StreamController.VideoCodecParamLevelTypes - profiles: [0, 1, 2], // Enum, please refer StreamController.VideoCodecParamProfileIDTypes - }, - resolutions: [ - [640, 640, 30], - [640, 640, 15], - [640, 480, 30], - [640, 480, 15], - [640, 360, 30], - [640, 360, 15], - [480, 360, 30], - [480, 360, 15], - [480, 270, 30], - [480, 270, 15], - [320, 240, 30], - [320, 240, 15], // Apple Watch requires this configuration - [320, 180, 30], - [320, 180, 15], - ], - }, - }; - - this.createCameraControlService(); - - if (this.cameraControllers.length < 1) { - throw Error("Did not push camera controller..."); - } - - this._createStreamControllers(numberOfStreams, options); - } - - public handleCloseConnection(connectionID: any) { - if (this.debug) { this.log("closing connection for " + this.streamControllers.length + " stream(s)..."); } - this.streamControllers.forEach(function(controller: StreamController) { - controller.handleCloseConnection(connectionID); - }); - } - - // Image request: {width: number, height: number} - // Please override this and invoke callback(error, image buffer) when the snapshot is ready - public handleSnapshotRequest(request: SnapshotRequest, callback: (error: any, Buffer) => any) { - - let dir = __dirname; - if (dir.endsWith("/lib")) { - dir = dir.replace("/lib", ""); - } - const path = dir + "/" + this.stillImageFilename; - - if (this.debug) { this.log("Delivering snapshot at path: " + path); } - - if (this.sharp == null) { - if (this.debug) { this.log("... using Jimp"); } - Jimp.read(path) - .then((image) => { - image - .resize(request.width, Jimp.AUTO) - .crop(0, (image.bitmap.height - request.height) / 2, request.width, request.height) - .quality(90) - .getBuffer(Jimp.MIME_JPEG, (error, buffer) => { - if (error !== null) { - if (this.debug) { this.log("Error getting buffer for snapshot: " + error); } - callback(error, undefined); - } else { - callback(undefined, buffer); - } - }); - }) - .catch((error) => { - if (this.debug) { this.log("Error reading snapshot at path: " + error); } - callback(error, undefined); - }); - } else { - if (this.debug) { this.log("... using Sharp"); } - this.sharp(path) - .resize(request.width, request.height) - .toBuffer() - .then((data) => callback(undefined, data)) - .catch((error) => callback(error, undefined)); - } - } - - public prepareStream(request: StreamRequest, callback: (response: StreamResponse) => void) { - if (this.debug) { this.log("prepareStream"); } - - const sessionInfo = {} as SessionInfo; - const sessionID = request.sessionID; - const targetAddress = request.targetAddress; - - sessionInfo.address = targetAddress; - - const response = {} as StreamResponse; - const videoInfo = request.video; - - if (videoInfo) { - const targetPort: number = videoInfo.port; - const srtpKey: Uint8Array = videoInfo.srtp_key; - const srtpSalt: Uint8Array = videoInfo.srtp_salt; - - if (this.debug) { this.log ("srtpKey.length=" + srtpKey.length + ", srtpSalt.length=" + srtpSalt.length); } - - // SSRC is a 32 bit integer that is unique per stream - const ssrcSource = crypto.randomBytes(4); - ssrcSource[0] = 0; - const ssrc = ssrcSource.readInt32BE(0, true); - - this.fps = videoInfo.fps || this.fps; - - const videoResp: VideoResponse = { - fps: videoInfo.fps, - height: videoInfo.height, - max_bit_rate: videoInfo.max_bit_rate, - port: targetPort, - srtp_key: srtpKey, - srtp_salt: srtpSalt, - ssrc, - width: videoInfo.width, - }; - - response.video = videoResp; - - sessionInfo.video_port = targetPort; - sessionInfo.video_srtp = Buffer.concat([srtpKey, srtpSalt]); - sessionInfo.video_ssrc = ssrc; - } - - const audioInfo = request.audio; - - if (audioInfo) { - const targetPort = audioInfo.port; - const srtpKey = audioInfo.srtp_key; - const srtpSalt = audioInfo.srtp_salt; - - // SSRC is a 32 bit integer that is unique per stream - const ssrcSource = crypto.randomBytes(4); - ssrcSource[0] = 0; - const ssrc = ssrcSource.readInt32BE(0, true); - - const audioResp: AudioResponse = { - port: targetPort, - srtp_key: srtpKey, - srtp_salt: srtpSalt, - ssrc, - }; - - response.audio = audioResp; - - sessionInfo.audio_port = targetPort; - sessionInfo.audio_port = Buffer.concat([srtpKey, srtpSalt]); - sessionInfo.audio_ssrc = ssrc; - } - - const currentAddress = ip.address(); - const addressResp: AddressResponse = { - address: currentAddress, - type: "v6", - }; - - if (ip.isV4Format(currentAddress)) { - addressResp.type = "v4"; - } - - response.address = addressResp; - this.pendingSessions[this.uuid.unparse(sessionID, 0)] = sessionInfo; - - callback(response); - } - - public handleStreamRequest(request: StreamRequest) { - if (this.debug) { this.log("handleStreamRequest"); } - const platform = this; - const sessionID = request.sessionID; - const requestType = request.type; - if (sessionID) { - const sessionIdentifier = this.uuid.unparse(sessionID, 0); - const sessionInfo = this.pendingSessions[sessionIdentifier]; - - if (requestType === "start" && sessionInfo) { - let width = 640; - let height = 640; - let fps = this.fps || 15; - let vbitrate = this.maxBitrate; - const vcodec = this.vcodec || "libx264"; - const packetsize = 1316; // 188 376 - - const videoInfo = request.video; - if (videoInfo) { - width = videoInfo.width; - height = videoInfo.height; - - const expectedFPS = videoInfo.fps; - if (expectedFPS < fps) { - fps = expectedFPS; - } - if (videoInfo.max_bit_rate < vbitrate) { - vbitrate = videoInfo.max_bit_rate; - } - } - - const targetAddress = sessionInfo.address; - const targetVideoPort = sessionInfo.video_port; - const videoKey = sessionInfo.video_srtp; - const videoSsrc = sessionInfo.video_ssrc; - - const ffmpegCommand = - "-threads 0 -an -re -r 1" + - " " + this.ffmpegSource + - " -vf fps=" + fps + - " -map 0:0" + - " -f mp4 -vcodec " + vcodec + - " -preset faster" + - " -pix_fmt yuv420p -an" + - " -r " + fps + - " -g " + (fps * 2) + - " -movflags frag_keyframe+empty_moov -tune stillimage" + - " -b:v " + vbitrate + "k" + - " -bufsize " + vbitrate + "k" + - " -maxrate " + vbitrate + "k" + - " -payload_type 99" + - " -ssrc " + videoSsrc + - " -f rtp" + - " -srtp_out_suite AES_CM_128_HMAC_SHA1_80" + - " -srtp_out_params " + videoKey.toString("base64") + - " srtp://" + targetAddress + ":" + targetVideoPort + - "?rtcpport=" + targetVideoPort + - "&localrtcpport=" + targetVideoPort + - "&pkt_size=" + packetsize; - - const ffmpeg = spawn(this.videoProcessor, ffmpegCommand.split(" "), {env: process.env}); - this.log( - "Start streaming video from " + this.name + " with " + width + "x" + height + "@" + vbitrate + "kBit"); - - if (this.debug) { - this.log("ffmpeg " + ffmpegCommand); - } - - ffmpeg.stdout.on("data", function(data) { - // Do not log to the console if debugging is turned off - if (platform.debug) { - platform.log(data.toString()); - } - }); - // Always setup hook on stderr. - // Without this streaming stops within one to two minutes. - ffmpeg.stderr.on("data", function(data) { - // Do not log to the console if debugging is turned off - if (platform.debug) { - platform.log(data.toString()); - } - }); - ffmpeg.on("error", function(error: any) { - platform.log("An error occurs while making stream request"); - if (platform.debug) { - platform.log(error); - } - }); - ffmpeg.on("close", (code) => { - if (code == null || code === 0 || code === 255) { - platform.log("Stopped streaming"); - } else { - platform.log("ERROR: FFmpeg exited with code " + code); - for (const controller of this.streamControllers) { - if (controller.sessionIdentifier === sessionID) { - controller.forceStop(); - } - } - } - }); - this.ongoingSessions[sessionIdentifier] = ffmpeg; - - delete this.pendingSessions[sessionIdentifier]; - - } else if (requestType === "stop") { - const ffmpegProcess = this.ongoingSessions[sessionIdentifier]; - if (ffmpegProcess) { - ffmpegProcess.kill("SIGTERM"); - } - delete this.ongoingSessions[sessionIdentifier]; - } - } - } - - public createCameraControlService() { - if (this.service.CameraControl === undefined) { - throw Error("CameraControl undefined"); - } - - if (this.debug) { this.log("createCameraControlService"); } - - const controlService = new this.service.CameraControl(); - - this.services.push(controlService); - this.cameraControllers.push(controlService); - - if (this.services.filter((s) => s === controlService).length < 1) { - throw Error ("Failed to register Camera Control Service..."); - } - } - - // Private - private _createStreamControllers(maxStreams, options) { - - if (this.debug) { this.log("_createStreamControllers"); } - - for (let i = 0; i < maxStreams; i++) { - if (this.debug) { this.log("adding StreamController #" + (i + 1) + "/" + maxStreams); } - const streamController = new this.streamController(i, options, this); - - this.services.push(streamController.service); - this.streamControllers.push(streamController); - } - - if (this.debug) { this.log(this.streamControllers.length + "/" + maxStreams + " stream controllers registered"); } - } -} - -export { FFMPEG }; diff --git a/src/PlatformAccessory.ts b/src/PlatformAccessory.ts index a018c5d..704ea74 100644 --- a/src/PlatformAccessory.ts +++ b/src/PlatformAccessory.ts @@ -1,66 +1,83 @@ -import * as hap from "hap-nodejs"; +import { Bloomsky } from "./platform"; +import { PlatformAccessory } from "homebridge"; +import { Station } from "./Station"; -import { EventEmitter } from "events"; +/** + * Platform Accessory + * An instance of this class is created for each accessory your platform registers + * Each accessory may expose multiple services of different service types. + */ +export class BloomskyPlatformAccessory { + constructor( + private readonly platform: Bloomsky, + private readonly accessory: PlatformAccessory, + station: Station + ) { + // set accessory information + this.accessory + .getService(this.platform.Service.AccessoryInformation)! + .setCharacteristic(this.platform.Characteristic.Manufacturer, "Bloomsky") + .setCharacteristic( + this.platform.Characteristic.Model, + station.Data.DeviceType + ) + .setCharacteristic( + this.platform.Characteristic.SerialNumber, + station.DeviceID + ) + .setCharacteristic(this.platform.Characteristic.Name, station.DeviceName); -// tslint:disable-next-line:interface-name -declare interface PlatformAccessory extends HAPNodeJS.Accessory { - displayName: string; - username: string; - pincode: string; - UUID: string; - aid: string; - bridged: boolean; - bridgedAccessories: HAPNodeJS.Accessory[]; - reachable: boolean; - category: HAPNodeJS.Accessory.Categories; - services: HAPNodeJS.Service[]; - cameraSource: HAPNodeJS.CameraSource; - Categories: typeof HAPNodeJS.Accessory.Categories; + // I only have a Sky 1 model so I can only make a guess about the battery level + // for this specific model. + if (station.Data.DeviceType === "SKY1") { + // clamp battery level between 0 and 100 + const batteryLevel = Math.max( + 0, + Math.min(100, (100 / 2600) * station.Data.Voltage) + ); - // tslint:disable-next-line:no-misused-new - new (displayName: string, category: string): PlatformAccessory; - // tslint:disable-next-line:unified-signatures - new (displayName: string, uuid: string, subtype: number): PlatformAccessory; - // tslint:disable-next-line:ban-types - addService( - service: HAPNodeJS.Service | Function | HAPNodeJS.PredefinedService - ): HAPNodeJS.Service; - addService( - service: HAPNodeJS.Service | HAPNodeJS.PredefinedService, - displayName: string - ): HAPNodeJS.Service; - // tslint:disable-next-line:unified-signatures - // addService(category: HAPNodeJS.Accessory.Categories, displayName: string): HAPNodeJS.Service; - removeService(service: HAPNodeJS.Service): HAPNodeJS.Service; - // tslint:disable-next-line:unified-signatures - removeService( - service: HAPNodeJS.Service, - displayName: string - ): HAPNodeJS.Service; - getService( - service: HAPNodeJS.Service | HAPNodeJS.PredefinedService - ): HAPNodeJS.Service; - // tslint:disable-next-line:unified-signatures - getService(name: string): HAPNodeJS.Service; - updateReachability(reachable: boolean): void; - addBridgedAccessory( - accessory: HAPNodeJS.Accessory, - deferUpdate: boolean - ): HAPNodeJS.Accessory; - addBridgedAccessories(accessories: HAPNodeJS.Accessory[]): void; - removeBridgedAccessory( - accessory: HAPNodeJS.Accessory, - deferUpdate: boolean - ): void; - removeBridgedAccessories(accessories: HAPNodeJS.Accessory[]): void; - getCharacteristicByIID(iid: string): HAPNodeJS.Characteristic; - getBridgedAccessoryByAID(aid: string): HAPNodeJS.Accessory; - findCharacteristic(aid: string, iid: string): HAPNodeJS.Accessory; - configureCameraSource(cameraSource: HAPNodeJS.CameraSource): void; - toHAP(opt: any): JSON; - publish(info: HAPNodeJS.PublishInfo, allowInsecureRequest: boolean): void; - destroy(): void; - setupURI(): string; -} + const batteryService = + this.accessory.getService(this.platform.Service.BatteryService) || + this.accessory.addService(this.platform.Service.BatteryService); + + batteryService + .getCharacteristic(this.platform.Characteristic.BatteryLevel) + .updateValue(batteryLevel); + batteryService + .getCharacteristic(this.platform.Characteristic.ChargingState) + .updateValue(2); + batteryService + .getCharacteristic(this.platform.Characteristic.StatusLowBattery) + .updateValue(batteryLevel < 20); + batteryService.setCharacteristic( + this.platform.Characteristic.Name, + station.DeviceName + ); + } + + this.accessory + .addService(this.platform.Service.TemperatureSensor) + .getCharacteristic(this.platform.Characteristic.CurrentTemperature) + .updateValue(station.Data.Temperature); + + this.accessory + .addService(this.platform.Service.LightSensor, "Luminance") + .getCharacteristic(this.platform.Characteristic.CurrentAmbientLightLevel) + .updateValue(station.Data.Luminance); -export { PlatformAccessory }; + this.accessory + .addService(this.platform.Service.HumiditySensor, "Humidity") + .getCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity) + .updateValue(station.Data.Humidity); + + this.accessory + .addService(this.platform.Service.MotionSensor, "Rain") + .getCharacteristic(this.platform.Characteristic.MotionDetected) + .updateValue(station.Data.Rain); + + this.accessory + .addService(this.platform.Service.OccupancySensor, "Night") + .getCharacteristic(this.platform.Characteristic.OccupancyDetected) + .updateValue(station.Data.Night); + } +} diff --git a/src/Session.ts b/src/Session.ts deleted file mode 100644 index 491bdb4..0000000 --- a/src/Session.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare class SessionInfo { - public address: any; - // tslint:disable-next-line:variable-name - public video_port: any; - // tslint:disable-next-line:variable-name - public video_srtp: Buffer; - // tslint:disable-next-line:variable-name - public video_ssrc: number; - // tslint:disable-next-line:variable-name - public audio_port: any; - // tslint:disable-next-line:variable-name - public audio_ssrc: number; -} - -export { SessionInfo }; diff --git a/src/SnapshotRequest.ts b/src/SnapshotRequest.ts deleted file mode 100644 index 081c163..0000000 --- a/src/SnapshotRequest.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare class SnapshotRequest { - public width: number; - public height: number; -} - -export { SnapshotRequest }; diff --git a/src/Station.d.ts b/src/Station.d.ts new file mode 100644 index 0000000..0d6ff8b --- /dev/null +++ b/src/Station.d.ts @@ -0,0 +1,18 @@ +import { URL } from "url"; + +declare interface Station { + DeviceID: string; + DeviceName: string; + Data: StationData; +} + +declare interface StationData { + Temperature: number; + Luminance: number; + Humidity: number; + Rain: boolean; + Night: boolean; + Voltage: number; + DeviceType: string; + ImageURL: URL; +} diff --git a/src/Station.ts b/src/Station.ts deleted file mode 100644 index 829f3df..0000000 --- a/src/Station.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { URL } from "url"; - -export declare interface IStation { - DeviceID: string; - DeviceName: string; - Data: IStationData; -} - -export declare interface IStationData { - Temperature: number; - Luminance: number; - Humidity: number; - Rain: boolean; - Night: boolean; - Voltage: number; - DeviceType: string; - ImageURL: URL; -} diff --git a/src/StreamController.ts b/src/StreamController.ts deleted file mode 100644 index 5c7a52b..0000000 --- a/src/StreamController.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare class StreamController { - public service: HAPNodeJS.Service; - public sessionIdentifier: any; - constructor(identifier: any, options: any, cameraSource: HAPNodeJS.CameraSource); - public forceStop(): void; - public handleCloseConnection(connectionID): void; -} - -export { StreamController }; diff --git a/src/StreamRequest.ts b/src/StreamRequest.ts deleted file mode 100644 index d78ffc7..0000000 --- a/src/StreamRequest.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AudioResponse } from "./AudioResponse"; -import { VideoResponse } from "./VideoResponse"; - -declare class StreamRequest { - public sessionID: any; - public type: any; - public video: VideoResponse; - public targetAddress: string; - public audio: AudioResponse | undefined; -} - -export { StreamRequest }; diff --git a/src/StreamResponse.ts b/src/StreamResponse.ts deleted file mode 100644 index f94cffb..0000000 --- a/src/StreamResponse.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { AddressResponse } from "./AddressResponse"; -import { AudioResponse } from "./AudioResponse"; -import { VideoResponse } from "./VideoResponse"; - -declare class StreamResponse { - public video: VideoResponse; - public audio: AudioResponse; - public address: AddressResponse; -} - -export { StreamResponse }; diff --git a/src/VideoResponse.d.ts b/src/VideoResponse.d.ts deleted file mode 100644 index 8948e50..0000000 --- a/src/VideoResponse.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { BaseResponse } from "./BaseResponse"; - -declare class VideoResponse extends BaseResponse{ - width: number; - height: number; - fps: number; - max_bit_rate: number; -} - -export { VideoResponse } diff --git a/src/homebridge.d.ts b/src/homebridge.d.ts deleted file mode 100644 index bb6b1e8..0000000 --- a/src/homebridge.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { EventEmitter } from "events"; - -declare class API extends EventEmitter { - constructor(); - - public accessory(name: any): any; - - public platform(name: any): any; - - public publishCameraAccessories(pluginName: any, accessories: any): void; - - public registerAccessory( - pluginName: any, - accessoryName: any, - constructor: any, - configurationRequestHandler: any - ): void; - - public registerPlatform( - pluginName: any, - platformName: any, - constructor: any, - dynamic: any - ): void; - - public registerPlatformAccessories( - pluginName: any, - platformName: any, - accessories: any - ): void; - - public unregisterPlatformAccessories( - pluginName: any, - platformName: any, - accessories: any - ): void; - - public updatePlatformAccessories(accessories: any): void; -} - -export default API; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..1e3916e --- /dev/null +++ b/src/index.ts @@ -0,0 +1,10 @@ +import { API } from "homebridge"; +import { Bloomsky } from "./platform"; +import { PLATFORM_NAME } from "./settings"; + +/** + * This method registers the platform with Homebridge + */ +export = (api: API) => { + api.registerPlatform(PLATFORM_NAME, Bloomsky); +}; diff --git a/src/platform.ts b/src/platform.ts new file mode 100644 index 0000000..b54b122 --- /dev/null +++ b/src/platform.ts @@ -0,0 +1,250 @@ +import * as Client from "typed-rest-client"; + +import { + API, + APIEvent, + CameraControllerOptions, + Characteristic, + DynamicPlatformPlugin, + Logger, + PlatformAccessory, + PlatformConfig, + Service, +} from "homebridge"; +import { PLATFORM_NAME, PLUGIN_NAME } from "./settings"; + +import { BloomskyFFMPEGStreamingDelegate } from "./streamingDelegate"; +import { BloomskyPlatformAccessory } from "./platformAccessory"; +import { EventEmitter } from "events"; +import { Station } from "./Station"; + +/** + * HomebridgePlatform + * This class is the main constructor for your plugin, this is where you should + * parse the user config and discover/register accessories with Homebridge. + */ +export class Bloomsky implements DynamicPlatformPlugin { + public readonly Service: typeof Service = this.api.hap.Service; + public readonly Characteristic: typeof Characteristic = this.api.hap + .Characteristic; + + // this is used to track restored cached accessories + public readonly accessories: PlatformAccessory[] = []; + + // plugin configuration data + private apiKey: string; + private apiUrl: string; + private vcodec: string; + private latestData: Station[]; + private timeout: NodeJS.Timeout | undefined; + + private emitters: EventEmitter[] = []; + + constructor( + public readonly log: Logger, + public readonly config: PlatformConfig, + public readonly api: API + ) { + this.log.debug("Finished initializing platform:", this.config.name); + + this.apiKey = config.apiKey; + this.apiUrl = config.apiUrl || "https://api.bloomsky.com/api/skydata/"; + this.vcodec = config.vcodec || "libx264"; + this.latestData = [] as Station[]; + + // When this event is fired it means Homebridge has restored all cached accessories from disk. + // Dynamic Platform plugins should only register new accessories after this event was fired, + // in order to ensure they weren't added to homebridge already. This event can also be used + // to start discovery of new accessories. + this.api.on(APIEvent.DID_FINISH_LAUNCHING, () => { + log.debug("Executed didFinishLaunching callback"); + // run the method to discover / register your devices as accessories + + this.discoverDevices(); + this.updateData(); + }); + } + + /** + * This function is invoked when homebridge restores cached accessories from disk at startup. + * It should be used to setup event handlers for characteristics and update respective values. + */ + configureAccessory(accessory: PlatformAccessory) { + this.log.info("Loading accessory from cache:", accessory.displayName); + + const streamingDelegate = new BloomskyFFMPEGStreamingDelegate(this.api.hap); + this.emitters[accessory.UUID] = streamingDelegate.bloomskyEvents; + + const options: CameraControllerOptions = { + cameraStreamCount: 2, // HomeKit requires at least 2 streams, but 1 is also just fine + delegate: streamingDelegate, + + streamingOptions: { + // srtp: true, // legacy option which will just enable AES_CM_128_HMAC_SHA1_80 (can still be used though) + supportedCryptoSuites: [ + this.api.hap.SRTPCryptoSuites.NONE, + this.api.hap.SRTPCryptoSuites.AES_CM_128_HMAC_SHA1_80, + ], // NONE is not supported by iOS just there for testing with Wireshark for example + video: { + codec: { + profiles: [ + this.api.hap.H264Profile.BASELINE, + this.api.hap.H264Profile.MAIN, + this.api.hap.H264Profile.HIGH, + ], + levels: [ + this.api.hap.H264Level.LEVEL3_1, + this.api.hap.H264Level.LEVEL3_2, + this.api.hap.H264Level.LEVEL4_0, + ], + }, + resolutions: [ + [1920, 1080, 30], // width, height, framerate + [1280, 960, 30], + [1280, 720, 30], + [1024, 768, 30], + [640, 480, 30], + [640, 360, 30], + [480, 360, 30], + [480, 270, 30], + [320, 240, 30], + [320, 240, 15], // Apple Watch requires this configuration (Apple Watch also seems to required OPUS @16K) + [320, 180, 30], + ], + }, + /* audio option is omitted, as it is not supported in this example; HAP-NodeJS will fake an appropriate audio codec + audio: { + comfort_noise: false, // optional, default false + codecs: [ + { + type: AudioStreamingCodecType.OPUS, + audioChannels: 1, // optional, default 1 + samplerate: [AudioStreamingSamplerate.KHZ_16, AudioStreamingSamplerate.KHZ_24], + // 16 and 24 must be present for AAC-ELD or OPUS + }, + ], + }, + // */ + }, + }; + + const cameraController = new this.api.hap.CameraController(options); + streamingDelegate.controller = cameraController; + + accessory.configureController(cameraController); + // add the restored accessory to the accessories cache so we can track if it has already been registered + this.accessories.push(accessory); + } + + /** + * This is an example method showing how to register discovered accessories. + * Accessories must only be registered once, previously created accessories + * must not be registered again to prevent "duplicate UUID" errors. + */ + discoverDevices() { + if (this.latestData.length === 0) { + return; + } + + // loop over the discovered devices and register each one if it has not already been registered + for (const device of this.latestData) { + // generate a unique id for the accessory this should be generated from + // something globally unique, but constant, for example, the device serial + // number or MAC address + const uuid = this.api.hap.uuid.generate(device.DeviceID); + + if (this.emitters[uuid]) { + const emitter = this.emitters[uuid] as EventEmitter; + emitter.emit("ImageURL", device.Data.ImageURL); + } + + // see if an accessory with the same uuid has already been registered and restored from + // the cached devices we stored in the `configureAccessory` method above + const existingAccessory = this.accessories.find( + (accessory) => accessory.UUID === uuid + ); + + if (existingAccessory) { + // the accessory already exists + this.log.info( + "Restoring existing accessory from cache:", + existingAccessory.displayName + ); + + // if you need to update the accessory.context then you should run `api.updatePlatformAccessories`. eg.: + existingAccessory.context.device = device; + + this.api.updatePlatformAccessories([existingAccessory]); + + // create the accessory handler for the restored accessory + // this is imported from `platformAccessory.ts` + new BloomskyPlatformAccessory(this, existingAccessory, device); + } else { + // the accessory does not yet exist, so we need to create it + this.log.info("Adding new accessory:", device.DeviceName); + + // create a new accessory + const accessory = new this.api.platformAccessory( + device.DeviceName, + uuid + ); + + // store a copy of the device object in the `accessory.context` + // the `context` property can be used to store any data about the accessory you may need + accessory.context.device = device; + + // create the accessory handler for the newly create accessory + // this is imported from `platformAccessory.ts` + new BloomskyPlatformAccessory(this, accessory, device); + + this.configureAccessory(accessory); + + // link the accessory to your platform + this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [ + accessory, + ]); + } + } + } + + /** + * Fetch data from the API, then + * 1. register new devices + * 2. update values for existing devices + */ + private async updateData() { + const requestOptions: Client.IRequestOptions = { + additionalHeaders: { Authorization: this.apiKey }, + }; + + const client = new Client.RestClient("NodeJS"); + + const response = await client + .get(this.apiUrl + "?unit=intl", requestOptions) + .catch((clientError) => { + this.log.error(clientError); + }); + + const error: any = response as any; + if (error !== undefined && error.detail) { + this.log.error(error.detail); + } else if (response !== null) { + const r = response as Client.IRestResponse; + if (r.result !== null) { + this.latestData = r.result; + } + + this.discoverDevices(); + + this.timeout = setTimeout( + (() => { + this.updateData().catch((clientError) => { + this.log.error(clientError); + }); + }).bind(this), + 150000 + ); + this.timeout.unref(); + } + } +} diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..ee3aee4 --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,9 @@ +/** + * This is the name of the platform that users will use to register the plugin in the Homebridge config.json + */ +export const PLATFORM_NAME = "Bloomsky"; + +/** + * This must match the name of your plugin as defined the package.json + */ +export const PLUGIN_NAME = "homebridge-bloomsky"; diff --git a/src/streamingDelegate.ts b/src/streamingDelegate.ts new file mode 100644 index 0000000..1595750 --- /dev/null +++ b/src/streamingDelegate.ts @@ -0,0 +1,269 @@ +import { + CameraController, + CameraStreamingDelegate, + HAP, + PrepareStreamCallback, + PrepareStreamRequest, + PrepareStreamResponse, + SRTPCryptoSuites, + SnapshotRequest, + SnapshotRequestCallback, + StreamRequestCallback, + StreamRequestTypes, + StreamSessionIdentifier, + StreamingRequest, + VideoInfo, +} from 'homebridge'; +import { ChildProcess, spawn } from 'child_process'; + +import { EventEmitter } from 'events'; +import ip from 'ip'; + +type SessionInfo = { + address: string; // address of the HAP controller + + videoPort: number; + videoCryptoSuite: SRTPCryptoSuites; // should be saved if multiple suites are supported + videoSRTP: Buffer; // key and salt concatenated + videoSSRC: number; // rtp synchronisation source + + /* Won't be save as audio is not supported by this example + audioPort: number, + audioCryptoSuite: SRTPCryptoSuites, + audioSRTP: Buffer, + audioSSRC: number, + */ +}; + +const FFMPEGH264ProfileNames = ['baseline', 'main', 'high']; +const FFMPEGH264LevelNames = ['3.1', '3.2', '4.0']; + +export class BloomskyFFMPEGStreamingDelegate +implements CameraStreamingDelegate { + private ffmpegDebugOutput = true; + + public readonly bloomskyEvents = new EventEmitter(); + private imageUrl: string | undefined; + private readonly hap: HAP; + controller?: CameraController; + + // keep track of sessions + pendingSessions: Record = {}; + ongoingSessions: Record = {}; + + constructor(hap: HAP) { + this.hap = hap; + + this.bloomskyEvents.on('ImageURL', (url) => { + console.log('ImageURL', url); + this.imageUrl = url; + }); + } + + handleSnapshotRequest( + request: SnapshotRequest, + callback: SnapshotRequestCallback, + ): void { + const ffmpegCommand = this.imageUrl + ? `-loop 1 -i ${this.imageUrl} -vframes 1 -f mjpeg -` + : `-f lavfi -i testsrc=s=${request.width}x${request.height} -vframes 1 -f mjpeg -`; + const ffmpeg = spawn('ffmpeg', ffmpegCommand.split(' '), { + env: process.env, + }); + + const snapshotBuffers: Buffer[] = []; + + ffmpeg.stdout.on('data', (data) => snapshotBuffers.push(data)); + ffmpeg.stderr.on('data', (data) => { + if (this.ffmpegDebugOutput) { + console.log('SNAPSHOT: ' + String(data)); + } + }); + + ffmpeg.on('exit', (code, signal) => { + if (signal) { + console.log('Snapshot process was killed with signal: ' + signal); + callback(new Error('killed with signal ' + signal)); + } else if (code === 0) { + console.log( + `Successfully captured snapshot at ${request.width}x${request.height}`, + ); + callback(undefined, Buffer.concat(snapshotBuffers)); + } else { + console.log('Snapshot process exited with code ' + code); + callback(new Error('Snapshot process exited with code ' + code)); + } + }); + } + + // called when iOS request rtp setup + prepareStream( + request: PrepareStreamRequest, + callback: PrepareStreamCallback, + ): void { + const sessionId: StreamSessionIdentifier = request.sessionID; + const targetAddress = request.targetAddress; + + const video = request.video; + const videoPort = video.port; + + const videoCryptoSuite = video.srtpCryptoSuite; // could be used to support multiple crypto suite (or support no suite for debugging) + const videoSrtpKey = video.srtp_key; + const videoSrtpSalt = video.srtp_salt; + + const videoSSRC = this.hap.CameraController.generateSynchronisationSource(); + + const sessionInfo: SessionInfo = { + address: targetAddress, + + videoPort: videoPort, + videoCryptoSuite: videoCryptoSuite, + videoSRTP: Buffer.concat([videoSrtpKey, videoSrtpSalt]), + videoSSRC: videoSSRC, + }; + + const currentAddress = ip.address('public', request.addressVersion); // ipAddress version must match + const response: PrepareStreamResponse = { + address: currentAddress, + video: { + port: videoPort, + ssrc: videoSSRC, + + srtp_key: videoSrtpKey, + srtp_salt: videoSrtpSalt, + }, + // audio is omitted as we do not support audio in this example + }; + + this.pendingSessions[sessionId] = sessionInfo; + callback(undefined, response); + } + + // called when iOS device asks stream to start/stop/reconfigure + handleStreamRequest( + request: StreamingRequest, + callback: StreamRequestCallback, + ): void { + const sessionId = request.sessionID; + + switch (request.type) { + case StreamRequestTypes.START: + const sessionInfo = this.pendingSessions[sessionId]; + + const video: VideoInfo = request.video; + + const profile = FFMPEGH264ProfileNames[video.profile]; + const level = FFMPEGH264LevelNames[video.level]; + const width = video.width; + const height = video.height; + const fps = video.fps; + + const payloadType = video.pt; + const maxBitrate = video.max_bit_rate; + const rtcpInterval = video.rtcp_interval; // usually 0.5 + const mtu = video.mtu; // maximum transmission unit + + const address = sessionInfo.address; + const videoPort = sessionInfo.videoPort; + const ssrc = sessionInfo.videoSSRC; + const cryptoSuite = sessionInfo.videoCryptoSuite; + const videoSRTP = sessionInfo.videoSRTP.toString('base64'); + + console.log( + `Starting video stream (${width}x${height}, ${fps} fps, ${maxBitrate} kbps, ${mtu} mtu)...`, + ); + + const part1 = this.imageUrl + ? `-loop 1 -i ${this.imageUrl} -map 0:0 ` + : `-f lavfi -i testsrc=size=${width}x${height}:rate=${fps} -map 0:0 `; + let videoffmpegCommand = + part1 + + `-c:v libx264 -pix_fmt yuv420p -r ${fps} -an -sn -dn -b:v ${maxBitrate}k -bufsize ${ + 2 * maxBitrate + }k -maxrate ${maxBitrate}k ` + + `-payload_type ${payloadType} -ssrc ${ssrc} -f rtp `; // -profile:v ${profile} -level:v ${level} + + if (cryptoSuite === SRTPCryptoSuites.AES_CM_128_HMAC_SHA1_80) { + // actually ffmpeg just supports AES_CM_128_HMAC_SHA1_80 + videoffmpegCommand += `-srtp_out_suite AES_CM_128_HMAC_SHA1_80 -srtp_out_params ${videoSRTP} s`; + } + + videoffmpegCommand += `rtp://${address}:${videoPort}?rtcpport=${videoPort}&localrtcpport=${videoPort}&pkt_size=${mtu}`; + + if (this.ffmpegDebugOutput) { + console.log('FFMPEG command: ffmpeg ' + videoffmpegCommand); + } + + const ffmpegVideo = spawn('ffmpeg', videoffmpegCommand.split(' '), { + env: process.env, + }); + + let started = false; + ffmpegVideo.stderr.on('data', (data) => { + if (!started) { + started = true; + console.log('FFMPEG: received first frame'); + + callback(); // do not forget to execute callback once set up + } + + if (this.ffmpegDebugOutput) { + console.log('VIDEO: ' + String(data)); + } + }); + ffmpegVideo.on('error', (error) => { + console.log('[Video] Failed to start video stream: ' + error.message); + callback(new Error('ffmpeg process creation failed!')); + }); + ffmpegVideo.on('exit', (code, signal) => { + const message = + '[Video] ffmpeg exited with code: ' + + code + + ' and signal: ' + + signal; + + if (code == null || code === 255) { + console.log(message + ' (Video stream stopped!)'); + } else { + console.log(message + ' (error)'); + + if (!started) { + callback(new Error(message)); + } else { + this.controller!.forceStopStreamingSession(sessionId); + } + } + }); + + this.ongoingSessions[sessionId] = ffmpegVideo; + delete this.pendingSessions[sessionId]; + + break; + case StreamRequestTypes.RECONFIGURE: + // not supported by this example + console.log( + 'Received (unsupported) request to reconfigure to: ' + + JSON.stringify(request.video), + ); + callback(); + break; + case StreamRequestTypes.STOP: + const ffmpegProcess = this.ongoingSessions[sessionId]; + + try { + if (ffmpegProcess) { + ffmpegProcess.kill('SIGKILL'); + } + } catch (e) { + console.log('Error occurred terminating the video process!'); + console.log(e); + } + + delete this.ongoingSessions[sessionId]; + + console.log('Stopped streaming session!'); + callback(); + break; + } + } +} diff --git a/standalone.js b/standalone.js deleted file mode 100644 index 224ff37..0000000 --- a/standalone.js +++ /dev/null @@ -1,98 +0,0 @@ -"use strict"; - -const hap = require("hap-nodejs"); -const FFMPEG = require("./lib/Ffmpeg").FFMPEG; - -let conf = { - "username": "CC:22:3D:E3:CE:FF", - "pin": "876-54-321" -}; - -console.log("HAP-NodeJS starting..."); - -hap.init(); - -const station = { - "UTC": -7, - "CityName": "Los Angeles", - "Storm": {}, - "Searchable": false, - "DeviceName": "Donna Sky", - "RegisterTime": 1433814467, - "DST": 1, - "BoundedPoint": "", - "LON": -118.6919183, - "Point": {}, - "VideoList": [ - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-23.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-24.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-25.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-26.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-27.mp4" - ], - "VideoList_C": [ - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-23_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-24_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-25_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-26_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-27_C.mp4" - ], - "DeviceID": "123456789012", - "NumOfFollowers": 1, - "LAT": 34.0201613, - "ALT": 142, - "Data": { - "Luminance": 21, - "Temperature": 63.61, - "ImageURL": "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWtnpGmmpo=.jpg", - "TS": 1540697959, - "Rain": true, - "Humidity": 99, - "Pressure": 295.27, - "DeviceType": "SKY1", - "Voltage": 2594, - "Night": true, - "UVIndex": "1", - "ImageTS": 1540690225 - }, - "FullAddress": "Pico Blvd, Los Angeles, CA, US", - "StreetName": "Pico Blvd", - "PreviewImageList": [ - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWqmJirn54=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWrlpamm5s=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWslZOloJg=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWsnpKompc=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWtnJSrnZw=.jpg" - ] -}; - -const uuid = hap.uuid.generate(station.DeviceID); -const cameraAccessory = new hap.Accessory(station.DeviceName, uuid, hap.Accessory.Categories.CAMERA); -const filename = uuid + ".jpg"; - -const cameraSource = new FFMPEG(hap.uuid, hap, { - name: uuid, - videoConfig: { - debug : true, - maxHeight: 640, - maxStreams: 2, - maxWidth: 640, - source: "-loop 1 -i " + filename, - stillImageSource: "-loop 1 -i " + filename, - vcodec : "h264", - }, -}, console.log, "ffmpeg", filename); -cameraAccessory.configureCameraSource(cameraSource); - -cameraAccessory.publish({ - username: conf.username, - pincode: conf.pin, - category: hap.Accessory.Categories.CAMERA -}, true); - -console.log("Scan this code with your HomeKit App on your iOS device to pair with Camera:"); -console.log(" "); -console.log(" ┌────────────┐ "); -console.log(` │ ${conf.pin} │ `); -console.log(" └────────────┘ "); -console.log(" "); diff --git a/test.spec.ts b/test.spec.ts deleted file mode 100644 index d4e44f5..0000000 --- a/test.spec.ts +++ /dev/null @@ -1,276 +0,0 @@ -import "mocha"; - -import * as fs from "fs"; -import * as hap from "hap-nodejs"; -import * as ip from "ip"; -import * as mlog from "mocha-logger"; -import * as waitUntil from "async-wait-until"; - -import API from "./src/homebridge"; -import { Bloomsky } from "./src/Bloomsky"; -import { EventEmitter } from "events"; -import FFMPEG from "./src/Ffmpeg"; -import { PlatformAccessory } from "./src/PlatformAccessory"; -import { StreamRequest } from "./src/StreamRequest"; -import { expect } from "chai"; - -const mockHomebridge = { - accessory: {} as PlatformAccessory, - api: new API(), - config: { - apiKey: "this-is-not-a-valid-api-key==", - // tslint:disable-next-line:max-line-length - apiUrl: - "https://gist.githubusercontent.com/aphex3k/d7d9b6399fc8701a32ff4fb87bdd91dc/raw/40b030a8b6b70f95bae3b38106609dfda47c0c46/api-result.json", - debug: true, - useIntl: true, - }, - hap, - log(logText: string) { - mlog.log(logText); - }, - registerPlatform(a: any, b: any, c: any, d: boolean) { - return d === true; - }, - version: "2.2", -}; - -describe("Mock Homebridge", () => { - it("should provide mock functionality", () => { - expect(mockHomebridge).to.not.be.equal(null); - expect(mockHomebridge).to.not.be.equal(undefined); - - expect(mockHomebridge.version).to.not.be.equal(null); - expect(mockHomebridge.version).to.not.be.equal(undefined); - - expect(mockHomebridge.hap).to.not.be.equal(null); - expect(mockHomebridge.hap).to.not.be.equal(undefined); - - expect(mockHomebridge.registerPlatform).to.not.be.equal(null); - expect(mockHomebridge.registerPlatform).to.not.be.equal(undefined); - - expect(mockHomebridge.log).to.not.be.equal(null); - expect(mockHomebridge.log).to.not.be.equal(undefined); - - expect(mockHomebridge.config).to.not.be.equal(null); - expect(mockHomebridge.config).to.not.be.equal(undefined); - - expect(mockHomebridge.config.apiUrl).to.not.be.equal(null); - expect(mockHomebridge.config.apiUrl).to.not.be.equal(undefined); - - expect(mockHomebridge.config.useIntl).to.be.equal(true); - - expect(mockHomebridge.hap.uuid).to.not.be.equal(null); - expect(mockHomebridge.hap.uuid).to.not.be.equal(undefined); - }); -}); - -describe("Bloomsky", () => { - const mock = mockHomebridge; - - it("should have a mock instance", function () { - expect(mock).to.not.be.equal(null); - expect(mock).to.not.be.equal(undefined); - }); - - Bloomsky.Accessory = mock.accessory; - Bloomsky.Service = hap.Service; - Bloomsky.Characteristic = hap.Characteristic; - Bloomsky.UUIDGen = hap.uuid; - Bloomsky.Hap = hap; - - const bloomsky = new Bloomsky(mock.log, mock.config, mock.api); - - it("constructor should create a new instance", function () { - expect(bloomsky).to.not.be.equal(null); - expect(bloomsky).to.not.be.equal(undefined); - }); - - it("should know about no accessories before loading from api", function () { - expect(bloomsky.accessories.length).to.be.equal(0); - }); - - it("should calculate a matching UUID for input", function () { - expect(Bloomsky.UUIDGen).to.not.be.equal(null); - expect(Bloomsky.UUIDGen).to.not.be.equal(undefined); - - const uuid = Bloomsky.UUIDGen.generate("test"); // a94a8fe5-ccb1-49ba-a1c4-c0873d391e98 - expect(uuid).to.not.be.equal(null); - expect(uuid).to.be.equal("a94a8fe5-ccb1-49ba-a1c4-c0873d391e98"); - }); - - // it("should know about exactly one accessory after loading from api", async function() { - // this.timeout(10000); - - // // since we are not testing in a full blown homebridge environment, trigger - // // didFinishLaunching event manually - // (mock.api as EventEmitter).emit("didFinishLaunching"); - - // try { - // const result = await waitUntil(() => { - // return bloomsky.accessories.length > 0; - // }, 10000); // ms - - // expect(bloomsky.accessories.length).to.be.equal(1); - // } catch (error) { - // expect(bloomsky.accessories.length).to.be.equal(1); - // } - - // const accessory = bloomsky.accessories[0]; - - // expect(accessory.UUID).to.be.equal("8d993ccd-f628-4e26-a170-a949ee2a3870"); - // }); - - // it("should only know about exactly one camera accessory", function() { - // const accessory = bloomsky.accessories[0]; - - // expect(accessory.category).to.not.be.equal(HAPNodeJS.Accessory.Categories.OTHER); - // expect(accessory.category).to.be.equal(HAPNodeJS.Accessory.Categories.CAMERA); - // expect(accessory.reachable).to.be.equal(true); - // }); - - // it("should know about an accessory with services attached", function() { - // const accessory = bloomsky.accessories[0]; - - // const temp = accessory.getService(Bloomsky.Service.TemperatureSensor); - // expect(temp).to.not.be.equal(undefined); - // expect(temp.UUID).to.be.equal(Bloomsky.Service.TemperatureSensor.UUID); - - // const light = accessory.getService(Bloomsky.Service.LightSensor); - // expect(light).to.not.be.equal(undefined); - // expect(light.UUID).to.be.equal(Bloomsky.Service.LightSensor.UUID); - - // const humidity = accessory.getService(Bloomsky.Service.HumiditySensor); - // expect(humidity).to.not.be.equal(undefined); - // expect(humidity.UUID).to.be.equal(Bloomsky.Service.HumiditySensor.UUID); - - // const motion = accessory.getService(Bloomsky.Service.MotionSensor); - // expect(motion).to.not.be.equal(undefined); - // expect(motion.UUID).to.be.equal(Bloomsky.Service.MotionSensor.UUID); - - // const night = accessory.getService(Bloomsky.Service.OccupancySensor); - // expect(night).to.not.be.equal(undefined); - // expect(night.UUID).to.be.equal(Bloomsky.Service.OccupancySensor.UUID); - - // const info = accessory.getService(Bloomsky.Service.AccessoryInformation); - // expect(info).to.not.be.equal(undefined); - // expect(info.UUID).to.be.equal(Bloomsky.Service.AccessoryInformation.UUID); - - // const battery = accessory.getService(Bloomsky.Service.BatteryService); - // expect(battery).to.not.be.equal(undefined); - // expect(battery.UUID).to.be.equal(Bloomsky.Service.BatteryService.UUID); - // }); - - // it("should have an accessory with a camera stream controller configured", function() { - // const accessory = bloomsky.accessories[0]; - - // expect(accessory.cameraSource).to.not.be.equal(undefined); - - // const cameraSource = accessory.cameraSource as FFMPEG; - - // expect(cameraSource.createCameraControlService).to.not.be.equal(undefined); - // expect(cameraSource.handleCloseConnection).to.not.be.equal(undefined); - // expect(cameraSource.handleSnapshotRequest).to.not.be.equal(undefined); - // expect(cameraSource.handleStreamRequest).to.not.be.equal(undefined); - // expect(cameraSource.prepareStream).to.not.be.equal(undefined); - // }); - - // it("should have one accessory that can handle snapshot requests", async function() { - - // this.timeout(10000); - - // try { - // const result = await waitUntil(() => { - // const testFilename = "8d993ccd-f628-4e26-a170-a949ee2a3870.jpg"; - // return fs.existsSync(testFilename) && fs.statSync(testFilename).size > 0; - // }, 3000); // ms - // } catch (error) { - // mock.log("the camera image should have been cached by now..."); - // expect(error).to.be.equal(undefined); - // } - - // const accessory = bloomsky.accessories[0]; - // const cameraSource = accessory.cameraSource as FFMPEG; - - // expect(cameraSource.createCameraControlService).to.not.be.equal(undefined); - - // const createCameraControlService = function() { cameraSource.createCameraControlService(); }; - // expect(createCameraControlService).to.not.throw(); - - // const handleSnapshotRequest = function() { - // cameraSource.handleSnapshotRequest({ - // height: 720, - // width: 1280, - // }, - // function(error, buffer) { - // if (error !== undefined) { - // mock.log(error); - // } - // expect(error).to.be.equal(undefined); - // expect(buffer.length).to.be.greaterThan(0); - // }); - // }; - // expect(handleSnapshotRequest).to.not.throw(); - // }); - - // it("should have one accessory that can handle stream requests", async function() { - - // this.timeout(10000); - - // try { - // const result = await waitUntil(() => { - // const testFilename = "8d993ccd-f628-4e26-a170-a949ee2a3870.jpg"; - // return fs.existsSync(testFilename) && fs.statSync(testFilename).size > 0; - // }, 3000); // ms - // } catch (error) { - // mock.log("the camera image should have been cached by now..."); - // expect(error).to.be.equal(undefined); - // } - - // const accessory = bloomsky.accessories[0]; - // const cameraSource = accessory.cameraSource as FFMPEG; - // const testSessionId = Bloomsky.UUIDGen.generate("testSessionId"); - // const request: StreamRequest = { - // audio: undefined, - // sessionID: testSessionId, - // targetAddress: ip.address(), - // type: "start", - // video: { - // fps: 30, - // height: 640, - // max_bit_rate: 600, - // port: 12345, - // srtp_key: Uint8Array.from(new Set([1, 2, 3, 4])), - // srtp_salt: Uint8Array.from(new Set([1, 2, 3, 4])), - // ssrc: 123, - // width: 640, - // }, - // }; - - // const prepareStream = function() { - // cameraSource.prepareStream(request, function(response) { - // mock.log("Stream Prepared"); - // }); - // }; - // expect(prepareStream).to.not.throw(); - - // const handleStreamRequest = function() { - // cameraSource.handleStreamRequest(request); - // }; - // expect(handleStreamRequest).to.not.throw(); - - // mock.log("waiting for stream..."); - // try { - // const result = await waitUntil(() => { - // return false; - // }, 550); // ms - // } catch (error) { - // mock.log("closing stream..."); - // } - - // const handleCloseConnection = function() { - // cameraSource.handleCloseConnection(testSessionId); - // }; - // expect(handleCloseConnection).to.not.throw(); - // }); -}); diff --git a/testing-config/api-result.json b/testing-config/api-result.json deleted file mode 100644 index efac1d3..0000000 --- a/testing-config/api-result.json +++ /dev/null @@ -1,55 +0,0 @@ -[ - { - "UTC": -7, - "CityName": "Los Angeles", - "Storm": {}, - "Searchable": false, - "DeviceName": "Donna Sky", - "RegisterTime": 1433814467, - "DST": 1, - "BoundedPoint": "", - "LON": -118.6919183, - "Point": {}, - "VideoList": [ - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-23.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-24.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-25.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-26.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-27.mp4" - ], - "VideoList_C": [ - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-23_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-24_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-25_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-26_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-27_C.mp4" - ], - "DeviceID": "123456789012", - "NumOfFollowers": 1, - "LAT": 34.0201613, - "ALT": 142, - "Data": { - "Luminance": 21, - "Temperature": 63.61, - "ImageURL": "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWtnpGmmpo=.jpg", - "TS": 1540697959, - "Rain": true, - "Humidity": 99, - "Pressure": 295.27, - "DeviceType": "SKY1", - "Voltage": 2594, - "Night": true, - "UVIndex": "1", - "ImageTS": 1540690225 - }, - "FullAddress": "Pico Blvd, Los Angeles, CA, US", - "StreetName": "Pico Blvd", - "PreviewImageList": [ - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWqmJirn54=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWrlpamm5s=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWslZOloJg=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWsnpKompc=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWtnJSrnZw=.jpg" - ] - } -] \ No newline at end of file diff --git a/testing-config/config.json b/testing-config/config.json deleted file mode 100644 index 6599206..0000000 --- a/testing-config/config.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "bridge": { - "name": "Homebridge", - "username": "CC:22:3D:E3:CE:FF", - "pin": "876-54-321" - }, - - "description": "Testing configuration for an invalid user", - - "accessories": [ - ], - - "platforms": [ - { - "platform": "Bloomsky", - "apiKey": "this-is-not-a-valid-api-key==", - "apiUrl": "https://api.bloomsky.com/api/skydata/", - "debug": false - } - ] -} diff --git a/tsconfig.json b/tsconfig.json index 4546ef8..83b2885 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,22 @@ { "compilerOptions": { - "declaration": true, // incompatible with --allowJs - "outDir": "./lib", + "target": "ES2018", // ~node10 + "module": "commonjs", + "moduleResolution": "Node", + "lib": ["es2015", "es2016", "es2017", "es2018"], + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "./dist", + "rootDir": "./src", "strict": true, + "esModuleInterop": true, "noImplicitAny": false, - "target": "ES5", - "lib": ["es2017"], "baseUrl": ".", - "allowJs": false + "allowJs": false, + "removeComments": true }, - "include": ["src"], - "exclude": ["node_modules", "src/test", "test"] + "compileOnSave": true, + "include": ["src/"], + "exclude": ["**/*.spec.ts"] } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 6ced19f..0000000 --- a/tslint.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended" - ], - "jsRules": {}, - "rules": { - "max-classes-per-file": [true, 99, "exclude-class-expressions"], - "only-arrow-functions": [false, "allow-declarations", "allow-named-functions"], - "no-misused-new": false - }, - "rulesDirectory": [] -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 55abfdf..0000000 --- a/yarn.lock +++ /dev/null @@ -1,2039 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== - -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/polyfill@^7.0.0": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.8.7.tgz#151ec24c7135481336168c3bd8b8bf0cf91c032f" - integrity sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w== - dependencies: - core-js "^2.6.5" - regenerator-runtime "^0.13.4" - -"@jimp/bmp@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" - integrity sha512-P/ezH1FuoM3FwS0Dm2ZGkph4x5/rPBzFLEZor7KQkmGUnYEIEG4o0BUcAWFmJOp2HgzbT6O2SfrpJNBOcVACzQ== - dependencies: - "@jimp/utils" "^0.5.0" - bmp-js "^0.1.0" - core-js "^2.5.7" - -"@jimp/core@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.5.4.tgz#69d2d9eef1a6a9d62127171e2688cf21bc0ee77c" - integrity sha512-n3uvHy2ndUKItmbhnRO8xmU8J6KR+v6CQxO9sbeUDpSc3VXc1PkqrA8ZsCVFCjnDFcGBXL+MJeCTyQzq5W9Crw== - dependencies: - "@jimp/utils" "^0.5.0" - any-base "^1.1.0" - buffer "^5.2.0" - core-js "^2.5.7" - exif-parser "^0.1.12" - file-type "^9.0.0" - load-bmfont "^1.3.1" - mkdirp "0.5.1" - phin "^2.9.1" - pixelmatch "^4.0.2" - tinycolor2 "^1.4.1" - -"@jimp/custom@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.5.4.tgz#393338efbf15d158ecf6639cb1b196c70411fddd" - integrity sha512-tLfyJoyouDl2J3RPFGfDzTtE+4S8ljqJUmLzy/cmx1n7+xS5TpLPdPskp7UaeAfNTqdF4CNAm94KYoxTZdj2mg== - dependencies: - "@jimp/core" "^0.5.4" - core-js "^2.5.7" - -"@jimp/gif@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.5.0.tgz#7543870b3d744c9758da76ca43fac4ee48fd6a00" - integrity sha512-HVB4c7b8r/yCpjhCjVNPRFLuujTav5UPmcQcFJjU6aIxmne6e29rAjRJEv3UMamHDGSu/96PzOsPZBO5U+ZGww== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - omggif "^1.0.9" - -"@jimp/jpeg@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.5.4.tgz#ff52669f801e9d82041ba6322ee781c344e75241" - integrity sha512-YaPWm+YSGCThNE/jLMckM3Qs6uaMxd/VsHOnEaqu5tGA4GFbfVaWHjKqkNGAFuiNV+HdgKlNcCOF3of+elvzqQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - jpeg-js "^0.3.4" - -"@jimp/plugin-blit@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.5.4.tgz#8c4f46e00c0a4ca9d5c592713de7575528485e59" - integrity sha512-WqDYOugv76hF1wnKy7+xPGf9PUbcm9vPW28/jHWn1hjbb2GnusJ2fVEFad76J/1SPfhrQ2Uebf2QCWJuLmOqZg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-blur@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.5.0.tgz#c8222bdae8eb4cc86613c0adbcb26a92829739a2" - integrity sha512-5k0PXCA1RTJdITL7yMAyZ5tGQjKLHqFvwdXj/PCoBo5PuMyr0x6qfxmQEySixGk/ZHdDxMi80vYxHdKHjNNgjg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-color@^0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.5.5.tgz#68f9652d5065d3380a9967911a7e529325d230d6" - integrity sha512-hWeOqNCmLguGYLhSvBrpfCvlijsMEVaLZAOod62s1rzWnujozyKOzm2eZe+W3To6mHbp5RGJNVrIwHBWMab4ug== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - tinycolor2 "^1.4.1" - -"@jimp/plugin-contain@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.5.4.tgz#1dc258db36d50e23400e0644b7f2694fd74fbf60" - integrity sha512-8YJh4FI3S69unri0nJsWeqVLeVGA77N2R0Ws16iSuCCD/5UnWd9FeWRrSbKuidBG6TdMBaG2KUqSYZeHeH9GOQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-cover@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.5.4.tgz#a086243b151db9eef09e657fbe8bc3ef8683662e" - integrity sha512-2Rur7b44WiDDgizUI2M2uYWc1RmfhU5KjKS1xXruobjQ0tXkf5xlrPXSushq0hB6Ne0Ss6wv0+/6eQ8WeGHU2w== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-crop@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.5.4.tgz#124cf52aa07e36c7a33f39e2e86e78166c300ca7" - integrity sha512-6t0rqn4VazquGk48tO6hFBrQ+nkvC+A1RnR6UM/m8ZtG2/yjpwF0MXcpgJI1Fb+a4Ug7BY1fu2GPcZOhnAVK/g== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-displace@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.5.0.tgz#cb75d8588bdee45c1bdb1bec2323705d0e53d060" - integrity sha512-Bec7SQvnmKia4hOXEDjeNVx7vo/1bWqjuV6NO8xbNQcAO3gaCl91c9FjMDhsfAVb0Ou6imhbIuFPrLxorXsecQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-dither@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.5.0.tgz#0f1f6b7dcd5aba8f908bbd4b60685fc29cc6a3ed" - integrity sha512-We2WJQsD/Lm8oqBFp/vUv9/5r2avyenL+wNNu/s2b1HqA5O4sPGrjHy9K6vIov0NroQGCQ3bNznLkTmjiHKBcg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-flip@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.5.0.tgz#4a973c9c4bdc6dbcc7da66204a2bb2b12feb9381" - integrity sha512-D/ehBQxLMNR7oNd80KXo4tnSET5zEm5mR70khYOTtTlfti/DlLp3qOdjPOzfLyAdqO7Ly4qCaXrIsnia+pfPrA== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-gaussian@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.5.0.tgz#02c9f07516108e01ba0f2938289b08e6e865c2c9" - integrity sha512-Ln4kgxblv0/YzLBDb/J8DYPLhDzKH87Y8yHh5UKv3H+LPKnLaEG3L4iKTE9ivvdocnjmrtTFMYcWv2ERSPeHcg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-invert@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.5.0.tgz#4496d2d67ab498c8fa3e89c4b6dd5892e7f14b9b" - integrity sha512-/vyKeIi3T7puf+8ruWovTjzDC585EnTwJ+lGOOUYiNPsdn4JDFe1B3xd+Ayv9aCQbXDIlPElZaM9vd/+wqDiIQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-mask@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.5.4.tgz#ac4c2625e328818da1443c92bcb9cabb537c74ba" - integrity sha512-mUJ04pCrUWaJGXPjgoVbzhIQB8cVobj2ZEFlGO3BEAjyylYMrdJlNlsER8dd7UuJ2L/a4ocWtFDdsnuicnBghQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-normalize@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.5.4.tgz#d60aeb637bcaecadf654c9621e291d6eed12fa19" - integrity sha512-Q5W0oEz9wxsjuhvHAJynI/OqXZcmqEAuRONQId7Aw5ulCXSOg9C4y2a67EO7aZAt55T+zMVxI9UpVUpzVvO6hw== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-print@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.5.4.tgz#00524a7424a4e12a17764d349485dd1120a43728" - integrity sha512-DOZr5TY9WyMWFBD37oz7KpTEBVioFIHQF/gH5b3O5jjFyj4JPMkw7k3kVBve9lIrzIYrvLqe0wH59vyAwpeEFg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - load-bmfont "^1.4.0" - -"@jimp/plugin-resize@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.5.4.tgz#c9b2c4949ee080df3fa2ca587539e2ce8588b8af" - integrity sha512-lXNprNAT0QY1D1vG/1x6urUTlWuZe2dfL29P81ApW2Yfcio471+oqo45moX5FLS0q24xU600g7cHGf2/TzqSfA== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-rotate@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.5.4.tgz#6c4c560779bc3ebf291db9a5095158d32a2a4af3" - integrity sha512-SIdUpMc8clObMchy8TnjgHgcXEQM992z5KavgiuOnCuBlsmSHtE3MrXTOyMW0Dn3gqapV9Y5vygrLm/BVtCCsg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-scale@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.5.0.tgz#095f937e5a4887481b3074f5cd6a144d8f4f815e" - integrity sha512-5InIOr3cNtrS5aQ/uaosNf28qLLc0InpNGKFmGFTv8oqZqLch6PtDTjDBZ1GGWsPdA/ljy4Qyy7mJO1QBmgQeQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugins@^0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.5.5.tgz#e97fa368d69ad7718d5a2a9b6ffa8e6cc1e4264d" - integrity sha512-9oF6LbSM/K7YkFCcxaPaD8NUkL/ZY8vT8NIGfQ/NpX+tKQtcsLHcRavHpUC+M1xXShv/QGx9OdBV/jgiu82QYg== - dependencies: - "@jimp/plugin-blit" "^0.5.4" - "@jimp/plugin-blur" "^0.5.0" - "@jimp/plugin-color" "^0.5.5" - "@jimp/plugin-contain" "^0.5.4" - "@jimp/plugin-cover" "^0.5.4" - "@jimp/plugin-crop" "^0.5.4" - "@jimp/plugin-displace" "^0.5.0" - "@jimp/plugin-dither" "^0.5.0" - "@jimp/plugin-flip" "^0.5.0" - "@jimp/plugin-gaussian" "^0.5.0" - "@jimp/plugin-invert" "^0.5.0" - "@jimp/plugin-mask" "^0.5.4" - "@jimp/plugin-normalize" "^0.5.4" - "@jimp/plugin-print" "^0.5.4" - "@jimp/plugin-resize" "^0.5.4" - "@jimp/plugin-rotate" "^0.5.4" - "@jimp/plugin-scale" "^0.5.0" - core-js "^2.5.7" - timm "^1.6.1" - -"@jimp/png@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.5.4.tgz#4ed02435ab8ac219b618e9578dfd60626b3b5dd4" - integrity sha512-J2NU7368zihF1HUZdmpXsL/Hhyf+I3ubmK+6Uz3Uoyvtk1VS7dO3L0io6fJQutfWmPZ4bvu6Ry022oHjbi6QCA== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - pngjs "^3.3.3" - -"@jimp/tiff@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.5.4.tgz#ce5370283eba390ff32b6fd86b9259d7cf3e2315" - integrity sha512-hr7Zq3eWjAZ+itSwuAObIWMRNv7oHVM3xuEDC2ouP7HfE7woBtyhCyfA7u12KlgtM57gKWeogXqTlewRGVzx6g== - dependencies: - core-js "^2.5.7" - utif "^2.0.1" - -"@jimp/types@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.5.4.tgz#c312e415ec9c4a35770e89b9eee424a96be60ab8" - integrity sha512-nbZXM6TsdpnYHIBd8ZuoxGpvmxc2SqiggY30/bhOP/VJQoDBzm2v/20Ywz5M0snpIK2SdYG52eZPNjfjqUP39w== - dependencies: - "@jimp/bmp" "^0.5.4" - "@jimp/gif" "^0.5.0" - "@jimp/jpeg" "^0.5.4" - "@jimp/png" "^0.5.4" - "@jimp/tiff" "^0.5.4" - core-js "^2.5.7" - timm "^1.6.1" - -"@jimp/utils@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.5.0.tgz#ecb33259c75238053d6c7706a3e91f657dbabf91" - integrity sha512-7H9RFVU+Li2XmEko0GGyzy7m7JjSc7qa+m8l3fUzYg2GtwASApjKF/LSG2AUQCUmDKFLdfIEVjxvKvZUJFEmpw== - dependencies: - core-js "^2.5.7" - -"@types/chai@^4.1.6": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.11.tgz#d3614d6c5f500142358e6ed24e1bf16657536c50" - integrity sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw== - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/debug@0.0.31": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.31.tgz#bac8d8aab6a823e91deb7f79083b2a35fa638f33" - integrity sha512-LS1MCPaQKqspg7FvexuhmDbWUhE2yIJ+4AgVIyObfc06/UKZ8REgxGNjZc82wPLWmbeOm7S+gSsLgo75TanG4A== - -"@types/ip@0.0.31": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@types/ip/-/ip-0.0.31.tgz#a363989e72dd11bb21f932d6fe96bd6a85b2b74b" - integrity sha512-oYk8aalgfCt7XfEu66Sjwz/aQjfRtQkjNSXwrUGqyRoQbOymAc156fUNTwn1cSCEEwuPPzMy7fGPmKcFLoaIkA== - dependencies: - "@types/node" "*" - -"@types/mocha@^5.2.5": - version "5.2.7" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" - integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== - -"@types/node@*": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.4.tgz#43a63fc5edce226bed106b31b875165256271107" - integrity sha512-k3NqigXWRzQZVBDS5D1U70A5E8Qk4Kh+Ha/x4M8Bt9pF0X05eggfnC9+63Usc9Q928hRUIpIhTQaXsZwZBl4Ew== - -"@types/node@^10.12.0": - version "10.17.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.24.tgz#c57511e3a19c4b5e9692bb2995c40a3a52167944" - integrity sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA== - -"@types/sharp@^0.21.0": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.21.3.tgz#82f89f99536557e397c0c46f5ea50dcc1529fe35" - integrity sha512-wgCw1OO/iQ3w13WVRhx1fHoo5NDHq+444wqTnKcAWA9YMj1a9stoLlfLjW1mJJkFG1aRjeKd9KYhiYOJ3H7qEg== - dependencies: - "@types/node" "*" - -acorn@^5.4.0: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -any-base@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" - integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-filter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" - integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -async-wait-until@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/async-wait-until/-/async-wait-until-1.2.4.tgz#55a6c29145b8037742a629b0ae0b69b5e2988404" - integrity sha512-H7ZR3cu1THxrJiDgevu+PgbyT0o5P/9nsCZj70ckruJCMWt/UOQmGo65wKWvEQN69MJk140x5/Z01ZQjzfwyOw== - -available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5" - integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ== - dependencies: - array-filter "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -bmp-js@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" - integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= - -bonjour-hap@^3.5.1, bonjour-hap@~3.5.8: - version "3.5.10" - resolved "https://registry.yarnpkg.com/bonjour-hap/-/bonjour-hap-3.5.10.tgz#a9cd35dabf8eb75e9bfc54871d19d0c4ee41ed4e" - integrity sha512-vaqa4uUST8K5rj9QGe6GaSJ+6rQ24KzgkjdyZvoTpbKBti5xL/m8H9Dp9VmPdo434OAetqU5PKAn5izucrKEBA== - dependencies: - array-flatten "^2.1.2" - deep-equal "^2.0.2" - ip "^1.1.5" - multicast-dns "^7.2.2" - multicast-dns-service-types "^1.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -buffer-equal@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" - integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= - -buffer-from@^1.0.0, buffer-from@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= - -buffer@^5.2.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.0" - type-detect "^4.0.5" - -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -child_process@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a" - integrity sha1-sffn/HPSXn/R1FWtyU4UODAYK1o= - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - -commander@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.0.0.tgz#dbf1909b49e5044f8fdaf0adc809f0c0722bdfd0" - integrity sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ== - -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -core-js@^2.5.7, core-js@^2.6.5: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" - integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== - -decimal.js@^7.2.3: - version "7.5.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-7.5.1.tgz#cf4cf5eeb9faa24fc4ee6af361faebb7bfcca2ce" - integrity sha512-1K5Y6MykxQYfHBcFfAj2uBaLmwreq4MsjsvrlgcEOvg+X82IeeXlIVIVkBMiypksu+yo9vcYP6lfU3qTedofSQ== - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-equal@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.3.tgz#cad1c15277ad78a5c01c49c2dee0f54de8a6a7b0" - integrity sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA== - dependencies: - es-abstract "^1.17.5" - es-get-iterator "^1.1.0" - is-arguments "^1.0.4" - is-date-object "^1.0.2" - is-regex "^1.0.5" - isarray "^2.0.5" - object-is "^1.1.2" - object-keys "^1.1.1" - object.assign "^4.1.0" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" - which-boxed-primitive "^1.0.1" - which-collection "^1.0.1" - which-typed-array "^1.1.2" - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -diff@3.5.0, diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dns-packet@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-4.2.0.tgz#3fd6f5ff5a4ec3194ed0b15312693ffe8776b343" - integrity sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw== - dependencies: - ip "^1.1.5" - safe-buffer "^5.1.1" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -enhanced-resolve@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz#a115c32504b6302e85a76269d7a57ccdd962e359" - integrity sha1-oRXDJQS2MC6Fp2Jp16V8zdli41k= - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.3.0" - object-assign "^4.0.1" - tapable "^0.2.3" - -errno@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-get-iterator@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" - integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== - dependencies: - es-abstract "^1.17.4" - has-symbols "^1.0.1" - is-arguments "^1.0.4" - is-map "^2.0.1" - is-set "^2.0.1" - is-string "^1.0.5" - isarray "^2.0.5" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -exif-parser@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" - integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= - -fast-srp-hap@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz#00cbd4f92cbd031ca6437b64ae81bab6d3aeb4f8" - integrity sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA== - -fast-srp-hap@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-srp-hap/-/fast-srp-hap-1.2.0.tgz#99f558c20c171786966ce70d21f3d4004b484928" - integrity sha512-WgC3eJEaQo94pq6Ua+l4zdceMLkDXvhZ4OpyQsFdlTFDH7GwJ6fikr+C/mkKzaIxbnODkqee8cOd0KjuW2ebKQ== - -file-type@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" - integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -futoin-hkdf@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.3.2.tgz#cd9a09153e3db7d166b9717f872991a4950430cd" - integrity sha512-3EVi3ETTyJg5PSXlxLCaUVVn0pSbDf62L3Gwxne7Uq+d8adOSNWQAad4gg7WToHkcgnCJb3Wlb1P8r4Evj4GPw== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= - dependencies: - min-document "^2.19.0" - process "~0.5.1" - -graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -hap-nodejs@^0.4.47: - version "0.4.53" - resolved "https://registry.yarnpkg.com/hap-nodejs/-/hap-nodejs-0.4.53.tgz#86e263a54b7f90f6c6246b8d96870eff40eaa5a9" - integrity sha512-6i7m/sugXm/6jP9fLaGUbOtmvxvzcYCfyZFK9dv6kLeavCJparlIn50g+6hc6ljxq0d7Q1mH+pawCPUEq4ZC8Q== - dependencies: - bonjour-hap "^3.5.1" - buffer-shims "^1.0.0" - debug "^2.2.0" - decimal.js "^7.2.3" - fast-srp-hap "^1.0.1" - ip "^1.1.3" - node-persist "^0.0.11" - tweetnacl "^1.0.1" - -hap-nodejs@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/hap-nodejs/-/hap-nodejs-0.7.3.tgz#aef573b743f3ac0c8bc36254ddf23ddda95fe947" - integrity sha512-kCPwdRizCPJk43eTSMtW2LtCh+it8rTYW7aGkhW8qFKPS4z5JQilpggvVJvdfmSy5l+L5F0/UyKwkeM/KsdrHA== - dependencies: - bonjour-hap "~3.5.8" - debug "^4.1.1" - decimal.js "^10.2.0" - fast-srp-hap "2.0.1" - futoin-hkdf "~1.3.2" - ip "^1.1.3" - node-persist "^0.0.11" - tweetnacl "^1.0.3" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -homebridge@>=0.4.42: - version "1.1.0" - resolved "https://registry.yarnpkg.com/homebridge/-/homebridge-1.1.0.tgz#f3e96657d482baaa978e80e886dbc9e52c0c9a75" - integrity sha512-OMs+1A2G6lkMOrAk0o1nmj8S3XkhwrInVwRDiyLB3aHRQS02KQ/Egv1stV9vDhjib86v3y3MLHIYYzbxKHLjPA== - dependencies: - chalk "^3.0.0" - commander "5.0.0" - hap-nodejs "^0.7.3" - node-persist "^0.0.11" - qrcode-terminal "^0.12.0" - semver "^7.3.2" - source-map-support "^0.5.19" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ip@^1.1.3, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - -is-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.0.tgz#73da8c33208d00f130e9b5e15d23eac9215601c4" - integrity sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" - integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== - -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - -is-date-object@^1.0.1, is-date-object@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" - integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== - -is-number-object@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - -is-set@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" - integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== - -is-string@^1.0.4, is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-typed-array@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.3.tgz#a4ff5a5e672e1a55f99c7f54e59597af5c1df04d" - integrity sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ== - dependencies: - available-typed-arrays "^1.0.0" - es-abstract "^1.17.4" - foreach "^2.0.5" - has-symbols "^1.0.1" - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - -is-weakset@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" - integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -jimp@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.5.6.tgz#dd114decd060927ae439f2e0980df619c179f912" - integrity sha512-H0nHTu6KgAgQzDxa38ew2dXbnRzKm1w5uEyhMIxqwCQVjwgarOjjkV/avbNLxfxRHAFaNp4rGIc/qm8P+uhX9A== - dependencies: - "@babel/polyfill" "^7.0.0" - "@jimp/custom" "^0.5.4" - "@jimp/plugins" "^0.5.5" - "@jimp/types" "^0.5.4" - core-js "^2.5.7" - -jpeg-js@^0.3.4: - version "0.3.7" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.7.tgz#471a89d06011640592d314158608690172b1028d" - integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.13.1, js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -load-bmfont@^1.3.1, load-bmfont@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" - integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g== - dependencies: - buffer-equal "0.0.1" - mime "^1.3.4" - parse-bmfont-ascii "^1.0.3" - parse-bmfont-binary "^1.0.5" - parse-bmfont-xml "^1.1.4" - phin "^2.9.1" - xhr "^2.0.1" - xtend "^4.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -memory-fs@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" - integrity sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mkdirp@0.5.5, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mocha-logger@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/mocha-logger/-/mocha-logger-1.0.6.tgz#512217f3b4cd8be036154e655118c5160784154a" - integrity sha512-D7Z3r1RkyaJOnlgokODdzt9p4ut0m3DVzEKp3r3tgeXIpdxp54z049Vc0EEh5hkhudfRN0dfUD10Fcj2WuOO3w== - dependencies: - mocha "^5.1.1" - -mocha@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -mocha@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.2.tgz#5731da04f47d1e435ac457e5ac7b4b39d866a5a1" - integrity sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g== - dependencies: - dns-packet "^4.0.0" - thunky "^1.0.2" - -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-persist@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/node-persist/-/node-persist-0.0.11.tgz#d66eba3ebef620f079530fa7b13076a906665874" - integrity sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ= - dependencies: - mkdirp "~0.5.1" - q "~1.1.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-is@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0, object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -omggif@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" - integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -optional@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3" - integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw== - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@^1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parse-bmfont-ascii@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" - integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU= - -parse-bmfont-binary@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" - integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY= - -parse-bmfont-xml@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" - integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== - dependencies: - xml-parse-from-string "^1.0.0" - xml2js "^0.4.5" - -parse-headers@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" - integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= - -phin@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" - integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== - -picomatch@^2.0.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pixelmatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" - integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= - dependencies: - pngjs "^3.0.0" - -pngjs@^3.0.0, pngjs@^3.3.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -q@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/q/-/q-1.1.2.tgz#6357e291206701d99f197ab84e57e8ad196f2a89" - integrity sha1-Y1fikSBnAdmfGXq4TlforRlvKok= - -qrcode-terminal@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" - integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== - -qs@^6.9.1: - version "6.9.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" - integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== - -readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== - -regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= - -resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -safe-buffer@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver@^5.3.0, semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== - dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" - -source-map-support@^0.5.19, source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimend@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== - dependencies: - has-flag "^3.0.0" - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -tapable@^0.2.3: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== - -tern@^0.22.3: - version "0.22.3" - resolved "https://registry.yarnpkg.com/tern/-/tern-0.22.3.tgz#43b509c664d93b8e0aa37468b5a1ec2713833299" - integrity sha512-A2C8GbR6uJWjHUwxtxF14oY1g8oJDEhM+n9ugRowX+jr8JHgNUeOLrYTOi/LV/JK9KHpxnYwyuhnal9YDXeeDQ== - dependencies: - acorn "^5.4.0" - enhanced-resolve "^2.2.2" - glob "^7.1.1" - minimatch "^3.0.3" - resolve-from "2.0.0" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timm@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.2.tgz#dfd8c6719f7ba1fcfc6295a32670a1c6d166c0bd" - integrity sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw== - -tinycolor2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" - integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-node@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" - integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -tslib@^1.8.0, tslib@^1.8.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - -tslint@^5.11.0: - version "5.20.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.1" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -tunnel@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - -tweetnacl@^1.0.1, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typed-rest-client@^1.0.9: - version "1.7.3" - resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.7.3.tgz#1beb263b86b14d34596f6127c6172dd5fd652e7b" - integrity sha512-CwTpx/TkRHGZoHkJhBcp4X8K3/WtlzSHVQR0OIFnt10j4tgy4ypgq/SrrgVpA1s6tAL49Q6J3R5C0Cgfh2ddqA== - dependencies: - qs "^6.9.1" - tunnel "0.0.6" - underscore "1.8.3" - -typescript@^3.1.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== - -underscore@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= - -utif@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" - integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== - dependencies: - pako "^1.0.5" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -which-boxed-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz#cbe8f838ebe91ba2471bb69e9edbda67ab5a5ec1" - integrity sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ== - dependencies: - is-bigint "^1.0.0" - is-boolean-object "^1.0.0" - is-number-object "^1.0.3" - is-string "^1.0.4" - is-symbol "^1.0.2" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which-typed-array@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.2.tgz#e5f98e56bda93e3dac196b01d47c1156679c00b2" - integrity sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ== - dependencies: - available-typed-arrays "^1.0.2" - es-abstract "^1.17.5" - foreach "^2.0.5" - function-bind "^1.1.1" - has-symbols "^1.0.1" - is-typed-array "^1.1.3" - -which@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xhr@^2.0.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== - dependencies: - global "~4.3.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xml-parse-from-string@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" - integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= - -xml2js@^0.4.5: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=